From 279351b9528751d9e9153409b8053468a9527453 Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Fri, 20 Jan 2023 18:36:57 -0600 Subject: [PATCH 01/22] v1.2.21 Make both graphs UTC time. --- flow.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flow.json b/flow.json index 5a8d0f9..7e26f31 100644 --- a/flow.json +++ b/flow.json @@ -10043,7 +10043,7 @@ "removeOlderUnit": "3600", "cutout": 0, "useOneColor": false, - "useUTC": false, + "useUTC": true, "colors": [ "#1f77b4", "#aec7e8", diff --git a/package.json b/package.json index fc998d0..26870b2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "n1mm_dashboard", "description": "Dashboard for N1MM Contesting", - "version": "1.2.20", + "version": "1.2.21", "dependencies": { "node-red-contrib-hourglass": "1.5.0", "node-red-contrib-msg-speed": "2.1.0", From 212532ff21917dd4e085629d784c58d4df86c39d Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sun, 22 Jan 2023 08:24:46 -0600 Subject: [PATCH 02/22] v1.3.0 Dashboard Radio Option resolves #40 --- flow.json | 255 ++++++++++++++++++++++++++++++++++++++++++--------- package.json | 4 +- 2 files changed, 216 insertions(+), 43 deletions(-) diff --git a/flow.json b/flow.json index 7e26f31..24b4dfb 100644 --- a/flow.json +++ b/flow.json @@ -1025,7 +1025,9 @@ "d37ea6046424b974", "89588cb6bf69a8d0", "d9503f18f29524db", - "27f4e52f97117294" + "27f4e52f97117294", + "b660ee693411d757", + "0ca8c50b9058010c" ], "x": 1074, "y": 1979, @@ -1060,13 +1062,15 @@ "b946bc8caa8d1dfa", "323b33d53e2baade", "b9e129bdae4de517", - "b1abd7f75fd32f6f", "5bbc72a4e604df32", "e4e19daf40493fb9", "3d1ebae60e058858", "572d2215a6ea16bb", "5a5a85080d107e92", - "0baeb2e7ae556661" + "0baeb2e7ae556661", + "ab3f6963df6eaf43", + "cfe25ee37e99db50", + "bcc4223e74a54492" ], "x": 1014, "y": 1511.5, @@ -7387,15 +7391,15 @@ "type": "template", "z": "407d2b774fe67647", "g": "94f44b7ea0e29d1d", - "name": "SQL Select Rate", + "name": "SQL Select Rate Radio", "field": "topic", "fieldType": "msg", "format": "handlebars", "syntax": "mustache", "template": "select count(call) as rate from qsos where StationName='{{{payload.RadioInfo.StationName}}}' and timestamp >= datetime('now','-1 hours');", "output": "str", - "x": 1410, - "y": 2380, + "x": 1510, + "y": 2360, "wires": [ [ "97aba946591c7289" @@ -7411,7 +7415,7 @@ "sqlquery": "msg.topic", "sql": "", "name": "QSO Database", - "x": 1620, + "x": 1740, "y": 2380, "wires": [ [ @@ -7429,11 +7433,11 @@ "width": 3, "height": 2, "name": "Radio 2 QSO Rate", - "label": "Q's/Hr", + "label": "{{msg.choice}} Q's/Hr", "format": "{{msg.rate}}", "layout": "col-center", "className": "", - "x": 2230, + "x": 2350, "y": 2380, "wires": [] }, @@ -7547,11 +7551,11 @@ "drop": true, "allowrate": false, "outputs": 1, - "x": 1180, + "x": 1040, "y": 2380, "wires": [ [ - "89588cb6bf69a8d0" + "0ca8c50b9058010c" ] ] }, @@ -7561,7 +7565,7 @@ "z": "407d2b774fe67647", "g": "94f44b7ea0e29d1d", "name": "", - "x": 1980, + "x": 2100, "y": 2380, "wires": [ [ @@ -7595,7 +7599,7 @@ "from": "", "to": "", "reg": false, - "x": 1790, + "x": 1910, "y": 2380, "wires": [ [ @@ -9483,26 +9487,6 @@ ] ] }, - { - "id": "b1abd7f75fd32f6f", - "type": "template", - "z": "407d2b774fe67647", - "g": "a9afc3cb2db49407", - "name": "SQL Select Rate", - "field": "topic", - "fieldType": "msg", - "format": "handlebars", - "syntax": "mustache", - "template": "select count(call) as rate from qsos where StationName='{{{payload.RadioInfo.StationName}}}' and timestamp >= datetime('now','-1 hours');", - "output": "str", - "x": 1370, - "y": 1560, - "wires": [ - [ - "3d1ebae60e058858" - ] - ] - }, { "id": "5bbc72a4e604df32", "type": "delay", @@ -9524,9 +9508,7 @@ "x": 1120, "y": 1560, "wires": [ - [ - "b1abd7f75fd32f6f" - ] + [] ] }, { @@ -9556,7 +9538,7 @@ "sqlquery": "msg.topic", "sql": "", "name": "QSO Database", - "x": 1600, + "x": 1820, "y": 1560, "wires": [ [ @@ -9584,7 +9566,7 @@ "from": "", "to": "", "reg": false, - "x": 1810, + "x": 2010, "y": 1560, "wires": [ [ @@ -9598,7 +9580,7 @@ "z": "407d2b774fe67647", "g": "a9afc3cb2db49407", "name": "", - "x": 1980, + "x": 2180, "y": 1560, "wires": [ [ @@ -9626,7 +9608,7 @@ "format": "{{msg.rate}}", "layout": "col-center", "className": "", - "x": 2290, + "x": 2450, "y": 1560, "wires": [] }, @@ -10947,6 +10929,120 @@ ] ] }, + { + "id": "b660ee693411d757", + "type": "template", + "z": "407d2b774fe67647", + "g": "94f44b7ea0e29d1d", + "name": "SQL Select Rate OP", + "field": "topic", + "fieldType": "msg", + "format": "handlebars", + "syntax": "mustache", + "template": "select count(operator) as rate from qsos where operator='{{payload.RadioInfo.OpCall}}' and timestamp >= datetime('now','-1 hours');", + "output": "str", + "x": 1500, + "y": 2400, + "wires": [ + [ + "97aba946591c7289" + ] + ] + }, + { + "id": "0ca8c50b9058010c", + "type": "function", + "z": "407d2b774fe67647", + "g": "94f44b7ea0e29d1d", + "name": "Dashboard Rate Choice", + "func": "let dashboardqrate=global.get(\"dashboardqrate\");\n\nif (dashboardqrate == \"radio\"){\nmsg.choice=\"Radio\";\nreturn [msg,null]\n}\nelse if (dashboardqrate == \"op\"){\nmsg.choice=\"Operator\";\nreturn [null,msg]\n}\n", + "outputs": 2, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 1250, + "y": 2380, + "wires": [ + [ + "89588cb6bf69a8d0" + ], + [ + "b660ee693411d757" + ] + ], + "outputLabels": [ + "Radio", + "Operator" + ] + }, + { + "id": "cfe25ee37e99db50", + "type": "function", + "z": "407d2b774fe67647", + "g": "a9afc3cb2db49407", + "name": "Dashboard Rate Choice", + "func": "let dashboardqrate=global.get(\"dashboardqrate\");\n\nif (dashboardqrate == \"radio\"){\nmsg.choice=\"Radio\";\nreturn [msg,null]\n}\nelse if (dashboardqrate == \"op\"){\nmsg.choice=\"Operator\";\nreturn [null,msg]\n}\n", + "outputs": 2, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 1330, + "y": 1560, + "wires": [ + [ + "ab3f6963df6eaf43" + ], + [ + "bcc4223e74a54492" + ] + ], + "outputLabels": [ + "Radio", + "Operator" + ] + }, + { + "id": "ab3f6963df6eaf43", + "type": "template", + "z": "407d2b774fe67647", + "g": "a9afc3cb2db49407", + "name": "SQL Select Rate Radio", + "field": "topic", + "fieldType": "msg", + "format": "handlebars", + "syntax": "mustache", + "template": "select count(call) as rate from qsos where StationName='{{{payload.RadioInfo.StationName}}}' and timestamp >= datetime('now','-1 hours');", + "output": "str", + "x": 1570, + "y": 1540, + "wires": [ + [ + "3d1ebae60e058858" + ] + ] + }, + { + "id": "bcc4223e74a54492", + "type": "template", + "z": "407d2b774fe67647", + "g": "a9afc3cb2db49407", + "name": "SQL Select Rate OP", + "field": "topic", + "fieldType": "msg", + "format": "handlebars", + "syntax": "mustache", + "template": "select count(operator) as rate from qsos where operator='{{payload.RadioInfo.OpCall}}' and timestamp >= datetime('now','-1 hours');", + "output": "str", + "x": 1560, + "y": 1580, + "wires": [ + [ + "3d1ebae60e058858" + ] + ] + }, { "id": "8da88eb5e82e503d", "type": "link in", @@ -30688,7 +30784,8 @@ "y": 2500, "wires": [ [ - "55b371fcdda16d59" + "55b371fcdda16d59", + "b75f7c1d9016de43" ] ] }, @@ -30890,6 +30987,82 @@ ] ] }, + { + "id": "4b6949f18173593d", + "type": "function", + "z": "204548a488401a1b", + "name": "Store DashboardQRate", + "func": "let dashboardqrate = msg.payload;\n\nglobal.set('dashboardqrate',dashboardqrate);\n\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 2130, + "y": 2600, + "wires": [ + [ + "b75f7c1d9016de43" + ] + ] + }, + { + "id": "0837ad45ed24fb8c", + "type": "ui_dropdown", + "z": "204548a488401a1b", + "name": "Dashboard Hourly QSO Rate", + "label": "Dashboard Rate Option", + "tooltip": "Choose which value that you would like to choose for the Radio Values on the dashboard.", + "place": "Select Rate", + "group": "475c1eff5d97ffe5", + "order": 4, + "width": 6, + "height": 1, + "passthru": false, + "multiple": false, + "options": [ + { + "label": "Radio", + "value": "radio", + "type": "str" + }, + { + "label": "Operator", + "value": "op", + "type": "str" + } + ], + "payload": "", + "topic": "Hourly QSO Rate", + "topicType": "str", + "className": "", + "x": 1880, + "y": 2600, + "wires": [ + [ + "4b6949f18173593d" + ] + ] + }, + { + "id": "b75f7c1d9016de43", + "type": "function", + "z": "204548a488401a1b", + "name": "Get DashboardQRate", + "func": "msg.payload = global.get('dashboardqrate');\n\nif (msg.payload == undefined)\n{\n msg.payload = \"radio\";\n return msg;\n}\n\n\nreturn msg;\n", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 1640, + "y": 2600, + "wires": [ + [ + "0837ad45ed24fb8c" + ] + ] + }, { "id": "135549f560738315", "type": "link out", diff --git a/package.json b/package.json index 26870b2..13983a7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "n1mm_dashboard", "description": "Dashboard for N1MM Contesting", - "version": "1.2.21", + "version": "1.3.0", "dependencies": { "node-red-contrib-hourglass": "1.5.0", "node-red-contrib-msg-speed": "2.1.0", @@ -25,4 +25,4 @@ "credentialsFile": "flow_cred.json" } } -} \ No newline at end of file +} From 0048272f89fd0b380b788a9fd59543d69170395a Mon Sep 17 00:00:00 2001 From: Ron Rossi <73606166+KK1L@users.noreply.github.com> Date: Mon, 23 Jan 2023 21:17:53 -0500 Subject: [PATCH 03/22] v1.4.0 Improvements to Pi Status Tab * improved solar data image on Pi. * added choice of C or F for CPU Temperature. Fixes #50 Co-authored-by: kd9lsv --- flow.json | 397 ++++++++++++++++++++++++++++++++++++++++++++------- package.json | 2 +- 2 files changed, 345 insertions(+), 54 deletions(-) diff --git a/flow.json b/flow.json index 24b4dfb..fb6d573 100644 --- a/flow.json +++ b/flow.json @@ -396,7 +396,9 @@ "ab98427.85cd3c" ], "x": 474, - "y": 159 + "y": 159, + "w": 272, + "h": 522 }, { "id": "52886121c9629e0b", @@ -420,7 +422,9 @@ "66a43145427ca537" ], "x": 774, - "y": 159 + "y": 159, + "w": 252, + "h": 482 }, { "id": "bebfe5d7e4f0feb0", @@ -444,7 +448,9 @@ "de48727be275102f" ], "x": 1034, - "y": 159 + "y": 159, + "w": 315, + "h": 482 }, { "id": "c6e09ffb3c5a1ce6", @@ -470,7 +476,9 @@ "e1278f8b2f6fee61" ], "x": 214, - "y": 159 + "y": 159, + "w": 242, + "h": 522 }, { "id": "0e3bf66f6ee6d572", @@ -485,7 +493,9 @@ "654b552f9e64203e" ], "x": 214, - "y": 19 + "y": 19, + "w": 252, + "h": 122 }, { "id": "b90980234a451f8d", @@ -500,7 +510,9 @@ "3047a9ba16e10212" ], "x": 1194, - "y": 39 + "y": 39, + "w": 272, + "h": 82 }, { "id": "23eb39063da69706", @@ -524,7 +536,9 @@ "c2d7711a7d230637" ], "x": 1374, - "y": 159 + "y": 159, + "w": 252, + "h": 482 }, { "id": "022672368830e427", @@ -548,7 +562,9 @@ "c4561e5c31134c5d" ], "x": 1654, - "y": 159 + "y": 159, + "w": 252, + "h": 482 }, { "id": "7a5512b5a3f6e8ba", @@ -585,7 +601,9 @@ "4b7abadd74993948" ], "x": -6, - "y": 679 + "y": 679, + "w": 2072, + "h": 302 }, { "id": "28877ac600fea8b9", @@ -610,7 +628,9 @@ "324101084f63a83e" ], "x": 224, - "y": 1019 + "y": 1019, + "w": 632, + "h": 262 }, { "id": "c6a5789101548ba9", @@ -625,7 +645,9 @@ "4e62658f095c2863" ], "x": 1394, - "y": 1099 + "y": 1099, + "w": 252, + "h": 122 }, { "id": "18a3020b4a12ae60", @@ -649,7 +671,9 @@ "89b2058720d8fb99" ], "x": 1954, - "y": 159 + "y": 159, + "w": 282, + "h": 482 }, { "id": "4f4b9f0c82968b60", @@ -812,7 +836,9 @@ "925cebb6bacad025" ], "x": 914, - "y": 999 + "y": 999, + "w": 632, + "h": 82 }, { "id": "f01baabf4527b6e5", @@ -1366,12 +1392,13 @@ { "id": "dea9d7ac.0cefc8", "type": "ui_group", - "name": "Raspberry Pi Status & Control", + "name": "Pi Server Status & Control", "tab": "7f50838.c6d257c", "order": 2, "disp": true, "width": "6", - "collapse": false + "collapse": false, + "className": "" }, { "id": "8ca85278.65932", @@ -1683,7 +1710,7 @@ "tab": "7f50838.c6d257c", "order": 3, "disp": true, - "width": 5, + "width": "8", "collapse": false, "className": "" }, @@ -2103,11 +2130,11 @@ { "id": "00919f6d1599ed5f", "type": "ui_group", - "name": "Distance Measurement", + "name": "Measurement Units", "tab": "08eed6c3517c624e", "order": 14, "disp": true, - "width": 6, + "width": "6", "collapse": false, "className": "config" }, @@ -23864,7 +23891,9 @@ "y": 320, "wires": [ [ - "f042fa28.8f2bf8" + "f042fa28.8f2bf8", + "eb799ba44460adec", + "c0218de0f81a3892" ] ] }, @@ -24232,8 +24261,8 @@ "width": 3, "height": 3, "gtype": "gage", - "title": "CPU Temperature", - "label": "F", + "title": "CPU Temp", + "label": "{{msg.label}}", "format": "{{value}}", "min": 0, "max": "170", @@ -24242,10 +24271,11 @@ "#e6e600", "#ca3838" ], - "seg1": "125", - "seg2": "150", - "x": 1170, - "y": 280, + "seg1": "", + "seg2": "", + "className": "", + "x": 1510, + "y": 320, "wires": [] }, { @@ -24258,7 +24288,7 @@ "width": 3, "height": 3, "gtype": "gage", - "title": "CPU", + "title": "CPU Load", "label": "%", "format": "{{value}}", "min": 0, @@ -24270,8 +24300,9 @@ ], "seg1": "", "seg2": "", - "x": 809.8888931274414, - "y": 387.77777767181396, + "className": "", + "x": 710, + "y": 400, "wires": [] }, { @@ -24363,8 +24394,8 @@ ], "outputs": 1, "useDifferentColor": false, - "x": 1190, - "y": 320, + "x": 1530, + "y": 360, "wires": [ [] ] @@ -24382,13 +24413,13 @@ "outputFieldType": "msg", "roundOutputField": true, "outputFieldDecimals": "1", - "name": "", - "x": 920, - "y": 320, + "statusType": "none", + "name": "C to F", + "x": 1150, + "y": 280, "wires": [ [ - "3d67dce5.112054", - "cd3f0873.755ee8" + "c57859fc4cb050a7" ] ] }, @@ -24445,9 +24476,9 @@ "group": "4c7c4383a5f4d36f", "name": "Solar Data", "order": 1, - "width": 5, - "height": 15, - "format": "\n\n\n
\n \n \n \n \n \n \t\t\t\n \n \n \n \t\t\t\n \n \n \t\t\t\n \n \n \n \n \t\t\t\n \n \n \t\t\t\n \n \n \n \n \t\t\t\n \n \n \t\t\n \n \n \n \n \n \n \t\t\t\n \n \n \t\t\t\n \n \n \n \n \t\t\t\n \n \n \n \n \t\t\t\n \n \n \n \t\t\t\n \t\t\t\n \n \t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\n \t\t\n \t\t\t\n \t\t\t\n \n \n \n \t\t\n \t\t\t\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \t\t\n \n \n \n \n \n \n \t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \n \n \t\t\n \n \n
Solar-Terrestrial Data provided by N0NBH
{{msg.payload.solardata.updated[0]}}
SFI:{{msg.payload.solardata.solarflux[0]}}SN:{{msg.payload.solardata.sunspots[0]}}
A-Index:{{msg.payload.solardata.aindex[0]}}K-Index:{{msg.payload.solardata.kindex[0]}}
X-Ray:{{msg.payload.solardata.xray[0]}}
304A:{{msg.payload.solardata.heliumline[0]}} @ SEM
Ptn Flx:{{msg.payload.solardata.protonflux[0]}}Elc Flx:{{msg.payload.solardata.electonflux[0]}}
Auroa: {{msg.payload.solardata.aurora[0]}} / n={{msg.payload.solardata.normalization[0]}}
Bz:{{msg.payload.solardata.magneticfield[0]}}SW:{{msg.payload.solardata.solarwind[0]}}
HF Conditions
BandDayNight
80m-40m{{msg.payload.solardata.calculatedconditions[0].band[0]._}}{{msg.payload.solardata.calculatedconditions[0].band[4]._}}
30m-20m{{msg.payload.solardata.calculatedconditions[0].band[1]._}}{{msg.payload.solardata.calculatedconditions[0].band[5]._}}
17m-15m{{msg.payload.solardata.calculatedconditions[0].band[2]._}}{{msg.payload.solardata.calculatedconditions[0].band[6]._}}
12m-10m{{msg.payload.solardata.calculatedconditions[0].band[3]._}}{{msg.payload.solardata.calculatedconditions[0].band[7]._}}
VHF Conditions
Aur Lat{{msg.payload.solardata.latdegree[0]}}°
Aurora{{msg.payload.solardata.calculatedvhfconditions[0].phenomenon[0]._}}
6m EsEU{{msg.payload.solardata.calculatedvhfconditions[0].phenomenon[3]._}}
4m EsEU{{msg.payload.solardata.calculatedvhfconditions[0].phenomenon[4]._}}
2m EsEU{{msg.payload.solardata.calculatedvhfconditions[0].phenomenon[1]._}}
2m EsNA{{msg.payload.solardata.calculatedvhfconditions[0].phenomenon[2]._}}
EME Deg\n \t\t\t\t\n \t\t\t\t\t
\n \t\t\t\t
\n \t\t\t
Solar Flare Prb\n \t\t\t\t\n \t\t\t\t\t
\n \t\t\t\t
\n \t\t\t
MUF
MS
\n \t\t\t\t
\n \t\t\t
Geomag Field{{msg.payload.solardata.geomagfield[0]}}
Sig Noise Lvl{{msg.payload.solardata.signalnoise[0]}}
MUF US Boulder{{msg.payload.solardata.muf[0]}}
{{msg.payload.solardata.source[0].$.url}}
© Copyright Paul L Herrman
\n
\n\n", + "width": 0, + "height": 0, + "format": "\n\n\n
\n \n \n \n \n \n \t\t\t\n \n \n \n \t\t\t\n \n \n \t\t\t\n \n \n \n \n \t\t\t\n \n \n \t\t\t\n \n \n \n \n \t\t\t\n \n \n \t\t\n \n \n \n \n \n \n \t\t\t\n \n \n \t\t\t\n \n \n \n \n \t\t\t\n \n \n \n \n \t\t\t\n \n \n \n \t\t\t\n \t\t\t\n \n \t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\n \t\t\n \t\t\t\n \t\t\t\n \n \n \n \t\t\n \t\t\t\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \t\t\n \n \n \n \n \n \n \t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t \n \t\t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \t\t\n \t\t\n \t\t\t\n \n \n \t\t\n \n \n
Solar-Terrestrial Data provided by N0NBH
{{msg.payload.solardata.updated[0]}}
SFI:{{msg.payload.solardata.solarflux[0]}}SN:{{msg.payload.solardata.sunspots[0]}}
A-Index:{{msg.payload.solardata.aindex[0]}}K-Index:{{msg.payload.solardata.kindex[0]}}
X-Ray:{{msg.payload.solardata.xray[0]}}
304A:{{msg.payload.solardata.heliumline[0]}} @ SEM
Ptn Flx:{{msg.payload.solardata.protonflux[0]}}Elc Flx:{{msg.payload.solardata.electonflux[0]}}
Auroa: {{msg.payload.solardata.aurora[0]}} / n={{msg.payload.solardata.normalization[0]}}
Bz:{{msg.payload.solardata.magneticfield[0]}}SW:{{msg.payload.solardata.solarwind[0]}}
HF Conditions
BandDayNight
80m-40m{{msg.payload.solardata.calculatedconditions[0].band[0]._}}{{msg.payload.solardata.calculatedconditions[0].band[4]._}}
30m-20m{{msg.payload.solardata.calculatedconditions[0].band[1]._}}{{msg.payload.solardata.calculatedconditions[0].band[5]._}}
17m-15m{{msg.payload.solardata.calculatedconditions[0].band[2]._}}{{msg.payload.solardata.calculatedconditions[0].band[6]._}}
12m-10m{{msg.payload.solardata.calculatedconditions[0].band[3]._}}{{msg.payload.solardata.calculatedconditions[0].band[7]._}}
VHF Conditions
Aur Lat{{msg.payload.solardata.latdegree[0]}}°
Aurora{{msg.payload.solardata.calculatedvhfconditions[0].phenomenon[0]._}}
6m EsEU{{msg.payload.solardata.calculatedvhfconditions[0].phenomenon[3]._}}
4m EsEU{{msg.payload.solardata.calculatedvhfconditions[0].phenomenon[4]._}}
2m EsEU{{msg.payload.solardata.calculatedvhfconditions[0].phenomenon[1]._}}
2m EsNA{{msg.payload.solardata.calculatedvhfconditions[0].phenomenon[2]._}}
EME Deg\n \t\t\t\t\n \t\t\t\t\t
\n \t\t\t\t
\n \t\t\t
Solar Flare Prb\n \t\t\t\t\n \t\t\t\t\t
\n \t\t\t\t
\n \t\t\t
MUF
MS
\n \t\t\t\t
\n \t\t\t
Geomag Field{{msg.payload.solardata.geomagfield[0]}}
Sig Noise Lvl{{msg.payload.solardata.signalnoise[0]}}
MUF US Boulder{{msg.payload.solardata.muf[0]}}
{{msg.payload.solardata.source[0].$.url}}
© Copyright Paul L Herrman
\n
\n\n", "storeOutMessages": true, "fwdInMessages": true, "resendOnRefresh": true, @@ -24769,6 +24800,179 @@ ] ] }, + { + "id": "c57859fc4cb050a7", + "type": "switch", + "z": "db5600520bb7f279", + "name": "If Fahrenheit", + "property": "temperature_unit", + "propertyType": "global", + "rules": [ + { + "t": "eq", + "v": "F", + "vt": "str" + } + ], + "checkall": "true", + "repair": false, + "outputs": 1, + "x": 1290, + "y": 280, + "wires": [ + [ + "3d67dce5.112054", + "cd3f0873.755ee8" + ] + ] + }, + { + "id": "eb799ba44460adec", + "type": "switch", + "z": "db5600520bb7f279", + "name": "If Celsius", + "property": "temperature_unit", + "propertyType": "global", + "rules": [ + { + "t": "eq", + "v": "C", + "vt": "str" + } + ], + "checkall": "true", + "repair": false, + "outputs": 1, + "x": 1300, + "y": 320, + "wires": [ + [ + "3d67dce5.112054", + "cd3f0873.755ee8" + ] + ] + }, + { + "id": "b89a084234eca9ef", + "type": "inject", + "z": "db5600520bb7f279", + "name": "Every 5 secs", + "props": [ + { + "p": "payload" + } + ], + "repeat": "5", + "crontab": "", + "once": true, + "onceDelay": "", + "topic": "", + "payload": "temperature_unit", + "payloadType": "global", + "x": 860, + "y": 360, + "wires": [ + [ + "cd4b0989a632cb00" + ] + ] + }, + { + "id": "cd4b0989a632cb00", + "type": "rbe", + "z": "db5600520bb7f279", + "name": "if temperature_unit change", + "func": "rbe", + "gap": "", + "start": "", + "inout": "out", + "septopics": true, + "property": "payload", + "topi": "topic", + "x": 1080, + "y": 360, + "wires": [ + [ + "7427d9d83b6e6357" + ] + ] + }, + { + "id": "7427d9d83b6e6357", + "type": "change", + "z": "db5600520bb7f279", + "name": "Clear Chart", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "[]", + "tot": "json" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 1290, + "y": 360, + "wires": [ + [ + "cd3f0873.755ee8" + ] + ] + }, + { + "id": "c0218de0f81a3892", + "type": "change", + "z": "db5600520bb7f279", + "name": "Set Gauge Display Values", + "rules": [ + { + "t": "set", + "p": "label", + "pt": "msg", + "to": "temperature_unit", + "tot": "global", + "dc": true + }, + { + "t": "set", + "p": "ui_control.seg1", + "pt": "msg", + "to": "temperature_yellow", + "tot": "global" + }, + { + "t": "set", + "p": "ui_control.seg2", + "pt": "msg", + "to": "temperature_red", + "tot": "global" + }, + { + "t": "set", + "p": "ui_control.max", + "pt": "msg", + "to": "temperature_max", + "tot": "global" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 1250, + "y": 240, + "wires": [ + [ + "3d67dce5.112054" + ] + ] + }, { "id": "1e5d975d4f33a469", "type": "udp in", @@ -26915,7 +27119,7 @@ "topicType": "msg", "className": "", "x": 1930, - "y": 1020, + "y": 1120, "wires": [ [ "086b1f9232b45a14" @@ -26942,7 +27146,7 @@ "to": "", "reg": false, "x": 2180, - "y": 1020, + "y": 1120, "wires": [ [ "b6c621827fb49298" @@ -26976,7 +27180,7 @@ "name": "Database Lookup Engine Select", "info": "", "x": 1530, - "y": 960, + "y": 1060, "wires": [] }, { @@ -28830,10 +29034,10 @@ "id": "48f5678a75ee7dd8", "type": "ui_dropdown", "z": "204548a488401a1b", - "name": "Distance Measurement", - "label": "Units", + "name": "Disrtance Unit", + "label": "Distance", "tooltip": "", - "place": "Select option", + "place": "Select distance unit", "group": "00919f6d1599ed5f", "order": 1, "width": 6, @@ -28856,7 +29060,7 @@ "topic": "topic", "topicType": "msg", "className": "", - "x": 1850, + "x": 1820, "y": 860, "wires": [ [ @@ -28875,7 +29079,7 @@ "initialize": "", "finalize": "", "libs": [], - "x": 2120, + "x": 2060, "y": 860, "wires": [ [ @@ -28981,7 +29185,7 @@ "finalize": "", "libs": [], "x": 1670, - "y": 1020, + "y": 1120, "wires": [ [ "e35dbee7a81b43bc" @@ -28995,7 +29199,7 @@ "name": "Multi OP or S02R Operation", "info": "", "x": 1500, - "y": 1140, + "y": 1240, "wires": [] }, { @@ -29010,7 +29214,7 @@ "finalize": "", "libs": [], "x": 1640, - "y": 1080, + "y": 1180, "wires": [ [ "63f29cb1261063bf" @@ -29053,7 +29257,7 @@ "topicType": "msg", "className": "", "x": 1920, - "y": 1080, + "y": 1180, "wires": [ [ "7d0c7ffca7a6660e" @@ -29080,7 +29284,7 @@ "to": "", "reg": false, "x": 2170, - "y": 1080, + "y": 1180, "wires": [ [ "e0849adea5ad6c37" @@ -30748,7 +30952,8 @@ "ad4c547076b09ade", "543c8ffcfaaf7701", "1dfb81dda6b742b3", - "5eb3915f925752d7" + "5eb3915f925752d7", + "4cc7aa20c7555c0d" ] ] }, @@ -30798,7 +31003,7 @@ "3047a9ba16e10212" ], "x": 1445, - "y": 1060, + "y": 1160, "wires": [ [ "b6c621827fb49298", @@ -31090,6 +31295,92 @@ "y": 2860, "wires": [] }, + { + "id": "da26fb516364abdb", + "type": "ui_dropdown", + "z": "204548a488401a1b", + "name": "Temperature Unit", + "label": "Temperature", + "tooltip": "", + "place": "", + "group": "00919f6d1599ed5f", + "order": 1, + "width": 6, + "height": 1, + "passthru": true, + "multiple": false, + "options": [ + { + "label": "Fahrenheit", + "value": "F", + "type": "str" + }, + { + "label": "Celsius", + "value": "C", + "type": "str" + } + ], + "payload": "", + "topic": "topic", + "topicType": "msg", + "className": "", + "x": 1790, + "y": 960, + "wires": [ + [ + "cd712885f68288ef" + ] + ] + }, + { + "id": "cd712885f68288ef", + "type": "function", + "z": "204548a488401a1b", + "name": "Set Temperature Unit", + "func": "let x = msg.payload\nglobal.set('temperature_unit', x)\nif (x == 'F') {\n global.set('temperature_yellow', 105)\n global.set('temperature_red', 140)\n global.set('temperature_max', 195)\n}\nelse {\n global.set('temperature_yellow', 40)\n global.set('temperature_red', 60)\n global.set('temperature_max', 90)\n}\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 2020, + "y": 960, + "wires": [ + [ + "4cc7aa20c7555c0d" + ] + ] + }, + { + "id": "1f7dccce6055a5b2", + "type": "comment", + "z": "204548a488401a1b", + "name": "Temperature Unit", + "info": "", + "x": 1520, + "y": 920, + "wires": [] + }, + { + "id": "4cc7aa20c7555c0d", + "type": "function", + "z": "204548a488401a1b", + "name": "Get Temperature Unit", + "func": "", + "outputs": 1, + "noerr": 0, + "initialize": "// Code added here will be run once\n// whenever the node is started.\nlet x = global.get('temperature_unit')\nif (x == 'F') \n{\n msg.payload = 'F';\n}\nelse \n{\n msg.payload = 'C'\n}\nreturn msg;", + "finalize": "", + "libs": [], + "x": 1560, + "y": 960, + "wires": [ + [ + "da26fb516364abdb" + ] + ] + }, { "id": "b8502660ecb5eb37", "type": "inject", diff --git a/package.json b/package.json index 13983a7..86541e4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "n1mm_dashboard", "description": "Dashboard for N1MM Contesting", - "version": "1.3.0", + "version": "1.4.0", "dependencies": { "node-red-contrib-hourglass": "1.5.0", "node-red-contrib-msg-speed": "2.1.0", From 5ad3a088bf93f9a7357d4506aeb3eee1cf9dd3ab Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sat, 15 Apr 2023 21:46:04 -0500 Subject: [PATCH 04/22] v1.4.1 Fix #45 with reupdate COSB active. --- flow.json | 71 ++++++++++++++++------------------------------------ package.json | 4 +-- 2 files changed, 24 insertions(+), 51 deletions(-) diff --git a/flow.json b/flow.json index fb6d573..1b00e52 100644 --- a/flow.json +++ b/flow.json @@ -396,9 +396,7 @@ "ab98427.85cd3c" ], "x": 474, - "y": 159, - "w": 272, - "h": 522 + "y": 159 }, { "id": "52886121c9629e0b", @@ -422,9 +420,7 @@ "66a43145427ca537" ], "x": 774, - "y": 159, - "w": 252, - "h": 482 + "y": 159 }, { "id": "bebfe5d7e4f0feb0", @@ -448,9 +444,7 @@ "de48727be275102f" ], "x": 1034, - "y": 159, - "w": 315, - "h": 482 + "y": 159 }, { "id": "c6e09ffb3c5a1ce6", @@ -476,9 +470,7 @@ "e1278f8b2f6fee61" ], "x": 214, - "y": 159, - "w": 242, - "h": 522 + "y": 159 }, { "id": "0e3bf66f6ee6d572", @@ -493,9 +485,7 @@ "654b552f9e64203e" ], "x": 214, - "y": 19, - "w": 252, - "h": 122 + "y": 19 }, { "id": "b90980234a451f8d", @@ -510,9 +500,7 @@ "3047a9ba16e10212" ], "x": 1194, - "y": 39, - "w": 272, - "h": 82 + "y": 39 }, { "id": "23eb39063da69706", @@ -536,9 +524,7 @@ "c2d7711a7d230637" ], "x": 1374, - "y": 159, - "w": 252, - "h": 482 + "y": 159 }, { "id": "022672368830e427", @@ -562,9 +548,7 @@ "c4561e5c31134c5d" ], "x": 1654, - "y": 159, - "w": 252, - "h": 482 + "y": 159 }, { "id": "7a5512b5a3f6e8ba", @@ -601,9 +585,7 @@ "4b7abadd74993948" ], "x": -6, - "y": 679, - "w": 2072, - "h": 302 + "y": 679 }, { "id": "28877ac600fea8b9", @@ -628,9 +610,7 @@ "324101084f63a83e" ], "x": 224, - "y": 1019, - "w": 632, - "h": 262 + "y": 1019 }, { "id": "c6a5789101548ba9", @@ -645,9 +625,7 @@ "4e62658f095c2863" ], "x": 1394, - "y": 1099, - "w": 252, - "h": 122 + "y": 1099 }, { "id": "18a3020b4a12ae60", @@ -671,9 +649,7 @@ "89b2058720d8fb99" ], "x": 1954, - "y": 159, - "w": 282, - "h": 482 + "y": 159 }, { "id": "4f4b9f0c82968b60", @@ -756,9 +732,9 @@ "df61b921bf703bd8" ], "x": 14, - "y": 1485.5, - "w": 2458, - "h": 969 + "y": 1473, + "w": 2618, + "h": 994 }, { "id": "d48758cdf0c8991d", @@ -836,9 +812,7 @@ "925cebb6bacad025" ], "x": 914, - "y": 999, - "w": 632, - "h": 82 + "y": 999 }, { "id": "f01baabf4527b6e5", @@ -1055,10 +1029,10 @@ "b660ee693411d757", "0ca8c50b9058010c" ], - "x": 1074, + "x": 934, "y": 1979, - "w": 1272, - "h": 449.5 + "w": 1532, + "h": 462 }, { "id": "a9afc3cb2db49407", @@ -1099,9 +1073,9 @@ "bcc4223e74a54492" ], "x": 1014, - "y": 1511.5, - "w": 1432, - "h": 449.5 + "y": 1499, + "w": 1592, + "h": 462 }, { "id": "b8ba38b3.abfb98", @@ -34268,7 +34242,6 @@ "id": "24a259a2ccec0aa3", "type": "http request", "z": "2eedd966294071cc", - "d": true, "name": "", "method": "GET", "ret": "obj", diff --git a/package.json b/package.json index 86541e4..5fb6cc9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "n1mm_dashboard", "description": "Dashboard for N1MM Contesting", - "version": "1.4.0", + "version": "1.4.1", "dependencies": { "node-red-contrib-hourglass": "1.5.0", "node-red-contrib-msg-speed": "2.1.0", @@ -25,4 +25,4 @@ "credentialsFile": "flow_cred.json" } } -} +} \ No newline at end of file From f1d93c098519f3690b9108b57314b40e44c5edcb Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sun, 16 Apr 2023 16:41:48 -0500 Subject: [PATCH 05/22] v1.4.2 Fix #52 UI form button --- flow.json | 110 ++++++++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 57 insertions(+), 55 deletions(-) diff --git a/flow.json b/flow.json index 1b00e52..3b2a9ec 100644 --- a/flow.json +++ b/flow.json @@ -396,7 +396,9 @@ "ab98427.85cd3c" ], "x": 474, - "y": 159 + "y": 159, + "w": 272, + "h": 522 }, { "id": "52886121c9629e0b", @@ -420,7 +422,9 @@ "66a43145427ca537" ], "x": 774, - "y": 159 + "y": 159, + "w": 252, + "h": 482 }, { "id": "bebfe5d7e4f0feb0", @@ -444,7 +448,9 @@ "de48727be275102f" ], "x": 1034, - "y": 159 + "y": 159, + "w": 315, + "h": 482 }, { "id": "c6e09ffb3c5a1ce6", @@ -470,7 +476,9 @@ "e1278f8b2f6fee61" ], "x": 214, - "y": 159 + "y": 159, + "w": 242, + "h": 522 }, { "id": "0e3bf66f6ee6d572", @@ -485,7 +493,9 @@ "654b552f9e64203e" ], "x": 214, - "y": 19 + "y": 19, + "w": 252, + "h": 122 }, { "id": "b90980234a451f8d", @@ -500,7 +510,9 @@ "3047a9ba16e10212" ], "x": 1194, - "y": 39 + "y": 39, + "w": 272, + "h": 82 }, { "id": "23eb39063da69706", @@ -524,7 +536,9 @@ "c2d7711a7d230637" ], "x": 1374, - "y": 159 + "y": 159, + "w": 252, + "h": 482 }, { "id": "022672368830e427", @@ -548,7 +562,9 @@ "c4561e5c31134c5d" ], "x": 1654, - "y": 159 + "y": 159, + "w": 252, + "h": 482 }, { "id": "7a5512b5a3f6e8ba", @@ -585,7 +601,9 @@ "4b7abadd74993948" ], "x": -6, - "y": 679 + "y": 679, + "w": 2072, + "h": 302 }, { "id": "28877ac600fea8b9", @@ -610,7 +628,9 @@ "324101084f63a83e" ], "x": 224, - "y": 1019 + "y": 1019, + "w": 632, + "h": 262 }, { "id": "c6a5789101548ba9", @@ -625,7 +645,9 @@ "4e62658f095c2863" ], "x": 1394, - "y": 1099 + "y": 1099, + "w": 252, + "h": 122 }, { "id": "18a3020b4a12ae60", @@ -649,7 +671,9 @@ "89b2058720d8fb99" ], "x": 1954, - "y": 159 + "y": 159, + "w": 281, + "h": 482 }, { "id": "4f4b9f0c82968b60", @@ -697,9 +721,7 @@ "fa0188b199a945d9" ], "x": 414, - "y": 879, - "w": 1852, - "h": 462 + "y": 879 }, { "id": "81692a3cb68d6cde", @@ -732,9 +754,7 @@ "df61b921bf703bd8" ], "x": 14, - "y": 1473, - "w": 2618, - "h": 994 + "y": 1473 }, { "id": "d48758cdf0c8991d", @@ -794,9 +814,7 @@ "b5a72874a2f95ce4" ], "x": 274, - "y": 19, - "w": 2232, - "h": 802 + "y": 19 }, { "id": "f830dd821e0240f4", @@ -812,7 +830,9 @@ "925cebb6bacad025" ], "x": 914, - "y": 999 + "y": 999, + "w": 632, + "h": 82 }, { "id": "f01baabf4527b6e5", @@ -960,9 +980,7 @@ "8834c50bc7d9a366" ], "x": 2314, - "y": 819, - "w": 1912, - "h": 622 + "y": 819 }, { "id": "b5a72874a2f95ce4", @@ -989,9 +1007,7 @@ "ae7413cce68dfffa" ], "x": 914, - "y": 79, - "w": 1032, - "h": 162 + "y": 79 }, { "id": "94f44b7ea0e29d1d", @@ -1030,9 +1046,7 @@ "0ca8c50b9058010c" ], "x": 934, - "y": 1979, - "w": 1532, - "h": 462 + "y": 1979 }, { "id": "a9afc3cb2db49407", @@ -1073,9 +1087,7 @@ "bcc4223e74a54492" ], "x": 1014, - "y": 1499, - "w": 1592, - "h": 462 + "y": 1499 }, { "id": "b8ba38b3.abfb98", @@ -1958,7 +1970,7 @@ "tab": "08eed6c3517c624e", "order": 16, "disp": true, - "width": "6", + "width": "4", "collapse": false, "className": "config" }, @@ -2505,16 +2517,6 @@ "width": 6, "height": 1 }, - { - "id": "da372438e15564f5", - "type": "ui_spacer", - "z": "b73cc2bb5f424b69", - "name": "spacer", - "group": "54b59a095746559b", - "order": 4, - "width": 6, - "height": 1 - }, { "id": "d9fd549506b4994c", "type": "ui_spacer", @@ -27210,9 +27212,9 @@ "name": "2 Lat & Lon Input", "label": "", "group": "54b59a095746559b", - "order": 3, - "width": 6, - "height": 1, + "order": 1, + "width": "0", + "height": "0", "options": [ { "label": "Home Latitude", @@ -27345,7 +27347,7 @@ "type": "function", "z": "204548a488401a1b", "name": "Get Lat & Lon", - "func": "let homelat = global.get('homelat')\nlet homelon = global.get('homelon')\n\nif (homelat.toString() == '' || homelon.toString() == '')\n{\n msg.payload = \"Home Lat & Lon Not Set\";\n msg.testlat= homelat;\n msg.testlon= homelon;\n}\nelse\n{\n msg.payload={};\n msg.payload.lat = homelat;\n msg.payload.lon = homelon;\n}\nnode.status({text:\"LAT:\"+homelat+\" LON:\"+homelon});\nreturn msg;", + "func": "let homelat = global.get('homelat')\nlet homelon = global.get('homelon')\n\nif (homelat.toString() == '' || homelon.toString() == '' || homelat== undefined)\n{\n msg.payload = \"Home Lat & Lon Not Set\";\n msg.testlat= homelat;\n msg.testlon= homelon;\n}\nelse\n{\n msg.payload={};\n msg.payload.lat = homelat;\n msg.payload.lon = homelon;\n}\nnode.status({text:\"LAT:\"+homelat+\" LON:\"+homelon});\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", @@ -27421,7 +27423,7 @@ "label": "Map Labels", "tooltip": "", "group": "54b59a095746559b", - "order": 2, + "order": 3, "width": 6, "height": 1, "passthru": false, @@ -27548,7 +27550,7 @@ "tooltip": "", "place": "Select option", "group": "54b59a095746559b", - "order": 1, + "order": 2, "width": 6, "height": 1, "passthru": false, @@ -27829,7 +27831,7 @@ "place": "Select OP Sort Type", "group": "52728e3a5743376c", "order": 1, - "width": 6, + "width": "4", "height": 1, "passthru": false, "multiple": false, @@ -30804,7 +30806,7 @@ "label": "TTL Value", "tooltip": "", "group": "54b59a095746559b", - "order": 5, + "order": 4, "width": 6, "height": 1, "passthru": false, @@ -39409,7 +39411,7 @@ "order": 0, "width": 0, "height": 0, - "format": "", + "format": "\n", "storeOutMessages": true, "fwdInMessages": true, "resendOnRefresh": false, diff --git a/package.json b/package.json index 5fb6cc9..7e77331 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "n1mm_dashboard", "description": "Dashboard for N1MM Contesting", - "version": "1.4.1", + "version": "1.4.2", "dependencies": { "node-red-contrib-hourglass": "1.5.0", "node-red-contrib-msg-speed": "2.1.0", From 85a36a90091dadd8ce0b26f89c3184990e5e643e Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sun, 16 Apr 2023 20:16:18 -0500 Subject: [PATCH 06/22] v1.4.3 color --- flow.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flow.json b/flow.json index 3b2a9ec..dbbf86a 100644 --- a/flow.json +++ b/flow.json @@ -1173,9 +1173,9 @@ }, "darkTheme": { "default": "#097479", - "baseColor": "#0035d5", + "baseColor": "#097479", "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif", - "edited": true, + "edited": false, "reset": false }, "customTheme": { @@ -1204,7 +1204,7 @@ "edited": false }, "group-textColor": { - "value": "#2259ff", + "value": "#0eb8c0", "edited": false }, "group-borderColor": { @@ -1220,7 +1220,7 @@ "edited": false }, "widget-backgroundColor": { - "value": "#0035d5", + "value": "#097479", "edited": false }, "widget-borderColor": { diff --git a/package.json b/package.json index 7e77331..10896cf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "n1mm_dashboard", "description": "Dashboard for N1MM Contesting", - "version": "1.4.2", + "version": "1.4.3", "dependencies": { "node-red-contrib-hourglass": "1.5.0", "node-red-contrib-msg-speed": "2.1.0", From a87e68b833787a4f10be1f66f1a2b454e7a0adbd Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sun, 16 Apr 2023 20:27:57 -0500 Subject: [PATCH 07/22] Add supported logging software. --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f3a7da..7695a05 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,20 @@ # Node Red Contesting Dashboard -A basic multi screen contesting dasbhoard written in Node Red. Currently it can display stats and contest related info from N1MM and TR4W contesting software. DXLog integration is spotty with more testing needed. There are reports that RumLogNG also works with the dashboard. +A basic multi screen contesting dasbhoard written in Node Red. Currently it can display stats and contest related info contesting logging software. ## About This program is written in Node Red and displays a real time dashboard for ham radio contesting events. Radio, score, contact and lookup UDP broadcast packets are sent from each contesting computer to the Node Red server. That information is parsed out and displayed in real time for other contesters to follow. This dashboard is useful in a SO1V, SO2V, SO2R, multi/1, multi/2, multi-multi radio setup. It allows non-operating operators to keep up with the contest without hovering over an operators shoulders. This dashboard also allows an operator to stream the dashboard via the internet to engage an on-line audience. The program is also useful during Field Day where other operators or guests can follow along in the contest progress. +## Supported Loggers +| Logger Option | Compatiblity | +| :-------------------: | :------------:| +| [N1MM Logger +](https://n1mmwp.hamdocs.com) | Supported | +| [TR4W](https://tr4w.net/) | Supported | +| [DXLog](http://dxlog.net/) | Spotty | +| [RumLog](https://dl2rum.de/rumsoft/RUMLog.html) | Spotty | +| [N3FJP](https://www.n3fjp.com/) | Non-Currently Supported (Need help implmementing) | + ## Screenshots Here are some basic screenshots of the different tabs within the dashboard taken March 2022. From 6b562c3795a5fadb17a8bdab34fbeea4b1d99947 Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sun, 30 Apr 2023 20:41:37 -0500 Subject: [PATCH 08/22] v1.5.0 Main Contest Online Scoreboard Table/ --- flow.json | 593 ++++++++++++++++++++++++++++++++++++++++++++----- flow_cred.json | 3 +- 2 files changed, 545 insertions(+), 51 deletions(-) diff --git a/flow.json b/flow.json index dbbf86a..955151f 100644 --- a/flow.json +++ b/flow.json @@ -127,6 +127,14 @@ "info": "", "env": [] }, + { + "id": "ee0edc8a2d33034b", + "type": "tab", + "label": "Score Table", + "disabled": false, + "info": "", + "env": [] + }, { "id": "c967abe5be484ee6", "type": "subflow", @@ -396,9 +404,7 @@ "ab98427.85cd3c" ], "x": 474, - "y": 159, - "w": 272, - "h": 522 + "y": 159 }, { "id": "52886121c9629e0b", @@ -422,9 +428,7 @@ "66a43145427ca537" ], "x": 774, - "y": 159, - "w": 252, - "h": 482 + "y": 159 }, { "id": "bebfe5d7e4f0feb0", @@ -448,9 +452,7 @@ "de48727be275102f" ], "x": 1034, - "y": 159, - "w": 315, - "h": 482 + "y": 159 }, { "id": "c6e09ffb3c5a1ce6", @@ -476,9 +478,7 @@ "e1278f8b2f6fee61" ], "x": 214, - "y": 159, - "w": 242, - "h": 522 + "y": 159 }, { "id": "0e3bf66f6ee6d572", @@ -493,9 +493,7 @@ "654b552f9e64203e" ], "x": 214, - "y": 19, - "w": 252, - "h": 122 + "y": 19 }, { "id": "b90980234a451f8d", @@ -510,9 +508,7 @@ "3047a9ba16e10212" ], "x": 1194, - "y": 39, - "w": 272, - "h": 82 + "y": 39 }, { "id": "23eb39063da69706", @@ -536,9 +532,7 @@ "c2d7711a7d230637" ], "x": 1374, - "y": 159, - "w": 252, - "h": 482 + "y": 159 }, { "id": "022672368830e427", @@ -562,9 +556,7 @@ "c4561e5c31134c5d" ], "x": 1654, - "y": 159, - "w": 252, - "h": 482 + "y": 159 }, { "id": "7a5512b5a3f6e8ba", @@ -601,9 +593,7 @@ "4b7abadd74993948" ], "x": -6, - "y": 679, - "w": 2072, - "h": 302 + "y": 679 }, { "id": "28877ac600fea8b9", @@ -628,9 +618,7 @@ "324101084f63a83e" ], "x": 224, - "y": 1019, - "w": 632, - "h": 262 + "y": 1019 }, { "id": "c6a5789101548ba9", @@ -645,9 +633,7 @@ "4e62658f095c2863" ], "x": 1394, - "y": 1099, - "w": 252, - "h": 122 + "y": 1099 }, { "id": "18a3020b4a12ae60", @@ -671,9 +657,7 @@ "89b2058720d8fb99" ], "x": 1954, - "y": 159, - "w": 281, - "h": 482 + "y": 159 }, { "id": "4f4b9f0c82968b60", @@ -721,7 +705,9 @@ "fa0188b199a945d9" ], "x": 414, - "y": 879 + "y": 879, + "w": 1852, + "h": 462 }, { "id": "81692a3cb68d6cde", @@ -754,7 +740,9 @@ "df61b921bf703bd8" ], "x": 14, - "y": 1473 + "y": 1473, + "w": 2618, + "h": 994 }, { "id": "d48758cdf0c8991d", @@ -814,7 +802,9 @@ "b5a72874a2f95ce4" ], "x": 274, - "y": 19 + "y": 19, + "w": 2232, + "h": 802 }, { "id": "f830dd821e0240f4", @@ -830,9 +820,7 @@ "925cebb6bacad025" ], "x": 914, - "y": 999, - "w": 632, - "h": 82 + "y": 999 }, { "id": "f01baabf4527b6e5", @@ -980,7 +968,9 @@ "8834c50bc7d9a366" ], "x": 2314, - "y": 819 + "y": 819, + "w": 1912, + "h": 622 }, { "id": "b5a72874a2f95ce4", @@ -1007,7 +997,9 @@ "ae7413cce68dfffa" ], "x": 914, - "y": 79 + "y": 79, + "w": 1032, + "h": 162 }, { "id": "94f44b7ea0e29d1d", @@ -1046,7 +1038,9 @@ "0ca8c50b9058010c" ], "x": 934, - "y": 1979 + "y": 1979, + "w": 1532, + "h": 462 }, { "id": "a9afc3cb2db49407", @@ -1087,7 +1081,9 @@ "bcc4223e74a54492" ], "x": 1014, - "y": 1499 + "y": 1499, + "w": 1592, + "h": 462 }, { "id": "b8ba38b3.abfb98", @@ -1175,7 +1171,7 @@ "default": "#097479", "baseColor": "#097479", "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif", - "edited": false, + "edited": true, "reset": false }, "customTheme": { @@ -2488,8 +2484,9 @@ "tab": "726cbb20.1af4f4", "order": 13, "disp": true, - "width": "6", - "collapse": false + "width": "44", + "collapse": false, + "className": "" }, { "id": "78387f0f.22098", @@ -2627,6 +2624,34 @@ "width": 2, "height": 1 }, + { + "id": "237da972.5d69a6", + "type": "ui_group", + "name": "ui-table with commands", + "tab": "379a501f.53b59", + "order": 1, + "disp": true, + "width": "17", + "collapse": false + }, + { + "id": "c91332c0.50c11", + "type": "ui_group", + "name": "commands", + "tab": "379a501f.53b59", + "order": 2, + "disp": true, + "width": "6", + "collapse": false + }, + { + "id": "379a501f.53b59", + "type": "ui_tab", + "name": "ui-table command", + "icon": "fa-table", + "disabled": false, + "hidden": false + }, { "id": "db6c3ead34896ed7", "type": "switch", @@ -37581,7 +37606,8 @@ "b9359e88f599c705", "86117516f9c50845", "d84431b1769ad0b7", - "ca794ca15d01319a" + "ca794ca15d01319a", + "09a80363b32c10dd" ], "x": 1425, "y": 80, @@ -41744,5 +41770,472 @@ "x": 1030, "y": 500, "wires": [] + }, + { + "id": "15672483a10a62b2", + "type": "ui_toast", + "z": "ee0edc8a2d33034b", + "position": "dialog", + "displayTime": "3", + "highlight": "", + "sendall": true, + "outputs": 1, + "ok": "OK", + "cancel": "", + "raw": false, + "className": "", + "topic": "", + "name": "Online Scoreboard Error", + "x": 1410, + "y": 140, + "wires": [ + [] + ] + }, + { + "id": "80b1d74686de4a72", + "type": "debug", + "z": "ee0edc8a2d33034b", + "name": "", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 1230, + "y": 180, + "wires": [] + }, + { + "id": "6313d253a0c71c71", + "type": "rbe", + "z": "ee0edc8a2d33034b", + "name": "RBE", + "func": "rbe", + "gap": "", + "start": "", + "inout": "out", + "septopics": true, + "property": "payload", + "topi": "topic", + "x": 1210, + "y": 140, + "wires": [ + [ + "15672483a10a62b2" + ] + ] + }, + { + "id": "957c28ebf33a4784", + "type": "switch", + "z": "ee0edc8a2d33034b", + "name": "Error?", + "property": "payload", + "propertyType": "msg", + "rules": [ + { + "t": "neq", + "v": "Contest not supported", + "vt": "str" + }, + { + "t": "eq", + "v": "Contest not supported", + "vt": "str" + }, + { + "t": "cont", + "v": "is not active", + "vt": "str" + } + ], + "checkall": "true", + "repair": false, + "outputs": 3, + "x": 1030, + "y": 140, + "wires": [ + [ + "82ba94e6dd3c3fd8" + ], + [ + "6313d253a0c71c71", + "80b1d74686de4a72" + ], + [ + "6313d253a0c71c71" + ] + ] + }, + { + "id": "a7dc0c3abe431255", + "type": "function", + "z": "ee0edc8a2d33034b", + "name": "Is Error?", + "func": "if (msg.payload.error == undefined)\n{\n return msg\n}\nif (msg.payload.error != undefined)\n{\n msg.payload = \"Contest not supported\";\n return msg;\n}\n", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 860, + "y": 120, + "wires": [ + [ + "11f2a38999137dfc", + "957c28ebf33a4784" + ] + ] + }, + { + "id": "53255eb5cfb7c2b6", + "type": "http request", + "z": "ee0edc8a2d33034b", + "name": "", + "method": "GET", + "ret": "obj", + "paytoqs": "body", + "url": "https://contestonlinescore.com/tools/api/?key=3450792384502938475&contest={{topic}}", + "tls": "465f5622aae04ed5", + "persist": false, + "proxy": "", + "insecureHTTPParser": false, + "authType": "", + "senderr": false, + "headers": [], + "x": 690, + "y": 120, + "wires": [ + [ + "2c5c6722784705e5", + "a7dc0c3abe431255" + ] + ] + }, + { + "id": "2c5c6722784705e5", + "type": "debug", + "z": "ee0edc8a2d33034b", + "name": "", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 850, + "y": 80, + "wires": [] + }, + { + "id": "11f2a38999137dfc", + "type": "debug", + "z": "ee0edc8a2d33034b", + "name": "", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 1030, + "y": 80, + "wires": [] + }, + { + "id": "cf32d7cb8b44189c", + "type": "debug", + "z": "ee0edc8a2d33034b", + "name": "", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 670, + "y": 80, + "wires": [] + }, + { + "id": "903deb0cf5b2c114", + "type": "switch", + "z": "ee0edc8a2d33034b", + "name": "Contest Defined?", + "property": "contestname", + "propertyType": "global", + "rules": [ + { + "t": "nnull" + } + ], + "checkall": "true", + "repair": false, + "outputs": 1, + "x": 490, + "y": 120, + "wires": [ + [ + "53255eb5cfb7c2b6", + "cf32d7cb8b44189c" + ] + ] + }, + { + "id": "c8bf7dd9b8eda210", + "type": "function", + "z": "ee0edc8a2d33034b", + "name": "Prep HTTP GET", + "func": "let contestname = global.get('contestname');\nlet contestcall = global.get('contestcallsign');\nlet chasecall1 = global.get('chasecall1');\nlet chasecall2 = global.get('chasecall2');\nlet chasecall3 = global.get('chasecall3');\nlet chasecall4 = global.get('chasecall4');\nlet chasecall5 = global.get('chasecall5');\n\nif (contestname == null)\n{\n return;\n}\n\nif (contestcall == null)\n{\n return;\n}\n\nif (chasecall1 == null)\n{\n msg.payload = contestcall\n msg.topic = contestname;\n return msg;\n}\n\nif (chasecall2 == null)\n{\n msg.payload = contestcall+\",\"+chasecall1\n msg.topic = contestname;\n return msg;\n}\n\nif (chasecall3 == null)\n{\n msg.payload = contestcall+\",\"+chasecall1+\",\"+chasecall2\n msg.topic = contestname;\n return msg;\n}\n\nif (chasecall4 == null)\n{\n msg.payload = contestcall+\",\"+chasecall1+\",\"+chasecall2+\",\"+chasecall3\n msg.topic = contestname;\n return msg;\n}\n\nif (chasecall5 == null)\n{\n msg.payload = contestcall+\",\"+chasecall1+\",\"+chasecall2+\",\"+chasecall3+\",\"+chasecall4\n msg.topic = contestname;\n return msg;\n}\nelse {\n \n msg.payload = contestcall+\",\"+chasecall1+\",\"+chasecall2+\",\"+chasecall3+\",\"+chasecall4+\",\"+chasecall5\n msg.topic = contestname;\n return msg;\n}\n\n//msg.payload = contestcall+\",\"+chasecall1+\",\"+chasecall2+\",\"+chasecall3+\",\"+chasecall4+\",\"+chasecall5\n\n//let dummyString=\"890909.00\"\n//msg.payload = msg.payload.replace(/(,+$)/, '')\n//console.log(dummyString)\n\n//msg.topic = contestname;\n\n//return msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 280, + "y": 120, + "wires": [ + [ + "903deb0cf5b2c114" + ] + ] + }, + { + "id": "d2a747b5049be4e6", + "type": "inject", + "z": "ee0edc8a2d33034b", + "name": "", + "props": [ + { + "p": "payload" + }, + { + "p": "topic", + "vt": "str" + } + ], + "repeat": "120", + "crontab": "", + "once": false, + "onceDelay": 0.1, + "topic": "", + "payload": "", + "payloadType": "date", + "x": 110, + "y": 120, + "wires": [ + [ + "c8bf7dd9b8eda210" + ] + ] + }, + { + "id": "09a80363b32c10dd", + "type": "link in", + "z": "ee0edc8a2d33034b", + "name": "Scoreboard HTTP Get IN", + "links": [ + "3047a9ba16e10212" + ], + "x": 155, + "y": 60, + "wires": [ + [ + "c8bf7dd9b8eda210" + ] + ] + }, + { + "id": "d805877e215b63df", + "type": "ui_table", + "z": "ee0edc8a2d33034b", + "group": "110f893b.a0f1d7", + "name": "Scores", + "order": 2, + "width": "44", + "height": "27", + "columns": [ + { + "field": "contestcall", + "title": "Callsign", + "width": "8%", + "align": "left", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "category", + "title": "Category", + "width": "7%", + "align": "left", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "power", + "title": "Power", + "width": "6%", + "align": "center", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "qso_total", + "title": "QSOs", + "width": "8%", + "align": "center", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "mult_total", + "title": "Mults", + "width": "7%", + "align": "center", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "score_total", + "title": "Score", + "width": "10%", + "align": "center", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "band_160", + "title": "160", + "width": "8%", + "align": "center", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "band_80", + "title": "80", + "width": "7%", + "align": "center", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "band_40", + "title": "40", + "width": "7%", + "align": "center", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "band_20", + "title": "20", + "width": "7%", + "align": "center", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "band_15", + "title": "15", + "width": "7%", + "align": "center", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "band_10", + "title": "10", + "width": "7%", + "align": "center", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "last", + "title": "Latest Update", + "width": "9%", + "align": "right", + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } + } + ], + "outputs": 0, + "cts": false, + "x": 1360, + "y": 100, + "wires": [] + }, + { + "id": "82ba94e6dd3c3fd8", + "type": "function", + "z": "ee0edc8a2d33034b", + "name": "function 1", + "func": "node.send([]);\nlet msg_old= msg.payload \nlet output=[];\nlet power_list = [,'QRP','Low','High'];\nlet category_list=['SO','M/1','M/2','M/M'];\nlet assisted_list=['Non-Assisted','Assisted'];\nlet mode_list=['Mixed','CW','SSB','RTTY','PSK','FT8','FT4','DIGI'];\nlet overlay=['','TB-Wires','Rookie','Classic','Wire-Only'];\nlet band_list=['ALL', '160M', '80M', '40M', '20M', '15M', '10M', '6M', '2M', '1.25M', '0.70M', '0.33M', '0.23M', '0.13M', '0.09M', '0.05M', '0.03M']\n\nvar iterate=0;\nvar contest_list= Object.keys(msg_old);\nfor (let contestcall in contest_list){\n let call_data = msg.payload[contest_list[contestcall]];\n let score_total = call_data.data.score_total;\n let qso_total = call_data.data.qso_total || \"\";\n let mult_total = call_data.data.mult_total || \"\";\n let qso_160 = call_data.data.qso_160 || \"\" ;\n let mult_160 = call_data.data.mult_160 || \"\" ;\n let qso_80 = call_data.data.qso_80 || \"\";\n let mult_80 = call_data.data.mult_80 || \"\";\n let qso_40 = call_data.data.qso_40 || \"\";\n let mult_40 = call_data.data.mult_40 || \"\";\n let qso_20 = call_data.data.qso_20 || \"\";\n let mult_20 = call_data.data.mult_20 || \"\";\n let qso_15 = call_data.data.qso_15 || \"\";\n let mult_15 = call_data.data.mult_15 || \"\";\n let qso_10 = call_data.data.qso_10 || \"\";\n let mult_10 = call_data.data.mult_10 || \"\";\n let qso_6 = call_data.data.qso_6 || \"\";\n let mult_6 = call_data.data.mult_6 || \"\";\n let last = call_data.data.last;\n \n if (call_data.data.category =='0'){\n if (call_data.data.band=='0'){\n var band=\"AB\";\n }else{\n band = 'SB '+call_data.data.band;\n }\n if (call_data.data.assisted =='1'){\n var assisted=\"A\";\n }\n else{\n assisted=\"\";\n }\n }else{\n band=\"\";\n assisted=\"\";\n }\n score_total = Number(score_total).toLocaleString('US');\n qso_total = Number(qso_total).toLocaleString('US');\n mult_total = Number(mult_total).toLocaleString('US');\n output[iterate] = {\n contestcall: contest_list[contestcall],\n category: category_list[call_data.data.category]+assisted+band,\n power: power_list[call_data.data.power],\n score_total: score_total,\n qso_total: qso_total,\n mult_total: mult_total,\n band_10: String(qso_10+\"/\"+mult_10),\n band_160: String(qso_160 + \"/\" + mult_160),\n band_80: String(qso_80 + \"/\" + mult_80),\n band_40: String(qso_40 + \"/\" + mult_40),\n band_20: String(qso_20 + \"/\" + mult_20),\n band_15: String(qso_15 + \"/\" + mult_15),\n band_6: String(qso_6 + \"/\" +mult_6),\n last: last\n };\n iterate=iterate+1;\n}\n\n\noutput.sort(function (a, b) {\n return a.category.localeCompare(b.category) || Number(b.score_total) - Number(a.score_total);\n});\n\nmsg.payload=output;\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 1200, + "y": 100, + "wires": [ + [ + "d805877e215b63df", + "dd7d6b64a786a7d3" + ] + ] + }, + { + "id": "dd7d6b64a786a7d3", + "type": "debug", + "z": "ee0edc8a2d33034b", + "name": "debug 8", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 1360, + "y": 60, + "wires": [] } ] \ No newline at end of file diff --git a/flow_cred.json b/flow_cred.json index 9626895..803726b 100644 --- a/flow_cred.json +++ b/flow_cred.json @@ -11,5 +11,6 @@ "1d3a3564f6016e6a": {}, "77f7cadf4c5bf2f4": {}, "6b75028c49d07165": {}, - "24a259a2ccec0aa3": {} + "24a259a2ccec0aa3": {}, + "53255eb5cfb7c2b6": {} } \ No newline at end of file From 21531565e0fe226a0167dc73698bd9ccae2c89a9 Mon Sep 17 00:00:00 2001 From: Ron Rossi <73606166+KK1L@users.noreply.github.com> Date: Mon, 8 May 2023 22:30:10 -0400 Subject: [PATCH 09/22] Compact dashboard (#60) v1.6.0 * compact dashboard update #1. Dashboard tab only Noticed error in SO1V radio switch...the wrong vairable is used. It is the network name of the logging station which is compared....this is wrong. * changed Station Name switch to Radio 1/2 * corrected error in Radio1 or 2 (was station name) * other tweaks and set RadioInfo to show PC1~PC6 names. * Stop Feedback loop on Tempature Unit * v1.6.0 PR #60 --------- Co-authored-by: Connor Dickey Co-authored-by: AA0Z <66072956+kylekrieg@users.noreply.github.com> --- flow.json | 509 ++++++++++++++++++++++++++------------------------- package.json | 32 ++-- 2 files changed, 272 insertions(+), 269 deletions(-) diff --git a/flow.json b/flow.json index 955151f..fa86cca 100644 --- a/flow.json +++ b/flow.json @@ -740,9 +740,9 @@ "df61b921bf703bd8" ], "x": 14, - "y": 1473, + "y": 1545.5, "w": 2618, - "h": 994 + "h": 1021.5 }, { "id": "d48758cdf0c8991d", @@ -1037,10 +1037,10 @@ "b660ee693411d757", "0ca8c50b9058010c" ], - "x": 934, - "y": 1979, - "w": 1532, - "h": 462 + "x": 854, + "y": 2019, + "w": 1612, + "h": 522 }, { "id": "a9afc3cb2db49407", @@ -1076,14 +1076,13 @@ "572d2215a6ea16bb", "5a5a85080d107e92", "0baeb2e7ae556661", - "ab3f6963df6eaf43", "cfe25ee37e99db50", "bcc4223e74a54492" ], "x": 1014, - "y": 1499, + "y": 1571.5, "w": 1592, - "h": 462 + "h": 449.5 }, { "id": "b8ba38b3.abfb98", @@ -1091,7 +1090,7 @@ "name": "Current QSO's", "tab": "200297fa.9ab198", "order": 2, - "disp": true, + "disp": false, "width": "26", "collapse": false, "className": "dashboard_current_qsos" @@ -1102,7 +1101,7 @@ "name": "Last QSO's", "tab": "200297fa.9ab198", "order": 1, - "disp": true, + "disp": false, "width": "5", "collapse": false, "className": "dashboard_last_qsos" @@ -1119,7 +1118,7 @@ "name": "Contest Stats", "tab": "200297fa.9ab198", "order": 3, - "disp": true, + "disp": false, "width": "5", "collapse": false, "className": "dashboard_contest_stats" @@ -1130,7 +1129,7 @@ "name": "Radio 1 Data", "tab": "200297fa.9ab198", "order": 8, - "disp": true, + "disp": false, "width": "24", "collapse": false, "className": "dashboard_radio_data" @@ -1141,7 +1140,7 @@ "name": "Radio 2 Data", "tab": "200297fa.9ab198", "order": 9, - "disp": true, + "disp": false, "width": "24", "collapse": false, "className": "dashboard_radio_data" @@ -1821,7 +1820,7 @@ "name": "Activity Rate", "tab": "200297fa.9ab198", "order": 7, - "disp": true, + "disp": false, "width": "12", "collapse": false, "className": "dashboard_activity_rate" @@ -7252,12 +7251,12 @@ "width": 4, "height": 2, "name": "Radio 2 Operator Dashboard", - "label": "Operator", + "label": "{{msg.Radio2Name}}", "format": "{{msg.payload.RadioInfo.OpCall[0]}}", "layout": "col-center", "className": "", "x": 1540, - "y": 2240, + "y": 2280, "wires": [] }, { @@ -7265,25 +7264,25 @@ "type": "switch", "z": "407d2b774fe67647", "g": "81692a3cb68d6cde", - "name": "Station Name", - "property": "payload.RadioInfo.StationName[0]", + "name": "Radio 1 or 2 (was Station Name)", + "property": "payload.RadioInfo.RadioNr[0]", "propertyType": "msg", "rules": [ { "t": "eq", - "v": "PC1", + "v": "1", "vt": "global" }, { "t": "eq", - "v": "PC2", + "v": "2", "vt": "global" } ], "checkall": "true", "repair": false, "outputs": 2, - "x": 920, + "x": 970, "y": 1740, "wires": [ [ @@ -7295,7 +7294,8 @@ "b946bc8caa8d1dfa", "1497c72e88a8f6b1", "cab897702f8a6f57", - "d0b1af6883fc61b1" + "d0b1af6883fc61b1", + "df61b921bf703bd8" ], [ "27f4e52f97117294", @@ -7322,7 +7322,7 @@ "finalize": "", "libs": [], "x": 1500, - "y": 2200, + "y": 2240, "wires": [ [ "f9c9ed275443b030" @@ -7344,7 +7344,7 @@ "layout": "col-center", "className": "", "x": 1750, - "y": 2200, + "y": 2240, "wires": [] }, { @@ -7362,7 +7362,7 @@ "layout": "col-center", "className": "", "x": 1540, - "y": 2320, + "y": 2360, "wires": [] }, { @@ -7380,7 +7380,7 @@ "layout": "col-center", "className": "", "x": 1530, - "y": 2280, + "y": 2320, "wires": [] }, { @@ -7396,7 +7396,7 @@ "finalize": "", "libs": [], "x": 1270, - "y": 2320, + "y": 2360, "wires": [ [ "5c688773c88f9f41" @@ -7419,15 +7419,15 @@ "type": "template", "z": "407d2b774fe67647", "g": "94f44b7ea0e29d1d", - "name": "SQL Select Rate Radio", + "name": "SQL Select Rate", "field": "topic", "fieldType": "msg", "format": "handlebars", "syntax": "mustache", "template": "select count(call) as rate from qsos where StationName='{{{payload.RadioInfo.StationName}}}' and timestamp >= datetime('now','-1 hours');", "output": "str", - "x": 1510, - "y": 2360, + "x": 1410, + "y": 2460, "wires": [ [ "97aba946591c7289" @@ -7443,8 +7443,8 @@ "sqlquery": "msg.topic", "sql": "", "name": "QSO Database", - "x": 1740, - "y": 2380, + "x": 1640, + "y": 2460, "wires": [ [ "7aa65e21deb3bbf5" @@ -7466,7 +7466,7 @@ "layout": "col-center", "className": "", "x": 2350, - "y": 2380, + "y": 2420, "wires": [] }, { @@ -7495,7 +7495,7 @@ "z": "407d2b774fe67647", "g": "81692a3cb68d6cde", "name": "UTF8", - "func": "msg.payload=msg.payload.toString('UTF8');\nreturn msg;", + "func": "msg.payload=msg.payload.toString('UTF8');\nmsg.Radio1Name = global.get('PC1');\nmsg.Radio2Name = global.get('PC2');\nmsg.Radio3Name = global.get('PC3');\nmsg.Radio4Name = global.get('PC4');\nmsg.Radio5Name = global.get('PC5');\nmsg.Radio6Name = global.get('PC6');\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", @@ -7579,8 +7579,8 @@ "drop": true, "allowrate": false, "outputs": 1, - "x": 1040, - "y": 2380, + "x": 960, + "y": 2480, "wires": [ [ "0ca8c50b9058010c" @@ -7593,8 +7593,8 @@ "z": "407d2b774fe67647", "g": "94f44b7ea0e29d1d", "name": "", - "x": 2100, - "y": 2380, + "x": 2020, + "y": 2460, "wires": [ [ "d37ea6046424b974" @@ -7627,8 +7627,8 @@ "from": "", "to": "", "reg": false, - "x": 1910, - "y": 2380, + "x": 1830, + "y": 2460, "wires": [ [ "8a9601bf0a7a7faa" @@ -7763,7 +7763,6 @@ [ "27f4e52f97117294", "d9503f18f29524db", - "df61b921bf703bd8", "ccb12f5a5e87937a", "a74a987615dd4bb9", "fb911af0905d8f5d", @@ -7793,7 +7792,7 @@ "repair": false, "outputs": 2, "x": 1510, - "y": 2120, + "y": 2160, "wires": [ [ "379a02b32eb2de49" @@ -7818,7 +7817,7 @@ "layout": "col-center", "className": "", "x": 1990, - "y": 2120, + "y": 2160, "wires": [] }, { @@ -7834,7 +7833,7 @@ "finalize": "", "libs": [], "x": 1740, - "y": 2120, + "y": 2160, "wires": [ [ "d6a02ccab960310f" @@ -7860,7 +7859,7 @@ "allowrate": false, "outputs": 1, "x": 1740, - "y": 2160, + "y": 2200, "wires": [ [ "d6a02ccab960310f" @@ -7891,7 +7890,7 @@ "showGlow": true, "name": "Radio 2 TX Transmit LED", "x": 1770, - "y": 2020, + "y": 2060, "wires": [] }, { @@ -7907,7 +7906,7 @@ "finalize": "", "libs": [], "x": 1490, - "y": 2020, + "y": 2060, "wires": [ [ "d87f990426df6b87" @@ -7927,7 +7926,7 @@ "finalize": "", "libs": [], "x": 1500, - "y": 2060, + "y": 2100, "wires": [ [ "c28f1c9baeeba95d" @@ -7958,7 +7957,7 @@ "showGlow": true, "name": "Radio 2 Focus LED", "x": 1750, - "y": 2060, + "y": 2100, "wires": [] }, { @@ -8032,7 +8031,7 @@ "width": 5, "height": 2, "name": "Last QSO Call Display", - "label": "Last QSO", + "label": "Latest QSO", "format": "{{msg.payload.name}}", "layout": "col-center", "className": "", @@ -9220,7 +9219,7 @@ "showGlow": true, "name": "Radio 1 Focus LED", "x": 1750, - "y": 1920, + "y": 1980, "wires": [] }, { @@ -9236,7 +9235,7 @@ "finalize": "", "libs": [], "x": 1500, - "y": 1920, + "y": 1980, "wires": [ [ "8de09b93172d4977" @@ -9256,7 +9255,7 @@ "finalize": "", "libs": [], "x": 1490, - "y": 1880, + "y": 1940, "wires": [ [ "72403bb4391a1d55", @@ -9288,7 +9287,7 @@ "showGlow": true, "name": "Radio 1 TX Transmit LED", "x": 1770, - "y": 1880, + "y": 1940, "wires": [] }, { @@ -9306,7 +9305,7 @@ "statusVal": "", "statusType": "auto", "x": 1990, - "y": 1840, + "y": 1900, "wires": [] }, { @@ -9328,7 +9327,7 @@ "allowrate": false, "outputs": 1, "x": 1740, - "y": 1820, + "y": 1880, "wires": [ [ "644bc9391ec895bf" @@ -9348,7 +9347,7 @@ "finalize": "", "libs": [], "x": 1740, - "y": 1780, + "y": 1840, "wires": [ [ "644bc9391ec895bf" @@ -9370,7 +9369,7 @@ "layout": "col-center", "className": "", "x": 1990, - "y": 1780, + "y": 1840, "wires": [] }, { @@ -9388,7 +9387,7 @@ "layout": "col-center", "className": "", "x": 1770, - "y": 1740, + "y": 1800, "wires": [] }, { @@ -9411,7 +9410,7 @@ "repair": false, "outputs": 2, "x": 1510, - "y": 1780, + "y": 1840, "wires": [ [ "9ac7455179b0e1d0" @@ -9434,7 +9433,7 @@ "finalize": "", "libs": [], "x": 1480, - "y": 1740, + "y": 1800, "wires": [ [ "144f676e5802f76c" @@ -9451,12 +9450,12 @@ "width": 4, "height": 2, "name": "Radio 1 Operator Dashboard", - "label": "Operator", + "label": "{{msg.Radio1Name}}", "format": "{{msg.payload.RadioInfo.OpCall[0]}}", "layout": "col-center", "className": "", "x": 1520, - "y": 1700, + "y": 1760, "wires": [] }, { @@ -9474,7 +9473,7 @@ "layout": "col-center", "className": "", "x": 1510, - "y": 1660, + "y": 1720, "wires": [] }, { @@ -9492,7 +9491,7 @@ "layout": "col-center", "className": "", "x": 1520, - "y": 1620, + "y": 1680, "wires": [] }, { @@ -9508,13 +9507,33 @@ "finalize": "", "libs": [], "x": 1270, - "y": 1620, + "y": 1680, "wires": [ [ "323b33d53e2baade" ] ] }, + { + "id": "b1abd7f75fd32f6f", + "type": "template", + "z": "407d2b774fe67647", + "g": "a9afc3cb2db49407", + "name": "SQL Select Rate", + "field": "topic", + "fieldType": "msg", + "format": "handlebars", + "syntax": "mustache", + "template": "select count(call) as rate from qsos where StationName='{{{payload.RadioInfo.StationName}}}' and timestamp >= datetime('now','-1 hours');", + "output": "str", + "x": 1590, + "y": 1600, + "wires": [ + [ + "3d1ebae60e058858" + ] + ] + }, { "id": "5bbc72a4e604df32", "type": "delay", @@ -9534,9 +9553,11 @@ "allowrate": false, "outputs": 1, "x": 1120, - "y": 1560, + "y": 1620, "wires": [ - [] + [ + "cfe25ee37e99db50" + ] ] }, { @@ -9545,16 +9566,16 @@ "z": "407d2b774fe67647", "g": "a9afc3cb2db49407", "name": "", - "active": false, + "active": true, "tosidebar": true, "console": false, "tostatus": false, - "complete": "true", - "targetType": "full", + "complete": "payload", + "targetType": "msg", "statusVal": "", "statusType": "auto", - "x": 1400, - "y": 1820, + "x": 1420, + "y": 1880, "wires": [] }, { @@ -9566,8 +9587,8 @@ "sqlquery": "msg.topic", "sql": "", "name": "QSO Database", - "x": 1820, - "y": 1560, + "x": 1800, + "y": 1620, "wires": [ [ "572d2215a6ea16bb" @@ -9594,8 +9615,8 @@ "from": "", "to": "", "reg": false, - "x": 2010, - "y": 1560, + "x": 1990, + "y": 1620, "wires": [ [ "5a5a85080d107e92" @@ -9608,8 +9629,8 @@ "z": "407d2b774fe67647", "g": "a9afc3cb2db49407", "name": "", - "x": 2180, - "y": 1560, + "x": 2160, + "y": 1620, "wires": [ [ "0baeb2e7ae556661" @@ -9637,7 +9658,7 @@ "layout": "col-center", "className": "", "x": 2450, - "y": 1560, + "y": 1620, "wires": [] }, { @@ -10704,7 +10725,8 @@ "tosidebar": true, "console": false, "tostatus": false, - "complete": "false", + "complete": "payload", + "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 900, @@ -10720,7 +10742,7 @@ "width": 6, "height": 2, "name": "10 Minute Rate", - "label": "10 Minute", + "label": "10 Minute Rate", "format": "{{msg.rate}}", "layout": "col-center", "className": "", @@ -10843,7 +10865,7 @@ "width": 6, "height": 2, "name": "30 Minute Rate", - "label": "30 Minute", + "label": "30 Minute Rate", "format": "{{msg.rate}}", "layout": "col-center", "className": "", @@ -10957,120 +10979,6 @@ ] ] }, - { - "id": "b660ee693411d757", - "type": "template", - "z": "407d2b774fe67647", - "g": "94f44b7ea0e29d1d", - "name": "SQL Select Rate OP", - "field": "topic", - "fieldType": "msg", - "format": "handlebars", - "syntax": "mustache", - "template": "select count(operator) as rate from qsos where operator='{{payload.RadioInfo.OpCall}}' and timestamp >= datetime('now','-1 hours');", - "output": "str", - "x": 1500, - "y": 2400, - "wires": [ - [ - "97aba946591c7289" - ] - ] - }, - { - "id": "0ca8c50b9058010c", - "type": "function", - "z": "407d2b774fe67647", - "g": "94f44b7ea0e29d1d", - "name": "Dashboard Rate Choice", - "func": "let dashboardqrate=global.get(\"dashboardqrate\");\n\nif (dashboardqrate == \"radio\"){\nmsg.choice=\"Radio\";\nreturn [msg,null]\n}\nelse if (dashboardqrate == \"op\"){\nmsg.choice=\"Operator\";\nreturn [null,msg]\n}\n", - "outputs": 2, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1250, - "y": 2380, - "wires": [ - [ - "89588cb6bf69a8d0" - ], - [ - "b660ee693411d757" - ] - ], - "outputLabels": [ - "Radio", - "Operator" - ] - }, - { - "id": "cfe25ee37e99db50", - "type": "function", - "z": "407d2b774fe67647", - "g": "a9afc3cb2db49407", - "name": "Dashboard Rate Choice", - "func": "let dashboardqrate=global.get(\"dashboardqrate\");\n\nif (dashboardqrate == \"radio\"){\nmsg.choice=\"Radio\";\nreturn [msg,null]\n}\nelse if (dashboardqrate == \"op\"){\nmsg.choice=\"Operator\";\nreturn [null,msg]\n}\n", - "outputs": 2, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1330, - "y": 1560, - "wires": [ - [ - "ab3f6963df6eaf43" - ], - [ - "bcc4223e74a54492" - ] - ], - "outputLabels": [ - "Radio", - "Operator" - ] - }, - { - "id": "ab3f6963df6eaf43", - "type": "template", - "z": "407d2b774fe67647", - "g": "a9afc3cb2db49407", - "name": "SQL Select Rate Radio", - "field": "topic", - "fieldType": "msg", - "format": "handlebars", - "syntax": "mustache", - "template": "select count(call) as rate from qsos where StationName='{{{payload.RadioInfo.StationName}}}' and timestamp >= datetime('now','-1 hours');", - "output": "str", - "x": 1570, - "y": 1540, - "wires": [ - [ - "3d1ebae60e058858" - ] - ] - }, - { - "id": "bcc4223e74a54492", - "type": "template", - "z": "407d2b774fe67647", - "g": "a9afc3cb2db49407", - "name": "SQL Select Rate OP", - "field": "topic", - "fieldType": "msg", - "format": "handlebars", - "syntax": "mustache", - "template": "select count(operator) as rate from qsos where operator='{{payload.RadioInfo.OpCall}}' and timestamp >= datetime('now','-1 hours');", - "output": "str", - "x": 1560, - "y": 1580, - "wires": [ - [ - "3d1ebae60e058858" - ] - ] - }, { "id": "8da88eb5e82e503d", "type": "link in", @@ -11162,6 +11070,100 @@ ] ] }, + { + "id": "b660ee693411d757", + "type": "template", + "z": "407d2b774fe67647", + "g": "94f44b7ea0e29d1d", + "name": "SQL Select Rate OP", + "field": "topic", + "fieldType": "msg", + "format": "handlebars", + "syntax": "mustache", + "template": "select count(operator) as rate from qsos where operator='{{payload.RadioInfo.OpCall}}' and timestamp >= datetime('now','-1 hours');", + "output": "str", + "x": 1420, + "y": 2500, + "wires": [ + [ + "97aba946591c7289" + ] + ] + }, + { + "id": "0ca8c50b9058010c", + "type": "function", + "z": "407d2b774fe67647", + "g": "94f44b7ea0e29d1d", + "name": "Dashboard Rate Choice", + "func": "let dashboardqrate=global.get(\"dashboardqrate\");\n\nif (dashboardqrate == \"radio\"){\nmsg.choice=\"Radio\";\nreturn [msg,null]\n}\nelse if (dashboardqrate == \"op\"){\nmsg.choice=\"Operator\";\nreturn [null,msg]\n}\n", + "outputs": 2, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 1190, + "y": 2480, + "wires": [ + [ + "89588cb6bf69a8d0" + ], + [ + "b660ee693411d757" + ] + ], + "outputLabels": [ + "Radio", + "Operator" + ] + }, + { + "id": "cfe25ee37e99db50", + "type": "function", + "z": "407d2b774fe67647", + "g": "a9afc3cb2db49407", + "name": "Dashboard Rate Choice", + "func": "let dashboardqrate=global.get(\"dashboardqrate\");\n\nif (dashboardqrate == \"radio\"){\nmsg.choice=\"Radio\";\nreturn [msg,null]\n}\nelse if (dashboardqrate == \"op\"){\nmsg.choice=\"Operator\";\nreturn [null,msg]\n}\n", + "outputs": 2, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 1330, + "y": 1620, + "wires": [ + [ + "b1abd7f75fd32f6f" + ], + [ + "bcc4223e74a54492" + ] + ], + "outputLabels": [ + "Radio", + "Operator" + ] + }, + { + "id": "bcc4223e74a54492", + "type": "template", + "z": "407d2b774fe67647", + "g": "a9afc3cb2db49407", + "name": "SQL Select Rate OP", + "field": "topic", + "fieldType": "msg", + "format": "handlebars", + "syntax": "mustache", + "template": "select count(operator) as rate from qsos where operator='{{payload.RadioInfo.OpCall}}' and timestamp >= datetime('now','-1 hours');", + "output": "str", + "x": 1580, + "y": 1640, + "wires": [ + [ + "3d1ebae60e058858" + ] + ] + }, { "id": "4079239a4fd5c11c", "type": "ui_text", @@ -11171,7 +11173,7 @@ "width": 5, "height": 2, "name": "RI-Radio 1 Operator", - "label": "Operator", + "label": "{{msg.Radio1Name}}", "format": "{{msg.payload.RadioInfo.OpCall[0]}}", "layout": "col-center", "className": "", @@ -11188,7 +11190,7 @@ "width": 5, "height": 2, "name": "RI-Radio 2 Operator", - "label": "Operator", + "label": "{{msg.Radio2Name}}", "format": "{{msg.payload.RadioInfo.OpCall[0]}}", "layout": "col-center", "className": "", @@ -11646,7 +11648,7 @@ "width": 5, "height": 2, "name": "FI-Radio 3 Operator", - "label": "Operator", + "label": "{{msg.Radio3Name}}", "format": "{{msg.payload.RadioInfo.OpCall[0]}}", "layout": "col-center", "className": "", @@ -11821,7 +11823,7 @@ "width": 5, "height": 2, "name": "FI-Radio 4 Operator", - "label": "Operator", + "label": "{{msg.Radio4Name}}", "format": "{{msg.payload.RadioInfo.OpCall[0]}}", "layout": "col-center", "className": "", @@ -15157,7 +15159,7 @@ "width": 5, "height": 2, "name": "FI-Radio 5 Operator", - "label": "Operator", + "label": "{{msg.Radio5Name}}", "format": "{{msg.payload.RadioInfo.OpCall[0]}}", "layout": "col-center", "className": "", @@ -15545,7 +15547,7 @@ "width": 5, "height": 2, "name": "FI-Radio 6 Operator", - "label": "Operator", + "label": "{{msg.Radio6Name}}", "format": "{{msg.payload.RadioInfo.OpCall[0]}}", "layout": "col-center", "className": "", @@ -23729,7 +23731,7 @@ "type": "debug", "z": "b59d8b7ca43e59ce", "name": "", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": false, @@ -27194,8 +27196,8 @@ "t": "set", "p": "ttl", "pt": "global", - "to": "payload", - "tot": "msg" + "to": "msg.payload", + "tot": "global" } ], "action": "", @@ -27203,8 +27205,8 @@ "from": "", "to": "", "reg": false, - "x": 950, - "y": 2420, + "x": 930, + "y": 2460, "wires": [ [ "34a7871439e7394e" @@ -27223,7 +27225,7 @@ "finalize": "", "libs": [], "x": 500, - "y": 2420, + "y": 2460, "wires": [ [ "73c95c45093b17ae" @@ -31151,7 +31153,8 @@ "name": "PC Out", "mode": "link", "links": [ - "1abba9a1115bd2c7" + "1abba9a1115bd2c7", + "afaa93d2e55e7e8c" ], "x": 1765, "y": 360, @@ -31193,6 +31196,33 @@ ] ] }, + { + "id": "135549f560738315", + "type": "link out", + "z": "204548a488401a1b", + "name": "Score Calculation Out", + "mode": "link", + "links": [ + "fa0188b199a945d9" + ], + "x": 1320, + "y": 2680, + "wires": [], + "l": true + }, + { + "id": "18094b3bc3019c07", + "type": "link out", + "z": "204548a488401a1b", + "name": "RadioSport Activity Out", + "mode": "link", + "links": [ + "47299336251602a0" + ], + "x": 815, + "y": 2860, + "wires": [] + }, { "id": "4b6949f18173593d", "type": "function", @@ -31269,33 +31299,6 @@ ] ] }, - { - "id": "135549f560738315", - "type": "link out", - "z": "204548a488401a1b", - "name": "Score Calculation Out", - "mode": "link", - "links": [ - "fa0188b199a945d9" - ], - "x": 1320, - "y": 2680, - "wires": [], - "l": true - }, - { - "id": "18094b3bc3019c07", - "type": "link out", - "z": "204548a488401a1b", - "name": "RadioSport Activity Out", - "mode": "link", - "links": [ - "47299336251602a0" - ], - "x": 815, - "y": 2860, - "wires": [] - }, { "id": "da26fb516364abdb", "type": "ui_dropdown", @@ -31308,7 +31311,7 @@ "order": 1, "width": 6, "height": 1, - "passthru": true, + "passthru": false, "multiple": false, "options": [ { @@ -31368,10 +31371,10 @@ "type": "function", "z": "204548a488401a1b", "name": "Get Temperature Unit", - "func": "", + "func": "msg.payload=global.get('temperature_unit')\nlet x = global.get('temperature_unit')\nif (x == 'F') {\n msg.payload = 'F';\n}\nelse {\n msg.payload = 'C'\n}\nreturn msg;", "outputs": 1, "noerr": 0, - "initialize": "// Code added here will be run once\n// whenever the node is started.\nlet x = global.get('temperature_unit')\nif (x == 'F') \n{\n msg.payload = 'F';\n}\nelse \n{\n msg.payload = 'C'\n}\nreturn msg;", + "initialize": "", "finalize": "", "libs": [], "x": 1560, @@ -31734,7 +31737,7 @@ "z": "09eb64b651f58dce", "d": true, "name": "", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": false, @@ -33586,7 +33589,7 @@ "type": "debug", "z": "bd8a446b999750f9", "name": "", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": false, @@ -35488,7 +35491,7 @@ "type": "debug", "z": "2eedd966294071cc", "name": "", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": false, @@ -35872,7 +35875,7 @@ "type": "debug", "z": "2eedd966294071cc", "name": "", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": false, @@ -36857,7 +36860,7 @@ "type": "debug", "z": "3e52b5d54104d7f0", "name": "debug 5", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": false, @@ -36925,7 +36928,7 @@ "type": "debug", "z": "3e52b5d54104d7f0", "name": "debug 7", - "active": true, + "active": false, "tosidebar": true, "console": true, "tostatus": false, @@ -39769,7 +39772,7 @@ "z": "b73cc2bb5f424b69", "d": true, "name": "", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": false, @@ -40368,7 +40371,7 @@ "type": "debug", "z": "1acc5730a82cbfc7", "name": "", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": false, @@ -41052,7 +41055,7 @@ "type": "debug", "z": "1acc5730a82cbfc7", "name": "", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": false, @@ -41160,7 +41163,7 @@ "type": "debug", "z": "8a7fcbcd28d37f15", "name": "", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": true, @@ -41378,7 +41381,7 @@ "type": "debug", "z": "8a7fcbcd28d37f15", "name": "debug 1", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": false, @@ -41394,7 +41397,7 @@ "type": "debug", "z": "8a7fcbcd28d37f15", "name": "debug 2", - "active": true, + "active": false, "tosidebar": true, "console": false, "tostatus": false, diff --git a/package.json b/package.json index 10896cf..ef6f114 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,23 @@ { "name": "n1mm_dashboard", "description": "Dashboard for N1MM Contesting", - "version": "1.4.3", + "version": "1.6.0", "dependencies": { - "node-red-contrib-hourglass": "1.5.0", - "node-red-contrib-msg-speed": "2.1.0", - "node-red-contrib-play-audio": "2.5.0", - "node-red-node-ping": "0.3.3", - "node-red-node-smooth": "0.1.2", - "node-red-node-sqlite": "1.0.3", - "node-red-node-ui-table": "0.4.3", - "node-red-contrib-web-worldmap": "2.31.0", - "node-red-dashboard": "3.2.0", - "node-red-contrib-string": "1.0.0", - "node-red-contrib-ui-led": "0.4.11", - "node-red-contrib-unit-converter": "0.0.3", - "node-red-contrib-moment": "4.0.0", - "node-red-contrib-simple-gate": "0.5.2", - "node-red-contrib-projectdir": "2.0.5" + "node-red-contrib-hourglass": "*", + "node-red-contrib-msg-speed": "*", + "node-red-contrib-play-audio": "*", + "node-red-node-ping": "*", + "node-red-node-smooth": "*", + "node-red-node-sqlite": "*", + "node-red-node-ui-table": "*", + "node-red-contrib-web-worldmap": "*", + "node-red-dashboard": "*", + "node-red-contrib-string": "*", + "node-red-contrib-ui-led": "*", + "node-red-contrib-unit-converter": "*", + "node-red-contrib-moment": "*", + "node-red-contrib-simple-gate": "*", + "node-red-contrib-projectdir": "*" }, "node-red": { "settings": { From e21ce31e5ab5f999c59ed0e5e728a8a42b82adeb Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sat, 3 Jun 2023 08:25:34 -0500 Subject: [PATCH 10/22] Added FT8/FT4, JT65, PSK31, and OLIVIA with Digital Label per #62 --- flow.json | 119 +++++++++++++++++++++++++++++++++++++++++---------- package.json | 2 +- 2 files changed, 98 insertions(+), 23 deletions(-) diff --git a/flow.json b/flow.json index fa86cca..9849491 100644 --- a/flow.json +++ b/flow.json @@ -331,6 +331,10 @@ { "id": "f5f512454cd1849d", "port": 0 + }, + { + "id": "918f8c8af855b5ce", + "port": 0 } ] }, @@ -705,9 +709,7 @@ "fa0188b199a945d9" ], "x": 414, - "y": 879, - "w": 1852, - "h": 462 + "y": 879 }, { "id": "81692a3cb68d6cde", @@ -740,9 +742,7 @@ "df61b921bf703bd8" ], "x": 14, - "y": 1545.5, - "w": 2618, - "h": 1021.5 + "y": 1545.5 }, { "id": "d48758cdf0c8991d", @@ -802,9 +802,7 @@ "b5a72874a2f95ce4" ], "x": 274, - "y": 19, - "w": 2232, - "h": 802 + "y": 19 }, { "id": "f830dd821e0240f4", @@ -968,9 +966,7 @@ "8834c50bc7d9a366" ], "x": 2314, - "y": 819, - "w": 1912, - "h": 622 + "y": 819 }, { "id": "b5a72874a2f95ce4", @@ -997,9 +993,7 @@ "ae7413cce68dfffa" ], "x": 914, - "y": 79, - "w": 1032, - "h": 162 + "y": 79 }, { "id": "94f44b7ea0e29d1d", @@ -1038,9 +1032,7 @@ "0ca8c50b9058010c" ], "x": 854, - "y": 2019, - "w": 1612, - "h": 522 + "y": 2019 }, { "id": "a9afc3cb2db49407", @@ -1080,9 +1072,19 @@ "bcc4223e74a54492" ], "x": 1014, - "y": 1571.5, - "w": 1592, - "h": 449.5 + "y": 1571.5 + }, + { + "id": "70fdf3d0be199470", + "type": "junction", + "z": "bedd4acdc0e27dab", + "x": 4440, + "y": 440, + "wires": [ + [ + "918f8c8af855b5ce" + ] + ] }, { "id": "b8ba38b3.abfb98", @@ -5621,11 +5623,41 @@ "t": "eq", "v": "FM", "vt": "str" + }, + { + "t": "eq", + "v": "FT8", + "vt": "str" + }, + { + "t": "eq", + "v": "FT4", + "vt": "str" + }, + { + "t": "eq", + "v": "JT65", + "vt": "str" + }, + { + "t": "eq", + "v": "WSPR", + "vt": "str" + }, + { + "t": "eq", + "v": "OLIVIA", + "vt": "str" + }, + { + "t": "eq", + "v": "PSK31", + "vt": "str" } ], "checkall": "true", "repair": false, - "outputs": 6, + "outputs": 12, "x": 4320, "y": 320, "wires": [ @@ -5646,6 +5678,24 @@ ], [ "f5f512454cd1849d" + ], + [ + "70fdf3d0be199470" + ], + [ + "70fdf3d0be199470" + ], + [ + "70fdf3d0be199470" + ], + [ + "70fdf3d0be199470" + ], + [ + "70fdf3d0be199470" + ], + [ + "70fdf3d0be199470" ] ] }, @@ -6480,6 +6530,31 @@ ] ] }, + { + "id": "918f8c8af855b5ce", + "type": "change", + "z": "bedd4acdc0e27dab", + "name": "Label Digital", + "rules": [ + { + "t": "set", + "p": "payload.mode", + "pt": "msg", + "to": "Digitial", + "tot": "str" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 4530, + "y": 440, + "wires": [ + [] + ] + }, { "id": "0178697fb442d801", "type": "udp in", diff --git a/package.json b/package.json index ef6f114..a2c0592 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "n1mm_dashboard", "description": "Dashboard for N1MM Contesting", - "version": "1.6.0", + "version": "1.6.1", "dependencies": { "node-red-contrib-hourglass": "*", "node-red-contrib-msg-speed": "*", From f4260b1b25cd0a4355c9111c458486924d6f85e0 Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sat, 3 Jun 2023 08:50:07 -0500 Subject: [PATCH 11/22] Add Contribute Doc and PR template. --- .github/pull_request_template.md | 36 +++++++ docs/CONTRIBUTE.md | 166 +++++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 .github/pull_request_template.md create mode 100644 docs/CONTRIBUTE.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..5b34a18 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,36 @@ +# Description + +Please include a summary of the changes and the related issue. Please also include relevant motivation and context. List any dependencies that are required for this change. Please feel free to add pictures of the flow/dashboard(if applicable). + +Fixes # (issue) + +## Type of change + +Please delete options that are not relevant. + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] This change requires a documentation update + +# How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration. Feel free to add pictures if needed. + +- [ ] Test A +- [ ] Test B + +**Test Configuration**: +* Node Version: +* OS: +* Node-Red Version: + +# Checklist: + +- [ ] My flow change follow the style/s of this project +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new errors +- [ ] I have completed tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes +- [ ] Any dependent changes have been merged and published in downstream modules \ No newline at end of file diff --git a/docs/CONTRIBUTE.md b/docs/CONTRIBUTE.md new file mode 100644 index 0000000..1890359 --- /dev/null +++ b/docs/CONTRIBUTE.md @@ -0,0 +1,166 @@ +# Instructions for Contributors and Maintainers + +Here's a checklist for Contributors and Maintainers, using [Github workflow](https://guides.github.com/introduction/flow/). +The examples all assume you've [added a github ssh key](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account). + + + + + + +- [Instructions for Contributors and Maintainers](#instructions-for-contributors-and-maintainers) + - [Contributors and Maintainers Defined](#contributors-and-maintainers-defined) + - [Fork the repo](#fork-the-repo) + - [Add a ref to the upstream repo](#add-a-ref-to-the-upstream-repo) + - [Make a feature branch](#make-a-feature-branch) + - [Make your changes](#make-your-changes) + - [Commit your changes and push to your repo](#commit-your-changes-and-push-to-your-repo) + - [Submit a Pull Request](#submit-a-pull-request) + - [Maintainer Only: Review and Merge Pull Request](#maintainer-only-review-and-merge-pull-request) + + + +## Contributors and Maintainers Defined + +Anybody can be a *Contributor*. Follow the next steps to fork the repo, make a feature branch and submit a pull request (PR). + +*Maintainers* have permissions to review and merge PRs into the master branch and to publish to the release branch. + +## Fork the repo + +If you are new to maintaining the docs, perform this one-time task: + +Fork your own copy of the repo. In the examples below, I call it `my-repo`. + +Go to https://github.com/kylekrieg/Node-Red-Contesting-Dashboard and click Fork. + +Once you've forked it, you can clone it locally to your desktop, following the instructions provided. + +```text +$ git clone git@github.com:myname/Node-Red-Contesting-Dashboard.git my-repo +$ cd my-repo +``` + +Your clone of the repo will have the default remote name of `origin`. + +```text +$ git remote -v +origin git@github.com:myname/examtools-docs.git (fetch) +origin git@github.com:myname/examtools-docs.git (push) +``` + +## Add a ref to the upstream repo + +Add a reference to upstream so you can keep your fork in sync. + +```text +$ git remote add upstream git@github.com:kylekrieg/Node-Red-Contesting-Dashboard.git +$ git remote -v +origin git@github.com:myname/Node-Red-Contesting-Dashboard.git (fetch) +origin git@github.com:myname/Node-Red-Contesting-Dashboard.git (push) +upstream git@github.com:kylekrieg/Node-Red-Contesting-Dashboard.git (fetch) +upstream git@github.com:kylekrieg/Node-Red-Contesting-Dashboard.git (push) +``` + +Any time you want to get up-to-date with the latest changes, `git pull upstream master`: + +```text +$ git checkout master +$ git pull upstream master +remote: Enumerating objects: 1, done. +remote: Counting objects: 100% (1/1), done. +remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 +Unpacking objects: 100% (1/1), done. +From github.com:kylekrieg/Node-Red-Contesting-Dashboard + * branch master -> FETCH_HEAD + 03a0672..fca28f5 master -> upstream/master +Updating 03a0672..fca28f5 +Fast-forward + flow.json | 2 -- + 1 file changed, 2 deletions(-) +``` + +To keep your fork of the repo current, you can push to it (note that the first time you use this shortcut flavor +of `git push` you'll be prompted to do a longer command: `git push --set-upstream origin master`. +From then on just `git push` pushes to your repo). + +```text +$ git push +Total 0 (delta 0), reused 0 (delta 0) +To github.com:myname/Node-Red-Contesting-Dashboard.git + 03a0672..fca28f5 master -> master +``` + +## Make a feature branch + +Now that your fork is current with the master branch, make a new feature branch to hold your changes. + +```text +$ git checkout -b my_feature +Switched to a new branch 'my_feature' +``` + +## Make your changes + +Make your changes using Node-Red Editor. + +## Commit your changes and push to your repo + +```text +$ git status +On branch my_feature +Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git restore ..." to discard changes in working directory) + modified: flow.json + +no changes added to commit (use "git add" and/or "git commit -a") +$ git add _index.md +$ git commit -m 'a useful short description here' +[my_feature 7701f9c] a useful short description here + 1 file changed, 37 insertions(+), 34 deletions(-) +$ git push +fatal: The current branch my_feature has no upstream branch. +To push the current branch and set the remote as upstream, use + + git push --set-upstream origin my_feature +$ git push --set-upstream origin my_feature +Enumerating objects: 13, done. +Counting objects: 100% (13/13), done. +Delta compression using up to 8 threads +Compressing objects: 100% (6/6), done. +Writing objects: 100% (7/7), 1.82 KiB | 1.82 MiB/s, done. +Total 7 (delta 3), reused 0 (delta 0) +remote: Resolving deltas: 100% (3/3), completed with 3 local objects. +To github.com:myname/Node-Red-Contesting-Dashboard.git + 700e65d..7701f9c my_feature -> my_feature +Enumerating objects: 11, done. +Counting objects: 100% (11/11), done. +Delta compression using up to 8 threads +Compressing objects: 100% (6/6), done. +Writing objects: 100% (6/6), 1.30 KiB | 1.30 MiB/s, done. +Total 6 (delta 2), reused 0 (delta 0) +remote: Resolving deltas: 100% (2/2), completed with 2 local objects. +remote: +remote: Create a pull request for 'my_feature' on GitHub by visiting: +remote: https://github.com/myname/Node-Red-Contesting-Dashboard/pull/new/my_feature +remote: +To github.com:myname/Node-Red-Contesting-Dashboard.git + * [new branch] my_feature -> my_feature +Branch 'my_feature' set up to track remote branch 'my_feature' from 'origin'. +``` + +## Submit a Pull Request + +Now go to the above URL in your browser and you can submit a PR. + +You can now create a Pull Request (PR) which submits your edit to the main project: + +At this point, if you are happy with your changes, the ball is in the court of the Node-Red-Contesting-Dashboard maintainers. They'll be notified of the PR and will either merge and deploy it or ask you for some further edits. + +In the latter case, or if you discover that you didn't edit it quite right and need to tweak your changes, +you can edit some more and submit another commit on the same branch. + +## Maintainer Only: Review and Merge Pull Request + +As a maintainer you can review the PR, request changes, approve, etc. and then merge it to master. From 5683d4d1e11d1f0db03e97d60ba39d515f892eaa Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sat, 3 Jun 2023 08:52:28 -0500 Subject: [PATCH 12/22] Update gitignore with non needed files. --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3c9c01a..d99f66a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ -*.backup \ No newline at end of file +*.backup +uibuilder/node_modules +package-lock.json +node_modules + From ed9b5e4d83c5aee00147e08841caf4ef11f5a38c Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sun, 18 Jun 2023 11:56:34 -0500 Subject: [PATCH 13/22] Documentation for config page. --- docs/DESCRIPTION.md | 0 pics/config&Reset/Exchange.png | Bin 0 -> 25801 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/DESCRIPTION.md create mode 100644 pics/config&Reset/Exchange.png diff --git a/docs/DESCRIPTION.md b/docs/DESCRIPTION.md new file mode 100644 index 0000000..e69de29 diff --git a/pics/config&Reset/Exchange.png b/pics/config&Reset/Exchange.png new file mode 100644 index 0000000000000000000000000000000000000000..289652356f86bec1078c6a277ef15c31fe3ff362 GIT binary patch literal 25801 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 Date: Sun, 18 Jun 2023 13:19:28 -0500 Subject: [PATCH 14/22] Documentation for config page.Forgot to save. --- docs/DESCRIPTION.md | 90 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/docs/DESCRIPTION.md b/docs/DESCRIPTION.md index e69de29..e9cb6a1 100644 --- a/docs/DESCRIPTION.md +++ b/docs/DESCRIPTION.md @@ -0,0 +1,90 @@ +## Configuration & Resets + +General Notes + +For any form, make sure to click on submit to save. Each section saves separately. + +### Cluster with Dupes +Telnet Host configuration: w3lpl.net:7373 + +### Cluster without Dupes +Telnet Host configuration: dxc.ve7cc.net:23 + +### Radio Names +Please fill in the name into the top of the form and then click the dropdown to add the PC to the Dashboard. +Note you must use the NETBIOS name from the computer. If using N1MM, head to network status for mor information. + +### Contest Configuration +#### Exchange +Below are the options that display on the main dashboard page. Please click the correct exchange. +(when in doubt use Full Exchange) + +![Exchange Category](../pics/config&Reset/Exchange.png) + +#### Category +Currently the options are the following. +SO1V - 1 VFO +SO2R - Single Op 2 Radio +Multi-Op + +#### Dashboard Rate +You can choose rather if you want the main dashboard to have the radio Qs/Hr vs operator Qs/hr. + +### Contest Callsign +You need to use the callsign that is for the contest. + +### Online Scoreboard + +#### Contest Name +To find the abbreviation for the contest online scoreboard head to https://contestonlinescore.com/settings/ + +### Announcements + +#### Say Multi On/Off + +#### Great Circle Lines On/Off + +#### Lightning Info Enable + +### Dashboard Upgrade + +#### Rolling Release + +Rolling Release is the dev branch on github. +If there is any issue with changing this, you need to use the follow command in the root folder of the node-red project. + +* `git checkout origin/dev` + +To change back use + +* `git checkout master`. + + +### Call Lookup Engine & Login + +Options are HamDB, QRZ, and HamQth. +QRZ needs an XML subscription, while HamQth does need a login. +HamDB has limited functionality (USA/VE). + +### Measurement Units + +Distance is used for mapping functions with either miles or kilometers. + +Temperature has options of Celsius or Fahrenheit. + +### Backup & Restore + +Less of an issue, the files get update automatically by node-red. + +### OP Competition Sort By + +The options to control on the Op Competition page in the NR-Contest-Dashboard are as follows: +* by QSOs +* by Score +* by Mults + +### Map Configuration + +### Radiosport.live Data + +### Database Reset From 41ae652349c16b7aaed7f7f581dedb46d682c783 Mon Sep 17 00:00:00 2001 From: AA0Z <66072956+kylekrieg@users.noreply.github.com> Date: Sun, 18 Jun 2023 14:30:32 -0500 Subject: [PATCH 15/22] Finished config doc and updated --- docs/DESCRIPTION.md | 88 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 75 insertions(+), 13 deletions(-) diff --git a/docs/DESCRIPTION.md b/docs/DESCRIPTION.md index e9cb6a1..76a571a 100644 --- a/docs/DESCRIPTION.md +++ b/docs/DESCRIPTION.md @@ -2,21 +2,29 @@ General Notes -For any form, make sure to click on submit to save. Each section saves separately. +For any form, make sure to click the submit to save. Each section saves separately. + +--- ### Cluster with Dupes Telnet Host configuration: w3lpl.net:7373 +--- + ### Cluster without Dupes Telnet Host configuration: dxc.ve7cc.net:23 +--- + ### Radio Names -Please fill in the name into the top of the form and then click the dropdown to add the PC to the Dashboard. -Note you must use the NETBIOS name from the computer. If using N1MM, head to network status for mor information. +Enter the NETBIOS name into the top of the form and click submit. Then click the dropdown to add the PC to the Dashboard (Radio1 - Radio6). +Note you must use the NETBIOS name from the logging computer that is connected to each radio. If using N1MM, head to the network status (Window drop down -> Network Status) for more NETBOIS PC information. + +--- ### Contest Configuration #### Exchange -Below are the options that display on the main dashboard page. Please click the correct exchange. +Below are the options that display on the main dashboarad page for logged QSO's. Please click the correct received exchange. (when in doubt use Full Exchange) ![Exchange Category](../pics/config&Reset/Exchange.png) @@ -27,24 +35,41 @@ SO1V - 1 VFO SO2R - Single Op 2 Radio Multi-Op +#### Contest Callsign +Enter in the callsign used for the contest. + #### Dashboard Rate -You can choose rather if you want the main dashboard to have the radio Qs/Hr vs operator Qs/hr. +You can choose if you want the main dashboard to have the radio Qs/Hr vs operator Qs/hr. + +--- + +### Cluster Login Callsign +Enter in the callsign used to log into the cluster servers. -### Contest Callsign -You need to use the callsign that is for the contest. +--- ### Online Scoreboard #### Contest Name -To find the abbreviation for the contest online scoreboard head to https://contestonlinescore.com/settings/ +Enter in the Contest ID. To find the Contest ID for the current contest go to https://contestonlinescore.com/settings/ and look up the contest name and assoicated Contest ID. + +--- ### Announcements #### Say Multi On/Off +Toggle audio on or off for announcment of a multiplier. #### Great Circle Lines On/Off +Toggle great circle lines to be drawn on/off on the main map. #### Lightning Info Enable +Toggle lightning notification on/off. Togging off to on will connect to the lighting data stream. Be aware, this data stream is every lighting strike in the world and it bandwidth heavy on the Pi. Only enable in high bandwidth settings. Toggling on to off will restart Node Red. + +### Lightning Circle (KM) +Move the slider for the dashboard to alert when lightning is detected wthin that distance. + +--- ### Dashboard Upgrade @@ -59,6 +84,7 @@ To change back use * `git checkout master`. +--- ### Call Lookup Engine & Login @@ -66,25 +92,61 @@ Options are HamDB, QRZ, and HamQth. QRZ needs an XML subscription, while HamQth does need a login. HamDB has limited functionality (USA/VE). +Enter in your username and password for the selected database and choose submit. If correct, you will receive an accepted dialog box. If not correct you will receive a wrong username/password dialog box. + +--- + ### Measurement Units -Distance is used for mapping functions with either miles or kilometers. +Choose the distance units for mapping functions. Choices are miles or kilometers. + +Temperature has options of Celsius or Fahrenheit. This is for monitoring the Raspberry Pi. -Temperature has options of Celsius or Fahrenheit. +--- ### Backup & Restore -Less of an issue, the files get update automatically by node-red. +Choose the correct operating system. Linux or Windows. + +--- ### OP Competition Sort By -The options to control on the Op Competition page in the NR-Contest-Dashboard are as follows: +The options to control on the Op Competition page are as follows: * by QSOs * by Score * by Mults +--- + ### Map Configuration +#### Home Lat & Lon +Enter in your QTH lat and lon. Click submit. You will receive a dialog box when entered in successfully. + +#### Label +Choose the type of label on each mapped QSO pin. Choices are Band Only, Band + Mode, Mode Only, Call Only. + +--- + ### Radiosport.live Data -### Database Reset +#### Send Data +Experimental, this sends dashboard data to a central server. More to come. + +#### Power +Select power used in the contest. Choices are QRP, LP, HP. + +#### Class +Select your current operating class. + +--- + +### Database Reset (IMPORTANT BEFORE EVERY CONTEST) +Click "DELETE ALL QSOS AND CLEAR STATS" before each contest to clear the database. + +"QUERY ALL CONTESTS IN DB" will display all the contest stored in the database. + +"CLEAR STATS ONLY" will only clear the current stats. + +--- From 35ca5c42e04d2bcd23474d72e95d2da3b129df3b Mon Sep 17 00:00:00 2001 From: AA0Z <66072956+kylekrieg@users.noreply.github.com> Date: Sun, 18 Jun 2023 14:47:50 -0500 Subject: [PATCH 16/22] Updated missing fields --- docs/DESCRIPTION.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/DESCRIPTION.md b/docs/DESCRIPTION.md index 76a571a..53d3c48 100644 --- a/docs/DESCRIPTION.md +++ b/docs/DESCRIPTION.md @@ -41,6 +41,8 @@ Enter in the callsign used for the contest. #### Dashboard Rate You can choose if you want the main dashboard to have the radio Qs/Hr vs operator Qs/hr. +Move the sliders for the 1HR low and high rate and 2HR low and high rate. + --- ### Cluster Login Callsign @@ -53,6 +55,8 @@ Enter in the callsign used to log into the cluster servers. #### Contest Name Enter in the Contest ID. To find the Contest ID for the current contest go to https://contestonlinescore.com/settings/ and look up the contest name and assoicated Contest ID. +Click the RESET ALL FIELDS to remove all values from the Online Scoreboard. + --- ### Announcements @@ -127,6 +131,12 @@ Enter in your QTH lat and lon. Click submit. You will receive a dialog box whe #### Label Choose the type of label on each mapped QSO pin. Choices are Band Only, Band + Mode, Mode Only, Call Only. +#### Map Labels +Toggle to see map labels on logged QSO's. + +#### TTL Value +Time (in seconds) for logged QSO's to diplay on the map. Q's made after this will drop off the map. + --- ### Radiosport.live Data From a3ace4d1f084f9b7cf42dcf67600b712cf21362e Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sun, 18 Jun 2023 14:51:01 -0500 Subject: [PATCH 17/22] v1.6.2 fix update button for future. --- flow.json | 49 ++++++++++++++++++++++++++++++++++++++----------- package.json | 2 +- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/flow.json b/flow.json index 9849491..8010cb0 100644 --- a/flow.json +++ b/flow.json @@ -709,7 +709,9 @@ "fa0188b199a945d9" ], "x": 414, - "y": 879 + "y": 879, + "w": 1852, + "h": 462 }, { "id": "81692a3cb68d6cde", @@ -742,7 +744,9 @@ "df61b921bf703bd8" ], "x": 14, - "y": 1545.5 + "y": 1545.5, + "w": 2618, + "h": 1021.5 }, { "id": "d48758cdf0c8991d", @@ -802,7 +806,9 @@ "b5a72874a2f95ce4" ], "x": 274, - "y": 19 + "y": 19, + "w": 2232, + "h": 802 }, { "id": "f830dd821e0240f4", @@ -966,7 +972,9 @@ "8834c50bc7d9a366" ], "x": 2314, - "y": 819 + "y": 819, + "w": 1912, + "h": 622 }, { "id": "b5a72874a2f95ce4", @@ -993,7 +1001,9 @@ "ae7413cce68dfffa" ], "x": 914, - "y": 79 + "y": 79, + "w": 1032, + "h": 162 }, { "id": "94f44b7ea0e29d1d", @@ -1032,7 +1042,9 @@ "0ca8c50b9058010c" ], "x": 854, - "y": 2019 + "y": 2019, + "w": 1612, + "h": 522 }, { "id": "a9afc3cb2db49407", @@ -1072,7 +1084,9 @@ "bcc4223e74a54492" ], "x": 1014, - "y": 1571.5 + "y": 1571.5, + "w": 1592, + "h": 449.5 }, { "id": "70fdf3d0be199470", @@ -30232,7 +30246,7 @@ "fieldType": "msg", "format": "handlebars", "syntax": "mustache", - "template": "cd {{{projectdir}}} && git checkout {{{global.branch}}}", + "template": "cd {{{projectdir}}} && git restore flow.json && git checkout -b {{{global.branch}}} || git checkout {{{global.branch}}}", "output": "str", "x": 360, "y": 3360, @@ -30285,7 +30299,7 @@ "y": 3300, "wires": [ [ - "1ac8dad20963d18a" + "be09ec735035e01a" ], [ "5f7e1de47f37afaf" @@ -31460,6 +31474,19 @@ ] ] }, + { + "id": "be09ec735035e01a", + "type": "projectdir", + "z": "204548a488401a1b", + "name": "", + "x": 180, + "y": 3360, + "wires": [ + [ + "1ac8dad20963d18a" + ] + ] + }, { "id": "b8502660ecb5eb37", "type": "inject", @@ -36988,7 +37015,7 @@ "fieldType": "msg", "format": "handlebars", "syntax": "mustache", - "template": "cd {{projectdir}} && git restore flow.json && git pull origin {{global.branch}} ", + "template": "cd {{projectdir}} && git restore flow.json && git pull {{global.branch}} ", "output": "str", "x": 1030, "y": 780, @@ -37003,7 +37030,7 @@ "type": "debug", "z": "3e52b5d54104d7f0", "name": "debug 7", - "active": false, + "active": true, "tosidebar": true, "console": true, "tostatus": false, diff --git a/package.json b/package.json index a2c0592..b8b3835 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "n1mm_dashboard", "description": "Dashboard for N1MM Contesting", - "version": "1.6.1", + "version": "1.6.2", "dependencies": { "node-red-contrib-hourglass": "*", "node-red-contrib-msg-speed": "*", From ccd0bd9222ae2f3a10c8bb8a8ef9166dc092297d Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sun, 18 Jun 2023 15:05:28 -0500 Subject: [PATCH 18/22] v1.6.3 replace upgrade with script. --- flow.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flow.json b/flow.json index 8010cb0..c9f369b 100644 --- a/flow.json +++ b/flow.json @@ -37015,7 +37015,7 @@ "fieldType": "msg", "format": "handlebars", "syntax": "mustache", - "template": "cd {{projectdir}} && git restore flow.json && git pull {{global.branch}} ", + "template": "bash <(curl -sL https://contesting.nodered.kd9lsv.me) < Date: Sun, 18 Jun 2023 15:07:57 -0500 Subject: [PATCH 19/22] Spelling errors --- docs/DESCRIPTION.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/DESCRIPTION.md b/docs/DESCRIPTION.md index 53d3c48..80197a7 100644 --- a/docs/DESCRIPTION.md +++ b/docs/DESCRIPTION.md @@ -160,3 +160,5 @@ Click "DELETE ALL QSOS AND CLEAR STATS" before each contest to clear the databas "CLEAR STATS ONLY" will only clear the current stats. --- + +KK - 20230618 From 5d3d93f0cead9126eff6229321d3bfbf6995d98a Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sun, 18 Jun 2023 15:41:03 -0500 Subject: [PATCH 20/22] Fix for Script input --- flow.json | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/flow.json b/flow.json index c9f369b..0e9a00f 100644 --- a/flow.json +++ b/flow.json @@ -709,9 +709,7 @@ "fa0188b199a945d9" ], "x": 414, - "y": 879, - "w": 1852, - "h": 462 + "y": 879 }, { "id": "81692a3cb68d6cde", @@ -744,9 +742,7 @@ "df61b921bf703bd8" ], "x": 14, - "y": 1545.5, - "w": 2618, - "h": 1021.5 + "y": 1545.5 }, { "id": "d48758cdf0c8991d", @@ -806,9 +802,7 @@ "b5a72874a2f95ce4" ], "x": 274, - "y": 19, - "w": 2232, - "h": 802 + "y": 19 }, { "id": "f830dd821e0240f4", @@ -972,9 +966,7 @@ "8834c50bc7d9a366" ], "x": 2314, - "y": 819, - "w": 1912, - "h": 622 + "y": 819 }, { "id": "b5a72874a2f95ce4", @@ -1001,9 +993,7 @@ "ae7413cce68dfffa" ], "x": 914, - "y": 79, - "w": 1032, - "h": 162 + "y": 79 }, { "id": "94f44b7ea0e29d1d", @@ -1042,9 +1032,7 @@ "0ca8c50b9058010c" ], "x": 854, - "y": 2019, - "w": 1612, - "h": 522 + "y": 2019 }, { "id": "a9afc3cb2db49407", @@ -1084,9 +1072,7 @@ "bcc4223e74a54492" ], "x": 1014, - "y": 1571.5, - "w": 1592, - "h": 449.5 + "y": 1571.5 }, { "id": "70fdf3d0be199470", @@ -37015,7 +37001,7 @@ "fieldType": "msg", "format": "handlebars", "syntax": "mustache", - "template": "bash <(curl -sL https://contesting.nodered.kd9lsv.me) < Date: Sun, 18 Jun 2023 15:43:28 -0500 Subject: [PATCH 21/22] v1.6.4 config docs --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index cd6f0e5..d770b52 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "n1mm_dashboard", "description": "Dashboard for N1MM Contesting", - "version": "1.6.3", + "version": "1.6.4", "dependencies": { "node-red-contrib-hourglass": "*", "node-red-contrib-msg-speed": "*", @@ -25,4 +25,4 @@ "credentialsFile": "flow_cred.json" } } -} \ No newline at end of file +} From 968b1611033b51e0dbf9da5bad88c8ee44267c8b Mon Sep 17 00:00:00 2001 From: kd9lsv Date: Sun, 18 Jun 2023 15:52:32 -0500 Subject: [PATCH 22/22] disable update button --- flow.json | 32 ++++++++++++++++++++++---------- package.json | 2 +- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/flow.json b/flow.json index 0e9a00f..1fa47f5 100644 --- a/flow.json +++ b/flow.json @@ -709,7 +709,9 @@ "fa0188b199a945d9" ], "x": 414, - "y": 879 + "y": 879, + "w": 1852, + "h": 462 }, { "id": "81692a3cb68d6cde", @@ -742,7 +744,9 @@ "df61b921bf703bd8" ], "x": 14, - "y": 1545.5 + "y": 1545.5, + "w": 2618, + "h": 1021.5 }, { "id": "d48758cdf0c8991d", @@ -802,7 +806,9 @@ "b5a72874a2f95ce4" ], "x": 274, - "y": 19 + "y": 19, + "w": 2232, + "h": 802 }, { "id": "f830dd821e0240f4", @@ -966,7 +972,9 @@ "8834c50bc7d9a366" ], "x": 2314, - "y": 819 + "y": 819, + "w": 1912, + "h": 622 }, { "id": "b5a72874a2f95ce4", @@ -993,7 +1001,9 @@ "ae7413cce68dfffa" ], "x": 914, - "y": 79 + "y": 79, + "w": 1032, + "h": 162 }, { "id": "94f44b7ea0e29d1d", @@ -1032,7 +1042,9 @@ "0ca8c50b9058010c" ], "x": 854, - "y": 2019 + "y": 2019, + "w": 1612, + "h": 522 }, { "id": "a9afc3cb2db49407", @@ -1072,7 +1084,9 @@ "bcc4223e74a54492" ], "x": 1014, - "y": 1571.5 + "y": 1571.5, + "w": 1592, + "h": 449.5 }, { "id": "70fdf3d0be199470", @@ -36456,9 +36470,7 @@ "x": 300, "y": 780, "wires": [ - [ - "b7489dd59685c7a3" - ] + [] ] }, { diff --git a/package.json b/package.json index d770b52..299d10b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "n1mm_dashboard", "description": "Dashboard for N1MM Contesting", - "version": "1.6.4", + "version": "1.6.5", "dependencies": { "node-red-contrib-hourglass": "*", "node-red-contrib-msg-speed": "*",