From 156286a8daadba53312b7da011bdd3f2ac236a2c Mon Sep 17 00:00:00 2001 From: Romain Bazile Date: Sun, 29 Nov 2020 23:44:09 +0100 Subject: [PATCH] add sample_gear_net_opening and sample_concentrated_sample_volume improve #44 --- flows/main.json | 498 ++++++++++++++++++---------------- scripts/planktoscope/light.py | 219 ++++++++++----- 2 files changed, 416 insertions(+), 301 deletions(-) diff --git a/flows/main.json b/flows/main.json index a715a24..6002b41 100644 --- a/flows/main.json +++ b/flows/main.json @@ -360,7 +360,7 @@ "tab": "737ec584.2eea2c", "order": 1, "disp": true, - "width": 11, + "width": 10, "collapse": false }, { @@ -512,7 +512,7 @@ "type": "ui_group", "name": "Danger Zone (DO NOT TOUCH HERE UNLESS YOU KNOW WHAT YOU ARE DOING)", "tab": "d9cd733b.ab73d", - "order": 5, + "order": 7, "disp": true, "width": 24, "collapse": false @@ -523,9 +523,9 @@ "z": "", "name": "Navigation", "tab": "d9cd733b.ab73d", - "order": 7, + "order": 6, "disp": false, - "width": "24", + "width": 10, "collapse": false }, { @@ -594,84 +594,21 @@ "id": "cf5d9f0e.d57e7", "type": "ui_group", "z": "", - "name": "Sample Net Location", + "name": "Net Metadata", "tab": "737ec584.2eea2c", "order": 3, "disp": true, "width": "10", "collapse": false }, - { - "id": "5a0e69ac.725268", - "type": "ui_spacer", - "name": "spacer", - "group": "3ca00bf9.e5cac4", - "order": 2, - "width": 1, - "height": 1 - }, - { - "id": "ca7a56b3.89805", - "type": "ui_spacer", - "name": "spacer", - "group": "3ca00bf9.e5cac4", - "order": 5, - "width": 1, - "height": 1 - }, - { - "id": "aab3b337.985c98", - "type": "ui_spacer", - "name": "spacer", - "group": "1be83144.4fe4bf", - "order": 2, - "width": 9, - "height": 1 - }, - { - "id": "5324b3d4.72d6d4", - "type": "ui_spacer", - "name": "spacer", - "group": "1be83144.4fe4bf", - "order": 4, - "width": 9, - "height": 1 - }, - { - "id": "8780f7f3.52ee5", - "type": "ui_spacer", - "name": "spacer", - "group": "1be83144.4fe4bf", - "order": 5, - "width": 9, - "height": 1 - }, - { - "id": "5e847442.3e340c", - "type": "ui_spacer", - "name": "spacer", - "group": "1be83144.4fe4bf", - "order": 7, - "width": 9, - "height": 1 - }, - { - "id": "cc4fe53d.f4dc4", - "type": "ui_spacer", - "name": "spacer", - "group": "1be83144.4fe4bf", - "order": 9, - "width": 10, - "height": 1 - }, { "id": "ce9e278.781eed8", "type": "ui_group", "name": "Information", "tab": "d9cd733b.ab73d", - "order": 6, + "order": 5, "disp": true, - "width": "6", + "width": 10, "collapse": false }, { @@ -716,24 +653,6 @@ "width": 1, "height": 1 }, - { - "id": "894786f4.7552b8", - "type": "ui_spacer", - "name": "spacer", - "group": "3e1ba03d.f01d8", - "order": 7, - "width": 1, - "height": 1 - }, - { - "id": "5835ad3b.5e9ff4", - "type": "ui_spacer", - "name": "spacer", - "group": "cf5d9f0e.d57e7", - "order": 12, - "width": 4, - "height": 1 - }, { "id": "b001a150.faa548", "type": "ui_spacer", @@ -762,7 +681,79 @@ "height": 1 }, { - "id": "de621043.b31528", + "id": "9715083f.10e3", + "type": "ui_spacer", + "name": "spacer", + "group": "3ca00bf9.e5cac4", + "order": 2, + "width": 2, + "height": 1 + }, + { + "id": "c4f96e9a.09e738", + "type": "ui_spacer", + "name": "spacer", + "group": "1be83144.4fe4bf", + "order": 2, + "width": 9, + "height": 1 + }, + { + "id": "8c6ed0ee.25b9b8", + "type": "ui_spacer", + "name": "spacer", + "group": "1be83144.4fe4bf", + "order": 4, + "width": 9, + "height": 1 + }, + { + "id": "91f16338.34b4e", + "type": "ui_spacer", + "name": "spacer", + "group": "1be83144.4fe4bf", + "order": 5, + "width": 9, + "height": 1 + }, + { + "id": "6c77293e.422168", + "type": "ui_spacer", + "name": "spacer", + "group": "1be83144.4fe4bf", + "order": 7, + "width": 9, + "height": 1 + }, + { + "id": "3c649b0d.73c95c", + "type": "ui_spacer", + "name": "spacer", + "group": "1be83144.4fe4bf", + "order": 9, + "width": 10, + "height": 1 + }, + { + "id": "61cbfe72.ee8ef", + "type": "ui_spacer", + "name": "spacer", + "group": "3e1ba03d.f01d8", + "order": 9, + "width": 5, + "height": 1 + }, + { + "id": "41a8079d.95ce48", + "type": "ui_spacer", + "name": "spacer", + "group": "cf5d9f0e.d57e7", + "order": 13, + "width": 4, + "height": 1 + }, + { + "id": "90a195f8.0f1008", "type": "ui_spacer", "name": "spacer", "group": "4322c187.e73e5", @@ -771,34 +762,61 @@ "height": 1 }, { - "id": "b0a2c4ff.ce75b", + "id": "57c4bb5c.952d9c", "type": "ui_spacer", "name": "spacer", "group": "b5d61bc7.54fe48", "order": 2, - "width": 6, + "width": 2, "height": 1 }, { - "id": "f1326cca.4ab1f", + "id": "da6aee4f.4575e", "type": "ui_spacer", "name": "spacer", "group": "b5d61bc7.54fe48", - "order": 3, - "width": 1, + "order": 4, + "width": 2, "height": 1 }, { - "id": "a27ea76d.b9989", + "id": "d517ce18.9f4d28", "type": "ui_spacer", "name": "spacer", "group": "b5d61bc7.54fe48", "order": 5, - "width": 1, + "width": 2, "height": 1 }, { - "id": "17a79a42.2912ce", + "id": "200200fa.7e301", + "type": "ui_spacer", + "name": "spacer", + "group": "b5d61bc7.54fe48", + "order": 6, + "width": 2, + "height": 1 + }, + { + "id": "fd54e34d.f85e", + "type": "ui_spacer", + "name": "spacer", + "group": "b5d61bc7.54fe48", + "order": 7, + "width": 2, + "height": 1 + }, + { + "id": "613f1f0a.5ff3e", + "type": "ui_spacer", + "name": "spacer", + "group": "b5d61bc7.54fe48", + "order": 8, + "width": 2, + "height": 1 + }, + { + "id": "7bedf48.6e15f0c", "type": "ui_spacer", "name": "spacer", "group": "b7919ae2.c01788", @@ -879,7 +897,7 @@ "name": "", "group": "3ca00bf9.e5cac4", "order": 1, - "width": 4, + "width": 5, "height": 1, "passthru": false, "label": "Home", @@ -952,8 +970,7 @@ [ "bc503fa5.f46dd", "2c8c45ab.610c0a", - "cef370c7.1f7a", - "11b51f8f.acd308" + "cef370c7.1f7a" ], [], [] @@ -1311,7 +1328,7 @@ "label": "Fan", "tooltip": "", "group": "3ca00bf9.e5cac4", - "order": 6, + "order": 3, "width": 3, "height": 1, "passthru": true, @@ -1463,7 +1480,7 @@ "rules": [ { "t": "gt", - "v": "50", + "v": "40", "vt": "num" }, { @@ -2109,8 +2126,8 @@ "z": "b771c342.49603", "name": "", "events": "change", - "x": 440, - "y": 1180, + "x": 460, + "y": 1300, "wires": [ [] ] @@ -2129,8 +2146,8 @@ "raw": false, "topic": "", "name": "", - "x": 850, - "y": 1300, + "x": 870, + "y": 1420, "wires": [ [] ] @@ -2145,8 +2162,8 @@ "noerr": 0, "initialize": "", "finalize": "", - "x": 450, - "y": 1240, + "x": 470, + "y": 1360, "wires": [ [ "f5e66a2f.0d09d8" @@ -2178,8 +2195,8 @@ "z": "b771c342.49603", "name": "", "events": "change", - "x": 840, - "y": 1220, + "x": 860, + "y": 1340, "wires": [ [] ] @@ -2206,8 +2223,8 @@ "checkall": "true", "repair": false, "outputs": 2, - "x": 610, - "y": 1240, + "x": 630, + "y": 1360, "wires": [ [ "726a7822.cd6298", @@ -2226,7 +2243,7 @@ "label": "Latitude", "tooltip": "36°57'9\" N", "group": "cf5d9f0e.d57e7", - "order": 2, + "order": 3, "width": 5, "height": 1, "passthru": true, @@ -2234,7 +2251,7 @@ "delay": 300, "topic": "object_lat", "x": 680, - "y": 780, + "y": 860, "wires": [ [ "42795da1.0ee104" @@ -2249,7 +2266,7 @@ "label": "Longitude", "tooltip": "110°4'21\" W", "group": "cf5d9f0e.d57e7", - "order": 3, + "order": 4, "width": 5, "height": 1, "passthru": true, @@ -2257,7 +2274,7 @@ "delay": 300, "topic": "object_lon", "x": 680, - "y": 820, + "y": 900, "wires": [ [ "42795da1.0ee104" @@ -2271,13 +2288,13 @@ "name": "object_date", "label": "Date", "group": "cf5d9f0e.d57e7", - "order": 4, + "order": 5, "width": 5, "height": 1, "passthru": true, "topic": "object_date", "x": 670, - "y": 860, + "y": 940, "wires": [ [ "29f2b365.4327ec" @@ -2292,7 +2309,7 @@ "label": "Time", "tooltip": "UTC time, 03:23:00 or 15:45", "group": "cf5d9f0e.d57e7", - "order": 5, + "order": 6, "width": 5, "height": 1, "passthru": true, @@ -2300,7 +2317,7 @@ "delay": 300, "topic": "object_time", "x": 670, - "y": 900, + "y": 980, "wires": [ [ "1a945afa.d60aad" @@ -2753,8 +2770,8 @@ "payload": "{\"tab\":\"Home\"}", "payloadType": "json", "topic": "", - "x": 280, - "y": 1180, + "x": 300, + "y": 1300, "wires": [ [ "222c851d.5d0a3a" @@ -2779,8 +2796,8 @@ "payload": "{\"tab\":\"Home\"}", "payloadType": "json", "topic": "", - "x": 280, - "y": 1240, + "x": 300, + "y": 1360, "wires": [ [ "986d960a.c75908" @@ -2893,16 +2910,16 @@ "type": "ui_template", "z": "baa1e3d9.cb29d", "group": "b5d61bc7.54fe48", - "name": "show global", - "order": 6, + "name": "Show Metadata", + "order": 9, "width": 0, "height": 0, - "format": "
\n Sample Project:
\n Sample Ship:
\n sample operator:
\n sample id:
\n sample sampling_gear:
\n\n acq id:
\n acq instrument:
\n acq instrument_id:
\n acq camera:
\n acq celltype:
\n acq minimum_mesh:
\n acq maximum_mesh:
\n acq min_esd:
\n acq max_esd:
\n acq volume:
\n acq magnification:
\n acq fnumber_objective:
\n acq software:
\n acq flowrate:
\n\n object lat:
\n object lon:
\n object lat end:
\n object lon end:
\n object date:
\n object time:
\n object date end:
\n object time end:
\n object depth min:
\n object depth max:
\n\n process pixel:
\n process id: \n
\n", - "storeOutMessages": true, - "fwdInMessages": true, + "format": "
\n \n \n \n \n \n \n \n \n \n
\n

