From 6e2e526e9ce3e82014b622dd5cbfbab65cb6be9a Mon Sep 17 00:00:00 2001 From: Romain Bazile Date: Fri, 3 Dec 2021 02:34:14 +0100 Subject: [PATCH] Flow: update for new Node version --- flows/main.json | 15595 +++++++++++++++++++++++----------------------- 1 file changed, 7803 insertions(+), 7792 deletions(-) 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 \n \n \n \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

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

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

Process

\n

pixel:

\n

id:

\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 \n \n
{{row}}
\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 \"If\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 \n \n \n \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

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

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

Process

\n

pixel:

\n

id:

\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 \"If\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 \"If\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 \n \n
{{row}}
\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 \"If\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 \"If\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 \"If\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