diff --git a/flows/main.json b/flows/main.json
index 65ba76b..63a52e5 100644
--- a/flows/main.json
+++ b/flows/main.json
@@ -953,6 +953,280 @@
"width": 8,
"height": 1
},
+ {
+ "id": "6465bdd5.15eb8c",
+ "type": "file in",
+ "z": "1c24ad9c.bebec2",
+ "name": "",
+ "filename": "/home/pi/PlanktoScope/config.json",
+ "format": "utf8",
+ "chunk": false,
+ "sendError": false,
+ "encoding": "none",
+ "x": 480,
+ "y": 60,
+ "wires": [
+ [
+ "15ceb135.6628bf"
+ ]
+ ],
+ "info": "# PlanktoScope Help\nThis Node will read the content of the file named **config.txt** containing all the input placeholders.\n"
+ },
+ {
+ "id": "15ceb135.6628bf",
+ "type": "json",
+ "z": "1c24ad9c.bebec2",
+ "name": "config.json",
+ "property": "payload",
+ "action": "",
+ "pretty": false,
+ "x": 730,
+ "y": 60,
+ "wires": [
+ [
+ "ad541674.4791c8"
+ ]
+ ]
+ },
+ {
+ "id": "7205d267.36adcc",
+ "type": "file",
+ "z": "1c24ad9c.bebec2",
+ "name": "",
+ "filename": "/home/pi/PlanktoScope/config.json",
+ "appendNewline": true,
+ "createDir": true,
+ "overwriteFile": "true",
+ "encoding": "none",
+ "x": 990,
+ "y": 160,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "2e6ddf51.c0dba",
+ "type": "json",
+ "z": "1c24ad9c.bebec2",
+ "name": "config.json",
+ "property": "payload",
+ "action": "str",
+ "pretty": true,
+ "x": 730,
+ "y": 160,
+ "wires": [
+ [
+ "7205d267.36adcc"
+ ]
+ ]
+ },
+ {
+ "id": "ad541674.4791c8",
+ "type": "function",
+ "z": "1c24ad9c.bebec2",
+ "name": "Global Set",
+ "func": "global.set(\"config_keys\", Object.keys(msg.payload));\n\nfor (const key in msg.payload) {\n global.set(key, msg.payload[key]);\n}\n\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 910,
+ "y": 60,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "3e9a33c.141384c",
+ "type": "inject",
+ "z": "1c24ad9c.bebec2",
+ "name": "Load config",
+ "props": [
+ {
+ "p": "topic",
+ "vt": "str"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": 0.1,
+ "topic": "",
+ "payloadType": "str",
+ "x": 230,
+ "y": 60,
+ "wires": [
+ [
+ "6465bdd5.15eb8c"
+ ]
+ ]
+ },
+ {
+ "id": "3ad9835.08c937c",
+ "type": "function",
+ "z": "1c24ad9c.bebec2",
+ "name": "get config payload",
+ "func": "keys = global.get(\"config_keys\")\n\nvar payload = {}\n\nkeys.forEach(function(item, index, array) {\n payload[item] = global.get(item);\n})\n\nreturn {\"payload\": payload};",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 410,
+ "y": 160,
+ "wires": [
+ [
+ "2e6ddf51.c0dba"
+ ]
+ ]
+ },
+ {
+ "id": "f439663c.8abd3",
+ "type": "ui_ui_control",
+ "z": "1c24ad9c.bebec2",
+ "name": "Connect Event",
+ "events": "connect",
+ "x": 900,
+ "y": 100,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "1f63860d.5f5efa",
+ "type": "file in",
+ "z": "4ed26b8b.253504",
+ "name": "",
+ "filename": "/home/pi/PlanktoScope/hardware.json",
+ "format": "utf8",
+ "chunk": false,
+ "sendError": false,
+ "encoding": "none",
+ "x": 380,
+ "y": 80,
+ "wires": [
+ [
+ "8c1fda48.d7d828"
+ ]
+ ],
+ "info": "# PlanktoScope Help\nThis Node will read the content of the file named **config.txt** containing all the input placeholders.\n"
+ },
+ {
+ "id": "8c1fda48.d7d828",
+ "type": "json",
+ "z": "4ed26b8b.253504",
+ "name": "Parse JSON",
+ "property": "payload",
+ "action": "",
+ "pretty": false,
+ "x": 650,
+ "y": 80,
+ "wires": [
+ [
+ "ddb4b136.fc0b78"
+ ]
+ ]
+ },
+ {
+ "id": "82099021.9ceb08",
+ "type": "file",
+ "z": "4ed26b8b.253504",
+ "name": "",
+ "filename": "/home/pi/PlanktoScope/hardware.json",
+ "appendNewline": true,
+ "createDir": true,
+ "overwriteFile": "true",
+ "encoding": "none",
+ "x": 780,
+ "y": 200,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "bb0a8725.a1849",
+ "type": "json",
+ "z": "4ed26b8b.253504",
+ "name": "Create JSON",
+ "property": "payload",
+ "action": "str",
+ "pretty": true,
+ "x": 500,
+ "y": 200,
+ "wires": [
+ [
+ "82099021.9ceb08"
+ ]
+ ]
+ },
+ {
+ "id": "f748d952.4b6bc8",
+ "type": "inject",
+ "z": "4ed26b8b.253504",
+ "name": "Load config",
+ "props": [
+ {
+ "p": "topic",
+ "vt": "str"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": 0.1,
+ "topic": "",
+ "x": 110,
+ "y": 80,
+ "wires": [
+ [
+ "1f63860d.5f5efa"
+ ]
+ ]
+ },
+ {
+ "id": "ddb4b136.fc0b78",
+ "type": "change",
+ "z": "4ed26b8b.253504",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "hardware_conf",
+ "pt": "global",
+ "to": "payload",
+ "tot": "msg"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 870,
+ "y": 80,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "53d163be.47cf24",
+ "type": "function",
+ "z": "4ed26b8b.253504",
+ "name": "Update and retrieve hardware_conf",
+ "func": "// change global\nhardware_conf = global.get(\"hardware_conf\");\n\nif (msg.topic == \"process_pixel_fixed\" && msg.payload == 0){\n delete hardware_conf[msg.topic]\n delete msg.topic\n}\n\nif (msg.topic !== null && msg.topic !== undefined){\n hardware_conf[msg.topic] = msg.payload;\n global.set(\"hardware_conf\", hardware_conf);\n}\n\nreturn {\"payload\": hardware_conf};",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 240,
+ "y": 200,
+ "wires": [
+ [
+ "bb0a8725.a1849"
+ ]
+ ]
+ },
{
"id": "4e78af2d.90be7",
"type": "ui_ui_control",
@@ -965,700 +1239,6 @@
[]
]
},
- {
- "id": "9d6abe67.6bb3d",
- "type": "ui_button",
- "z": "cb95299c.2817c8",
- "name": "",
- "group": "64903b47.4034e4",
- "order": 1,
- "width": 0,
- "height": 0,
- "passthru": false,
- "label": "Home",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "home",
- "payload": "{\"tab\":\"Home\"}",
- "payloadType": "json",
- "topic": "",
- "x": 430,
- "y": 600,
- "wires": [
- [
- "f0fb77cf.8f1c28"
- ]
- ]
- },
- {
- "id": "f0fb77cf.8f1c28",
- "type": "ui_ui_control",
- "z": "cb95299c.2817c8",
- "name": "",
- "events": "change",
- "x": 740,
- "y": 600,
- "wires": [
- []
- ]
- },
- {
- "id": "2c8c45ab.610c0a",
- "type": "ui_gauge",
- "z": "1371dec5.76e671",
- "name": "",
- "group": "b5ba3f26.2e722",
- "order": 1,
- "width": 0,
- "height": 0,
- "gtype": "gage",
- "title": "CPU Temperature",
- "label": "°C",
- "format": "{{value}}",
- "min": "30",
- "max": "55",
- "colors": [
- "#00b500",
- "#e6e600",
- "#ca3838"
- ],
- "seg1": "",
- "seg2": "",
- "x": 610,
- "y": 100,
- "wires": []
- },
- {
- "id": "ddcbbfa5.cd158",
- "type": "exec",
- "z": "1371dec5.76e671",
- "command": "vcgencmd measure_temp | tr -d \"temp=\" | tr -d \"'C\" | tr -d \"\\n\"",
- "addpay": false,
- "append": "",
- "useSpawn": "",
- "timer": "",
- "name": "RPi Temp.",
- "x": 330,
- "y": 120,
- "wires": [
- [
- "bc503fa5.f46dd",
- "2c8c45ab.610c0a",
- "cef370c7.1f7a"
- ],
- [],
- []
- ]
- },
- {
- "id": "cef370c7.1f7a",
- "type": "ui_chart",
- "z": "1371dec5.76e671",
- "name": "",
- "group": "b5ba3f26.2e722",
- "order": 2,
- "width": 0,
- "height": 0,
- "label": "",
- "chartType": "line",
- "legend": "false",
- "xformat": "HH:mm:ss",
- "interpolate": "linear",
- "nodata": "",
- "dot": false,
- "ymin": "30",
- "ymax": "70",
- "removeOlder": "20",
- "removeOlderPoints": "200",
- "removeOlderUnit": "60",
- "cutout": 0,
- "useOneColor": false,
- "useUTC": false,
- "colors": [
- "#1f77b4",
- "#aec7e8",
- "#ff7f0e",
- "#2ca02c",
- "#98df8a",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "outputs": 1,
- "useDifferentColor": false,
- "x": 570,
- "y": 140,
- "wires": [
- []
- ]
- },
- {
- "id": "55749fd8.3aca5",
- "type": "exec",
- "z": "1371dec5.76e671",
- "command": "top -d 0.5 -b -n2 | grep \"Cpu(s)\"|tail -n 1 | awk '{print $2 + $4}' | tr -d \"\\n\"",
- "addpay": false,
- "append": "",
- "useSpawn": "",
- "timer": "",
- "name": "CPU Load",
- "x": 330,
- "y": 200,
- "wires": [
- [
- "e046247c.c466e8",
- "4b2b9a70.6a9af4"
- ],
- [],
- []
- ]
- },
- {
- "id": "c2b8d8b.0d90328",
- "type": "exec",
- "z": "1371dec5.76e671",
- "command": "free | grep Mem | awk '{print 100*($2-$7)/$2}' | awk '{print int($1+0.5)}' | tr -d \"\\n\"",
- "addpay": false,
- "append": "",
- "useSpawn": "",
- "timer": "",
- "name": "Free Memory",
- "x": 330,
- "y": 280,
- "wires": [
- [
- "e84f6e08.5d147",
- "c7c8d192.3df27"
- ],
- [],
- []
- ]
- },
- {
- "id": "e046247c.c466e8",
- "type": "ui_gauge",
- "z": "1371dec5.76e671",
- "name": "",
- "group": "3da7da8f.179606",
- "order": 1,
- "width": 0,
- "height": 0,
- "gtype": "gage",
- "title": "Processor",
- "label": "%",
- "format": "{{value}}",
- "min": 0,
- "max": "100",
- "colors": [
- "#00b500",
- "#e6e600",
- "#ca3838"
- ],
- "seg1": "",
- "seg2": "",
- "x": 580,
- "y": 180,
- "wires": []
- },
- {
- "id": "e84f6e08.5d147",
- "type": "ui_gauge",
- "z": "1371dec5.76e671",
- "name": "",
- "group": "806d69c8.67fc58",
- "order": 1,
- "width": 0,
- "height": 0,
- "gtype": "gage",
- "title": "Memory",
- "label": "%",
- "format": "{{value}}",
- "min": 0,
- "max": "100",
- "colors": [
- "#00b500",
- "#e6e600",
- "#ca3838"
- ],
- "seg1": "",
- "seg2": "",
- "x": 580,
- "y": 260,
- "wires": []
- },
- {
- "id": "3910d662.fa1f7a",
- "type": "exec",
- "z": "1371dec5.76e671",
- "command": "df -h | grep /dev/root | awk -F ' ' '{print $5}' | tr -d % | tr \"\\n$\" \"\\ \" | sed 's/,/./' | tr -d \" \"",
- "addpay": false,
- "append": "",
- "useSpawn": "",
- "timer": "",
- "name": "Disk Usage",
- "x": 330,
- "y": 360,
- "wires": [
- [
- "45e1912a.36a23",
- "84ac8611.1a6ac8",
- "eaf74a43.fa27d"
- ],
- [],
- []
- ]
- },
- {
- "id": "45e1912a.36a23",
- "type": "ui_gauge",
- "z": "1371dec5.76e671",
- "name": "",
- "group": "405183bc.d8991c",
- "order": 1,
- "width": 0,
- "height": 0,
- "gtype": "gage",
- "title": "Disk",
- "label": "%",
- "format": "{{value}}",
- "min": 0,
- "max": "100",
- "colors": [
- "#00b500",
- "#e6e600",
- "#ca3838"
- ],
- "seg1": "",
- "seg2": "",
- "x": 570,
- "y": 340,
- "wires": []
- },
- {
- "id": "4b2b9a70.6a9af4",
- "type": "ui_chart",
- "z": "1371dec5.76e671",
- "name": "",
- "group": "3da7da8f.179606",
- "order": 2,
- "width": 0,
- "height": 0,
- "label": "",
- "chartType": "line",
- "legend": "false",
- "xformat": "HH:mm:ss",
- "interpolate": "linear",
- "nodata": "",
- "dot": false,
- "ymin": "",
- "ymax": "",
- "removeOlder": "20",
- "removeOlderPoints": "",
- "removeOlderUnit": "60",
- "cutout": 0,
- "useOneColor": false,
- "colors": [
- "#1f77b4",
- "#aec7e8",
- "#ff7f0e",
- "#2ca02c",
- "#98df8a",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "outputs": 1,
- "x": 570,
- "y": 220,
- "wires": [
- []
- ]
- },
- {
- "id": "c7c8d192.3df27",
- "type": "ui_chart",
- "z": "1371dec5.76e671",
- "name": "",
- "group": "806d69c8.67fc58",
- "order": 2,
- "width": 0,
- "height": 0,
- "label": "",
- "chartType": "line",
- "legend": "false",
- "xformat": "HH:mm:ss",
- "interpolate": "linear",
- "nodata": "",
- "dot": false,
- "ymin": "0",
- "ymax": "100",
- "removeOlder": "20",
- "removeOlderPoints": "",
- "removeOlderUnit": "60",
- "cutout": 0,
- "useOneColor": false,
- "useUTC": false,
- "colors": [
- "#1f77b4",
- "#aec7e8",
- "#ff7f0e",
- "#2ca02c",
- "#98df8a",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "outputs": 1,
- "x": 570,
- "y": 300,
- "wires": [
- []
- ]
- },
- {
- "id": "84ac8611.1a6ac8",
- "type": "ui_chart",
- "z": "1371dec5.76e671",
- "name": "",
- "group": "405183bc.d8991c",
- "order": 2,
- "width": 0,
- "height": 0,
- "label": "",
- "chartType": "line",
- "legend": "false",
- "xformat": "HH:mm:ss",
- "interpolate": "linear",
- "nodata": "",
- "dot": false,
- "ymin": "0",
- "ymax": "100",
- "removeOlder": "4",
- "removeOlderPoints": "200",
- "removeOlderUnit": "3600",
- "cutout": 0,
- "useOneColor": false,
- "useUTC": false,
- "colors": [
- "#1f77b4",
- "#aec7e8",
- "#ff7f0e",
- "#2ca02c",
- "#98df8a",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "outputs": 1,
- "x": 570,
- "y": 380,
- "wires": [
- []
- ]
- },
- {
- "id": "1cd5b4c0.46af9b",
- "type": "inject",
- "z": "1371dec5.76e671",
- "name": "update: 15s",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "5",
- "crontab": "",
- "once": false,
- "onceDelay": "",
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 100,
- "y": 240,
- "wires": [
- [
- "3910d662.fa1f7a",
- "c2b8d8b.0d90328",
- "55749fd8.3aca5",
- "ddcbbfa5.cd158"
- ]
- ]
- },
- {
- "id": "8485d05.444903",
- "type": "ui_switch",
- "z": "1371dec5.76e671",
- "name": "fan_state",
- "label": "Fan",
- "tooltip": "",
- "group": "3ca00bf9.e5cac4",
- "order": 2,
- "width": 2,
- "height": 1,
- "passthru": true,
- "decouple": "false",
- "topic": "",
- "topicType": "str",
- "style": "",
- "onvalue": "on",
- "onvalueType": "str",
- "onicon": "",
- "oncolor": "",
- "offvalue": "off",
- "offvalueType": "str",
- "officon": "",
- "offcolor": "",
- "animate": true,
- "x": 880,
- "y": 40,
- "wires": [
- [
- "7fb13a4a53b612a0"
- ]
- ]
- },
- {
- "id": "2549f778.4eb828",
- "type": "python3-function",
- "z": "1371dec5.76e671",
- "name": "fan control",
- "func": "import smbus2 as smbus\n\nstate = msg[\"payload\"]\nbus = smbus.SMBus(1)\n\nDEVICE_ADDRESS = 0x0d\n# command happens twice, for reasons\nif state == \"off\":\n with smbus.SMBus(1) as bus:\n bus.write_byte_data(DEVICE_ADDRESS, 0x08, 0x00)\n bus.write_byte_data(DEVICE_ADDRESS, 0x08, 0x00)\n return msg\nif state == \"on\":\n with smbus.SMBus(1) as bus:\n bus.write_byte_data(DEVICE_ADDRESS, 0x08, 0x01)\n bus.write_byte_data(DEVICE_ADDRESS, 0x08, 0x01)\n return msg\n",
- "outputs": 1,
- "x": 1150,
- "y": 40,
- "wires": [
- [
- "e640ebb5c397f424"
- ]
- ]
- },
- {
- "id": "b7ab1ada.1f4158",
- "type": "exec",
- "z": "1371dec5.76e671",
- "command": "i2cdetect -y 1",
- "addpay": false,
- "append": "",
- "useSpawn": "false",
- "timer": "1",
- "winHide": false,
- "oldrc": false,
- "name": "i2c update",
- "x": 1440,
- "y": 40,
- "wires": [
- [],
- [],
- []
- ]
- },
- {
- "id": "bc503fa5.f46dd",
- "type": "switch",
- "z": "1371dec5.76e671",
- "name": "",
- "property": "payload",
- "propertyType": "msg",
- "rules": [
- {
- "t": "gt",
- "v": "40",
- "vt": "num"
- },
- {
- "t": "lte",
- "v": "35",
- "vt": "num"
- }
- ],
- "checkall": "true",
- "repair": false,
- "outputs": 2,
- "x": 570,
- "y": 40,
- "wires": [
- [
- "a25d6486.e1ce28"
- ],
- [
- "5d4f3e71.1bad4"
- ]
- ]
- },
- {
- "id": "5d4f3e71.1bad4",
- "type": "change",
- "z": "1371dec5.76e671",
- "name": "Set OFF",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "off",
- "tot": "str"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 720,
- "y": 60,
- "wires": [
- [
- "8485d05.444903"
- ]
- ]
- },
- {
- "id": "a25d6486.e1ce28",
- "type": "change",
- "z": "1371dec5.76e671",
- "name": "Set ON",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "on",
- "tot": "str"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 720,
- "y": 20,
- "wires": [
- [
- "8485d05.444903"
- ]
- ]
- },
- {
- "id": "6a84252a.d52a0c",
- "type": "ui_template",
- "z": "bccd1f23.87219",
- "group": "833bc5bb.217ba8",
- "name": "Stream Pi Camera",
- "order": 1,
- "width": 18,
- "height": 14,
- "format": " ",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": false,
- "templateScope": "local",
- "x": 610,
- "y": 40,
- "wires": [
- []
- ]
- },
- {
- "id": "dc48dc42.98d18",
- "type": "function",
- "z": "bccd1f23.87219",
- "name": "set global",
- "func": "global.set(msg.topic,msg.payload);",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 880,
- "y": 440,
- "wires": [
- []
- ]
- },
- {
- "id": "f59a2f0d.5e9af",
- "type": "ui_numeric",
- "z": "baa1e3d9.cb29d",
- "name": "acq_minimum_mesh",
- "label": "Min fraction size (μm)",
- "tooltip": "",
- "group": "404c301a.19c4e",
- "order": 1,
- "width": 5,
- "height": 1,
- "wrap": false,
- "passthru": true,
- "topic": "acq_minimum_mesh",
- "format": "{{value}}",
- "min": 0,
- "max": "300",
- "step": "10",
- "x": 640,
- "y": 160,
- "wires": [
- [
- "fb887036.12429"
- ]
- ]
- },
- {
- "id": "6008a8bb.259f08",
- "type": "ui_numeric",
- "z": "baa1e3d9.cb29d",
- "name": "acq_maximum_mesh",
- "label": "Max fraction size (μm)",
- "tooltip": "",
- "group": "404c301a.19c4e",
- "order": 2,
- "width": 5,
- "height": 1,
- "wrap": false,
- "passthru": true,
- "topic": "acq_maximum_mesh",
- "format": "{{value}}",
- "min": "200",
- "max": "2000",
- "step": "100",
- "x": 640,
- "y": 200,
- "wires": [
- [
- "fb887036.12429"
- ]
- ]
- },
- {
- "id": "6b34c456.83178c",
- "type": "ui_text_input",
- "z": "baa1e3d9.cb29d",
- "name": "acq_id",
- "label": "Acquisition unique ID*",
- "tooltip": "",
- "group": "4322c187.e73e5",
- "order": 1,
- "width": 5,
- "height": 1,
- "passthru": true,
- "mode": "text",
- "delay": 300,
- "topic": "acq_id",
- "x": 690,
- "y": 240,
- "wires": [
- [
- "fb887036.12429"
- ]
- ]
- },
{
"id": "7789839d.69b48c",
"type": "ui_template",
@@ -1747,81 +1327,6 @@
]
]
},
- {
- "id": "811cd88c.daf528",
- "type": "ui_button",
- "z": "bccd1f23.87219",
- "name": "down",
- "group": "fbd92986.1028c8",
- "order": 6,
- "width": 4,
- "height": 1,
- "passthru": true,
- "label": "",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "fa-angle-double-down fa-3x",
- "payload": "DOWN",
- "payloadType": "str",
- "topic": "actuator/focus",
- "x": 550,
- "y": 800,
- "wires": [
- [
- "65ad39d.b6d4d48"
- ]
- ]
- },
- {
- "id": "edda4df4.76de2",
- "type": "ui_button",
- "z": "bccd1f23.87219",
- "name": "up",
- "group": "fbd92986.1028c8",
- "order": 3,
- "width": 4,
- "height": 1,
- "passthru": false,
- "label": "",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "fa-angle-double-up fa-3x",
- "payload": "UP",
- "payloadType": "str",
- "topic": "actuator/focus",
- "x": 550,
- "y": 760,
- "wires": [
- [
- "65ad39d.b6d4d48"
- ]
- ]
- },
- {
- "id": "68962547.34a67c",
- "type": "ui_text_input",
- "z": "bccd1f23.87219",
- "name": "pump_manual_volume",
- "label": "Volume to pass (ml)",
- "tooltip": "Tiny values are accepted down to 0.001mL",
- "group": "707d9797.c8e798",
- "order": 3,
- "width": 2,
- "height": 1,
- "passthru": true,
- "mode": "text",
- "delay": "0",
- "topic": "pump_manual_volume",
- "x": 610,
- "y": 420,
- "wires": [
- [
- "dc48dc42.98d18"
- ]
- ]
- },
{
"id": "c1b1469.9650eb8",
"type": "ui_template",
@@ -1866,6 +1371,295 @@
]
]
},
+ {
+ "id": "dab82064.26a8d",
+ "type": "ui_button",
+ "z": "eaae323a.31b3",
+ "name": "Unlock button",
+ "group": "f3ca28ef.4df0a8",
+ "order": 2,
+ "width": 0,
+ "height": 0,
+ "passthru": false,
+ "label": "Unlock button",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "",
+ "payload": "shutdown",
+ "payloadType": "flow",
+ "topic": "",
+ "x": 120,
+ "y": 380,
+ "wires": [
+ [
+ "6c3a3b4.78cad44"
+ ]
+ ]
+ },
+ {
+ "id": "1c658761.b852a1",
+ "type": "ui_toast",
+ "z": "eaae323a.31b3",
+ "position": "dialog",
+ "displayTime": "3",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 1,
+ "ok": "YES PLEASE",
+ "cancel": "NO!",
+ "raw": false,
+ "topic": "Are you sure?",
+ "name": "Confirmation message",
+ "x": 800,
+ "y": 380,
+ "wires": [
+ [
+ "8f1b8e23.daafe"
+ ]
+ ]
+ },
+ {
+ "id": "a48ff63f.db5e18",
+ "type": "inject",
+ "z": "eaae323a.31b3",
+ "name": "disabled",
+ "props": [
+ {
+ "p": "enabled",
+ "v": "false",
+ "vt": "bool"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": 0.1,
+ "topic": "",
+ "x": 140,
+ "y": 420,
+ "wires": [
+ [
+ "d58039a9.6e7928"
+ ]
+ ]
+ },
+ {
+ "id": "b67a7147.65fcd8",
+ "type": "ui_button",
+ "z": "eaae323a.31b3",
+ "name": "Shutdown button",
+ "group": "f3ca28ef.4df0a8",
+ "order": 4,
+ "width": 0,
+ "height": 0,
+ "passthru": false,
+ "label": "Shutdown",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "#AD1625",
+ "icon": "fa-power-off fa-2x",
+ "payload": "Do you want to turn the machine off now?",
+ "payloadType": "str",
+ "topic": "",
+ "x": 550,
+ "y": 380,
+ "wires": [
+ [
+ "1c658761.b852a1"
+ ]
+ ]
+ },
+ {
+ "id": "d58039a9.6e7928",
+ "type": "change",
+ "z": "eaae323a.31b3",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "shutdown",
+ "pt": "flow",
+ "to": "false",
+ "tot": "bool"
+ },
+ {
+ "t": "set",
+ "p": "enabled",
+ "pt": "msg",
+ "to": "shutdown",
+ "tot": "flow"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 320,
+ "y": 420,
+ "wires": [
+ [
+ "b67a7147.65fcd8"
+ ]
+ ]
+ },
+ {
+ "id": "6c3a3b4.78cad44",
+ "type": "function",
+ "z": "eaae323a.31b3",
+ "name": "Toggle",
+ "func": "flow.set(\"shutdown\", !flow.get(\"shutdown\"))\nmsg.enabled = flow.get(\"shutdown\")\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 290,
+ "y": 380,
+ "wires": [
+ [
+ "b67a7147.65fcd8"
+ ]
+ ]
+ },
+ {
+ "id": "d1153ad6.40d738",
+ "type": "ui_template",
+ "z": "eaae323a.31b3",
+ "group": "f3ca28ef.4df0a8",
+ "name": "Shutdown information",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "format": "
To prevent data corruption, please always shutdown the machine before unplugging the unit.\n \nRemember to first unlock the shutdown button.\n ",
+ "storeOutMessages": true,
+ "fwdInMessages": false,
+ "resendOnRefresh": true,
+ "templateScope": "local",
+ "x": 120,
+ "y": 320,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "e08cfcb8.2a67e8",
+ "type": "link out",
+ "z": "eaae323a.31b3",
+ "name": "Home shutdown button",
+ "links": [
+ "b81b990a.d4dca"
+ ],
+ "x": 715,
+ "y": 500,
+ "wires": []
+ },
+ {
+ "id": "ce7087fc.dcc9e8",
+ "type": "ui_toast",
+ "z": "eaae323a.31b3",
+ "position": "dialog",
+ "displayTime": "10",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 1,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "Turning off now!",
+ "name": "Shutdown message",
+ "x": 580,
+ "y": 540,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "7d1626a0.deb85",
+ "type": "change",
+ "z": "eaae323a.31b3",
+ "name": "shutdown!",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "shutdown",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 310,
+ "y": 500,
+ "wires": [
+ [
+ "e08cfcb8.2a67e8"
+ ]
+ ]
+ },
+ {
+ "id": "8f1b8e23.daafe",
+ "type": "switch",
+ "z": "eaae323a.31b3",
+ "name": "",
+ "property": "payload",
+ "propertyType": "msg",
+ "rules": [
+ {
+ "t": "eq",
+ "v": "NO!",
+ "vt": "str"
+ },
+ {
+ "t": "else"
+ }
+ ],
+ "checkall": "true",
+ "repair": false,
+ "outputs": 2,
+ "x": 150,
+ "y": 500,
+ "wires": [
+ [
+ "d58039a9.6e7928"
+ ],
+ [
+ "7d1626a0.deb85",
+ "281a56c9.ec7902"
+ ]
+ ]
+ },
+ {
+ "id": "281a56c9.ec7902",
+ "type": "change",
+ "z": "eaae323a.31b3",
+ "name": "Shutdown message",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "Please wait a minute before disconnecting the machine from its power supply!",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 340,
+ "y": 540,
+ "wires": [
+ [
+ "ce7087fc.dcc9e8"
+ ]
+ ]
+ },
{
"id": "4557d689.a4fa88",
"type": "ui_text_input",
@@ -1938,7 +1732,7 @@
"payload": "",
"topic": "sample_sampling_gear",
"topicType": "str",
- "x": 640,
+ "x": 630,
"y": 200,
"wires": [
[
@@ -1962,7 +1756,7 @@
"mode": "text",
"delay": "0",
"topic": "sample_operator",
- "x": 660,
+ "x": 650,
"y": 160,
"wires": [
[
@@ -2009,7 +1803,7 @@
"mode": "text",
"delay": "0",
"topic": "sample_id",
- "x": 680,
+ "x": 670,
"y": 120,
"wires": [
[
@@ -2033,76 +1827,6 @@
[]
]
},
- {
- "id": "cc0ca68b.4263a8",
- "type": "ui_dropdown",
- "z": "baa1e3d9.cb29d",
- "name": "acq_celltype",
- "label": "Flowcell thickness*",
- "tooltip": "",
- "place": "Select option",
- "group": "4322c187.e73e5",
- "order": 6,
- "width": 5,
- "height": 1,
- "passthru": true,
- "multiple": false,
- "options": [
- {
- "label": "200 μm µ-Slide I Luer",
- "value": 200,
- "type": "num"
- },
- {
- "label": "300 µm capillary",
- "value": 300,
- "type": "num"
- },
- {
- "label": "400 μm µ-Slide I Luer",
- "value": 400,
- "type": "num"
- },
- {
- "label": "600 μm µ-Slide I Luer",
- "value": 600,
- "type": "num"
- },
- {
- "label": "800 μm µ-Slide I Luer",
- "value": 800,
- "type": "num"
- }
- ],
- "payload": "",
- "topic": "acq_celltype",
- "topicType": "str",
- "x": 670,
- "y": 80,
- "wires": [
- [
- "fb887036.12429",
- "99b11fe4.2795d"
- ]
- ]
- },
- {
- "id": "fb887036.12429",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "set global",
- "func": "global.set(msg.topic, msg.payload);",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 920,
- "y": 220,
- "wires": [
- []
- ]
- },
{
"id": "222c851d.5d0a3a",
"type": "ui_ui_control",
@@ -2199,6 +1923,1178 @@
[]
]
},
+ {
+ "id": "16de754c.cc969b",
+ "type": "ui_button",
+ "z": "b771c342.49603",
+ "name": "",
+ "group": "5517c651.b2f668",
+ "order": 1,
+ "width": 5,
+ "height": 1,
+ "passthru": false,
+ "label": "Previous",
+ "tooltip": "",
+ "color": "#097479",
+ "bgcolor": "white",
+ "icon": "keyboard_return",
+ "payload": "{\"tab\":\"Home\"}",
+ "payloadType": "json",
+ "topic": "",
+ "x": 240,
+ "y": 880,
+ "wires": [
+ [
+ "222c851d.5d0a3a"
+ ]
+ ]
+ },
+ {
+ "id": "84f3d040.5f7ea",
+ "type": "ui_button",
+ "z": "b771c342.49603",
+ "name": "",
+ "group": "5517c651.b2f668",
+ "order": 2,
+ "width": 5,
+ "height": 1,
+ "passthru": false,
+ "label": "Continue",
+ "tooltip": "",
+ "color": "#097479",
+ "bgcolor": "white",
+ "icon": "keyboard_tab",
+ "payload": "{\"tab\":\"Home\"}",
+ "payloadType": "json",
+ "topic": "",
+ "x": 240,
+ "y": 940,
+ "wires": [
+ [
+ "986d960a.c75908"
+ ]
+ ]
+ },
+ {
+ "id": "d027a6bf.7049e8",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "get sample_projet",
+ "func": "msg.payload = msg.payload.sample_project;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 310,
+ "y": 40,
+ "wires": [
+ [
+ "9c882b37.fde668"
+ ]
+ ]
+ },
+ {
+ "id": "5a811caf.0f3144",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "get sample_ship",
+ "func": "msg.payload = msg.payload.sample_ship;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 310,
+ "y": 80,
+ "wires": [
+ [
+ "4557d689.a4fa88"
+ ]
+ ]
+ },
+ {
+ "id": "45911c98.2bd83c",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "get sample_id",
+ "func": "msg.payload = msg.payload.sample_id;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 300,
+ "y": 120,
+ "wires": [
+ [
+ "94eb4221.9b92c"
+ ]
+ ]
+ },
+ {
+ "id": "1e09a4ab.72996b",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "get sample_operator",
+ "func": "msg.payload = msg.payload.sample_operator;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 320,
+ "y": 160,
+ "wires": [
+ [
+ "82c5fc77.59c97"
+ ]
+ ]
+ },
+ {
+ "id": "a3272681.f271c8",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "get sample_sampling_gear",
+ "func": "msg.topic = \"sample_sampling_gear\"\nif (msg.payload.sample_sampling_gear === undefined){\n msg.payload = \"net\";\n}\nelse\n{\n msg.payload = msg.payload.sample_sampling_gear;\n}\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 340,
+ "y": 200,
+ "wires": [
+ [
+ "fcfc31ae.af3af"
+ ]
+ ]
+ },
+ {
+ "id": "a6907a38.f6611",
+ "type": "subflow:1c24ad9c.bebec2",
+ "z": "b771c342.49603",
+ "name": "",
+ "env": [],
+ "x": 70,
+ "y": 220,
+ "wires": [
+ [
+ "d027a6bf.7049e8",
+ "5a811caf.0f3144",
+ "45911c98.2bd83c",
+ "1e09a4ab.72996b",
+ "8dff1648.82e42",
+ "9f04c5ec.75f3d8",
+ "f408a273.4fb538",
+ "e73fd87d.d24e4",
+ "489c8e06.cc7d6",
+ "a3272681.f271c8"
+ ]
+ ]
+ },
+ {
+ "id": "e2b277c1.07283",
+ "type": "subflow:1c24ad9c.bebec2",
+ "z": "b771c342.49603",
+ "name": "",
+ "env": [],
+ "x": 690,
+ "y": 940,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "7116e906.9f50f",
+ "type": "ui_text",
+ "z": "b771c342.49603",
+ "group": "fc5e4e6f.5b1c8",
+ "order": 1,
+ "width": 10,
+ "height": 1,
+ "name": "GPS Status Display",
+ "label": "GPS Status:",
+ "format": "{{msg.payload}}",
+ "layout": "row-center",
+ "x": 730,
+ "y": 1080,
+ "wires": []
+ },
+ {
+ "id": "9c7f7fc9.c8d3a",
+ "type": "ui_text_input",
+ "z": "b771c342.49603",
+ "name": "object_depth_max",
+ "label": "Max sampling depth (m)",
+ "tooltip": "in m",
+ "group": "3e1ba03d.f01d8",
+ "order": 9,
+ "width": 5,
+ "height": 1,
+ "passthru": true,
+ "mode": "number",
+ "delay": "0",
+ "topic": "object_depth_max",
+ "x": 650,
+ "y": 240,
+ "wires": [
+ [
+ "9f501f49.45645"
+ ]
+ ]
+ },
+ {
+ "id": "317eeeb7.8d3042",
+ "type": "ui_text_input",
+ "z": "b771c342.49603",
+ "name": "object_depth_min",
+ "label": "Min sampling depth (m)",
+ "tooltip": "in m",
+ "group": "3e1ba03d.f01d8",
+ "order": 8,
+ "width": 5,
+ "height": 1,
+ "passthru": true,
+ "mode": "number",
+ "delay": "0",
+ "topic": "object_depth_min",
+ "x": 650,
+ "y": 280,
+ "wires": [
+ [
+ "9f501f49.45645"
+ ]
+ ]
+ },
+ {
+ "id": "52af9ac0.60eb24",
+ "type": "link out",
+ "z": "b771c342.49603",
+ "name": "Sample Operator",
+ "links": [
+ "35eb925e.5f8016"
+ ],
+ "x": 815,
+ "y": 160,
+ "wires": []
+ },
+ {
+ "id": "cbb123ab.fd3428",
+ "type": "ui_ui_control",
+ "z": "b771c342.49603",
+ "name": "show/hide net groups",
+ "events": "change",
+ "x": 1320,
+ "y": 300,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "642ff403.1ed91c",
+ "type": "ui_text_input",
+ "z": "b771c342.49603",
+ "name": "sample_concentrated_sample_volume",
+ "label": "Concentrated sample volume (mL)",
+ "tooltip": "Volume extracted from the net codend (in mL)",
+ "group": "3e1ba03d.f01d8",
+ "order": 12,
+ "width": 10,
+ "height": 1,
+ "passthru": true,
+ "mode": "number",
+ "delay": "0",
+ "topic": "sample_concentrated_sample_volume",
+ "topicType": "str",
+ "x": 590,
+ "y": 440,
+ "wires": [
+ [
+ "9f501f49.45645"
+ ]
+ ]
+ },
+ {
+ "id": "e967b844.46aa48",
+ "type": "ui_text_input",
+ "z": "b771c342.49603",
+ "name": "sample_gear_net_opening",
+ "label": "Net opening dimension (mm)",
+ "tooltip": "Size of the net mouth opening (in mm)",
+ "group": "cf5d9f0e.d57e7",
+ "order": 1,
+ "width": 10,
+ "height": 1,
+ "passthru": true,
+ "mode": "number",
+ "delay": "0",
+ "topic": "sample_gear_net_opening",
+ "x": 620,
+ "y": 320,
+ "wires": [
+ [
+ "9f501f49.45645"
+ ]
+ ]
+ },
+ {
+ "id": "c0ce5626.b6c5",
+ "type": "ui_toast",
+ "z": "b771c342.49603",
+ "position": "dialog",
+ "displayTime": "3",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 1,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "",
+ "name": "",
+ "x": 1230,
+ "y": 620,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "c33f1124.af6688",
+ "type": "ui_form",
+ "z": "b771c342.49603",
+ "name": "sample_location",
+ "label": "Sample Location",
+ "group": "cef1e703.bcf3c8",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "options": [
+ {
+ "label": "Latitude (36.574439°N or 36°57.4439'N)",
+ "value": "object_lat",
+ "type": "text",
+ "required": true,
+ "rows": null
+ },
+ {
+ "label": "Longitude (110.42100°W or 110°4.2100'W)",
+ "value": "object_lon",
+ "type": "text",
+ "required": true,
+ "rows": null
+ },
+ {
+ "label": "Date (YYYY-MM-DD, UTC)",
+ "value": "object_date",
+ "type": "text",
+ "required": true,
+ "rows": null
+ },
+ {
+ "label": "Time (HH:MM(:SS), UTC 24h)",
+ "value": "object_time",
+ "type": "text",
+ "required": true,
+ "rows": null
+ }
+ ],
+ "formValue": {
+ "object_lat": "",
+ "object_lon": "",
+ "object_date": "",
+ "object_time": ""
+ },
+ "payload": "",
+ "submit": "Validate",
+ "cancel": "Reset",
+ "topic": "sample_location",
+ "x": 660,
+ "y": 580,
+ "wires": [
+ [
+ "14658615.47c862"
+ ]
+ ]
+ },
+ {
+ "id": "358908cd.416ab",
+ "type": "ui_form",
+ "z": "b771c342.49603",
+ "name": "net_throw_location",
+ "label": "Net Throw Location",
+ "group": "cf5d9f0e.d57e7",
+ "order": 4,
+ "width": 0,
+ "height": 0,
+ "options": [
+ {
+ "label": "Latitude (36.574439°N or 36°57.4439'N)",
+ "value": "object_lat",
+ "type": "text",
+ "required": true,
+ "rows": null
+ },
+ {
+ "label": "Longitude (110.42100°W or 110°4.2100'W)",
+ "value": "object_lon",
+ "type": "text",
+ "required": true,
+ "rows": null
+ },
+ {
+ "label": "Date (YYYY-MM-DD UTC)",
+ "value": "object_date",
+ "type": "text",
+ "required": true,
+ "rows": null
+ },
+ {
+ "label": "Time (HH:MM, UTC 24h)",
+ "value": "object_time",
+ "type": "text",
+ "required": true,
+ "rows": null
+ }
+ ],
+ "formValue": {
+ "object_lat": "",
+ "object_lon": "",
+ "object_date": "",
+ "object_time": ""
+ },
+ "payload": "",
+ "submit": "Validate",
+ "cancel": "",
+ "topic": "net_throw_location",
+ "topicType": "str",
+ "splitLayout": false,
+ "x": 650,
+ "y": 620,
+ "wires": [
+ [
+ "14658615.47c862"
+ ]
+ ]
+ },
+ {
+ "id": "56d40584.eff4e4",
+ "type": "ui_form",
+ "z": "b771c342.49603",
+ "name": "net_retrieval_location",
+ "label": "Net Retrieval Location",
+ "group": "cf5d9f0e.d57e7",
+ "order": 5,
+ "width": 0,
+ "height": 0,
+ "options": [
+ {
+ "label": "Latitude (36.574439°N or 36°57.4439'N)",
+ "value": "object_lat_end",
+ "type": "text",
+ "required": true,
+ "rows": null
+ },
+ {
+ "label": "Longitude (110.42100°W or 110°4.2100'W)",
+ "value": "object_lon_end",
+ "type": "text",
+ "required": true,
+ "rows": null
+ },
+ {
+ "label": "Date (YYYY-MM-DD UTC)",
+ "value": "object_date_end",
+ "type": "text",
+ "required": true,
+ "rows": null
+ },
+ {
+ "label": "Time (HH:MM, UTC 24h)",
+ "value": "object_time_end",
+ "type": "text",
+ "required": true,
+ "rows": null
+ }
+ ],
+ "formValue": {
+ "object_lat_end": "",
+ "object_lon_end": "",
+ "object_date_end": "",
+ "object_time_end": ""
+ },
+ "payload": "",
+ "submit": "Validate",
+ "cancel": "",
+ "topic": "net_retrieval_location",
+ "topicType": "str",
+ "splitLayout": false,
+ "x": 640,
+ "y": 660,
+ "wires": [
+ [
+ "14658615.47c862"
+ ]
+ ]
+ },
+ {
+ "id": "14658615.47c862",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "Validate Location / Timestamp",
+ "func": "function ConvertDDMMToDD(input) {\n // Input Format 36°57.4439'N, 110°4.2100'W\n // From https://stackoverflow.com/questions/1140189/converting-latitude-and-longitude-to-decimal-values\n if (!input.match(/\\d+°\\d+\\.*\\d*\\'[NSEW]/)){\n \treturn \"parsing error\"\n }\n var parts = input.split(/[^\\d.\\w]+/)\n if (parts.length != 3){\n \treturn \"parsing error\"\n }\n var dd = Number(parts[0]) + Number(parts[1])/60\n return dd.toFixed(6) + parts[2]\n}\n\nfunction ValidateCoordinates(input, lat){\n // Input Format 36.574439°N, 110.42100°W\n // Or 36°57.4439'N, 110°4.2100'W\n if (input.match(\"'\")){\n input = ConvertDDMMToDD(input)\n }\n \n var error = {}\n\n if (input.startsWith(\"parsing error\")){\n error.topic = \"Error with the \"\n error.payload = \"You need to respect the format example, 36.574439°N or 36°57.4439'N\"\n return [null, error]\n }\n \n var direction = input.match(/[NSEW]/)\n var position = input.match(/[\\+\\-\\d\\.]+/)\n \n if (direction === null){\n error.topic = \"Error with the \"\n error.payload = \"You need to explicitely enter N/S/E/W\"\n return [null, error]\n }\n \n // Test that position is only made of digits!\n if(/^[\\+\\-]/.test(position)){\n error.topic = \"Error with the \"\n error.payload = \"Use of +/- sign is inconsistent with N/S/E/W letter! Please only use N/S/E/W!\"\n return [null, error]\n }\n \n var dd = Number(position)\n if (lat){\n // Check latitude\n if (direction == \"S\" || direction == \"N\") {\n if (dd>90.0){\n error.topic = \"Error with the \"\n error.payload = \"Latitude is more than 90°\"\n return [null, error]\n }\n }\n if (direction == \"W\" || direction == \"E\") {\n error.topic = \"Error with the \"\n error.payload = \"This is not a Latitude!\"\n return [null, error]\n }\n }\n else{\n // Check longitude\n if (direction == \"W\" || direction == \"E\") {\n if (dd>180.0){\n error.topic = \"Error with the \"\n error.payload = \"Longitude is more than 180°\"\n return [null, error]\n }\n }\n if (direction == \"N\" || direction == \"S\") {\n error.topic = \"Error with the \"\n error.payload = \"This is not a Longitude!\"\n return [null, error]\n }\n }\n \n if (direction == \"S\" || direction == \"W\") {\n dd = dd * -1\n } // Don't do anything for N or E\n return [dd.toFixed(4), null]\n \n}\n\nfunction ValidateDate(input){\n // Input Format 2020-12-25\n var error = {};\n \n if (! /20\\d{2}-[0-1]\\d-[0-3]\\d/.test(input)){\n error.topic = \"Error with the date\";\n error.payload = \"The date should respect the ISO format YYYY-MM-DD\";\n return [null, error];\n }\n else {\n var date = input.match(/\\d+/g);\n if (!((2000 < date[0]) && (date[0] < 2100))){\n error.topic = \"Error with the date\"\n error.payload = \"The year should be between 2000 and 2100\"\n return [null, error]\n }\n else if (!((0 < date[1]) && (date[1] <= 12))){\n error.topic = \"Error with the date\"\n error.payload = \"The month should be between 01 and 12\"\n return [null, error]\n }\n else if (!((0 < date[2]) && (date[2] <= 31))){\n error.topic = \"Error with the date\"\n error.payload = \"The day should be between 01 and 31\"\n return [null, error]\n }\n }\n return [input.replace(/-/g, ''), null]\n}\n\nfunction ValidateTime(input){\n // Input Format 12:00\n var error = {}\n \n if (! /[0-2]?\\d:[0-5]\\d/.test(input)){\n error.topic = \"Error with the time\"\n error.payload = \"The date should respect the ISO format HH:MM\"\n return [null, error]\n }\n else {\n var time = input.match(/\\d+/g)\n \n if (!((0 <= time[0]) && (time[0] < 24))){\n error.topic = \"Error with the time\"\n error.payload = \"The hours should be 0 and 23.\"\n return [null, error]\n }\n else if (!((0 <= time[1]) && (time[1] < 60))){\n error.topic = \"Error with the time\"\n error.payload = \"The minutes should be between 0 and 59\"\n return [null, error]\n }\n }\n return [input.replace(/:/g, ''), null]\n}\n\n\nvar ret\nvar payload_for_form = {payload:{}}\nmsg.valid = false\n\nif (msg.topic == \"net_retrieval_location\"){\n ret = ValidateCoordinates(msg.payload.object_lat_end, true);\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" Latitude\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_lat_end\", ret[0])\n ret = ValidateCoordinates(msg.payload.object_lon_end, false)\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" Longitude\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_lon_end\", ret[0]);\n \n ret = ValidateDate(msg.payload.object_date_end)\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" of the sample retrieval\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_date_end\", ret[0])\n \n ret = ValidateTime(msg.payload.object_time_end)\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" of the sample retrieval\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_time_end\", ret[0])\n}\nelse{\n ret = ValidateCoordinates(msg.payload.object_lat, true);\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" Latitude\";\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_lat\", ret[0]);\n payload_for_form.payload[\"object_lat_end\"] = msg.payload.object_lat;\n \n ret = ValidateCoordinates(msg.payload.object_lon, false);\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" Longitude\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_lon\", ret[0])\n payload_for_form.payload[\"object_lon_end\"] = msg.payload.object_lon;\n\n ret = ValidateDate(msg.payload.object_date)\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" of the sample\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_date\", ret[0])\n payload_for_form.payload[\"object_date_end\"] = msg.payload.object_date;\n \n ret = ValidateTime(msg.payload.object_time)\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" of the sample\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_time\", ret[0])\n payload_for_form.payload[\"object_time_end\"] = msg.payload.object_time;\n}\nreturn [{topic: \"Coordinates valid!\", payload: \"All good!\", valid: true}, payload_for_form]\n",
+ "outputs": 2,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 930,
+ "y": 620,
+ "wires": [
+ [
+ "c0ce5626.b6c5",
+ "9a18a4b4.178448"
+ ],
+ [
+ "56d40584.eff4e4"
+ ]
+ ],
+ "inputLabels": [
+ "Location form data"
+ ],
+ "outputLabels": [
+ "Message",
+ "Location validated"
+ ]
+ },
+ {
+ "id": "46eb1bf8.3dc5f4",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "Net check",
+ "func": "var decknet = {}\nvar activation_msg = {}\n\nif (msg.payload.startsWith(\"net_decknet\")){\n decknet.enabled = true;\n}\nelse {\n decknet.enabled = false;\n}\n\nif (msg.payload.startsWith(\"net\")){\n activation_msg.payload = {\"group\":{\"show\":[\"Sample_Net_Metadata\"],\"hide\":[\"Sample_Sample_Location\"]}};\n}\nelse{\n activation_msg.payload = {\"group\":{\"show\":[\"Sample_Sample_Location\"], \"hide\":[\"Sample_Net_Metadata\"]}};\n}\n\n\nreturn [decknet, activation_msg];",
+ "outputs": 2,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 1080,
+ "y": 240,
+ "wires": [
+ [
+ "516375fd.2ed61c",
+ "470e382a.25691",
+ "fbe32ac8.ff6a38"
+ ],
+ [
+ "cbb123ab.fd3428"
+ ]
+ ],
+ "outputLabels": [
+ "decknet activation",
+ "group display control"
+ ]
+ },
+ {
+ "id": "516375fd.2ed61c",
+ "type": "ui_text_input",
+ "z": "b771c342.49603",
+ "name": "sample_total_flowmeter_start",
+ "label": "Decknet flowmeter start",
+ "tooltip": "in L",
+ "group": "cf5d9f0e.d57e7",
+ "order": 8,
+ "width": 5,
+ "height": 1,
+ "passthru": false,
+ "mode": "text",
+ "delay": "0",
+ "topic": "sample_total_flowmeter_start",
+ "topicType": "str",
+ "x": 1350,
+ "y": 220,
+ "wires": [
+ [
+ "e9bc112c.eb75f8"
+ ]
+ ]
+ },
+ {
+ "id": "470e382a.25691",
+ "type": "ui_text_input",
+ "z": "b771c342.49603",
+ "name": "sample_total_flowmeter_end",
+ "label": "Decknet flowmeter end",
+ "tooltip": "in L",
+ "group": "cf5d9f0e.d57e7",
+ "order": 9,
+ "width": 5,
+ "height": 1,
+ "passthru": false,
+ "mode": "text",
+ "delay": "0",
+ "topic": "sample_total_flowmeter_end",
+ "topicType": "str",
+ "x": 1340,
+ "y": 260,
+ "wires": [
+ [
+ "e9bc112c.eb75f8"
+ ]
+ ]
+ },
+ {
+ "id": "fbe32ac8.ff6a38",
+ "type": "ui_template",
+ "z": "b771c342.49603",
+ "group": "cf5d9f0e.d57e7",
+ "name": "Decknet flowmeter read",
+ "order": 7,
+ "width": 10,
+ "height": 1,
+ "format": "\n
Decknet flowmeter readings
\n
Those values are used to calculate sample_total_volume . Values are in L.
\n
\n",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": true,
+ "templateScope": "local",
+ "x": 1330,
+ "y": 180,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "f408a273.4fb538",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "get sample_gear_net_opening",
+ "func": "if (msg.payload.sample_gear_net_opening === null){\n msg.payload = 0;\n global.set(\"sample_gear_net_opening\",msg.payload);\n}\nelse\n{\n msg.payload = msg.payload.sample_gear_net_opening;\n}\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 350,
+ "y": 320,
+ "wires": [
+ [
+ "e967b844.46aa48"
+ ]
+ ]
+ },
+ {
+ "id": "8dff1648.82e42",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "get object_depth_max",
+ "func": "if (msg.payload.object_depth_max === null){\n msg.payload = 0;\n global.set(\"object_depth_max\",msg.payload);\n}\nelse\n{\n msg.payload = msg.payload.object_depth_max;\n}\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 320,
+ "y": 240,
+ "wires": [
+ [
+ "9c7f7fc9.c8d3a"
+ ]
+ ]
+ },
+ {
+ "id": "9f04c5ec.75f3d8",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "get object_depth_min",
+ "func": "if (msg.payload.object_depth_min === null){\n msg.payload = 0;\n global.set(\"object_depth_min\",msg.payload);\n}\nelse\n{\n msg.payload = msg.payload.object_depth_min;\n}\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 320,
+ "y": 280,
+ "wires": [
+ [
+ "317eeeb7.8d3042"
+ ]
+ ]
+ },
+ {
+ "id": "9a18a4b4.178448",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "calculate sample_total_volume",
+ "func": "\n/*object_lat = 33.95 \nobject_lon = 118.4 \nobject_lat_end = 40.6333 \nobject_lon_end = 73.78333\nsample_gear_net_opening = 40*/\n\n// Copyright 1997 Ed Williams. All rights reserved\n// Adapted by Romain Bazile - Ocean Trotter - 01-2021\n\ndecpl=4 // Dec places of minutes output\n\nellipse = {\"name\":\"WSG84\", \"a\":6378.137/1.852, \"invf\":298.257223563}\n\nfunction ComputeDistance(lat1, lon1, lat2, lon2){\n var d,crs12,crs21\n var argacos\n var a,invf\n \n // lat and lon in radian\n lat1=(Math.PI/180)*lat1\n lat2=(Math.PI/180)*lat2\n lon1=(Math.PI/180)*lon1\n lon2=(Math.PI/180)*lon2\n \n //alert(\"lat1=\" + lat1 + \"lon1=\" + lon1 +\"\\nlat2=\" +lat2+ \"lon2=\"+lon2)\n \n /* get distance conversion factor */\n dc=1.852 //km\n //alert(\"dc=\" +dc)\n \n //showProps(ellipse,\"ellipse\")\n \n // elliptic code\n d=crsdist_ell(lat1,-lon1,lat2,-lon2,ellipse) // ellipse uses East negative\n d=d*dc // go to physical units\n \n //alert(\"d=\"+d+\" crs12=\"+crs12+\" crs21=\"+crs21)\n return d\n}\n\nfunction crsdist(lat1,lon1,lat2,lon2){ // radian args\n /* compute course and distance (spherical) */\n if ((lat1+lat2===0) && (Math.abs(lon1-lon2)==Math.PI) && \n (Math.abs(lat1) != (Math.PI/180)*90)){\t\n \talert(\"Course between antipodal points is undefined\")\n }\n \n d = Math.acos(Math.sin(lat1)*Math.sin(lat2)+Math.cos(lat1)*Math.cos(lat2)*Math.cos(lon1-lon2))\n return d\n}\n\nfunction crsdist_ell(glat1,glon1,glat2,glon2,ellipse){\n // glat1 initial geodetic latitude in radians N positive \n // glon1 initial geodetic longitude in radians E positive \n // glat2 final geodetic latitude in radians N positive \n // glon2 final geodetic longitude in radians E positive \n a=ellipse.a\n f=1/ellipse.invf\n //alert(\"a=\"+a+\" f=\"+f)\n var r, tu1, tu2, cu1, su1, cu2, s1, b1, f1\n var x, sx, cx, sy, cy,y, sa, c2a, cz, e, c, d\n var EPS= 0.00000000005\n var faz, baz, s\n var iter=1\n var MAXITER=100\n if ((glat1+glat2===0) && (Math.abs(glon1-glon2)==Math.PI)){\n alert(\"Course and distance between antipodal points is undefined\")\n glat1=glat1+0.00001 // allow algorithm to complete\n }\n if (glat1==glat2 && (glon1==glon2 || Math.abs(Math.abs(glon1-glon2)-2*Math.PI) < EPS)){\n alert(\"Points 1 and 2 are identical- course undefined\")\n out=new MakeArray(0)\n out.d=0\n out.crs12=0\n out.crs21=Math.PI\n return out\n }\n r = 1 - f\n tu1 = r * Math.tan (glat1)\n tu2 = r * Math.tan (glat2)\n cu1 = 1 / Math.sqrt (1 + tu1 * tu1)\n su1 = cu1 * tu1\n cu2 = 1 / Math.sqrt (1 + tu2 * tu2)\n s1 = cu1 * cu2\n b1 = s1 * tu2\n f1 = b1 * tu1\n x = glon2 - glon1\n d = x + 1 // force one pass\n while ((Math.abs(d - x) > EPS) && (iter < MAXITER))\n {\n iter=iter+1\n sx = Math.sin (x)\n // alert(\"sx=\"+sx)\n cx = Math.cos (x)\n tu1 = cu2 * sx\n tu2 = b1 - su1 * cu2 * cx\n sy = Math.sqrt(tu1 * tu1 + tu2 * tu2)\n cy = s1 * cx + f1\n y = atan2 (sy, cy)\n sa = s1 * sx / sy\n c2a = 1 - sa * sa\n cz = f1 + f1\n if (c2a > 0)\n cz = cy - cz / c2a\n e = cz * cz * 2 - 1\n c = ((-3 * c2a + 4) * f + 4) * c2a * f / 16\n d = x\n x = ((e * cy * c + cz) * sy * c + y) * sa\n x = (1 - c) * x * f + glon2 - glon1\n }\n x = Math.sqrt ((1 / (r * r) - 1) * c2a + 1)\n x +=1\n x = (x - 2) / x\n c = 1 - x\n c = (x * x / 4 + 1) / c\n d = (0.375 * x * x - 1) * x\n x = e * cy\n d = ((((sy*sy*4-3)*(1-e-e)*cz*d/6-x)*d/4+cz)*sy*d+y)*c*a*r\n if (Math.abs(iter-MAXITER)0) && (y>=0)){ out= Math.atan(y/x)}\n if ((x >0) && (y<0)) { out= Math.atan(y/x)+2*Math.PI}\n if ((x===0) && (y>0)) { out= Math.PI/2}\n if ((x===0) && (y<0)) { out= 3*Math.PI/2} \n if ((x===0) && (y===0)) {\n alert(\"atan2(0,0) undefined\")\n out= 0\n } \n return out\n}\n\nfunction showProps(obj,objName){\n var result=\"\"\n for (var i in obj){\n result +=objName + \".\" + i + \" = \" + obj[i] + \"\\n\"\n }\n alert(result)\n}\n\n\nif (msg.valid){\n msg.topic=\"sample_total_volume\"\n \n var object_lat_end = global.get(\"object_lat_end\")\n var object_lon_end = global.get(\"object_lon_end\")\n var sample_sampling_gear = global.get(\"sample_sampling_gear\")\n \n if (sample_sampling_gear.startsWith(\"net\") && sample_sampling_gear != \"net_decknet\") {\n if (!(isNaN(object_lat_end) && isNaN(object_lon_end))){\n var object_lat = global.get(\"object_lat\")\n var object_lon = global.get(\"object_lon\")\n var sample_gear_net_opening = global.get(\"sample_gear_net_opening\");\n\n distance_km = ComputeDistance(object_lat, object_lon, object_lat_end, object_lon_end)\n\n sample_total_volume = distance_km*(Math.PI*(sample_gear_net_opening/2)*(sample_gear_net_opening/2)) // liters\n sample_total_volume = Math.round(sample_total_volume + Number.EPSILON)\n msg.payload = sample_total_volume\n return msg\n }\n }\n}",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 930,
+ "y": 760,
+ "wires": [
+ [
+ "4f6afc5a.81e454"
+ ]
+ ]
+ },
+ {
+ "id": "4fb4e0ad.c417c",
+ "type": "ui_text",
+ "z": "b771c342.49603",
+ "group": "fc5e4e6f.5b1c8",
+ "order": 6,
+ "width": 5,
+ "height": 1,
+ "name": "Latitude",
+ "label": "Latitude",
+ "format": "{{msg.payload.lat.deg}}°{{msg.payload.lat.min}}'{{msg.payload.lat.sec}}{{msg.payload.lat.dir}}",
+ "layout": "col-center",
+ "x": 700,
+ "y": 1120,
+ "wires": []
+ },
+ {
+ "id": "8d2b5026.13e6e8",
+ "type": "ui_text",
+ "z": "b771c342.49603",
+ "group": "fc5e4e6f.5b1c8",
+ "order": 7,
+ "width": 5,
+ "height": 1,
+ "name": "Longitude",
+ "label": "Longitude",
+ "format": "{{msg.payload.lon.deg}}°{{msg.payload.lon.min}}'{{msg.payload.lon.sec}}{{msg.payload.lon.dir}}",
+ "layout": "col-center",
+ "x": 700,
+ "y": 1160,
+ "wires": []
+ },
+ {
+ "id": "258b4562.9f778a",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "Convert DD to DMS",
+ "func": "function ConvertDDToDMS(D, lng){\n // from https://stackoverflow.com/a/5786281/2108279\n return {\n dir : D<0?lng?'W':'S':lng?'E':'N',\n deg : 0|(D<0?D=-D:D),\n min : 0|D%1*60,\n sec :(0|D*60%1*6000)/100\n };\n}\n\nmsg.payload = {\n \"lat\":ConvertDDToDMS(msg.payload.lat, false),\n \"lon\":ConvertDDToDMS(msg.payload.lon, true)\n};\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 500,
+ "y": 1140,
+ "wires": [
+ [
+ "4fb4e0ad.c417c",
+ "8d2b5026.13e6e8"
+ ]
+ ]
+ },
+ {
+ "id": "7c4ce5f3.62dd5c",
+ "type": "ui_text",
+ "z": "b771c342.49603",
+ "group": "fc5e4e6f.5b1c8",
+ "order": 4,
+ "width": 2,
+ "height": 1,
+ "name": "Speed",
+ "label": "Speed",
+ "format": "{{msg.payload}} kts",
+ "layout": "col-center",
+ "x": 690,
+ "y": 1200,
+ "wires": []
+ },
+ {
+ "id": "54e37580.fdc31c",
+ "type": "ui_text",
+ "z": "b771c342.49603",
+ "group": "fc5e4e6f.5b1c8",
+ "order": 5,
+ "width": 2,
+ "height": 1,
+ "name": "Direction",
+ "label": "Direction",
+ "format": "{{msg.payload.track}} °",
+ "layout": "col-center",
+ "x": 700,
+ "y": 1240,
+ "wires": []
+ },
+ {
+ "id": "cc21ca16.b92928",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "GPS Mode",
+ "func": "switch (msg.payload.mode){\n case 1:msg.payload = \"No Fix\"; break\n case 2:msg.payload = \"2D Fix\"; break\n case 3:msg.payload = \"3D Fix\"; break\n default: msg.payload = \"No info\"\n}\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 470,
+ "y": 1080,
+ "wires": [
+ [
+ "7116e906.9f50f"
+ ]
+ ]
+ },
+ {
+ "id": "4a4de52c.cf2884",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "Speed conversion",
+ "func": "msg.payload = (0|msg.payload.speed) * 1.9438\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 490,
+ "y": 1200,
+ "wires": [
+ [
+ "7c4ce5f3.62dd5c"
+ ]
+ ]
+ },
+ {
+ "id": "35ad311f.344c76",
+ "type": "ui_text",
+ "z": "b771c342.49603",
+ "group": "fc5e4e6f.5b1c8",
+ "order": 2,
+ "width": 5,
+ "height": 1,
+ "name": "Time",
+ "label": "Time",
+ "format": "{{msg.payload.time}}",
+ "layout": "col-center",
+ "x": 690,
+ "y": 1280,
+ "wires": []
+ },
+ {
+ "id": "e73fd87d.d24e4",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "get acq_minimum_mesh",
+ "func": "msg.payload = msg.payload.acq_minimum_mesh;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 330,
+ "y": 360,
+ "wires": [
+ [
+ "1aad56b31b5647ce"
+ ]
+ ]
+ },
+ {
+ "id": "489c8e06.cc7d6",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "get acq_maximum_mesh",
+ "func": "msg.payload = msg.payload.acq_maximum_mesh;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 330,
+ "y": 400,
+ "wires": [
+ [
+ "10eb31a2d7a6590c"
+ ]
+ ]
+ },
+ {
+ "id": "73c4a14a.9b93c8",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "Convert time",
+ "func": "if (msg.payload.time){\n msg.payload.time = msg.payload.time.replace('T', ' ');\n return msg;\n}",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 470,
+ "y": 1280,
+ "wires": [
+ [
+ "35ad311f.344c76"
+ ]
+ ]
+ },
+ {
+ "id": "58de1340.3cc354",
+ "type": "ui_text_input",
+ "z": "b771c342.49603",
+ "name": "sample_dilution_factor",
+ "label": "Dilution Factor",
+ "tooltip": "0.5 if diluted by two; 2 if concentrated by a factor 2",
+ "group": "3e1ba03d.f01d8",
+ "order": 13,
+ "width": 10,
+ "height": 1,
+ "passthru": true,
+ "mode": "number",
+ "delay": "0",
+ "topic": "sample_dilution_factor",
+ "topicType": "str",
+ "x": 640,
+ "y": 480,
+ "wires": [
+ [
+ "9f501f49.45645"
+ ]
+ ]
+ },
+ {
+ "id": "4f6afc5a.81e454",
+ "type": "ui_text_input",
+ "z": "b771c342.49603",
+ "name": "sample_total_volume",
+ "label": "Filtered volume (in L)",
+ "tooltip": "Calculated or hand filled",
+ "group": "3e1ba03d.f01d8",
+ "order": 11,
+ "width": 0,
+ "height": 0,
+ "passthru": true,
+ "mode": "text",
+ "delay": "500",
+ "topic": "sample_total_volume",
+ "topicType": "str",
+ "x": 1220,
+ "y": 760,
+ "wires": [
+ [
+ "e1f2f6eb.fe1dd"
+ ]
+ ]
+ },
+ {
+ "id": "e1f2f6eb.fe1dd",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "set global",
+ "func": "global.set(msg.topic,msg.payload);",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 1420,
+ "y": 760,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "e9bc112c.eb75f8",
+ "type": "function",
+ "z": "b771c342.49603",
+ "name": "Calculate volume",
+ "func": "if (msg.topic == \"sample_total_flowmeter_start\"){\n context.set(\"sample_total_flowmeter_start\", msg.payload);\n}\nif (msg.topic == \"sample_total_flowmeter_end\"){\n context.set(\"sample_total_flowmeter_end\", msg.payload);\n}\n\nif (context.keys().length == 2){\n sample_total_volume = context.get(\"sample_total_flowmeter_end\") - context.get(\"sample_total_flowmeter_start\");\n msg.topic=\"sample_total_volume\"\n msg.payload=sample_total_volume\n return msg\n}\n",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 1610,
+ "y": 240,
+ "wires": [
+ [
+ "4f6afc5a.81e454"
+ ]
+ ]
+ },
+ {
+ "id": "cdd4181922eecf11",
+ "type": "ui_text_input",
+ "z": "b771c342.49603",
+ "name": "sample_speed_through_water",
+ "label": "Speed Through Water (kts)",
+ "tooltip": "in knots",
+ "group": "cf5d9f0e.d57e7",
+ "order": 2,
+ "width": 10,
+ "height": 1,
+ "passthru": true,
+ "mode": "number",
+ "delay": "0",
+ "topic": "sample_speed_through_water",
+ "topicType": "str",
+ "x": 610,
+ "y": 520,
+ "wires": [
+ [
+ "9f501f49.45645"
+ ]
+ ]
+ },
+ {
+ "id": "1aad56b31b5647ce",
+ "type": "ui_text_input",
+ "z": "b771c342.49603",
+ "name": "acq_minimum_mesh",
+ "label": "Minimal fraction size (μm)",
+ "tooltip": "Net mesh pore size or minimal filtration mesh pore size",
+ "group": "3e1ba03d.f01d8",
+ "order": 7,
+ "width": 5,
+ "height": 1,
+ "passthru": true,
+ "mode": "number",
+ "delay": 300,
+ "topic": "acq_minimum_mesh",
+ "topicType": "str",
+ "x": 640,
+ "y": 360,
+ "wires": [
+ [
+ "9f501f49.45645"
+ ]
+ ]
+ },
+ {
+ "id": "10eb31a2d7a6590c",
+ "type": "ui_text_input",
+ "z": "b771c342.49603",
+ "name": "acq_maximum_mesh",
+ "label": "Maximal fraction size (μm)",
+ "tooltip": "Maximal filtration mesh pore size",
+ "group": "3e1ba03d.f01d8",
+ "order": 8,
+ "width": 5,
+ "height": 1,
+ "passthru": true,
+ "mode": "number",
+ "delay": 300,
+ "topic": "acq_maximum_mesh",
+ "topicType": "str",
+ "x": 640,
+ "y": 400,
+ "wires": [
+ [
+ "9f501f49.45645"
+ ]
+ ]
+ },
+ {
+ "id": "6a84252a.d52a0c",
+ "type": "ui_template",
+ "z": "bccd1f23.87219",
+ "group": "833bc5bb.217ba8",
+ "name": "Stream Pi Camera",
+ "order": 1,
+ "width": 18,
+ "height": 14,
+ "format": " ",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": false,
+ "templateScope": "local",
+ "x": 610,
+ "y": 40,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "dc48dc42.98d18",
+ "type": "function",
+ "z": "bccd1f23.87219",
+ "name": "set global",
+ "func": "global.set(msg.topic,msg.payload);",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 880,
+ "y": 440,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "811cd88c.daf528",
+ "type": "ui_button",
+ "z": "bccd1f23.87219",
+ "name": "down",
+ "group": "fbd92986.1028c8",
+ "order": 6,
+ "width": 4,
+ "height": 1,
+ "passthru": true,
+ "label": "",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "fa-angle-double-down fa-3x",
+ "payload": "DOWN",
+ "payloadType": "str",
+ "topic": "actuator/focus",
+ "x": 550,
+ "y": 800,
+ "wires": [
+ [
+ "65ad39d.b6d4d48"
+ ]
+ ]
+ },
+ {
+ "id": "edda4df4.76de2",
+ "type": "ui_button",
+ "z": "bccd1f23.87219",
+ "name": "up",
+ "group": "fbd92986.1028c8",
+ "order": 3,
+ "width": 4,
+ "height": 1,
+ "passthru": false,
+ "label": "",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "fa-angle-double-up fa-3x",
+ "payload": "UP",
+ "payloadType": "str",
+ "topic": "actuator/focus",
+ "x": 550,
+ "y": 760,
+ "wires": [
+ [
+ "65ad39d.b6d4d48"
+ ]
+ ]
+ },
+ {
+ "id": "68962547.34a67c",
+ "type": "ui_text_input",
+ "z": "bccd1f23.87219",
+ "name": "pump_manual_volume",
+ "label": "Volume to pass (ml)",
+ "tooltip": "Tiny values are accepted down to 0.001mL",
+ "group": "707d9797.c8e798",
+ "order": 3,
+ "width": 2,
+ "height": 1,
+ "passthru": true,
+ "mode": "text",
+ "delay": "0",
+ "topic": "pump_manual_volume",
+ "x": 610,
+ "y": 420,
+ "wires": [
+ [
+ "dc48dc42.98d18"
+ ]
+ ]
+ },
{
"id": "6c792043.b6ff9",
"type": "ui_ui_control",
@@ -2428,90 +3324,6 @@
[]
]
},
- {
- "id": "bb2bb7ce.1d1458",
- "type": "ui_template",
- "z": "baa1e3d9.cb29d",
- "group": "858a0e3c.987fe",
- "name": "Stream Pi Camera",
- "order": 1,
- "width": 10,
- "height": 8,
- "format": " ",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": false,
- "templateScope": "local",
- "x": 650,
- "y": 20,
- "wires": [
- []
- ]
- },
- {
- "id": "d0c5b57d.590818",
- "type": "ui_ui_control",
- "z": "baa1e3d9.cb29d",
- "name": "",
- "events": "change",
- "x": 1280,
- "y": 660,
- "wires": [
- []
- ]
- },
- {
- "id": "16de754c.cc969b",
- "type": "ui_button",
- "z": "b771c342.49603",
- "name": "",
- "group": "5517c651.b2f668",
- "order": 1,
- "width": 5,
- "height": 1,
- "passthru": false,
- "label": "Previous",
- "tooltip": "",
- "color": "#097479",
- "bgcolor": "white",
- "icon": "keyboard_return",
- "payload": "{\"tab\":\"Home\"}",
- "payloadType": "json",
- "topic": "",
- "x": 240,
- "y": 880,
- "wires": [
- [
- "222c851d.5d0a3a"
- ]
- ]
- },
- {
- "id": "84f3d040.5f7ea",
- "type": "ui_button",
- "z": "b771c342.49603",
- "name": "",
- "group": "5517c651.b2f668",
- "order": 2,
- "width": 5,
- "height": 1,
- "passthru": false,
- "label": "Continue",
- "tooltip": "",
- "color": "#097479",
- "bgcolor": "white",
- "icon": "keyboard_tab",
- "payload": "{\"tab\":\"Home\"}",
- "payloadType": "json",
- "topic": "",
- "x": 240,
- "y": 940,
- "wires": [
- [
- "986d960a.c75908"
- ]
- ]
- },
{
"id": "f61aaed5.1e64",
"type": "ui_button",
@@ -2564,62 +3376,17 @@
]
]
},
- {
- "id": "c72f8fae.23bd4",
- "type": "ui_button",
- "z": "baa1e3d9.cb29d",
- "name": "",
- "group": "b7919ae2.c01788",
- "order": 1,
- "width": 5,
- "height": 1,
- "passthru": false,
- "label": "Previous",
- "tooltip": "",
- "color": "#097479",
- "bgcolor": "white",
- "icon": "keyboard_return",
- "payload": "{\"tab\":\"Optic Configuration\"}",
- "payloadType": "json",
- "topic": "",
- "x": 1140,
- "y": 660,
- "wires": [
- [
- "d0c5b57d.590818"
- ]
- ]
- },
- {
- "id": "29be525e.0c87fe",
- "type": "ui_template",
- "z": "baa1e3d9.cb29d",
- "group": "b5d61bc7.54fe48",
- "name": "Show Metadata",
- "order": 9,
- "width": 0,
- "height": 0,
- "format": "\n
\n \n \n Sample \n id:
\n project:
\n ship:
\n operator:
\n sampling gear:
\n concentrated volume:
\n gear net opening:
\n total volume filtered:
\n \n \n Acquisition \n id:
\n instrument:
\n instrument id:
\n camera:
\n celltype:
\n minimum mesh:
\n maximum mesh:
\n min esd:
\n max esd:
\n volume:
\n magnification:
\n fnumber objective:
\n software:
\n \n \n \n \n Object \n latitude:
\n longitude:
\n latitude end:
\n longitude end:
\n date:
\n time:
\n date end:
\n time end:
\n depth min:
\n depth max:
\n \n \n Process \n pixel:
\n id:
\n \n \n
\n
",
- "storeOutMessages": false,
- "fwdInMessages": false,
- "resendOnRefresh": false,
- "templateScope": "local",
- "x": 1200,
- "y": 400,
- "wires": [
- []
- ]
- },
{
"id": "cbb8afed.0a026",
"type": "rpi-gpio out",
"z": "bccd1f23.87219",
"name": "LED Output",
- "pin": "40",
+ "pin": "21",
"set": true,
"level": "0",
"freq": "",
"out": "out",
+ "bcm": true,
"x": 550,
"y": 120,
"wires": []
@@ -2926,791 +3693,6 @@
]
]
},
- {
- "id": "8ec68b82.17e3d8",
- "type": "ui_button",
- "z": "cb95299c.2817c8",
- "name": "Start segmentation",
- "group": "abeb6dad.635a2",
- "order": 10,
- "width": 5,
- "height": 1,
- "passthru": false,
- "label": "Start segmentation",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "",
- "payload": "{\"action\":\"segment\"}",
- "payloadType": "json",
- "topic": "segmenter/segment",
- "x": 370,
- "y": 460,
- "wires": [
- [
- "33c28dc1.238002",
- "c72a1064.1ec388"
- ]
- ]
- },
- {
- "id": "27be7971.b3fbce",
- "type": "ui_button",
- "z": "cb95299c.2817c8",
- "d": true,
- "name": "Stop segmentation",
- "group": "abeb6dad.635a2",
- "order": 12,
- "width": 4,
- "height": 1,
- "passthru": true,
- "label": "Stop segmentation",
- "tooltip": "",
- "color": "",
- "bgcolor": "#AD1625",
- "icon": "",
- "payload": "{\"action\":\"stop\"}",
- "payloadType": "json",
- "topic": "segmenter/segment",
- "x": 370,
- "y": 520,
- "wires": [
- [
- "16f3cef4.0acac9"
- ]
- ]
- },
- {
- "id": "16f3cef4.0acac9",
- "type": "mqtt out",
- "z": "cb95299c.2817c8",
- "name": "",
- "topic": "",
- "qos": "",
- "retain": "",
- "broker": "8dc3722c.06efa8",
- "x": 850,
- "y": 520,
- "wires": []
- },
- {
- "id": "569154a.b53182c",
- "type": "inject",
- "z": "1371dec5.76e671",
- "name": "once",
- "props": [
- {
- "p": "payload"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": "",
- "topic": "",
- "payload": "start",
- "payloadType": "str",
- "x": 130,
- "y": 620,
- "wires": [
- [
- "452af41c.43940c"
- ]
- ]
- },
- {
- "id": "4b489713.ccde5",
- "type": "ui_button",
- "z": "baa1e3d9.cb29d",
- "name": "",
- "group": "4322c187.e73e5",
- "order": 12,
- "width": 5,
- "height": 1,
- "passthru": false,
- "label": "Start Acquisition",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "camera",
- "payload": "",
- "payloadType": "str",
- "topic": "imager/image",
- "x": 460,
- "y": 480,
- "wires": [
- [
- "c9f510c0.7d1328"
- ]
- ]
- },
- {
- "id": "c9f510c0.7d1328",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "Image control",
- "func": "// Reset the number of images taken\nflow.set('img_counter', 0);\n\nvar acq_celltype = global.get(\"acq_celltype\");\nvar acq_minimum_mesh = global.get(\"acq_minimum_mesh\");\nvar acq_maximum_mesh = global.get(\"acq_maximum_mesh\");\nvar imaging_pump_volume = global.get(\"imaging_pump_volume\");\nvar acq_id = global.get(\"acq_id\");\nvar nb_frame = global.get(\"nb_frame\");\nvar pump_direction = global.get(\"pump_direction\");\nvar sleep_before = global.get(\"sleep_before\");\nvar object_date = global.get(\"object_date\");\n\nif (acq_celltype === undefined || acq_celltype === \"\") {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Type of the flowcell\";\n return [null, msg];\n} else if (acq_minimum_mesh === undefined || acq_minimum_mesh === \"\") {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Lower fraction size\";\n return [null, msg];\n} else if (acq_maximum_mesh === undefined || acq_maximum_mesh === \"\") {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Upper fraction size\";\n return [null, msg];\n} else if (imaging_pump_volume === undefined || imaging_pump_volume === \"\" || imaging_pump_volume === null) {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Volume inbetween images\";\n return [null, msg];\n} else if (acq_id === undefined || acq_id === \"\") {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Acquisition ID\";\n return [null, msg];\n} else if (nb_frame === undefined || nb_frame === \"\" || nb_frame === null) {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Number of image to save\";\n return [null, msg];\n} else if (pump_direction === undefined || pump_direction === \"\" || pump_direction === null) {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Pump direction\";\n return [null, msg];\n} else if (sleep_before === undefined || sleep_before === \"\" || sleep_before === null) {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Delay before image\";\n return [null, msg];\n}else if (object_date === undefined || object_date === \"\" || object_date === null) {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Object date\";\n return [null, msg];\n}\n\nmsg.payload = {\n \"action\": \"image\",\n \"sleep\": sleep_before,\n \"pump_direction\": pump_direction,\n \"volume\": imaging_pump_volume,\n \"nb_frame\": nb_frame,\n}\n\nreturn [msg, null];",
- "outputs": 2,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 670,
- "y": 480,
- "wires": [
- [
- "52ea7d01.711034",
- "40c12463.a1f84c",
- "a4abb1ae.2ae418"
- ],
- [
- "20e0a8c8.edbeb"
- ]
- ]
- },
- {
- "id": "20e0a8c8.edbeb",
- "type": "ui_toast",
- "z": "baa1e3d9.cb29d",
- "position": "dialog",
- "displayTime": "3",
- "highlight": "",
- "sendall": true,
- "outputs": 1,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "",
- "name": "",
- "x": 950,
- "y": 560,
- "wires": [
- []
- ]
- },
- {
- "id": "c3e50240.82aa58",
- "type": "mqtt out",
- "z": "baa1e3d9.cb29d",
- "name": "",
- "topic": "",
- "qos": "",
- "retain": "",
- "broker": "8dc3722c.06efa8",
- "x": 1170,
- "y": 440,
- "wires": []
- },
- {
- "id": "3a4450b1.4459a8",
- "type": "ui_button",
- "z": "baa1e3d9.cb29d",
- "name": "Stop Acquisition",
- "group": "4322c187.e73e5",
- "order": 11,
- "width": 5,
- "height": 1,
- "passthru": true,
- "label": "STOP ACQUISITION",
- "tooltip": "",
- "color": "",
- "bgcolor": "#AD1625",
- "icon": "cancel",
- "payload": "{\"action\":\"stop\"}",
- "payloadType": "json",
- "topic": "imager/image",
- "x": 460,
- "y": 520,
- "wires": [
- [
- "d74210ef.edc15"
- ]
- ]
- },
- {
- "id": "d74210ef.edc15",
- "type": "mqtt out",
- "z": "baa1e3d9.cb29d",
- "name": "",
- "topic": "",
- "qos": "",
- "retain": "",
- "broker": "8dc3722c.06efa8",
- "x": 650,
- "y": 520,
- "wires": []
- },
- {
- "id": "bb62da8a.ebc328",
- "type": "ui_switch",
- "z": "baa1e3d9.cb29d",
- "name": "Pump direction",
- "label": "Pump direction",
- "tooltip": "BACKWARD / FORWARD",
- "group": "4322c187.e73e5",
- "order": 9,
- "width": 5,
- "height": 1,
- "passthru": true,
- "decouple": "false",
- "topic": "pump_direction",
- "style": "",
- "onvalue": "FORWARD",
- "onvalueType": "str",
- "onicon": "",
- "oncolor": "",
- "offvalue": "BACKWARD",
- "offvalueType": "str",
- "officon": "",
- "offcolor": "",
- "x": 460,
- "y": 560,
- "wires": [
- [
- "6b2239f3.41fa3"
- ]
- ]
- },
- {
- "id": "52ea7d01.711034",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "Encapsulate config",
- "func": "msg.payload = {\n\t\"action\": \"update_config\",\n\t\"config\": {\n \t\"description\": {\n \t\t\"sample_project\": \"Project's name\",\n \t\t\"sample_id\": \"Sample ID\",\n \t\t\"sample_uuid\": \"Sample UUID (Autogenerated)\",\n \t\t\"sample_ship\": \"Ship's name\",\n \t\t\"sample_operator\": \"Operator's name\",\n \t\t\"sample_sampling_gear\": \"Sampling gear used\",\n \t\t\"sample_concentrated_sample_volume\": \"Volume of concentrated sample, in mL\",\n \t\t\"sample_total_volume\": \"Total volume filtered by the net used, in L\",\n \t\t\"sample_dilution_factor\": \"Dilution factor of the sample, 0.5 if diluted by 2, 2 if concentrated by 2\",\n \t\t\"sample_speed_through_water\": \"Speed of the boat through water when sampling, in kts\",\n \t\t\"acq_id\": \"Acquisition ID\",\n \t\t\"acq_uuid\": \"Acquisition UUID (Autogenerated)\",\n \t\t\"acq_instrument\": \"Instrument type\",\n \t\t\"acq_instrument_id\": \"Instrument ID\",\n \t\t\"acq_celltype\": \"Flow cell dimension thickness, in µm\",\n \t\t\"acq_minimum_mesh\": \"Minimum filtration mesh size, in µm\",\n \t\t\"acq_maximum_mesh\": \"Maximum filtration mesh size, in µm\",\n \t\t\"acq_min_esd\": \"\",\n \t\t\"acq_max_esd\": \"\",\n \t\t\"acq_volume\": \"Pumped volume, in mL\",\n\t\t \"acq_imaged_volume\": \"Total imaged volume, in mL\",\n \t\t\"acq_magnification\": \"Optical magnification\",\n \t\t\"acq_fnumber_objective\": \"Focal length of the objective, in mm\",\n \t\t\"acq_camera_name\": \"Name of the camera used\",\n \t\t\"acq_nb_frame\": \"Number of picture taken\",\n \"acq_local_datetime\": \"Instrument local datetime\",\n \"acq_camera_resolution\": \"Resolution of the images\",\n \"acq_camera_iso\": \"ISO Number of the images\",\n \"acq_camera_shutter_speed\": \"Shutter speed of the images, in µs\",\n \"acq_software\": \"Software version number\",\n \t\t\"object_date\": \"Sample collection date (or beginning if using a net)\",\n \t\t\"object_time\": \"Sample collection time (or beginning if using a net)\",\n \t\t\"object_lat\": \"Sample collection latitude (or beginning if using a net)\",\n \t\t\"object_lon\": \"Sample collection longitude (or beginning if using a net)\",\n \t\t\"object_depth_min\": \"Sample collection minimal depth, in m\",\n \t\t\"object_depth_max\": \"Sample collection maximum depth, in m\",\n \t\t\"process_pixel\": \"Pixel imaging resolution, in µm/pixel\",\n \t\t\"process_datetime\": \"Segmentation timestamp\",\n \t\t\"process_id\": \"Segmentation ID\",\n \t\t\"process_uuid\": \"Segmentation UUID (Autogenerated)\",\n \t\t\"process_source\": \"Code source link of the executed code\",\n \t\t\"process_commit\": \"Version reference of the executed code\",\n \t\t\"sample_gear_net_opening\": \"Sample mouth opening dimension, in mm\",\n \t\t\"object_date_end\": \"Sample end collection date when using a net\",\n \t\t\"object_time_end\": \"Sample end collection time when using a net\",\n \t\t\"object_lat_end\": \"Sample end collection latitude when using a net\",\n \t\t\"object_lon_end\": \"Sample end collection longitude when using a net\",\n \t},\n\t\t\"sample_project\": global.get(\"sample_project\"),\n\t\t\"sample_id\": global.get(\"sample_project\") + \"_\" + global.get(\"sample_id\"),\n\t\t\"sample_ship\": global.get(\"sample_ship\"),\n\t\t\"sample_operator\": global.get(\"sample_operator\"),\n\t\t\"sample_sampling_gear\": global.get(\"sample_sampling_gear\"),\n\t\t\"sample_concentrated_sample_volume\": global.get(\"sample_concentrated_sample_volume\"),\n\t\t\"sample_dilution_factor\": global.get(\"sample_dilution_factor\"),\n\t\t\"sample_speed_through_water\": global.get(\"sample_speed_through_water\"),\n\n\t\t\"acq_id\": global.get(\"sample_project\") + \"_\" + global.get(\"sample_id\")+ \"_\" + global.get(\"acq_id\"),\n\t\t\"acq_instrument\": global.get(\"acq_instrument\"),\n\t\t\"acq_instrument_id\": global.get(\"acq_instrument_id\"),\n\t\t\"acq_celltype\": global.get(\"acq_celltype\"),\n\t\t\"acq_minimum_mesh\": global.get(\"acq_minimum_mesh\"),\n\t\t\"acq_maximum_mesh\": global.get(\"acq_maximum_mesh\"),\n\t\t\"acq_min_esd\": global.get(\"acq_min_esd\"),\n\t\t\"acq_max_esd\": global.get(\"acq_max_esd\"),\n\t\t\"acq_volume\": global.get(\"acq_volume\"),\n\t\t\"acq_imaged_volume\": global.get(\"acq_imaged_volume\"),\n\t\t\"acq_magnification\": global.get(\"acq_magnification\"),\n\t\t\"acq_fnumber_objective\": global.get(\"acq_fnumber_objective\"),\n\t\t\"acq_camera\": global.get(\"acq_camera\"),\n\t\t\"acq_nb_frame\": global.get(\"nb_frame\"),\n\t\t\"acq_software\": global.get(\"acq_software\"),\n\n\t\t\"object_date\": global.get(\"object_date\"),\n\t\t\"object_time\": global.get(\"object_time\"),\n\t\t\"object_lat\": global.get(\"object_lat\"),\n\t\t\"object_lon\": global.get(\"object_lon\"),\n\t\t\"object_depth_min\": global.get(\"object_depth_min\"),\n\t\t\"object_depth_max\": global.get(\"object_depth_max\"),\n\n\t\t\"process_pixel\": global.get(\"process_pixel\"),\n\t\t\"process_source\": \"https://www.github.com/PlanktonPlanet/PlanktoScope\",\n\t\t\"process_commit\": global.get(\"process_commit\")\n\t}\n};\n\nif (msg.payload.config.sample_sampling_gear.startsWith(\"net\")) {\n\tmsg.payload.config[\"sample_gear_net_opening\"] = global.get(\"sample_gear_net_opening\")\n\tmsg.payload.config[\"object_date_end\"] = global.get(\"object_date_end\")\n\tmsg.payload.config[\"object_time_end\"] = global.get(\"object_time_end\")\n\tmsg.payload.config[\"object_lat_end\"] = global.get(\"object_lat_end\")\n\tmsg.payload.config[\"object_lon_end\"] = global.get(\"object_lon_end\")\n\tmsg.payload.config[\"sample_total_volume\"] = global.get(\"sample_total_volume\")\n}\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 910,
- "y": 440,
- "wires": [
- [
- "c3e50240.82aa58",
- "29be525e.0c87fe"
- ]
- ]
- },
- {
- "id": "40c12463.a1f84c",
- "type": "delay",
- "z": "baa1e3d9.cb29d",
- "name": "",
- "pauseType": "delay",
- "timeout": "1",
- "timeoutUnits": "seconds",
- "rate": "1",
- "nbRateUnits": "1",
- "rateUnits": "second",
- "randomFirst": "1",
- "randomLast": "5",
- "randomUnits": "seconds",
- "drop": false,
- "x": 940,
- "y": 480,
- "wires": [
- [
- "c3e50240.82aa58"
- ]
- ]
- },
- {
- "id": "4d1b02cb.83b51c",
- "type": "ui_button",
- "z": "baa1e3d9.cb29d",
- "name": "",
- "group": "4322c187.e73e5",
- "order": 10,
- "width": 5,
- "height": 1,
- "passthru": false,
- "label": "Update config",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "save",
- "payload": "",
- "payloadType": "str",
- "topic": "imager/image",
- "x": 460,
- "y": 440,
- "wires": [
- [
- "52ea7d01.711034"
- ]
- ]
- },
- {
- "id": "452af41c.43940c",
- "type": "python3-function",
- "z": "1371dec5.76e671",
- "name": "Get MachineName",
- "func": "import sys\nsys.path.append('/home/pi/PlanktoScope/scripts')\nimport planktoscope.uuidName\n\nmsg['payload'] = planktoscope.uuidName.machineName(machine=planktoscope.uuidName.getSerial())\nmsg['topic'] = \"acq_instrument_id\";\nreturn msg",
- "outputs": 1,
- "x": 350,
- "y": 620,
- "wires": [
- [
- "4828d2f4.7c712c",
- "a400a97e.e333a8"
- ]
- ]
- },
- {
- "id": "4828d2f4.7c712c",
- "type": "function",
- "z": "1371dec5.76e671",
- "name": "set global",
- "func": "global.set(msg.topic,msg.payload);\n",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 580,
- "y": 640,
- "wires": [
- []
- ]
- },
- {
- "id": "d027a6bf.7049e8",
- "type": "function",
- "z": "b771c342.49603",
- "name": "get sample_projet",
- "func": "msg.payload = msg.payload.sample_project;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 310,
- "y": 40,
- "wires": [
- [
- "9c882b37.fde668"
- ]
- ]
- },
- {
- "id": "5a811caf.0f3144",
- "type": "function",
- "z": "b771c342.49603",
- "name": "get sample_ship",
- "func": "msg.payload = msg.payload.sample_ship;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 300,
- "y": 80,
- "wires": [
- [
- "4557d689.a4fa88"
- ]
- ]
- },
- {
- "id": "45911c98.2bd83c",
- "type": "function",
- "z": "b771c342.49603",
- "name": "get sample_id",
- "func": "msg.payload = msg.payload.sample_id;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 300,
- "y": 120,
- "wires": [
- [
- "94eb4221.9b92c"
- ]
- ]
- },
- {
- "id": "1e09a4ab.72996b",
- "type": "function",
- "z": "b771c342.49603",
- "name": "get sample_operator",
- "func": "msg.payload = msg.payload.sample_operator;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 320,
- "y": 160,
- "wires": [
- [
- "82c5fc77.59c97"
- ]
- ]
- },
- {
- "id": "a3272681.f271c8",
- "type": "function",
- "z": "b771c342.49603",
- "name": "get sample_sampling_gear",
- "func": "msg.topic = \"sample_sampling_gear\"\nif (msg.payload.sample_sampling_gear === undefined){\n msg.payload = \"net\";\n}\nelse\n{\n msg.payload = msg.payload.sample_sampling_gear;\n}\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 340,
- "y": 200,
- "wires": [
- [
- "fcfc31ae.af3af"
- ]
- ]
- },
- {
- "id": "6465bdd5.15eb8c",
- "type": "file in",
- "z": "1c24ad9c.bebec2",
- "name": "",
- "filename": "/home/pi/PlanktoScope/config.json",
- "format": "utf8",
- "chunk": false,
- "sendError": false,
- "encoding": "none",
- "x": 480,
- "y": 60,
- "wires": [
- [
- "15ceb135.6628bf"
- ]
- ],
- "info": "# PlanktoScope Help\nThis Node will read the content of the file named **config.txt** containing all the input placeholders.\n"
- },
- {
- "id": "15ceb135.6628bf",
- "type": "json",
- "z": "1c24ad9c.bebec2",
- "name": "config.json",
- "property": "payload",
- "action": "",
- "pretty": false,
- "x": 730,
- "y": 60,
- "wires": [
- [
- "ad541674.4791c8"
- ]
- ]
- },
- {
- "id": "7205d267.36adcc",
- "type": "file",
- "z": "1c24ad9c.bebec2",
- "name": "",
- "filename": "/home/pi/PlanktoScope/config.json",
- "appendNewline": true,
- "createDir": true,
- "overwriteFile": "true",
- "encoding": "none",
- "x": 990,
- "y": 160,
- "wires": [
- []
- ]
- },
- {
- "id": "2e6ddf51.c0dba",
- "type": "json",
- "z": "1c24ad9c.bebec2",
- "name": "config.json",
- "property": "payload",
- "action": "str",
- "pretty": true,
- "x": 730,
- "y": 160,
- "wires": [
- [
- "7205d267.36adcc"
- ]
- ]
- },
- {
- "id": "ad541674.4791c8",
- "type": "function",
- "z": "1c24ad9c.bebec2",
- "name": "Global Set",
- "func": "global.set(\"config_keys\", Object.keys(msg.payload));\n\nfor (const key in msg.payload) {\n global.set(key, msg.payload[key]);\n}\n\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 910,
- "y": 60,
- "wires": [
- []
- ]
- },
- {
- "id": "3e9a33c.141384c",
- "type": "inject",
- "z": "1c24ad9c.bebec2",
- "name": "Load config",
- "props": [
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "",
- "payloadType": "str",
- "x": 230,
- "y": 60,
- "wires": [
- [
- "6465bdd5.15eb8c"
- ]
- ]
- },
- {
- "id": "e2f39a35.f57298",
- "type": "subflow:1c24ad9c.bebec2",
- "z": "1371dec5.76e671",
- "name": "",
- "env": [],
- "x": 570,
- "y": 560,
- "wires": [
- [
- "bdc6718a.dd5d48"
- ]
- ]
- },
- {
- "id": "a6907a38.f6611",
- "type": "subflow:1c24ad9c.bebec2",
- "z": "b771c342.49603",
- "name": "",
- "env": [],
- "x": 70,
- "y": 220,
- "wires": [
- [
- "d027a6bf.7049e8",
- "5a811caf.0f3144",
- "45911c98.2bd83c",
- "1e09a4ab.72996b",
- "8dff1648.82e42",
- "9f04c5ec.75f3d8",
- "f408a273.4fb538",
- "e73fd87d.d24e4",
- "489c8e06.cc7d6",
- "a3272681.f271c8"
- ]
- ]
- },
- {
- "id": "e2b277c1.07283",
- "type": "subflow:1c24ad9c.bebec2",
- "z": "b771c342.49603",
- "name": "",
- "env": [],
- "x": 690,
- "y": 940,
- "wires": [
- []
- ]
- },
- {
- "id": "3e64877a.9684b",
- "type": "function",
- "z": "1371dec5.76e671",
- "name": "store version",
- "func": "msg.payload = \"PlanktoScope v2.3-\"+msg.payload.trim()\n\nglobal.set(\"acq_software\",msg.payload);\n\nreturn msg\n",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 590,
- "y": 520,
- "wires": [
- [
- "8343fa69.49339"
- ]
- ]
- },
- {
- "id": "5921d0d0.a3d568",
- "type": "subflow:1c24ad9c.bebec2",
- "z": "baa1e3d9.cb29d",
- "name": "",
- "env": [],
- "x": 110,
- "y": 220,
- "wires": [
- [
- "f3658d30.b8448",
- "de2c90cf.b73b08",
- "4be09c97f86897d9",
- "f573206abefa9518",
- "f948151ab4031df4",
- "5e3dec55.881074",
- "d3ca8847.4d1ae"
- ]
- ]
- },
- {
- "id": "f3658d30.b8448",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "get acq_id",
- "func": "msg.payload = msg.payload.acq_id;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 320,
- "y": 240,
- "wires": [
- [
- "6b34c456.83178c"
- ]
- ]
- },
- {
- "id": "de2c90cf.b73b08",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "get acq_celltype",
- "func": "msg.payload = msg.payload.acq_celltype;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 340,
- "y": 80,
- "wires": [
- [
- "cc0ca68b.4263a8"
- ]
- ]
- },
- {
- "id": "5e3dec55.881074",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "get acq_minimum_mesh",
- "func": "msg.payload = msg.payload.acq_minimum_mesh;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "x": 370,
- "y": 160,
- "wires": [
- [
- "f59a2f0d.5e9af"
- ]
- ]
- },
- {
- "id": "d3ca8847.4d1ae",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "get acq_maximum_mesh",
- "func": "msg.payload = msg.payload.acq_maximum_mesh;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "x": 370,
- "y": 200,
- "wires": [
- [
- "6008a8bb.259f08"
- ]
- ]
- },
- {
- "id": "bdc6718a.dd5d48",
- "type": "ui_text",
- "z": "1371dec5.76e671",
- "group": "ce9e278.781eed8",
- "order": 2,
- "width": 0,
- "height": 0,
- "name": "",
- "label": "Instrument Type",
- "format": "{{msg.payload.acq_instrument}}",
- "layout": "row-spread",
- "x": 840,
- "y": 560,
- "wires": []
- },
- {
- "id": "a400a97e.e333a8",
- "type": "ui_text",
- "z": "1371dec5.76e671",
- "group": "ce9e278.781eed8",
- "order": 1,
- "width": 0,
- "height": 0,
- "name": "",
- "label": "Instrument Name",
- "format": "{{msg.payload}}",
- "layout": "row-spread",
- "x": 610,
- "y": 600,
- "wires": []
- },
- {
- "id": "8343fa69.49339",
- "type": "ui_text",
- "z": "1371dec5.76e671",
- "group": "ce9e278.781eed8",
- "order": 3,
- "width": 0,
- "height": 0,
- "name": "",
- "label": "Software version",
- "format": "{{msg.payload}}",
- "layout": "row-spread",
- "x": 840,
- "y": 520,
- "wires": []
- },
- {
- "id": "f783aefd.c3bfd8",
- "type": "ui_text",
- "z": "1371dec5.76e671",
- "group": "ce9e278.781eed8",
- "order": 4,
- "width": 0,
- "height": 0,
- "name": "",
- "label": "Camera Name",
- "format": "{{msg.payload}}",
- "layout": "row-spread",
- "x": 1020,
- "y": 620,
- "wires": []
- },
- {
- "id": "7116e906.9f50f",
- "type": "ui_text",
- "z": "b771c342.49603",
- "group": "fc5e4e6f.5b1c8",
- "order": 1,
- "width": 10,
- "height": 1,
- "name": "GPS Status Display",
- "label": "GPS Status:",
- "format": "{{msg.payload}}",
- "layout": "row-center",
- "x": 730,
- "y": 1080,
- "wires": []
- },
{
"id": "6451f991.aaac1",
"type": "ui_button",
@@ -3737,1278 +3719,6 @@
]
]
},
- {
- "id": "b402f719.55bc98",
- "type": "inject",
- "z": "baa1e3d9.cb29d",
- "name": "Default: FORWARD",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "pump_direction",
- "payload": "FORWARD",
- "payloadType": "str",
- "x": 220,
- "y": 560,
- "wires": [
- [
- "bb62da8a.ebc328"
- ]
- ]
- },
- {
- "id": "6b2239f3.41fa3",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "set global",
- "func": "global.set(msg.topic, msg.payload);",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 660,
- "y": 560,
- "wires": [
- []
- ]
- },
- {
- "id": "51b4d0df.d70a88",
- "type": "ui_text_input",
- "z": "baa1e3d9.cb29d",
- "name": "nb_frame",
- "label": "Number of images to acquire",
- "tooltip": "",
- "group": "4322c187.e73e5",
- "order": 2,
- "width": 5,
- "height": 1,
- "passthru": true,
- "mode": "number",
- "delay": 300,
- "topic": "nb_frame",
- "x": 680,
- "y": 280,
- "wires": [
- [
- "fb887036.12429",
- "67091ac0.8f9f6c",
- "99b11fe4.2795d"
- ]
- ]
- },
- {
- "id": "9c7f7fc9.c8d3a",
- "type": "ui_text_input",
- "z": "b771c342.49603",
- "name": "object_depth_max",
- "label": "Max sampling depth (m)",
- "tooltip": "in m",
- "group": "3e1ba03d.f01d8",
- "order": 9,
- "width": 5,
- "height": 1,
- "passthru": true,
- "mode": "number",
- "delay": "0",
- "topic": "object_depth_max",
- "x": 650,
- "y": 240,
- "wires": [
- [
- "9f501f49.45645"
- ]
- ]
- },
- {
- "id": "317eeeb7.8d3042",
- "type": "ui_text_input",
- "z": "b771c342.49603",
- "name": "object_depth_min",
- "label": "Min sampling depth (m)",
- "tooltip": "in m",
- "group": "3e1ba03d.f01d8",
- "order": 8,
- "width": 5,
- "height": 1,
- "passthru": true,
- "mode": "number",
- "delay": "0",
- "topic": "object_depth_min",
- "x": 650,
- "y": 280,
- "wires": [
- [
- "9f501f49.45645"
- ]
- ]
- },
- {
- "id": "999065ca.27edb8",
- "type": "switch",
- "z": "baa1e3d9.cb29d",
- "name": "topic filter",
- "property": "topic",
- "propertyType": "msg",
- "rules": [
- {
- "t": "eq",
- "v": "status/pump",
- "vt": "str"
- },
- {
- "t": "eq",
- "v": "status/focus",
- "vt": "str"
- },
- {
- "t": "eq",
- "v": "status/imager",
- "vt": "str"
- }
- ],
- "checkall": "true",
- "repair": false,
- "outputs": 3,
- "x": 320,
- "y": 800,
- "wires": [
- [
- "a46a1e7f.88a92",
- "6742014e.1bb238"
- ],
- [
- "c516d9ea.f7f6e",
- "6742014e.1bb238"
- ],
- [
- "307c851e.fb0f7a",
- "2b9d6988.d84836"
- ]
- ]
- },
- {
- "id": "2b009bd7.c07004",
- "type": "ui_text",
- "z": "baa1e3d9.cb29d",
- "group": "70de8209.68416c",
- "order": 3,
- "width": 10,
- "height": 2,
- "name": "imager",
- "label": "Imager status:",
- "format": "{{msg.payload.status}}",
- "layout": "col-center",
- "x": 770,
- "y": 740,
- "wires": []
- },
- {
- "id": "c516d9ea.f7f6e",
- "type": "ui_text",
- "z": "baa1e3d9.cb29d",
- "group": "70de8209.68416c",
- "order": 1,
- "width": 5,
- "height": 1,
- "name": "focus",
- "label": "Focus status:",
- "format": "{{msg.payload.status}}",
- "layout": "col-center",
- "x": 770,
- "y": 700,
- "wires": []
- },
- {
- "id": "a46a1e7f.88a92",
- "type": "ui_text",
- "z": "baa1e3d9.cb29d",
- "group": "70de8209.68416c",
- "order": 2,
- "width": 5,
- "height": 1,
- "name": "pump",
- "label": "Pump status:",
- "format": "{{msg.payload.status}}",
- "layout": "col-center",
- "x": 770,
- "y": 660,
- "wires": []
- },
- {
- "id": "bb628f8d.98f108",
- "type": "link in",
- "z": "baa1e3d9.cb29d",
- "name": "Status for fluidic module",
- "links": [
- "58f2e0f.4e8b12"
- ],
- "x": 175,
- "y": 800,
- "wires": [
- [
- "999065ca.27edb8"
- ]
- ]
- },
- {
- "id": "1fdf77b5.24e4e",
- "type": "mqtt in",
- "z": "9a22e67a.378818",
- "name": "",
- "topic": "status/#",
- "qos": "0",
- "datatype": "json",
- "broker": "8dc3722c.06efa8",
- "x": 290,
- "y": 340,
- "wires": [
- [
- "fa73983d.318188"
- ]
- ]
- },
- {
- "id": "4a1e9e3e.27506",
- "type": "switch",
- "z": "9a22e67a.378818",
- "name": "Filter segmenter out",
- "property": "topic",
- "propertyType": "msg",
- "rules": [
- {
- "t": "else"
- },
- {
- "t": "cont",
- "v": "status/segmenter",
- "vt": "str"
- }
- ],
- "checkall": "true",
- "repair": false,
- "outputs": 2,
- "x": 610,
- "y": 340,
- "wires": [
- [
- "58f2e0f.4e8b12"
- ],
- [
- "dcf5bd45.16a8d"
- ]
- ]
- },
- {
- "id": "fa73983d.318188",
- "type": "json",
- "z": "9a22e67a.378818",
- "name": "",
- "property": "payload",
- "action": "obj",
- "pretty": true,
- "x": 430,
- "y": 340,
- "wires": [
- [
- "4a1e9e3e.27506"
- ]
- ]
- },
- {
- "id": "58f2e0f.4e8b12",
- "type": "link out",
- "z": "9a22e67a.378818",
- "name": "Fluidic module status",
- "links": [
- "bb628f8d.98f108"
- ],
- "x": 795,
- "y": 320,
- "wires": []
- },
- {
- "id": "307c851e.fb0f7a",
- "type": "switch",
- "z": "baa1e3d9.cb29d",
- "name": "Imaging state",
- "property": "payload",
- "propertyType": "msg",
- "rules": [
- {
- "t": "jsonata_exp",
- "v": "$contains(msg.payload.status, \"jpg\")\t",
- "vt": "jsonata"
- },
- {
- "t": "else"
- }
- ],
- "checkall": "false",
- "repair": false,
- "outputs": 2,
- "x": 540,
- "y": 880,
- "wires": [
- [
- "db8e3dde.44efb8"
- ],
- [
- "6742014e.1bb238"
- ]
- ]
- },
- {
- "id": "db8e3dde.44efb8",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "img_counter",
- "func": "img_counter=flow.get('img_counter')\nif (img_counter === undefined || img_counter === \"\"){\n img_counter = 0\n}\nimg_counter=img_counter+1\nflow.set('img_counter',img_counter)\nmsg.payload = img_counter\nmsg.payload = (100 * img_counter/global.get('nb_frame')).toFixed(2)\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 770,
- "y": 860,
- "wires": [
- [
- "1a2e721a.f5e876"
- ]
- ]
- },
- {
- "id": "59164d65.e7993c",
- "type": "ui_toast",
- "z": "baa1e3d9.cb29d",
- "position": "top right",
- "displayTime": "5",
- "highlight": "",
- "sendall": true,
- "outputs": 0,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "",
- "name": "",
- "x": 1260,
- "y": 900,
- "wires": []
- },
- {
- "id": "8c7348aa.1962e8",
- "type": "template",
- "z": "baa1e3d9.cb29d",
- "name": "Create sentence",
- "field": "payload",
- "fieldType": "msg",
- "format": "handlebars",
- "syntax": "mustache",
- "template": "The {{topic}} is {{payload.status}}",
- "output": "str",
- "x": 1050,
- "y": 900,
- "wires": [
- [
- "59164d65.e7993c"
- ]
- ]
- },
- {
- "id": "6742014e.1bb238",
- "type": "change",
- "z": "baa1e3d9.cb29d",
- "name": "Remove high-level topic",
- "rules": [
- {
- "t": "change",
- "p": "topic",
- "pt": "msg",
- "from": "status/",
- "fromt": "str",
- "to": "",
- "tot": "str"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 810,
- "y": 900,
- "wires": [
- [
- "8c7348aa.1962e8"
- ]
- ]
- },
- {
- "id": "1a2e721a.f5e876",
- "type": "ui_gauge",
- "z": "baa1e3d9.cb29d",
- "name": "progress donut",
- "group": "b5d61bc7.54fe48",
- "order": 3,
- "width": 6,
- "height": 3,
- "gtype": "donut",
- "title": "",
- "label": "%",
- "format": "{{value}}",
- "min": 0,
- "max": "100",
- "colors": [
- "#ffa83f",
- "#e6ff02",
- "#00dfe9"
- ],
- "seg1": "50",
- "seg2": "75",
- "x": 1260,
- "y": 860,
- "wires": []
- },
- {
- "id": "8f3788f6.ddcf98",
- "type": "function",
- "z": "cb95299c.2817c8",
- "name": "obj_counter",
- "func": "obj_counter = flow.get('obj_counter')\nobj_counter = obj_counter + 1\nflow.set('obj_counter', obj_counter)\nmsg.payload = obj_counter\nmsg.topic = \"object count\"\nreturn msg",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 810,
- "y": 800,
- "wires": [
- [
- "fa3b7929.ac7da8",
- "9d53dbe2.dbffe8"
- ]
- ]
- },
- {
- "id": "aa38dbbc.cf0a9",
- "type": "switch",
- "z": "cb95299c.2817c8",
- "name": "Segmenter",
- "property": "topic",
- "propertyType": "msg",
- "rules": [
- {
- "t": "eq",
- "v": "status/segmenter",
- "vt": "str"
- },
- {
- "t": "eq",
- "v": "status/segmenter/name",
- "vt": "str"
- },
- {
- "t": "eq",
- "v": "status/segmenter/object_id",
- "vt": "str"
- },
- {
- "t": "eq",
- "v": "status/segmenter/metric",
- "vt": "str"
- }
- ],
- "checkall": "true",
- "repair": false,
- "outputs": 4,
- "x": 490,
- "y": 740,
- "wires": [
- [
- "b9a23b91.93638",
- "6919465f.332e5"
- ],
- [
- "49af3d24.1799e4"
- ],
- [
- "8f3788f6.ddcf98"
- ],
- [
- "50ce901f.b5034"
- ]
- ]
- },
- {
- "id": "9d53dbe2.dbffe8",
- "type": "ui_chart",
- "z": "cb95299c.2817c8",
- "name": "counter graph",
- "group": "46be9c86.dea684",
- "order": 7,
- "width": 10,
- "height": 2,
- "label": "",
- "chartType": "horizontalBar",
- "legend": "false",
- "xformat": "HH:mm:ss",
- "interpolate": "linear",
- "nodata": "Objects count will be shown here once the segmentation is started",
- "dot": false,
- "ymin": "",
- "ymax": "",
- "removeOlder": 1,
- "removeOlderPoints": "",
- "removeOlderUnit": "3600",
- "cutout": 0,
- "useOneColor": true,
- "useUTC": false,
- "colors": [
- "#1f77b4",
- "#aec7e8",
- "#ff7f0e",
- "#2ca02c",
- "#98df8a",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "outputs": 1,
- "x": 1340,
- "y": 840,
- "wires": [
- []
- ]
- },
- {
- "id": "50ce901f.b5034",
- "type": "function",
- "z": "cb95299c.2817c8",
- "name": "ex : area",
- "func": "// Payload looks like this:\n// {'name': '01_13_28_232066_0',\n// 'metadata': {\n// 'label': 0, 'width': 29, 'height': 80, ....\n\nmsg.payload=msg.payload.metadata.area_exc\nmsg.topic=\"area\"\n\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 800,
- "y": 920,
- "wires": [
- [
- "458cd82e.03d258"
- ]
- ]
- },
- {
- "id": "a4f0f0d1.3aca88",
- "type": "ui_toast",
- "z": "cb95299c.2817c8",
- "position": "top right",
- "displayTime": "5",
- "highlight": "",
- "sendall": true,
- "outputs": 0,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "",
- "name": "",
- "x": 1340,
- "y": 680,
- "wires": []
- },
- {
- "id": "458cd82e.03d258",
- "type": "ui_chart",
- "z": "cb95299c.2817c8",
- "name": "Area chart",
- "group": "46be9c86.dea684",
- "order": 9,
- "width": 10,
- "height": 6,
- "label": "",
- "chartType": "line",
- "legend": "false",
- "xformat": "HH:mm:ss",
- "interpolate": "linear",
- "nodata": "Objects area will be shown here once the segmentation is started",
- "dot": true,
- "ymin": "",
- "ymax": "",
- "removeOlder": 1,
- "removeOlderPoints": "1000",
- "removeOlderUnit": "3600",
- "cutout": 0,
- "useOneColor": false,
- "useUTC": true,
- "colors": [
- "#1f77b4",
- "#aec7e8",
- "#ff7f0e",
- "#2ca02c",
- "#98df8a",
- "#d62728",
- "#ff9896",
- "#9467bd",
- "#c5b0d5"
- ],
- "outputs": 1,
- "x": 1320,
- "y": 920,
- "wires": [
- []
- ]
- },
- {
- "id": "49af3d24.1799e4",
- "type": "debug",
- "z": "cb95299c.2817c8",
- "name": "segmentation name",
- "active": true,
- "tosidebar": true,
- "console": false,
- "tostatus": false,
- "complete": "true",
- "targetType": "full",
- "statusVal": "",
- "statusType": "auto",
- "x": 830,
- "y": 760,
- "wires": []
- },
- {
- "id": "7088a5be.0c79a4",
- "type": "template",
- "z": "cb95299c.2817c8",
- "name": "Create sentence",
- "field": "payload",
- "fieldType": "msg",
- "format": "handlebars",
- "syntax": "mustache",
- "template": "The {{topic}} is {{payload.status}}",
- "output": "str",
- "x": 1100,
- "y": 680,
- "wires": [
- [
- "a4f0f0d1.3aca88"
- ]
- ]
- },
- {
- "id": "b9a23b91.93638",
- "type": "change",
- "z": "cb95299c.2817c8",
- "name": "Remove high-level topic",
- "rules": [
- {
- "t": "change",
- "p": "topic",
- "pt": "msg",
- "from": "status/",
- "fromt": "str",
- "to": "",
- "tot": "str"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 850,
- "y": 680,
- "wires": [
- [
- "7088a5be.0c79a4"
- ]
- ]
- },
- {
- "id": "6919465f.332e5",
- "type": "ui_text",
- "z": "cb95299c.2817c8",
- "group": "46be9c86.dea684",
- "order": 1,
- "width": 10,
- "height": 1,
- "name": "segmenter",
- "label": "Segmenter status:",
- "format": "{{msg.payload.status}}",
- "layout": "row-spread",
- "x": 810,
- "y": 720,
- "wires": []
- },
- {
- "id": "fa3b7929.ac7da8",
- "type": "ui_text",
- "z": "cb95299c.2817c8",
- "group": "46be9c86.dea684",
- "order": 5,
- "width": 4,
- "height": 1,
- "name": "counter",
- "label": "",
- "format": "{{msg.payload}}",
- "layout": "col-center",
- "x": 1320,
- "y": 800,
- "wires": []
- },
- {
- "id": "640ece83.88cab",
- "type": "inject",
- "z": "cb95299c.2817c8",
- "name": "Init graphs",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "object count",
- "payload": "0",
- "payloadType": "num",
- "x": 810,
- "y": 880,
- "wires": [
- [
- "ac439738.28bc18",
- "4f3f7c4a.cb21c4"
- ]
- ]
- },
- {
- "id": "25867454.a8e334",
- "type": "link in",
- "z": "cb95299c.2817c8",
- "name": "Segmenter module status",
- "links": [
- "dcf5bd45.16a8d"
- ],
- "x": 295,
- "y": 740,
- "wires": [
- [
- "aa38dbbc.cf0a9"
- ]
- ]
- },
- {
- "id": "dcf5bd45.16a8d",
- "type": "link out",
- "z": "9a22e67a.378818",
- "name": "Segmenter module status",
- "links": [
- "25867454.a8e334"
- ],
- "x": 795,
- "y": 360,
- "wires": []
- },
- {
- "id": "52af9ac0.60eb24",
- "type": "link out",
- "z": "b771c342.49603",
- "name": "Sample Operator",
- "links": [
- "35eb925e.5f8016"
- ],
- "x": 815,
- "y": 160,
- "wires": []
- },
- {
- "id": "9bd72495.a8a098",
- "type": "ui_text",
- "z": "baa1e3d9.cb29d",
- "group": "4322c187.e73e5",
- "order": 5,
- "width": 5,
- "height": 1,
- "name": "Total imaged volume",
- "label": "Total imaged volume",
- "format": "{{msg.payload}}",
- "layout": "col-center",
- "x": 1200,
- "y": 140,
- "wires": []
- },
- {
- "id": "99b11fe4.2795d",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "imaged volume calc",
- "func": "camera = global.get(\"acq_camera\");\ncell = global.get(\"acq_celltype\");\nnb_frame = global.get(\"nb_frame\");\nprocess_pixel = global.get(\"process_pixel\");\n\nvar volume = 0\nif (camera == \"HQ Camera\"){\n volume = nb_frame * (process_pixel*4056*process_pixel*3040*cell/1000000000) / 1000;\n}\nelse if (camera == \"Camera v2.1\"){\n volume = nb_frame * (process_pixel*3280*process_pixel*2464*cell/1000000000) / 1000;\n}\nelse{\n msg.payload = \"The camera is not known to this system\";\n return msg;\n}\n\nglobal.set(\"acq_imaged_volume\", volume.toFixed(4))\n\nmsg.payload = volume.toFixed(2) + \" mL\"\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 950,
- "y": 140,
- "wires": [
- [
- "9bd72495.a8a098"
- ]
- ],
- "info": "### Focusing\n##### focus.py `nb_step` `orientation`\n\n- `nb_step` : **integer** (from 1 to 100000) - number of step to perform by the stage (about 31um/step)\n- `orientation` : **string** - orientation of the focus either `up` or `down`\n\nExample:\n\n python3.7 $HOME/PlanktoScope/scripts/focus.py 650 up\n"
- },
- {
- "id": "8e16aa2f.e40398",
- "type": "ui_text",
- "z": "baa1e3d9.cb29d",
- "group": "4322c187.e73e5",
- "order": 7,
- "width": 5,
- "height": 1,
- "name": "Total pumped volume",
- "label": "Total pumped volume",
- "format": "{{msg.payload}} mL",
- "layout": "col-center",
- "x": 1200,
- "y": 300,
- "wires": []
- },
- {
- "id": "67091ac0.8f9f6c",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "acq_volume calc",
- "func": "var imaging_pump_volume = global.get(\"imaging_pump_volume\");\nvar nb_frame = global.get(\"nb_frame\");\nvar acq_volume = 0\n\nacq_volume = (Number(nb_frame)*Number(imaging_pump_volume)).toFixed(2)\nglobal.set(\"acq_volume\", acq_volume)\n\nmsg.payload = acq_volume\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 940,
- "y": 300,
- "wires": [
- [
- "8e16aa2f.e40398"
- ]
- ],
- "info": "### Focusing\n##### focus.py `nb_step` `orientation`\n\n- `nb_step` : **integer** (from 1 to 100000) - number of step to perform by the stage (about 31um/step)\n- `orientation` : **string** - orientation of the focus either `up` or `down`\n\nExample:\n\n python3.7 $HOME/PlanktoScope/scripts/focus.py 650 up\n"
- },
- {
- "id": "2b9d6988.d84836",
- "type": "switch",
- "z": "baa1e3d9.cb29d",
- "name": "",
- "property": "payload",
- "propertyType": "msg",
- "rules": [
- {
- "t": "hask",
- "v": "status",
- "vt": "str"
- },
- {
- "t": "hask",
- "v": "camera_name",
- "vt": "str"
- }
- ],
- "checkall": "true",
- "repair": false,
- "outputs": 2,
- "x": 650,
- "y": 760,
- "wires": [
- [
- "2b009bd7.c07004"
- ],
- [
- "3bbb756a.84190a"
- ]
- ]
- },
- {
- "id": "3bbb756a.84190a",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "set camera name",
- "func": "global.set(\"acq_camera\", msg.payload.camera_name);\n\nmsg.payload = msg.payload.camera_name;\n\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 810,
- "y": 780,
- "wires": [
- [
- "559a8085.1d6b9"
- ]
- ]
- },
- {
- "id": "559a8085.1d6b9",
- "type": "link out",
- "z": "baa1e3d9.cb29d",
- "name": "Camera Name",
- "links": [
- "30067f35.532f2",
- "572a6daa.6004c4",
- "cfc783d7.d6ceb"
- ],
- "x": 965,
- "y": 780,
- "wires": []
- },
- {
- "id": "30067f35.532f2",
- "type": "link in",
- "z": "1371dec5.76e671",
- "name": "Camera Name",
- "links": [
- "559a8085.1d6b9"
- ],
- "x": 875,
- "y": 620,
- "wires": [
- [
- "f783aefd.c3bfd8"
- ]
- ]
- },
- {
- "id": "11b51f8f.acd308",
- "type": "python3-function",
- "z": "1371dec5.76e671",
- "d": true,
- "name": "fan temperature",
- "func": "import smbus\nbus = smbus.SMBus(1)\n\naddr = 0x0d\nfan_reg = 0x08\n\ntemp = float( msg[\"payload\"])\n\n# 0x01 full speed, 0x02: 20% speed, ..., 0x09: 90% speed\n\nif temp < 38:\n bus.write_byte_data(addr, fan_reg, 0x00)\nelif temp < 43:\n bus.write_byte_data(addr, fan_reg, 0x02)\nelif temp < 46:\n bus.write_byte_data(addr, fan_reg, 0x04)\nelif temp < 48:\n bus.write_byte_data(addr, fan_reg, 0x06)\nelif temp < 52:\n bus.write_byte_data(addr, fan_reg, 0x08)\nelse:\n bus.write_byte_data(addr, fan_reg, 0x01)\n\nreturn msg",
- "outputs": 1,
- "x": 1440,
- "y": 120,
- "wires": [
- []
- ]
- },
- {
- "id": "cbb123ab.fd3428",
- "type": "ui_ui_control",
- "z": "b771c342.49603",
- "name": "show/hide net groups",
- "events": "change",
- "x": 1320,
- "y": 300,
- "wires": [
- []
- ]
- },
- {
- "id": "c8749cbb.55254",
- "type": "function",
- "z": "cb95299c.2817c8",
- "name": "set global",
- "func": "global.set(msg.topic, msg.payload);",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 960,
- "y": 380,
- "wires": [
- []
- ]
- },
- {
- "id": "d43c3ed9.e6cb1",
- "type": "ui_template",
- "z": "cb95299c.2817c8",
- "group": "46be9c86.dea684",
- "name": "Object counts",
- "order": 3,
- "width": 0,
- "height": 0,
- "format": "
Object counts ",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": true,
- "templateScope": "local",
- "x": 1340,
- "y": 760,
- "wires": [
- []
- ]
- },
- {
- "id": "857e90c1.cd25b",
- "type": "ui_template",
- "z": "cb95299c.2817c8",
- "group": "46be9c86.dea684",
- "name": "Area chart",
- "order": 8,
- "width": 0,
- "height": 0,
- "format": "
Area chart ",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": true,
- "templateScope": "local",
- "x": 1320,
- "y": 880,
- "wires": [
- []
- ]
- },
- {
- "id": "49ea1123.ee1768",
- "type": "ui_numeric",
- "z": "baa1e3d9.cb29d",
- "name": "sleep_before",
- "label": "Delay to stabilize image (s)",
- "tooltip": "Happens before every capture",
- "group": "4322c187.e73e5",
- "order": 4,
- "width": 5,
- "height": 1,
- "wrap": false,
- "passthru": true,
- "topic": "sleep_before",
- "format": "{{value}}",
- "min": "0.1",
- "max": "5",
- "step": "0.1",
- "x": 670,
- "y": 120,
- "wires": [
- [
- "fb887036.12429"
- ]
- ]
- },
- {
- "id": "2911fbc6.d28c24",
- "type": "ui_template",
- "z": "c1660bc.e7ff7f8",
- "group": "c0ebfc57.42527",
- "name": "Image browser",
- "order": 1,
- "width": 24,
- "height": 24,
- "format": "\n\n \n ",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": false,
- "templateScope": "local",
- "x": 400,
- "y": 100,
- "wires": [
- []
- ]
- },
- {
- "id": "572a6daa.6004c4",
- "type": "link in",
- "z": "baa1e3d9.cb29d",
- "name": "",
- "links": [
- "559a8085.1d6b9"
- ],
- "x": 795,
- "y": 140,
- "wires": [
- [
- "99b11fe4.2795d"
- ]
- ]
- },
- {
- "id": "642ff403.1ed91c",
- "type": "ui_text_input",
- "z": "b771c342.49603",
- "name": "sample_concentrated_sample_volume",
- "label": "Concentrated sample volume (mL)",
- "tooltip": "Volume extracted from the net codend (in mL)",
- "group": "3e1ba03d.f01d8",
- "order": 12,
- "width": 10,
- "height": 1,
- "passthru": true,
- "mode": "number",
- "delay": "0",
- "topic": "sample_concentrated_sample_volume",
- "topicType": "str",
- "x": 590,
- "y": 440,
- "wires": [
- [
- "9f501f49.45645"
- ]
- ]
- },
- {
- "id": "e967b844.46aa48",
- "type": "ui_text_input",
- "z": "b771c342.49603",
- "name": "sample_gear_net_opening",
- "label": "Net opening dimension (mm)",
- "tooltip": "Size of the net mouth opening (in mm)",
- "group": "cf5d9f0e.d57e7",
- "order": 1,
- "width": 10,
- "height": 1,
- "passthru": true,
- "mode": "number",
- "delay": "0",
- "topic": "sample_gear_net_opening",
- "x": 630,
- "y": 320,
- "wires": [
- [
- "9f501f49.45645"
- ]
- ]
- },
- {
- "id": "8032ea50.1b57f",
- "type": "ui_template",
- "z": "baa1e3d9.cb29d",
- "group": "b5d61bc7.54fe48",
- "name": "progress header",
- "order": 1,
- "width": 0,
- "height": 0,
- "format": "Capture progress ",
- "storeOutMessages": false,
- "fwdInMessages": false,
- "resendOnRefresh": false,
- "templateScope": "local",
- "x": 1260,
- "y": 820,
- "wires": [
- []
- ]
- },
- {
- "id": "eaf74a43.fa27d",
- "type": "switch",
- "z": "1371dec5.76e671",
- "name": "if disk > 90%",
- "property": "payload",
- "propertyType": "msg",
- "rules": [
- {
- "t": "gte",
- "v": "90",
- "vt": "num"
- }
- ],
- "checkall": "true",
- "repair": false,
- "outputs": 1,
- "x": 590,
- "y": 420,
- "wires": [
- [
- "6d09f428.930bcc"
- ]
- ]
- },
- {
- "id": "46d5e78b.15f998",
- "type": "ui_toast",
- "z": "1371dec5.76e671",
- "position": "dialog",
- "displayTime": "10",
- "highlight": "",
- "sendall": true,
- "outputs": 1,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "",
- "name": "",
- "x": 1090,
- "y": 420,
- "wires": [
- []
- ]
- },
- {
- "id": "24df077a.cb252",
- "type": "change",
- "z": "1371dec5.76e671",
- "name": "full disk msg",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "\"Your drive has reached 90% capacity, you should do a backup to an external drive and a purge.\"",
- "tot": "str"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 930,
- "y": 420,
- "wires": [
- [
- "46d5e78b.15f998"
- ]
- ]
- },
- {
- "id": "df1ea904.cd261",
- "type": "ui_slider",
- "z": "baa1e3d9.cb29d",
- "name": "imaging_pump_volume",
- "label": "Pumped volume (mL)",
- "tooltip": "inbetween frames",
- "group": "4322c187.e73e5",
- "order": 3,
- "width": 0,
- "height": 0,
- "passthru": true,
- "outs": "end",
- "topic": "imaging_pump_volume",
- "min": "0.001",
- "max": "0.5",
- "step": "0.001",
- "x": 640,
- "y": 320,
- "wires": [
- [
- "fb887036.12429",
- "67091ac0.8f9f6c"
- ]
- ]
- },
- {
- "id": "a4abb1ae.2ae418",
- "type": "subflow:1c24ad9c.bebec2",
- "z": "baa1e3d9.cb29d",
- "name": "",
- "env": [],
- "x": 930,
- "y": 520,
- "wires": [
- []
- ]
- },
{
"id": "cfc783d7.d6ceb",
"type": "link in",
@@ -5026,2446 +3736,6 @@
]
]
},
- {
- "id": "c0ce5626.b6c5",
- "type": "ui_toast",
- "z": "b771c342.49603",
- "position": "dialog",
- "displayTime": "3",
- "highlight": "",
- "sendall": true,
- "outputs": 1,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "",
- "name": "",
- "x": 1230,
- "y": 620,
- "wires": [
- []
- ]
- },
- {
- "id": "33c28dc1.238002",
- "type": "function",
- "z": "cb95299c.2817c8",
- "name": "prepare segmentation",
- "func": "global.set('obj_counter', 0);\n\nvar segmentation_list = flow.get('segmentation_list')\nif (segmentation_list !== undefined && segmentation_list !== \"\") {\n msg.payload['path'] = segmentation_list\n}\n\n\nvar force = flow.get('force')\nif (force !== undefined && force !== \"\") {\n msg.payload['settings'] = {\"force\":Boolean(force)}\n}\n\n\nvar recursive = flow.get('recursive')\nif (recursive !== undefined && recursive !== \"\") {\n if (\"settings\" in msg.payload){\n msg.payload.settings[\"recursive\"] = Boolean(recursive)\n }\n else{\n msg.payload['settings'] = {\"recursive\": Boolean(recursive)}\n }\n}\n\nvar ecotaxa = flow.get('ecotaxa')\nif (ecotaxa !== undefined && ecotaxa !== \"\") {\n if (\"settings\" in msg.payload){\n msg.payload.settings[\"ecotaxa\"] = Boolean(ecotaxa)\n }\n else{\n msg.payload['settings'] = {\"ecotaxa\": Boolean(ecotaxa)}\n }\n}\n\nvar keep = flow.get('keep')\nif (keep !== undefined && keep !== \"\") {\n if (\"settings\" in msg.payload){\n msg.payload.settings[\"keep\"] = Boolean(keep)\n }\n else{\n msg.payload['settings'] = {\"keep\": Boolean(keep)}\n }\n}\n\nvar process_id = global.get('process_id')\nif (process_id !== undefined && process_id !== \"\") {\n if (\"settings\" in msg.payload){\n msg.payload.settings[\"process_id\"] = process_id\n }\n else{\n msg.payload['settings'] = {\"process_id\": process_id}\n }\n}\n\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 620,
- "y": 460,
- "wires": [
- [
- "16f3cef4.0acac9"
- ]
- ]
- },
- {
- "id": "b9bf06d6.26c518",
- "type": "exec",
- "z": "f21ba04.c26266",
- "command": "sudo iwlist wlan0 scan | grep ESSID | sed 's/ESSID://g;s/\"//g;s/^ *//;s/ *$//'",
- "addpay": false,
- "append": "",
- "useSpawn": "false",
- "timer": "",
- "oldrc": false,
- "name": "scan",
- "x": 450,
- "y": 80,
- "wires": [
- [
- "9642cb31.663b4"
- ],
- [],
- []
- ]
- },
- {
- "id": "9642cb31.663b4",
- "type": "function",
- "z": "f21ba04.c26266",
- "name": "parseOptions",
- "func": "var ssids = msg.payload.split('\\n').filter(s => !!s)\n\nssids = [...new Set(ssids)];\n\nmsg.options = ssids\nmsg.payload = null\n\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "x": 630,
- "y": 80,
- "wires": [
- [
- "dbc0d44.5361b28"
- ]
- ]
- },
- {
- "id": "dbc0d44.5361b28",
- "type": "ui_dropdown",
- "z": "f21ba04.c26266",
- "name": "",
- "label": "Wifi",
- "tooltip": "",
- "place": "Select a WIFI",
- "group": "9e409235.73cd7",
- "order": 1,
- "width": 0,
- "height": 0,
- "passthru": false,
- "multiple": false,
- "options": [],
- "payload": "",
- "topic": "",
- "x": 790,
- "y": 80,
- "wires": [
- [
- "cdfa9013.b91278"
- ]
- ]
- },
- {
- "id": "2bf338e3.966468",
- "type": "ui_button",
- "z": "f21ba04.c26266",
- "name": "",
- "group": "9e409235.73cd7",
- "order": 2,
- "width": 0,
- "height": 0,
- "passthru": false,
- "label": "Scan",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "fa-wifi fa-2x",
- "payload": "true",
- "payloadType": "bool",
- "topic": "",
- "x": 270,
- "y": 40,
- "wires": [
- [
- "b9bf06d6.26c518"
- ]
- ]
- },
- {
- "id": "4c0400c.69a1e8",
- "type": "exec",
- "z": "f21ba04.c26266",
- "command": "ip -j addr show",
- "addpay": false,
- "append": "",
- "useSpawn": "false",
- "timer": "",
- "oldrc": false,
- "name": "getInfo",
- "x": 450,
- "y": 180,
- "wires": [
- [
- "88e05f37a8745216"
- ],
- [],
- []
- ]
- },
- {
- "id": "bcb20e39.00cea8",
- "type": "function",
- "z": "f21ba04.c26266",
- "name": "parse IP Info",
- "func": "var ip = \"\";\nvar broadcast = \"\";\nvar iface = \"\";\nvar iface_up = false;\n\nif (msg.rc.code === 0){\n payload = msg.payload\n for (let info in payload) {\n if (payload[info].operstate === \"UP\") {\n \tif (iface_up){\n \t// We have two concurrent interfaces up\n // We need to deactivate one\n ip = \"Remove Ethernet cable or disconnect wifi\"\n broadcast = \"Remove Ethernet cable or disconnect wifi\"\n iface = \"Remove Ethernet cable or disconnect wifi\"\n break\n }\n if (payload[info].ifname === \"eth0\") {\n iface = \"Ethernet\"\n } else if (payload[info].ifname === \"wifi0\" || payload[info].ifname === \"wlan0\") {\n iface = \"Wifi\"\n }\n ip = payload[info].addr_info[0].local;\n broadcast = payload[info].addr_info[0].broadcast;\n iface_up = true;\n }\n }\n}\n\nif (iface_up) {\n return([{\n topic: 'interface',\n payload: iface\n }, {\n topic: 'ip',\n payload: ip\n }, {\n topic: 'broadcast',\n payload: broadcast\n }])\n}\n",
- "outputs": 3,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 730,
- "y": 180,
- "wires": [
- [
- "67d052ba.99ff24"
- ],
- [
- "d71c8185.800fd",
- "49111a72f4e32740"
- ],
- [
- "dc305a26.b33fc"
- ]
- ],
- "outputLabels": [
- "interface",
- "ip",
- "broadcast"
- ]
- },
- {
- "id": "d71c8185.800fd",
- "type": "ui_text",
- "z": "f21ba04.c26266",
- "group": "919923a3.d10868",
- "order": 2,
- "width": 0,
- "height": 0,
- "name": "",
- "label": "IP",
- "format": "{{msg.payload || '---'}}",
- "layout": "row-spread",
- "x": 930,
- "y": 180,
- "wires": []
- },
- {
- "id": "67d052ba.99ff24",
- "type": "ui_text",
- "z": "f21ba04.c26266",
- "group": "919923a3.d10868",
- "order": 1,
- "width": 0,
- "height": 0,
- "name": "",
- "label": "Interface",
- "format": "{{msg.payload || '---'}}",
- "layout": "row-spread",
- "x": 940,
- "y": 140,
- "wires": []
- },
- {
- "id": "dc305a26.b33fc",
- "type": "ui_text",
- "z": "f21ba04.c26266",
- "group": "919923a3.d10868",
- "order": 3,
- "width": 0,
- "height": 0,
- "name": "",
- "label": "Broadcast",
- "format": "{{msg.payload || '---'}}",
- "layout": "row-spread",
- "x": 940,
- "y": 220,
- "wires": []
- },
- {
- "id": "94b2e8fc.aa20e",
- "type": "ui_form",
- "z": "f21ba04.c26266",
- "name": "",
- "label": "Update",
- "group": "9e409235.73cd7",
- "order": 3,
- "width": 0,
- "height": 0,
- "options": [
- {
- "label": "SSID",
- "value": "ssid",
- "type": "text",
- "required": true,
- "rows": null
- },
- {
- "label": "Password",
- "value": "password",
- "type": "text",
- "required": true,
- "rows": null
- }
- ],
- "formValue": {
- "ssid": "",
- "password": ""
- },
- "payload": "",
- "submit": "Add the network",
- "cancel": "Reset fields",
- "topic": "",
- "x": 1100,
- "y": 80,
- "wires": [
- [
- "d59021e3.1b63e8"
- ]
- ]
- },
- {
- "id": "cdfa9013.b91278",
- "type": "function",
- "z": "f21ba04.c26266",
- "name": "insert ssid",
- "func": "\nmsg.payload = {ssid: msg.payload}\n\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 940,
- "y": 80,
- "wires": [
- [
- "94b2e8fc.aa20e"
- ]
- ]
- },
- {
- "id": "448b4c37.be50bc",
- "type": "exec",
- "z": "f21ba04.c26266",
- "command": "iw dev wlan0 info",
- "addpay": false,
- "append": "",
- "useSpawn": "false",
- "timer": "",
- "oldrc": false,
- "name": "getCurrentSSID",
- "x": 480,
- "y": 260,
- "wires": [
- [
- "151819d4.0dbe56"
- ],
- [],
- []
- ]
- },
- {
- "id": "c8a5ae48.ef1308",
- "type": "ui_text",
- "z": "f21ba04.c26266",
- "group": "919923a3.d10868",
- "order": 4,
- "width": 0,
- "height": 0,
- "name": "",
- "label": "SSID",
- "format": "{{msg.payload || '---'}}",
- "layout": "row-spread",
- "x": 930,
- "y": 259,
- "wires": []
- },
- {
- "id": "151819d4.0dbe56",
- "type": "function",
- "z": "f21ba04.c26266",
- "name": "parse SSID",
- "func": "var ssid = \"\"\n\nif (msg.rc.code === 0){\n ssid = msg.payload.match(/\\sssid (.+)/)[1];\n return({topic: 'ssid', payload: ssid})\n}\n",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 730,
- "y": 260,
- "wires": [
- [
- "c8a5ae48.ef1308"
- ]
- ]
- },
- {
- "id": "ff059f3f.9c0f28",
- "type": "ui_ui_control",
- "z": "f21ba04.c26266",
- "name": "onTab",
- "events": "all",
- "x": 130,
- "y": 80,
- "wires": [
- [
- "f103cd20eb4362a4"
- ]
- ]
- },
- {
- "id": "167d7bd0.679ce4",
- "type": "function",
- "z": "f21ba04.c26266",
- "name": "update contry code",
- "func": "var template = `sudo sed -i \\\"s/^country.*/country=\"${msg.payload}\"/\\\" /home/pi/wpa_supplicant.conf`\n// sudo tee /etc/wpa_supplicant/wpa_supplicant.conf <\n function selectElementContents(el) {\n var body = document.body, range, sel;\n if (document.createRange && window.getSelection) {\n range = document.createRange();\n sel = window.getSelection();\n sel.removeAllRanges();\n try {\n range.selectNodeContents(el);\n sel.addRange(range);\n } catch (e) {\n range.selectNode(el);\n sel.addRange(range);\n }\n document.execCommand(\"copy\");\n sel.removeAllRanges();\n\n } else if (body.createTextRange) {\n range = body.createTextRange();\n range.moveToElementText(el);\n range.select();\n range.execCommand(\"Copy\");\n }\n }\n\n\n\n Copy Log\n \n\n\n\n",
- "storeOutMessages": false,
- "fwdInMessages": false,
- "resendOnRefresh": false,
- "templateScope": "local",
- "x": 1580,
- "y": 640,
- "wires": [
- []
- ]
- },
- {
- "id": "8b511c2b.9c24c8",
- "type": "function",
- "z": "9daf9e2b.019fc",
- "name": "Log array",
- "func": "var log = flow.get(\"python_log\")||[];\n\nlog = log.concat(msg.payload.trim().split('\\n'));\n\nwhile (log.length > 500){\n log.shift();\n}\n\nflow.set(\"python_log\", log);\n\nmsg.payload = log;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1400,
- "y": 560,
- "wires": [
- [
- "d12008a0.47be4"
- ]
- ]
- },
- {
- "id": "7a1dedf.1c63094",
- "type": "ui_button",
- "z": "9daf9e2b.019fc",
- "name": "",
- "group": "a7d64879.38298",
- "order": 2,
- "width": 0,
- "height": 0,
- "passthru": true,
- "label": "Clear Log",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "fa-eraser",
- "payload": "",
- "payloadType": "str",
- "topic": "",
- "topicType": "str",
- "x": 1220,
- "y": 720,
- "wires": [
- [
- "73500be7.9ab7c4"
- ]
- ]
- },
- {
- "id": "9187bf97.9922b8",
- "type": "catch",
- "z": "9daf9e2b.019fc",
- "name": "Catch Errors",
- "scope": null,
- "uncaught": false,
- "x": 1050,
- "y": 660,
- "wires": [
- [
- "f9a871d5.a73828"
- ]
- ]
- },
- {
- "id": "f9a871d5.a73828",
- "type": "function",
- "z": "9daf9e2b.019fc",
- "name": "Get error",
- "func": "msg.payload = \"Node Red Error: \" + msg.error + \" created by the message \" + msg.payload;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 1220,
- "y": 660,
- "wires": [
- [
- "8b511c2b.9c24c8"
- ]
- ]
- },
- {
- "id": "73500be7.9ab7c4",
- "type": "function",
- "z": "9daf9e2b.019fc",
- "name": "Clear log",
- "func": "flow.set(\"python_log\", [\"Log cleared!\"]);\n\nmsg.payload = [\"Log cleared!\"];\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1400,
- "y": 720,
- "wires": [
- [
- "d12008a0.47be4"
- ]
- ]
- },
- {
- "id": "7372e83e.5fc0e8",
- "type": "inject",
- "z": "9daf9e2b.019fc",
- "name": "once",
- "props": [
- {
- "p": "payload"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": "2",
- "topic": "",
- "payload": "start",
- "payloadType": "str",
- "x": 150,
- "y": 600,
- "wires": [
- [
- "466eb611.4da048"
- ]
- ]
- },
- {
- "id": "f344dc9e.3c9278",
- "type": "ui_button",
- "z": "1371dec5.76e671",
- "name": "",
- "group": "3ca00bf9.e5cac4",
- "order": 1,
- "width": 4,
- "height": 1,
- "passthru": false,
- "label": "Home",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "home",
- "payload": "{\"tab\":\"Home\"}",
- "payloadType": "json",
- "topic": "",
- "x": 430,
- "y": 740,
- "wires": [
- [
- "5f94b366.e4d3a4"
- ]
- ]
- },
- {
- "id": "5f94b366.e4d3a4",
- "type": "ui_ui_control",
- "z": "1371dec5.76e671",
- "name": "",
- "events": "change",
- "x": 580,
- "y": 740,
- "wires": [
- []
- ]
- },
- {
- "id": "43cf8ff7.75231",
- "type": "rpi-gpio out",
- "z": "9daf9e2b.019fc",
- "name": "Pump Enable",
- "pin": "7",
- "set": true,
- "level": "1",
- "freq": "",
- "out": "out",
- "x": 410,
- "y": 80,
- "wires": []
- },
- {
- "id": "4bca8a25.15be3c",
- "type": "rpi-gpio out",
- "z": "9daf9e2b.019fc",
- "name": "Focus Enable",
- "pin": "32",
- "set": true,
- "level": "1",
- "freq": "",
- "out": "out",
- "x": 420,
- "y": 120,
- "wires": []
- },
- {
- "id": "50f9b5b.a84bccc",
- "type": "inject",
- "z": "9daf9e2b.019fc",
- "name": "Default: ON",
- "props": [
- {
- "p": "payload"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": "0.01",
- "topic": "",
- "payload": "true",
- "payloadType": "bool",
- "x": 150,
- "y": 100,
- "wires": [
- [
- "43cf8ff7.75231",
- "4bca8a25.15be3c",
- "6db0fcf5.f0effc",
- "5fc4ede4.72516c"
- ]
- ]
- },
- {
- "id": "8bd1f3dc.9affe8",
- "type": "exec",
- "z": "9daf9e2b.019fc",
- "command": "",
- "addpay": true,
- "append": "",
- "useSpawn": "false",
- "timer": "1",
- "oldrc": false,
- "name": "git user.name",
- "x": 1150,
- "y": 60,
- "wires": [
- [],
- [],
- []
- ]
- },
- {
- "id": "b40d1f65.39e14",
- "type": "template",
- "z": "9daf9e2b.019fc",
- "name": "git config",
- "field": "payload",
- "fieldType": "msg",
- "format": "handlebars",
- "syntax": "mustache",
- "template": "git config --global --replace-all user.name \"{{payload}}\"",
- "output": "str",
- "x": 960,
- "y": 60,
- "wires": [
- [
- "8bd1f3dc.9affe8"
- ]
- ]
- },
- {
- "id": "35eb925e.5f8016",
- "type": "link in",
- "z": "9daf9e2b.019fc",
- "name": "Git config",
- "links": [
- "52af9ac0.60eb24"
- ],
- "x": 795,
- "y": 100,
- "wires": [
- [
- "b40d1f65.39e14",
- "6d7dd372.3b7814"
- ]
- ]
- },
- {
- "id": "4e5183bd.e77bac",
- "type": "exec",
- "z": "9daf9e2b.019fc",
- "command": "",
- "addpay": true,
- "append": "",
- "useSpawn": "false",
- "timer": "1",
- "oldrc": false,
- "name": "git user.email",
- "x": 1150,
- "y": 140,
- "wires": [
- [],
- [],
- []
- ]
- },
- {
- "id": "6d7dd372.3b7814",
- "type": "template",
- "z": "9daf9e2b.019fc",
- "name": "git config",
- "field": "payload",
- "fieldType": "msg",
- "format": "handlebars",
- "syntax": "mustache",
- "template": "git config --global --replace-all user.email \"{{payload}}\"",
- "output": "str",
- "x": 960,
- "y": 140,
- "wires": [
- [
- "4e5183bd.e77bac"
- ]
- ]
- },
- {
- "id": "e564e9ad.7c312",
- "type": "ui_button",
- "z": "9daf9e2b.019fc",
- "d": true,
- "name": "Update",
- "group": "1be83144.4fe4bf",
- "order": 13,
- "width": 4,
- "height": 1,
- "passthru": false,
- "label": "System Update",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "mi-system_update",
- "payload": " ",
- "payloadType": "str",
- "topic": "update",
- "topicType": "str",
- "x": 260,
- "y": 460,
- "wires": [
- []
- ]
- },
- {
- "id": "2d2ef1fd.40e6e6",
- "type": "exec",
- "z": "9daf9e2b.019fc",
- "command": "bash /home/pi/PlanktoScope/scripts/bash/start_update.sh",
- "addpay": true,
- "append": "",
- "useSpawn": "true",
- "timer": "",
- "oldrc": false,
- "name": "Update",
- "x": 420,
- "y": 460,
- "wires": [
- [
- "64f61762.68c788",
- "8b511c2b.9c24c8",
- "83c5a708.a5715",
- "d334d264.8a7728"
- ],
- [
- "8b511c2b.9c24c8"
- ],
- []
- ]
- },
- {
- "id": "8f08c4eb.db74b8",
- "type": "ui_template",
- "z": "9daf9e2b.019fc",
- "group": "1be83144.4fe4bf",
- "name": "Update message",
- "order": 1,
- "width": 12,
- "height": 3,
- "format": "
If you want to update to the latest code version of Node-Red and Python, please click here.\nWe are trying to save your configuration changes with git stash and restore them afterwards, but clearly, things may break!\nAlso, you can choose the branch you want to update to. BE CAREFUL, selecting a branch WILL update the code immediately.\nIf you have made changes to the flow, you will lose them. Please commit those changes from Node-Red interface, from the Project History tab. ",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": true,
- "templateScope": "local",
- "x": 150,
- "y": 260,
- "wires": [
- []
- ]
- },
- {
- "id": "64f61762.68c788",
- "type": "ui_toast",
- "z": "9daf9e2b.019fc",
- "position": "dialog",
- "displayTime": "10",
- "highlight": "",
- "sendall": true,
- "outputs": 1,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "",
- "name": "Update notif",
- "x": 730,
- "y": 440,
- "wires": [
- []
- ]
- },
- {
- "id": "d59021e3.1b63e8",
- "type": "function",
- "z": "f21ba04.c26266",
- "name": "add network",
- "func": "var data = msg.payload\n\nvar command = `wpa_passphrase \"${data.ssid}\" \"${data.password}\" | sed '/#psk=\".*\"/d' | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf > /dev/null`\n \nmsg.payload = command\n\nreturn msg",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 1270,
- "y": 80,
- "wires": [
- [
- "64a1f2f2.3de8b4"
- ]
- ]
- },
- {
- "id": "64a1f2f2.3de8b4",
- "type": "exec",
- "z": "f21ba04.c26266",
- "command": "",
- "addpay": true,
- "append": "",
- "useSpawn": "false",
- "timer": "",
- "oldrc": false,
- "name": "Save Network",
- "x": 1460,
- "y": 80,
- "wires": [
- [
- "6868b4c4.65987c"
- ],
- [],
- []
- ]
- },
- {
- "id": "6868b4c4.65987c",
- "type": "exec",
- "z": "f21ba04.c26266",
- "command": "sudo /usr/bin/autohotspotN >/dev/null",
- "addpay": false,
- "append": "",
- "useSpawn": "false",
- "timer": "",
- "oldrc": false,
- "name": "reconfigure",
- "x": 1250,
- "y": 180,
- "wires": [
- [
- "59e24c40.e1a4dc"
- ],
- [],
- []
- ]
- },
- {
- "id": "59e24c40.e1a4dc",
- "type": "function",
- "z": "f21ba04.c26266",
- "name": "showMessage",
- "func": "msg.payload = \"Wifi configuration updated successfully\"\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 1420,
- "y": 180,
- "wires": [
- [
- "4ecb6be2.ad39f4"
- ]
- ]
- },
- {
- "id": "4ecb6be2.ad39f4",
- "type": "ui_toast",
- "z": "f21ba04.c26266",
- "position": "dialog",
- "displayTime": "3",
- "highlight": "",
- "sendall": true,
- "outputs": 1,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "",
- "name": "",
- "x": 1590,
- "y": 180,
- "wires": [
- []
- ]
- },
- {
- "id": "f30bf784.90d58",
- "type": "ui_dropdown",
- "z": "1371dec5.76e671",
- "name": "",
- "label": "",
- "tooltip": "",
- "place": "Choose USB device",
- "group": "52d1b77.28369c8",
- "order": 2,
- "width": 0,
- "height": 0,
- "passthru": false,
- "multiple": false,
- "options": [
- {
- "label": "",
- "value": "No Drive Detected",
- "type": "str"
- }
- ],
- "payload": "",
- "topic": "device_path",
- "x": 840,
- "y": 820,
- "wires": [
- [
- "d1b9fed3.f3ead8"
- ]
- ]
- },
- {
- "id": "fe29acc2.c25d18",
- "type": "ui_button",
- "z": "1371dec5.76e671",
- "name": "Detect drive",
- "group": "52d1b77.28369c8",
- "order": 1,
- "width": 0,
- "height": 0,
- "passthru": false,
- "label": "Detect drive",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "fa-usb fa-2x",
- "payload": "",
- "payloadType": "str",
- "topic": "",
- "x": 150,
- "y": 820,
- "wires": [
- [
- "4c00cd96.6b2f6c"
- ]
- ]
- },
- {
- "id": "4c00cd96.6b2f6c",
- "type": "exec",
- "z": "1371dec5.76e671",
- "command": "lsblk --bytes --json --paths --output-all",
- "addpay": false,
- "append": "",
- "useSpawn": "false",
- "timer": "",
- "oldrc": false,
- "name": "detect drive",
- "x": 330,
- "y": 820,
- "wires": [
- [
- "2dc1e43d.cd3d64"
- ],
- [],
- []
- ]
- },
- {
- "id": "2dc1e43d.cd3d64",
- "type": "json",
- "z": "1371dec5.76e671",
- "name": "",
- "property": "payload",
- "action": "",
- "pretty": false,
- "x": 490,
- "y": 820,
- "wires": [
- [
- "6b730649.09351"
- ]
- ]
- },
- {
- "id": "6b730649.09351",
- "type": "change",
- "z": "1371dec5.76e671",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "options",
- "pt": "msg",
- "to": "[payload.blockdevices.children[mountpoint=null].name]",
- "tot": "jsonata"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 660,
- "y": 820,
- "wires": [
- [
- "f30bf784.90d58"
- ]
- ]
- },
- {
- "id": "1ece8d8e.1008e2",
- "type": "ui_button",
- "z": "1371dec5.76e671",
- "name": "Backup to USB",
- "group": "52d1b77.28369c8",
- "order": 3,
- "width": 0,
- "height": 0,
- "passthru": false,
- "label": "Backup to USB",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "archive",
- "payload": "",
- "payloadType": "str",
- "topic": "USB Backup",
- "x": 160,
- "y": 900,
- "wires": [
- [
- "6b2fed77.883c0c"
- ]
- ]
- },
- {
- "id": "d1b9fed3.f3ead8",
- "type": "function",
- "z": "1371dec5.76e671",
- "name": "set local",
- "func": "flow.set(msg.topic,msg.payload);",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 1000,
- "y": 820,
- "wires": [
- []
- ]
- },
- {
- "id": "6b2fed77.883c0c",
- "type": "function",
- "z": "1371dec5.76e671",
- "name": "get device_path",
- "func": "msg.payload = flow.get(\"device_path\");\nreturn msg",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 340,
- "y": 900,
- "wires": [
- [
- "df4d4d6a.24787"
- ]
- ]
- },
- {
- "id": "c74fe76.bcba718",
- "type": "exec",
- "z": "1371dec5.76e671",
- "command": "sudo /home/pi/PlanktoScope/scripts/bash/usb_backup.sh",
- "addpay": true,
- "append": "",
- "useSpawn": "true",
- "timer": "",
- "oldrc": false,
- "name": "usb_backup.sh",
- "x": 720,
- "y": 920,
- "wires": [
- [
- "72f5e8d4.40fcb8"
- ],
- [],
- [
- "a2c36500.6d376"
- ]
- ]
- },
- {
- "id": "df4d4d6a.24787",
- "type": "switch",
- "z": "1371dec5.76e671",
- "name": "No Drive",
- "property": "payload",
- "propertyType": "msg",
- "rules": [
- {
- "t": "eq",
- "v": "No Drive Detected",
- "vt": "str"
- },
- {
- "t": "else"
- }
- ],
- "checkall": "false",
- "repair": false,
- "outputs": 2,
- "x": 520,
- "y": 900,
- "wires": [
- [
- "9a577caa.1535a"
- ],
- [
- "c74fe76.bcba718",
- "4997446.5176d3c"
- ]
- ]
- },
- {
- "id": "9a577caa.1535a",
- "type": "ui_toast",
- "z": "1371dec5.76e671",
- "position": "dialog",
- "displayTime": "5",
- "highlight": "",
- "sendall": true,
- "outputs": 1,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "",
- "name": "",
- "x": 710,
- "y": 880,
- "wires": [
- []
- ]
- },
- {
- "id": "72f5e8d4.40fcb8",
- "type": "ui_toast",
- "z": "1371dec5.76e671",
- "position": "top right",
- "displayTime": "5",
- "highlight": "",
- "sendall": true,
- "outputs": 0,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "",
- "name": "",
- "x": 930,
- "y": 900,
- "wires": []
- },
- {
- "id": "81a48376.27a66",
- "type": "ui_toast",
- "z": "1371dec5.76e671",
- "position": "dialog",
- "displayTime": "5",
- "highlight": "",
- "sendall": true,
- "outputs": 1,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "",
- "name": "",
- "x": 1110,
- "y": 980,
- "wires": [
- []
- ]
- },
- {
- "id": "a2c36500.6d376",
- "type": "function",
- "z": "1371dec5.76e671",
- "name": "return code",
- "func": "switch (msg.payload.code){\ncase 0:\n msg.payload = \"All files successfully copied, you can remove your usb drive!\";\n break;\ncase 1:\n msg.payload = \"There was an error!\";\n break;\ncase 2:\n msg.payload = \"Error: your device is already mounted\"\n break;\ncase 3:\n msg.payload = \"Error while mounting the device\"\n break;\ncase 4:\n msg.payload = \"Error: some files were corrupted during the copy!\"\n break;\n}\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 910,
- "y": 940,
- "wires": [
- [
- "81a48376.27a66"
- ]
- ]
- },
- {
- "id": "dde0025c.3df9f",
- "type": "ui_button",
- "z": "1371dec5.76e671",
- "name": "Purge local",
- "group": "52d1b77.28369c8",
- "order": 4,
- "width": 0,
- "height": 0,
- "passthru": false,
- "label": "Purge local data",
- "tooltip": "",
- "color": "",
- "bgcolor": "#AD1625",
- "icon": "delete_forever",
- "payload": "THIS IS GOING TO WIPE ALL THE LOCAL DATA. MAKE SURE YOU DID A BACKUP TO AN USB DRIVE BEFOREHAND.",
- "payloadType": "str",
- "topic": "BE EXTRA CAREFUL",
- "x": 150,
- "y": 1020,
- "wires": [
- [
- "ba72704a.8a38a"
- ]
- ]
- },
- {
- "id": "ba72704a.8a38a",
- "type": "ui_toast",
- "z": "1371dec5.76e671",
- "position": "dialog",
- "displayTime": "5",
- "highlight": "",
- "sendall": true,
- "outputs": 1,
- "ok": "GO BACK",
- "cancel": "YES I'M SURE, I WANT TO PURGE THE DATA",
- "raw": false,
- "topic": "Data purge",
- "name": "",
- "x": 330,
- "y": 1020,
- "wires": [
- [
- "d80e6307.3aaf8"
- ]
- ]
- },
- {
- "id": "d80e6307.3aaf8",
- "type": "switch",
- "z": "1371dec5.76e671",
- "name": "",
- "property": "payload",
- "propertyType": "msg",
- "rules": [
- {
- "t": "cont",
- "v": "YES I'M SURE",
- "vt": "str"
- }
- ],
- "checkall": "true",
- "repair": false,
- "outputs": 1,
- "x": 510,
- "y": 1020,
- "wires": [
- [
- "4a8cb5d4.52e4bc"
- ]
- ]
- },
- {
- "id": "4a8cb5d4.52e4bc",
- "type": "exec",
- "z": "1371dec5.76e671",
- "command": "rm -rf /home/pi/data/img /home/pi/data/objects /home/pi/data/export",
- "addpay": false,
- "append": "",
- "useSpawn": "false",
- "timer": "",
- "oldrc": false,
- "name": "rm data",
- "x": 700,
- "y": 1020,
- "wires": [
- [
- "c5b1e763.d1bba8"
- ],
- [],
- []
- ]
- },
- {
- "id": "c33f1124.af6688",
- "type": "ui_form",
- "z": "b771c342.49603",
- "name": "sample_location",
- "label": "Sample Location",
- "group": "cef1e703.bcf3c8",
- "order": 1,
- "width": 0,
- "height": 0,
- "options": [
- {
- "label": "Latitude (36.574439°N or 36°57.4439'N)",
- "value": "object_lat",
- "type": "text",
- "required": true,
- "rows": null
- },
- {
- "label": "Longitude (110.42100°W or 110°4.2100'W)",
- "value": "object_lon",
- "type": "text",
- "required": true,
- "rows": null
- },
- {
- "label": "Date (YYYY-MM-DD, UTC)",
- "value": "object_date",
- "type": "text",
- "required": true,
- "rows": null
- },
- {
- "label": "Time (HH:MM(:SS), UTC 24h)",
- "value": "object_time",
- "type": "text",
- "required": true,
- "rows": null
- }
- ],
- "formValue": {
- "object_lat": "",
- "object_lon": "",
- "object_date": "",
- "object_time": ""
- },
- "payload": "",
- "submit": "Validate",
- "cancel": "Reset",
- "topic": "sample_location",
- "x": 660,
- "y": 580,
- "wires": [
- [
- "14658615.47c862"
- ]
- ]
- },
- {
- "id": "358908cd.416ab",
- "type": "ui_form",
- "z": "b771c342.49603",
- "name": "net_throw_location",
- "label": "Net Throw Location",
- "group": "cf5d9f0e.d57e7",
- "order": 4,
- "width": 0,
- "height": 0,
- "options": [
- {
- "label": "Latitude (36.574439°N or 36°57.4439'N)",
- "value": "object_lat",
- "type": "text",
- "required": true,
- "rows": null
- },
- {
- "label": "Longitude (110.42100°W or 110°4.2100'W)",
- "value": "object_lon",
- "type": "text",
- "required": true,
- "rows": null
- },
- {
- "label": "Date (YYYY-MM-DD UTC)",
- "value": "object_date",
- "type": "text",
- "required": true,
- "rows": null
- },
- {
- "label": "Time (HH:MM, UTC 24h)",
- "value": "object_time",
- "type": "text",
- "required": true,
- "rows": null
- }
- ],
- "formValue": {
- "object_lat": "",
- "object_lon": "",
- "object_date": "",
- "object_time": ""
- },
- "payload": "",
- "submit": "Validate",
- "cancel": "",
- "topic": "net_throw_location",
- "topicType": "str",
- "splitLayout": false,
- "x": 650,
- "y": 620,
- "wires": [
- [
- "14658615.47c862"
- ]
- ]
- },
- {
- "id": "56d40584.eff4e4",
- "type": "ui_form",
- "z": "b771c342.49603",
- "name": "net_retrieval_location",
- "label": "Net Retrieval Location",
- "group": "cf5d9f0e.d57e7",
- "order": 5,
- "width": 0,
- "height": 0,
- "options": [
- {
- "label": "Latitude (36.574439°N or 36°57.4439'N)",
- "value": "object_lat_end",
- "type": "text",
- "required": true,
- "rows": null
- },
- {
- "label": "Longitude (110.42100°W or 110°4.2100'W)",
- "value": "object_lon_end",
- "type": "text",
- "required": true,
- "rows": null
- },
- {
- "label": "Date (YYYY-MM-DD UTC)",
- "value": "object_date_end",
- "type": "text",
- "required": true,
- "rows": null
- },
- {
- "label": "Time (HH:MM, UTC 24h)",
- "value": "object_time_end",
- "type": "text",
- "required": true,
- "rows": null
- }
- ],
- "formValue": {
- "object_lat_end": "",
- "object_lon_end": "",
- "object_date_end": "",
- "object_time_end": ""
- },
- "payload": "",
- "submit": "Validate",
- "cancel": "",
- "topic": "net_retrieval_location",
- "topicType": "str",
- "splitLayout": false,
- "x": 640,
- "y": 660,
- "wires": [
- [
- "14658615.47c862"
- ]
- ]
- },
- {
- "id": "14658615.47c862",
- "type": "function",
- "z": "b771c342.49603",
- "name": "Validate Location / Timestamp",
- "func": "function ConvertDDMMToDD(input) {\n // Input Format 36°57.4439'N, 110°4.2100'W\n // From https://stackoverflow.com/questions/1140189/converting-latitude-and-longitude-to-decimal-values\n if (!input.match(/\\d+°\\d+\\.*\\d*\\'[NSEW]/)){\n \treturn \"parsing error\"\n }\n var parts = input.split(/[^\\d.\\w]+/)\n if (parts.length != 3){\n \treturn \"parsing error\"\n }\n var dd = Number(parts[0]) + Number(parts[1])/60\n return dd.toFixed(6) + parts[2]\n}\n\nfunction ValidateCoordinates(input, lat){\n // Input Format 36.574439°N, 110.42100°W\n // Or 36°57.4439'N, 110°4.2100'W\n if (input.match(\"'\")){\n input = ConvertDDMMToDD(input)\n }\n \n var error = {}\n\n if (input.startsWith(\"parsing error\")){\n error.topic = \"Error with the \"\n error.payload = \"You need to respect the format example, 36.574439°N or 36°57.4439'N\"\n return [null, error]\n }\n \n var direction = input.match(/[NSEW]/)\n var position = input.match(/[\\+\\-\\d\\.]+/)\n \n if (direction === null){\n error.topic = \"Error with the \"\n error.payload = \"You need to explicitely enter N/S/E/W\"\n return [null, error]\n }\n \n // Test that position is only made of digits!\n if(/^[\\+\\-]/.test(position)){\n error.topic = \"Error with the \"\n error.payload = \"Use of +/- sign is inconsistent with N/S/E/W letter! Please only use N/S/E/W!\"\n return [null, error]\n }\n \n var dd = Number(position)\n if (lat){\n // Check latitude\n if (direction == \"S\" || direction == \"N\") {\n if (dd>90.0){\n error.topic = \"Error with the \"\n error.payload = \"Latitude is more than 90°\"\n return [null, error]\n }\n }\n if (direction == \"W\" || direction == \"E\") {\n error.topic = \"Error with the \"\n error.payload = \"This is not a Latitude!\"\n return [null, error]\n }\n }\n else{\n // Check longitude\n if (direction == \"W\" || direction == \"E\") {\n if (dd>180.0){\n error.topic = \"Error with the \"\n error.payload = \"Longitude is more than 180°\"\n return [null, error]\n }\n }\n if (direction == \"N\" || direction == \"S\") {\n error.topic = \"Error with the \"\n error.payload = \"This is not a Longitude!\"\n return [null, error]\n }\n }\n \n if (direction == \"S\" || direction == \"W\") {\n dd = dd * -1\n } // Don't do anything for N or E\n return [dd.toFixed(4), null]\n \n}\n\nfunction ValidateDate(input){\n // Input Format 2020-12-25\n var error = {};\n \n if (! /20\\d{2}-[0-1]\\d-[0-3]\\d/.test(input)){\n error.topic = \"Error with the date\";\n error.payload = \"The date should respect the ISO format YYYY-MM-DD\";\n return [null, error];\n }\n else {\n var date = input.match(/\\d+/g);\n if (!((2000 < date[0]) && (date[0] < 2100))){\n error.topic = \"Error with the date\"\n error.payload = \"The year should be between 2000 and 2100\"\n return [null, error]\n }\n else if (!((0 < date[1]) && (date[1] <= 12))){\n error.topic = \"Error with the date\"\n error.payload = \"The month should be between 01 and 12\"\n return [null, error]\n }\n else if (!((0 < date[2]) && (date[2] <= 31))){\n error.topic = \"Error with the date\"\n error.payload = \"The day should be between 01 and 31\"\n return [null, error]\n }\n }\n return [input.replace(/-/g, ''), null]\n}\n\nfunction ValidateTime(input){\n // Input Format 12:00\n var error = {}\n \n if (! /[0-2]?\\d:[0-5]\\d/.test(input)){\n error.topic = \"Error with the time\"\n error.payload = \"The date should respect the ISO format HH:MM\"\n return [null, error]\n }\n else {\n var time = input.match(/\\d+/g)\n \n if (!((0 <= time[0]) && (time[0] < 24))){\n error.topic = \"Error with the time\"\n error.payload = \"The hours should be 0 and 23.\"\n return [null, error]\n }\n else if (!((0 <= time[1]) && (time[1] < 60))){\n error.topic = \"Error with the time\"\n error.payload = \"The minutes should be between 0 and 59\"\n return [null, error]\n }\n }\n return [input.replace(/:/g, ''), null]\n}\n\n\nvar ret\nvar payload_for_form = {payload:{}}\nmsg.valid = false\n\nif (msg.topic == \"net_retrieval_location\"){\n ret = ValidateCoordinates(msg.payload.object_lat_end, true);\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" Latitude\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_lat_end\", ret[0])\n ret = ValidateCoordinates(msg.payload.object_lon_end, false)\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" Longitude\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_lon_end\", ret[0]);\n \n ret = ValidateDate(msg.payload.object_date_end)\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" of the sample retrieval\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_date_end\", ret[0])\n \n ret = ValidateTime(msg.payload.object_time_end)\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" of the sample retrieval\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_time_end\", ret[0])\n}\nelse{\n ret = ValidateCoordinates(msg.payload.object_lat, true);\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" Latitude\";\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_lat\", ret[0]);\n payload_for_form.payload[\"object_lat_end\"] = msg.payload.object_lat;\n \n ret = ValidateCoordinates(msg.payload.object_lon, false);\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" Longitude\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_lon\", ret[0])\n payload_for_form.payload[\"object_lon_end\"] = msg.payload.object_lon;\n\n ret = ValidateDate(msg.payload.object_date)\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" of the sample\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_date\", ret[0])\n payload_for_form.payload[\"object_date_end\"] = msg.payload.object_date;\n \n ret = ValidateTime(msg.payload.object_time)\n if (ret[1] !== null){\n msg.topic = ret[1].topic + \" of the sample\"\n msg.payload = ret[1].payload\n return [msg, null]\n }\n global.set(\"object_time\", ret[0])\n payload_for_form.payload[\"object_time_end\"] = msg.payload.object_time;\n}\nreturn [{topic: \"Coordinates valid!\", payload: \"All good!\", valid: true}, payload_for_form]\n",
- "outputs": 2,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 930,
- "y": 620,
- "wires": [
- [
- "c0ce5626.b6c5",
- "9a18a4b4.178448"
- ],
- [
- "56d40584.eff4e4"
- ]
- ],
- "inputLabels": [
- "Location form data"
- ],
- "outputLabels": [
- "Message",
- "Location validated"
- ]
- },
- {
- "id": "46eb1bf8.3dc5f4",
- "type": "function",
- "z": "b771c342.49603",
- "name": "Net check",
- "func": "var decknet = {}\nvar activation_msg = {}\n\nif (msg.payload.startsWith(\"net_decknet\")){\n decknet.enabled = true;\n}\nelse {\n decknet.enabled = false;\n}\n\nif (msg.payload.startsWith(\"net\")){\n activation_msg.payload = {\"group\":{\"show\":[\"Sample_Net_Metadata\"],\"hide\":[\"Sample_Sample_Location\"]}};\n}\nelse{\n activation_msg.payload = {\"group\":{\"show\":[\"Sample_Sample_Location\"], \"hide\":[\"Sample_Net_Metadata\"]}};\n}\n\n\nreturn [decknet, activation_msg];",
- "outputs": 2,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 1080,
- "y": 240,
- "wires": [
- [
- "516375fd.2ed61c",
- "470e382a.25691",
- "fbe32ac8.ff6a38"
- ],
- [
- "cbb123ab.fd3428"
- ]
- ],
- "outputLabels": [
- "decknet activation",
- "group display control"
- ]
- },
- {
- "id": "516375fd.2ed61c",
- "type": "ui_text_input",
- "z": "b771c342.49603",
- "name": "sample_total_flowmeter_start",
- "label": "Decknet flowmeter start",
- "tooltip": "in L",
- "group": "cf5d9f0e.d57e7",
- "order": 8,
- "width": 5,
- "height": 1,
- "passthru": false,
- "mode": "text",
- "delay": "0",
- "topic": "sample_total_flowmeter_start",
- "topicType": "str",
- "x": 1340,
- "y": 220,
- "wires": [
- [
- "e9bc112c.eb75f8"
- ]
- ]
- },
- {
- "id": "470e382a.25691",
- "type": "ui_text_input",
- "z": "b771c342.49603",
- "name": "sample_total_flowmeter_end",
- "label": "Decknet flowmeter end",
- "tooltip": "in L",
- "group": "cf5d9f0e.d57e7",
- "order": 9,
- "width": 5,
- "height": 1,
- "passthru": false,
- "mode": "text",
- "delay": "0",
- "topic": "sample_total_flowmeter_end",
- "topicType": "str",
- "x": 1340,
- "y": 260,
- "wires": [
- [
- "e9bc112c.eb75f8"
- ]
- ]
- },
- {
- "id": "fbe32ac8.ff6a38",
- "type": "ui_template",
- "z": "b771c342.49603",
- "group": "cf5d9f0e.d57e7",
- "name": "Decknet flowmeter read",
- "order": 7,
- "width": 10,
- "height": 1,
- "format": "\n
Decknet flowmeter readings
\n
Those values are used to calculate sample_total_volume . Values are in L.
\n
\n",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": true,
- "templateScope": "local",
- "x": 1330,
- "y": 180,
- "wires": [
- []
- ]
- },
- {
- "id": "1f63860d.5f5efa",
- "type": "file in",
- "z": "4ed26b8b.253504",
- "name": "",
- "filename": "/home/pi/PlanktoScope/hardware.json",
- "format": "utf8",
- "chunk": false,
- "sendError": false,
- "encoding": "none",
- "x": 380,
- "y": 80,
- "wires": [
- [
- "8c1fda48.d7d828"
- ]
- ],
- "info": "# PlanktoScope Help\nThis Node will read the content of the file named **config.txt** containing all the input placeholders.\n"
- },
- {
- "id": "8c1fda48.d7d828",
- "type": "json",
- "z": "4ed26b8b.253504",
- "name": "Parse JSON",
- "property": "payload",
- "action": "",
- "pretty": false,
- "x": 650,
- "y": 80,
- "wires": [
- [
- "ddb4b136.fc0b78"
- ]
- ]
- },
- {
- "id": "82099021.9ceb08",
- "type": "file",
- "z": "4ed26b8b.253504",
- "name": "",
- "filename": "/home/pi/PlanktoScope/hardware.json",
- "appendNewline": true,
- "createDir": true,
- "overwriteFile": "true",
- "encoding": "none",
- "x": 780,
- "y": 200,
- "wires": [
- []
- ]
- },
- {
- "id": "bb0a8725.a1849",
- "type": "json",
- "z": "4ed26b8b.253504",
- "name": "Create JSON",
- "property": "payload",
- "action": "str",
- "pretty": true,
- "x": 500,
- "y": 200,
- "wires": [
- [
- "82099021.9ceb08"
- ]
- ]
- },
- {
- "id": "f748d952.4b6bc8",
- "type": "inject",
- "z": "4ed26b8b.253504",
- "name": "Load config",
- "props": [
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "",
- "x": 110,
- "y": 80,
- "wires": [
- [
- "1f63860d.5f5efa"
- ]
- ]
- },
- {
- "id": "ddb4b136.fc0b78",
- "type": "change",
- "z": "4ed26b8b.253504",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "hardware_conf",
- "pt": "global",
- "to": "payload",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 870,
- "y": 80,
- "wires": [
- []
- ]
- },
- {
- "id": "44efaeb3.59bf6",
- "type": "subflow:4ed26b8b.253504",
- "z": "1eaf21c8.f7a21e",
- "name": "",
- "env": [],
- "x": 120,
- "y": 440,
- "wires": [
- [
- "e10f5e55.00b828",
- "c534fd26.13741",
- "54ba7f16.709ad8",
- "c67c305004f87e39",
- "11955bbeefc29ab4"
- ]
- ]
- },
- {
- "id": "e10f5e55.00b828",
- "type": "change",
- "z": "1eaf21c8.f7a21e",
- "name": "Get stepper_type",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "payload.stepper_type",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 350,
- "y": 360,
- "wires": [
- [
- "dee52a36.2af72"
- ]
- ]
- },
- {
- "id": "dee52a36.2af72",
- "type": "ui_dropdown",
- "z": "1eaf21c8.f7a21e",
- "name": "stepper_type",
- "label": "",
- "tooltip": "",
- "place": "",
- "group": "6be36295.0ab324",
- "order": 4,
- "width": 3,
- "height": 1,
- "passthru": false,
- "multiple": false,
- "options": [
- {
- "label": "",
- "value": "adafruit",
- "type": "str"
- },
- {
- "label": "",
- "value": "waveshare",
- "type": "str"
- },
- {
- "label": "",
- "value": "pscope_hat",
- "type": "str"
- }
- ],
- "payload": "",
- "topic": "stepper_type",
- "topicType": "str",
- "x": 670,
- "y": 360,
- "wires": [
- [
- "2068e7f.f4efb18",
- "8e3b3d3c.955148"
- ]
- ]
- },
- {
- "id": "e41870d7.300eb8",
- "type": "link out",
- "z": "1eaf21c8.f7a21e",
- "name": "Stepper config change",
- "links": [
- "45a7b5aa.2ed20c"
- ],
- "x": 1195,
- "y": 380,
- "wires": []
- },
- {
- "id": "2068e7f.f4efb18",
- "type": "delay",
- "z": "1eaf21c8.f7a21e",
- "name": "",
- "pauseType": "delay",
- "timeout": "1",
- "timeoutUnits": "seconds",
- "rate": "1",
- "nbRateUnits": "1",
- "rateUnits": "second",
- "randomFirst": "1",
- "randomLast": "5",
- "randomUnits": "seconds",
- "drop": false,
- "x": 880,
- "y": 380,
- "wires": [
- [
- "e41870d7.300eb8"
- ]
- ]
- },
- {
- "id": "45a7b5aa.2ed20c",
- "type": "link in",
- "z": "9daf9e2b.019fc",
- "name": "Python restart",
- "links": [
- "e41870d7.300eb8"
- ],
- "x": 175,
- "y": 560,
- "wires": [
- [
- "466eb611.4da048"
- ]
- ]
- },
- {
- "id": "53d163be.47cf24",
- "type": "function",
- "z": "4ed26b8b.253504",
- "name": "Update and retrieve hardware_conf",
- "func": "// change global\nhardware_conf = global.get(\"hardware_conf\");\n\nif (msg.topic == \"process_pixel_fixed\" && msg.payload == 0){\n delete hardware_conf[msg.topic]\n delete msg.topic\n}\n\nif (msg.topic !== null && msg.topic !== undefined){\n hardware_conf[msg.topic] = msg.payload;\n global.set(\"hardware_conf\", hardware_conf);\n}\n\nreturn {\"payload\": hardware_conf};",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 240,
- "y": 200,
- "wires": [
- [
- "bb0a8725.a1849"
- ]
- ]
- },
- {
- "id": "8e3b3d3c.955148",
- "type": "subflow:4ed26b8b.253504",
- "z": "1eaf21c8.f7a21e",
- "name": "",
- "env": [],
- "x": 900,
- "y": 420,
- "wires": [
- []
- ]
- },
- {
- "id": "c534fd26.13741",
- "type": "change",
- "z": "1eaf21c8.f7a21e",
- "name": "Get stepper_reverse",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "payload.stepper_reverse",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 360,
- "y": 440,
- "wires": [
- [
- "cd1987c7.027f58"
- ]
- ]
- },
- {
- "id": "cd1987c7.027f58",
- "type": "ui_switch",
- "z": "1eaf21c8.f7a21e",
- "name": "stepper_reverse",
- "label": "Invert stepper output",
- "tooltip": "Stepper 1 is controlled by output 1 or the other way around",
- "group": "6be36295.0ab324",
- "order": 5,
- "width": 0,
- "height": 0,
- "passthru": false,
- "decouple": "false",
- "topic": "stepper_reverse",
- "style": "",
- "onvalue": "true",
- "onvalueType": "bool",
- "onicon": "",
- "oncolor": "",
- "offvalue": "false",
- "offvalueType": "bool",
- "officon": "",
- "offcolor": "",
- "x": 660,
- "y": 440,
- "wires": [
- [
- "8e3b3d3c.955148",
- "2068e7f.f4efb18"
- ]
- ]
- },
- {
- "id": "54ba7f16.709ad8",
- "type": "change",
- "z": "1eaf21c8.f7a21e",
- "name": "Get pump_steps_per_ml",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "payload.pump_steps_per_ml",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 370,
- "y": 400,
- "wires": [
- [
- "ee58b91c.396108"
- ]
- ]
- },
- {
- "id": "ee58b91c.396108",
- "type": "ui_text_input",
- "z": "1eaf21c8.f7a21e",
- "name": "pump_steps_per_ml",
- "label": "Pump: steps per mL",
- "tooltip": "",
- "group": "6be36295.0ab324",
- "order": 6,
- "width": 0,
- "height": 0,
- "passthru": false,
- "mode": "number",
- "delay": "2000",
- "topic": "pump_steps_per_ml",
- "topicType": "str",
- "x": 640,
- "y": 400,
- "wires": [
- [
- "2068e7f.f4efb18",
- "8e3b3d3c.955148"
- ]
- ]
- },
- {
- "id": "be888117.5cd67",
- "type": "ui_template",
- "z": "1eaf21c8.f7a21e",
- "group": "6be36295.0ab324",
- "name": "Stepper controller type header",
- "order": 3,
- "width": 3,
- "height": 1,
- "format": "Stepper controller type
",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": true,
- "templateScope": "local",
- "x": 550,
- "y": 100,
- "wires": [
- []
- ]
- },
- {
- "id": "7534dfd9.8cf3e8",
- "type": "ui_template",
- "z": "1eaf21c8.f7a21e",
- "group": "6be36295.0ab324",
- "name": "Information",
- "order": 2,
- "width": 6,
- "height": 3,
- "format": "\n
Changing one of these values will make the python back-end to restart.
\n
If you are not sure, you probably should not be touching anything here!
\n
",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": true,
- "templateScope": "local",
- "x": 610,
- "y": 60,
- "wires": [
- []
- ]
- },
- {
- "id": "3ad9835.08c937c",
- "type": "function",
- "z": "1c24ad9c.bebec2",
- "name": "get config payload",
- "func": "keys = global.get(\"config_keys\")\n\nvar payload = {}\n\nkeys.forEach(function(item, index, array) {\n payload[item] = global.get(item);\n})\n\nreturn {\"payload\": payload};",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 410,
- "y": 160,
- "wires": [
- [
- "2e6ddf51.c0dba"
- ]
- ]
- },
- {
- "id": "f408a273.4fb538",
- "type": "function",
- "z": "b771c342.49603",
- "name": "get sample_gear_net_opening",
- "func": "if (msg.payload.sample_gear_net_opening === null){\n msg.payload = 0;\n global.set(\"sample_gear_net_opening\",msg.payload);\n}\nelse\n{\n msg.payload = msg.payload.sample_gear_net_opening;\n}\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 350,
- "y": 320,
- "wires": [
- [
- "e967b844.46aa48"
- ]
- ]
- },
- {
- "id": "fa12f9f8.00cfa8",
- "type": "subflow:1c24ad9c.bebec2",
- "z": "cb95299c.2817c8",
- "name": "",
- "env": [],
- "x": 430,
- "y": 380,
- "wires": [
- [
- "3b72d11c.86e9e6"
- ]
- ]
- },
- {
- "id": "3b72d11c.86e9e6",
- "type": "function",
- "z": "cb95299c.2817c8",
- "name": "get process_id",
- "func": "msg.payload = msg.payload.process_id;\nmsg.topic = \"process_id\";\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 600,
- "y": 380,
- "wires": [
- [
- "56971109c8be3b54"
- ]
- ]
- },
- {
- "id": "8dff1648.82e42",
- "type": "function",
- "z": "b771c342.49603",
- "name": "get object_depth_max",
- "func": "if (msg.payload.object_depth_max === null){\n msg.payload = 0;\n global.set(\"object_depth_max\",msg.payload);\n}\nelse\n{\n msg.payload = msg.payload.object_depth_max;\n}\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 320,
- "y": 240,
- "wires": [
- [
- "9c7f7fc9.c8d3a"
- ]
- ]
- },
- {
- "id": "9f04c5ec.75f3d8",
- "type": "function",
- "z": "b771c342.49603",
- "name": "get object_depth_min",
- "func": "if (msg.payload.object_depth_min === null){\n msg.payload = 0;\n global.set(\"object_depth_min\",msg.payload);\n}\nelse\n{\n msg.payload = msg.payload.object_depth_min;\n}\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 320,
- "y": 280,
- "wires": [
- [
- "317eeeb7.8d3042"
- ]
- ]
- },
{
"id": "326a1d95.ca21aa",
"type": "subflow:1c24ad9c.bebec2",
@@ -7477,621 +3747,6 @@
[]
]
},
- {
- "id": "f4f6e3fa.0234f",
- "type": "inject",
- "z": "9daf9e2b.019fc",
- "name": "once",
- "props": [
- {
- "p": "payload"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": "",
- "topic": "",
- "payload": "start",
- "payloadType": "str",
- "x": 1070,
- "y": 720,
- "wires": [
- [
- "7a1dedf.1c63094"
- ]
- ]
- },
- {
- "id": "991d1df9.3ffb3",
- "type": "function",
- "z": "f21ba04.c26266",
- "name": "reset wpa_supplicant.conf",
- "func": "country_code = flow.get(\"country_code\")\n\nvar template = `sudo tee /etc/wpa_supplicant/wpa_supplicant.conf < EPS) && (iter < MAXITER))\n {\n iter=iter+1\n sx = Math.sin (x)\n // alert(\"sx=\"+sx)\n cx = Math.cos (x)\n tu1 = cu2 * sx\n tu2 = b1 - su1 * cu2 * cx\n sy = Math.sqrt(tu1 * tu1 + tu2 * tu2)\n cy = s1 * cx + f1\n y = atan2 (sy, cy)\n sa = s1 * sx / sy\n c2a = 1 - sa * sa\n cz = f1 + f1\n if (c2a > 0)\n cz = cy - cz / c2a\n e = cz * cz * 2 - 1\n c = ((-3 * c2a + 4) * f + 4) * c2a * f / 16\n d = x\n x = ((e * cy * c + cz) * sy * c + y) * sa\n x = (1 - c) * x * f + glon2 - glon1\n }\n x = Math.sqrt ((1 / (r * r) - 1) * c2a + 1)\n x +=1\n x = (x - 2) / x\n c = 1 - x\n c = (x * x / 4 + 1) / c\n d = (0.375 * x * x - 1) * x\n x = e * cy\n d = ((((sy*sy*4-3)*(1-e-e)*cz*d/6-x)*d/4+cz)*sy*d+y)*c*a*r\n if (Math.abs(iter-MAXITER)0) && (y>=0)){ out= Math.atan(y/x)}\n if ((x >0) && (y<0)) { out= Math.atan(y/x)+2*Math.PI}\n if ((x===0) && (y>0)) { out= Math.PI/2}\n if ((x===0) && (y<0)) { out= 3*Math.PI/2} \n if ((x===0) && (y===0)) {\n alert(\"atan2(0,0) undefined\")\n out= 0\n } \n return out\n}\n\nfunction showProps(obj,objName){\n var result=\"\"\n for (var i in obj){\n result +=objName + \".\" + i + \" = \" + obj[i] + \"\\n\"\n }\n alert(result)\n}\n\n\nif (msg.valid){\n msg.topic=\"sample_total_volume\"\n \n var object_lat_end = global.get(\"object_lat_end\")\n var object_lon_end = global.get(\"object_lon_end\")\n var sample_sampling_gear = global.get(\"sample_sampling_gear\")\n \n if (sample_sampling_gear.startsWith(\"net\") && sample_sampling_gear != \"net_decknet\") {\n if (!(isNaN(object_lat_end) && isNaN(object_lon_end))){\n var object_lat = global.get(\"object_lat\")\n var object_lon = global.get(\"object_lon\")\n var sample_gear_net_opening = global.get(\"sample_gear_net_opening\");\n\n distance_km = ComputeDistance(object_lat, object_lon, object_lat_end, object_lon_end)\n\n sample_total_volume = distance_km*(Math.PI*(sample_gear_net_opening/2)*(sample_gear_net_opening/2)) // liters\n sample_total_volume = Math.round(sample_total_volume + Number.EPSILON)\n msg.payload = sample_total_volume\n return msg\n }\n }\n}",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 930,
- "y": 760,
- "wires": [
- [
- "4f6afc5a.81e454"
- ]
- ]
- },
- {
- "id": "4fb4e0ad.c417c",
- "type": "ui_text",
- "z": "b771c342.49603",
- "group": "fc5e4e6f.5b1c8",
- "order": 6,
- "width": 5,
- "height": 1,
- "name": "Latitude",
- "label": "Latitude",
- "format": "{{msg.payload.lat.deg}}°{{msg.payload.lat.min}}'{{msg.payload.lat.sec}}{{msg.payload.lat.dir}}",
- "layout": "col-center",
- "x": 700,
- "y": 1120,
- "wires": []
- },
- {
- "id": "8d2b5026.13e6e8",
- "type": "ui_text",
- "z": "b771c342.49603",
- "group": "fc5e4e6f.5b1c8",
- "order": 7,
- "width": 5,
- "height": 1,
- "name": "Longitude",
- "label": "Longitude",
- "format": "{{msg.payload.lon.deg}}°{{msg.payload.lon.min}}'{{msg.payload.lon.sec}}{{msg.payload.lon.dir}}",
- "layout": "col-center",
- "x": 700,
- "y": 1160,
- "wires": []
- },
- {
- "id": "258b4562.9f778a",
- "type": "function",
- "z": "b771c342.49603",
- "name": "Convert DD to DMS",
- "func": "function ConvertDDToDMS(D, lng){\n // from https://stackoverflow.com/a/5786281/2108279\n return {\n dir : D<0?lng?'W':'S':lng?'E':'N',\n deg : 0|(D<0?D=-D:D),\n min : 0|D%1*60,\n sec :(0|D*60%1*6000)/100\n };\n}\n\nmsg.payload = {\n \"lat\":ConvertDDToDMS(msg.payload.lat, false),\n \"lon\":ConvertDDToDMS(msg.payload.lon, true)\n};\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 490,
- "y": 1140,
- "wires": [
- [
- "4fb4e0ad.c417c",
- "8d2b5026.13e6e8"
- ]
- ]
- },
- {
- "id": "7c4ce5f3.62dd5c",
- "type": "ui_text",
- "z": "b771c342.49603",
- "group": "fc5e4e6f.5b1c8",
- "order": 4,
- "width": 2,
- "height": 1,
- "name": "Speed",
- "label": "Speed",
- "format": "{{msg.payload}} kts",
- "layout": "col-center",
- "x": 690,
- "y": 1200,
- "wires": []
- },
- {
- "id": "54e37580.fdc31c",
- "type": "ui_text",
- "z": "b771c342.49603",
- "group": "fc5e4e6f.5b1c8",
- "order": 5,
- "width": 2,
- "height": 1,
- "name": "Direction",
- "label": "Direction",
- "format": "{{msg.payload.track}} °",
- "layout": "col-center",
- "x": 700,
- "y": 1240,
- "wires": []
- },
- {
- "id": "cc21ca16.b92928",
- "type": "function",
- "z": "b771c342.49603",
- "name": "GPS Mode",
- "func": "switch (msg.payload.mode){\n case 1:msg.payload = \"No Fix\"; break\n case 2:msg.payload = \"2D Fix\"; break\n case 3:msg.payload = \"3D Fix\"; break\n default: msg.payload = \"No info\"\n}\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 470,
- "y": 1080,
- "wires": [
- [
- "7116e906.9f50f"
- ]
- ]
- },
- {
- "id": "4a4de52c.cf2884",
- "type": "function",
- "z": "b771c342.49603",
- "name": "Speed conversion",
- "func": "msg.payload = (0|msg.payload.speed) * 1.9438\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 490,
- "y": 1200,
- "wires": [
- [
- "7c4ce5f3.62dd5c"
- ]
- ]
- },
- {
- "id": "35ad311f.344c76",
- "type": "ui_text",
- "z": "b771c342.49603",
- "group": "fc5e4e6f.5b1c8",
- "order": 2,
- "width": 5,
- "height": 1,
- "name": "Time",
- "label": "Time",
- "format": "{{msg.payload.time}}",
- "layout": "col-center",
- "x": 690,
- "y": 1280,
- "wires": []
- },
- {
- "id": "dab82064.26a8d",
- "type": "ui_button",
- "z": "eaae323a.31b3",
- "name": "Unlock button",
- "group": "f3ca28ef.4df0a8",
- "order": 2,
- "width": 0,
- "height": 0,
- "passthru": false,
- "label": "Unlock button",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "",
- "payload": "shutdown",
- "payloadType": "flow",
- "topic": "",
- "x": 120,
- "y": 380,
- "wires": [
- [
- "6c3a3b4.78cad44"
- ]
- ]
- },
- {
- "id": "1c658761.b852a1",
- "type": "ui_toast",
- "z": "eaae323a.31b3",
- "position": "dialog",
- "displayTime": "3",
- "highlight": "",
- "sendall": true,
- "outputs": 1,
- "ok": "YES PLEASE",
- "cancel": "NO!",
- "raw": false,
- "topic": "Are you sure?",
- "name": "Confirmation message",
- "x": 800,
- "y": 380,
- "wires": [
- [
- "8f1b8e23.daafe"
- ]
- ]
- },
- {
- "id": "a48ff63f.db5e18",
- "type": "inject",
- "z": "eaae323a.31b3",
- "name": "disabled",
- "props": [
- {
- "p": "enabled",
- "v": "false",
- "vt": "bool"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "",
- "x": 140,
- "y": 420,
- "wires": [
- [
- "d58039a9.6e7928"
- ]
- ]
- },
- {
- "id": "b67a7147.65fcd8",
- "type": "ui_button",
- "z": "eaae323a.31b3",
- "name": "Shutdown button",
- "group": "f3ca28ef.4df0a8",
- "order": 4,
- "width": 0,
- "height": 0,
- "passthru": false,
- "label": "Shutdown",
- "tooltip": "",
- "color": "",
- "bgcolor": "#AD1625",
- "icon": "fa-power-off fa-2x",
- "payload": "Do you want to turn the machine off now?",
- "payloadType": "str",
- "topic": "",
- "x": 550,
- "y": 380,
- "wires": [
- [
- "1c658761.b852a1"
- ]
- ]
- },
- {
- "id": "d58039a9.6e7928",
- "type": "change",
- "z": "eaae323a.31b3",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "shutdown",
- "pt": "flow",
- "to": "false",
- "tot": "bool"
- },
- {
- "t": "set",
- "p": "enabled",
- "pt": "msg",
- "to": "shutdown",
- "tot": "flow"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 320,
- "y": 420,
- "wires": [
- [
- "b67a7147.65fcd8"
- ]
- ]
- },
- {
- "id": "6c3a3b4.78cad44",
- "type": "function",
- "z": "eaae323a.31b3",
- "name": "Toggle",
- "func": "flow.set(\"shutdown\", !flow.get(\"shutdown\"))\nmsg.enabled = flow.get(\"shutdown\")\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 290,
- "y": 380,
- "wires": [
- [
- "b67a7147.65fcd8"
- ]
- ]
- },
- {
- "id": "d1153ad6.40d738",
- "type": "ui_template",
- "z": "eaae323a.31b3",
- "group": "f3ca28ef.4df0a8",
- "name": "Shutdown information",
- "order": 1,
- "width": 0,
- "height": 0,
- "format": "To prevent data corruption, please always shutdown the machine before unplugging the unit.\n \nRemember to first unlock the shutdown button.\n ",
- "storeOutMessages": true,
- "fwdInMessages": false,
- "resendOnRefresh": true,
- "templateScope": "local",
- "x": 120,
- "y": 320,
- "wires": [
- []
- ]
- },
- {
- "id": "e08cfcb8.2a67e8",
- "type": "link out",
- "z": "eaae323a.31b3",
- "name": "Home shutdown button",
- "links": [
- "b81b990a.d4dca"
- ],
- "x": 715,
- "y": 500,
- "wires": []
- },
- {
- "id": "ce7087fc.dcc9e8",
- "type": "ui_toast",
- "z": "eaae323a.31b3",
- "position": "dialog",
- "displayTime": "10",
- "highlight": "",
- "sendall": true,
- "outputs": 1,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "Turning off now!",
- "name": "Shutdown message",
- "x": 580,
- "y": 540,
- "wires": [
- []
- ]
- },
- {
- "id": "b81b990a.d4dca",
- "type": "link in",
- "z": "9daf9e2b.019fc",
- "name": "Shutdown",
- "links": [
- "e08cfcb8.2a67e8"
- ],
- "x": 455,
- "y": 720,
- "wires": [
- [
- "4af9112d.87767"
- ]
- ]
- },
- {
- "id": "7d1626a0.deb85",
- "type": "change",
- "z": "eaae323a.31b3",
- "name": "shutdown!",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "shutdown",
- "tot": "str"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 310,
- "y": 500,
- "wires": [
- [
- "e08cfcb8.2a67e8"
- ]
- ]
- },
- {
- "id": "8f1b8e23.daafe",
- "type": "switch",
- "z": "eaae323a.31b3",
- "name": "",
- "property": "payload",
- "propertyType": "msg",
- "rules": [
- {
- "t": "eq",
- "v": "NO!",
- "vt": "str"
- },
- {
- "t": "else"
- }
- ],
- "checkall": "true",
- "repair": false,
- "outputs": 2,
- "x": 150,
- "y": 500,
- "wires": [
- [
- "d58039a9.6e7928"
- ],
- [
- "7d1626a0.deb85",
- "281a56c9.ec7902"
- ]
- ]
- },
- {
- "id": "281a56c9.ec7902",
- "type": "change",
- "z": "eaae323a.31b3",
- "name": "Shutdown message",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "Please wait a minute before disconnecting the machine from its power supply!",
- "tot": "str"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 340,
- "y": 540,
- "wires": [
- [
- "ce7087fc.dcc9e8"
- ]
- ]
- },
{
"id": "2d371e59.b0e50a",
"type": "inject",
@@ -8171,290 +3826,6 @@
]
]
},
- {
- "id": "e73fd87d.d24e4",
- "type": "function",
- "z": "b771c342.49603",
- "name": "get acq_minimum_mesh",
- "func": "msg.payload = msg.payload.acq_minimum_mesh;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 330,
- "y": 360,
- "wires": [
- [
- "1aad56b31b5647ce"
- ]
- ]
- },
- {
- "id": "489c8e06.cc7d6",
- "type": "function",
- "z": "b771c342.49603",
- "name": "get acq_maximum_mesh",
- "func": "msg.payload = msg.payload.acq_maximum_mesh;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 330,
- "y": 400,
- "wires": [
- [
- "10eb31a2d7a6590c"
- ]
- ]
- },
- {
- "id": "3ea12061.ce62c",
- "type": "ui_list",
- "z": "cb95299c.2817c8",
- "group": "abeb6dad.635a2",
- "name": "",
- "order": 9,
- "width": 10,
- "height": 11,
- "lineType": "one",
- "actionType": "check",
- "allowHTML": false,
- "outputs": 1,
- "topic": "",
- "x": 770,
- "y": 140,
- "wires": [
- [
- "cb3b87b5.63c4"
- ]
- ]
- },
- {
- "id": "8bd8fb2c.53fa4",
- "type": "dir2files",
- "z": "cb95299c.2817c8",
- "name": "",
- "dirname": "/home/pi/data/img/",
- "pathRegex": "",
- "isRecursive": true,
- "findDir": true,
- "isArray": true,
- "x": 460,
- "y": 140,
- "wires": [
- [
- "ba2947.c854deb8"
- ]
- ]
- },
- {
- "id": "127d4ee.f8ad1b1",
- "type": "ui_button",
- "z": "cb95299c.2817c8",
- "name": "Refresh",
- "group": "abeb6dad.635a2",
- "order": 8,
- "width": 0,
- "height": 0,
- "passthru": false,
- "label": "Update acquisition's folder list",
- "tooltip": "Refresh the list of previous acquisitions",
- "color": "",
- "bgcolor": "",
- "icon": "mi-find_replace",
- "payload": "",
- "payloadType": "date",
- "topic": "update",
- "x": 260,
- "y": 140,
- "wires": [
- [
- "8bd8fb2c.53fa4",
- "56f845f5.e7c054"
- ]
- ]
- },
- {
- "id": "946ce9ee.092cf",
- "type": "inject",
- "z": "cb95299c.2817c8",
- "name": "Init",
- "props": [
- {
- "p": "payload"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "",
- "payload": "",
- "payloadType": "date",
- "x": 270,
- "y": 100,
- "wires": [
- [
- "8bd8fb2c.53fa4",
- "56f845f5.e7c054"
- ]
- ]
- },
- {
- "id": "83c5a708.a5715",
- "type": "exec",
- "z": "9daf9e2b.019fc",
- "command": "git --git-dir=/home/pi/PlanktoScope/.git describe --long --tags",
- "addpay": false,
- "append": "",
- "useSpawn": "true",
- "timer": "",
- "oldrc": false,
- "name": "Get git revision",
- "x": 660,
- "y": 340,
- "wires": [
- [
- "af2b8d95.195bb8",
- "b6bc9b81.ff942"
- ],
- [],
- []
- ]
- },
- {
- "id": "d334d264.8a7728",
- "type": "exec",
- "z": "9daf9e2b.019fc",
- "command": "git --git-dir=/home/pi/PlanktoScope/.git branch --remotes --list | awk '/HEAD/{next;} split($1, a, \"/\") {print a[2]}'",
- "addpay": false,
- "append": "",
- "useSpawn": "false",
- "timer": "",
- "oldrc": false,
- "name": "Get git branch",
- "x": 660,
- "y": 260,
- "wires": [
- [
- "e5e8e66c.899588"
- ],
- [],
- []
- ]
- },
- {
- "id": "e4342b66.72972",
- "type": "ui_button",
- "z": "9daf9e2b.019fc",
- "name": "get git branch",
- "group": "1be83144.4fe4bf",
- "order": 3,
- "width": 5,
- "height": 1,
- "passthru": false,
- "label": "Update branch list",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "mi-compare_arrows",
- "payload": "",
- "payloadType": "str",
- "topic": "",
- "x": 410,
- "y": 260,
- "wires": [
- [
- "d334d264.8a7728"
- ]
- ]
- },
- {
- "id": "3f13b9f8.bac94e",
- "type": "ui_dropdown",
- "z": "9daf9e2b.019fc",
- "name": "Git branch list",
- "label": "Switch branch to",
- "tooltip": "If you choose something, the code WILL be updated to that branch, don't touch if you don't know what you are doing!",
- "place": "branch",
- "group": "1be83144.4fe4bf",
- "order": 4,
- "width": 7,
- "height": 1,
- "passthru": false,
- "multiple": false,
- "options": [],
- "payload": "",
- "topic": "branch",
- "x": 1160,
- "y": 320,
- "wires": [
- []
- ]
- },
- {
- "id": "e5e8e66c.899588",
- "type": "function",
- "z": "9daf9e2b.019fc",
- "name": "filter branch",
- "func": "msg.options = msg.payload.trimEnd().split('\\n')\nmsg.payload = msg.options.find((str) => str.startsWith('*'));\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 870,
- "y": 260,
- "wires": [
- [
- "3f13b9f8.bac94e",
- "ccc7d79b.a419f"
- ]
- ]
- },
- {
- "id": "c1fb03f7.e675f8",
- "type": "inject",
- "z": "9daf9e2b.019fc",
- "name": "once",
- "props": [
- {
- "p": "payload"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": "",
- "topic": "",
- "payload": "start",
- "payloadType": "str",
- "x": 430,
- "y": 300,
- "wires": [
- [
- "d334d264.8a7728",
- "83c5a708.a5715"
- ]
- ]
- },
- {
- "id": "af2b8d95.195bb8",
- "type": "ui_text",
- "z": "9daf9e2b.019fc",
- "group": "1be83144.4fe4bf",
- "order": 2,
- "width": 12,
- "height": 1,
- "name": "",
- "label": "Current code version",
- "format": "{{msg.payload}}",
- "layout": "row-center",
- "x": 900,
- "y": 320,
- "wires": []
- },
{
"id": "f0775525.cf806",
"type": "ui_multistate_switch",
@@ -8492,922 +3863,6 @@
]
]
},
- {
- "id": "cb3b87b5.63c4",
- "type": "function",
- "z": "cb95299c.2817c8",
- "name": "update segmentation_list",
- "func": "var segmentation_list = flow.get('segmentation_list');\n\nif (segmentation_list === undefined || segmentation_list === \"\") {\n segmentation_list = []\n console.log(\"error\")\n}\n\npath = \"/home/pi/data/img/\" + msg.payload.title\n\nif (msg.payload.isChecked){\n if (segmentation_list.includes(path) === false){\n segmentation_list.push(path)\n }\n // Element already in list, don't push it more than once\n //segmentation_list.push(msg.payload[\"title\"])\n}\nelse {\n var pos = segmentation_list.indexOf(path)\n segmentation_list.splice(pos, 1)\n}\n\nflow.set('segmentation_list', segmentation_list)",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 950,
- "y": 140,
- "wires": [
- []
- ]
- },
- {
- "id": "56f845f5.e7c054",
- "type": "change",
- "z": "cb95299c.2817c8",
- "name": "Reset segmentation_list",
- "rules": [
- {
- "t": "set",
- "p": "segmentation_list",
- "pt": "flow",
- "to": "[]",
- "tot": "json"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 510,
- "y": 100,
- "wires": [
- []
- ]
- },
- {
- "id": "7fc72364.8f038c",
- "type": "ui_template",
- "z": "cb95299c.2817c8",
- "group": "abeb6dad.635a2",
- "name": "Update message",
- "order": 1,
- "width": 10,
- "height": 3,
- "format": "You can choose here in which folder(s) you want the segmentation script to run. A few details though:\n The segmentation is run recursively in all folders. So if you select a top level folder, the segmentation will be run in all subfolders.\n Also, you will be able to chose wether for force the segmentation for folders in which it has run already.
",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": true,
- "templateScope": "local",
- "x": 270,
- "y": 40,
- "wires": [
- []
- ]
- },
- {
- "id": "6c7f0cc5.ea30d4",
- "type": "gpsd",
- "z": "1371dec5.76e671",
- "name": "",
- "hostname": "localhost",
- "port": "2947",
- "tpv": true,
- "sky": false,
- "info": false,
- "device": false,
- "gst": false,
- "att": false,
- "x": 170,
- "y": 1360,
- "wires": [
- [
- "906072b1.42c7c8",
- "cd3b05d6.5a3e2",
- "9b29e0e2.475e08",
- "96fefa8b.b7d538",
- "49a98fe9.9450d8",
- "f2a62d0.f5e135"
- ]
- ]
- },
- {
- "id": "96bc0179.5c37",
- "type": "ui_text",
- "z": "1371dec5.76e671",
- "group": "cfe2288f.a8862",
- "order": 1,
- "width": 6,
- "height": 1,
- "name": "GPS Status Display",
- "label": "GPS Status:",
- "format": "{{msg.payload}}",
- "layout": "row-center",
- "x": 660,
- "y": 1200,
- "wires": []
- },
- {
- "id": "8c731f52.2b5f3",
- "type": "ui_text",
- "z": "1371dec5.76e671",
- "group": "cfe2288f.a8862",
- "order": 5,
- "width": 3,
- "height": 1,
- "name": "Latitude",
- "label": "Latitude",
- "format": "{{msg.payload.lat.deg}}°{{msg.payload.lat.min}}'{{msg.payload.lat.sec}}{{msg.payload.lat.dir}}",
- "layout": "col-center",
- "x": 620,
- "y": 1240,
- "wires": []
- },
- {
- "id": "34e4b5ea.27b4a2",
- "type": "ui_text",
- "z": "1371dec5.76e671",
- "group": "cfe2288f.a8862",
- "order": 6,
- "width": 3,
- "height": 1,
- "name": "Longitude",
- "label": "Longitude",
- "format": "{{msg.payload.lon.deg}}°{{msg.payload.lon.min}}'{{msg.payload.lon.sec}}{{msg.payload.lon.dir}}",
- "layout": "col-center",
- "x": 620,
- "y": 1280,
- "wires": []
- },
- {
- "id": "906072b1.42c7c8",
- "type": "function",
- "z": "1371dec5.76e671",
- "name": "Convert DD to DMS",
- "func": "function ConvertDDToDMS(D, lng){\n // from https://stackoverflow.com/a/5786281/2108279\n return {\n dir : D<0?lng?'W':'S':lng?'E':'N',\n deg : 0|(D<0?D=-D:D),\n min : 0|D%1*60,\n sec :(0|D*60%1*6000)/100\n };\n}\n\nmsg.payload = {\n \"lat\":ConvertDDToDMS(msg.payload.lat, false),\n \"lon\":ConvertDDToDMS(msg.payload.lon, true)\n};\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 410,
- "y": 1260,
- "wires": [
- [
- "8c731f52.2b5f3",
- "34e4b5ea.27b4a2"
- ]
- ]
- },
- {
- "id": "4584c817.0be238",
- "type": "ui_text",
- "z": "1371dec5.76e671",
- "group": "cfe2288f.a8862",
- "order": 3,
- "width": 3,
- "height": 1,
- "name": "Speed",
- "label": "Speed",
- "format": "{{msg.payload}} kts",
- "layout": "col-center",
- "x": 610,
- "y": 1320,
- "wires": []
- },
- {
- "id": "cd3b05d6.5a3e2",
- "type": "ui_text",
- "z": "1371dec5.76e671",
- "group": "cfe2288f.a8862",
- "order": 4,
- "width": 3,
- "height": 1,
- "name": "Direction",
- "label": "Direction",
- "format": "{{msg.payload.track}} °",
- "layout": "col-center",
- "x": 620,
- "y": 1360,
- "wires": []
- },
- {
- "id": "9b29e0e2.475e08",
- "type": "function",
- "z": "1371dec5.76e671",
- "name": "GPS Mode",
- "func": "switch (msg.payload.mode){\n case 1:msg.payload = \"No Fix\"; break\n case 2:msg.payload = \"2D Fix\"; break\n case 3:msg.payload = \"3D Fix\"; break\n default: msg.payload = \"No info\"\n}\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 390,
- "y": 1200,
- "wires": [
- [
- "96bc0179.5c37"
- ]
- ]
- },
- {
- "id": "96fefa8b.b7d538",
- "type": "function",
- "z": "1371dec5.76e671",
- "name": "Speed conversion",
- "func": "msg.payload = (0|msg.payload.speed) * 1.9438\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 410,
- "y": 1320,
- "wires": [
- [
- "4584c817.0be238"
- ]
- ]
- },
- {
- "id": "49a98fe9.9450d8",
- "type": "ui_text",
- "z": "1371dec5.76e671",
- "group": "cfe2288f.a8862",
- "order": 2,
- "width": 6,
- "height": 1,
- "name": "GPS UTC datetime",
- "label": "GPS UTC datetime",
- "format": "{{msg.payload.time}}",
- "layout": "col-center",
- "x": 650,
- "y": 1400,
- "wires": []
- },
- {
- "id": "3c3f334e.d691ac",
- "type": "ui_button",
- "z": "1371dec5.76e671",
- "name": "",
- "group": "cfe2288f.a8862",
- "order": 6,
- "width": 0,
- "height": 0,
- "passthru": false,
- "label": "Force local clock update",
- "tooltip": "",
- "color": "",
- "bgcolor": "",
- "icon": "",
- "payload": "",
- "payloadType": "str",
- "topic": "topic",
- "x": 670,
- "y": 1480,
- "wires": [
- [
- "c60030d4.317418"
- ]
- ]
- },
- {
- "id": "c60030d4.317418",
- "type": "exec",
- "z": "1371dec5.76e671",
- "command": "sudo hwclock -w",
- "addpay": false,
- "append": "",
- "useSpawn": "false",
- "timer": "",
- "oldrc": false,
- "name": "",
- "x": 920,
- "y": 1480,
- "wires": [
- [],
- [],
- []
- ]
- },
- {
- "id": "6d144078.508d9",
- "type": "ui_text",
- "z": "1371dec5.76e671",
- "group": "cfe2288f.a8862",
- "order": 2,
- "width": 6,
- "height": 1,
- "name": "Local UTC datetime",
- "label": "Local UTC datetime",
- "format": "{{msg.payload}}",
- "layout": "col-center",
- "x": 660,
- "y": 1440,
- "wires": []
- },
- {
- "id": "f2a62d0.f5e135",
- "type": "function",
- "z": "1371dec5.76e671",
- "name": "",
- "func": "msg.payload = new Date()\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 380,
- "y": 1440,
- "wires": [
- [
- "6d144078.508d9"
- ]
- ]
- },
- {
- "id": "b6bc9b81.ff942",
- "type": "function",
- "z": "9daf9e2b.019fc",
- "name": "save process_commit",
- "func": "global.set(\"process_commit\", msg.payload);\n",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 900,
- "y": 360,
- "wires": [
- [
- "6c20d6a7.869b6"
- ]
- ]
- },
- {
- "id": "ba2947.c854deb8",
- "type": "function",
- "z": "cb95299c.2817c8",
- "name": "remove common",
- "func": "function remove_path(item, index, array) {\n array[index] = item.replace(\"/home/pi/data/img/\", \"\")\n} \n\nmsg.payload.forEach(remove_path)\n\nreturn msg",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 620,
- "y": 140,
- "wires": [
- [
- "3ea12061.ce62c"
- ]
- ]
- },
- {
- "id": "21af0db1.c2c182",
- "type": "ui_multistate_switch",
- "z": "cb95299c.2817c8",
- "name": "recursive toggle",
- "group": "abeb6dad.635a2",
- "order": 4,
- "width": 5,
- "height": 1,
- "label": "Recursive folder",
- "stateField": "payload",
- "enableField": "enable",
- "rounded": true,
- "useThemeColors": true,
- "hideSelectedLabel": false,
- "options": [
- {
- "label": "No",
- "value": "0",
- "valueType": "num",
- "color": "#009933"
- },
- {
- "label": "Yes",
- "value": "1",
- "valueType": "num",
- "color": "#999999"
- }
- ],
- "x": 480,
- "y": 220,
- "wires": [
- [
- "880b192a.88e2d"
- ]
- ]
- },
- {
- "id": "dffb9881.feef8",
- "type": "ui_multistate_switch",
- "z": "cb95299c.2817c8",
- "name": "force toggle",
- "group": "abeb6dad.635a2",
- "order": 3,
- "width": 5,
- "height": 1,
- "label": "Force rework",
- "stateField": "payload",
- "enableField": "enable",
- "rounded": true,
- "useThemeColors": true,
- "hideSelectedLabel": false,
- "options": [
- {
- "label": "No",
- "value": "0",
- "valueType": "num",
- "color": "#009933"
- },
- {
- "label": "Yes",
- "value": "1",
- "valueType": "num",
- "color": "#999999"
- }
- ],
- "x": 470,
- "y": 300,
- "wires": [
- [
- "a4f68fa6.5d77f8"
- ]
- ]
- },
- {
- "id": "880b192a.88e2d",
- "type": "change",
- "z": "cb95299c.2817c8",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "recursive",
- "pt": "flow",
- "to": "payload",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 690,
- "y": 240,
- "wires": [
- []
- ]
- },
- {
- "id": "a4f68fa6.5d77f8",
- "type": "change",
- "z": "cb95299c.2817c8",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "force",
- "pt": "flow",
- "to": "payload",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 670,
- "y": 280,
- "wires": [
- []
- ]
- },
- {
- "id": "1ef1b43b.b0f064",
- "type": "inject",
- "z": "cb95299c.2817c8",
- "name": "0",
- "props": [
- {
- "p": "payload"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "",
- "payload": "0",
- "payloadType": "num",
- "x": 270,
- "y": 280,
- "wires": [
- [
- "dffb9881.feef8",
- "a4f68fa6.5d77f8"
- ]
- ]
- },
- {
- "id": "f078c068.eacf58",
- "type": "ui_template",
- "z": "cb95299c.2817c8",
- "group": "46be9c86.dea684",
- "name": "Stream Segmented object",
- "order": 2,
- "width": 10,
- "height": 8,
- "format": " ",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": false,
- "templateScope": "local",
- "x": 1370,
- "y": 600,
- "wires": [
- []
- ]
- },
- {
- "id": "43f97b93.b76294",
- "type": "inject",
- "z": "cb95299c.2817c8",
- "name": "1",
- "props": [
- {
- "p": "payload"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "",
- "payload": "1",
- "payloadType": "num",
- "x": 270,
- "y": 240,
- "wires": [
- [
- "21af0db1.c2c182",
- "880b192a.88e2d"
- ]
- ]
- },
- {
- "id": "ac439738.28bc18",
- "type": "function",
- "z": "cb95299c.2817c8",
- "name": "chart init",
- "func": "obj=[{\"series\": [],\"data\": [],\"labels\": []}]\nmsg.payload = obj\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 980,
- "y": 880,
- "wires": [
- [
- "458cd82e.03d258"
- ]
- ]
- },
- {
- "id": "4f3f7c4a.cb21c4",
- "type": "change",
- "z": "cb95299c.2817c8",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "obj_counter",
- "pt": "flow",
- "to": "0",
- "tot": "num"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 1010,
- "y": 840,
- "wires": [
- [
- "fa3b7929.ac7da8",
- "9d53dbe2.dbffe8"
- ]
- ]
- },
- {
- "id": "6bce0f60.f48998",
- "type": "link in",
- "z": "cb95299c.2817c8",
- "name": "",
- "links": [
- "596fc9d4.46c75"
- ],
- "x": 855,
- "y": 840,
- "wires": [
- [
- "4f3f7c4a.cb21c4",
- "ac439738.28bc18"
- ]
- ]
- },
- {
- "id": "596fc9d4.46c75",
- "type": "link out",
- "z": "cb95299c.2817c8",
- "name": "",
- "links": [
- "6bce0f60.f48998"
- ],
- "x": 715,
- "y": 500,
- "wires": []
- },
- {
- "id": "c72a1064.1ec388",
- "type": "change",
- "z": "cb95299c.2817c8",
- "name": "Reset counters",
- "rules": [
- {
- "t": "set",
- "p": "topic",
- "pt": "msg",
- "to": "object count",
- "tot": "str"
- },
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "0",
- "tot": "num"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 600,
- "y": 500,
- "wires": [
- [
- "596fc9d4.46c75"
- ]
- ]
- },
- {
- "id": "9367534a.fb8568",
- "type": "ui_multistate_switch",
- "z": "cb95299c.2817c8",
- "name": "Ecotaxa archive",
- "group": "abeb6dad.635a2",
- "order": 6,
- "width": 5,
- "height": 1,
- "label": "Ecotaxa archive",
- "stateField": "payload",
- "enableField": "enable",
- "rounded": true,
- "useThemeColors": true,
- "hideSelectedLabel": false,
- "options": [
- {
- "label": "No",
- "value": "0",
- "valueType": "num",
- "color": "#009933"
- },
- {
- "label": "Yes",
- "value": "1",
- "valueType": "num",
- "color": "#999999"
- }
- ],
- "x": 1080,
- "y": 220,
- "wires": [
- [
- "25ac4f9a.5b05c8"
- ]
- ]
- },
- {
- "id": "25ac4f9a.5b05c8",
- "type": "change",
- "z": "cb95299c.2817c8",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "ecotaxa",
- "pt": "flow",
- "to": "payload",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 1280,
- "y": 240,
- "wires": [
- []
- ]
- },
- {
- "id": "bef78886.8f0b98",
- "type": "inject",
- "z": "cb95299c.2817c8",
- "name": "1",
- "props": [
- {
- "p": "payload"
- }
- ],
- "repeat": "",
- "crontab": "",
- "once": true,
- "onceDelay": 0.1,
- "topic": "",
- "payload": "1",
- "payloadType": "num",
- "x": 910,
- "y": 240,
- "wires": [
- [
- "9367534a.fb8568",
- "25ac4f9a.5b05c8"
- ]
- ]
- },
- {
- "id": "32465a4e.8fcac6",
- "type": "ui_multistate_switch",
- "z": "cb95299c.2817c8",
- "name": "Keep objects",
- "group": "abeb6dad.635a2",
- "order": 5,
- "width": 5,
- "height": 1,
- "label": "Keep objects",
- "stateField": "payload",
- "enableField": "enable",
- "rounded": true,
- "useThemeColors": true,
- "hideSelectedLabel": false,
- "options": [
- {
- "label": "No",
- "value": "0",
- "valueType": "num",
- "color": "#009933"
- },
- {
- "label": "Yes",
- "value": "1",
- "valueType": "num",
- "color": "#999999"
- }
- ],
- "x": 1070,
- "y": 300,
- "wires": [
- [
- "8dd6f57f.b77f98"
- ]
- ]
- },
- {
- "id": "8dd6f57f.b77f98",
- "type": "change",
- "z": "cb95299c.2817c8",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "keep",
- "pt": "flow",
- "to": "payload",
- "tot": "msg"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 1270,
- "y": 280,
- "wires": [
- []
- ]
- },
- {
- "id": "6c20d6a7.869b6",
- "type": "link out",
- "z": "9daf9e2b.019fc",
- "name": "Git revision",
- "links": [
- "9373b3f6.33a2b"
- ],
- "x": 1035,
- "y": 360,
- "wires": []
- },
- {
- "id": "7de3a9b4.0ab108",
- "type": "ui_toast",
- "z": "9daf9e2b.019fc",
- "position": "top right",
- "displayTime": "10",
- "highlight": "",
- "sendall": true,
- "outputs": 0,
- "ok": "OK",
- "cancel": "",
- "raw": false,
- "topic": "",
- "name": "Git branch update",
- "x": 1290,
- "y": 260,
- "wires": []
- },
- {
- "id": "ccc7d79b.a419f",
- "type": "change",
- "z": "9daf9e2b.019fc",
- "name": "",
- "rules": [
- {
- "t": "set",
- "p": "payload",
- "pt": "msg",
- "to": "List update successfull",
- "tot": "str"
- },
- {
- "t": "set",
- "p": "topic",
- "pt": "msg",
- "to": "Branch list update",
- "tot": "str"
- }
- ],
- "action": "",
- "property": "",
- "from": "",
- "to": "",
- "reg": false,
- "x": 1080,
- "y": 260,
- "wires": [
- [
- "7de3a9b4.0ab108"
- ]
- ]
- },
- {
- "id": "9373b3f6.33a2b",
- "type": "link in",
- "z": "1371dec5.76e671",
- "name": "Git Rev",
- "links": [
- "6c20d6a7.869b6"
- ],
- "x": 375,
- "y": 520,
- "wires": [
- [
- "3e64877a.9684b"
- ]
- ]
- },
- {
- "id": "5fc4ede4.72516c",
- "type": "rpi-gpio out",
- "z": "9daf9e2b.019fc",
- "name": "HAT Pump Enable",
- "pin": "16",
- "set": true,
- "level": "1",
- "freq": "",
- "out": "out",
- "x": 430,
- "y": 40,
- "wires": []
- },
- {
- "id": "6db0fcf5.f0effc",
- "type": "rpi-gpio out",
- "z": "9daf9e2b.019fc",
- "name": "HAT Focus Enable",
- "pin": "29",
- "set": true,
- "level": "1",
- "freq": "",
- "out": "out",
- "x": 430,
- "y": 160,
- "wires": []
- },
{
"id": "8ea9dc9a.c7d87",
"type": "function",
@@ -10057,118 +4512,2415 @@
]
},
{
- "id": "73c4a14a.9b93c8",
+ "id": "335a730b9a3830ff",
+ "type": "ui_template",
+ "z": "bccd1f23.87219",
+ "group": "4248342d.e55fac",
+ "name": "Lens",
+ "order": 3,
+ "width": 0,
+ "height": 0,
+ "format": "\n Objective lens aperture: \n \n mm\n
",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": false,
+ "templateScope": "local",
+ "x": 1310,
+ "y": 40,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "142bc61a0bde1ba9",
+ "type": "link in",
+ "z": "bccd1f23.87219",
+ "name": "Cam Stream",
+ "links": [
+ "49111a72f4e32740"
+ ],
+ "x": 235,
+ "y": 40,
+ "wires": [
+ [
+ "3ca8be38ddb269e9"
+ ]
+ ]
+ },
+ {
+ "id": "3ca8be38ddb269e9",
+ "type": "template",
+ "z": "bccd1f23.87219",
+ "name": "Prepare stream HTML",
+ "field": "payload",
+ "fieldType": "msg",
+ "format": "handlebars",
+ "syntax": "mustache",
+ "template": "\n \n ",
+ "output": "str",
+ "x": 380,
+ "y": 40,
+ "wires": [
+ [
+ "6a84252a.d52a0c"
+ ]
+ ]
+ },
+ {
+ "id": "f59a2f0d.5e9af",
+ "type": "ui_numeric",
+ "z": "baa1e3d9.cb29d",
+ "name": "acq_minimum_mesh",
+ "label": "Min fraction size (μm)",
+ "tooltip": "",
+ "group": "404c301a.19c4e",
+ "order": 1,
+ "width": 5,
+ "height": 1,
+ "wrap": false,
+ "passthru": true,
+ "topic": "acq_minimum_mesh",
+ "format": "{{value}}",
+ "min": 0,
+ "max": "300",
+ "step": "10",
+ "x": 640,
+ "y": 160,
+ "wires": [
+ [
+ "fb887036.12429"
+ ]
+ ]
+ },
+ {
+ "id": "6008a8bb.259f08",
+ "type": "ui_numeric",
+ "z": "baa1e3d9.cb29d",
+ "name": "acq_maximum_mesh",
+ "label": "Max fraction size (μm)",
+ "tooltip": "",
+ "group": "404c301a.19c4e",
+ "order": 2,
+ "width": 5,
+ "height": 1,
+ "wrap": false,
+ "passthru": true,
+ "topic": "acq_maximum_mesh",
+ "format": "{{value}}",
+ "min": "200",
+ "max": "2000",
+ "step": "100",
+ "x": 640,
+ "y": 200,
+ "wires": [
+ [
+ "fb887036.12429"
+ ]
+ ]
+ },
+ {
+ "id": "6b34c456.83178c",
+ "type": "ui_text_input",
+ "z": "baa1e3d9.cb29d",
+ "name": "acq_id",
+ "label": "Acquisition unique ID*",
+ "tooltip": "",
+ "group": "4322c187.e73e5",
+ "order": 1,
+ "width": 5,
+ "height": 1,
+ "passthru": true,
+ "mode": "text",
+ "delay": 300,
+ "topic": "acq_id",
+ "x": 690,
+ "y": 240,
+ "wires": [
+ [
+ "fb887036.12429"
+ ]
+ ]
+ },
+ {
+ "id": "cc0ca68b.4263a8",
+ "type": "ui_dropdown",
+ "z": "baa1e3d9.cb29d",
+ "name": "acq_celltype",
+ "label": "Flowcell thickness*",
+ "tooltip": "",
+ "place": "Select option",
+ "group": "4322c187.e73e5",
+ "order": 6,
+ "width": 5,
+ "height": 1,
+ "passthru": true,
+ "multiple": false,
+ "options": [
+ {
+ "label": "200 μm µ-Slide I Luer",
+ "value": 200,
+ "type": "num"
+ },
+ {
+ "label": "300 µm capillary",
+ "value": 300,
+ "type": "num"
+ },
+ {
+ "label": "400 μm µ-Slide I Luer",
+ "value": 400,
+ "type": "num"
+ },
+ {
+ "label": "600 μm µ-Slide I Luer",
+ "value": 600,
+ "type": "num"
+ },
+ {
+ "label": "800 μm µ-Slide I Luer",
+ "value": 800,
+ "type": "num"
+ }
+ ],
+ "payload": "",
+ "topic": "acq_celltype",
+ "topicType": "str",
+ "x": 670,
+ "y": 80,
+ "wires": [
+ [
+ "fb887036.12429",
+ "99b11fe4.2795d"
+ ]
+ ]
+ },
+ {
+ "id": "fb887036.12429",
"type": "function",
- "z": "b771c342.49603",
- "name": "Convert time",
- "func": "if (msg.payload.time){\n msg.payload.time = msg.payload.time.replace('T', ' ');\n return msg;\n}",
+ "z": "baa1e3d9.cb29d",
+ "name": "set global",
+ "func": "global.set(msg.topic, msg.payload);",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
- "x": 470,
- "y": 1280,
+ "x": 920,
+ "y": 220,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "bb2bb7ce.1d1458",
+ "type": "ui_template",
+ "z": "baa1e3d9.cb29d",
+ "group": "858a0e3c.987fe",
+ "name": "Stream Pi Camera",
+ "order": 1,
+ "width": 10,
+ "height": 8,
+ "format": " ",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": false,
+ "templateScope": "local",
+ "x": 650,
+ "y": 20,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "d0c5b57d.590818",
+ "type": "ui_ui_control",
+ "z": "baa1e3d9.cb29d",
+ "name": "",
+ "events": "change",
+ "x": 1280,
+ "y": 660,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "c72f8fae.23bd4",
+ "type": "ui_button",
+ "z": "baa1e3d9.cb29d",
+ "name": "",
+ "group": "b7919ae2.c01788",
+ "order": 1,
+ "width": 5,
+ "height": 1,
+ "passthru": false,
+ "label": "Previous",
+ "tooltip": "",
+ "color": "#097479",
+ "bgcolor": "white",
+ "icon": "keyboard_return",
+ "payload": "{\"tab\":\"Optic Configuration\"}",
+ "payloadType": "json",
+ "topic": "",
+ "x": 1140,
+ "y": 660,
"wires": [
[
- "35ad311f.344c76"
+ "d0c5b57d.590818"
]
]
},
{
- "id": "f439663c.8abd3",
+ "id": "29be525e.0c87fe",
+ "type": "ui_template",
+ "z": "baa1e3d9.cb29d",
+ "group": "b5d61bc7.54fe48",
+ "name": "Show Metadata",
+ "order": 9,
+ "width": 0,
+ "height": 0,
+ "format": "\n
\n \n \n Sample \n id:
\n project:
\n ship:
\n operator:
\n sampling gear:
\n concentrated volume:
\n gear net opening:
\n total volume filtered:
\n \n \n Acquisition \n id:
\n instrument:
\n instrument id:
\n camera:
\n celltype:
\n minimum mesh:
\n maximum mesh:
\n min esd:
\n max esd:
\n volume:
\n magnification:
\n fnumber objective:
\n software:
\n \n \n \n \n Object \n latitude:
\n longitude:
\n latitude end:
\n longitude end:
\n date:
\n time:
\n date end:
\n time end:
\n depth min:
\n depth max:
\n \n \n Process \n pixel:
\n id:
\n \n \n
\n
",
+ "storeOutMessages": false,
+ "fwdInMessages": false,
+ "resendOnRefresh": false,
+ "templateScope": "local",
+ "x": 1200,
+ "y": 400,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "4b489713.ccde5",
+ "type": "ui_button",
+ "z": "baa1e3d9.cb29d",
+ "name": "",
+ "group": "4322c187.e73e5",
+ "order": 12,
+ "width": 5,
+ "height": 1,
+ "passthru": false,
+ "label": "Start Acquisition",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "camera",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "imager/image",
+ "x": 460,
+ "y": 480,
+ "wires": [
+ [
+ "c9f510c0.7d1328"
+ ]
+ ]
+ },
+ {
+ "id": "c9f510c0.7d1328",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "Image control",
+ "func": "// Reset the number of images taken\nflow.set('img_counter', 0);\n\nvar acq_celltype = global.get(\"acq_celltype\");\nvar acq_minimum_mesh = global.get(\"acq_minimum_mesh\");\nvar acq_maximum_mesh = global.get(\"acq_maximum_mesh\");\nvar imaging_pump_volume = global.get(\"imaging_pump_volume\");\nvar acq_id = global.get(\"acq_id\");\nvar nb_frame = global.get(\"nb_frame\");\nvar pump_direction = global.get(\"pump_direction\");\nvar sleep_before = global.get(\"sleep_before\");\nvar object_date = global.get(\"object_date\");\n\nif (acq_celltype === undefined || acq_celltype === \"\") {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Type of the flowcell\";\n return [null, msg];\n} else if (acq_minimum_mesh === undefined || acq_minimum_mesh === \"\") {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Lower fraction size\";\n return [null, msg];\n} else if (acq_maximum_mesh === undefined || acq_maximum_mesh === \"\") {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Upper fraction size\";\n return [null, msg];\n} else if (imaging_pump_volume === undefined || imaging_pump_volume === \"\" || imaging_pump_volume === null) {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Volume inbetween images\";\n return [null, msg];\n} else if (acq_id === undefined || acq_id === \"\") {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Acquisition ID\";\n return [null, msg];\n} else if (nb_frame === undefined || nb_frame === \"\" || nb_frame === null) {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Number of image to save\";\n return [null, msg];\n} else if (pump_direction === undefined || pump_direction === \"\" || pump_direction === null) {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Pump direction\";\n return [null, msg];\n} else if (sleep_before === undefined || sleep_before === \"\" || sleep_before === null) {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Delay before image\";\n return [null, msg];\n}else if (object_date === undefined || object_date === \"\" || object_date === null) {\n msg.topic = \"Missing entry :\";\n msg.payload = \"Object date\";\n return [null, msg];\n}\n\nmsg.payload = {\n \"action\": \"image\",\n \"sleep\": sleep_before,\n \"pump_direction\": pump_direction,\n \"volume\": imaging_pump_volume,\n \"nb_frame\": nb_frame,\n}\n\nreturn [msg, null];",
+ "outputs": 2,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 680,
+ "y": 480,
+ "wires": [
+ [
+ "52ea7d01.711034",
+ "40c12463.a1f84c",
+ "a4abb1ae.2ae418"
+ ],
+ [
+ "20e0a8c8.edbeb"
+ ]
+ ]
+ },
+ {
+ "id": "20e0a8c8.edbeb",
+ "type": "ui_toast",
+ "z": "baa1e3d9.cb29d",
+ "position": "dialog",
+ "displayTime": "3",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 1,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "",
+ "name": "",
+ "x": 950,
+ "y": 560,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "c3e50240.82aa58",
+ "type": "mqtt out",
+ "z": "baa1e3d9.cb29d",
+ "name": "",
+ "topic": "",
+ "qos": "",
+ "retain": "",
+ "broker": "8dc3722c.06efa8",
+ "x": 1170,
+ "y": 440,
+ "wires": []
+ },
+ {
+ "id": "3a4450b1.4459a8",
+ "type": "ui_button",
+ "z": "baa1e3d9.cb29d",
+ "name": "Stop Acquisition",
+ "group": "4322c187.e73e5",
+ "order": 11,
+ "width": 5,
+ "height": 1,
+ "passthru": true,
+ "label": "STOP ACQUISITION",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "#AD1625",
+ "icon": "cancel",
+ "payload": "{\"action\":\"stop\"}",
+ "payloadType": "json",
+ "topic": "imager/image",
+ "x": 460,
+ "y": 520,
+ "wires": [
+ [
+ "d74210ef.edc15"
+ ]
+ ]
+ },
+ {
+ "id": "d74210ef.edc15",
+ "type": "mqtt out",
+ "z": "baa1e3d9.cb29d",
+ "name": "",
+ "topic": "",
+ "qos": "",
+ "retain": "",
+ "broker": "8dc3722c.06efa8",
+ "x": 650,
+ "y": 520,
+ "wires": []
+ },
+ {
+ "id": "bb62da8a.ebc328",
+ "type": "ui_switch",
+ "z": "baa1e3d9.cb29d",
+ "name": "Pump direction",
+ "label": "Pump direction",
+ "tooltip": "BACKWARD / FORWARD",
+ "group": "4322c187.e73e5",
+ "order": 9,
+ "width": 5,
+ "height": 1,
+ "passthru": true,
+ "decouple": "false",
+ "topic": "pump_direction",
+ "style": "",
+ "onvalue": "FORWARD",
+ "onvalueType": "str",
+ "onicon": "",
+ "oncolor": "",
+ "offvalue": "BACKWARD",
+ "offvalueType": "str",
+ "officon": "",
+ "offcolor": "",
+ "x": 460,
+ "y": 560,
+ "wires": [
+ [
+ "6b2239f3.41fa3"
+ ]
+ ]
+ },
+ {
+ "id": "52ea7d01.711034",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "Encapsulate config",
+ "func": "msg.payload = {\n\t\"action\": \"update_config\",\n\t\"config\": {\n \t\"description\": {\n \t\t\"sample_project\": \"Project's name\",\n \t\t\"sample_id\": \"Sample ID\",\n \t\t\"sample_uuid\": \"Sample UUID (Autogenerated)\",\n \t\t\"sample_ship\": \"Ship's name\",\n \t\t\"sample_operator\": \"Operator's name\",\n \t\t\"sample_sampling_gear\": \"Sampling gear used\",\n \t\t\"sample_concentrated_sample_volume\": \"Volume of concentrated sample, in mL\",\n \t\t\"sample_total_volume\": \"Total volume filtered by the net used, in L\",\n \t\t\"sample_dilution_factor\": \"Dilution factor of the sample, 0.5 if diluted by 2, 2 if concentrated by 2\",\n \t\t\"sample_speed_through_water\": \"Speed of the boat through water when sampling, in kts\",\n \t\t\"acq_id\": \"Acquisition ID\",\n \t\t\"acq_uuid\": \"Acquisition UUID (Autogenerated)\",\n \t\t\"acq_instrument\": \"Instrument type\",\n \t\t\"acq_instrument_id\": \"Instrument ID\",\n \t\t\"acq_celltype\": \"Flow cell dimension thickness, in µm\",\n \t\t\"acq_minimum_mesh\": \"Minimum filtration mesh size, in µm\",\n \t\t\"acq_maximum_mesh\": \"Maximum filtration mesh size, in µm\",\n \t\t\"acq_min_esd\": \"\",\n \t\t\"acq_max_esd\": \"\",\n \t\t\"acq_volume\": \"Pumped volume, in mL\",\n\t\t \"acq_imaged_volume\": \"Total imaged volume, in mL\",\n \t\t\"acq_magnification\": \"Optical magnification\",\n \t\t\"acq_fnumber_objective\": \"Focal length of the objective, in mm\",\n \t\t\"acq_camera_name\": \"Name of the camera used\",\n \t\t\"acq_nb_frame\": \"Number of picture taken\",\n \"acq_local_datetime\": \"Instrument local datetime\",\n \"acq_camera_resolution\": \"Resolution of the images\",\n \"acq_camera_iso\": \"ISO Number of the images\",\n \"acq_camera_shutter_speed\": \"Shutter speed of the images, in µs\",\n \"acq_software\": \"Software version number\",\n \t\t\"object_date\": \"Sample collection date (or beginning if using a net)\",\n \t\t\"object_time\": \"Sample collection time (or beginning if using a net)\",\n \t\t\"object_lat\": \"Sample collection latitude (or beginning if using a net)\",\n \t\t\"object_lon\": \"Sample collection longitude (or beginning if using a net)\",\n \t\t\"object_depth_min\": \"Sample collection minimal depth, in m\",\n \t\t\"object_depth_max\": \"Sample collection maximum depth, in m\",\n \t\t\"process_pixel\": \"Pixel imaging resolution, in µm/pixel\",\n \t\t\"process_datetime\": \"Segmentation timestamp\",\n \t\t\"process_id\": \"Segmentation ID\",\n \t\t\"process_uuid\": \"Segmentation UUID (Autogenerated)\",\n \t\t\"process_source\": \"Code source link of the executed code\",\n \t\t\"process_commit\": \"Version reference of the executed code\",\n \t\t\"sample_gear_net_opening\": \"Sample mouth opening dimension, in mm\",\n \t\t\"object_date_end\": \"Sample end collection date when using a net\",\n \t\t\"object_time_end\": \"Sample end collection time when using a net\",\n \t\t\"object_lat_end\": \"Sample end collection latitude when using a net\",\n \t\t\"object_lon_end\": \"Sample end collection longitude when using a net\",\n \t},\n\t\t\"sample_project\": global.get(\"sample_project\"),\n\t\t\"sample_id\": global.get(\"sample_project\") + \"_\" + global.get(\"sample_id\"),\n\t\t\"sample_ship\": global.get(\"sample_ship\"),\n\t\t\"sample_operator\": global.get(\"sample_operator\"),\n\t\t\"sample_sampling_gear\": global.get(\"sample_sampling_gear\"),\n\t\t\"sample_concentrated_sample_volume\": global.get(\"sample_concentrated_sample_volume\"),\n\t\t\"sample_dilution_factor\": global.get(\"sample_dilution_factor\"),\n\t\t\"sample_speed_through_water\": global.get(\"sample_speed_through_water\"),\n\n\t\t\"acq_id\": global.get(\"sample_project\") + \"_\" + global.get(\"sample_id\")+ \"_\" + global.get(\"acq_id\"),\n\t\t\"acq_instrument\": global.get(\"acq_instrument\"),\n\t\t\"acq_instrument_id\": global.get(\"acq_instrument_id\"),\n\t\t\"acq_celltype\": global.get(\"acq_celltype\"),\n\t\t\"acq_minimum_mesh\": global.get(\"acq_minimum_mesh\"),\n\t\t\"acq_maximum_mesh\": global.get(\"acq_maximum_mesh\"),\n\t\t\"acq_min_esd\": global.get(\"acq_min_esd\"),\n\t\t\"acq_max_esd\": global.get(\"acq_max_esd\"),\n\t\t\"acq_volume\": global.get(\"acq_volume\"),\n\t\t\"acq_imaged_volume\": global.get(\"acq_imaged_volume\"),\n\t\t\"acq_magnification\": global.get(\"acq_magnification\"),\n\t\t\"acq_fnumber_objective\": global.get(\"acq_fnumber_objective\"),\n\t\t\"acq_camera\": global.get(\"acq_camera\"),\n\t\t\"acq_nb_frame\": global.get(\"nb_frame\"),\n\t\t\"acq_software\": global.get(\"acq_software\"),\n\n\t\t\"object_date\": global.get(\"object_date\"),\n\t\t\"object_time\": global.get(\"object_time\"),\n\t\t\"object_lat\": global.get(\"object_lat\"),\n\t\t\"object_lon\": global.get(\"object_lon\"),\n\t\t\"object_depth_min\": global.get(\"object_depth_min\"),\n\t\t\"object_depth_max\": global.get(\"object_depth_max\"),\n\n\t\t\"process_pixel\": global.get(\"process_pixel\"),\n\t\t\"process_source\": \"https://www.github.com/PlanktonPlanet/PlanktoScope\",\n\t\t\"process_commit\": global.get(\"process_commit\")\n\t}\n};\n\nif (msg.payload.config.sample_sampling_gear.startsWith(\"net\")) {\n\tmsg.payload.config[\"sample_gear_net_opening\"] = global.get(\"sample_gear_net_opening\")\n\tmsg.payload.config[\"object_date_end\"] = global.get(\"object_date_end\")\n\tmsg.payload.config[\"object_time_end\"] = global.get(\"object_time_end\")\n\tmsg.payload.config[\"object_lat_end\"] = global.get(\"object_lat_end\")\n\tmsg.payload.config[\"object_lon_end\"] = global.get(\"object_lon_end\")\n\tmsg.payload.config[\"sample_total_volume\"] = global.get(\"sample_total_volume\")\n}\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 910,
+ "y": 440,
+ "wires": [
+ [
+ "c3e50240.82aa58",
+ "29be525e.0c87fe"
+ ]
+ ]
+ },
+ {
+ "id": "40c12463.a1f84c",
+ "type": "delay",
+ "z": "baa1e3d9.cb29d",
+ "name": "",
+ "pauseType": "delay",
+ "timeout": "1",
+ "timeoutUnits": "seconds",
+ "rate": "1",
+ "nbRateUnits": "1",
+ "rateUnits": "second",
+ "randomFirst": "1",
+ "randomLast": "5",
+ "randomUnits": "seconds",
+ "drop": false,
+ "outputs": 1,
+ "x": 940,
+ "y": 480,
+ "wires": [
+ [
+ "c3e50240.82aa58"
+ ]
+ ]
+ },
+ {
+ "id": "4d1b02cb.83b51c",
+ "type": "ui_button",
+ "z": "baa1e3d9.cb29d",
+ "name": "",
+ "group": "4322c187.e73e5",
+ "order": 10,
+ "width": 5,
+ "height": 1,
+ "passthru": false,
+ "label": "Update config",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "save",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "imager/image",
+ "x": 460,
+ "y": 440,
+ "wires": [
+ [
+ "52ea7d01.711034"
+ ]
+ ]
+ },
+ {
+ "id": "5921d0d0.a3d568",
+ "type": "subflow:1c24ad9c.bebec2",
+ "z": "baa1e3d9.cb29d",
+ "name": "",
+ "env": [],
+ "x": 110,
+ "y": 220,
+ "wires": [
+ [
+ "f3658d30.b8448",
+ "de2c90cf.b73b08",
+ "4be09c97f86897d9",
+ "f573206abefa9518",
+ "f948151ab4031df4",
+ "5e3dec55.881074",
+ "d3ca8847.4d1ae"
+ ]
+ ]
+ },
+ {
+ "id": "f3658d30.b8448",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "get acq_id",
+ "func": "msg.payload = msg.payload.acq_id;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 330,
+ "y": 240,
+ "wires": [
+ [
+ "6b34c456.83178c"
+ ]
+ ]
+ },
+ {
+ "id": "de2c90cf.b73b08",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "get acq_celltype",
+ "func": "msg.payload = msg.payload.acq_celltype;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 340,
+ "y": 80,
+ "wires": [
+ [
+ "cc0ca68b.4263a8"
+ ]
+ ]
+ },
+ {
+ "id": "5e3dec55.881074",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "get acq_minimum_mesh",
+ "func": "msg.payload = msg.payload.acq_minimum_mesh;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "x": 370,
+ "y": 160,
+ "wires": [
+ [
+ "f59a2f0d.5e9af"
+ ]
+ ]
+ },
+ {
+ "id": "d3ca8847.4d1ae",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "get acq_maximum_mesh",
+ "func": "msg.payload = msg.payload.acq_maximum_mesh;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "x": 370,
+ "y": 200,
+ "wires": [
+ [
+ "6008a8bb.259f08"
+ ]
+ ]
+ },
+ {
+ "id": "b402f719.55bc98",
+ "type": "inject",
+ "z": "baa1e3d9.cb29d",
+ "name": "Default: FORWARD",
+ "props": [
+ {
+ "p": "payload"
+ },
+ {
+ "p": "topic",
+ "vt": "str"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": 0.1,
+ "topic": "pump_direction",
+ "payload": "FORWARD",
+ "payloadType": "str",
+ "x": 220,
+ "y": 560,
+ "wires": [
+ [
+ "bb62da8a.ebc328"
+ ]
+ ]
+ },
+ {
+ "id": "6b2239f3.41fa3",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "set global",
+ "func": "global.set(msg.topic, msg.payload);",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 660,
+ "y": 560,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "51b4d0df.d70a88",
+ "type": "ui_text_input",
+ "z": "baa1e3d9.cb29d",
+ "name": "nb_frame",
+ "label": "Number of images to acquire",
+ "tooltip": "",
+ "group": "4322c187.e73e5",
+ "order": 2,
+ "width": 5,
+ "height": 1,
+ "passthru": true,
+ "mode": "number",
+ "delay": 300,
+ "topic": "nb_frame",
+ "x": 680,
+ "y": 280,
+ "wires": [
+ [
+ "fb887036.12429",
+ "67091ac0.8f9f6c",
+ "99b11fe4.2795d"
+ ]
+ ]
+ },
+ {
+ "id": "999065ca.27edb8",
+ "type": "switch",
+ "z": "baa1e3d9.cb29d",
+ "name": "topic filter",
+ "property": "topic",
+ "propertyType": "msg",
+ "rules": [
+ {
+ "t": "eq",
+ "v": "status/pump",
+ "vt": "str"
+ },
+ {
+ "t": "eq",
+ "v": "status/focus",
+ "vt": "str"
+ },
+ {
+ "t": "eq",
+ "v": "status/imager",
+ "vt": "str"
+ }
+ ],
+ "checkall": "true",
+ "repair": false,
+ "outputs": 3,
+ "x": 320,
+ "y": 800,
+ "wires": [
+ [
+ "a46a1e7f.88a92",
+ "6742014e.1bb238"
+ ],
+ [
+ "c516d9ea.f7f6e",
+ "6742014e.1bb238"
+ ],
+ [
+ "307c851e.fb0f7a",
+ "2b9d6988.d84836"
+ ]
+ ]
+ },
+ {
+ "id": "2b009bd7.c07004",
+ "type": "ui_text",
+ "z": "baa1e3d9.cb29d",
+ "group": "70de8209.68416c",
+ "order": 3,
+ "width": 10,
+ "height": 2,
+ "name": "imager",
+ "label": "Imager status:",
+ "format": "{{msg.payload.status}}",
+ "layout": "col-center",
+ "x": 770,
+ "y": 740,
+ "wires": []
+ },
+ {
+ "id": "c516d9ea.f7f6e",
+ "type": "ui_text",
+ "z": "baa1e3d9.cb29d",
+ "group": "70de8209.68416c",
+ "order": 1,
+ "width": 5,
+ "height": 1,
+ "name": "focus",
+ "label": "Focus status:",
+ "format": "{{msg.payload.status}}",
+ "layout": "col-center",
+ "x": 770,
+ "y": 700,
+ "wires": []
+ },
+ {
+ "id": "a46a1e7f.88a92",
+ "type": "ui_text",
+ "z": "baa1e3d9.cb29d",
+ "group": "70de8209.68416c",
+ "order": 2,
+ "width": 5,
+ "height": 1,
+ "name": "pump",
+ "label": "Pump status:",
+ "format": "{{msg.payload.status}}",
+ "layout": "col-center",
+ "x": 770,
+ "y": 660,
+ "wires": []
+ },
+ {
+ "id": "bb628f8d.98f108",
+ "type": "link in",
+ "z": "baa1e3d9.cb29d",
+ "name": "Status for fluidic module",
+ "links": [
+ "58f2e0f.4e8b12"
+ ],
+ "x": 175,
+ "y": 800,
+ "wires": [
+ [
+ "999065ca.27edb8"
+ ]
+ ]
+ },
+ {
+ "id": "307c851e.fb0f7a",
+ "type": "switch",
+ "z": "baa1e3d9.cb29d",
+ "name": "Imaging state",
+ "property": "payload",
+ "propertyType": "msg",
+ "rules": [
+ {
+ "t": "jsonata_exp",
+ "v": "$contains(msg.payload.status, \"jpg\")\t",
+ "vt": "jsonata"
+ },
+ {
+ "t": "else"
+ }
+ ],
+ "checkall": "false",
+ "repair": false,
+ "outputs": 2,
+ "x": 540,
+ "y": 880,
+ "wires": [
+ [
+ "db8e3dde.44efb8"
+ ],
+ [
+ "6742014e.1bb238"
+ ]
+ ]
+ },
+ {
+ "id": "db8e3dde.44efb8",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "img_counter",
+ "func": "img_counter=flow.get('img_counter')\nif (img_counter === undefined || img_counter === \"\"){\n img_counter = 0\n}\nimg_counter=img_counter+1\nflow.set('img_counter',img_counter)\nmsg.payload = img_counter\nmsg.payload = (100 * img_counter/global.get('nb_frame')).toFixed(2)\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 770,
+ "y": 860,
+ "wires": [
+ [
+ "1a2e721a.f5e876"
+ ]
+ ]
+ },
+ {
+ "id": "59164d65.e7993c",
+ "type": "ui_toast",
+ "z": "baa1e3d9.cb29d",
+ "position": "top right",
+ "displayTime": "5",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 0,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "",
+ "name": "",
+ "x": 1270,
+ "y": 900,
+ "wires": []
+ },
+ {
+ "id": "8c7348aa.1962e8",
+ "type": "template",
+ "z": "baa1e3d9.cb29d",
+ "name": "Create sentence",
+ "field": "payload",
+ "fieldType": "msg",
+ "format": "handlebars",
+ "syntax": "mustache",
+ "template": "The {{topic}} is {{payload.status}}",
+ "output": "str",
+ "x": 1050,
+ "y": 900,
+ "wires": [
+ [
+ "59164d65.e7993c"
+ ]
+ ]
+ },
+ {
+ "id": "6742014e.1bb238",
+ "type": "change",
+ "z": "baa1e3d9.cb29d",
+ "name": "Remove high-level topic",
+ "rules": [
+ {
+ "t": "change",
+ "p": "topic",
+ "pt": "msg",
+ "from": "status/",
+ "fromt": "str",
+ "to": "",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 810,
+ "y": 900,
+ "wires": [
+ [
+ "8c7348aa.1962e8"
+ ]
+ ]
+ },
+ {
+ "id": "1a2e721a.f5e876",
+ "type": "ui_gauge",
+ "z": "baa1e3d9.cb29d",
+ "name": "progress donut",
+ "group": "b5d61bc7.54fe48",
+ "order": 3,
+ "width": 6,
+ "height": 3,
+ "gtype": "donut",
+ "title": "",
+ "label": "%",
+ "format": "{{value}}",
+ "min": 0,
+ "max": "100",
+ "colors": [
+ "#ffa83f",
+ "#e6ff02",
+ "#00dfe9"
+ ],
+ "seg1": "50",
+ "seg2": "75",
+ "x": 1260,
+ "y": 860,
+ "wires": []
+ },
+ {
+ "id": "9bd72495.a8a098",
+ "type": "ui_text",
+ "z": "baa1e3d9.cb29d",
+ "group": "4322c187.e73e5",
+ "order": 5,
+ "width": 5,
+ "height": 1,
+ "name": "Total imaged volume",
+ "label": "Total imaged volume",
+ "format": "{{msg.payload}}",
+ "layout": "col-center",
+ "x": 1200,
+ "y": 140,
+ "wires": []
+ },
+ {
+ "id": "99b11fe4.2795d",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "imaged volume calc",
+ "func": "camera = global.get(\"acq_camera\");\ncell = global.get(\"acq_celltype\");\nnb_frame = global.get(\"nb_frame\");\nprocess_pixel = global.get(\"process_pixel\");\n\nvar volume = 0\nif (camera == \"HQ Camera\"){\n volume = nb_frame * (process_pixel*4056*process_pixel*3040*cell/1000000000) / 1000;\n}\nelse if (camera == \"Camera v2.1\"){\n volume = nb_frame * (process_pixel*3280*process_pixel*2464*cell/1000000000) / 1000;\n}\nelse{\n msg.payload = \"The camera is not known to this system\";\n return msg;\n}\n\nglobal.set(\"acq_imaged_volume\", volume.toFixed(4))\n\nmsg.payload = volume.toFixed(2) + \" mL\"\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 960,
+ "y": 140,
+ "wires": [
+ [
+ "9bd72495.a8a098"
+ ]
+ ],
+ "info": "### Focusing\n##### focus.py `nb_step` `orientation`\n\n- `nb_step` : **integer** (from 1 to 100000) - number of step to perform by the stage (about 31um/step)\n- `orientation` : **string** - orientation of the focus either `up` or `down`\n\nExample:\n\n python3.7 $HOME/PlanktoScope/scripts/focus.py 650 up\n"
+ },
+ {
+ "id": "8e16aa2f.e40398",
+ "type": "ui_text",
+ "z": "baa1e3d9.cb29d",
+ "group": "4322c187.e73e5",
+ "order": 7,
+ "width": 5,
+ "height": 1,
+ "name": "Total pumped volume",
+ "label": "Total pumped volume",
+ "format": "{{msg.payload}} mL",
+ "layout": "col-center",
+ "x": 1200,
+ "y": 300,
+ "wires": []
+ },
+ {
+ "id": "67091ac0.8f9f6c",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "acq_volume calc",
+ "func": "var imaging_pump_volume = global.get(\"imaging_pump_volume\");\nvar nb_frame = global.get(\"nb_frame\");\nvar acq_volume = 0\n\nacq_volume = (Number(nb_frame)*Number(imaging_pump_volume)).toFixed(2)\nglobal.set(\"acq_volume\", acq_volume)\n\nmsg.payload = acq_volume\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 950,
+ "y": 300,
+ "wires": [
+ [
+ "8e16aa2f.e40398"
+ ]
+ ],
+ "info": "### Focusing\n##### focus.py `nb_step` `orientation`\n\n- `nb_step` : **integer** (from 1 to 100000) - number of step to perform by the stage (about 31um/step)\n- `orientation` : **string** - orientation of the focus either `up` or `down`\n\nExample:\n\n python3.7 $HOME/PlanktoScope/scripts/focus.py 650 up\n"
+ },
+ {
+ "id": "2b9d6988.d84836",
+ "type": "switch",
+ "z": "baa1e3d9.cb29d",
+ "name": "",
+ "property": "payload",
+ "propertyType": "msg",
+ "rules": [
+ {
+ "t": "hask",
+ "v": "status",
+ "vt": "str"
+ },
+ {
+ "t": "hask",
+ "v": "camera_name",
+ "vt": "str"
+ }
+ ],
+ "checkall": "true",
+ "repair": false,
+ "outputs": 2,
+ "x": 650,
+ "y": 760,
+ "wires": [
+ [
+ "2b009bd7.c07004"
+ ],
+ [
+ "3bbb756a.84190a"
+ ]
+ ]
+ },
+ {
+ "id": "3bbb756a.84190a",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "set camera name",
+ "func": "global.set(\"acq_camera\", msg.payload.camera_name);\n\nmsg.payload = msg.payload.camera_name;\n\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 810,
+ "y": 780,
+ "wires": [
+ [
+ "559a8085.1d6b9"
+ ]
+ ]
+ },
+ {
+ "id": "559a8085.1d6b9",
+ "type": "link out",
+ "z": "baa1e3d9.cb29d",
+ "name": "Camera Name",
+ "links": [
+ "30067f35.532f2",
+ "572a6daa.6004c4",
+ "cfc783d7.d6ceb"
+ ],
+ "x": 965,
+ "y": 780,
+ "wires": []
+ },
+ {
+ "id": "49ea1123.ee1768",
+ "type": "ui_numeric",
+ "z": "baa1e3d9.cb29d",
+ "name": "sleep_before",
+ "label": "Delay to stabilize image (s)",
+ "tooltip": "Happens before every capture",
+ "group": "4322c187.e73e5",
+ "order": 4,
+ "width": 5,
+ "height": 1,
+ "wrap": false,
+ "passthru": true,
+ "topic": "sleep_before",
+ "format": "{{value}}",
+ "min": "0.1",
+ "max": "5",
+ "step": "0.1",
+ "x": 670,
+ "y": 120,
+ "wires": [
+ [
+ "fb887036.12429"
+ ]
+ ]
+ },
+ {
+ "id": "572a6daa.6004c4",
+ "type": "link in",
+ "z": "baa1e3d9.cb29d",
+ "name": "",
+ "links": [
+ "559a8085.1d6b9"
+ ],
+ "x": 795,
+ "y": 140,
+ "wires": [
+ [
+ "99b11fe4.2795d"
+ ]
+ ]
+ },
+ {
+ "id": "8032ea50.1b57f",
+ "type": "ui_template",
+ "z": "baa1e3d9.cb29d",
+ "group": "b5d61bc7.54fe48",
+ "name": "progress header",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "format": "Capture progress ",
+ "storeOutMessages": false,
+ "fwdInMessages": false,
+ "resendOnRefresh": false,
+ "templateScope": "local",
+ "x": 1270,
+ "y": 820,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "df1ea904.cd261",
+ "type": "ui_slider",
+ "z": "baa1e3d9.cb29d",
+ "name": "imaging_pump_volume",
+ "label": "Pumped volume (mL)",
+ "tooltip": "inbetween frames",
+ "group": "4322c187.e73e5",
+ "order": 3,
+ "width": 0,
+ "height": 0,
+ "passthru": true,
+ "outs": "end",
+ "topic": "imaging_pump_volume",
+ "min": "0.001",
+ "max": "0.5",
+ "step": "0.001",
+ "x": 630,
+ "y": 320,
+ "wires": [
+ [
+ "fb887036.12429",
+ "67091ac0.8f9f6c"
+ ]
+ ]
+ },
+ {
+ "id": "a4abb1ae.2ae418",
+ "type": "subflow:1c24ad9c.bebec2",
+ "z": "baa1e3d9.cb29d",
+ "name": "",
+ "env": [],
+ "x": 930,
+ "y": 520,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "4be09c97f86897d9",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "get nb_frame",
+ "func": "msg.payload = msg.payload.nb_frame;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 340,
+ "y": 280,
+ "wires": [
+ [
+ "51b4d0df.d70a88"
+ ]
+ ]
+ },
+ {
+ "id": "f573206abefa9518",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "get imaging_pump_volume",
+ "func": "msg.payload = msg.payload.imaging_pump_volume;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 380,
+ "y": 320,
+ "wires": [
+ [
+ "df1ea904.cd261"
+ ]
+ ]
+ },
+ {
+ "id": "f948151ab4031df4",
+ "type": "function",
+ "z": "baa1e3d9.cb29d",
+ "name": "get sleep_before",
+ "func": "msg.payload = msg.payload.sleep_before;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 350,
+ "y": 120,
+ "wires": [
+ [
+ "49ea1123.ee1768"
+ ]
+ ]
+ },
+ {
+ "id": "c515edcd8681c244",
+ "type": "link in",
+ "z": "baa1e3d9.cb29d",
+ "name": "Cam Stream",
+ "links": [
+ "49111a72f4e32740"
+ ],
+ "x": 275,
+ "y": 20,
+ "wires": [
+ [
+ "a77625dc21c8a3cc"
+ ]
+ ]
+ },
+ {
+ "id": "a77625dc21c8a3cc",
+ "type": "template",
+ "z": "baa1e3d9.cb29d",
+ "name": "Prepare stream HTML",
+ "field": "payload",
+ "fieldType": "msg",
+ "format": "handlebars",
+ "syntax": "mustache",
+ "template": "\n \n ",
+ "output": "str",
+ "x": 420,
+ "y": 20,
+ "wires": [
+ [
+ "bb2bb7ce.1d1458"
+ ]
+ ]
+ },
+ {
+ "id": "9d6abe67.6bb3d",
+ "type": "ui_button",
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "group": "64903b47.4034e4",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "passthru": false,
+ "label": "Home",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "home",
+ "payload": "{\"tab\":\"Home\"}",
+ "payloadType": "json",
+ "topic": "",
+ "x": 430,
+ "y": 600,
+ "wires": [
+ [
+ "f0fb77cf.8f1c28"
+ ]
+ ]
+ },
+ {
+ "id": "f0fb77cf.8f1c28",
"type": "ui_ui_control",
- "z": "1c24ad9c.bebec2",
- "name": "Connect Event",
- "events": "connect",
- "x": 900,
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "events": "change",
+ "x": 740,
+ "y": 600,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "8ec68b82.17e3d8",
+ "type": "ui_button",
+ "z": "cb95299c.2817c8",
+ "name": "Start segmentation",
+ "group": "abeb6dad.635a2",
+ "order": 10,
+ "width": 5,
+ "height": 1,
+ "passthru": false,
+ "label": "Start segmentation",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "",
+ "payload": "{\"action\":\"segment\"}",
+ "payloadType": "json",
+ "topic": "segmenter/segment",
+ "x": 370,
+ "y": 460,
+ "wires": [
+ [
+ "33c28dc1.238002",
+ "c72a1064.1ec388"
+ ]
+ ]
+ },
+ {
+ "id": "27be7971.b3fbce",
+ "type": "ui_button",
+ "z": "cb95299c.2817c8",
+ "d": true,
+ "name": "Stop segmentation",
+ "group": "abeb6dad.635a2",
+ "order": 12,
+ "width": 4,
+ "height": 1,
+ "passthru": true,
+ "label": "Stop segmentation",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "#AD1625",
+ "icon": "",
+ "payload": "{\"action\":\"stop\"}",
+ "payloadType": "json",
+ "topic": "segmenter/segment",
+ "x": 370,
+ "y": 520,
+ "wires": [
+ [
+ "16f3cef4.0acac9"
+ ]
+ ]
+ },
+ {
+ "id": "16f3cef4.0acac9",
+ "type": "mqtt out",
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "topic": "",
+ "qos": "",
+ "retain": "",
+ "broker": "8dc3722c.06efa8",
+ "x": 850,
+ "y": 520,
+ "wires": []
+ },
+ {
+ "id": "8f3788f6.ddcf98",
+ "type": "function",
+ "z": "cb95299c.2817c8",
+ "name": "obj_counter",
+ "func": "obj_counter = flow.get('obj_counter')\nobj_counter = obj_counter + 1\nflow.set('obj_counter', obj_counter)\nmsg.payload = obj_counter\nmsg.topic = \"object count\"\nreturn msg",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 810,
+ "y": 800,
+ "wires": [
+ [
+ "fa3b7929.ac7da8",
+ "9d53dbe2.dbffe8"
+ ]
+ ]
+ },
+ {
+ "id": "aa38dbbc.cf0a9",
+ "type": "switch",
+ "z": "cb95299c.2817c8",
+ "name": "Segmenter",
+ "property": "topic",
+ "propertyType": "msg",
+ "rules": [
+ {
+ "t": "eq",
+ "v": "status/segmenter",
+ "vt": "str"
+ },
+ {
+ "t": "eq",
+ "v": "status/segmenter/name",
+ "vt": "str"
+ },
+ {
+ "t": "eq",
+ "v": "status/segmenter/object_id",
+ "vt": "str"
+ },
+ {
+ "t": "eq",
+ "v": "status/segmenter/metric",
+ "vt": "str"
+ }
+ ],
+ "checkall": "true",
+ "repair": false,
+ "outputs": 4,
+ "x": 490,
+ "y": 740,
+ "wires": [
+ [
+ "b9a23b91.93638",
+ "6919465f.332e5"
+ ],
+ [
+ "49af3d24.1799e4"
+ ],
+ [
+ "8f3788f6.ddcf98"
+ ],
+ [
+ "50ce901f.b5034"
+ ]
+ ]
+ },
+ {
+ "id": "9d53dbe2.dbffe8",
+ "type": "ui_chart",
+ "z": "cb95299c.2817c8",
+ "name": "counter graph",
+ "group": "46be9c86.dea684",
+ "order": 7,
+ "width": 10,
+ "height": 2,
+ "label": "",
+ "chartType": "horizontalBar",
+ "legend": "false",
+ "xformat": "HH:mm:ss",
+ "interpolate": "linear",
+ "nodata": "Objects count will be shown here once the segmentation is started",
+ "dot": false,
+ "ymin": "",
+ "ymax": "",
+ "removeOlder": 1,
+ "removeOlderPoints": "",
+ "removeOlderUnit": "3600",
+ "cutout": 0,
+ "useOneColor": true,
+ "useUTC": false,
+ "colors": [
+ "#1f77b4",
+ "#aec7e8",
+ "#ff7f0e",
+ "#2ca02c",
+ "#98df8a",
+ "#d62728",
+ "#ff9896",
+ "#9467bd",
+ "#c5b0d5"
+ ],
+ "outputs": 1,
+ "x": 1340,
+ "y": 840,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "50ce901f.b5034",
+ "type": "function",
+ "z": "cb95299c.2817c8",
+ "name": "ex : area",
+ "func": "// Payload looks like this:\n// {'name': '01_13_28_232066_0',\n// 'metadata': {\n// 'label': 0, 'width': 29, 'height': 80, ....\n\nmsg.payload=msg.payload.metadata.area_exc\nmsg.topic=\"area\"\n\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 800,
+ "y": 920,
+ "wires": [
+ [
+ "458cd82e.03d258"
+ ]
+ ]
+ },
+ {
+ "id": "a4f0f0d1.3aca88",
+ "type": "ui_toast",
+ "z": "cb95299c.2817c8",
+ "position": "top right",
+ "displayTime": "5",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 0,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "",
+ "name": "",
+ "x": 1350,
+ "y": 680,
+ "wires": []
+ },
+ {
+ "id": "458cd82e.03d258",
+ "type": "ui_chart",
+ "z": "cb95299c.2817c8",
+ "name": "Area chart",
+ "group": "46be9c86.dea684",
+ "order": 9,
+ "width": 10,
+ "height": 6,
+ "label": "",
+ "chartType": "line",
+ "legend": "false",
+ "xformat": "HH:mm:ss",
+ "interpolate": "linear",
+ "nodata": "Objects area will be shown here once the segmentation is started",
+ "dot": true,
+ "ymin": "",
+ "ymax": "",
+ "removeOlder": 1,
+ "removeOlderPoints": "1000",
+ "removeOlderUnit": "3600",
+ "cutout": 0,
+ "useOneColor": false,
+ "useUTC": true,
+ "colors": [
+ "#1f77b4",
+ "#aec7e8",
+ "#ff7f0e",
+ "#2ca02c",
+ "#98df8a",
+ "#d62728",
+ "#ff9896",
+ "#9467bd",
+ "#c5b0d5"
+ ],
+ "outputs": 1,
+ "x": 1330,
+ "y": 920,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "49af3d24.1799e4",
+ "type": "debug",
+ "z": "cb95299c.2817c8",
+ "name": "segmentation name",
+ "active": true,
+ "tosidebar": true,
+ "console": false,
+ "tostatus": false,
+ "complete": "true",
+ "targetType": "full",
+ "statusVal": "",
+ "statusType": "auto",
+ "x": 840,
+ "y": 760,
+ "wires": []
+ },
+ {
+ "id": "7088a5be.0c79a4",
+ "type": "template",
+ "z": "cb95299c.2817c8",
+ "name": "Create sentence",
+ "field": "payload",
+ "fieldType": "msg",
+ "format": "handlebars",
+ "syntax": "mustache",
+ "template": "The {{topic}} is {{payload.status}}",
+ "output": "str",
+ "x": 1110,
+ "y": 680,
+ "wires": [
+ [
+ "a4f0f0d1.3aca88"
+ ]
+ ]
+ },
+ {
+ "id": "b9a23b91.93638",
+ "type": "change",
+ "z": "cb95299c.2817c8",
+ "name": "Remove high-level topic",
+ "rules": [
+ {
+ "t": "change",
+ "p": "topic",
+ "pt": "msg",
+ "from": "status/",
+ "fromt": "str",
+ "to": "",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 850,
+ "y": 680,
+ "wires": [
+ [
+ "7088a5be.0c79a4"
+ ]
+ ]
+ },
+ {
+ "id": "6919465f.332e5",
+ "type": "ui_text",
+ "z": "cb95299c.2817c8",
+ "group": "46be9c86.dea684",
+ "order": 1,
+ "width": 10,
+ "height": 1,
+ "name": "segmenter",
+ "label": "Segmenter status:",
+ "format": "{{msg.payload.status}}",
+ "layout": "row-spread",
+ "x": 810,
+ "y": 720,
+ "wires": []
+ },
+ {
+ "id": "fa3b7929.ac7da8",
+ "type": "ui_text",
+ "z": "cb95299c.2817c8",
+ "group": "46be9c86.dea684",
+ "order": 5,
+ "width": 4,
+ "height": 1,
+ "name": "counter",
+ "label": "",
+ "format": "{{msg.payload}}",
+ "layout": "col-center",
+ "x": 1320,
+ "y": 800,
+ "wires": []
+ },
+ {
+ "id": "640ece83.88cab",
+ "type": "inject",
+ "z": "cb95299c.2817c8",
+ "name": "Init graphs",
+ "props": [
+ {
+ "p": "payload"
+ },
+ {
+ "p": "topic",
+ "vt": "str"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": 0.1,
+ "topic": "object count",
+ "payload": "0",
+ "payloadType": "num",
+ "x": 810,
+ "y": 880,
+ "wires": [
+ [
+ "ac439738.28bc18",
+ "4f3f7c4a.cb21c4"
+ ]
+ ]
+ },
+ {
+ "id": "25867454.a8e334",
+ "type": "link in",
+ "z": "cb95299c.2817c8",
+ "name": "Segmenter module status",
+ "links": [
+ "dcf5bd45.16a8d"
+ ],
+ "x": 295,
+ "y": 740,
+ "wires": [
+ [
+ "aa38dbbc.cf0a9"
+ ]
+ ]
+ },
+ {
+ "id": "c8749cbb.55254",
+ "type": "function",
+ "z": "cb95299c.2817c8",
+ "name": "set global",
+ "func": "global.set(msg.topic, msg.payload);",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 960,
+ "y": 380,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "d43c3ed9.e6cb1",
+ "type": "ui_template",
+ "z": "cb95299c.2817c8",
+ "group": "46be9c86.dea684",
+ "name": "Object counts",
+ "order": 3,
+ "width": 0,
+ "height": 0,
+ "format": "
Object counts ",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": true,
+ "templateScope": "local",
+ "x": 1340,
+ "y": 760,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "857e90c1.cd25b",
+ "type": "ui_template",
+ "z": "cb95299c.2817c8",
+ "group": "46be9c86.dea684",
+ "name": "Area chart",
+ "order": 8,
+ "width": 0,
+ "height": 0,
+ "format": "
Area chart ",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": true,
+ "templateScope": "local",
+ "x": 1330,
+ "y": 880,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "33c28dc1.238002",
+ "type": "function",
+ "z": "cb95299c.2817c8",
+ "name": "prepare segmentation",
+ "func": "global.set('obj_counter', 0);\n\nvar segmentation_list = flow.get('segmentation_list')\nif (segmentation_list !== undefined && segmentation_list !== \"\") {\n msg.payload['path'] = segmentation_list\n}\n\n\nvar force = flow.get('force')\nif (force !== undefined && force !== \"\") {\n msg.payload['settings'] = {\"force\":Boolean(force)}\n}\n\n\nvar recursive = flow.get('recursive')\nif (recursive !== undefined && recursive !== \"\") {\n if (\"settings\" in msg.payload){\n msg.payload.settings[\"recursive\"] = Boolean(recursive)\n }\n else{\n msg.payload['settings'] = {\"recursive\": Boolean(recursive)}\n }\n}\n\nvar ecotaxa = flow.get('ecotaxa')\nif (ecotaxa !== undefined && ecotaxa !== \"\") {\n if (\"settings\" in msg.payload){\n msg.payload.settings[\"ecotaxa\"] = Boolean(ecotaxa)\n }\n else{\n msg.payload['settings'] = {\"ecotaxa\": Boolean(ecotaxa)}\n }\n}\n\nvar keep = flow.get('keep')\nif (keep !== undefined && keep !== \"\") {\n if (\"settings\" in msg.payload){\n msg.payload.settings[\"keep\"] = Boolean(keep)\n }\n else{\n msg.payload['settings'] = {\"keep\": Boolean(keep)}\n }\n}\n\nvar process_id = global.get('process_id')\nif (process_id !== undefined && process_id !== \"\") {\n if (\"settings\" in msg.payload){\n msg.payload.settings[\"process_id\"] = process_id\n }\n else{\n msg.payload['settings'] = {\"process_id\": process_id}\n }\n}\n\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 620,
+ "y": 460,
+ "wires": [
+ [
+ "16f3cef4.0acac9"
+ ]
+ ]
+ },
+ {
+ "id": "fa12f9f8.00cfa8",
+ "type": "subflow:1c24ad9c.bebec2",
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "env": [],
+ "x": 430,
+ "y": 380,
+ "wires": [
+ [
+ "3b72d11c.86e9e6"
+ ]
+ ]
+ },
+ {
+ "id": "3b72d11c.86e9e6",
+ "type": "function",
+ "z": "cb95299c.2817c8",
+ "name": "get process_id",
+ "func": "msg.payload = msg.payload.process_id;\nmsg.topic = \"process_id\";\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 600,
+ "y": 380,
+ "wires": [
+ [
+ "56971109c8be3b54"
+ ]
+ ]
+ },
+ {
+ "id": "3ea12061.ce62c",
+ "type": "ui_list",
+ "z": "cb95299c.2817c8",
+ "group": "abeb6dad.635a2",
+ "name": "",
+ "order": 9,
+ "width": 10,
+ "height": 11,
+ "lineType": "one",
+ "actionType": "check",
+ "allowHTML": false,
+ "outputs": 1,
+ "topic": "",
+ "x": 790,
+ "y": 140,
+ "wires": [
+ [
+ "cb3b87b5.63c4"
+ ]
+ ]
+ },
+ {
+ "id": "8bd8fb2c.53fa4",
+ "type": "dir2files",
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "dirname": "/home/pi/data/img/",
+ "pathRegex": "",
+ "isRecursive": true,
+ "findDir": true,
+ "isArray": true,
+ "x": 460,
+ "y": 140,
+ "wires": [
+ [
+ "ba2947.c854deb8"
+ ]
+ ]
+ },
+ {
+ "id": "127d4ee.f8ad1b1",
+ "type": "ui_button",
+ "z": "cb95299c.2817c8",
+ "name": "Refresh",
+ "group": "abeb6dad.635a2",
+ "order": 8,
+ "width": 0,
+ "height": 0,
+ "passthru": false,
+ "label": "Update acquisition's folder list",
+ "tooltip": "Refresh the list of previous acquisitions",
+ "color": "",
+ "bgcolor": "",
+ "icon": "mi-find_replace",
+ "payload": "",
+ "payloadType": "date",
+ "topic": "update",
+ "x": 260,
+ "y": 140,
+ "wires": [
+ [
+ "8bd8fb2c.53fa4",
+ "56f845f5.e7c054"
+ ]
+ ]
+ },
+ {
+ "id": "946ce9ee.092cf",
+ "type": "inject",
+ "z": "cb95299c.2817c8",
+ "name": "Init",
+ "props": [
+ {
+ "p": "payload"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": 0.1,
+ "topic": "",
+ "payload": "",
+ "payloadType": "date",
+ "x": 270,
+ "y": 100,
+ "wires": [
+ [
+ "8bd8fb2c.53fa4",
+ "56f845f5.e7c054"
+ ]
+ ]
+ },
+ {
+ "id": "cb3b87b5.63c4",
+ "type": "function",
+ "z": "cb95299c.2817c8",
+ "name": "update segmentation_list",
+ "func": "var segmentation_list = flow.get('segmentation_list');\n\nif (segmentation_list === undefined || segmentation_list === \"\") {\n segmentation_list = []\n console.log(\"error\")\n}\n\npath = \"/home/pi/data/img/\" + msg.payload.title\n\nif (msg.payload.isChecked){\n if (segmentation_list.includes(path) === false){\n segmentation_list.push(path)\n }\n // Element already in list, don't push it more than once\n //segmentation_list.push(msg.payload[\"title\"])\n}\nelse {\n var pos = segmentation_list.indexOf(path)\n segmentation_list.splice(pos, 1)\n}\n\nflow.set('segmentation_list', segmentation_list)",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 970,
+ "y": 140,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "56f845f5.e7c054",
+ "type": "change",
+ "z": "cb95299c.2817c8",
+ "name": "Reset segmentation_list",
+ "rules": [
+ {
+ "t": "set",
+ "p": "segmentation_list",
+ "pt": "flow",
+ "to": "[]",
+ "tot": "json"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 510,
"y": 100,
"wires": [
[]
]
},
{
- "id": "58de1340.3cc354",
- "type": "ui_text_input",
- "z": "b771c342.49603",
- "name": "sample_dilution_factor",
- "label": "Dilution Factor",
- "tooltip": "0.5 if diluted by two; 2 if concentrated by a factor 2",
- "group": "3e1ba03d.f01d8",
- "order": 13,
+ "id": "7fc72364.8f038c",
+ "type": "ui_template",
+ "z": "cb95299c.2817c8",
+ "group": "abeb6dad.635a2",
+ "name": "Update message",
+ "order": 1,
"width": 10,
- "height": 1,
- "passthru": true,
- "mode": "number",
- "delay": "0",
- "topic": "sample_dilution_factor",
- "topicType": "str",
- "x": 640,
- "y": 480,
- "wires": [
- [
- "9f501f49.45645"
- ]
- ]
- },
- {
- "id": "4f6afc5a.81e454",
- "type": "ui_text_input",
- "z": "b771c342.49603",
- "name": "sample_total_volume",
- "label": "Filtered volume (in L)",
- "tooltip": "Calculated or hand filled",
- "group": "3e1ba03d.f01d8",
- "order": 11,
- "width": 0,
- "height": 0,
- "passthru": true,
- "mode": "text",
- "delay": "500",
- "topic": "sample_total_volume",
- "topicType": "str",
- "x": 1220,
- "y": 760,
- "wires": [
- [
- "e1f2f6eb.fe1dd"
- ]
- ]
- },
- {
- "id": "e1f2f6eb.fe1dd",
- "type": "function",
- "z": "b771c342.49603",
- "name": "set global",
- "func": "global.set(msg.topic,msg.payload);",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "x": 1420,
- "y": 760,
+ "height": 3,
+ "format": "You can choose here in which folder(s) you want the segmentation script to run. A few details though:\n The segmentation is run recursively in all folders. So if you select a top level folder, the segmentation will be run in all subfolders.\n Also, you will be able to chose wether for force the segmentation for folders in which it has run already.
",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": true,
+ "templateScope": "local",
+ "x": 270,
+ "y": 40,
"wires": [
[]
]
},
{
- "id": "e9bc112c.eb75f8",
+ "id": "ba2947.c854deb8",
"type": "function",
- "z": "b771c342.49603",
- "name": "Calculate volume",
- "func": "if (msg.topic == \"sample_total_flowmeter_start\"){\n context.set(\"sample_total_flowmeter_start\", msg.payload);\n}\nif (msg.topic == \"sample_total_flowmeter_end\"){\n context.set(\"sample_total_flowmeter_end\", msg.payload);\n}\n\nif (context.keys().length == 2){\n sample_total_volume = context.get(\"sample_total_flowmeter_end\") - context.get(\"sample_total_flowmeter_start\");\n msg.topic=\"sample_total_volume\"\n msg.payload=sample_total_volume\n return msg\n}\n",
+ "z": "cb95299c.2817c8",
+ "name": "remove common",
+ "func": "function remove_path(item, index, array) {\n array[index] = item.replace(\"/home/pi/data/img/\", \"\")\n} \n\nmsg.payload.forEach(remove_path)\n\nreturn msg",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
- "x": 1610,
+ "x": 630,
+ "y": 140,
+ "wires": [
+ [
+ "3ea12061.ce62c"
+ ]
+ ]
+ },
+ {
+ "id": "21af0db1.c2c182",
+ "type": "ui_multistate_switch",
+ "z": "cb95299c.2817c8",
+ "name": "recursive toggle",
+ "group": "abeb6dad.635a2",
+ "order": 4,
+ "width": 5,
+ "height": 1,
+ "label": "Recursive folder",
+ "stateField": "payload",
+ "enableField": "enable",
+ "rounded": true,
+ "useThemeColors": true,
+ "hideSelectedLabel": false,
+ "options": [
+ {
+ "label": "No",
+ "value": "0",
+ "valueType": "num",
+ "color": "#009933"
+ },
+ {
+ "label": "Yes",
+ "value": "1",
+ "valueType": "num",
+ "color": "#999999"
+ }
+ ],
+ "x": 480,
+ "y": 220,
+ "wires": [
+ [
+ "880b192a.88e2d"
+ ]
+ ]
+ },
+ {
+ "id": "dffb9881.feef8",
+ "type": "ui_multistate_switch",
+ "z": "cb95299c.2817c8",
+ "name": "force toggle",
+ "group": "abeb6dad.635a2",
+ "order": 3,
+ "width": 5,
+ "height": 1,
+ "label": "Force rework",
+ "stateField": "payload",
+ "enableField": "enable",
+ "rounded": true,
+ "useThemeColors": true,
+ "hideSelectedLabel": false,
+ "options": [
+ {
+ "label": "No",
+ "value": "0",
+ "valueType": "num",
+ "color": "#009933"
+ },
+ {
+ "label": "Yes",
+ "value": "1",
+ "valueType": "num",
+ "color": "#999999"
+ }
+ ],
+ "x": 470,
+ "y": 300,
+ "wires": [
+ [
+ "a4f68fa6.5d77f8"
+ ]
+ ]
+ },
+ {
+ "id": "880b192a.88e2d",
+ "type": "change",
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "recursive",
+ "pt": "flow",
+ "to": "payload",
+ "tot": "msg"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 690,
+ "y": 240,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "a4f68fa6.5d77f8",
+ "type": "change",
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "force",
+ "pt": "flow",
+ "to": "payload",
+ "tot": "msg"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 670,
+ "y": 280,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "1ef1b43b.b0f064",
+ "type": "inject",
+ "z": "cb95299c.2817c8",
+ "name": "0",
+ "props": [
+ {
+ "p": "payload"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": 0.1,
+ "topic": "",
+ "payload": "0",
+ "payloadType": "num",
+ "x": 270,
+ "y": 280,
+ "wires": [
+ [
+ "dffb9881.feef8",
+ "a4f68fa6.5d77f8"
+ ]
+ ]
+ },
+ {
+ "id": "f078c068.eacf58",
+ "type": "ui_template",
+ "z": "cb95299c.2817c8",
+ "group": "46be9c86.dea684",
+ "name": "Stream Segmented object",
+ "order": 2,
+ "width": 10,
+ "height": 8,
+ "format": " ",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": false,
+ "templateScope": "local",
+ "x": 1380,
+ "y": 600,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "43f97b93.b76294",
+ "type": "inject",
+ "z": "cb95299c.2817c8",
+ "name": "1",
+ "props": [
+ {
+ "p": "payload"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": 0.1,
+ "topic": "",
+ "payload": "1",
+ "payloadType": "num",
+ "x": 270,
"y": 240,
"wires": [
[
- "4f6afc5a.81e454"
+ "21af0db1.c2c182",
+ "880b192a.88e2d"
]
]
},
+ {
+ "id": "ac439738.28bc18",
+ "type": "function",
+ "z": "cb95299c.2817c8",
+ "name": "chart init",
+ "func": "obj=[{\"series\": [],\"data\": [],\"labels\": []}]\nmsg.payload = obj\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 980,
+ "y": 880,
+ "wires": [
+ [
+ "458cd82e.03d258"
+ ]
+ ]
+ },
+ {
+ "id": "4f3f7c4a.cb21c4",
+ "type": "change",
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "obj_counter",
+ "pt": "flow",
+ "to": "0",
+ "tot": "num"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 1020,
+ "y": 840,
+ "wires": [
+ [
+ "fa3b7929.ac7da8",
+ "9d53dbe2.dbffe8"
+ ]
+ ]
+ },
+ {
+ "id": "6bce0f60.f48998",
+ "type": "link in",
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "links": [
+ "596fc9d4.46c75"
+ ],
+ "x": 855,
+ "y": 840,
+ "wires": [
+ [
+ "4f3f7c4a.cb21c4",
+ "ac439738.28bc18"
+ ]
+ ]
+ },
+ {
+ "id": "596fc9d4.46c75",
+ "type": "link out",
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "links": [
+ "6bce0f60.f48998"
+ ],
+ "x": 715,
+ "y": 500,
+ "wires": []
+ },
+ {
+ "id": "c72a1064.1ec388",
+ "type": "change",
+ "z": "cb95299c.2817c8",
+ "name": "Reset counters",
+ "rules": [
+ {
+ "t": "set",
+ "p": "topic",
+ "pt": "msg",
+ "to": "object count",
+ "tot": "str"
+ },
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "0",
+ "tot": "num"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 600,
+ "y": 500,
+ "wires": [
+ [
+ "596fc9d4.46c75"
+ ]
+ ]
+ },
+ {
+ "id": "9367534a.fb8568",
+ "type": "ui_multistate_switch",
+ "z": "cb95299c.2817c8",
+ "name": "Ecotaxa archive",
+ "group": "abeb6dad.635a2",
+ "order": 6,
+ "width": 5,
+ "height": 1,
+ "label": "Ecotaxa archive",
+ "stateField": "payload",
+ "enableField": "enable",
+ "rounded": true,
+ "useThemeColors": true,
+ "hideSelectedLabel": false,
+ "options": [
+ {
+ "label": "No",
+ "value": "0",
+ "valueType": "num",
+ "color": "#009933"
+ },
+ {
+ "label": "Yes",
+ "value": "1",
+ "valueType": "num",
+ "color": "#999999"
+ }
+ ],
+ "x": 1080,
+ "y": 220,
+ "wires": [
+ [
+ "25ac4f9a.5b05c8"
+ ]
+ ]
+ },
+ {
+ "id": "25ac4f9a.5b05c8",
+ "type": "change",
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "ecotaxa",
+ "pt": "flow",
+ "to": "payload",
+ "tot": "msg"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 1280,
+ "y": 240,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "bef78886.8f0b98",
+ "type": "inject",
+ "z": "cb95299c.2817c8",
+ "name": "1",
+ "props": [
+ {
+ "p": "payload"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": 0.1,
+ "topic": "",
+ "payload": "1",
+ "payloadType": "num",
+ "x": 910,
+ "y": 240,
+ "wires": [
+ [
+ "9367534a.fb8568",
+ "25ac4f9a.5b05c8"
+ ]
+ ]
+ },
+ {
+ "id": "32465a4e.8fcac6",
+ "type": "ui_multistate_switch",
+ "z": "cb95299c.2817c8",
+ "name": "Keep objects",
+ "group": "abeb6dad.635a2",
+ "order": 5,
+ "width": 5,
+ "height": 1,
+ "label": "Keep objects",
+ "stateField": "payload",
+ "enableField": "enable",
+ "rounded": true,
+ "useThemeColors": true,
+ "hideSelectedLabel": false,
+ "options": [
+ {
+ "label": "No",
+ "value": "0",
+ "valueType": "num",
+ "color": "#009933"
+ },
+ {
+ "label": "Yes",
+ "value": "1",
+ "valueType": "num",
+ "color": "#999999"
+ }
+ ],
+ "x": 1070,
+ "y": 300,
+ "wires": [
+ [
+ "8dd6f57f.b77f98"
+ ]
+ ]
+ },
+ {
+ "id": "8dd6f57f.b77f98",
+ "type": "change",
+ "z": "cb95299c.2817c8",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "keep",
+ "pt": "flow",
+ "to": "payload",
+ "tot": "msg"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 1270,
+ "y": 280,
+ "wires": [
+ []
+ ]
+ },
{
"id": "8090df89.c029e",
"type": "inject",
@@ -10195,6 +6947,3694 @@
]
]
},
+ {
+ "id": "56971109c8be3b54",
+ "type": "ui_text_input",
+ "z": "cb95299c.2817c8",
+ "name": "process_id",
+ "label": "Process unique ID*",
+ "tooltip": "",
+ "group": "abeb6dad.635a2",
+ "order": 2,
+ "width": 10,
+ "height": 1,
+ "passthru": true,
+ "mode": "text",
+ "delay": 300,
+ "topic": "process_id",
+ "topicType": "str",
+ "x": 790,
+ "y": 380,
+ "wires": [
+ [
+ "c8749cbb.55254"
+ ]
+ ]
+ },
+ {
+ "id": "604659d148759b84",
+ "type": "link in",
+ "z": "cb95299c.2817c8",
+ "name": "Cam Stream",
+ "links": [
+ "49111a72f4e32740"
+ ],
+ "x": 975,
+ "y": 600,
+ "wires": [
+ [
+ "e077b83ad375cb95"
+ ]
+ ]
+ },
+ {
+ "id": "e077b83ad375cb95",
+ "type": "template",
+ "z": "cb95299c.2817c8",
+ "name": "Prepare stream HTML",
+ "field": "payload",
+ "fieldType": "msg",
+ "format": "handlebars",
+ "syntax": "mustache",
+ "template": "\n Latest object segmented: \n \n ",
+ "output": "str",
+ "x": 1120,
+ "y": 600,
+ "wires": [
+ [
+ "f078c068.eacf58"
+ ]
+ ]
+ },
+ {
+ "id": "2911fbc6.d28c24",
+ "type": "ui_template",
+ "z": "c1660bc.e7ff7f8",
+ "group": "c0ebfc57.42527",
+ "name": "Image browser",
+ "order": 1,
+ "width": 24,
+ "height": 24,
+ "format": "\n\n \n ",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": false,
+ "templateScope": "local",
+ "x": 400,
+ "y": 100,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "3bb4970164f5e7b2",
+ "type": "link in",
+ "z": "c1660bc.e7ff7f8",
+ "name": "Cam Stream",
+ "links": [
+ "49111a72f4e32740"
+ ],
+ "x": 255,
+ "y": 100,
+ "wires": [
+ [
+ "2911fbc6.d28c24"
+ ]
+ ]
+ },
+ {
+ "id": "4f02c726.de69b8",
+ "type": "ui_button",
+ "z": "9daf9e2b.019fc",
+ "name": "",
+ "group": "1be83144.4fe4bf",
+ "order": 10,
+ "width": 2,
+ "height": 1,
+ "passthru": false,
+ "label": "Reboot",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "#AD1625",
+ "icon": "fa-repeat fa-2x",
+ "payload": "reboot",
+ "payloadType": "str",
+ "topic": "reboot",
+ "x": 420,
+ "y": 680,
+ "wires": [
+ [
+ "4af9112d.87767"
+ ]
+ ]
+ },
+ {
+ "id": "611a8b1c.a829b4",
+ "type": "exec",
+ "z": "9daf9e2b.019fc",
+ "command": "sudo",
+ "addpay": "payload",
+ "append": "now",
+ "useSpawn": "false",
+ "timer": "2",
+ "oldrc": false,
+ "name": "sudo cmd now",
+ "x": 740,
+ "y": 720,
+ "wires": [
+ [],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "bc76c4d6.a7ad28",
+ "type": "ui_button",
+ "z": "9daf9e2b.019fc",
+ "name": "",
+ "group": "1be83144.4fe4bf",
+ "order": 12,
+ "width": 2,
+ "height": 1,
+ "passthru": false,
+ "label": "Shutdown",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "#AD1625",
+ "icon": "fa-power-off fa-2x",
+ "payload": "shutdown",
+ "payloadType": "str",
+ "topic": "shutdown",
+ "x": 420,
+ "y": 760,
+ "wires": [
+ [
+ "4af9112d.87767"
+ ]
+ ]
+ },
+ {
+ "id": "4af9112d.87767",
+ "type": "python3-function",
+ "z": "9daf9e2b.019fc",
+ "name": "action",
+ "func": "#!/usr/bin/python3\nimport smbus2 as smbus\n\nbus = smbus.SMBus(1)\n#turn off LED\nbus.write_byte_data(0x0d, 0x07, 0x00)\n#turn off Fan\nbus.write_byte_data(0x0d, 0x08, 0x00)\n\n#msg[\"payload\"] = str(msg[\"topic\"])+' now'\nreturn msg",
+ "outputs": 1,
+ "x": 590,
+ "y": 720,
+ "wires": [
+ [
+ "611a8b1c.a829b4"
+ ]
+ ]
+ },
+ {
+ "id": "fa914867.0a0658",
+ "type": "exec",
+ "z": "9daf9e2b.019fc",
+ "command": "python3 -u /home/pi/PlanktoScope/scripts/main.py",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "true",
+ "timer": "",
+ "oldrc": false,
+ "name": "",
+ "x": 1090,
+ "y": 600,
+ "wires": [
+ [],
+ [
+ "8b511c2b.9c24c8"
+ ],
+ []
+ ]
+ },
+ {
+ "id": "1575db82.742854",
+ "type": "delay",
+ "z": "9daf9e2b.019fc",
+ "name": "",
+ "pauseType": "delay",
+ "timeout": "3",
+ "timeoutUnits": "seconds",
+ "rate": "1",
+ "nbRateUnits": "1",
+ "rateUnits": "second",
+ "randomFirst": "1",
+ "randomLast": "5",
+ "randomUnits": "seconds",
+ "drop": false,
+ "outputs": 1,
+ "x": 720,
+ "y": 600,
+ "wires": [
+ [
+ "fa914867.0a0658"
+ ]
+ ]
+ },
+ {
+ "id": "466eb611.4da048",
+ "type": "ui_button",
+ "z": "9daf9e2b.019fc",
+ "name": "Restart Python",
+ "group": "1be83144.4fe4bf",
+ "order": 8,
+ "width": 4,
+ "height": 1,
+ "passthru": true,
+ "label": "Restart Python",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "#AD1625",
+ "icon": "fa-refresh fa-2x",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "",
+ "x": 400,
+ "y": 600,
+ "wires": [
+ [
+ "1575db82.742854",
+ "bd5cceef.b17ad",
+ "ed7503f3.d95a48"
+ ]
+ ]
+ },
+ {
+ "id": "ed7503f3.d95a48",
+ "type": "exec",
+ "z": "9daf9e2b.019fc",
+ "command": "sudo killall -15 python3",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "",
+ "oldrc": false,
+ "name": "Python soft kill",
+ "x": 740,
+ "y": 660,
+ "wires": [
+ [],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "bd5cceef.b17ad",
+ "type": "exec",
+ "z": "9daf9e2b.019fc",
+ "command": "sudo killall -15 raspimjpeg",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "",
+ "oldrc": false,
+ "name": "Raspimjpeg soft kill",
+ "x": 750,
+ "y": 540,
+ "wires": [
+ [],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "d12008a0.47be4",
+ "type": "ui_template",
+ "z": "9daf9e2b.019fc",
+ "group": "a7d64879.38298",
+ "name": "Log table",
+ "order": 1,
+ "width": 12,
+ "height": 10,
+ "format": "\n\n\n Copy Log\n \n\n\n\n",
+ "storeOutMessages": false,
+ "fwdInMessages": false,
+ "resendOnRefresh": false,
+ "templateScope": "local",
+ "x": 1580,
+ "y": 640,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "8b511c2b.9c24c8",
+ "type": "function",
+ "z": "9daf9e2b.019fc",
+ "name": "Log array",
+ "func": "var log = flow.get(\"python_log\")||[];\n\nlog = log.concat(msg.payload.trim().split('\\n'));\n\nwhile (log.length > 500){\n log.shift();\n}\n\nflow.set(\"python_log\", log);\n\nmsg.payload = log;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 1400,
+ "y": 560,
+ "wires": [
+ [
+ "d12008a0.47be4"
+ ]
+ ]
+ },
+ {
+ "id": "7a1dedf.1c63094",
+ "type": "ui_button",
+ "z": "9daf9e2b.019fc",
+ "name": "",
+ "group": "a7d64879.38298",
+ "order": 2,
+ "width": 0,
+ "height": 0,
+ "passthru": true,
+ "label": "Clear Log",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "fa-eraser",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "",
+ "topicType": "str",
+ "x": 1220,
+ "y": 720,
+ "wires": [
+ [
+ "73500be7.9ab7c4"
+ ]
+ ]
+ },
+ {
+ "id": "9187bf97.9922b8",
+ "type": "catch",
+ "z": "9daf9e2b.019fc",
+ "name": "Catch Errors",
+ "scope": null,
+ "uncaught": false,
+ "x": 1050,
+ "y": 660,
+ "wires": [
+ [
+ "f9a871d5.a73828"
+ ]
+ ]
+ },
+ {
+ "id": "f9a871d5.a73828",
+ "type": "function",
+ "z": "9daf9e2b.019fc",
+ "name": "Get error",
+ "func": "msg.payload = \"Node Red Error: \" + msg.error + \" created by the message \" + msg.payload;\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 1220,
+ "y": 660,
+ "wires": [
+ [
+ "8b511c2b.9c24c8"
+ ]
+ ]
+ },
+ {
+ "id": "73500be7.9ab7c4",
+ "type": "function",
+ "z": "9daf9e2b.019fc",
+ "name": "Clear log",
+ "func": "flow.set(\"python_log\", [\"Log cleared!\"]);\n\nmsg.payload = [\"Log cleared!\"];\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 1400,
+ "y": 720,
+ "wires": [
+ [
+ "d12008a0.47be4"
+ ]
+ ]
+ },
+ {
+ "id": "7372e83e.5fc0e8",
+ "type": "inject",
+ "z": "9daf9e2b.019fc",
+ "name": "once",
+ "props": [
+ {
+ "p": "payload"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": "2",
+ "topic": "",
+ "payload": "start",
+ "payloadType": "str",
+ "x": 150,
+ "y": 600,
+ "wires": [
+ [
+ "466eb611.4da048"
+ ]
+ ]
+ },
+ {
+ "id": "43cf8ff7.75231",
+ "type": "rpi-gpio out",
+ "z": "9daf9e2b.019fc",
+ "name": "Pump Enable",
+ "pin": "4",
+ "set": true,
+ "level": "1",
+ "freq": "",
+ "out": "out",
+ "bcm": true,
+ "x": 420,
+ "y": 80,
+ "wires": []
+ },
+ {
+ "id": "4bca8a25.15be3c",
+ "type": "rpi-gpio out",
+ "z": "9daf9e2b.019fc",
+ "name": "Focus Enable",
+ "pin": "12",
+ "set": true,
+ "level": "1",
+ "freq": "",
+ "out": "out",
+ "bcm": true,
+ "x": 420,
+ "y": 120,
+ "wires": []
+ },
+ {
+ "id": "50f9b5b.a84bccc",
+ "type": "inject",
+ "z": "9daf9e2b.019fc",
+ "name": "Default: ON",
+ "props": [
+ {
+ "p": "payload"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": "0.01",
+ "topic": "",
+ "payload": "true",
+ "payloadType": "bool",
+ "x": 150,
+ "y": 100,
+ "wires": [
+ [
+ "43cf8ff7.75231",
+ "4bca8a25.15be3c",
+ "6db0fcf5.f0effc",
+ "5fc4ede4.72516c"
+ ]
+ ]
+ },
+ {
+ "id": "8bd1f3dc.9affe8",
+ "type": "exec",
+ "z": "9daf9e2b.019fc",
+ "command": "",
+ "addpay": true,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "1",
+ "oldrc": false,
+ "name": "git user.name",
+ "x": 1160,
+ "y": 60,
+ "wires": [
+ [],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "b40d1f65.39e14",
+ "type": "template",
+ "z": "9daf9e2b.019fc",
+ "name": "git config",
+ "field": "payload",
+ "fieldType": "msg",
+ "format": "handlebars",
+ "syntax": "mustache",
+ "template": "git config --global --replace-all user.name \"{{payload}}\"",
+ "output": "str",
+ "x": 960,
+ "y": 60,
+ "wires": [
+ [
+ "8bd1f3dc.9affe8"
+ ]
+ ]
+ },
+ {
+ "id": "35eb925e.5f8016",
+ "type": "link in",
+ "z": "9daf9e2b.019fc",
+ "name": "Git config",
+ "links": [
+ "52af9ac0.60eb24"
+ ],
+ "x": 795,
+ "y": 100,
+ "wires": [
+ [
+ "b40d1f65.39e14",
+ "6d7dd372.3b7814"
+ ]
+ ]
+ },
+ {
+ "id": "4e5183bd.e77bac",
+ "type": "exec",
+ "z": "9daf9e2b.019fc",
+ "command": "",
+ "addpay": true,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "1",
+ "oldrc": false,
+ "name": "git user.email",
+ "x": 1150,
+ "y": 140,
+ "wires": [
+ [],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "6d7dd372.3b7814",
+ "type": "template",
+ "z": "9daf9e2b.019fc",
+ "name": "git config",
+ "field": "payload",
+ "fieldType": "msg",
+ "format": "handlebars",
+ "syntax": "mustache",
+ "template": "git config --global --replace-all user.email \"{{payload}}\"",
+ "output": "str",
+ "x": 960,
+ "y": 140,
+ "wires": [
+ [
+ "4e5183bd.e77bac"
+ ]
+ ]
+ },
+ {
+ "id": "e564e9ad.7c312",
+ "type": "ui_button",
+ "z": "9daf9e2b.019fc",
+ "d": true,
+ "name": "Update",
+ "group": "1be83144.4fe4bf",
+ "order": 13,
+ "width": 4,
+ "height": 1,
+ "passthru": false,
+ "label": "System Update",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "mi-system_update",
+ "payload": " ",
+ "payloadType": "str",
+ "topic": "update",
+ "topicType": "str",
+ "x": 260,
+ "y": 460,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "2d2ef1fd.40e6e6",
+ "type": "exec",
+ "z": "9daf9e2b.019fc",
+ "command": "bash /home/pi/PlanktoScope/scripts/bash/start_update.sh",
+ "addpay": true,
+ "append": "",
+ "useSpawn": "true",
+ "timer": "",
+ "oldrc": false,
+ "name": "Update",
+ "x": 420,
+ "y": 460,
+ "wires": [
+ [
+ "64f61762.68c788",
+ "8b511c2b.9c24c8",
+ "83c5a708.a5715",
+ "d334d264.8a7728"
+ ],
+ [
+ "8b511c2b.9c24c8"
+ ],
+ []
+ ]
+ },
+ {
+ "id": "8f08c4eb.db74b8",
+ "type": "ui_template",
+ "z": "9daf9e2b.019fc",
+ "group": "1be83144.4fe4bf",
+ "name": "Update message",
+ "order": 1,
+ "width": 12,
+ "height": 3,
+ "format": "
If you want to update to the latest code version of Node-Red and Python, please click here.\nWe are trying to save your configuration changes with git stash and restore them afterwards, but clearly, things may break!\nAlso, you can choose the branch you want to update to. BE CAREFUL, selecting a branch WILL update the code immediately.\nIf you have made changes to the flow, you will lose them. Please commit those changes from Node-Red interface, from the Project History tab. ",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": true,
+ "templateScope": "local",
+ "x": 150,
+ "y": 260,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "64f61762.68c788",
+ "type": "ui_toast",
+ "z": "9daf9e2b.019fc",
+ "position": "dialog",
+ "displayTime": "10",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 1,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "",
+ "name": "Update notif",
+ "x": 730,
+ "y": 440,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "45a7b5aa.2ed20c",
+ "type": "link in",
+ "z": "9daf9e2b.019fc",
+ "name": "Python restart",
+ "links": [
+ "e41870d7.300eb8"
+ ],
+ "x": 175,
+ "y": 560,
+ "wires": [
+ [
+ "466eb611.4da048"
+ ]
+ ]
+ },
+ {
+ "id": "f4f6e3fa.0234f",
+ "type": "inject",
+ "z": "9daf9e2b.019fc",
+ "name": "once",
+ "props": [
+ {
+ "p": "payload"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": "",
+ "topic": "",
+ "payload": "start",
+ "payloadType": "str",
+ "x": 1070,
+ "y": 720,
+ "wires": [
+ [
+ "7a1dedf.1c63094"
+ ]
+ ]
+ },
+ {
+ "id": "b81b990a.d4dca",
+ "type": "link in",
+ "z": "9daf9e2b.019fc",
+ "name": "Shutdown",
+ "links": [
+ "e08cfcb8.2a67e8"
+ ],
+ "x": 455,
+ "y": 720,
+ "wires": [
+ [
+ "4af9112d.87767"
+ ]
+ ]
+ },
+ {
+ "id": "83c5a708.a5715",
+ "type": "exec",
+ "z": "9daf9e2b.019fc",
+ "command": "git --git-dir=/home/pi/PlanktoScope/.git describe --long --tags",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "true",
+ "timer": "",
+ "oldrc": false,
+ "name": "Get git revision",
+ "x": 660,
+ "y": 340,
+ "wires": [
+ [
+ "af2b8d95.195bb8",
+ "b6bc9b81.ff942"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "d334d264.8a7728",
+ "type": "exec",
+ "z": "9daf9e2b.019fc",
+ "command": "git --git-dir=/home/pi/PlanktoScope/.git branch --remotes --list | awk '/HEAD/{next;} split($1, a, \"/\") {print a[2]}'",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "",
+ "oldrc": false,
+ "name": "Get git branch",
+ "x": 660,
+ "y": 260,
+ "wires": [
+ [
+ "e5e8e66c.899588"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "e4342b66.72972",
+ "type": "ui_button",
+ "z": "9daf9e2b.019fc",
+ "name": "get git branch",
+ "group": "1be83144.4fe4bf",
+ "order": 3,
+ "width": 5,
+ "height": 1,
+ "passthru": false,
+ "label": "Update branch list",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "mi-compare_arrows",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "",
+ "x": 420,
+ "y": 260,
+ "wires": [
+ [
+ "d334d264.8a7728"
+ ]
+ ]
+ },
+ {
+ "id": "3f13b9f8.bac94e",
+ "type": "ui_dropdown",
+ "z": "9daf9e2b.019fc",
+ "name": "Git branch list",
+ "label": "Switch branch to",
+ "tooltip": "If you choose something, the code WILL be updated to that branch, don't touch if you don't know what you are doing!",
+ "place": "branch",
+ "group": "1be83144.4fe4bf",
+ "order": 4,
+ "width": 7,
+ "height": 1,
+ "passthru": false,
+ "multiple": false,
+ "options": [],
+ "payload": "",
+ "topic": "branch",
+ "x": 1160,
+ "y": 320,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "e5e8e66c.899588",
+ "type": "function",
+ "z": "9daf9e2b.019fc",
+ "name": "filter branch",
+ "func": "msg.options = msg.payload.trimEnd().split('\\n')\nmsg.payload = msg.options.find((str) => str.startsWith('*'));\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 870,
+ "y": 260,
+ "wires": [
+ [
+ "3f13b9f8.bac94e",
+ "ccc7d79b.a419f"
+ ]
+ ]
+ },
+ {
+ "id": "c1fb03f7.e675f8",
+ "type": "inject",
+ "z": "9daf9e2b.019fc",
+ "name": "once",
+ "props": [
+ {
+ "p": "payload"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": "",
+ "topic": "",
+ "payload": "start",
+ "payloadType": "str",
+ "x": 430,
+ "y": 300,
+ "wires": [
+ [
+ "d334d264.8a7728",
+ "83c5a708.a5715"
+ ]
+ ]
+ },
+ {
+ "id": "af2b8d95.195bb8",
+ "type": "ui_text",
+ "z": "9daf9e2b.019fc",
+ "group": "1be83144.4fe4bf",
+ "order": 2,
+ "width": 12,
+ "height": 1,
+ "name": "",
+ "label": "Current code version",
+ "format": "{{msg.payload}}",
+ "layout": "row-center",
+ "x": 900,
+ "y": 320,
+ "wires": []
+ },
+ {
+ "id": "b6bc9b81.ff942",
+ "type": "function",
+ "z": "9daf9e2b.019fc",
+ "name": "save process_commit",
+ "func": "global.set(\"process_commit\", msg.payload);\n",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 900,
+ "y": 360,
+ "wires": [
+ [
+ "6c20d6a7.869b6"
+ ]
+ ]
+ },
+ {
+ "id": "6c20d6a7.869b6",
+ "type": "link out",
+ "z": "9daf9e2b.019fc",
+ "name": "Git revision",
+ "links": [
+ "9373b3f6.33a2b"
+ ],
+ "x": 1035,
+ "y": 360,
+ "wires": []
+ },
+ {
+ "id": "7de3a9b4.0ab108",
+ "type": "ui_toast",
+ "z": "9daf9e2b.019fc",
+ "position": "top right",
+ "displayTime": "10",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 0,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "",
+ "name": "Git branch update",
+ "x": 1290,
+ "y": 260,
+ "wires": []
+ },
+ {
+ "id": "ccc7d79b.a419f",
+ "type": "change",
+ "z": "9daf9e2b.019fc",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "List update successfull",
+ "tot": "str"
+ },
+ {
+ "t": "set",
+ "p": "topic",
+ "pt": "msg",
+ "to": "Branch list update",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 1080,
+ "y": 260,
+ "wires": [
+ [
+ "7de3a9b4.0ab108"
+ ]
+ ]
+ },
+ {
+ "id": "5fc4ede4.72516c",
+ "type": "rpi-gpio out",
+ "z": "9daf9e2b.019fc",
+ "name": "HAT Pump Enable",
+ "pin": "23",
+ "set": true,
+ "level": "1",
+ "freq": "",
+ "out": "out",
+ "bcm": true,
+ "x": 430,
+ "y": 40,
+ "wires": []
+ },
+ {
+ "id": "6db0fcf5.f0effc",
+ "type": "rpi-gpio out",
+ "z": "9daf9e2b.019fc",
+ "name": "HAT Focus Enable",
+ "pin": "5",
+ "set": true,
+ "level": "1",
+ "freq": "",
+ "out": "out",
+ "bcm": true,
+ "x": 430,
+ "y": 160,
+ "wires": []
+ },
+ {
+ "id": "2c8c45ab.610c0a",
+ "type": "ui_gauge",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "group": "b5ba3f26.2e722",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "gtype": "gage",
+ "title": "CPU Temperature",
+ "label": "°C",
+ "format": "{{value}}",
+ "min": "30",
+ "max": "55",
+ "colors": [
+ "#00b500",
+ "#e6e600",
+ "#ca3838"
+ ],
+ "seg1": "",
+ "seg2": "",
+ "x": 610,
+ "y": 100,
+ "wires": []
+ },
+ {
+ "id": "ddcbbfa5.cd158",
+ "type": "exec",
+ "z": "1371dec5.76e671",
+ "command": "vcgencmd measure_temp | tr -d \"temp=\" | tr -d \"'C\" | tr -d \"\\n\"",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "",
+ "timer": "",
+ "name": "RPi Temp.",
+ "x": 330,
+ "y": 120,
+ "wires": [
+ [
+ "bc503fa5.f46dd",
+ "2c8c45ab.610c0a",
+ "cef370c7.1f7a"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "cef370c7.1f7a",
+ "type": "ui_chart",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "group": "b5ba3f26.2e722",
+ "order": 2,
+ "width": 0,
+ "height": 0,
+ "label": "",
+ "chartType": "line",
+ "legend": "false",
+ "xformat": "HH:mm:ss",
+ "interpolate": "linear",
+ "nodata": "",
+ "dot": false,
+ "ymin": "30",
+ "ymax": "70",
+ "removeOlder": "20",
+ "removeOlderPoints": "200",
+ "removeOlderUnit": "60",
+ "cutout": 0,
+ "useOneColor": false,
+ "useUTC": false,
+ "colors": [
+ "#1f77b4",
+ "#aec7e8",
+ "#ff7f0e",
+ "#2ca02c",
+ "#98df8a",
+ "#d62728",
+ "#ff9896",
+ "#9467bd",
+ "#c5b0d5"
+ ],
+ "outputs": 1,
+ "useDifferentColor": false,
+ "x": 570,
+ "y": 140,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "55749fd8.3aca5",
+ "type": "exec",
+ "z": "1371dec5.76e671",
+ "command": "top -d 0.5 -b -n2 | grep \"Cpu(s)\"|tail -n 1 | awk '{print $2 + $4}' | tr -d \"\\n\"",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "",
+ "timer": "",
+ "name": "CPU Load",
+ "x": 330,
+ "y": 200,
+ "wires": [
+ [
+ "e046247c.c466e8",
+ "4b2b9a70.6a9af4"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "c2b8d8b.0d90328",
+ "type": "exec",
+ "z": "1371dec5.76e671",
+ "command": "free | grep Mem | awk '{print 100*($2-$7)/$2}' | awk '{print int($1+0.5)}' | tr -d \"\\n\"",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "",
+ "timer": "",
+ "name": "Free Memory",
+ "x": 330,
+ "y": 280,
+ "wires": [
+ [
+ "e84f6e08.5d147",
+ "c7c8d192.3df27"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "e046247c.c466e8",
+ "type": "ui_gauge",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "group": "3da7da8f.179606",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "gtype": "gage",
+ "title": "Processor",
+ "label": "%",
+ "format": "{{value}}",
+ "min": 0,
+ "max": "100",
+ "colors": [
+ "#00b500",
+ "#e6e600",
+ "#ca3838"
+ ],
+ "seg1": "",
+ "seg2": "",
+ "x": 590,
+ "y": 180,
+ "wires": []
+ },
+ {
+ "id": "e84f6e08.5d147",
+ "type": "ui_gauge",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "group": "806d69c8.67fc58",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "gtype": "gage",
+ "title": "Memory",
+ "label": "%",
+ "format": "{{value}}",
+ "min": 0,
+ "max": "100",
+ "colors": [
+ "#00b500",
+ "#e6e600",
+ "#ca3838"
+ ],
+ "seg1": "",
+ "seg2": "",
+ "x": 580,
+ "y": 260,
+ "wires": []
+ },
+ {
+ "id": "3910d662.fa1f7a",
+ "type": "exec",
+ "z": "1371dec5.76e671",
+ "command": "df -h | grep /dev/root | awk -F ' ' '{print $5}' | tr -d % | tr \"\\n$\" \"\\ \" | sed 's/,/./' | tr -d \" \"",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "",
+ "timer": "",
+ "name": "Disk Usage",
+ "x": 330,
+ "y": 360,
+ "wires": [
+ [
+ "45e1912a.36a23",
+ "84ac8611.1a6ac8",
+ "eaf74a43.fa27d"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "45e1912a.36a23",
+ "type": "ui_gauge",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "group": "405183bc.d8991c",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "gtype": "gage",
+ "title": "Disk",
+ "label": "%",
+ "format": "{{value}}",
+ "min": 0,
+ "max": "100",
+ "colors": [
+ "#00b500",
+ "#e6e600",
+ "#ca3838"
+ ],
+ "seg1": "",
+ "seg2": "",
+ "x": 570,
+ "y": 340,
+ "wires": []
+ },
+ {
+ "id": "4b2b9a70.6a9af4",
+ "type": "ui_chart",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "group": "3da7da8f.179606",
+ "order": 2,
+ "width": 0,
+ "height": 0,
+ "label": "",
+ "chartType": "line",
+ "legend": "false",
+ "xformat": "HH:mm:ss",
+ "interpolate": "linear",
+ "nodata": "",
+ "dot": false,
+ "ymin": "",
+ "ymax": "",
+ "removeOlder": "20",
+ "removeOlderPoints": "",
+ "removeOlderUnit": "60",
+ "cutout": 0,
+ "useOneColor": false,
+ "colors": [
+ "#1f77b4",
+ "#aec7e8",
+ "#ff7f0e",
+ "#2ca02c",
+ "#98df8a",
+ "#d62728",
+ "#ff9896",
+ "#9467bd",
+ "#c5b0d5"
+ ],
+ "outputs": 1,
+ "x": 570,
+ "y": 220,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "c7c8d192.3df27",
+ "type": "ui_chart",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "group": "806d69c8.67fc58",
+ "order": 2,
+ "width": 0,
+ "height": 0,
+ "label": "",
+ "chartType": "line",
+ "legend": "false",
+ "xformat": "HH:mm:ss",
+ "interpolate": "linear",
+ "nodata": "",
+ "dot": false,
+ "ymin": "0",
+ "ymax": "100",
+ "removeOlder": "20",
+ "removeOlderPoints": "",
+ "removeOlderUnit": "60",
+ "cutout": 0,
+ "useOneColor": false,
+ "useUTC": false,
+ "colors": [
+ "#1f77b4",
+ "#aec7e8",
+ "#ff7f0e",
+ "#2ca02c",
+ "#98df8a",
+ "#d62728",
+ "#ff9896",
+ "#9467bd",
+ "#c5b0d5"
+ ],
+ "outputs": 1,
+ "x": 570,
+ "y": 300,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "84ac8611.1a6ac8",
+ "type": "ui_chart",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "group": "405183bc.d8991c",
+ "order": 2,
+ "width": 0,
+ "height": 0,
+ "label": "",
+ "chartType": "line",
+ "legend": "false",
+ "xformat": "HH:mm:ss",
+ "interpolate": "linear",
+ "nodata": "",
+ "dot": false,
+ "ymin": "0",
+ "ymax": "100",
+ "removeOlder": "4",
+ "removeOlderPoints": "200",
+ "removeOlderUnit": "3600",
+ "cutout": 0,
+ "useOneColor": false,
+ "useUTC": false,
+ "colors": [
+ "#1f77b4",
+ "#aec7e8",
+ "#ff7f0e",
+ "#2ca02c",
+ "#98df8a",
+ "#d62728",
+ "#ff9896",
+ "#9467bd",
+ "#c5b0d5"
+ ],
+ "outputs": 1,
+ "x": 570,
+ "y": 380,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "1cd5b4c0.46af9b",
+ "type": "inject",
+ "z": "1371dec5.76e671",
+ "name": "update: 15s",
+ "props": [
+ {
+ "p": "payload"
+ },
+ {
+ "p": "topic",
+ "vt": "str"
+ }
+ ],
+ "repeat": "5",
+ "crontab": "",
+ "once": false,
+ "onceDelay": "",
+ "topic": "",
+ "payload": "",
+ "payloadType": "date",
+ "x": 100,
+ "y": 240,
+ "wires": [
+ [
+ "3910d662.fa1f7a",
+ "c2b8d8b.0d90328",
+ "55749fd8.3aca5",
+ "ddcbbfa5.cd158"
+ ]
+ ]
+ },
+ {
+ "id": "8485d05.444903",
+ "type": "ui_switch",
+ "z": "1371dec5.76e671",
+ "name": "fan_state",
+ "label": "Fan",
+ "tooltip": "",
+ "group": "3ca00bf9.e5cac4",
+ "order": 2,
+ "width": 2,
+ "height": 1,
+ "passthru": true,
+ "decouple": "false",
+ "topic": "",
+ "topicType": "str",
+ "style": "",
+ "onvalue": "on",
+ "onvalueType": "str",
+ "onicon": "",
+ "oncolor": "",
+ "offvalue": "off",
+ "offvalueType": "str",
+ "officon": "",
+ "offcolor": "",
+ "animate": true,
+ "x": 880,
+ "y": 40,
+ "wires": [
+ [
+ "7fb13a4a53b612a0"
+ ]
+ ]
+ },
+ {
+ "id": "2549f778.4eb828",
+ "type": "python3-function",
+ "z": "1371dec5.76e671",
+ "name": "fan control",
+ "func": "import smbus2 as smbus\n\nstate = msg[\"payload\"]\nbus = smbus.SMBus(1)\n\nDEVICE_ADDRESS = 0x0d\n# command happens twice, for reasons\nif state == \"off\":\n with smbus.SMBus(1) as bus:\n bus.write_byte_data(DEVICE_ADDRESS, 0x08, 0x00)\n bus.write_byte_data(DEVICE_ADDRESS, 0x08, 0x00)\n return msg\nif state == \"on\":\n with smbus.SMBus(1) as bus:\n bus.write_byte_data(DEVICE_ADDRESS, 0x08, 0x01)\n bus.write_byte_data(DEVICE_ADDRESS, 0x08, 0x01)\n return msg\n",
+ "outputs": 1,
+ "x": 1150,
+ "y": 40,
+ "wires": [
+ [
+ "e640ebb5c397f424"
+ ]
+ ]
+ },
+ {
+ "id": "b7ab1ada.1f4158",
+ "type": "exec",
+ "z": "1371dec5.76e671",
+ "command": "i2cdetect -y 1",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "1",
+ "winHide": false,
+ "oldrc": false,
+ "name": "i2c update",
+ "x": 1440,
+ "y": 40,
+ "wires": [
+ [],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "bc503fa5.f46dd",
+ "type": "switch",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "property": "payload",
+ "propertyType": "msg",
+ "rules": [
+ {
+ "t": "gt",
+ "v": "40",
+ "vt": "num"
+ },
+ {
+ "t": "lte",
+ "v": "35",
+ "vt": "num"
+ }
+ ],
+ "checkall": "true",
+ "repair": false,
+ "outputs": 2,
+ "x": 570,
+ "y": 40,
+ "wires": [
+ [
+ "a25d6486.e1ce28"
+ ],
+ [
+ "5d4f3e71.1bad4"
+ ]
+ ]
+ },
+ {
+ "id": "5d4f3e71.1bad4",
+ "type": "change",
+ "z": "1371dec5.76e671",
+ "name": "Set OFF",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "off",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 720,
+ "y": 60,
+ "wires": [
+ [
+ "8485d05.444903"
+ ]
+ ]
+ },
+ {
+ "id": "a25d6486.e1ce28",
+ "type": "change",
+ "z": "1371dec5.76e671",
+ "name": "Set ON",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "on",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 720,
+ "y": 20,
+ "wires": [
+ [
+ "8485d05.444903"
+ ]
+ ]
+ },
+ {
+ "id": "569154a.b53182c",
+ "type": "inject",
+ "z": "1371dec5.76e671",
+ "name": "once",
+ "props": [
+ {
+ "p": "payload"
+ }
+ ],
+ "repeat": "",
+ "crontab": "",
+ "once": true,
+ "onceDelay": "",
+ "topic": "",
+ "payload": "start",
+ "payloadType": "str",
+ "x": 130,
+ "y": 620,
+ "wires": [
+ [
+ "452af41c.43940c"
+ ]
+ ]
+ },
+ {
+ "id": "452af41c.43940c",
+ "type": "python3-function",
+ "z": "1371dec5.76e671",
+ "name": "Get MachineName",
+ "func": "import sys\nsys.path.append('/home/pi/PlanktoScope/scripts')\nimport planktoscope.uuidName\n\nmsg['payload'] = planktoscope.uuidName.machineName(machine=planktoscope.uuidName.getSerial())\nmsg['topic'] = \"acq_instrument_id\";\nreturn msg",
+ "outputs": 1,
+ "x": 350,
+ "y": 620,
+ "wires": [
+ [
+ "4828d2f4.7c712c",
+ "a400a97e.e333a8"
+ ]
+ ]
+ },
+ {
+ "id": "4828d2f4.7c712c",
+ "type": "function",
+ "z": "1371dec5.76e671",
+ "name": "set global",
+ "func": "global.set(msg.topic,msg.payload);\n",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 580,
+ "y": 640,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "e2f39a35.f57298",
+ "type": "subflow:1c24ad9c.bebec2",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "env": [],
+ "x": 570,
+ "y": 560,
+ "wires": [
+ [
+ "bdc6718a.dd5d48"
+ ]
+ ]
+ },
+ {
+ "id": "3e64877a.9684b",
+ "type": "function",
+ "z": "1371dec5.76e671",
+ "name": "store version",
+ "func": "msg.payload = \"PlanktoScope v2.3-\"+msg.payload.trim()\n\nglobal.set(\"acq_software\",msg.payload);\n\nreturn msg\n",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 590,
+ "y": 520,
+ "wires": [
+ [
+ "8343fa69.49339"
+ ]
+ ]
+ },
+ {
+ "id": "bdc6718a.dd5d48",
+ "type": "ui_text",
+ "z": "1371dec5.76e671",
+ "group": "ce9e278.781eed8",
+ "order": 2,
+ "width": 0,
+ "height": 0,
+ "name": "",
+ "label": "Instrument Type",
+ "format": "{{msg.payload.acq_instrument}}",
+ "layout": "row-spread",
+ "x": 840,
+ "y": 560,
+ "wires": []
+ },
+ {
+ "id": "a400a97e.e333a8",
+ "type": "ui_text",
+ "z": "1371dec5.76e671",
+ "group": "ce9e278.781eed8",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "name": "",
+ "label": "Instrument Name",
+ "format": "{{msg.payload}}",
+ "layout": "row-spread",
+ "x": 610,
+ "y": 600,
+ "wires": []
+ },
+ {
+ "id": "8343fa69.49339",
+ "type": "ui_text",
+ "z": "1371dec5.76e671",
+ "group": "ce9e278.781eed8",
+ "order": 3,
+ "width": 0,
+ "height": 0,
+ "name": "",
+ "label": "Software version",
+ "format": "{{msg.payload}}",
+ "layout": "row-spread",
+ "x": 840,
+ "y": 520,
+ "wires": []
+ },
+ {
+ "id": "f783aefd.c3bfd8",
+ "type": "ui_text",
+ "z": "1371dec5.76e671",
+ "group": "ce9e278.781eed8",
+ "order": 4,
+ "width": 0,
+ "height": 0,
+ "name": "",
+ "label": "Camera Name",
+ "format": "{{msg.payload}}",
+ "layout": "row-spread",
+ "x": 1020,
+ "y": 620,
+ "wires": []
+ },
+ {
+ "id": "30067f35.532f2",
+ "type": "link in",
+ "z": "1371dec5.76e671",
+ "name": "Camera Name",
+ "links": [
+ "559a8085.1d6b9"
+ ],
+ "x": 875,
+ "y": 620,
+ "wires": [
+ [
+ "f783aefd.c3bfd8"
+ ]
+ ]
+ },
+ {
+ "id": "11b51f8f.acd308",
+ "type": "python3-function",
+ "z": "1371dec5.76e671",
+ "d": true,
+ "name": "fan temperature",
+ "func": "import smbus\nbus = smbus.SMBus(1)\n\naddr = 0x0d\nfan_reg = 0x08\n\ntemp = float( msg[\"payload\"])\n\n# 0x01 full speed, 0x02: 20% speed, ..., 0x09: 90% speed\n\nif temp < 38:\n bus.write_byte_data(addr, fan_reg, 0x00)\nelif temp < 43:\n bus.write_byte_data(addr, fan_reg, 0x02)\nelif temp < 46:\n bus.write_byte_data(addr, fan_reg, 0x04)\nelif temp < 48:\n bus.write_byte_data(addr, fan_reg, 0x06)\nelif temp < 52:\n bus.write_byte_data(addr, fan_reg, 0x08)\nelse:\n bus.write_byte_data(addr, fan_reg, 0x01)\n\nreturn msg",
+ "outputs": 1,
+ "x": 1440,
+ "y": 120,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "eaf74a43.fa27d",
+ "type": "switch",
+ "z": "1371dec5.76e671",
+ "name": "if disk > 90%",
+ "property": "payload",
+ "propertyType": "msg",
+ "rules": [
+ {
+ "t": "gte",
+ "v": "90",
+ "vt": "num"
+ }
+ ],
+ "checkall": "true",
+ "repair": false,
+ "outputs": 1,
+ "x": 590,
+ "y": 420,
+ "wires": [
+ [
+ "6d09f428.930bcc"
+ ]
+ ]
+ },
+ {
+ "id": "46d5e78b.15f998",
+ "type": "ui_toast",
+ "z": "1371dec5.76e671",
+ "position": "dialog",
+ "displayTime": "10",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 1,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "",
+ "name": "",
+ "x": 1090,
+ "y": 420,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "24df077a.cb252",
+ "type": "change",
+ "z": "1371dec5.76e671",
+ "name": "full disk msg",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "\"Your drive has reached 90% capacity, you should do a backup to an external drive and a purge.\"",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 930,
+ "y": 420,
+ "wires": [
+ [
+ "46d5e78b.15f998"
+ ]
+ ]
+ },
+ {
+ "id": "f344dc9e.3c9278",
+ "type": "ui_button",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "group": "3ca00bf9.e5cac4",
+ "order": 1,
+ "width": 4,
+ "height": 1,
+ "passthru": false,
+ "label": "Home",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "home",
+ "payload": "{\"tab\":\"Home\"}",
+ "payloadType": "json",
+ "topic": "",
+ "x": 430,
+ "y": 740,
+ "wires": [
+ [
+ "5f94b366.e4d3a4"
+ ]
+ ]
+ },
+ {
+ "id": "5f94b366.e4d3a4",
+ "type": "ui_ui_control",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "events": "change",
+ "x": 580,
+ "y": 740,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "f30bf784.90d58",
+ "type": "ui_dropdown",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "label": "",
+ "tooltip": "",
+ "place": "Choose USB device",
+ "group": "52d1b77.28369c8",
+ "order": 2,
+ "width": 0,
+ "height": 0,
+ "passthru": false,
+ "multiple": false,
+ "options": [
+ {
+ "label": "",
+ "value": "No Drive Detected",
+ "type": "str"
+ }
+ ],
+ "payload": "",
+ "topic": "device_path",
+ "x": 840,
+ "y": 820,
+ "wires": [
+ [
+ "d1b9fed3.f3ead8"
+ ]
+ ]
+ },
+ {
+ "id": "fe29acc2.c25d18",
+ "type": "ui_button",
+ "z": "1371dec5.76e671",
+ "name": "Detect drive",
+ "group": "52d1b77.28369c8",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "passthru": false,
+ "label": "Detect drive",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "fa-usb fa-2x",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "",
+ "x": 150,
+ "y": 820,
+ "wires": [
+ [
+ "4c00cd96.6b2f6c"
+ ]
+ ]
+ },
+ {
+ "id": "4c00cd96.6b2f6c",
+ "type": "exec",
+ "z": "1371dec5.76e671",
+ "command": "lsblk --bytes --json --paths --output-all",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "",
+ "oldrc": false,
+ "name": "detect drive",
+ "x": 330,
+ "y": 820,
+ "wires": [
+ [
+ "2dc1e43d.cd3d64"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "2dc1e43d.cd3d64",
+ "type": "json",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "property": "payload",
+ "action": "",
+ "pretty": false,
+ "x": 490,
+ "y": 820,
+ "wires": [
+ [
+ "6b730649.09351"
+ ]
+ ]
+ },
+ {
+ "id": "6b730649.09351",
+ "type": "change",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "options",
+ "pt": "msg",
+ "to": "[payload.blockdevices.children[mountpoint=null].name]",
+ "tot": "jsonata"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 660,
+ "y": 820,
+ "wires": [
+ [
+ "f30bf784.90d58"
+ ]
+ ]
+ },
+ {
+ "id": "1ece8d8e.1008e2",
+ "type": "ui_button",
+ "z": "1371dec5.76e671",
+ "name": "Backup to USB",
+ "group": "52d1b77.28369c8",
+ "order": 3,
+ "width": 0,
+ "height": 0,
+ "passthru": false,
+ "label": "Backup to USB",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "archive",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "USB Backup",
+ "x": 160,
+ "y": 900,
+ "wires": [
+ [
+ "6b2fed77.883c0c"
+ ]
+ ]
+ },
+ {
+ "id": "d1b9fed3.f3ead8",
+ "type": "function",
+ "z": "1371dec5.76e671",
+ "name": "set local",
+ "func": "flow.set(msg.topic,msg.payload);",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 1000,
+ "y": 820,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "6b2fed77.883c0c",
+ "type": "function",
+ "z": "1371dec5.76e671",
+ "name": "get device_path",
+ "func": "msg.payload = flow.get(\"device_path\");\nreturn msg",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 340,
+ "y": 900,
+ "wires": [
+ [
+ "df4d4d6a.24787"
+ ]
+ ]
+ },
+ {
+ "id": "c74fe76.bcba718",
+ "type": "exec",
+ "z": "1371dec5.76e671",
+ "command": "sudo /home/pi/PlanktoScope/scripts/bash/usb_backup.sh",
+ "addpay": true,
+ "append": "",
+ "useSpawn": "true",
+ "timer": "",
+ "oldrc": false,
+ "name": "usb_backup.sh",
+ "x": 720,
+ "y": 920,
+ "wires": [
+ [
+ "72f5e8d4.40fcb8"
+ ],
+ [],
+ [
+ "a2c36500.6d376"
+ ]
+ ]
+ },
+ {
+ "id": "df4d4d6a.24787",
+ "type": "switch",
+ "z": "1371dec5.76e671",
+ "name": "No Drive",
+ "property": "payload",
+ "propertyType": "msg",
+ "rules": [
+ {
+ "t": "eq",
+ "v": "No Drive Detected",
+ "vt": "str"
+ },
+ {
+ "t": "else"
+ }
+ ],
+ "checkall": "false",
+ "repair": false,
+ "outputs": 2,
+ "x": 520,
+ "y": 900,
+ "wires": [
+ [
+ "9a577caa.1535a"
+ ],
+ [
+ "c74fe76.bcba718",
+ "4997446.5176d3c"
+ ]
+ ]
+ },
+ {
+ "id": "9a577caa.1535a",
+ "type": "ui_toast",
+ "z": "1371dec5.76e671",
+ "position": "dialog",
+ "displayTime": "5",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 1,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "",
+ "name": "",
+ "x": 710,
+ "y": 880,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "72f5e8d4.40fcb8",
+ "type": "ui_toast",
+ "z": "1371dec5.76e671",
+ "position": "top right",
+ "displayTime": "5",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 0,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "",
+ "name": "",
+ "x": 930,
+ "y": 900,
+ "wires": []
+ },
+ {
+ "id": "81a48376.27a66",
+ "type": "ui_toast",
+ "z": "1371dec5.76e671",
+ "position": "dialog",
+ "displayTime": "5",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 1,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "",
+ "name": "",
+ "x": 1110,
+ "y": 980,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "a2c36500.6d376",
+ "type": "function",
+ "z": "1371dec5.76e671",
+ "name": "return code",
+ "func": "switch (msg.payload.code){\ncase 0:\n msg.payload = \"All files successfully copied, you can remove your usb drive!\";\n break;\ncase 1:\n msg.payload = \"There was an error!\";\n break;\ncase 2:\n msg.payload = \"Error: your device is already mounted\"\n break;\ncase 3:\n msg.payload = \"Error while mounting the device\"\n break;\ncase 4:\n msg.payload = \"Error: some files were corrupted during the copy!\"\n break;\n}\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 910,
+ "y": 940,
+ "wires": [
+ [
+ "81a48376.27a66"
+ ]
+ ]
+ },
+ {
+ "id": "dde0025c.3df9f",
+ "type": "ui_button",
+ "z": "1371dec5.76e671",
+ "name": "Purge local",
+ "group": "52d1b77.28369c8",
+ "order": 4,
+ "width": 0,
+ "height": 0,
+ "passthru": false,
+ "label": "Purge local data",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "#AD1625",
+ "icon": "delete_forever",
+ "payload": "THIS IS GOING TO WIPE ALL THE LOCAL DATA. MAKE SURE YOU DID A BACKUP TO AN USB DRIVE BEFOREHAND.",
+ "payloadType": "str",
+ "topic": "BE EXTRA CAREFUL",
+ "x": 150,
+ "y": 1020,
+ "wires": [
+ [
+ "ba72704a.8a38a"
+ ]
+ ]
+ },
+ {
+ "id": "ba72704a.8a38a",
+ "type": "ui_toast",
+ "z": "1371dec5.76e671",
+ "position": "dialog",
+ "displayTime": "5",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 1,
+ "ok": "GO BACK",
+ "cancel": "YES I'M SURE, I WANT TO PURGE THE DATA",
+ "raw": false,
+ "topic": "Data purge",
+ "name": "",
+ "x": 330,
+ "y": 1020,
+ "wires": [
+ [
+ "d80e6307.3aaf8"
+ ]
+ ]
+ },
+ {
+ "id": "d80e6307.3aaf8",
+ "type": "switch",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "property": "payload",
+ "propertyType": "msg",
+ "rules": [
+ {
+ "t": "cont",
+ "v": "YES I'M SURE",
+ "vt": "str"
+ }
+ ],
+ "checkall": "true",
+ "repair": false,
+ "outputs": 1,
+ "x": 510,
+ "y": 1020,
+ "wires": [
+ [
+ "4a8cb5d4.52e4bc"
+ ]
+ ]
+ },
+ {
+ "id": "4a8cb5d4.52e4bc",
+ "type": "exec",
+ "z": "1371dec5.76e671",
+ "command": "rm -rf /home/pi/data/img /home/pi/data/objects /home/pi/data/export",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "",
+ "oldrc": false,
+ "name": "rm data",
+ "x": 700,
+ "y": 1020,
+ "wires": [
+ [
+ "c5b1e763.d1bba8"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "c5b1e763.d1bba8",
+ "type": "function",
+ "z": "1371dec5.76e671",
+ "name": "error message",
+ "func": "// TODO revoir cette partie\n\nswitch (msg.rc.code){\ncase 0:\n msg.payload = \"/home/pi/data was purged successfully!\";\n break;\ndefault:\n msg.payload = \"There was an error! The error is \" + msg.rc.message;\n break;\n}\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 900,
+ "y": 1020,
+ "wires": [
+ [
+ "81a48376.27a66"
+ ]
+ ]
+ },
+ {
+ "id": "6d09f428.930bcc",
+ "type": "delay",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "pauseType": "rate",
+ "timeout": "5",
+ "timeoutUnits": "seconds",
+ "rate": "1",
+ "nbRateUnits": "5",
+ "rateUnits": "minute",
+ "randomFirst": "1",
+ "randomLast": "5",
+ "randomUnits": "seconds",
+ "drop": true,
+ "outputs": 1,
+ "x": 760,
+ "y": 420,
+ "wires": [
+ [
+ "24df077a.cb252"
+ ]
+ ]
+ },
+ {
+ "id": "4997446.5176d3c",
+ "type": "change",
+ "z": "1371dec5.76e671",
+ "name": "Backup starting message",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "\"The backup is starting now, please wait for the complete message before removing the drive\"",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 750,
+ "y": 980,
+ "wires": [
+ [
+ "81a48376.27a66"
+ ]
+ ]
+ },
+ {
+ "id": "6c7f0cc5.ea30d4",
+ "type": "gpsd",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "hostname": "localhost",
+ "port": "2947",
+ "tpv": true,
+ "sky": false,
+ "info": false,
+ "device": false,
+ "gst": false,
+ "att": false,
+ "x": 170,
+ "y": 1360,
+ "wires": [
+ [
+ "906072b1.42c7c8",
+ "cd3b05d6.5a3e2",
+ "9b29e0e2.475e08",
+ "96fefa8b.b7d538",
+ "49a98fe9.9450d8",
+ "f2a62d0.f5e135"
+ ]
+ ]
+ },
+ {
+ "id": "96bc0179.5c37",
+ "type": "ui_text",
+ "z": "1371dec5.76e671",
+ "group": "cfe2288f.a8862",
+ "order": 1,
+ "width": 6,
+ "height": 1,
+ "name": "GPS Status Display",
+ "label": "GPS Status:",
+ "format": "{{msg.payload}}",
+ "layout": "row-center",
+ "x": 660,
+ "y": 1200,
+ "wires": []
+ },
+ {
+ "id": "8c731f52.2b5f3",
+ "type": "ui_text",
+ "z": "1371dec5.76e671",
+ "group": "cfe2288f.a8862",
+ "order": 5,
+ "width": 3,
+ "height": 1,
+ "name": "Latitude",
+ "label": "Latitude",
+ "format": "{{msg.payload.lat.deg}}°{{msg.payload.lat.min}}'{{msg.payload.lat.sec}}{{msg.payload.lat.dir}}",
+ "layout": "col-center",
+ "x": 620,
+ "y": 1240,
+ "wires": []
+ },
+ {
+ "id": "34e4b5ea.27b4a2",
+ "type": "ui_text",
+ "z": "1371dec5.76e671",
+ "group": "cfe2288f.a8862",
+ "order": 6,
+ "width": 3,
+ "height": 1,
+ "name": "Longitude",
+ "label": "Longitude",
+ "format": "{{msg.payload.lon.deg}}°{{msg.payload.lon.min}}'{{msg.payload.lon.sec}}{{msg.payload.lon.dir}}",
+ "layout": "col-center",
+ "x": 620,
+ "y": 1280,
+ "wires": []
+ },
+ {
+ "id": "906072b1.42c7c8",
+ "type": "function",
+ "z": "1371dec5.76e671",
+ "name": "Convert DD to DMS",
+ "func": "function ConvertDDToDMS(D, lng){\n // from https://stackoverflow.com/a/5786281/2108279\n return {\n dir : D<0?lng?'W':'S':lng?'E':'N',\n deg : 0|(D<0?D=-D:D),\n min : 0|D%1*60,\n sec :(0|D*60%1*6000)/100\n };\n}\n\nmsg.payload = {\n \"lat\":ConvertDDToDMS(msg.payload.lat, false),\n \"lon\":ConvertDDToDMS(msg.payload.lon, true)\n};\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 420,
+ "y": 1260,
+ "wires": [
+ [
+ "8c731f52.2b5f3",
+ "34e4b5ea.27b4a2"
+ ]
+ ]
+ },
+ {
+ "id": "4584c817.0be238",
+ "type": "ui_text",
+ "z": "1371dec5.76e671",
+ "group": "cfe2288f.a8862",
+ "order": 3,
+ "width": 3,
+ "height": 1,
+ "name": "Speed",
+ "label": "Speed",
+ "format": "{{msg.payload}} kts",
+ "layout": "col-center",
+ "x": 610,
+ "y": 1320,
+ "wires": []
+ },
+ {
+ "id": "cd3b05d6.5a3e2",
+ "type": "ui_text",
+ "z": "1371dec5.76e671",
+ "group": "cfe2288f.a8862",
+ "order": 4,
+ "width": 3,
+ "height": 1,
+ "name": "Direction",
+ "label": "Direction",
+ "format": "{{msg.payload.track}} °",
+ "layout": "col-center",
+ "x": 620,
+ "y": 1360,
+ "wires": []
+ },
+ {
+ "id": "9b29e0e2.475e08",
+ "type": "function",
+ "z": "1371dec5.76e671",
+ "name": "GPS Mode",
+ "func": "switch (msg.payload.mode){\n case 1:msg.payload = \"No Fix\"; break\n case 2:msg.payload = \"2D Fix\"; break\n case 3:msg.payload = \"3D Fix\"; break\n default: msg.payload = \"No info\"\n}\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 390,
+ "y": 1200,
+ "wires": [
+ [
+ "96bc0179.5c37"
+ ]
+ ]
+ },
+ {
+ "id": "96fefa8b.b7d538",
+ "type": "function",
+ "z": "1371dec5.76e671",
+ "name": "Speed conversion",
+ "func": "msg.payload = (0|msg.payload.speed) * 1.9438\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 410,
+ "y": 1320,
+ "wires": [
+ [
+ "4584c817.0be238"
+ ]
+ ]
+ },
+ {
+ "id": "49a98fe9.9450d8",
+ "type": "ui_text",
+ "z": "1371dec5.76e671",
+ "group": "cfe2288f.a8862",
+ "order": 2,
+ "width": 6,
+ "height": 1,
+ "name": "GPS UTC datetime",
+ "label": "GPS UTC datetime",
+ "format": "{{msg.payload.time}}",
+ "layout": "col-center",
+ "x": 650,
+ "y": 1400,
+ "wires": []
+ },
+ {
+ "id": "3c3f334e.d691ac",
+ "type": "ui_button",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "group": "cfe2288f.a8862",
+ "order": 6,
+ "width": 0,
+ "height": 0,
+ "passthru": false,
+ "label": "Force local clock update",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "topic",
+ "x": 670,
+ "y": 1480,
+ "wires": [
+ [
+ "c60030d4.317418"
+ ]
+ ]
+ },
+ {
+ "id": "c60030d4.317418",
+ "type": "exec",
+ "z": "1371dec5.76e671",
+ "command": "sudo hwclock -w",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "",
+ "oldrc": false,
+ "name": "",
+ "x": 920,
+ "y": 1480,
+ "wires": [
+ [],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "6d144078.508d9",
+ "type": "ui_text",
+ "z": "1371dec5.76e671",
+ "group": "cfe2288f.a8862",
+ "order": 2,
+ "width": 6,
+ "height": 1,
+ "name": "Local UTC datetime",
+ "label": "Local UTC datetime",
+ "format": "{{msg.payload}}",
+ "layout": "col-center",
+ "x": 660,
+ "y": 1440,
+ "wires": []
+ },
+ {
+ "id": "f2a62d0.f5e135",
+ "type": "function",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "func": "msg.payload = new Date()\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 380,
+ "y": 1440,
+ "wires": [
+ [
+ "6d144078.508d9"
+ ]
+ ]
+ },
+ {
+ "id": "9373b3f6.33a2b",
+ "type": "link in",
+ "z": "1371dec5.76e671",
+ "name": "Git Rev",
+ "links": [
+ "6c20d6a7.869b6"
+ ],
+ "x": 375,
+ "y": 520,
+ "wires": [
+ [
+ "3e64877a.9684b"
+ ]
+ ]
+ },
+ {
+ "id": "e640ebb5c397f424",
+ "type": "delay",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "pauseType": "delay",
+ "timeout": "1",
+ "timeoutUnits": "seconds",
+ "rate": "1",
+ "nbRateUnits": "1",
+ "rateUnits": "second",
+ "randomFirst": "1",
+ "randomLast": "5",
+ "randomUnits": "seconds",
+ "drop": false,
+ "allowrate": false,
+ "outputs": 1,
+ "x": 1300,
+ "y": 40,
+ "wires": [
+ [
+ "b7ab1ada.1f4158"
+ ]
+ ]
+ },
+ {
+ "id": "7fb13a4a53b612a0",
+ "type": "rbe",
+ "z": "1371dec5.76e671",
+ "name": "",
+ "func": "rbe",
+ "gap": "",
+ "start": "",
+ "inout": "out",
+ "septopics": true,
+ "property": "payload",
+ "topi": "topic",
+ "x": 1010,
+ "y": 40,
+ "wires": [
+ [
+ "2549f778.4eb828"
+ ]
+ ]
+ },
+ {
+ "id": "b9bf06d6.26c518",
+ "type": "exec",
+ "z": "f21ba04.c26266",
+ "command": "sudo iwlist wlan0 scan | grep ESSID | sed 's/ESSID://g;s/\"//g;s/^ *//;s/ *$//'",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "",
+ "oldrc": false,
+ "name": "scan",
+ "x": 450,
+ "y": 80,
+ "wires": [
+ [
+ "9642cb31.663b4"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "9642cb31.663b4",
+ "type": "function",
+ "z": "f21ba04.c26266",
+ "name": "parseOptions",
+ "func": "var ssids = msg.payload.split('\\n').filter(s => !!s)\n\nssids = [...new Set(ssids)];\n\nmsg.options = ssids\nmsg.payload = null\n\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "x": 600,
+ "y": 80,
+ "wires": [
+ [
+ "dbc0d44.5361b28"
+ ]
+ ]
+ },
+ {
+ "id": "dbc0d44.5361b28",
+ "type": "ui_dropdown",
+ "z": "f21ba04.c26266",
+ "name": "",
+ "label": "Wifi",
+ "tooltip": "",
+ "place": "Select a WIFI",
+ "group": "9e409235.73cd7",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "passthru": false,
+ "multiple": false,
+ "options": [],
+ "payload": "",
+ "topic": "",
+ "x": 770,
+ "y": 80,
+ "wires": [
+ [
+ "cdfa9013.b91278"
+ ]
+ ]
+ },
+ {
+ "id": "2bf338e3.966468",
+ "type": "ui_button",
+ "z": "f21ba04.c26266",
+ "name": "",
+ "group": "9e409235.73cd7",
+ "order": 2,
+ "width": 0,
+ "height": 0,
+ "passthru": false,
+ "label": "Scan",
+ "tooltip": "",
+ "color": "",
+ "bgcolor": "",
+ "icon": "fa-wifi fa-2x",
+ "payload": "true",
+ "payloadType": "bool",
+ "topic": "",
+ "x": 270,
+ "y": 40,
+ "wires": [
+ [
+ "b9bf06d6.26c518"
+ ]
+ ]
+ },
+ {
+ "id": "4c0400c.69a1e8",
+ "type": "exec",
+ "z": "f21ba04.c26266",
+ "command": "ip -j addr show",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "",
+ "oldrc": false,
+ "name": "getInfo",
+ "x": 460,
+ "y": 180,
+ "wires": [
+ [
+ "88e05f37a8745216"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "bcb20e39.00cea8",
+ "type": "function",
+ "z": "f21ba04.c26266",
+ "name": "parse IP Info",
+ "func": "var ip = \"\";\nvar broadcast = \"\";\nvar iface = \"\";\nvar iface_up = false;\n\nif (msg.rc.code === 0){\n payload = msg.payload\n for (let info in payload) {\n if (payload[info].operstate === \"UP\") {\n \tif (iface_up){\n \t// We have two concurrent interfaces up\n // We need to deactivate one\n ip = \"Remove Ethernet cable or disconnect wifi\"\n broadcast = \"Remove Ethernet cable or disconnect wifi\"\n iface = \"Remove Ethernet cable or disconnect wifi\"\n break\n }\n if (payload[info].ifname === \"eth0\") {\n iface = \"Ethernet\"\n } else if (payload[info].ifname === \"wifi0\" || payload[info].ifname === \"wlan0\") {\n iface = \"Wifi\"\n }\n ip = payload[info].addr_info[0].local;\n broadcast = payload[info].addr_info[0].broadcast;\n iface_up = true;\n }\n }\n}\n\nif (iface_up) {\n return([{\n topic: 'interface',\n payload: iface\n }, {\n topic: 'ip',\n payload: ip\n }, {\n topic: 'broadcast',\n payload: broadcast\n }])\n}\n",
+ "outputs": 3,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 730,
+ "y": 180,
+ "wires": [
+ [
+ "67d052ba.99ff24"
+ ],
+ [
+ "d71c8185.800fd",
+ "49111a72f4e32740"
+ ],
+ [
+ "dc305a26.b33fc"
+ ]
+ ],
+ "outputLabels": [
+ "interface",
+ "ip",
+ "broadcast"
+ ]
+ },
+ {
+ "id": "d71c8185.800fd",
+ "type": "ui_text",
+ "z": "f21ba04.c26266",
+ "group": "919923a3.d10868",
+ "order": 2,
+ "width": 0,
+ "height": 0,
+ "name": "",
+ "label": "IP",
+ "format": "{{msg.payload || '---'}}",
+ "layout": "row-spread",
+ "x": 930,
+ "y": 180,
+ "wires": []
+ },
+ {
+ "id": "67d052ba.99ff24",
+ "type": "ui_text",
+ "z": "f21ba04.c26266",
+ "group": "919923a3.d10868",
+ "order": 1,
+ "width": 0,
+ "height": 0,
+ "name": "",
+ "label": "Interface",
+ "format": "{{msg.payload || '---'}}",
+ "layout": "row-spread",
+ "x": 940,
+ "y": 140,
+ "wires": []
+ },
+ {
+ "id": "dc305a26.b33fc",
+ "type": "ui_text",
+ "z": "f21ba04.c26266",
+ "group": "919923a3.d10868",
+ "order": 3,
+ "width": 0,
+ "height": 0,
+ "name": "",
+ "label": "Broadcast",
+ "format": "{{msg.payload || '---'}}",
+ "layout": "row-spread",
+ "x": 950,
+ "y": 220,
+ "wires": []
+ },
+ {
+ "id": "94b2e8fc.aa20e",
+ "type": "ui_form",
+ "z": "f21ba04.c26266",
+ "name": "",
+ "label": "Update",
+ "group": "9e409235.73cd7",
+ "order": 3,
+ "width": 0,
+ "height": 0,
+ "options": [
+ {
+ "label": "SSID",
+ "value": "ssid",
+ "type": "text",
+ "required": true,
+ "rows": null
+ },
+ {
+ "label": "Password",
+ "value": "password",
+ "type": "text",
+ "required": true,
+ "rows": null
+ }
+ ],
+ "formValue": {
+ "ssid": "",
+ "password": ""
+ },
+ "payload": "",
+ "submit": "Add the network",
+ "cancel": "Reset fields",
+ "topic": "",
+ "x": 1100,
+ "y": 80,
+ "wires": [
+ [
+ "d59021e3.1b63e8"
+ ]
+ ]
+ },
+ {
+ "id": "cdfa9013.b91278",
+ "type": "function",
+ "z": "f21ba04.c26266",
+ "name": "insert ssid",
+ "func": "\nmsg.payload = {ssid: msg.payload}\n\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 930,
+ "y": 80,
+ "wires": [
+ [
+ "94b2e8fc.aa20e"
+ ]
+ ]
+ },
+ {
+ "id": "448b4c37.be50bc",
+ "type": "exec",
+ "z": "f21ba04.c26266",
+ "command": "iw dev wlan0 info",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "",
+ "oldrc": false,
+ "name": "getCurrentSSID",
+ "x": 480,
+ "y": 260,
+ "wires": [
+ [
+ "151819d4.0dbe56"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "c8a5ae48.ef1308",
+ "type": "ui_text",
+ "z": "f21ba04.c26266",
+ "group": "919923a3.d10868",
+ "order": 4,
+ "width": 0,
+ "height": 0,
+ "name": "",
+ "label": "SSID",
+ "format": "{{msg.payload || '---'}}",
+ "layout": "row-spread",
+ "x": 930,
+ "y": 259,
+ "wires": []
+ },
+ {
+ "id": "151819d4.0dbe56",
+ "type": "function",
+ "z": "f21ba04.c26266",
+ "name": "parse SSID",
+ "func": "var ssid = \"\"\n\nif (msg.rc.code === 0){\n ssid = msg.payload.match(/\\sssid (.+)/)[1];\n return({topic: 'ssid', payload: ssid})\n}\n",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "libs": [],
+ "x": 730,
+ "y": 260,
+ "wires": [
+ [
+ "c8a5ae48.ef1308"
+ ]
+ ]
+ },
+ {
+ "id": "ff059f3f.9c0f28",
+ "type": "ui_ui_control",
+ "z": "f21ba04.c26266",
+ "name": "onTab",
+ "events": "all",
+ "x": 130,
+ "y": 80,
+ "wires": [
+ [
+ "f103cd20eb4362a4"
+ ]
+ ]
+ },
+ {
+ "id": "167d7bd0.679ce4",
+ "type": "function",
+ "z": "f21ba04.c26266",
+ "name": "update contry code",
+ "func": "var template = `sudo sed -i \\\"s/^country.*/country=\"${msg.payload}\"/\\\" /home/pi/wpa_supplicant.conf`\n// sudo tee /etc/wpa_supplicant/wpa_supplicant.conf < /dev/null`\n \nmsg.payload = command\n\nreturn msg",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 1270,
+ "y": 80,
+ "wires": [
+ [
+ "64a1f2f2.3de8b4"
+ ]
+ ]
+ },
+ {
+ "id": "64a1f2f2.3de8b4",
+ "type": "exec",
+ "z": "f21ba04.c26266",
+ "command": "",
+ "addpay": true,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "",
+ "oldrc": false,
+ "name": "Save Network",
+ "x": 1460,
+ "y": 80,
+ "wires": [
+ [
+ "6868b4c4.65987c"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "6868b4c4.65987c",
+ "type": "exec",
+ "z": "f21ba04.c26266",
+ "command": "sudo /usr/bin/autohotspotN >/dev/null",
+ "addpay": false,
+ "append": "",
+ "useSpawn": "false",
+ "timer": "",
+ "oldrc": false,
+ "name": "reconfigure",
+ "x": 1250,
+ "y": 180,
+ "wires": [
+ [
+ "59e24c40.e1a4dc"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "59e24c40.e1a4dc",
+ "type": "function",
+ "z": "f21ba04.c26266",
+ "name": "showMessage",
+ "func": "msg.payload = \"Wifi configuration updated successfully\"\nreturn msg;",
+ "outputs": 1,
+ "noerr": 0,
+ "initialize": "",
+ "finalize": "",
+ "x": 1420,
+ "y": 180,
+ "wires": [
+ [
+ "4ecb6be2.ad39f4"
+ ]
+ ]
+ },
+ {
+ "id": "4ecb6be2.ad39f4",
+ "type": "ui_toast",
+ "z": "f21ba04.c26266",
+ "position": "dialog",
+ "displayTime": "3",
+ "highlight": "",
+ "sendall": true,
+ "outputs": 1,
+ "ok": "OK",
+ "cancel": "",
+ "raw": false,
+ "topic": "",
+ "name": "",
+ "x": 1590,
+ "y": 180,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "991d1df9.3ffb3",
+ "type": "function",
+ "z": "f21ba04.c26266",
+ "name": "reset wpa_supplicant.conf",
+ "func": "country_code = flow.get(\"country_code\")\n\nvar template = `sudo tee /etc/wpa_supplicant/wpa_supplicant.conf <Stepper controller type",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": true,
+ "templateScope": "local",
+ "x": 550,
+ "y": 100,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "7534dfd9.8cf3e8",
+ "type": "ui_template",
+ "z": "1eaf21c8.f7a21e",
+ "group": "6be36295.0ab324",
+ "name": "Information",
+ "order": 2,
+ "width": 6,
+ "height": 3,
+ "format": "\n
Changing one of these values will make the python back-end to restart.
\n
If you are not sure, you probably should not be touching anything here!
\n
",
+ "storeOutMessages": true,
+ "fwdInMessages": true,
+ "resendOnRefresh": true,
+ "templateScope": "local",
+ "x": 610,
+ "y": 60,
+ "wires": [
+ []
+ ]
+ },
{
"id": "a7e5c7f4.644678",
"type": "ui_dropdown",
@@ -10314,111 +10754,6 @@
]
]
},
- {
- "id": "cdd4181922eecf11",
- "type": "ui_text_input",
- "z": "b771c342.49603",
- "name": "sample_speed_through_water",
- "label": "Speed Through Water (kts)",
- "tooltip": "in knots",
- "group": "cf5d9f0e.d57e7",
- "order": 2,
- "width": 10,
- "height": 1,
- "passthru": true,
- "mode": "number",
- "delay": "0",
- "topic": "sample_speed_through_water",
- "topicType": "str",
- "x": 610,
- "y": 520,
- "wires": [
- [
- "9f501f49.45645"
- ]
- ]
- },
- {
- "id": "4be09c97f86897d9",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "get nb_frame",
- "func": "msg.payload = msg.payload.nb_frame;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 330,
- "y": 280,
- "wires": [
- [
- "51b4d0df.d70a88"
- ]
- ]
- },
- {
- "id": "f573206abefa9518",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "get imaging_pump_volume",
- "func": "msg.payload = msg.payload.imaging_pump_volume;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 380,
- "y": 320,
- "wires": [
- [
- "df1ea904.cd261"
- ]
- ]
- },
- {
- "id": "f948151ab4031df4",
- "type": "function",
- "z": "baa1e3d9.cb29d",
- "name": "get sleep_before",
- "func": "msg.payload = msg.payload.sleep_before;\nreturn msg;",
- "outputs": 1,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 340,
- "y": 120,
- "wires": [
- [
- "49ea1123.ee1768"
- ]
- ]
- },
- {
- "id": "56971109c8be3b54",
- "type": "ui_text_input",
- "z": "cb95299c.2817c8",
- "name": "process_id",
- "label": "Process unique ID*",
- "tooltip": "",
- "group": "abeb6dad.635a2",
- "order": 2,
- "width": 10,
- "height": 1,
- "passthru": true,
- "mode": "text",
- "delay": 300,
- "topic": "process_id",
- "topicType": "str",
- "x": 790,
- "y": 380,
- "wires": [
- [
- "c8749cbb.55254"
- ]
- ]
- },
{
"id": "c67c305004f87e39",
"type": "change",
@@ -10462,7 +10797,7 @@
"delay": "1000",
"topic": "process_pixel_fixed",
"topicType": "str",
- "x": 650,
+ "x": 640,
"y": 480,
"wires": [
[
@@ -10546,7 +10881,7 @@
"payload": "",
"topic": "acq_fnumber_objective",
"topicType": "str",
- "x": 640,
+ "x": 630,
"y": 520,
"wires": [
[
@@ -10615,329 +10950,5 @@
"6146ba22df928516"
]
]
- },
- {
- "id": "335a730b9a3830ff",
- "type": "ui_template",
- "z": "bccd1f23.87219",
- "group": "4248342d.e55fac",
- "name": "Lens",
- "order": 3,
- "width": 0,
- "height": 0,
- "format": "\n Objective lens aperture: \n \n mm\n
",
- "storeOutMessages": true,
- "fwdInMessages": true,
- "resendOnRefresh": false,
- "templateScope": "local",
- "x": 1310,
- "y": 40,
- "wires": [
- []
- ]
- },
- {
- "id": "49111a72f4e32740",
- "type": "link out",
- "z": "f21ba04.c26266",
- "name": "IP",
- "links": [
- "142bc61a0bde1ba9",
- "c515edcd8681c244",
- "7fb91a7fd6d2518c",
- "604659d148759b84",
- "3bb4970164f5e7b2"
- ],
- "x": 1035,
- "y": 160,
- "wires": []
- },
- {
- "id": "142bc61a0bde1ba9",
- "type": "link in",
- "z": "bccd1f23.87219",
- "name": "Cam Stream",
- "links": [
- "49111a72f4e32740"
- ],
- "x": 235,
- "y": 40,
- "wires": [
- [
- "3ca8be38ddb269e9"
- ]
- ]
- },
- {
- "id": "3ca8be38ddb269e9",
- "type": "template",
- "z": "bccd1f23.87219",
- "name": "Prepare stream HTML",
- "field": "payload",
- "fieldType": "msg",
- "format": "handlebars",
- "syntax": "mustache",
- "template": "\n \n ",
- "output": "str",
- "x": 380,
- "y": 40,
- "wires": [
- [
- "6a84252a.d52a0c"
- ]
- ]
- },
- {
- "id": "c515edcd8681c244",
- "type": "link in",
- "z": "baa1e3d9.cb29d",
- "name": "Cam Stream",
- "links": [
- "49111a72f4e32740"
- ],
- "x": 275,
- "y": 20,
- "wires": [
- [
- "a77625dc21c8a3cc"
- ]
- ]
- },
- {
- "id": "a77625dc21c8a3cc",
- "type": "template",
- "z": "baa1e3d9.cb29d",
- "name": "Prepare stream HTML",
- "field": "payload",
- "fieldType": "msg",
- "format": "handlebars",
- "syntax": "mustache",
- "template": "\n \n ",
- "output": "str",
- "x": 420,
- "y": 20,
- "wires": [
- [
- "bb2bb7ce.1d1458"
- ]
- ]
- },
- {
- "id": "604659d148759b84",
- "type": "link in",
- "z": "cb95299c.2817c8",
- "name": "Cam Stream",
- "links": [
- "49111a72f4e32740"
- ],
- "x": 975,
- "y": 600,
- "wires": [
- [
- "e077b83ad375cb95"
- ]
- ]
- },
- {
- "id": "e077b83ad375cb95",
- "type": "template",
- "z": "cb95299c.2817c8",
- "name": "Prepare stream HTML",
- "field": "payload",
- "fieldType": "msg",
- "format": "handlebars",
- "syntax": "mustache",
- "template": "\n Latest object segmented: \n \n ",
- "output": "str",
- "x": 1120,
- "y": 600,
- "wires": [
- [
- "f078c068.eacf58"
- ]
- ]
- },
- {
- "id": "3bb4970164f5e7b2",
- "type": "link in",
- "z": "c1660bc.e7ff7f8",
- "name": "Cam Stream",
- "links": [
- "49111a72f4e32740"
- ],
- "x": 255,
- "y": 100,
- "wires": [
- [
- "2911fbc6.d28c24"
- ]
- ]
- },
- {
- "id": "3db572cd.cf972e",
- "type": "inject",
- "z": "f21ba04.c26266",
- "name": "once",
- "props": [
- {
- "p": "payload"
- },
- {
- "p": "topic",
- "vt": "str"
- }
- ],
- "repeat": "60",
- "crontab": "",
- "once": true,
- "onceDelay": "1",
- "topic": "",
- "payloadType": "date",
- "x": 270,
- "y": 180,
- "wires": [
- [
- "b9bf06d6.26c518",
- "4c0400c.69a1e8",
- "448b4c37.be50bc"
- ]
- ]
- },
- {
- "id": "88e05f37a8745216",
- "type": "json",
- "z": "f21ba04.c26266",
- "name": "",
- "property": "payload",
- "action": "obj",
- "pretty": false,
- "x": 590,
- "y": 180,
- "wires": [
- [
- "bcb20e39.00cea8"
- ]
- ]
- },
- {
- "id": "1aad56b31b5647ce",
- "type": "ui_text_input",
- "z": "b771c342.49603",
- "name": "acq_minimum_mesh",
- "label": "Minimal fraction size (μm)",
- "tooltip": "Net mesh pore size or minimal filtration mesh pore size",
- "group": "3e1ba03d.f01d8",
- "order": 7,
- "width": 5,
- "height": 1,
- "passthru": true,
- "mode": "number",
- "delay": 300,
- "topic": "acq_minimum_mesh",
- "topicType": "str",
- "x": 640,
- "y": 360,
- "wires": [
- [
- "9f501f49.45645"
- ]
- ]
- },
- {
- "id": "10eb31a2d7a6590c",
- "type": "ui_text_input",
- "z": "b771c342.49603",
- "name": "acq_maximum_mesh",
- "label": "Maximal fraction size (μm)",
- "tooltip": "Maximal filtration mesh pore size",
- "group": "3e1ba03d.f01d8",
- "order": 8,
- "width": 5,
- "height": 1,
- "passthru": true,
- "mode": "number",
- "delay": 300,
- "topic": "acq_maximum_mesh",
- "topicType": "str",
- "x": 640,
- "y": 400,
- "wires": [
- [
- "9f501f49.45645"
- ]
- ]
- },
- {
- "id": "f103cd20eb4362a4",
- "type": "function",
- "z": "f21ba04.c26266",
- "name": "check tab",
- "func": "if (msg.name === \"Wifi\"){\n return [msg, msg]\n}\n\nif ([\"Optic Configuration\", \"Fluidic Acquisition\", \"Segmentation\", \"Gallery\"].includes(msg.name)){\n return [null, msg]\n}",
- "outputs": 2,
- "noerr": 0,
- "initialize": "",
- "finalize": "",
- "libs": [],
- "x": 260,
- "y": 80,
- "wires": [
- [
- "b9bf06d6.26c518",
- "4c0400c.69a1e8",
- "448b4c37.be50bc"
- ],
- [
- "4c0400c.69a1e8",
- "448b4c37.be50bc"
- ]
- ],
- "outputLabels": [
- "interface",
- "ip"
- ]
- },
- {
- "id": "e640ebb5c397f424",
- "type": "delay",
- "z": "1371dec5.76e671",
- "name": "",
- "pauseType": "delay",
- "timeout": "1",
- "timeoutUnits": "seconds",
- "rate": "1",
- "nbRateUnits": "1",
- "rateUnits": "second",
- "randomFirst": "1",
- "randomLast": "5",
- "randomUnits": "seconds",
- "drop": false,
- "allowrate": false,
- "x": 1300,
- "y": 40,
- "wires": [
- [
- "b7ab1ada.1f4158"
- ]
- ]
- },
- {
- "id": "7fb13a4a53b612a0",
- "type": "rbe",
- "z": "1371dec5.76e671",
- "name": "",
- "func": "rbe",
- "gap": "",
- "start": "",
- "inout": "out",
- "septopics": true,
- "property": "payload",
- "topi": "topic",
- "x": 1010,
- "y": 40,
- "wires": [
- [
- "2549f778.4eb828"
- ]
- ]
}
]
\ No newline at end of file