Sample


\n project:
\n ship:
\n operator:
\n id:
\n sampling gear:
\n concentrated volume:
\n gear net opening:
\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 flowrate:
\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

Process


\n pixel:
\n id:
\n
", + "storeOutMessages": false, + "fwdInMessages": false, "resendOnRefresh": false, "templateScope": "local", - "x": 1250, + "x": 1260, "y": 500, "wires": [ [] @@ -3854,7 +3871,7 @@ "type": "ui_template", "z": "1371dec5.76e671", "group": "1be83144.4fe4bf", - "name": "", + "name": "Update message", "order": 1, "width": 0, "height": 0, @@ -3863,7 +3880,7 @@ "fwdInMessages": true, "resendOnRefresh": true, "templateScope": "local", - "x": 100, + "x": 130, "y": 460, "wires": [ [] @@ -4056,7 +4073,7 @@ "type": "function", "z": "baa1e3d9.cb29d", "name": "Encapsulate config", - "func": "if (global.get(\"sample_sampling_gear\")==\"net\") {\n msg.payload = {\n \"action\":\"update_config\", \n \"config\":{\n \"sample_project\":global.get(\"sample_project\"),\n \"sample_id\":global.get(\"sample_id\"),\n \"sample_ship\":global.get(\"sample_ship\"),\n \"sample_operator\":global.get(\"sample_operator\"),\n \"sample_sampling_gear\":global.get(\"sample_sampling_gear\"),\n \n \"acq_id\":global.get(\"acq_id\"),\n \"acq_instrument\":global.get(\"acq_instrument\"),\n \"acq_instrument_id\":global.get(\"acq_instrument_id\"),\n \"acq_celltype\":global.get(\"acq_celltype\"),\n \"acq_minimum_mesh\":global.get(\"acq_minimum_mesh\"),\n \"acq_maximum_mesh\":global.get(\"acq_maximum_mesh\"),\n \"acq_min_esd\":global.get(\"acq_min_esd\"),\n \"acq_max_esd\":global.get(\"acq_max_esd\"),\n \"acq_volume\":global.get(\"acq_volume\"),\n \"acq_magnification\":global.get(\"magnification\"),\n \"acq_fnumber_objective\":global.get(\"acq_fnumber_objective\"),\n \"acq_camera_name\":global.get(\"acq_camera_name\"),\n \"acq_imaged_volume\":global.get(\"acq_imaged_volume\"),\n \"acq_nb_frame\":global.get(\"nb_frame\"),\n \n \"object_date\":global.get(\"object_date\"),\n \"object_time\":global.get(\"object_time\"),\n \"object_lat\":global.get(\"object_lat\"),\n \"object_lon\":global.get(\"object_lon\"),\n \"object_date_end\":global.get(\"object_date_end\"),\n \"object_time_end\":global.get(\"object_time_end\"),\n \"object_lat_end\":global.get(\"object_lat_end\"),\n \"object_lon_end\":global.get(\"object_lon_end\"),\n \"object_depth_min\":global.get(\"object_depth_min\"),\n \"object_depth_max\":global.get(\"object_depth_max\"),\n \n \"process_pixel\":global.get(\"process_pixel\"),\n \"process_id\":global.get(\"process_id\")\n }\n };\n}\nelse {\n msg.payload = {\n \"action\":\"update_config\", \n \"config\":{\n \"sample_project\":global.get(\"sample_project\"),\n \"sample_id\":global.get(\"sample_id\"),\n \"sample_ship\":global.get(\"sample_ship\"),\n \"sample_operator\":global.get(\"sample_operator\"),\n \"sample_sampling_gear\":global.get(\"sample_sampling_gear\"),\n \n \"acq_id\":global.get(\"acq_id\"),\n \"acq_instrument\":global.get(\"acq_instrument\"),\n \"acq_instrument_id\":global.get(\"acq_instrument_id\"),\n \"acq_celltype\":global.get(\"acq_celltype\"),\n \"acq_minimum_mesh\":global.get(\"acq_minimum_mesh\"),\n \"acq_maximum_mesh\":global.get(\"acq_maximum_mesh\"),\n \"acq_min_esd\":global.get(\"acq_min_esd\"),\n \"acq_max_esd\":global.get(\"acq_max_esd\"),\n \"acq_volume\":global.get(\"acq_volume\"),\n \"acq_magnification\":global.get(\"magnification\"),\n \"acq_fnumber_objective\":global.get(\"acq_fnumber_objective\"),\n \"acq_camera_name\":global.get(\"acq_camera_name\"),\n \"acq_nb_frame\":global.get(\"nb_frame\"),\n \n \"object_date\":global.get(\"object_date\"),\n \"object_time\":global.get(\"object_time\"),\n \"object_lat\":global.get(\"object_lat\"),\n \"object_lon\":global.get(\"object_lon\"),\n \"object_depth_min\":global.get(\"object_depth_min\"),\n \"object_depth_max\":global.get(\"object_depth_max\"),\n \n \"process_pixel\":global.get(\"process_pixel\"),\n \"process_id\":global.get(\"process_id\")\n }\n };\n}\nreturn msg;", + "func": "msg.payload = {\n\t\"action\": \"update_config\",\n\t\"config\": {\n\t\t\"sample_project\": global.get(\"sample_project\"),\n\t\t\"sample_id\": 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\n\t\t\"acq_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_magnification\": global.get(\"magnification\"),\n\t\t\"acq_fnumber_objective\": global.get(\"acq_fnumber_objective\"),\n\t\t\"acq_camera_name\": global.get(\"acq_camera_name\"),\n\t\t\"acq_nb_frame\": global.get(\"nb_frame\"),\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_id\": global.get(\"process_id\")\n\t}\n};\n\nif (msg.payload.config.sample_sampling_gear == \"net\") {\n\tmsg.payload.config = { ...msg.payload.config ,\n\t\t\t\"sample_gear_net_opening\": global.get(\"sample_gear_net_opening\"),\n\t\t\t\"object_date_end\": global.get(\"object_date_end\"),\n\t\t\t\"object_time_end\": global.get(\"object_time_end\"),\n\t\t\t\"object_lat_end\": global.get(\"object_lat_end\"),\n\t\t\t\"object_lon_end\": global.get(\"object_lon_end\")\n\t};\n}\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", @@ -4163,7 +4180,7 @@ "level": "1", "freq": "", "out": "out", - "x": 470, + "x": 480, "y": 600, "wires": [] }, @@ -4430,8 +4447,8 @@ "z": "b771c342.49603", "name": "", "env": [], - "x": 830, - "y": 1260, + "x": 850, + "y": 1380, "wires": [ [] ] @@ -4444,7 +4461,7 @@ "label": "Latitude", "tooltip": "36°57'9\" N", "group": "cf5d9f0e.d57e7", - "order": 7, + "order": 8, "width": 5, "height": 1, "passthru": true, @@ -4452,7 +4469,7 @@ "delay": 300, "topic": "object_lat_end", "x": 660, - "y": 980, + "y": 1060, "wires": [ [ "42795da1.0ee104" @@ -4467,7 +4484,7 @@ "label": "Longitude", "tooltip": "110°4'21\" W", "group": "cf5d9f0e.d57e7", - "order": 8, + "order": 9, "width": 5, "height": 1, "passthru": true, @@ -4475,7 +4492,7 @@ "delay": 300, "topic": "object_lon_end", "x": 660, - "y": 1020, + "y": 1100, "wires": [ [ "42795da1.0ee104" @@ -4489,13 +4506,13 @@ "name": "object_date_end", "label": "Date", "group": "cf5d9f0e.d57e7", - "order": 9, + "order": 11, "width": 5, "height": 1, "passthru": true, "topic": "object_date_end", "x": 660, - "y": 1060, + "y": 1140, "wires": [ [ "29f2b365.4327ec" @@ -4518,7 +4535,7 @@ "delay": 300, "topic": "object_time_end", "x": 660, - "y": 1100, + "y": 1180, "wires": [ [ "1a945afa.d60aad" @@ -4536,7 +4553,7 @@ "initialize": "", "finalize": "", "x": 960, - "y": 840, + "y": 920, "wires": [ [] ] @@ -4552,7 +4569,7 @@ "initialize": "", "finalize": "", "x": 960, - "y": 800, + "y": 880, "wires": [ [] ] @@ -4733,7 +4750,7 @@ "type": "ui_text", "z": "1371dec5.76e671", "group": "ce9e278.781eed8", - "order": 3, + "order": 4, "width": 0, "height": 0, "name": "", @@ -4749,7 +4766,7 @@ "type": "ui_text", "z": "1371dec5.76e671", "group": "ce9e278.781eed8", - "order": 0, + "order": 1, "width": 0, "height": 0, "name": "", @@ -4765,7 +4782,7 @@ "type": "ui_text", "z": "1371dec5.76e671", "group": "ce9e278.781eed8", - "order": 1, + "order": 3, "width": 0, "height": 0, "name": "", @@ -4781,7 +4798,7 @@ "type": "ui_text", "z": "1371dec5.76e671", "group": "ce9e278.781eed8", - "order": 0, + "order": 2, "width": 0, "height": 0, "name": "", @@ -4839,7 +4856,7 @@ "z": "b771c342.49603", "d": true, "group": "cf5d9f0e.d57e7", - "order": 11, + "order": 12, "width": 6, "height": 1, "name": "GPS Status Display", @@ -4860,8 +4877,8 @@ "noerr": 0, "initialize": "", "finalize": "", - "x": 230, - "y": 560, + "x": 950, + "y": 800, "wires": [ [] ] @@ -4981,7 +4998,7 @@ "initialize": "", "finalize": "", "x": 980, - "y": 760, + "y": 840, "wires": [ [ "9f501f49.45645" @@ -5060,7 +5077,7 @@ "label": "Object depth Max", "tooltip": "", "group": "3e1ba03d.f01d8", - "order": 8, + "order": 7, "width": 5, "height": 1, "passthru": true, @@ -5068,7 +5085,7 @@ "delay": 300, "topic": "object_depth_max", "x": 650, - "y": 500, + "y": 540, "wires": [ [ "9f501f49.45645" @@ -5091,7 +5108,7 @@ "delay": 300, "topic": "object_depth_min", "x": 650, - "y": 540, + "y": 580, "wires": [ [ "9f501f49.45645" @@ -5324,10 +5341,9 @@ "initialize": "", "finalize": "", "x": 1140, - "y": 1100, + "y": 1080, "wires": [ [ - "b7c3a3ad.9bf32", "39812a27.6cb10e" ] ] @@ -5398,33 +5414,17 @@ ] ] }, - { - "id": "b7c3a3ad.9bf32", - "type": "ui_text", - "z": "baa1e3d9.cb29d", - "group": "b5d61bc7.54fe48", - "order": 4, - "width": 5, - "height": 2, - "name": "Image Count", - "label": "Images count", - "format": "{{msg.payload}}", - "layout": "col-center", - "x": 1590, - "y": 1120, - "wires": [] - }, { "id": "1a2e721a.f5e876", "type": "ui_gauge", "z": "baa1e3d9.cb29d", - "name": "Image Donut", + "name": "progress donut", "group": "b5d61bc7.54fe48", - "order": 1, - "width": 4, + "order": 3, + "width": 6, "height": 3, "gtype": "donut", - "title": "progress", + "title": "", "label": "%", "format": "{{value}}", "min": 0, @@ -5436,7 +5436,7 @@ ], "seg1": "50", "seg2": "75", - "x": 1590, + "x": 1600, "y": 1080, "wires": [] }, @@ -5450,7 +5450,7 @@ "noerr": 0, "initialize": "", "finalize": "", - "x": 1400, + "x": 1380, "y": 1080, "wires": [ [ @@ -5458,53 +5458,6 @@ ] ] }, - { - "id": "1585d7e9.ea2d28", - "type": "function", - "z": "baa1e3d9.cb29d", - "name": "img_counter init", - "func": "img_counter=0\nglobal.set('img_counter',img_counter)\nmsg.payload = img_counter\nreturn msg;", - "outputs": 1, - "noerr": 0, - "initialize": "", - "finalize": "", - "x": 1340, - "y": 1160, - "wires": [ - [ - "b7c3a3ad.9bf32" - ] - ] - }, - { - "id": "e1a2f1b3.fe1758", - "type": "inject", - "z": "baa1e3d9.cb29d", - "name": "Init graphs", - "props": [ - { - "p": "payload" - }, - { - "p": "topic", - "vt": "str" - } - ], - "repeat": "", - "crontab": "", - "once": true, - "onceDelay": 0.1, - "topic": "", - "payload": "0", - "payloadType": "num", - "x": 1130, - "y": 1160, - "wires": [ - [ - "1585d7e9.ea2d28" - ] - ] - }, { "id": "8f3788f6.ddcf98", "type": "function", @@ -6337,8 +6290,9 @@ "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\nif temp <= 35:\n bus.write_byte_data(addr, fan_reg, 0x00)\nelif temp <= 38:\n bus.write_byte_data(addr, fan_reg, 0x05)\nelif temp <= 43:\n bus.write_byte_data(addr, fan_reg, 0x07)\nelif temp <= 48:\n bus.write_byte_data(addr, fan_reg, 0x08)\nelif temp <= 52:\n bus.write_byte_data(addr, fan_reg, 0x09)\nelse:\n bus.write_byte_data(addr, fan_reg, 0x01)\n\nreturn msg", + "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": 1120, "y": 100, @@ -6387,7 +6341,7 @@ "t": "set", "p": "payload", "pt": "msg", - "to": "{\"group\":{\"show\":[\"Sample_Sample_Net_Location\"],\"hide\":[\"Sample_Sample_Location\"]}}", + "to": "{\"group\":{\"show\":[\"Sample_Net_Metadata\"],\"hide\":[\"Sample_Sample_Location\"]}}", "tot": "json" }, { @@ -6421,7 +6375,7 @@ "t": "set", "p": "payload", "pt": "msg", - "to": "{\"group\":{\"hide\":[\"Sample_Sample_Net_Location\"],\"show\":[\"Sample_Sample_Location\"]}}", + "to": "{\"group\":{\"hide\":[\"Sample_Net_Metadata\"],\"show\":[\"Sample_Sample_Location\"]}}", "tot": "json" }, { @@ -6473,7 +6427,7 @@ "delay": 300, "topic": "object_lat", "x": 680, - "y": 580, + "y": 660, "wires": [ [ "42795da1.0ee104" @@ -6496,7 +6450,7 @@ "delay": 300, "topic": "object_lon", "x": 680, - "y": 620, + "y": 700, "wires": [ [ "42795da1.0ee104" @@ -6516,7 +6470,7 @@ "passthru": true, "topic": "object_date", "x": 670, - "y": 660, + "y": 740, "wires": [ [ "29f2b365.4327ec" @@ -6539,7 +6493,7 @@ "delay": 300, "topic": "object_time", "x": 670, - "y": 700, + "y": 780, "wires": [ [ "1a945afa.d60aad" @@ -6552,7 +6506,7 @@ "z": "b771c342.49603", "group": "cf5d9f0e.d57e7", "name": "Net throw location", - "order": 1, + "order": 2, "width": 0, "height": 0, "format": "

Net throw location

", @@ -6561,7 +6515,7 @@ "resendOnRefresh": true, "templateScope": "local", "x": 650, - "y": 740, + "y": 820, "wires": [ [] ] @@ -6572,7 +6526,7 @@ "z": "b771c342.49603", "group": "cf5d9f0e.d57e7", "name": "Net throw retrieval", - "order": 6, + "order": 7, "width": 0, "height": 0, "format": "

Net throw retrieval

", @@ -6581,7 +6535,7 @@ "resendOnRefresh": true, "templateScope": "local", "x": 650, - "y": 940, + "y": 1020, "wires": [ [] ] @@ -6731,7 +6685,7 @@ "order": 1, "width": 24, "height": 24, - "format": "
\n \n
\n
", + "format": "
\n
\n \n
\n
", "storeOutMessages": true, "fwdInMessages": true, "resendOnRefresh": false, @@ -6757,5 +6711,71 @@ "99b11fe4.2795d" ] ] + }, + { + "id": "642ff403.1ed91c", + "type": "ui_text_input", + "z": "b771c342.49603", + "name": "sample_concentrated_sample_volume", + "label": "Concentrated sample volume", + "tooltip": "Volume extracted from the net", + "group": "3e1ba03d.f01d8", + "order": 8, + "width": 5, + "height": 1, + "passthru": true, + "mode": "number", + "delay": 300, + "topic": "sample_concentrated_sample_volume", + "x": 590, + "y": 500, + "wires": [ + [ + "9f501f49.45645" + ] + ] + }, + { + "id": "e967b844.46aa48", + "type": "ui_text_input", + "z": "b771c342.49603", + "name": "sample_gear_net_opening", + "label": "Net opening", + "tooltip": "in mm", + "group": "cf5d9f0e.d57e7", + "order": 1, + "width": 10, + "height": 1, + "passthru": true, + "mode": "number", + "delay": 300, + "topic": "sample_gear_net_opening", + "x": 620, + "y": 620, + "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": 1610, + "y": 1040, + "wires": [ + [] + ] } ] \ No newline at end of file diff --git a/scripts/planktoscope/light.py b/scripts/planktoscope/light.py index 8024e04..9432b79 100644 --- a/scripts/planktoscope/light.py +++ b/scripts/planktoscope/light.py @@ -8,25 +8,55 @@ # Logger library compatible with multiprocessing from loguru import logger -# Library to send command over I2C for the light module on the fan -import smbus -import RPi.GPIO import subprocess # nosec -# define the bus used to actuate the light module on the fan -bus = smbus.SMBus(1) +# Library to send command over I2C for the light module on the fan +try: + import smbus2 as smbus +except ModuleNotFoundError: + subprocess.Popen("pip3 install smbus2".split(), stdout=subprocess.PIPE) # nosec + import smbus2 as smbus + +import enum DEVICE_ADDRESS = 0x0D -rgb_effect_reg = 0x04 -rgb_speed_reg = 0x05 -rgb_color_reg = 0x06 -rgb_off_reg = 0x07 + + +@enum.unique +class Register(enum.IntEnum): + led_select = 0x00 + red = 0x01 + green = 0x02 + blue = 0x03 + rgb_effect = 0x04 + rgb_speed = 0x05 + rgb_color = 0x06 + rgb_off = 0x07 + + +@enum.unique +class Effect(enum.IntEnum): + Water = 0 + Breathing = 1 + Marquee = 2 + Rainbow = 3 + Colorful = 4 + + +@enum.unique +class EffectColor(enum.IntEnum): + Red = 0 + Green = 1 + Blue = 2 + Yellow = 3 + Purple = 4 + Cyan = 5 + White = 6 + ################################################################################ # LEDs functions ################################################################################ - - def i2c_update(): # Update the I2C Bus in order to really update the LEDs new values subprocess.Popen("i2cdetect -y 1".split(), stdout=subprocess.PIPE) # nosec @@ -35,11 +65,14 @@ def i2c_update(): def setRGB(R, G, B): """Update all LED at the same time""" try: - bus.write_byte_data(DEVICE_ADDRESS, 0x00, 0xFF) - bus.write_byte_data(DEVICE_ADDRESS, 0x01, R & 0xFF) - bus.write_byte_data(DEVICE_ADDRESS, 0x02, G & 0xFF) - bus.write_byte_data(DEVICE_ADDRESS, 0x03, B & 0xFF) - i2c_update() + with smbus.SMBus(1) as bus: + bus.write_byte_data( + DEVICE_ADDRESS, Register.led_select, 0xFF + ) # 0xFF write to all LEDs, 0x01/0x02/0x03 to choose first, second or third LED + bus.write_byte_data(DEVICE_ADDRESS, Register.red, R & 0xFF) + bus.write_byte_data(DEVICE_ADDRESS, Register.green, G & 0xFF) + bus.write_byte_data(DEVICE_ADDRESS, Register.blue, B & 0xFF) + # i2c_update() except Exception as e: logger.exception(f"An Exception has occured in the light library at {e}") @@ -47,81 +80,143 @@ def setRGB(R, G, B): def setRGBOff(): """Turn off the RGB LED""" try: - bus.write_byte_data(DEVICE_ADDRESS, 0x07, 0x00) - i2c_update() + with smbus.SMBus(1) as bus: + bus.write_byte_data(DEVICE_ADDRESS, Register.rgb_off, 0x00) + # i2c_update() except Exception as e: logger.exception(f"An Exception has occured in the light library at {e}") -def setRGBEffect(effect): - """Choose an effect, 0-4 +def setRGBEffect(bus, effect): + """Choose an effect, type Effect - 0: Water light - 1: Breathing light - 2: Marquee - 3: Rainbow lights - 4: Colorful lights + Effect.Water: Rotating color between LEDs (color has an effect) + Effect.Breathing: Breathing color effect + Effect.Marquee: Flashing color transition between all LEDs + Effect.Rainbow: Smooth color transition between all LEDs + Effect.Colorful: Colorful transition separately between all LEDs """ - - if effect >= 0 and effect <= 4: + if effect in Effect: try: - bus.write_byte_data(DEVICE_ADDRESS, rgb_effect_reg, effect & 0xFF) + bus.write_byte_data(DEVICE_ADDRESS, Register.rgb_effect, effect & 0xFF) except Exception as e: logger.exception(f"An Exception has occured in the light library at {e}") -def setRGBSpeed(speed): +def setRGBSpeed(bus, speed): """Set the effect speed, 1-3, 3 being the fastest speed""" - if speed >= 1 and speed <= 3: + if 1 <= speed <= 3: try: - bus.write_byte_data(DEVICE_ADDRESS, rgb_speed_reg, speed & 0xFF) + bus.write_byte_data(DEVICE_ADDRESS, Register.rgb_speed, speed & 0xFF) except Exception as e: logger.exception(f"An Exception has occured in the light library at {e}") -def setRGBColor(color): - """Set the color of the water light and breathing light effect, 0-6 +def setRGBColor(bus, color): + """Set the color of the water light and breathing light effect, of type EffectColor - 0: Red - 1: Green (default) - 2: Blue - 3: Yellow - 4: Purple - 5: Cyan - 6: White + EffectColor.Red, EffectColor.Green (default), EffectColor.Blue, EffectColor.Yellow, + EffectColor.Purple, EffectColor.Cyan, EffectColor.White """ - - if color >= 0 and color <= 6: + if color in EffectColor: try: - bus.write_byte_data(DEVICE_ADDRESS, rgb_color_reg, color & 0xFF) + bus.write_byte_data(DEVICE_ADDRESS, Register.rgb_color, color & 0xFF) except Exception as e: logger.exception(f"An Exception has occured in the light library at {e}") -def light(state): - """Turn the LED on or off""" - - if state == "on": - RPi.GPIO.output(21, RPi.GPIO.HIGH) - elif state == "off": - RPi.GPIO.output(21, RPi.GPIO.LOW) +def ready(): + with smbus.SMBus(1) as bus: + setRGBColor(bus, EffectColor.Green) + setRGBSpeed(bus, 1) + setRGBEffect(bus, Effect.Breathing) + # i2c_update() -## Wait message: Green -## Actuate message: White -## Pumping message: Blue -## Pumping 2 message: BLue + Green +def error(): + with smbus.SMBus(1) as bus: + setRGBColor(bus, EffectColor.Red) + setRGBSpeed(bus, 3) + setRGBEffect(bus, Effect.Water) + # i2c_update() + + +def interrupted(): + with smbus.SMBus(1) as bus: + setRGBColor(bus, EffectColor.Yellow) + setRGBSpeed(bus, 3) + setRGBEffect(bus, Effect.Water) + # i2c_update() + + +def pumping(): + with smbus.SMBus(1) as bus: + setRGBColor(bus, EffectColor.Blue) + setRGBSpeed(bus, 3) + setRGBEffect(bus, Effect.Water) + # i2c_update() + + +def focusing(): + with smbus.SMBus(1) as bus: + setRGBColor(bus, EffectColor.Purple) + setRGBSpeed(bus, 3) + setRGBEffect(bus, Effect.Water) + # i2c_update() + + +def imaging(): + with smbus.SMBus(1) as bus: + setRGBColor(bus, EffectColor.White) + setRGBSpeed(bus, 1) + setRGBEffect(bus, Effect.Breathing) + # i2c_update() + + +def segmenting(): + with smbus.SMBus(1) as bus: + setRGBColor(bus, EffectColor.Purple) + setRGBSpeed(bus, 1) + setRGBEffect(bus, Effect.Breathing) + # i2c_update() + # This is called if this script is launched directly if __name__ == "__main__": # TODO This should be a test suite for this library - import RPi.GPIO as GPIO - import sys + import time - GPIO.setmode(GPIO.BCM) - GPIO.setwarnings(False) - GPIO.setup(21, GPIO.OUT) + print("ready") + ready() + time.sleep(10) + print("error") + error() + time.sleep(10) + print("pumping") + pumping() + time.sleep(10) + print("focusing") + focusing() + time.sleep(10) + print("imaging") + imaging() + time.sleep(10) + print("segmenting") + segmenting() + time.sleep(10) + with smbus.SMBus(1) as bus: + setRGBSpeed(bus, 3) + for effect in Effect: + print(effect.name) + with smbus.SMBus(1) as bus: + setRGBEffect(bus, effect) + time.sleep(2) + with smbus.SMBus(1) as bus: + setRGBEffect(bus, Effect.Breathing) + for color in EffectColor: + print(color.name) + with smbus.SMBus(1) as bus: + setRGBColor(bus, color) + time.sleep(2) - state = str(sys.argv[1]) - - light(state) + setRGBOff() \ No newline at end of file