diff --git a/shared_files/node-red/aryaos_flows.json b/shared_files/node-red/aryaos_flows.json
new file mode 100644
index 0000000..a5cc0db
--- /dev/null
+++ b/shared_files/node-red/aryaos_flows.json
@@ -0,0 +1,7650 @@
+[
+ {
+ "id": "1d5c7046712ea9d2",
+ "type": "tab",
+ "label": "Control",
+ "disabled": false,
+ "info": "",
+ "env": []
+ },
+ {
+ "id": "94cf869050128770",
+ "type": "tab",
+ "label": "Dashboard",
+ "disabled": false,
+ "info": "",
+ "env": []
+ },
+ {
+ "id": "9c4ba3cbc4bd87fa",
+ "type": "tab",
+ "label": "Maps",
+ "disabled": false,
+ "info": "",
+ "env": []
+ },
+ {
+ "id": "76732e91104cd622",
+ "type": "tab",
+ "label": "I/O",
+ "disabled": false,
+ "info": "",
+ "env": []
+ },
+ {
+ "id": "4fa67ac9ec0c7369",
+ "type": "tab",
+ "label": "Config",
+ "disabled": false,
+ "info": "",
+ "env": []
+ },
+ {
+ "id": "de725ec24f79b6b7",
+ "type": "tab",
+ "label": "TFR",
+ "disabled": false,
+ "info": "",
+ "env": []
+ },
+ {
+ "id": "898f970d26b5049d",
+ "type": "tab",
+ "label": "TAK",
+ "disabled": false,
+ "info": "",
+ "env": []
+ },
+ {
+ "id": "f8d4ccf4360ea706",
+ "type": "tab",
+ "label": "Sit(x)",
+ "disabled": false,
+ "info": "",
+ "env": []
+ },
+ {
+ "id": "f83d0c6d58d0338c",
+ "type": "tab",
+ "label": "Recorder",
+ "disabled": false,
+ "info": "",
+ "env": []
+ },
+ {
+ "id": "23030b6ea0597f64",
+ "type": "tab",
+ "label": "Update",
+ "disabled": false,
+ "info": "",
+ "env": []
+ },
+ {
+ "id": "bd418afe09349324",
+ "type": "group",
+ "z": "1d5c7046712ea9d2",
+ "name": "DANGER ZONE",
+ "style": {
+ "fill": "#ffbfbf",
+ "label": true
+ },
+ "nodes": [
+ "683a2b05.736204",
+ "1cf31554.2aaa63",
+ "38e53dbf.ca594a",
+ "c409cae5.8e4128",
+ "811dc61136e8046d",
+ "0be2a009aadd225d"
+ ],
+ "x": 734,
+ "y": 631.5,
+ "w": 472,
+ "h": 217
+ },
+ {
+ "id": "c5409a5d2b5e28d5",
+ "type": "group",
+ "z": "4fa67ac9ec0c7369",
+ "style": {
+ "stroke": "#999999",
+ "stroke-opacity": "1",
+ "fill": "none",
+ "fill-opacity": "1",
+ "label": true,
+ "label-position": "nw",
+ "color": "#a4a4a4"
+ },
+ "nodes": [
+ "2d8066d127cb6c44",
+ "df765e01751751eb",
+ "bb55ecc1c7a7da19"
+ ],
+ "x": 464,
+ "y": 59,
+ "w": 302,
+ "h": 82
+ },
+ {
+ "id": "a247d145bc97ec4e",
+ "type": "group",
+ "z": "4fa67ac9ec0c7369",
+ "style": {
+ "stroke": "#999999",
+ "stroke-opacity": "1",
+ "fill": "none",
+ "fill-opacity": "1",
+ "label": true,
+ "label-position": "nw",
+ "color": "#a4a4a4"
+ },
+ "nodes": [
+ "cb87c8b4398c815d",
+ "90bbf3ddaabf55d6",
+ "70a02ab5c732adf0",
+ "8f90b1c209f39ff8",
+ "e435961c35c6c50f",
+ "a693d594320c6842"
+ ],
+ "x": 454,
+ "y": 159,
+ "w": 392,
+ "h": 162
+ },
+ {
+ "id": "fb90e60944764ed9",
+ "type": "group",
+ "z": "94cf869050128770",
+ "name": "GPS Fix Dashboard Item",
+ "style": {
+ "fill": "#bfdbef",
+ "label": true,
+ "color": "#000000"
+ },
+ "nodes": [
+ "69bd079907c39f3c",
+ "73eb77cde2c7a709",
+ "7c69f96954e99a9b",
+ "de2c209dbe934060",
+ "f20627a1cbc79171",
+ "1190f05a50aad89c",
+ "43958e20b7e848a3"
+ ],
+ "x": 34,
+ "y": 379,
+ "w": 692,
+ "h": 162
+ },
+ {
+ "id": "a1d4fe25968a5368",
+ "type": "group",
+ "z": "94cf869050128770",
+ "name": "Throttled Status",
+ "style": {
+ "fill": "#bfdbef",
+ "label": true,
+ "color": "#000000"
+ },
+ "nodes": [
+ "67c1aa629a2e95af",
+ "4f64ec7db13ee424",
+ "4338acd2934924cc"
+ ],
+ "x": 494,
+ "y": 559,
+ "w": 632,
+ "h": 109.5
+ },
+ {
+ "id": "45da34b7e4bdb957",
+ "type": "group",
+ "z": "94cf869050128770",
+ "name": "",
+ "style": {
+ "fill": "#bfdbef",
+ "label": true
+ },
+ "nodes": [
+ "095368571cbf1fcf",
+ "c82e38d047199cb5",
+ "16d10d070ec070d9",
+ "20787a00729ffe5f",
+ "c1b4f4996f5aa122",
+ "7750039932acdcc7",
+ "e0d87a55d461c609",
+ "8db81499fdb5170a",
+ "681d2876a7db4f51",
+ "d85368cd75bb347e"
+ ],
+ "x": 34,
+ "y": 19,
+ "w": 652,
+ "h": 202
+ },
+ {
+ "id": "75d810e2c34e3c4f",
+ "type": "group",
+ "z": "94cf869050128770",
+ "name": "SDR Lookup",
+ "style": {
+ "fill": "#bfdbef",
+ "label": true,
+ "color": "#000000"
+ },
+ "nodes": [
+ "24d11b12327e6147",
+ "b36b3af7a720fa09",
+ "c694287e0ecfdb11",
+ "ab8919275dc5a1bb",
+ "65b80260e6a12016"
+ ],
+ "x": 34,
+ "y": 239,
+ "w": 592,
+ "h": 122
+ },
+ {
+ "id": "e3b3a9c137f6b1a8",
+ "type": "group",
+ "z": "94cf869050128770",
+ "name": "Uptime",
+ "style": {
+ "fill": "#bfdbef",
+ "label": true,
+ "color": "#000000"
+ },
+ "nodes": [
+ "16419a36256c9583",
+ "b1d1259dd556c68a",
+ "267687b40c52261e"
+ ],
+ "x": 34,
+ "y": 571.5,
+ "w": 452,
+ "h": 97
+ },
+ {
+ "id": "e165fa1b9bca5292",
+ "type": "group",
+ "z": "76732e91104cd622",
+ "name": "aircraft.json",
+ "style": {
+ "fill": "#bfdbef",
+ "label": true,
+ "color": "#000000"
+ },
+ "nodes": [
+ "5f6eab2d3d6ad9be",
+ "64fa2c00f63bdd53",
+ "b068a436f07cc0bd",
+ "99dfc7e97f5f8d47",
+ "b3d1b7bf5a4edba2",
+ "ce3be08760e15920",
+ "65a40de620905bad",
+ "573961361f4ac80b",
+ "61a91ec3d8b3f82b"
+ ],
+ "x": 34,
+ "y": 419,
+ "w": 682,
+ "h": 242
+ },
+ {
+ "id": "265b840ea6186ecf",
+ "type": "group",
+ "z": "76732e91104cd622",
+ "style": {
+ "stroke": "#999999",
+ "stroke-opacity": "1",
+ "fill": "none",
+ "fill-opacity": "1",
+ "label": true,
+ "label-position": "nw",
+ "color": "#a4a4a4"
+ },
+ "nodes": [
+ "a5dbb71f6d17579d",
+ "4aa3f8001760c96a",
+ "e0a7e9ef71a6f0e8",
+ "bd6f79df66f3f373",
+ "089a5c1ffeafe91b",
+ "58edafa9ab997436"
+ ],
+ "x": 54,
+ "y": 759,
+ "w": 452,
+ "h": 262
+ },
+ {
+ "id": "1d17f399c2310113",
+ "type": "group",
+ "z": "94cf869050128770",
+ "name": "Hostname",
+ "style": {
+ "fill": "#bfdbef",
+ "label": true,
+ "color": "#000000"
+ },
+ "nodes": [
+ "4a87ab6388bffac2",
+ "1fca29d62080fdd9",
+ "5d6ab3c272199b94",
+ "dc3fd8b497972cae",
+ "2d5d9381afea8c59",
+ "6ee20da0ae45fefa"
+ ],
+ "x": 554,
+ "y": 679,
+ "w": 912,
+ "h": 122
+ },
+ {
+ "id": "d34772b1b10233f2",
+ "type": "group",
+ "z": "94cf869050128770",
+ "name": "QR Code",
+ "style": {
+ "fill": "#bfdbef",
+ "label": true,
+ "color": "#000000"
+ },
+ "nodes": [
+ "9f8119755cf73778",
+ "a1642742e713d559",
+ "8a9319936729c649",
+ "cbbe264f84b53680"
+ ],
+ "x": 744,
+ "y": 439,
+ "w": 582,
+ "h": 82
+ },
+ {
+ "id": "3de15a4313928391",
+ "type": "group",
+ "z": "94cf869050128770",
+ "name": "Docker",
+ "style": {
+ "fill": "#bfdbef",
+ "label": true,
+ "color": "#000000"
+ },
+ "nodes": [
+ "808f9f656a06999e",
+ "b2825e8d13e21f82",
+ "d033dfa14fa3a005"
+ ],
+ "x": 34,
+ "y": 691.5,
+ "w": 472,
+ "h": 97
+ },
+ {
+ "id": "edc83286b603d84a",
+ "type": "ui_tab",
+ "name": "Dashboard",
+ "icon": "dashboard",
+ "order": 3,
+ "disabled": false,
+ "hidden": false
+ },
+ {
+ "id": "e828481c0c713837",
+ "type": "ui_base",
+ "theme": {
+ "name": "theme-light",
+ "lightTheme": {
+ "default": "#0094CE",
+ "baseColor": "#0094CE",
+ "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif",
+ "edited": true,
+ "reset": false
+ },
+ "darkTheme": {
+ "default": "#097479",
+ "baseColor": "#097479",
+ "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif",
+ "edited": false
+ },
+ "customTheme": {
+ "name": "Untitled Theme 1",
+ "default": "#4B7930",
+ "baseColor": "#4B7930",
+ "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"
+ },
+ "themeState": {
+ "base-color": {
+ "default": "#0094CE",
+ "value": "#0094CE",
+ "edited": false
+ },
+ "page-titlebar-backgroundColor": {
+ "value": "#0094CE",
+ "edited": false
+ },
+ "page-backgroundColor": {
+ "value": "#fafafa",
+ "edited": false
+ },
+ "page-sidebar-backgroundColor": {
+ "value": "#ffffff",
+ "edited": false
+ },
+ "group-textColor": {
+ "value": "#1bbfff",
+ "edited": false
+ },
+ "group-borderColor": {
+ "value": "#ffffff",
+ "edited": false
+ },
+ "group-backgroundColor": {
+ "value": "#ffffff",
+ "edited": false
+ },
+ "widget-textColor": {
+ "value": "#111111",
+ "edited": false
+ },
+ "widget-backgroundColor": {
+ "value": "#0094ce",
+ "edited": false
+ },
+ "widget-borderColor": {
+ "value": "#ffffff",
+ "edited": false
+ },
+ "base-font": {
+ "value": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"
+ }
+ },
+ "angularTheme": {
+ "primary": "indigo",
+ "accents": "blue",
+ "warn": "red",
+ "background": "grey",
+ "palette": "light"
+ }
+ },
+ "site": {
+ "name": "AryaOS Dashboard",
+ "hideToolbar": "false",
+ "allowSwipe": "false",
+ "lockMenu": "false",
+ "allowTempTheme": "true",
+ "dateFormat": "DD/MM/YYYY",
+ "sizes": {
+ "sx": 48,
+ "sy": 48,
+ "gx": 6,
+ "gy": 6,
+ "cx": 6,
+ "cy": 6,
+ "px": 0,
+ "py": 0
+ }
+ }
+ },
+ {
+ "id": "1890881e.83819",
+ "type": "ui_group",
+ "name": "Col 1",
+ "tab": "c3173234.2636e",
+ "order": 1,
+ "disp": false,
+ "width": "6",
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "9a96a8b1.92db78",
+ "type": "ui_group",
+ "name": "Col 2",
+ "tab": "c3173234.2636e",
+ "order": 2,
+ "disp": false,
+ "width": "6",
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "72fc319.cc425d",
+ "type": "ui_group",
+ "name": "Col 3",
+ "tab": "c3173234.2636e",
+ "order": 3,
+ "disp": false,
+ "width": "6",
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "c3173234.2636e",
+ "type": "ui_tab",
+ "name": "OS Status",
+ "icon": "dashboard",
+ "order": 6,
+ "disabled": false,
+ "hidden": false
+ },
+ {
+ "id": "98514ac85fb371eb",
+ "type": "ui_tab",
+ "name": "Debug Logs",
+ "icon": "dashboard",
+ "order": 7,
+ "disabled": false,
+ "hidden": false
+ },
+ {
+ "id": "985cb816630d7e12",
+ "type": "ui_group",
+ "name": "Group 1",
+ "tab": "98514ac85fb371eb",
+ "order": 1,
+ "disp": false,
+ "width": "20",
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "1a1f481e736717f6",
+ "type": "ui_tab",
+ "name": "Config",
+ "icon": "dashboard",
+ "order": 5,
+ "disabled": false,
+ "hidden": false
+ },
+ {
+ "id": "ea29ae5e99fd702f",
+ "type": "ui_group",
+ "name": "adsbcot Config",
+ "tab": "1a1f481e736717f6",
+ "order": 3,
+ "disp": true,
+ "width": 6,
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "c9b3e02a2ade5f4f",
+ "type": "ui_group",
+ "name": "AryaOS Config",
+ "tab": "1a1f481e736717f6",
+ "order": 2,
+ "disp": true,
+ "width": 8,
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "d39a9c40a9e39a06",
+ "type": "ui_group",
+ "name": "DANGER ZONE",
+ "tab": "3883fa5a5cd96180",
+ "order": 3,
+ "disp": true,
+ "width": "10",
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "4f5d2f631860ad85",
+ "type": "ui_group",
+ "name": "TAK Users",
+ "tab": "f26ff01359312d83",
+ "order": 1,
+ "disp": true,
+ "width": "12",
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "f26ff01359312d83",
+ "type": "ui_tab",
+ "name": "TAK",
+ "icon": "dashboard",
+ "order": 8,
+ "disabled": false,
+ "hidden": false
+ },
+ {
+ "id": "2ff2aec393c0b08b",
+ "type": "ui_link",
+ "name": "Home",
+ "link": "http://AryaOS.local",
+ "icon": "open_in_browser",
+ "target": "newtab",
+ "order": 1
+ },
+ {
+ "id": "3883fa5a5cd96180",
+ "type": "ui_tab",
+ "name": "Admin",
+ "icon": "dashboard",
+ "order": 4,
+ "disabled": false,
+ "hidden": false
+ },
+ {
+ "id": "1027f32817e150a0",
+ "type": "ui_group",
+ "name": "Control",
+ "tab": "1a1f481e736717f6",
+ "order": 1,
+ "disp": false,
+ "width": "6",
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "20776b02c778704b",
+ "type": "ui_link",
+ "name": "Recorder",
+ "link": "http://aryaos.local/logs/",
+ "icon": "open_in_browser",
+ "target": "newtab",
+ "order": 2
+ },
+ {
+ "id": "5fe7b630bc270f5d",
+ "type": "ui_group",
+ "name": "lincot",
+ "tab": "1a1f481e736717f6",
+ "order": 4,
+ "disp": true,
+ "width": 6,
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "fa4e075e1fa30638",
+ "type": "ui_group",
+ "name": "Status",
+ "tab": "edc83286b603d84a",
+ "order": 1,
+ "disp": true,
+ "width": "10",
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "f9087e66bb4cd9b2",
+ "type": "ui_group",
+ "name": "Control",
+ "tab": "edc83286b603d84a",
+ "order": 2,
+ "disp": true,
+ "width": "10",
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "f61e7642f6395af5",
+ "type": "ui_tab",
+ "name": "Update",
+ "icon": "dashboard",
+ "disabled": false,
+ "hidden": false
+ },
+ {
+ "id": "27bb63a809345efc",
+ "type": "ui_group",
+ "name": "Default",
+ "tab": "f61e7642f6395af5",
+ "order": 1,
+ "disp": true,
+ "width": "20",
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "de218d79fd1bbdd4",
+ "type": "ui_spacer",
+ "z": "4fa67ac9ec0c7369",
+ "name": "spacer",
+ "group": "c9b3e02a2ade5f4f",
+ "order": 5,
+ "width": "8",
+ "height": "1"
+ },
+ {
+ "id": "01bbd1a84045b069",
+ "type": "ui_group",
+ "name": "Command Logs",
+ "tab": "3883fa5a5cd96180",
+ "order": 2,
+ "disp": true,
+ "width": "10",
+ "collapse": false,
+ "className": ""
+ },
+ {
+ "id": "59dd599c93f49d9b",
+ "type": "ui_spacer",
+ "z": "1d5c7046712ea9d2",
+ "name": "spacer",
+ "group": "d39a9c40a9e39a06",
+ "order": 2,
+ "width": 2,
+ "height": 1
+ },
+ {
+ "id": "087bafabfc3d14f1",
+ "type": "ui_spacer",
+ "z": "1d5c7046712ea9d2",
+ "name": "spacer",
+ "group": "d39a9c40a9e39a06",
+ "order": 4,
+ "width": 2,
+ "height": 1
+ },
+ {
+ "id": "683a2b05.736204",
+ "type": "ui_button",
+ "z": "1d5c7046712ea9d2",
+ "g": "bd418afe09349324",
+ "name": "",
+ "group": "d39a9c40a9e39a06",
+ "order": 3,
+ "width": 4,
+ "height": 1,
+ "passthru": false,
+ "label": "Reboot",
+ "tooltip": "",
+ "color": "black",
+ "bgcolor": "yellow",
+ "className": "",
+ "icon": "",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "",
+ "topicType": "str",
+ "x": 820,
+ "y": 740,
+ "wires": [
+ [
+ "1cf31554.2aaa63"
+ ]
+ ]
+ },
+ {
+ "id": "1cf31554.2aaa63",
+ "type": "exec",
+ "z": "1d5c7046712ea9d2",
+ "g": "bd418afe09349324",
+ "command": "sudo /sbin/reboot",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "",
+ "timer": "",
+ "winHide": false,
+ "name": "Reboot",
+ "x": 1000,
+ "y": 740,
+ "wires": [
+ [],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "38e53dbf.ca594a",
+ "type": "ui_button",
+ "z": "1d5c7046712ea9d2",
+ "g": "bd418afe09349324",
+ "name": "",
+ "group": "d39a9c40a9e39a06",
+ "order": 1,
+ "width": 4,
+ "height": 1,
+ "passthru": false,
+ "label": "Shutdown",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "red",
+ "className": "",
+ "icon": "",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "",
+ "topicType": "str",
+ "x": 830,
+ "y": 800,
+ "wires": [
+ [
+ "c409cae5.8e4128"
+ ]
+ ]
+ },
+ {
+ "id": "c409cae5.8e4128",
+ "type": "exec",
+ "z": "1d5c7046712ea9d2",
+ "g": "bd418afe09349324",
+ "command": "sudo /sbin/shutdown -h now",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "",
+ "timer": "",
+ "winHide": false,
+ "name": "Shutdown",
+ "x": 1010,
+ "y": 800,
+ "wires": [
+ [],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "08b06bdbca165793",
+ "type": "ui_button",
+ "z": "1d5c7046712ea9d2",
+ "name": "Restart adsbcot",
+ "group": "f9087e66bb4cd9b2",
+ "order": 11,
+ "width": 4,
+ "height": 1,
+ "passthru": false,
+ "label": "Restart",
+ "tooltip": "",
+ "color": "black",
+ "bgcolor": "white",
+ "className": "",
+ "icon": "",
+ "payload": "adsbcot",
+ "payloadType": "str",
+ "topic": "restart",
+ "topicType": "str",
+ "x": 430,
+ "y": 620,
+ "wires": [
+ [
+ "ec8563d3c093ce78"
+ ]
+ ]
+ },
+ {
+ "id": "811dc61136e8046d",
+ "type": "ui_button",
+ "z": "1d5c7046712ea9d2",
+ "g": "bd418afe09349324",
+ "name": "",
+ "group": "f9087e66bb4cd9b2",
+ "order": 7,
+ "width": 4,
+ "height": 1,
+ "passthru": false,
+ "label": "Reset WiFi",
+ "tooltip": "",
+ "color": "black",
+ "bgcolor": "white",
+ "className": "",
+ "icon": "",
+ "payload": "comitup",
+ "payloadType": "str",
+ "topic": "",
+ "topicType": "str",
+ "x": 830,
+ "y": 680,
+ "wires": [
+ [
+ "0be2a009aadd225d"
+ ]
+ ]
+ },
+ {
+ "id": "0be2a009aadd225d",
+ "type": "exec",
+ "z": "1d5c7046712ea9d2",
+ "g": "bd418afe09349324",
+ "command": "/usr/local/sbin/wifi-nuke.py",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "",
+ "timer": "",
+ "winHide": false,
+ "name": "",
+ "x": 1060,
+ "y": 680,
+ "wires": [
+ [
+ "3493a1a21d11eab7"
+ ],
+ [
+ "6949a7f7b06e7070"
+ ],
+ [
+ "90ed4f84f5e592ba"
+ ]
+ ]
+ },
+ {
+ "id": "f37f9b80fb0791de",
+ "type": "ui_button",
+ "z": "1d5c7046712ea9d2",
+ "name": "Restart dump1090-fa",
+ "group": "f9087e66bb4cd9b2",
+ "order": 21,
+ "width": 3,
+ "height": 1,
+ "passthru": false,
+ "label": "Restart",
+ "tooltip": "",
+ "color": "black",
+ "bgcolor": "white",
+ "className": "",
+ "icon": "",
+ "payload": "dump1090-fa",
+ "payloadType": "str",
+ "topic": "restart",
+ "topicType": "str",
+ "x": 240,
+ "y": 880,
+ "wires": [
+ [
+ "ec8563d3c093ce78"
+ ]
+ ]
+ },
+ {
+ "id": "87d746e00381cae2",
+ "type": "ui_button",
+ "z": "1d5c7046712ea9d2",
+ "name": "Restart dump978-fa",
+ "group": "f9087e66bb4cd9b2",
+ "order": 37,
+ "width": 4,
+ "height": 1,
+ "passthru": false,
+ "label": "Restart",
+ "tooltip": "",
+ "color": "black",
+ "bgcolor": "white",
+ "className": "",
+ "icon": "",
+ "payload": "dump978-fa",
+ "payloadType": "str",
+ "topic": "restart",
+ "topicType": "str",
+ "x": 180,
+ "y": 980,
+ "wires": [
+ [
+ "ec8563d3c093ce78"
+ ]
+ ]
+ },
+ {
+ "id": "88eaf8eb64d89ff4",
+ "type": "ui_button",
+ "z": "1d5c7046712ea9d2",
+ "name": "Disable adsbcot",
+ "group": "f9087e66bb4cd9b2",
+ "order": 10,
+ "width": 2,
+ "height": 1,
+ "passthru": false,
+ "label": "Disable",
+ "tooltip": "",
+ "color": "black",
+ "bgcolor": "white",
+ "className": "",
+ "icon": "",
+ "payload": "adsbcot",
+ "payloadType": "str",
+ "topic": "disable",
+ "topicType": "str",
+ "x": 430,
+ "y": 580,
+ "wires": [
+ [
+ "ec8563d3c093ce78"
+ ]
+ ]
+ },
+ {
+ "id": "3493a1a21d11eab7",
+ "type": "ui_template",
+ "z": "1d5c7046712ea9d2",
+ "group": "01bbd1a84045b069",
+ "name": "Command STDOUT",
+ "order": 3,
+ "width": 10,
+ "height": 5,
+ "format": "Command STDOUT:\n
\n
", + "storeOutMessages": true, + "fwdInMessages": true, + "resendOnRefresh": true, + "templateScope": "local", + "className": "", + "x": 470, + "y": 1200, + "wires": [ + [] + ] + }, + { + "id": "ca3080fa414c682a", + "type": "inject", + "z": "94cf869050128770", + "name": "", + "props": [], + "repeat": "300", + "crontab": "", + "once": true, + "onceDelay": "", + "topic": "", + "x": 110, + "y": 1280, + "wires": [ + [ + "b8c830dc7384cd97" + ] + ] + }, + { + "id": "b8c830dc7384cd97", + "type": "exec", + "z": "94cf869050128770", + "command": "dmesg|egrep -vi '(^$)'|tail -10", + "addpay": false, + "append": "", + "useSpawn": "", + "timer": "", + "winHide": false, + "name": "", + "x": 360, + "y": 1280, + "wires": [ + [ + "a37cfd5ee5320ebf" + ], + [], + [] + ] + }, + { + "id": "a37cfd5ee5320ebf", + "type": "ui_template", + "z": "94cf869050128770", + "group": "985cb816630d7e12", + "name": "dmesg Tail", + "order": 3, + "width": 20, + "height": 6, + "format": "dmesg Tail\n
\n", + "storeOutMessages": true, + "fwdInMessages": true, + "resendOnRefresh": true, + "templateScope": "local", + "className": "", + "x": 610, + "y": 1260, + "wires": [ + [] + ] + }, + { + "id": "43958e20b7e848a3", + "type": "ui_text", + "z": "94cf869050128770", + "g": "fb90e60944764ed9", + "group": "fa4e075e1fa30638", + "order": 9, + "width": 10, + "height": 1, + "name": "GPS Fix?", + "label": "GPS Mode/Fix:", + "format": "{{msg.payload}}", + "layout": "row-left", + "className": "", + "style": false, + "font": "", + "fontSize": 16, + "color": "#000000", + "x": 640, + "y": 460, + "wires": [] + }, + { + "id": "67c1aa629a2e95af", + "type": "exec", + "z": "94cf869050128770", + "g": "a1d4fe25968a5368", + "command": "/usr/local/sbin/get_throttled.sh", + "addpay": false, + "append": "", + "useSpawn": "", + "timer": "", + "winHide": false, + "name": "", + "x": 790, + "y": 620, + "wires": [ + [ + "4f64ec7db13ee424" + ], + [], + [] + ] + }, + { + "id": "4f64ec7db13ee424", + "type": "ui_template", + "z": "94cf869050128770", + "g": "a1d4fe25968a5368", + "group": "fa4e075e1fa30638", + "name": "Throttle Status", + "order": 10, + "width": 10, + "height": 3, + "format": "Throttle Status\n
\n", + "storeOutMessages": true, + "fwdInMessages": true, + "resendOnRefresh": true, + "templateScope": "local", + "className": "", + "x": 1020, + "y": 600, + "wires": [ + [] + ] + }, + { + "id": "4338acd2934924cc", + "type": "inject", + "z": "94cf869050128770", + "g": "a1d4fe25968a5368", + "name": "", + "props": [], + "repeat": "300", + "crontab": "", + "once": true, + "onceDelay": "", + "topic": "", + "x": 590, + "y": 620, + "wires": [ + [ + "67c1aa629a2e95af" + ] + ] + }, + { + "id": "16419a36256c9583", + "type": "inject", + "z": "94cf869050128770", + "g": "e3b3a9c137f6b1a8", + "name": "1m", + "props": [], + "repeat": "60", + "crontab": "", + "once": true, + "onceDelay": 0.1, + "topic": "", + "x": 130, + "y": 620, + "wires": [ + [ + "b1d1259dd556c68a" + ] + ] + }, + { + "id": "b1d1259dd556c68a", + "type": "exec", + "z": "94cf869050128770", + "g": "e3b3a9c137f6b1a8", + "command": "uptime", + "addpay": false, + "append": "", + "useSpawn": "", + "timer": "", + "winHide": false, + "name": "", + "x": 250, + "y": 620, + "wires": [ + [ + "267687b40c52261e" + ], + [], + [] + ] + }, + { + "id": "267687b40c52261e", + "type": "ui_text", + "z": "94cf869050128770", + "g": "e3b3a9c137f6b1a8", + "group": "fa4e075e1fa30638", + "order": 5, + "width": 10, + "height": 1, + "name": "", + "label": "Uptime: ", + "format": "{{msg.payload}}", + "layout": "row-left", + "className": "", + "style": false, + "font": "", + "fontSize": 16, + "color": "#000000", + "x": 400, + "y": 620, + "wires": [] + }, + { + "id": "4dfeafb5656bdb04", + "type": "template", + "z": "94cf869050128770", + "name": "Services", + "field": "payload", + "fieldType": "msg", + "format": "handlebars", + "syntax": "mustache", + "template": "[\n \"adsbcot\",\n \"dump1090-fa\",\n \"dump978-fa\",\n \"comitup\",\n \"lincot\",\n \"nodered\",\n \"gpsd\",\n \"readsb\",\n \"aiscot\",\n \"dronecot\",\n \"skyaware\",\n \"tar1090\"\n]", + "output": "str", + "x": 240, + "y": 1960, + "wires": [ + [ + "b4b0c83c63e4b4ff" + ] + ] + }, + { + "id": "285ece519bd3976f", + "type": "inject", + "z": "94cf869050128770", + "name": "30s", + "props": [], + "repeat": "30", + "crontab": "", + "once": true, + "onceDelay": "", + "topic": "", + "x": 90, + "y": 2000, + "wires": [ + [ + "4dfeafb5656bdb04" + ] + ] + }, + { + "id": "e93dc524c636e92d", + "type": "split", + "z": "94cf869050128770", + "name": "", + "splt": "\\n", + "spltType": "str", + "arraySplt": 1, + "arraySpltType": "len", + "stream": false, + "addname": "", + "x": 410, + "y": 1960, + "wires": [ + [ + "88070f84d9e74504" + ] + ] + }, + { + "id": "b4b0c83c63e4b4ff", + "type": "json", + "z": "94cf869050128770", + "name": "", + "property": "payload", + "action": "", + "pretty": false, + "x": 250, + "y": 2000, + "wires": [ + [ + "e93dc524c636e92d" + ] + ] + }, + { + "id": "88070f84d9e74504", + "type": "change", + "z": "94cf869050128770", + "name": "Set service", + "rules": [ + { + "t": "set", + "p": "service", + "pt": "msg", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 430, + "y": 2000, + "wires": [ + [ + "668b9fe6695a20aa" + ] + ] + }, + { + "id": "668b9fe6695a20aa", + "type": "exec", + "z": "94cf869050128770", + "command": "systemctl status", + "addpay": "payload", + "append": "", + "useSpawn": "", + "timer": "", + "winHide": false, + "name": "", + "x": 420, + "y": 2200, + "wires": [ + [ + "4f78a58561400bb1" + ], + [], + [ + "37f21d650f5fda44" + ] + ] + }, + { + "id": "fb5bade2bfe9eabc", + "type": "ui_template", + "z": "94cf869050128770", + "group": "985cb816630d7e12", + "name": "comitup Status", + "order": 4, + "width": 20, + "height": 5, + "format": "
\n", + "storeOutMessages": true, + "fwdInMessages": true, + "resendOnRefresh": true, + "templateScope": "local", + "className": "", + "x": 730, + "y": 1560, + "wires": [ + [] + ] + }, + { + "id": "96eaefd7b076e52f", + "type": "function", + "z": "94cf869050128770", + "name": "Format", + "func": "const pl = msg.payload\n\nconst lo0 = pl[0]\nconst eth0 = pl[1]\nconst wlan0 = pl[2]\n\nif (eth0.addr_info.length > 0) {\n eth0.ip = eth0.addr_info[0].local || \"[NO IP]\"\n}\n\nif (wlan0.addr_info.length > 0) {\n wlan0.ip = wlan0.addr_info[0].local || \"[NO IP]\"\n}\n\nmsg.payload = `${eth0.ifname}: ${eth0.ip}\\n\n${wlan0.ifname}: ${wlan0.ip}`;\n\nreturn msg;\n\n", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 580, + "y": 1560, + "wires": [ + [ + "2273e07e235feb5f", + "08b0c289b467c651" + ] + ] + }, + { + "id": "08b0c289b467c651", + "type": "ui_template", + "z": "94cf869050128770", + "group": "fa4e075e1fa30638", + "name": "IP Interfaces", + "order": 4, + "width": 5, + "height": 2, + "format": "IP Interfaces\n
\n", + "storeOutMessages": true, + "fwdInMessages": true, + "resendOnRefresh": true, + "templateScope": "local", + "className": "", + "x": 730, + "y": 1600, + "wires": [ + [] + ] + }, + { + "id": "9f8119755cf73778", + "type": "qrcode-generator", + "z": "94cf869050128770", + "g": "d34772b1b10233f2", + "name": "", + "qrtype": "wifi2qr", + "text2qrText": "", + "ssid": "", + "hiddenssid": false, + "wifitype": "", + "phonenum": "", + "smsphonenum": "", + "smstext": "", + "mailto": "", + "mailsubject": "", + "mailbody": "", + "latitude": "", + "longitude": "", + "colorlight": "#ffffff", + "colordark": "#000000", + "printstatus": true, + "x": 1070, + "y": 480, + "wires": [ + [ + "cbbe264f84b53680" + ] + ] + }, + { + "id": "a1642742e713d559", + "type": "link in", + "z": "94cf869050128770", + "g": "d34772b1b10233f2", + "name": "QR Code In", + "links": [ + "b104d679e8967f58" + ], + "x": 785, + "y": 480, + "wires": [ + [ + "8a9319936729c649" + ] + ] + }, + { + "id": "8a9319936729c649", + "type": "function", + "z": "94cf869050128770", + "g": "d34772b1b10233f2", + "name": "Set URL", + "func": "const pl = msg.payload\nlet nodeId = pl.match(/NODE_ID=(?
", + "storeOutMessages": true, + "fwdInMessages": true, + "resendOnRefresh": true, + "templateScope": "local", + "className": "", + "x": 410, + "y": 740, + "wires": [ + [] + ] + }, + { + "id": "ab90271f7830e67f", + "type": "ui_text", + "z": "94cf869050128770", + "group": "f9087e66bb4cd9b2", + "order": 13, + "width": 10, + "height": 1, + "name": "", + "label": "Aircraft Decoder", + "format": "{{msg.payload}}", + "layout": "row-spread", + "className": "", + "style": true, + "font": "Arial Black,Arial Black,Gadget,sans-serif", + "fontSize": 16, + "color": "#000000", + "x": 620, + "y": 2660, + "wires": [] + }, + { + "id": "5cfdb012b7c10a7c", + "type": "ui_text", + "z": "94cf869050128770", + "group": "f9087e66bb4cd9b2", + "order": 14, + "width": 2, + "height": 4, + "name": "", + "label": "Mutually Exclusive (Choose One)", + "format": "", + "layout": "row-spread", + "className": "", + "style": true, + "font": "Arial Narrow,Nimbus Sans L,sans-serif", + "fontSize": 16, + "color": "#000000", + "x": 680, + "y": 2700, + "wires": [] + }, + { + "id": "e0d87a55d461c609", + "type": "ui_text", + "z": "94cf869050128770", + "g": "45da34b7e4bdb957", + "group": "fa4e075e1fa30638", + "order": 13, + "width": 10, + "height": 1, + "name": "Last Update", + "label": "Last Update (secs.)", + "format": "{{msg.payload}}", + "layout": "row-left", + "className": "", + "style": false, + "font": "", + "fontSize": 16, + "color": "#000000", + "x": 590, + "y": 180, + "wires": [] + }, + { + "id": "8db81499fdb5170a", + "type": "function", + "z": "94cf869050128770", + "g": "45da34b7e4bdb957", + "name": "Get Delta", + "func": "let pl = msg.payload\nflow.set(\"lastUpdate\", pl)\n\n// let now = new Date(Date.now()).toISOString()\nlet now = Date.now()\nlet delta = now*1000 - (pl/1000)\n\nmsg.payload = parseInt(now/1000 - pl)\n\n\nreturn msg;\n\n", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 440, + "y": 180, + "wires": [ + [ + "e0d87a55d461c609" + ] + ] + }, + { + "id": "681d2876a7db4f51", + "type": "inject", + "z": "94cf869050128770", + "g": "45da34b7e4bdb957", + "name": "10s", + "props": [], + "repeat": "10", + "crontab": "", + "once": true, + "onceDelay": "5", + "topic": "", + "x": 130, + "y": 180, + "wires": [ + [ + "d85368cd75bb347e" + ] + ] + }, + { + "id": "d85368cd75bb347e", + "type": "change", + "z": "94cf869050128770", + "g": "45da34b7e4bdb957", + "name": "lastUpdate", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "lastUpdate", + "tot": "flow" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 270, + "y": 180, + "wires": [ + [ + "8db81499fdb5170a" + ] + ] + }, + { + "id": "5fad15ef4b61bca7", + "type": "debug", + "z": "94cf869050128770", + "name": "debug 30", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 460, + "y": 1400, + "wires": [] + }, + { + "id": "7c69f96954e99a9b", + "type": "split", + "z": "94cf869050128770", + "g": "fb90e60944764ed9", + "name": "", + "splt": "\\n", + "spltType": "str", + "arraySplt": 1, + "arraySpltType": "len", + "stream": false, + "addname": "", + "x": 290, + "y": 460, + "wires": [ + [ + "de2c209dbe934060" + ] + ] + }, + { + "id": "f20627a1cbc79171", + "type": "switch", + "z": "94cf869050128770", + "g": "fb90e60944764ed9", + "name": "Class", + "property": "payload.class", + "propertyType": "msg", + "rules": [ + { + "t": "eq", + "v": "TPV", + "vt": "str" + } + ], + "checkall": "true", + "repair": false, + "outputs": 1, + "x": 450, + "y": 460, + "wires": [ + [ + "1190f05a50aad89c" + ] + ] + }, + { + "id": "4a87ab6388bffac2", + "type": "exec", + "z": "94cf869050128770", + "g": "1d17f399c2310113", + "command": "hostnamectl --json=pretty status", + "addpay": false, + "append": "", + "useSpawn": "", + "timer": "", + "winHide": false, + "name": "", + "x": 860, + "y": 740, + "wires": [ + [ + "5d6ab3c272199b94", + "6ee20da0ae45fefa" + ], + [], + [] + ] + }, + { + "id": "1fca29d62080fdd9", + "type": "inject", + "z": "94cf869050128770", + "g": "1d17f399c2310113", + "name": "1m", + "props": [], + "repeat": "60", + "crontab": "", + "once": true, + "onceDelay": "0.5", + "topic": "", + "x": 650, + "y": 740, + "wires": [ + [ + "4a87ab6388bffac2" + ] + ] + }, + { + "id": "5d6ab3c272199b94", + "type": "ui_template", + "z": "94cf869050128770", + "g": "1d17f399c2310113", + "group": "985cb816630d7e12", + "name": "Hostnamectl", + "order": 14, + "width": "10", + "height": "10", + "format": "Hostnamectl\n
\n\n", + "storeOutMessages": true, + "fwdInMessages": true, + "resendOnRefresh": true, + "templateScope": "local", + "className": "", + "x": 1090, + "y": 760, + "wires": [ + [] + ] + }, + { + "id": "dc3fd8b497972cae", + "type": "ui_text", + "z": "94cf869050128770", + "g": "1d17f399c2310113", + "group": "fa4e075e1fa30638", + "order": 3, + "width": 5, + "height": 1, + "name": "Hostname", + "label": "Hostname:", + "format": "{{msg.payload}}", + "layout": "row-left", + "className": "", + "style": false, + "font": "", + "fontSize": 16, + "color": "#000000", + "x": 1370, + "y": 720, + "wires": [] + }, + { + "id": "2d5d9381afea8c59", + "type": "change", + "z": "94cf869050128770", + "g": "1d17f399c2310113", + "name": "Hostname", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "payload.Hostname", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 1210, + "y": 720, + "wires": [ + [ + "dc3fd8b497972cae" + ] + ] + }, + { + "id": "6ee20da0ae45fefa", + "type": "json", + "z": "94cf869050128770", + "g": "1d17f399c2310113", + "name": "", + "property": "payload", + "action": "", + "pretty": false, + "x": 1070, + "y": 720, + "wires": [ + [ + "2d5d9381afea8c59" + ] + ] + }, + { + "id": "605314ea7983779d", + "type": "worldmap", + "z": "9c4ba3cbc4bd87fa", + "name": "AryaOS Map", + "lat": "37.16611", + "lon": "-119.44944", + "zoom": "6", + "layer": "Custom", + "cluster": "", + "maxage": "", + "usermenu": "show", + "layers": "show", + "panit": "false", + "panlock": "false", + "zoomlock": "false", + "hiderightclick": "false", + "coords": "deg", + "showgrid": "true", + "showruler": "false", + "allowFileDrop": "false", + "path": "/AryaOS-map", + "overlist": "DR,CO,RA,DN,BU,RW,SN,AC,TL,HM", + "maplist": "OSMG,OSMC,OSMH,EsriC,EsriS,EsriT,EsriO,EsriDG,NatGeo,UKOS,OpTop,HB,AN,ST,SW", + "mapname": "CalFire Airbases", + "mapurl": "http://AryaOS.local/calfire_airbases/{z}/{x}/{y}.png", + "mapopt": "", + "mapwms": true, + "x": 550, + "y": 120, + "wires": [] + }, + { + "id": "828d600baacf7776", + "type": "tak2wm", + "z": "9c4ba3cbc4bd87fa", + "name": "TAK2Worldmap", + "x": 360, + "y": 120, + "wires": [ + [ + "605314ea7983779d" + ] + ] + }, + { + "id": "2934adb02aeb8158", + "type": "link in", + "z": "9c4ba3cbc4bd87fa", + "name": "Maps In", + "links": [ + "64fa2c00f63bdd53" + ], + "x": 185, + "y": 280, + "wires": [ + [ + "21fbad99be695a04" + ] + ] + }, + { + "id": "d15baed95c725e8c", + "type": "worldmap", + "z": "9c4ba3cbc4bd87fa", + "name": "AryaOS Map", + "lat": "37.16611", + "lon": "-119.44944", + "zoom": "6", + "layer": "Custom", + "cluster": "", + "maxage": "", + "usermenu": "show", + "layers": "show", + "panit": "false", + "panlock": "false", + "zoomlock": "false", + "hiderightclick": "false", + "coords": "deg", + "showgrid": "true", + "showruler": "false", + "allowFileDrop": "false", + "path": "/map", + "overlist": "DR,CO,RA,DN,BU,RW,SN,AC,TL,HM", + "maplist": "OSMG,OSMC,OSMH,EsriC,EsriS,EsriT,EsriO,EsriDG,NatGeo,UKOS,OpTop,HB,AN,ST,SW", + "mapname": "CalFire Airbases", + "mapurl": "http://AryaOS.local/calfire_airbases/{z}/{x}/{y}.png", + "mapopt": "", + "mapwms": true, + "x": 550, + "y": 340, + "wires": [] + }, + { + "id": "37a3c25966f0b291", + "type": "ui_worldmap", + "z": "9c4ba3cbc4bd87fa", + "group": "fa4e075e1fa30638", + "order": 15, + "width": 0, + "height": 0, + "name": "", + "lat": "37.16611", + "lon": "-119.44944", + "zoom": "6", + "layer": "Custom", + "cluster": "", + "maxage": "", + "usermenu": "hide", + "layers": "hide", + "panit": "false", + "panlock": "false", + "zoomlock": "false", + "hiderightclick": "true", + "coords": "none", + "showgrid": "false", + "showruler": "false", + "allowFileDrop": "false", + "path": "/ui-map", + "overlist": "DR,CO,RA,DN,HM", + "maplist": "OSMG,OSMC,EsriC,EsriS,EsriT,EsriDG,UKOS", + "mapname": "CalFire Airbases", + "mapurl": "http://AryaOS.local/calfire_airbases/{z}/{x}/{y}.png", + "mapopt": "", + "mapwms": true, + "x": 540, + "y": 280, + "wires": [] + }, + { + "id": "134821138a2acfc2", + "type": "split", + "z": "9c4ba3cbc4bd87fa", + "name": "", + "splt": "\\n", + "spltType": "str", + "arraySplt": 1, + "arraySpltType": "len", + "stream": false, + "addname": "", + "x": 130, + "y": 340, + "wires": [ + [ + "41bb4c5c359af191" + ] + ] + }, + { + "id": "21fbad99be695a04", + "type": "change", + "z": "9c4ba3cbc4bd87fa", + "name": "", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "payload.aircraft", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 300, + "y": 280, + "wires": [ + [ + "134821138a2acfc2" + ] + ] + }, + { + "id": "41bb4c5c359af191", + "type": "change", + "z": "9c4ba3cbc4bd87fa", + "name": "", + "rules": [ + { + "t": "set", + "p": "payload.name", + "pt": "msg", + "to": "payload.hex", + "tot": "msg" + }, + { + "t": "set", + "p": "payload.icon", + "pt": "msg", + "to": ":airplane:", + "tot": "str" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 300, + "y": 340, + "wires": [ + [ + "d15baed95c725e8c", + "37a3c25966f0b291" + ] + ] + }, + { + "id": "3ffffc180cc204dd", + "type": "link in", + "z": "9c4ba3cbc4bd87fa", + "name": "Maps In", + "links": [ + "089a5c1ffeafe91b" + ], + "x": 185, + "y": 120, + "wires": [ + [ + "828d600baacf7776" + ] + ] + }, + { + "id": "da9ab22b6c479887", + "type": "inject", + "z": "9c4ba3cbc4bd87fa", + "name": "", + "props": [ + { + "p": "payload" + }, + { + "p": "topic", + "vt": "str" + } + ], + "repeat": "", + "crontab": "", + "once": false, + "onceDelay": 0.1, + "topic": "", + "payload": "", + "payloadType": "date", + "x": 300, + "y": 560, + "wires": [ + [ + "c63bb0b151b470de" + ] + ] + }, + { + "id": "c63bb0b151b470de", + "type": "function", + "z": "9c4ba3cbc4bd87fa", + "name": "function 3", + "func": "var imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];\nmsg.payload = { command: { }}\nmsg.payload.command.map = {\n overlay: \"test test\",\n url: 'https://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg',\n bounds: imageBounds,\n opt: { opacity:0.8, attribution:\"© test test\" }\n};\n\nreturn msg;", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 460, + "y": 560, + "wires": [ + [ + "d15baed95c725e8c" + ] + ] + }, + { + "id": "5f6eab2d3d6ad9be", + "type": "json", + "z": "76732e91104cd622", + "g": "e165fa1b9bca5292", + "name": "", + "property": "payload", + "action": "", + "pretty": false, + "x": 570, + "y": 580, + "wires": [ + [ + "64fa2c00f63bdd53" + ] + ] + }, + { + "id": "64fa2c00f63bdd53", + "type": "link out", + "z": "76732e91104cd622", + "g": "e165fa1b9bca5292", + "name": "aircraft Out", + "mode": "link", + "links": [ + "20787a00729ffe5f", + "2934adb02aeb8158", + "24b067af1a8cbf7d" + ], + "x": 675, + "y": 540, + "wires": [] + }, + { + "id": "b068a436f07cc0bd", + "type": "watch", + "z": "76732e91104cd622", + "g": "e165fa1b9bca5292", + "name": "", + "files": "/run/adsb", + "recursive": "", + "x": 120, + "y": 460, + "wires": [ + [ + "b3d1b7bf5a4edba2" + ] + ] + }, + { + "id": "99dfc7e97f5f8d47", + "type": "file in", + "z": "76732e91104cd622", + "g": "e165fa1b9bca5292", + "name": "", + "filename": "payload", + "filenameType": "msg", + "format": "utf8", + "chunk": false, + "sendError": false, + "encoding": "none", + "allProps": false, + "x": 540, + "y": 540, + "wires": [ + [ + "5f6eab2d3d6ad9be" + ] + ] + }, + { + "id": "ba3910d8c8793f4d", + "type": "watch", + "z": "76732e91104cd622", + "name": "", + "files": "/etc/default/adsbcot", + "recursive": "", + "x": 150, + "y": 160, + "wires": [ + [ + "4e74c03efbd3034e", + "7ec81fe075691fa0" + ] + ] + }, + { + "id": "99875f9d26d1f50e", + "type": "link out", + "z": "76732e91104cd622", + "name": "adsbcot-config.txt Out", + "mode": "link", + "links": [ + "09f4ad56eb3fd133" + ], + "x": 445, + "y": 140, + "wires": [] + }, + { + "id": "5f868835544d4788", + "type": "inject", + "z": "76732e91104cd622", + "name": "/etc/default/adsbcot", + "props": [ + { + "p": "payload" + } + ], + "repeat": "", + "crontab": "", + "once": true, + "onceDelay": 0.1, + "topic": "", + "payload": "/etc/default/adsbcot", + "payloadType": "str", + "x": 150, + "y": 120, + "wires": [ + [ + "4e74c03efbd3034e" + ] + ] + }, + { + "id": "1948aec0539f51d7", + "type": "watch", + "z": "76732e91104cd622", + "name": "", + "files": "/etc/default/aryaos", + "recursive": "", + "x": 140, + "y": 260, + "wires": [ + [ + "11af02e57d6dc86d", + "7ec81fe075691fa0" + ] + ] + }, + { + "id": "11af02e57d6dc86d", + "type": "file in", + "z": "76732e91104cd622", + "name": "", + "filename": "payload", + "filenameType": "msg", + "format": "utf8", + "chunk": false, + "sendError": false, + "encoding": "none", + "allProps": false, + "x": 340, + "y": 260, + "wires": [ + [ + "b104d679e8967f58" + ] + ] + }, + { + "id": "b104d679e8967f58", + "type": "link out", + "z": "76732e91104cd622", + "name": "aryaos-config.txt Out", + "mode": "link", + "links": [ + "a1642742e713d559", + "09f4ad56eb3fd133" + ], + "x": 445, + "y": 240, + "wires": [] + }, + { + "id": "1bbbc97101f3d953", + "type": "inject", + "z": "76732e91104cd622", + "name": "", + "props": [ + { + "p": "payload" + } + ], + "repeat": "", + "crontab": "", + "once": true, + "onceDelay": 0.1, + "topic": "", + "payload": "/etc/default/aryaos", + "payloadType": "str", + "x": 140, + "y": 220, + "wires": [ + [ + "11af02e57d6dc86d" + ] + ] + }, + { + "id": "4aa3f8001760c96a", + "type": "udp in", + "z": "76732e91104cd622", + "g": "265b840ea6186ecf", + "name": "", + "iface": "", + "port": "6969", + "ipv": "udp4", + "multicast": "true", + "group": "239.2.3.1", + "datatype": "buffer", + "x": 170, + "y": 800, + "wires": [ + [ + "089a5c1ffeafe91b" + ] + ] + }, + { + "id": "e0a7e9ef71a6f0e8", + "type": "udp in", + "z": "76732e91104cd622", + "g": "265b840ea6186ecf", + "name": "", + "iface": "wlan0", + "port": "6969", + "ipv": "udp4", + "multicast": "true", + "group": "239.2.3.1", + "datatype": "buffer", + "x": 170, + "y": 860, + "wires": [ + [ + "089a5c1ffeafe91b" + ] + ] + }, + { + "id": "bd6f79df66f3f373", + "type": "udp in", + "z": "76732e91104cd622", + "g": "265b840ea6186ecf", + "name": "", + "iface": "eth0", + "port": "6969", + "ipv": "udp4", + "multicast": "true", + "group": "239.2.3.1", + "datatype": "buffer", + "x": 170, + "y": 920, + "wires": [ + [ + "089a5c1ffeafe91b" + ] + ] + }, + { + "id": "089a5c1ffeafe91b", + "type": "link out", + "z": "76732e91104cd622", + "g": "265b840ea6186ecf", + "name": "Network TAK In", + "mode": "link", + "links": [ + "7c699e7f158dc0d5", + "3ffffc180cc204dd", + "dc87e7e88303ec78" + ], + "x": 365, + "y": 860, + "wires": [] + }, + { + "id": "662e281141324f13", + "type": "watch", + "z": "76732e91104cd622", + "name": "", + "files": "tmpConf", + "recursive": "", + "x": 100, + "y": 320, + "wires": [ + [ + "18674460572a0475" + ] + ] + }, + { + "id": "8ef58d62e7fd687c", + "type": "link out", + "z": "76732e91104cd622", + "name": "tmp-XXXX-config.txt Out", + "mode": "link", + "links": [ + "df765e01751751eb" + ], + "x": 515, + "y": 320, + "wires": [] + }, + { + "id": "1aa83bf16aa07349", + "type": "file in", + "z": "76732e91104cd622", + "name": "", + "filename": "confPath", + "filenameType": "msg", + "format": "utf8", + "chunk": false, + "sendError": false, + "encoding": "none", + "allProps": false, + "x": 420, + "y": 320, + "wires": [ + [ + "8ef58d62e7fd687c" + ] + ] + }, + { + "id": "4e74c03efbd3034e", + "type": "file in", + "z": "76732e91104cd622", + "name": "", + "filename": "payload", + "filenameType": "msg", + "format": "utf8", + "chunk": false, + "sendError": false, + "encoding": "none", + "allProps": false, + "x": 340, + "y": 140, + "wires": [ + [ + "99875f9d26d1f50e" + ] + ] + }, + { + "id": "18674460572a0475", + "type": "function", + "z": "76732e91104cd622", + "name": "Set Config Path", + "func": "msg.confPath = `/home/node-red/${msg.payload}`;\n\nreturn msg;", + "outputs": 1, + "timeout": "", + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 260, + "y": 320, + "wires": [ + [ + "1aa83bf16aa07349" + ] + ] + }, + { + "id": "7ec81fe075691fa0", + "type": "link out", + "z": "76732e91104cd622", + "name": "Configs Out", + "mode": "link", + "links": [ + "af90dbace757338b" + ], + "x": 315, + "y": 200, + "wires": [] + }, + { + "id": "58edafa9ab997436", + "type": "link in", + "z": "76732e91104cd622", + "g": "265b840ea6186ecf", + "name": "Out to Mesh SA", + "links": [ + "ddb201c5df845268" + ], + "x": 225, + "y": 980, + "wires": [ + [ + "a5dbb71f6d17579d" + ] + ] + }, + { + "id": "a5dbb71f6d17579d", + "type": "udp out", + "z": "76732e91104cd622", + "g": "265b840ea6186ecf", + "name": "", + "addr": "239.2.3.1", + "iface": "", + "port": "6969", + "ipv": "udp4", + "outport": "", + "base64": false, + "multicast": "multi", + "x": 390, + "y": 980, + "wires": [] + }, + { + "id": "b3d1b7bf5a4edba2", + "type": "switch", + "z": "76732e91104cd622", + "g": "e165fa1b9bca5292", + "name": "aircraft.json?", + "property": "payload", + "propertyType": "msg", + "rules": [ + { + "t": "eq", + "v": "/run/adsb/aircraft.json", + "vt": "str" + }, + { + "t": "eq", + "v": "/run/dump1090/aircraft.json", + "vt": "str" + }, + { + "t": "eq", + "v": "/run/dump1090-fa/aircraft.json", + "vt": "str" + }, + { + "t": "eq", + "v": "/run/dump1090-mutability/aircraft.json", + "vt": "str" + }, + { + "t": "eq", + "v": "/run/readsb/aircraft.json", + "vt": "str" + } + ], + "checkall": "true", + "repair": false, + "outputs": 5, + "x": 370, + "y": 540, + "wires": [ + [ + "99dfc7e97f5f8d47" + ], + [ + "99dfc7e97f5f8d47" + ], + [ + "99dfc7e97f5f8d47" + ], + [ + "99dfc7e97f5f8d47" + ], + [ + "99dfc7e97f5f8d47" + ] + ] + }, + { + "id": "ce3be08760e15920", + "type": "watch", + "z": "76732e91104cd622", + "g": "e165fa1b9bca5292", + "name": "", + "files": "/run/readsb", + "recursive": "", + "x": 130, + "y": 500, + "wires": [ + [ + "b3d1b7bf5a4edba2" + ] + ] + }, + { + "id": "65a40de620905bad", + "type": "watch", + "z": "76732e91104cd622", + "g": "e165fa1b9bca5292", + "name": "", + "files": "/run/dump1090", + "recursive": "", + "x": 140, + "y": 540, + "wires": [ + [ + "b3d1b7bf5a4edba2" + ] + ] + }, + { + "id": "573961361f4ac80b", + "type": "watch", + "z": "76732e91104cd622", + "g": "e165fa1b9bca5292", + "name": "", + "files": "/run/dump1090-fa", + "recursive": "", + "x": 150, + "y": 580, + "wires": [ + [ + "b3d1b7bf5a4edba2" + ] + ] + }, + { + "id": "61a91ec3d8b3f82b", + "type": "watch", + "z": "76732e91104cd622", + "g": "e165fa1b9bca5292", + "name": "", + "files": "/run/dump1090-mutability", + "recursive": "", + "x": 170, + "y": 620, + "wires": [ + [ + "b3d1b7bf5a4edba2" + ] + ] + }, + { + "id": "ede3aeb67d70b53d", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "FEED_URL", + "tooltip": "Where are we getting ADS-B tracks?", + "group": "ea29ae5e99fd702f", + "order": 1, + "width": 6, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "FEED_URL", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 610, + "y": 400, + "wires": [ + [ + "9b8548552e7fbfa4" + ] + ] + }, + { + "id": "20bb4cfcf85404b9", + "type": "function", + "z": "4fa67ac9ec0c7369", + "name": "Read Conf K/V", + "func": "const EOL = \"\\n\"; // FIXME: Should be os.EOL.\nconst pl = msg.payload;\nconst readEnvVars = () => pl.split(EOL);\n\nlet configs = flow.get(\"configs\") || {};\nlet config = configs[msg.filename]\n\n/**\n * Finds the key in conf files and returns the corresponding value\n *\n * @param {string} key Key to find\n * @returns {string|null} Value of the key\n */\nconst getConfValue = (key) => {\n // find the line that contains the key (exact match)\n const matchedLine = readEnvVars().find((/** @type {string} */ line) => line.split(\"=\")[0] === key);\n\n // split the line (delimiter is '=') and return the item at index 2\n return matchedLine !== undefined ? matchedLine.split(\"=\")[1] : null;\n};\n\n\nlet k;\n\nfor (k of Object.keys(config)) {\n let confVal = getConfValue(k)\n if (confVal) {\n config[k] = confVal\n }\n}\n\nconfigs[msg.filename] = config\nflow.set(\"configs\", configs)\n\nmsg.payload = config;\n\nreturn msg;", + "outputs": 1, + "timeout": "", + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 260, + "y": 360, + "wires": [ + [ + "7790857cd1c02015" + ] + ] + }, + { + "id": "7790857cd1c02015", + "type": "split", + "z": "4fa67ac9ec0c7369", + "name": "", + "splt": "\\n", + "spltType": "str", + "arraySplt": 1, + "arraySpltType": "len", + "stream": false, + "addname": "", + "x": 230, + "y": 400, + "wires": [ + [ + "b87a918bdc4910dc" + ] + ] + }, + { + "id": "b29ad47e816eeb8a", + "type": "switch", + "z": "4fa67ac9ec0c7369", + "name": "", + "property": "topic", + "propertyType": "msg", + "rules": [ + { + "t": "eq", + "v": "NODE_ID", + "vt": "str" + }, + { + "t": "eq", + "v": "FEED_URL", + "vt": "str" + }, + { + "t": "eq", + "v": "ALT_UPPER", + "vt": "str" + }, + { + "t": "eq", + "v": "ALT_LOWER", + "vt": "str" + }, + { + "t": "eq", + "v": "COT_URL", + "vt": "str" + }, + { + "t": "eq", + "v": "PYTAK_MULTICAST_LOCAL_ADDR", + "vt": "str" + }, + { + "t": "eq", + "v": "STATIC_ALT", + "vt": "str" + }, + { + "t": "eq", + "v": "STATIC_LAT", + "vt": "str" + }, + { + "t": "eq", + "v": "STATIC_LON", + "vt": "str" + }, + { + "t": "eq", + "v": "COT_ACCESS", + "vt": "str" + }, + { + "t": "eq", + "v": "COT_STALE", + "vt": "str" + }, + { + "t": "eq", + "v": "TFR_STATE", + "vt": "str" + }, + { + "t": "eq", + "v": "TAK_PROTO", + "vt": "str" + }, + { + "t": "eq", + "v": "DEBUG", + "vt": "str" + }, + { + "t": "eq", + "v": "FTS_COMPAT", + "vt": "str" + }, + { + "t": "eq", + "v": "PYTAK_TLS_CLIENT_CERT", + "vt": "str" + }, + { + "t": "eq", + "v": "PYTAK_TLS_CLIENT_KEY", + "vt": "str" + }, + { + "t": "eq", + "v": "PYTAK_TLS_CLIENT_PASSWORD", + "vt": "str" + }, + { + "t": "eq", + "v": "PYTAK_TLS_DONT_VERIFY", + "vt": "str" + }, + { + "t": "eq", + "v": "PYTAK_TLS_DONT_CHECK_HOSTNAME", + "vt": "str" + }, + { + "t": "eq", + "v": "PYTAK_TLS_CLIENT_CAFILE", + "vt": "str" + }, + { + "t": "else" + } + ], + "checkall": "true", + "repair": false, + "outputs": 22, + "x": 370, + "y": 680, + "wires": [ + [ + "2f521601ceea7ce4" + ], + [ + "ede3aeb67d70b53d" + ], + [ + "cdd18c9e97866deb" + ], + [ + "270527e3d2b0c57e" + ], + [ + "09fb1bd40272d0af" + ], + [ + "2f25f0b243e59af1" + ], + [ + "5ad11569a70069c4" + ], + [ + "7b2591633f69cff2" + ], + [ + "f1a4b452b8ad0ff2" + ], + [ + "7e3b2c1fde544a53" + ], + [], + [ + "c12e71dc514f0676", + "fddcfcce5a422433" + ], + [], + [], + [], + [ + "436315b0476f70b0" + ], + [ + "d7ddc89a64e3aae4" + ], + [ + "5f39214bc42e56a0" + ], + [ + "754c14a86b211411" + ], + [ + "3558984684b19247" + ], + [ + "2eebb8889f9ea032" + ], + [ + "83d408b06d1af375" + ] + ] + }, + { + "id": "09fb1bd40272d0af", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "COT_URL", + "tooltip": "Where are we sending Cursor on Target?", + "group": "c9b3e02a2ade5f4f", + "order": 1, + "width": 8, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "COT_URL", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 600, + "y": 540, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "b87a918bdc4910dc", + "type": "switch", + "z": "4fa67ac9ec0c7369", + "name": "", + "property": "payload", + "propertyType": "msg", + "rules": [ + { + "t": "nnull" + } + ], + "checkall": "true", + "repair": false, + "outputs": 1, + "x": 230, + "y": 440, + "wires": [ + [ + "bcd4f9fe3ff42a97" + ] + ] + }, + { + "id": "2f25f0b243e59af1", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "PYTAK_MULTICAST_LOCAL_ADDR", + "tooltip": "", + "group": "c9b3e02a2ade5f4f", + "order": 4, + "width": 8, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "PYTAK_MULTICAST_LOCAL_ADDR", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 690, + "y": 580, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "2f521601ceea7ce4", + "type": "ui_text", + "z": "4fa67ac9ec0c7369", + "group": "fa4e075e1fa30638", + "order": 1, + "width": 5, + "height": 1, + "name": "", + "label": "Node ID: ", + "format": "{{msg.payload}}", + "layout": "row-left", + "className": "", + "style": false, + "font": "", + "fontSize": 16, + "color": "#000000", + "x": 600, + "y": 360, + "wires": [] + }, + { + "id": "cdd18c9e97866deb", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "ALT_UPPER", + "tooltip": "Upper Altitude Limit, geometric (GNSS / INS) altitude in feet referenced to the WGS84 ellipsoid.", + "group": "ea29ae5e99fd702f", + "order": 2, + "width": 6, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "ALT_UPPER", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 610, + "y": 440, + "wires": [ + [ + "9b8548552e7fbfa4" + ] + ] + }, + { + "id": "270527e3d2b0c57e", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "ALT_LOWER", + "tooltip": "Lower Altitude Limit, geometric (GNSS / INS) altitude in feet referenced to the WGS84 ellipsoid.", + "group": "ea29ae5e99fd702f", + "order": 3, + "width": 6, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "ALT_LOWER", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 610, + "y": 480, + "wires": [ + [ + "9b8548552e7fbfa4" + ] + ] + }, + { + "id": "cb87c8b4398c815d", + "type": "ui_button", + "z": "4fa67ac9ec0c7369", + "g": "a247d145bc97ec4e", + "name": "", + "group": "1027f32817e150a0", + "order": 1, + "width": 0, + "height": 0, + "passthru": false, + "label": "Save Changes & Restart", + "tooltip": "", + "color": "", + "bgcolor": "", + "className": "", + "icon": "", + "payload": "configs", + "payloadType": "flow", + "topic": "topic", + "topicType": "msg", + "x": 590, + "y": 200, + "wires": [ + [ + "a693d594320c6842", + "631f87c4233853a4" + ] + ] + }, + { + "id": "bcd4f9fe3ff42a97", + "type": "change", + "z": "4fa67ac9ec0c7369", + "name": "", + "rules": [ + { + "t": "set", + "p": "topic", + "pt": "msg", + "to": "parts.key", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 180, + "y": 680, + "wires": [ + [ + "b29ad47e816eeb8a" + ] + ] + }, + { + "id": "90bbf3ddaabf55d6", + "type": "function", + "z": "4fa67ac9ec0c7369", + "g": "a247d145bc97ec4e", + "name": "Remove nulls", + "func": "const pl = msg.payload;\nlet newpl = {};\n\nfor (const [key, value] of Object.entries(pl)) {\n if (value !== null) {\n newpl[key] = value\n }\n}\n\nmsg.payload = newpl;\n\nreturn msg;", + "outputs": 1, + "timeout": "", + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 560, + "y": 240, + "wires": [ + [ + "8f90b1c209f39ff8" + ] + ] + }, + { + "id": "70a02ab5c732adf0", + "type": "file", + "z": "4fa67ac9ec0c7369", + "g": "a247d145bc97ec4e", + "name": "", + "filename": "tmpConfPath", + "filenameType": "msg", + "appendNewline": true, + "createDir": false, + "overwriteFile": "true", + "encoding": "none", + "x": 700, + "y": 280, + "wires": [ + [ + "83463f13b20d8ef3" + ] + ] + }, + { + "id": "8f90b1c209f39ff8", + "type": "function", + "z": "4fa67ac9ec0c7369", + "g": "a247d145bc97ec4e", + "name": "Format ENV file", + "func": "const pl = msg.payload;\nlet newpl = `# ${msg.topic} Automatically created by AryaOS Dashboard.`;\n\nfor (const [key, value] of Object.entries(pl)) {\n if (value !== null) {\n newpl = `${newpl}\\n${key}=${value}`\n }\n}\n\nmsg.payload = newpl;\n\nreturn msg;", + "outputs": 1, + "timeout": "", + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 740, + "y": 240, + "wires": [ + [ + "e435961c35c6c50f" + ] + ] + }, + { + "id": "e435961c35c6c50f", + "type": "function", + "z": "4fa67ac9ec0c7369", + "g": "a247d145bc97ec4e", + "name": "Use tmp file", + "func": "msg.tmpConfPath = msg.topic.replace(\"/etc/\", \"tmpConf/\")\n\nreturn msg;", + "outputs": 1, + "timeout": "", + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 550, + "y": 280, + "wires": [ + [ + "70a02ab5c732adf0" + ] + ] + }, + { + "id": "df765e01751751eb", + "type": "link in", + "z": "4fa67ac9ec0c7369", + "g": "c5409a5d2b5e28d5", + "name": "adsbcot-config.txt In", + "links": [ + "8ef58d62e7fd687c" + ], + "x": 505, + "y": 100, + "wires": [ + [ + "2d8066d127cb6c44", + "59b872f3a0bdee19" + ] + ] + }, + { + "id": "2d8066d127cb6c44", + "type": "function", + "z": "4fa67ac9ec0c7369", + "g": "c5409a5d2b5e28d5", + "name": "Set Cmd", + "func": "let realName = msg.filename.replace(\"tmpConf/\", \"/etc/\").replace(\"/home/node-red/\", \"\")\nmsg.payload = `sudo cp ${msg.filename} ${realName}`\n\nreturn msg;", + "outputs": 1, + "timeout": "", + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 620, + "y": 100, + "wires": [ + [ + "bb55ecc1c7a7da19", + "59b872f3a0bdee19" + ] + ] + }, + { + "id": "436315b0476f70b0", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "PYTAK_TLS_CLIENT_CERT", + "tooltip": "PEM TLS Client Cert", + "group": "c9b3e02a2ade5f4f", + "order": 6, + "width": 8, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "PYTAK_TLS_CLIENT_CERT", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 620, + "y": 940, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "9ebdda528d43e0ed", + "type": "ui_button", + "z": "4fa67ac9ec0c7369", + "name": "", + "group": "1027f32817e150a0", + "order": 2, + "width": 0, + "height": 0, + "passthru": true, + "label": "Load Configs", + "tooltip": "", + "color": "", + "bgcolor": "green", + "className": "", + "icon": "", + "payload": "configs", + "payloadType": "flow", + "topic": "topic", + "topicType": "msg", + "x": 260, + "y": 200, + "wires": [ + [ + "9c77b6745bbb256f" + ] + ] + }, + { + "id": "f03da47ad91841c2", + "type": "split", + "z": "4fa67ac9ec0c7369", + "name": "", + "splt": "\\n", + "spltType": "str", + "arraySplt": 1, + "arraySpltType": "len", + "stream": false, + "addname": "topic", + "x": 230, + "y": 280, + "wires": [ + [ + "1c2d5f5bc8a23c60" + ] + ] + }, + { + "id": "1c2d5f5bc8a23c60", + "type": "file in", + "z": "4fa67ac9ec0c7369", + "name": "", + "filename": "payload", + "filenameType": "msg", + "format": "utf8", + "chunk": false, + "sendError": false, + "encoding": "none", + "allProps": false, + "x": 240, + "y": 320, + "wires": [ + [ + "20bb4cfcf85404b9" + ] + ] + }, + { + "id": "bb55ecc1c7a7da19", + "type": "link out", + "z": "4fa67ac9ec0c7369", + "g": "c5409a5d2b5e28d5", + "name": "Save Config Out", + "mode": "link", + "links": [ + "191a64ffb1ef6aac" + ], + "x": 725, + "y": 100, + "wires": [] + }, + { + "id": "21b1f508196e9b5a", + "type": "inject", + "z": "4fa67ac9ec0c7369", + "name": "", + "props": [], + "repeat": "", + "crontab": "", + "once": true, + "onceDelay": 0.1, + "topic": "", + "x": 150, + "y": 120, + "wires": [ + [ + "38dd95c8bf4641c3" + ] + ] + }, + { + "id": "38dd95c8bf4641c3", + "type": "function", + "z": "4fa67ac9ec0c7369", + "name": "Set Configs", + "func": "let configs = {\n \"/etc/default/adsbcot\": {\n FEED_URL: \"file:///run/adsb/aircraft.json\", \n POLL_INTERVAL: null, \n ALT_UPPER: null, \n ALT_LOWER: null\n },\n \"/etc/default/aryaos\": {\n NODE_ID: null,\n COT_URL: \"udp+wo://239.2.3.1:6969\",\n PYTAK_MULTICAST_LOCAL_ADDR: \"0.0.0.0\",\n PYTAK_TLS_CLIENT_CERT: null,\n WIFI_AP_IP: \"10.41.0.1\",\n COT_ACCESS: \"UNCLASSIFIED\",\n STATIC_LAT: null,\n STATIC_LON: null,\n STATIC_ALT: null,\n TFR_STATE: \"CA\",\n PYTAK_TLS_CLIENT_KEY: null,\n PYTAK_TLS_DONT_VERIFY: null,\n PYTAK_TLS_DONT_CHECK_HOSTNAME: null,\n PYTAK_TLS_CLIENT_CAFILE: null,\n PYTAK_TLS_CLIENT_PASSWORD: null,\n\n },\n \"/etc/default/lincot\": {\n GPS_INFO_CMD: null,\n CALLSIGN: null\n }\n}\n\nflow.set(\"configs\", configs)\n\nreturn msg;", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 250, + "y": 160, + "wires": [ + [ + "9ebdda528d43e0ed" + ] + ] + }, + { + "id": "9c77b6745bbb256f", + "type": "function", + "z": "4fa67ac9ec0c7369", + "name": "Set Files", + "func": "const configs = flow.get(\"configs\") || {}\nmsg.payload = Object.keys(configs)\nreturn msg;", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 240, + "y": 240, + "wires": [ + [ + "f03da47ad91841c2" + ] + ] + }, + { + "id": "9b8548552e7fbfa4", + "type": "change", + "z": "4fa67ac9ec0c7369", + "name": "/etc/default/adsbcot", + "rules": [ + { + "t": "set", + "p": "filename", + "pt": "msg", + "to": "/etc/default/adsbcot", + "tot": "str" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 850, + "y": 440, + "wires": [ + [ + "e0a10c197bb93cee" + ] + ] + }, + { + "id": "52d59a8a443b3363", + "type": "change", + "z": "4fa67ac9ec0c7369", + "name": "/etc/default/aryaos", + "rules": [ + { + "t": "set", + "p": "filename", + "pt": "msg", + "to": "/etc/default/aryaos", + "tot": "str" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 1090, + "y": 660, + "wires": [ + [ + "e0a10c197bb93cee", + "86b92497c8d0f36c" + ] + ] + }, + { + "id": "a693d594320c6842", + "type": "split", + "z": "4fa67ac9ec0c7369", + "g": "a247d145bc97ec4e", + "name": "", + "splt": "\\n", + "spltType": "str", + "arraySplt": 1, + "arraySpltType": "len", + "stream": false, + "addname": "topic", + "x": 770, + "y": 200, + "wires": [ + [ + "90bbf3ddaabf55d6" + ] + ] + }, + { + "id": "09f4ad56eb3fd133", + "type": "link in", + "z": "4fa67ac9ec0c7369", + "name": "Config in", + "links": [ + "99875f9d26d1f50e", + "b104d679e8967f58" + ], + "x": 105, + "y": 240, + "wires": [ + [ + "9c77b6745bbb256f" + ] + ] + }, + { + "id": "e0a10c197bb93cee", + "type": "function", + "z": "4fa67ac9ec0c7369", + "name": "Set Configs", + "func": "let configs = flow.get(\"configs\") || {};\n\nconfigs[msg.filename][msg.topic] = msg.payload\n\nflow.set(\"configs\", configs)\n\nreturn msg;", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 1390, + "y": 640, + "wires": [ + [ + "8e27fbfb0a2496bb" + ] + ] + }, + { + "id": "5ad11569a70069c4", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "STATIC_ALT", + "tooltip": "", + "group": "5fe7b630bc270f5d", + "order": 2, + "width": 6, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "STATIC_ALT", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 610, + "y": 640, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "7b2591633f69cff2", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "STATIC_LAT", + "tooltip": "", + "group": "5fe7b630bc270f5d", + "order": 3, + "width": 6, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "STATIC_LAT", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 610, + "y": 680, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "f1a4b452b8ad0ff2", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "STATIC_LON", + "tooltip": "", + "group": "5fe7b630bc270f5d", + "order": 4, + "width": 6, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "STATIC_LON", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 610, + "y": 720, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "631f87c4233853a4", + "type": "debug", + "z": "4fa67ac9ec0c7369", + "name": "debug 13", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 900, + "y": 140, + "wires": [] + }, + { + "id": "59b872f3a0bdee19", + "type": "debug", + "z": "4fa67ac9ec0c7369", + "name": "debug 14", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 860, + "y": 60, + "wires": [] + }, + { + "id": "83463f13b20d8ef3", + "type": "debug", + "z": "4fa67ac9ec0c7369", + "name": "debug 16", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 900, + "y": 320, + "wires": [] + }, + { + "id": "ff7a0b0653db330b", + "type": "ui_switch", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "Use Static Position?", + "tooltip": "", + "group": "5fe7b630bc270f5d", + "order": 1, + "width": 6, + "height": 1, + "passthru": true, + "decouple": "false", + "topic": "GPS_INFO_CMD", + "topicType": "str", + "style": "", + "onvalue": "/usr/local/bin/get_position.sh", + "onvalueType": "str", + "onicon": "", + "oncolor": "", + "offvalue": "null", + "offvalueType": "json", + "officon": "", + "offcolor": "", + "animate": false, + "className": "", + "x": 1120, + "y": 860, + "wires": [ + [ + "68268787596399d6" + ] + ] + }, + { + "id": "68268787596399d6", + "type": "change", + "z": "4fa67ac9ec0c7369", + "name": "/etc/default/lincot", + "rules": [ + { + "t": "set", + "p": "filename", + "pt": "msg", + "to": "/etc/default/lincot", + "tot": "str" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 1350, + "y": 860, + "wires": [ + [ + "e0a10c197bb93cee" + ] + ] + }, + { + "id": "8e27fbfb0a2496bb", + "type": "debug", + "z": "4fa67ac9ec0c7369", + "name": "debug 18", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 1480, + "y": 480, + "wires": [] + }, + { + "id": "7e3b2c1fde544a53", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "COT_ACCESS", + "tooltip": "", + "group": "c9b3e02a2ade5f4f", + "order": 2, + "width": 8, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "COT_ACCESS", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 620, + "y": 760, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "c12e71dc514f0676", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "TFR_STATE", + "tooltip": "", + "group": "c9b3e02a2ade5f4f", + "order": 3, + "width": 8, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "TFR_STATE", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 610, + "y": 800, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "fddcfcce5a422433", + "type": "change", + "z": "4fa67ac9ec0c7369", + "name": "TFR_STATE", + "rules": [ + { + "t": "set", + "p": "TFR_STATE", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 610, + "y": 840, + "wires": [ + [] + ] + }, + { + "id": "d7ddc89a64e3aae4", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "PYTAK_TLS_CLIENT_KEY", + "tooltip": "(optional) PEM TLS Client Private Key", + "group": "c9b3e02a2ade5f4f", + "order": 7, + "width": 8, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "PYTAK_TLS_CLIENT_KEY", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 620, + "y": 980, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "5f39214bc42e56a0", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "PYTAK_TLS_CLIENT_PASSWORD", + "tooltip": "(optional) TLS Client encrypted Private Key password", + "group": "c9b3e02a2ade5f4f", + "order": 8, + "width": 8, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "PYTAK_TLS_CLIENT_PASSWORD", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 640, + "y": 1020, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "754c14a86b211411", + "type": "ui_switch", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "TLS Don't Verify Server Cert", + "tooltip": "", + "group": "c9b3e02a2ade5f4f", + "order": 9, + "width": 6, + "height": 1, + "passthru": true, + "decouple": "false", + "topic": "PYTAK_TLS_DONT_VERIFY", + "topicType": "str", + "style": "", + "onvalue": "true", + "onvalueType": "bool", + "onicon": "", + "oncolor": "", + "offvalue": "false", + "offvalueType": "bool", + "officon": "", + "offcolor": "", + "animate": false, + "className": "", + "x": 600, + "y": 1100, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "3558984684b19247", + "type": "ui_switch", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "TLS Don't Check Server Cert CN", + "tooltip": "", + "group": "c9b3e02a2ade5f4f", + "order": 10, + "width": 6, + "height": 1, + "passthru": true, + "decouple": "false", + "topic": "PYTAK_TLS_DONT_CHECK_HOSTNAME", + "topicType": "str", + "style": "", + "onvalue": "true", + "onvalueType": "bool", + "onicon": "", + "oncolor": "", + "offvalue": "false", + "offvalueType": "bool", + "officon": "", + "offcolor": "", + "animate": false, + "className": "", + "x": 620, + "y": 1140, + "wires": [ + [ + "52d59a8a443b3363" + ] + ] + }, + { + "id": "86b92497c8d0f36c", + "type": "debug", + "z": "4fa67ac9ec0c7369", + "name": "debug 28", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 1160, + "y": 740, + "wires": [] + }, + { + "id": "2eebb8889f9ea032", + "type": "ui_text_input", + "z": "4fa67ac9ec0c7369", + "name": "", + "label": "PYTAK_TLS_CLIENT_CAFILE", + "tooltip": "(optional) TLS CA Trust Store", + "group": "c9b3e02a2ade5f4f", + "order": 8, + "width": 8, + "height": 1, + "passthru": true, + "mode": "text", + "delay": 300, + "topic": "PYTAK_TLS_CLIENT_CAFILE", + "sendOnBlur": true, + "className": "", + "topicType": "str", + "x": 630, + "y": 1060, + "wires": [ + [] + ] + }, + { + "id": "83d408b06d1af375", + "type": "debug", + "z": "4fa67ac9ec0c7369", + "name": "debug 29", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 240, + "y": 900, + "wires": [] + }, + { + "id": "eeab9ac6513e2cdf", + "type": "parsrer", + "z": "de725ec24f79b6b7", + "name": "", + "state": "", + "destUid": "", + "takMission": "", + "datasyncSave": false, + "creatorUid": "", + "takServerUrl": "", + "missionApiPort": 8443, + "x": 430, + "y": 200, + "wires": [ + [ + "cedca169d6844f15" + ], + [], + [] + ] + }, + { + "id": "1adb2eef7b22719d", + "type": "inject", + "z": "de725ec24f79b6b7", + "name": "", + "props": [], + "repeat": "3600", + "crontab": "", + "once": true, + "onceDelay": 0.1, + "topic": "", + "x": 110, + "y": 200, + "wires": [ + [ + "2f99864e0fa97b18" + ] + ] + }, + { + "id": "1e6eb6f93066814d", + "type": "debug", + "z": "de725ec24f79b6b7", + "name": "debug 9", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 600, + "y": 120, + "wires": [] + }, + { + "id": "ddb201c5df845268", + "type": "link out", + "z": "de725ec24f79b6b7", + "name": "TFR Out", + "mode": "link", + "links": [ + "58edafa9ab997436", + "dc87e7e88303ec78" + ], + "x": 665, + "y": 200, + "wires": [] + }, + { + "id": "cedca169d6844f15", + "type": "tak", + "z": "de725ec24f79b6b7", + "name": "TAK", + "x": 570, + "y": 200, + "wires": [ + [ + "ddb201c5df845268", + "1e6eb6f93066814d" + ], + [], + [] + ] + }, + { + "id": "2f99864e0fa97b18", + "type": "change", + "z": "de725ec24f79b6b7", + "name": "", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "TFR_STATE", + "tot": "global" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 260, + "y": 200, + "wires": [ + [ + "eeab9ac6513e2cdf", + "d45bfee76b7ca4be" + ] + ] + }, + { + "id": "d45bfee76b7ca4be", + "type": "debug", + "z": "de725ec24f79b6b7", + "name": "debug 19", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 240, + "y": 120, + "wires": [] + }, + { + "id": "cedb612803ec48f3", + "type": "ui_table", + "z": "898f970d26b5049d", + "group": "4f5d2f631860ad85", + "name": "", + "order": 3, + "width": "12", + "height": "15", + "columns": [ + { + "field": "id", + "title": "id", + "width": "2", + "align": "center", + "formatter": "rownum", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "label", + "title": "Label", + "width": "", + "align": "left", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "lastUpdate", + "title": "Updated", + "width": "", + "align": "left", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "battery", + "title": "Bat", + "width": "", + "align": "left", + "formatter": "progress", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "battery", + "title": "Bat%", + "width": "5", + "align": "left", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + } + ], + "outputs": 1, + "cts": true, + "x": 750, + "y": 220, + "wires": [ + [] + ] + }, + { + "id": "1a05840c28615402", + "type": "function", + "z": "898f970d26b5049d", + "name": "Update User Table", + "func": "let pl = msg.payload;\n\nmsg.payload = {\n command: \"updateOrAddData\",\n arguments: [\n [\n {\n \"id\": pl.name,\n \"label\": pl.label || pl.name,\n \"lastUpdate\": pl.lastUpdate,\n 'battery': pl.battery\n }\n ]\n ]\n}\n\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 570, + "y": 220, + "wires": [ + [ + "cedb612803ec48f3", + "089d8cf88cede906" + ] + ] + }, + { + "id": "ca452dfdb255ad66", + "type": "ui_chart", + "z": "898f970d26b5049d", + "name": "", + "group": "4f5d2f631860ad85", + "order": 2, + "width": 0, + "height": 0, + "label": "chart", + "chartType": "line", + "legend": "true", + "xformat": "HH:mm", + "interpolate": "linear", + "nodata": "", + "dot": false, + "ymin": "", + "ymax": "", + "removeOlder": "3", + "removeOlderPoints": "", + "removeOlderUnit": "3600", + "cutout": 0, + "useOneColor": false, + "useUTC": false, + "colors": [ + "#1f77b4", + "#aec7e8", + "#ff7f0e", + "#2ca02c", + "#98df8a", + "#d62728", + "#ff9896", + "#9467bd", + "#c5b0d5" + ], + "outputs": 1, + "useDifferentColor": false, + "className": "", + "x": 750, + "y": 260, + "wires": [ + [] + ] + }, + { + "id": "95a794098ccf72a6", + "type": "function", + "z": "898f970d26b5049d", + "name": "Update Battery Graph", + "func": "let pl = msg.payload;\n\nmsg.payload = {\n command: \"updateOrAddData\",\n arguments: [\n [\n {\n \"id\": pl.name,\n \"label\": pl.label || pl.name,\n \"lastUpdate\": pl.lastUpdate,\n 'battery': pl.battery\n }\n ]\n ]\n}\n\nmsg.topic = pl.label || pl.name;\nmsg.payload = pl.battery;\n\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 580, + "y": 260, + "wires": [ + [ + "ca452dfdb255ad66" + ] + ] + }, + { + "id": "7c699e7f158dc0d5", + "type": "link in", + "z": "898f970d26b5049d", + "name": "TAK Dashboard In", + "links": [ + "089a5c1ffeafe91b" + ], + "x": 175, + "y": 240, + "wires": [ + [ + "ddb04bc04415d51e" + ] + ] + }, + { + "id": "ddb04bc04415d51e", + "type": "tak2wm", + "z": "898f970d26b5049d", + "name": "TAK2Worldmap", + "x": 300, + "y": 240, + "wires": [ + [ + "1a05840c28615402", + "95a794098ccf72a6", + "16f795d55dda4729" + ] + ] + }, + { + "id": "089d8cf88cede906", + "type": "debug", + "z": "898f970d26b5049d", + "name": "debug 4", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 700, + "y": 160, + "wires": [] + }, + { + "id": "16f795d55dda4729", + "type": "debug", + "z": "898f970d26b5049d", + "name": "debug 5", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 460, + "y": 140, + "wires": [] + }, + { + "id": "dc87e7e88303ec78", + "type": "link in", + "z": "f8d4ccf4360ea706", + "name": "Sit(x) In", + "links": [ + "089a5c1ffeafe91b", + "ddb201c5df845268" + ], + "x": 175, + "y": 100, + "wires": [ + [ + "7ff44de3e1b9f7ce" + ] + ] + }, + { + "id": "7ff44de3e1b9f7ce", + "type": "tak", + "z": "f8d4ccf4360ea706", + "name": "TAK", + "x": 270, + "y": 100, + "wires": [ + [ + "d13138584cc78f08" + ], + [], + [] + ] + }, + { + "id": "d13138584cc78f08", + "type": "tak", + "z": "f8d4ccf4360ea706", + "name": "TAK", + "x": 390, + "y": 100, + "wires": [ + [ + "058bbbd3ada7d52d" + ], + [], + [] + ] + }, + { + "id": "058bbbd3ada7d52d", + "type": "Sit(x) Node", + "z": "f8d4ccf4360ea706", + "d": true, + "name": "", + "sitx_config": "", + "x": 530, + "y": 100, + "wires": [ + [] + ] + }, + { + "id": "4194294f579cd489", + "type": "inject", + "z": "f83d0c6d58d0338c", + "name": "Recorder tempo", + "props": [ + { + "p": "payload" + }, + { + "p": "topic", + "vt": "str" + } + ], + "repeat": "1", + "crontab": "", + "once": true, + "onceDelay": 0.1, + "topic": "", + "payload": "", + "payloadType": "date", + "x": 210, + "y": 60, + "wires": [ + [ + "7aebc40599793b82", + "23cecfd9fe2ca333" + ] + ] + }, + { + "id": "24b067af1a8cbf7d", + "type": "link in", + "z": "f83d0c6d58d0338c", + "name": "Recorder In", + "links": [ + "64fa2c00f63bdd53" + ], + "x": 185, + "y": 200, + "wires": [ + [ + "9d614ce21a98acb3", + "503bc8cc58c93e82" + ] + ] + }, + { + "id": "74eb25f411edeb7c", + "type": "ui_button", + "z": "f83d0c6d58d0338c", + "name": "Start Recorder", + "group": "f9087e66bb4cd9b2", + "order": 4, + "width": 4, + "height": 1, + "passthru": true, + "label": "Start", + "tooltip": "Starts aircraft data recorder.", + "color": "white", + "bgcolor": "green", + "className": "", + "icon": "save", + "payload": "true", + "payloadType": "bool", + "topic": "topic", + "topicType": "msg", + "x": 280, + "y": 340, + "wires": [ + [ + "1fdb87ae7ebff0c2" + ] + ] + }, + { + "id": "0445d10019fc7ebc", + "type": "ui_button", + "z": "f83d0c6d58d0338c", + "name": "Stop Recorder", + "group": "f9087e66bb4cd9b2", + "order": 2, + "width": 4, + "height": 1, + "passthru": true, + "label": "Stop", + "tooltip": "Stops aircraft data recorder.", + "color": "white", + "bgcolor": "red", + "className": "", + "icon": "stop", + "payload": "false", + "payloadType": "bool", + "topic": "topic", + "topicType": "msg", + "x": 280, + "y": 380, + "wires": [ + [ + "1fdb87ae7ebff0c2" + ] + ] + }, + { + "id": "77267e91ba9895c4", + "type": "debug", + "z": "f83d0c6d58d0338c", + "name": "debug 23", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 340, + "y": 180, + "wires": [] + }, + { + "id": "d467e586e80afacc", + "type": "debug", + "z": "f83d0c6d58d0338c", + "name": "debug 24", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 700, + "y": 180, + "wires": [] + }, + { + "id": "4a8dd2ec585b8b08", + "type": "file", + "z": "f83d0c6d58d0338c", + "name": "Write to recorderFile", + "filename": "recorderFile", + "filenameType": "msg", + "appendNewline": true, + "createDir": false, + "overwriteFile": "false", + "encoding": "none", + "x": 920, + "y": 220, + "wires": [ + [] + ] + }, + { + "id": "7aebc40599793b82", + "type": "change", + "z": "f83d0c6d58d0338c", + "name": "Set Tempo", + "rules": [ + { + "t": "set", + "p": "tempo", + "pt": "flow", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 390, + "y": 60, + "wires": [ + [] + ] + }, + { + "id": "1fdb87ae7ebff0c2", + "type": "change", + "z": "f83d0c6d58d0338c", + "name": "", + "rules": [ + { + "t": "set", + "p": "record", + "pt": "flow", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 460, + "y": 360, + "wires": [ + [ + "f5c0e9070d94faaa" + ] + ] + }, + { + "id": "9d614ce21a98acb3", + "type": "switch", + "z": "f83d0c6d58d0338c", + "name": "Record?", + "property": "record", + "propertyType": "flow", + "rules": [ + { + "t": "true" + } + ], + "checkall": "true", + "repair": false, + "outputs": 1, + "x": 340, + "y": 220, + "wires": [ + [ + "77267e91ba9895c4", + "dad736f60e319e91" + ] + ] + }, + { + "id": "e6bdb76d8afa8684", + "type": "function", + "z": "f83d0c6d58d0338c", + "name": "Set Logfile", + "func": "let tempo = flow.get(\"tempo\")\n\nmsg.recorderFile = `/var/www/html/logs/${tempo}.json`\n\nreturn msg;", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 710, + "y": 220, + "wires": [ + [ + "4a8dd2ec585b8b08", + "d467e586e80afacc" + ] + ] + }, + { + "id": "5eb1994652b0b429", + "type": "change", + "z": "f83d0c6d58d0338c", + "name": "", + "rules": [ + { + "t": "set", + "p": "messages", + "pt": "flow", + "to": "payload.messages", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 730, + "y": 140, + "wires": [ + [] + ] + }, + { + "id": "f5c0e9070d94faaa", + "type": "debug", + "z": "f83d0c6d58d0338c", + "name": "debug 25", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 640, + "y": 360, + "wires": [] + }, + { + "id": "dad736f60e319e91", + "type": "switch", + "z": "f83d0c6d58d0338c", + "name": "", + "property": "payload.messages", + "propertyType": "msg", + "rules": [ + { + "t": "gt", + "v": "messages", + "vt": "flow" + } + ], + "checkall": "true", + "repair": false, + "outputs": 1, + "x": 510, + "y": 220, + "wires": [ + [ + "e6bdb76d8afa8684", + "574f933135269f64", + "5eb1994652b0b429" + ] + ] + }, + { + "id": "574f933135269f64", + "type": "debug", + "z": "f83d0c6d58d0338c", + "name": "debug 26", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 520, + "y": 180, + "wires": [] + }, + { + "id": "503bc8cc58c93e82", + "type": "delay", + "z": "f83d0c6d58d0338c", + "name": "", + "pauseType": "delay", + "timeout": "5", + "timeoutUnits": "seconds", + "rate": "1", + "nbRateUnits": "1", + "rateUnits": "second", + "randomFirst": "1", + "randomLast": "5", + "randomUnits": "seconds", + "drop": false, + "allowrate": false, + "outputs": 1, + "x": 300, + "y": 140, + "wires": [ + [ + "5eb1994652b0b429" + ] + ] + }, + { + "id": "61c09a2c6f3c80a3", + "type": "inject", + "z": "f83d0c6d58d0338c", + "name": "", + "props": [ + { + "p": "payload" + }, + { + "p": "topic", + "vt": "str" + } + ], + "repeat": "", + "crontab": "", + "once": false, + "onceDelay": 0.1, + "topic": "", + "payload": "", + "payloadType": "date", + "x": 300, + "y": 580, + "wires": [ + [] + ] + }, + { + "id": "23cecfd9fe2ca333", + "type": "function", + "z": "f83d0c6d58d0338c", + "name": "Set HTML Payload", + "func": "const pl = msg.payload;\nconst record = flow.get(\"record\");\n\nif (record) { \n msg.payload = `Running`;\n msg.icon = \"fa-check\"\n msg.color = \"green\"\n} else {\n msg.payload = `Stopped`\n msg.icon = \"fa-times-circle\"\n msg.color = \"red\"\n}\n\nmsg.payload = ` ${msg.payload}`\n\nreturn msg;\n", + "outputs": 1, + "timeout": "", + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 490, + "y": 580, + "wires": [ + [ + "40e21166afb5b8b6", + "6f2f64ae56a63c02" + ] + ] + }, + { + "id": "40e21166afb5b8b6", + "type": "ui_text", + "z": "f83d0c6d58d0338c", + "group": "f9087e66bb4cd9b2", + "order": 1, + "width": 0, + "height": 0, + "name": "Recorder Status", + "label": "Recorder", + "format": "{{msg.payload}}", + "layout": "row-spread", + "className": "", + "style": true, + "font": "Arial Black,Arial Black,Gadget,sans-serif", + "fontSize": 16, + "color": "#000000", + "x": 660, + "y": 580, + "wires": [] + }, + { + "id": "6f2f64ae56a63c02", + "type": "debug", + "z": "f83d0c6d58d0338c", + "name": "debug 27", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 700, + "y": 500, + "wires": [] + }, + { + "id": "efa512ccb1363505", + "type": "ui_button", + "z": "f83d0c6d58d0338c", + "name": "Clear Recordings", + "group": "f9087e66bb4cd9b2", + "order": 3, + "width": 2, + "height": 1, + "passthru": true, + "label": "Clear", + "tooltip": "Deletes recorded aircraft data.", + "color": "white", + "bgcolor": "orange", + "className": "", + "icon": "report_problem", + "payload": "true", + "payloadType": "bool", + "topic": "topic", + "topicType": "msg", + "x": 290, + "y": 420, + "wires": [ + [ + "8e531d285fbd8d0c" + ] + ] + }, + { + "id": "8e531d285fbd8d0c", + "type": "exec", + "z": "f83d0c6d58d0338c", + "command": "rm /var/www/html/logs/*.json", + "addpay": "", + "append": "", + "useSpawn": "false", + "timer": "", + "winHide": false, + "oldrc": false, + "name": "", + "x": 520, + "y": 420, + "wires": [ + [], + [], + [] + ] + }, + { + "id": "229e4c198ef7face", + "type": "ui_upload", + "z": "23030b6ea0597f64", + "group": "27bb63a809345efc", + "title": "", + "accept": "", + "name": "Upload Update File", + "order": 1, + "width": 20, + "height": 5, + "chunk": "256", + "transfer": "binary", + "x": 270, + "y": 180, + "wires": [ + [ + "b429cfd28b62e327" + ] + ] + }, + { + "id": "b429cfd28b62e327", + "type": "file", + "z": "23030b6ea0597f64", + "name": "", + "filename": "update.deb", + "filenameType": "str", + "appendNewline": false, + "createDir": false, + "overwriteFile": "true", + "encoding": "none", + "x": 450, + "y": 180, + "wires": [ + [] + ] + }, + { + "id": "db6e39d922bbf958", + "type": "ui_button", + "z": "23030b6ea0597f64", + "name": "", + "group": "27bb63a809345efc", + "order": 3, + "width": 10, + "height": 2, + "passthru": false, + "label": "Install Update", + "tooltip": "", + "color": "white", + "bgcolor": "red", + "className": "", + "icon": "", + "payload": "", + "payloadType": "str", + "topic": "topic", + "topicType": "msg", + "x": 160, + "y": 380, + "wires": [ + [ + "a8c125a909b9b5fd" + ] + ] + }, + { + "id": "a8c125a909b9b5fd", + "type": "exec", + "z": "23030b6ea0597f64", + "command": "sudo /usr/bin/dpkg -i /home/node-red/update.deb", + "addpay": "", + "append": "", + "useSpawn": "false", + "timer": "", + "winHide": false, + "oldrc": false, + "name": "", + "x": 470, + "y": 380, + "wires": [ + [ + "71da818d8a38bd27" + ], + [ + "25ef05fa4774108a" + ], + [ + "e11b2f05dab0b45d" + ] + ] + }, + { + "id": "71da818d8a38bd27", + "type": "ui_template", + "z": "23030b6ea0597f64", + "group": "27bb63a809345efc", + "name": "Update stdout", + "order": 5, + "width": 20, + "height": 5, + "format": "