[ { "id": "7f885510.6173fc", "type": "tab", "label": "Flow 1", "disabled": false, "info": "" }, { "id": "4e7b0c26.1eecb4", "type": "tab", "label": "Flow 2", "disabled": false, "info": "" }, { "id": "b2d230de.b7751", "type": "ui_base", "theme": { "name": "theme-dark", "lightTheme": { "default": "#0094CE", "baseColor": "#0094CE", "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif", "edited": true, "reset": false }, "darkTheme": { "default": "#097479", "baseColor": "#097479", "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif", "edited": true, "reset": false }, "customTheme": { "name": "Untitled Theme 1", "default": "#4B7930", "baseColor": "#4B7930", "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif", "reset": false }, "themeState": { "base-color": { "default": "#097479", "value": "#097479", "edited": false }, "page-titlebar-backgroundColor": { "value": "#097479", "edited": false }, "page-backgroundColor": { "value": "#111111", "edited": false }, "page-sidebar-backgroundColor": { "value": "#000000", "edited": false }, "group-textColor": { "value": "#0eb8c0", "edited": false }, "group-borderColor": { "value": "#555555", "edited": false }, "group-backgroundColor": { "value": "#333333", "edited": false }, "widget-textColor": { "value": "#eeeeee", "edited": false }, "widget-backgroundColor": { "value": "#097479", "edited": false }, "widget-borderColor": { "value": "#333333", "edited": false }, "base-font": { "value": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif" } }, "angularTheme": { "primary": "purple", "accents": "pink", "warn": "indigo", "background": "deep-purple", "palette": "dark" } }, "site": { "name": "PlanktonScope GUI v2.1", "hideToolbar": "false", "allowSwipe": "false", "lockMenu": "false", "allowTempTheme": "true", "dateFormat": "DD/MM/YYYY", "sizes": { "sx": 48, "sy": 48, "gx": 6, "gy": 6, "cx": 6, "cy": 6, "px": 0, "py": 0 } } }, { "id": "6b01f851.598028", "type": "ui_tab", "z": "", "name": "PlanktonScope GUI v2.1", "icon": "date_range", "order": 1, "disabled": false, "hidden": false }, { "id": "c627ea8d.f886e8", "type": "ui_group", "z": "", "name": "General", "tab": "6b01f851.598028", "order": 1, "disp": true, "width": 5, "collapse": false }, { "id": "c62ffbd3.787ef8", "type": "ui_group", "z": "", "name": "Preview", "tab": "6b01f851.598028", "order": 2, "disp": true, "width": 12, "collapse": false }, { "id": "832434ce.ebe498", "type": "ui_group", "z": "", "name": "Optic Settings", "tab": "6b01f851.598028", "order": 3, "disp": true, "width": 8, "collapse": false }, { "id": "a72a9ec6.bb144", "type": "ui_group", "z": "", "name": "Fluidic settings", "tab": "6b01f851.598028", "order": 4, "disp": true, "width": 5, "collapse": false }, { "id": "106f0e1b.6478a2", "type": "ui_group", "z": "", "name": "Spatio Temporal", "tab": "6b01f851.598028", "order": 5, "disp": true, "width": 8, "collapse": false }, { "id": "77a6994b.e3efb8", "type": "ui_group", "z": "", "name": "General", "tab": "6b01f851.598028", "order": 6, "disp": true, "width": 5, "collapse": false }, { "id": "955fdac.f54f328", "type": "ui_text_input", "z": "7f885510.6173fc", "name": "sample_ship", "label": "Name of the ship", "tooltip": "", "group": "c627ea8d.f886e8", "order": 2, "width": 0, "height": 0, "passthru": true, "mode": "text", "delay": 300, "topic": "sample_ship", "x": 170, "y": 100, "wires": [ [ "3dd9a121.e386de" ] ] }, { "id": "dfb29406.d68148", "type": "ui_dropdown", "z": "7f885510.6173fc", "name": "sample_sampling_gear", "label": "Sampling gear", "tooltip": "", "place": "Select", "group": "c627ea8d.f886e8", "order": 5, "width": 0, "height": 0, "passthru": true, "options": [ { "label": "Plankton net", "value": "net", "type": "str" }, { "label": "Niskin bottle 12L", "value": "niskin_12L", "type": "str" }, { "label": "Niskin bottle 24L", "value": "niskin_24L", "type": "str" } ], "payload": "", "topic": "sample_sampling_gear", "x": 130, "y": 220, "wires": [ [ "8861710f.55b92" ] ] }, { "id": "bfce92c6.5f66a", "type": "ui_text_input", "z": "7f885510.6173fc", "name": "sample_operator", "label": "Name of the operator", "tooltip": "", "group": "c627ea8d.f886e8", "order": 4, "width": 0, "height": 0, "passthru": true, "mode": "text", "delay": 300, "topic": "sample_operator", "x": 150, "y": 180, "wires": [ [ "3dd9a121.e386de" ] ] }, { "id": "bae9c122.3612f", "type": "ui_text_input", "z": "7f885510.6173fc", "name": "sample_project", "label": "Name of the project*", "tooltip": "", "group": "c627ea8d.f886e8", "order": 1, "width": 0, "height": 0, "passthru": true, "mode": "text", "delay": 300, "topic": "sample_project", "x": 160, "y": 40, "wires": [ [ "3dd9a121.e386de", "a8cb0c6e.7220d" ] ] }, { "id": "eb39c21c.a3fec", "type": "ui_text_input", "z": "7f885510.6173fc", "name": "object_lat", "label": "Lattitude (decimal degrees)", "tooltip": "", "group": "106f0e1b.6478a2", "order": 6, "width": 0, "height": 0, "passthru": true, "mode": "number", "delay": 300, "topic": "object_lat", "x": 1020, "y": 320, "wires": [ [ "c650b922.6adef8" ] ] }, { "id": "404b41a5.ae3d5", "type": "ui_text_input", "z": "7f885510.6173fc", "name": "object_lon", "label": "Longitude (decimal degrees)", "tooltip": "", "group": "106f0e1b.6478a2", "order": 7, "width": 0, "height": 0, "passthru": true, "mode": "number", "delay": 300, "topic": "object_lon", "x": 1010, "y": 360, "wires": [ [ "c650b922.6adef8" ] ] }, { "id": "d90c72f2.cf1ca", "type": "ui_text_input", "z": "7f885510.6173fc", "name": "sample_id", "label": "Name of the station*", "tooltip": "", "group": "c627ea8d.f886e8", "order": 3, "width": 0, "height": 0, "passthru": true, "mode": "text", "delay": 300, "topic": "sample_id", "x": 170, "y": 140, "wires": [ [ "3dd9a121.e386de" ] ] }, { "id": "3300f426.cc515c", "type": "ui_dropdown", "z": "7f885510.6173fc", "name": "acq_fnumber_objective", "label": "M12 Lens*", "tooltip": "", "place": "Select option", "group": "832434ce.ebe498", "order": 1, "width": 0, "height": 0, "passthru": true, "options": [ { "label": "f 25mm 1/2\" 5MP IR", "value": 25, "type": "num" }, { "label": "f 16mm 1/2.5\" 5MP IR", "value": 16, "type": "num" }, { "label": "f 12mm 1/2.5\" 5MP IR", "value": 12, "type": "num" }, { "label": "f 8mm 1/2.5\" 5MP IR", "value": 8, "type": "num" }, { "label": "f 6mm 1/2.5\" 5MP IR", "value": 6, "type": "num" } ], "payload": "", "topic": "acq_fnumber_objective", "x": 1030, "y": 40, "wires": [ [ "de455648.b432f8" ] ] }, { "id": "72d57e31.59234", "type": "ui_template", "z": "7f885510.6173fc", "group": "832434ce.ebe498", "name": "Magnification", "order": 2, "width": 0, "height": 0, "format": "
\n Magnification : X\n \n \n
", "storeOutMessages": true, "fwdInMessages": true, "templateScope": "local", "x": 1590, "y": 40, "wires": [ [] ] }, { "id": "98a4bc0a.f3304", "type": "ui_template", "z": "7f885510.6173fc", "group": "77a6994b.e3efb8", "name": "Instrument", "order": 1, "width": 0, "height": 0, "format": "
\n Instrument :\n \n PlanktonScope V2.1\n \n
", "storeOutMessages": true, "fwdInMessages": true, "templateScope": "local", "x": 170, "y": 420, "wires": [ [] ] }, { "id": "53b3cb43.2acf04", "type": "ui_template", "z": "7f885510.6173fc", "group": "77a6994b.e3efb8", "name": "Software", "order": 2, "width": 0, "height": 0, "format": "
\n Software :\n \n Node-RED Dashboard\n \n
", "storeOutMessages": true, "fwdInMessages": true, "templateScope": "local", "x": 180, "y": 460, "wires": [ [] ] }, { "id": "1a0a45f1.2cd7da", "type": "ui_template", "z": "7f885510.6173fc", "group": "77a6994b.e3efb8", "name": "Camera", "order": 3, "width": 0, "height": 0, "format": "
\n Camera :\n \n Pi Camera v2.1\n \n
", "storeOutMessages": true, "fwdInMessages": true, "templateScope": "local", "x": 180, "y": 500, "wires": [ [] ] }, { "id": "de455648.b432f8", "type": "function", "z": "7f885510.6173fc", "name": "calculate", "func": "global.set(msg.topic,msg.payload);\nvar acq_fnumber_objective = String(global.get(msg.topic));\n\nswitch(acq_fnumber_objective) {\n case \"25\":\n global.set(\"magnification\",0.6);\n global.set(\"process_pixel\",1.86);\n global.set(\"sug_min\",60);\n global.set(\"sug_max\",670);\n global.set(\"flowrate\",3);\n break;\n case \"16\":\n global.set(\"magnification\",0.94);\n global.set(\"process_pixel\",1.19);\n global.set(\"sug_min\",40);\n global.set(\"sug_max\",430);\n global.set(\"flowrate\",2.4);\n break;\n case \"12\":\n global.set(\"magnification\",1.20);\n global.set(\"process_pixel\",0.94);\n global.set(\"sug_min\",30);\n global.set(\"sug_max\",340);\n global.set(\"flowrate\",1.25);\n break;\n case \"8\":\n global.set(\"magnification\",1.78);\n global.set(\"process_pixel\",0.63);\n global.set(\"sug_min\",20);\n global.set(\"sug_max\",230);\n global.set(\"flowrate\",0.42);\n break;\n case \"6\":\n global.set(\"magnification\",2.36);\n global.set(\"process_pixel\",0.48);\n global.set(\"sug_min\",15);\n global.set(\"sug_max\",170);\n global.set(\"flowrate\",0.32);\n break;\n}\nreturn msg;", "outputs": 1, "noerr": 0, "x": 1220, "y": 40, "wires": [ [ "c83fc403.8ba2d8", "48d9cc9c.852214", "44969aec.4e87e4", "a1201a.dc3f8fe8", "89b9399b.9389a8" ] ] }, { "id": "f3aa18d.65f0de8", "type": "ui_dropdown", "z": "7f885510.6173fc", "name": "acq_celltype", "label": "Thickness flowcell*", "tooltip": "", "place": "Select option", "group": "a72a9ec6.bb144", "order": 1, "width": 0, "height": 0, "passthru": true, "options": [ { "label": "200 μm µ-Slide I Luer", "value": 200, "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", "x": 170, "y": 280, "wires": [ [ "8861710f.55b92" ] ] }, { "id": "45568fe8.67759", "type": "ui_numeric", "z": "7f885510.6173fc", "name": "acq_minimum_mesh", "label": "Min fraction size (μm)", "tooltip": "", "group": "a72a9ec6.bb144", "order": 2, "width": 0, "height": 0, "wrap": false, "passthru": true, "topic": "acq_minimum_mesh", "format": "{{value}}", "min": 0, "max": "300", "step": "10", "x": 140, "y": 320, "wires": [ [ "8861710f.55b92" ] ] }, { "id": "918b69e2.7e6e88", "type": "ui_numeric", "z": "7f885510.6173fc", "name": "acq_maximum_mesh", "label": "Max fraction size (μm)", "tooltip": "", "group": "a72a9ec6.bb144", "order": 3, "width": 0, "height": 0, "wrap": false, "passthru": true, "topic": "acq_maximum_mesh", "format": "{{value}}", "min": "200", "max": "2000", "step": "100", "x": 140, "y": 360, "wires": [ [ "8861710f.55b92" ] ] }, { "id": "86d762dc.47911", "type": "ui_switch", "z": "7f885510.6173fc", "name": "light_state", "label": "Light", "tooltip": "", "group": "c62ffbd3.787ef8", "order": 2, "width": 2, "height": 1, "passthru": true, "decouple": "false", "topic": "", "style": "", "onvalue": "true", "onvalueType": "bool", "onicon": "", "oncolor": "", "offvalue": "false", "offvalueType": "bool", "officon": "", "offcolor": "", "x": 510, "y": 100, "wires": [ [ "b5a366b4.cb6918" ] ] }, { "id": "b5a366b4.cb6918", "type": "exec", "z": "7f885510.6173fc", "command": "python3.7 $HOME/PlanktonScope/scripts/light.py", "addpay": true, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "light.py", "x": 820, "y": 100, "wires": [ [], [], [] ], "icon": "node-red/light.svg" }, { "id": "5ea28a70.42ae14", "type": "ui_button", "z": "7f885510.6173fc", "name": "up", "group": "c62ffbd3.787ef8", "order": 4, "width": 1, "height": 1, "passthru": false, "label": "", "tooltip": "", "color": "", "bgcolor": "", "icon": "arrow_upwards", "payload": "up", "payloadType": "str", "topic": "up", "x": 530, "y": 220, "wires": [ [ "523fdeaa.50c6c" ] ] }, { "id": "27f16831.dde938", "type": "ui_button", "z": "7f885510.6173fc", "name": "down", "group": "c62ffbd3.787ef8", "order": 6, "width": 1, "height": 1, "passthru": true, "label": "", "tooltip": "", "color": "", "bgcolor": "", "icon": "arrow_downward", "payload": "down", "payloadType": "str", "topic": "down", "x": 530, "y": 300, "wires": [ [ "523fdeaa.50c6c" ] ] }, { "id": "855e9d96.ab869", "type": "ui_text_input", "z": "7f885510.6173fc", "name": "nb_step", "label": "nb step (30μm/step)", "tooltip": "", "group": "c62ffbd3.787ef8", "order": 5, "width": 3, "height": 1, "passthru": false, "mode": "number", "delay": 300, "topic": "nb_step", "x": 520, "y": 260, "wires": [ [ "523fdeaa.50c6c" ] ] }, { "id": "b110542b.5de4f8", "type": "ui_button", "z": "7f885510.6173fc", "name": "kill_focus", "group": "c62ffbd3.787ef8", "order": 7, "width": 3, "height": 1, "passthru": false, "label": "Cancel focus", "tooltip": "", "color": "#AD1625", "bgcolor": "#333333", "icon": "pause", "payload": "", "payloadType": "str", "topic": "", "x": 520, "y": 340, "wires": [ [ "d9dea2bc.47097" ] ] }, { "id": "523fdeaa.50c6c", "type": "function", "z": "7f885510.6173fc", "name": "focus", "func": "if(msg.topic === \"nb_step\"){\n nb_step = msg.payload;\n global.set(\"nb_step\",nb_step);\n}\nif(msg.topic === \"up\"){\n\n nb_step = global.get(\"nb_step\");\n\n orientation = \"up\";\n\n msg.payload = String(nb_step).concat(' ', orientation);\n return msg;\n}\nif(msg.topic === \"down\"){\n \n nb_step = global.get(\"nb_step\");\n\n orientation = \"down\";\n msg.payload = String(nb_step).concat(' ', orientation);\n\n return msg;\n}\n\n", "outputs": 1, "noerr": 0, "x": 670, "y": 260, "wires": [ [ "ada728bd.8e7818" ] ], "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/PlanktonScope/scripts/focus.py 650 up\n" }, { "id": "ada728bd.8e7818", "type": "exec", "z": "7f885510.6173fc", "command": "python3.7 $HOME/PlanktonScope/scripts/focus.py", "addpay": true, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "focus.py", "x": 820, "y": 260, "wires": [ [], [], [] ], "icon": "node-red/sort.svg" }, { "id": "d9dea2bc.47097", "type": "exec", "z": "7f885510.6173fc", "command": "bash $HOME/PlanktonScope/scripts/killer.sh focus.py && bash $HOME/PlanktonScope/scripts/killer.sh focus.py", "addpay": false, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "Kill Focus", "x": 820, "y": 340, "wires": [ [], [], [] ], "icon": "font-awesome/fa-stop" }, { "id": "2d0f6720.0f92f8", "type": "ui_template", "z": "7f885510.6173fc", "group": "832434ce.ebe498", "name": "Pi Camera settings", "order": 7, "width": 0, "height": 0, "format": "\n", "storeOutMessages": true, "fwdInMessages": true, "templateScope": "local", "x": 1010, "y": 100, "wires": [ [] ] }, { "id": "9599b953.529c28", "type": "ui_template", "z": "7f885510.6173fc", "group": "832434ce.ebe498", "name": "process_pixel", "order": 3, "width": 0, "height": 0, "format": "
\n Pixel resolution :\n \n μm\n
", "storeOutMessages": true, "fwdInMessages": true, "templateScope": "local", "x": 1600, "y": 80, "wires": [ [] ] }, { "id": "612e2b9b.ed1684", "type": "ui_template", "z": "7f885510.6173fc", "group": "832434ce.ebe498", "name": "min_size", "order": 4, "width": 0, "height": 0, "format": "
\n Smallest cells to explore :\n \n μm\n
", "storeOutMessages": true, "fwdInMessages": true, "templateScope": "local", "x": 1580, "y": 120, "wires": [ [] ] }, { "id": "f84ab57a.556df8", "type": "ui_template", "z": "7f885510.6173fc", "group": "832434ce.ebe498", "name": "max_size", "order": 5, "width": 0, "height": 0, "format": "
\n Biggest cells to explore :\n \n μm\n
", "storeOutMessages": true, "fwdInMessages": true, "templateScope": "local", "x": 1580, "y": 160, "wires": [ [] ] }, { "id": "45f53656.d631e8", "type": "ui_template", "z": "7f885510.6173fc", "group": "832434ce.ebe498", "name": "flowrate", "order": 6, "width": 0, "height": 0, "format": "
\n Flowrate :\n \n ml/min\n
", "storeOutMessages": true, "fwdInMessages": true, "templateScope": "local", "x": 1580, "y": 200, "wires": [ [] ] }, { "id": "53ec5f97.7567c", "type": "ui_template", "z": "7f885510.6173fc", "group": "c62ffbd3.787ef8", "name": "Stream Pi Camera", "order": 1, "width": 0, "height": 0, "format": "
", "storeOutMessages": true, "fwdInMessages": true, "templateScope": "local", "x": 570, "y": 40, "wires": [ [] ] }, { "id": "c84f1718.4af6b8", "type": "ui_switch", "z": "7f885510.6173fc", "name": "fan_state", "label": "Fan", "tooltip": "", "group": "c62ffbd3.787ef8", "order": 3, "width": 2, "height": 1, "passthru": true, "decouple": "false", "topic": "", "style": "", "onvalue": "true", "onvalueType": "bool", "onicon": "", "oncolor": "", "offvalue": "false", "offvalueType": "bool", "officon": "", "offcolor": "", "x": 520, "y": 160, "wires": [ [ "dec2b84a.6faa18" ] ] }, { "id": "dec2b84a.6faa18", "type": "exec", "z": "7f885510.6173fc", "command": "python3.7 $HOME/PlanktonScope/scripts/fan.py", "addpay": true, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "fan.py", "x": 810, "y": 160, "wires": [ [], [], [] ], "icon": "font-awesome/fa-spinner" }, { "id": "7923e634.673cd8", "type": "ui_text_input", "z": "7f885510.6173fc", "name": "in_path", "label": "Directory*", "tooltip": "", "group": "c62ffbd3.787ef8", "order": 12, "width": 6, "height": 1, "passthru": true, "mode": "text", "delay": 300, "topic": "in_path", "x": 520, "y": 580, "wires": [ [ "263878b3.e0a478" ] ] }, { "id": "477dc1bd.c3de8", "type": "ui_text_input", "z": "7f885510.6173fc", "name": "acq_id", "label": "Acquisition ID*", "tooltip": "", "group": "c62ffbd3.787ef8", "order": 13, "width": 6, "height": 1, "passthru": true, "mode": "text", "delay": 300, "topic": "acq_id", "x": 530, "y": 620, "wires": [ [ "263878b3.e0a478" ] ] }, { "id": "3dd9a121.e386de", "type": "function", "z": "7f885510.6173fc", "name": "set global", "func": "var value = msg.payload.split(' ').join('_');\nvar key = msg.topic;\n\nglobal.set(key,value);", "outputs": 1, "noerr": 0, "x": 340, "y": 40, "wires": [ [] ] }, { "id": "c83fc403.8ba2d8", "type": "function", "z": "7f885510.6173fc", "name": "get magnification", "func": "var magnification = global.get(\"magnification\");\nmsg.payload = magnification;\nreturn msg;", "outputs": 1, "noerr": 0, "x": 1410, "y": 40, "wires": [ [ "72d57e31.59234" ] ] }, { "id": "48d9cc9c.852214", "type": "function", "z": "7f885510.6173fc", "name": "get process_pixel", "func": "var process_pixel = global.get(\"process_pixel\");\nmsg.payload = process_pixel;\nreturn msg;", "outputs": 1, "noerr": 0, "x": 1410, "y": 80, "wires": [ [ "9599b953.529c28" ] ] }, { "id": "44969aec.4e87e4", "type": "function", "z": "7f885510.6173fc", "name": "get sug_min", "func": "var sug_min = global.get(\"sug_min\");\nmsg.payload = sug_min;\nreturn msg;", "outputs": 1, "noerr": 0, "x": 1390, "y": 120, "wires": [ [ "612e2b9b.ed1684" ] ] }, { "id": "a1201a.dc3f8fe8", "type": "function", "z": "7f885510.6173fc", "name": "get sug_max", "func": "var sug_max = global.get(\"sug_max\");\nmsg.payload = sug_max;\nreturn msg;", "outputs": 1, "noerr": 0, "x": 1390, "y": 160, "wires": [ [ "f84ab57a.556df8" ] ] }, { "id": "89b9399b.9389a8", "type": "function", "z": "7f885510.6173fc", "name": "get flowrate", "func": "var flowrate = global.get(\"flowrate\");\nmsg.payload = flowrate\nreturn msg;", "outputs": 1, "noerr": 0, "x": 1390, "y": 200, "wires": [ [ "45f53656.d631e8" ] ] }, { "id": "c650b922.6adef8", "type": "function", "z": "7f885510.6173fc", "name": "set global", "func": "var value = msg.payload;\nvar key = msg.topic;\n\nglobal.set(key,value);", "outputs": 1, "noerr": 0, "x": 1180, "y": 320, "wires": [ [] ] }, { "id": "e4c54d5a.19ff3", "type": "ui_numeric", "z": "7f885510.6173fc", "name": "sample_year", "label": "/", "tooltip": "", "group": "106f0e1b.6478a2", "order": 3, "width": 3, "height": 1, "wrap": false, "passthru": true, "topic": "sample_year", "format": "{{value}}", "min": "2019", "max": "2050", "step": 1, "x": 1010, "y": 480, "wires": [ [ "c650b922.6adef8" ] ] }, { "id": "b45db708.cedec8", "type": "ui_numeric", "z": "7f885510.6173fc", "name": "sample_month", "label": "/", "tooltip": "", "group": "106f0e1b.6478a2", "order": 2, "width": 2, "height": 1, "wrap": false, "passthru": true, "topic": "sample_month", "format": "{{value}}", "min": "1", "max": "12", "step": 1, "x": 1000, "y": 440, "wires": [ [ "c650b922.6adef8" ] ] }, { "id": "6351d257.6d7f1c", "type": "ui_numeric", "z": "7f885510.6173fc", "name": "sample_day", "label": "Date*", "tooltip": "", "group": "106f0e1b.6478a2", "order": 1, "width": 3, "height": 1, "wrap": false, "passthru": true, "topic": "sample_day", "format": "{{value}}", "min": "1", "max": "31", "step": 1, "x": 1010, "y": 400, "wires": [ [ "c650b922.6adef8" ] ] }, { "id": "9ee03294.39987", "type": "ui_numeric", "z": "7f885510.6173fc", "name": "sample_hour", "label": "Time*", "tooltip": "", "group": "106f0e1b.6478a2", "order": 4, "width": 5, "height": 1, "wrap": false, "passthru": true, "topic": "sample_hour", "format": "{{value}}", "min": "0", "max": "24", "step": 1, "x": 1010, "y": 520, "wires": [ [ "c650b922.6adef8" ] ] }, { "id": "5bd11314.ae6e4c", "type": "ui_numeric", "z": "7f885510.6173fc", "name": "sample_minute", "label": ":", "tooltip": "", "group": "106f0e1b.6478a2", "order": 5, "width": 3, "height": 1, "wrap": false, "passthru": true, "topic": "sample_minute", "format": "{{value}}", "min": "0", "max": "59", "step": 1, "x": 1000, "y": 560, "wires": [ [ "c650b922.6adef8" ] ] }, { "id": "8861710f.55b92", "type": "function", "z": "7f885510.6173fc", "name": "set global", "func": "var value = msg.payload;\nvar key = msg.topic;\n\nglobal.set(key,value);", "outputs": 1, "noerr": 0, "x": 340, "y": 220, "wires": [ [] ] }, { "id": "a8cb0c6e.7220d", "type": "function", "z": "7f885510.6173fc", "name": "store generic", "func": "global.set(\"acq_instrument\",\"PlanktonScope V2.1\");\nglobal.set(\"acq_software\",\"Node-RED Dashboard\");\nglobal.set(\"acq_camera\",\"Pi Camera V2.1\");\nglobal.set(\"acq_instrument_ID\",\"Odezenne\");", "outputs": 1, "noerr": 0, "x": 350, "y": 420, "wires": [ [] ] }, { "id": "263878b3.e0a478", "type": "function", "z": "7f885510.6173fc", "name": "set global", "func": "var value = msg.payload;\nvar key = msg.topic;\n\nglobal.set(key,value);", "outputs": 1, "noerr": 0, "x": 680, "y": 600, "wires": [ [] ] }, { "id": "f84c662c.df8248", "type": "function", "z": "4e7b0c26.1eecb4", "name": "Image", "func": "var in_path = context.get(\"in_path\") || 0; //get from context or default to 0\nvar sample_project = context.get(\"sample_project\") || 0; //get from context or default to 0\nvar sample_id = context.get(\"sample_id\") || 0; //get from context or default to 0\nvar acq_id = context.get(\"acq_id\") || 0; //get from context or default to 0\nvar acq_fnumber_objective = String(msg.payload);\n\nswitch(acq_fnumber_objective) {\n case \"25\":\n flowrate = String(' 3');\n break;\n case \"16\":\n flowrate = String(' 2.4');\n break;\n case \"12\":\n flowrate = String(' 1.25');\n break;\n case \"8\":\n flowrate = String(' 0.42');\n break;\n case \"6\":\n flowrate = String(' 0.32');\n break;\n}\n\nswitch (msg.topic){\n case \"in_path\":\n in_path = msg.payload; //payload NOT paydoad :)\n context.set(\"in_path\", in_path); //store in context for next time \n break;\n case \"sample_project\":\n sample_project = msg.payload; //payload NOT paydoad :)\n context.set(\"sample_project\", sample_project); //store in context for next time \n break;\n case \"sample_id\":\n sample_id = msg.payload; //payload NOT paydoad :)\n context.set(\"sample_id\", sample_id); //store in context for next time \n break;\n case \"acq_id\":\n acq_id = msg.payload; //payload NOT paydoad :)\n context.set(\"acq_id\", acq_id); //store in context for next time \n break;\n}\nif(msg.topic === \"start\"){\n \n in_path = String(in_path);\n sample_project = String(sample_project);\n sample_id = String(sample_id);\n acq_id = String(acq_id);\n\n msg.payload = [in_path, sample_project, sample_id, acq_id, flowrate].filter(x => typeof x === 'string' && x.length > 0).join(\" \");\n return msg;\n}", "outputs": 1, "noerr": 0, "x": 370, "y": 480, "wires": [ [ "802532e3.f89bc", "dd01a090.6bec9" ] ], "info": "### Image\n##### image.py `in_path` `sample_project` `sample_id` `acq_id` `volume` `flowrate`\n\n- `in_path` : **string** - directory to store acquisitions **the path has to end with /**\n- `sample_project` : **string**\n- `sample_id` : **string**\n- `acq_id` : **string**\n- `volume` : **integer**\n- `flowrate` : **float**\n\nExample:\n\n python3.7 $HOME/PlanktonScope/scripts/image.py $HOME/PlanktonScope/Acquisitions/ tara_pacific station_125 exp_1 24 3.2\n " }, { "id": "9ac0625a.53e68", "type": "exec", "z": "4e7b0c26.1eecb4", "command": "python3.7 $HOME/PlanktonScope/scripts/image.py", "addpay": true, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "image.py", "x": 760, "y": 420, "wires": [ [], [], [] ], "icon": "node-red/arrow-in.svg" }, { "id": "6b594814.3fa0b8", "type": "exec", "z": "4e7b0c26.1eecb4", "command": "bash $HOME/RPi_Cam_Web_Interface/stop.sh", "addpay": false, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "Kill RPi Web Interface", "x": 800, "y": 500, "wires": [ [], [], [] ] }, { "id": "802532e3.f89bc", "type": "delay", "z": "4e7b0c26.1eecb4", "name": "", "pauseType": "delay", "timeout": "5", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "x": 600, "y": 440, "wires": [ [ "9ac0625a.53e68" ] ] }, { "id": "1500affd.e4407", "type": "exec", "z": "4e7b0c26.1eecb4", "command": "bash $HOME/RPi_Cam_Web_Interface/start.sh", "addpay": true, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "Restart RPi Web Interface", "x": 810, "y": 580, "wires": [ [], [], [] ] }, { "id": "dd01a090.6bec9", "type": "delay", "z": "4e7b0c26.1eecb4", "name": "", "pauseType": "delay", "timeout": "2", "timeoutUnits": "seconds", "rate": "1", "nbRateUnits": "1", "rateUnits": "second", "randomFirst": "1", "randomLast": "5", "randomUnits": "seconds", "drop": false, "x": 600, "y": 500, "wires": [ [ "6b594814.3fa0b8" ] ] }, { "id": "c1091e12.4fe17", "type": "function", "z": "4e7b0c26.1eecb4", "name": "wait", "func": "var acq_fnumber_objective = String(msg.payload);\n\nswitch(acq_fnumber_objective) {\n case \"25\":\n duration = String('500');\n break;\n case \"16\":\n duration = String('620');\n break;\n case \"12\":\n duration = String('1170');\n break;\n case \"8\":\n duration = String('3450');\n break;\n case \"6\":\n duration = String('4520');\n break;\n}\n\nmsg.payload = duration;\nreturn msg;", "outputs": 1, "noerr": 0, "x": 610, "y": 560, "wires": [ [ "1500affd.e4407" ] ] }, { "id": "46d0bcb6.694744", "type": "exec", "z": "4e7b0c26.1eecb4", "command": "bash $HOME/PlanktonScope/scripts/kill_image.sh", "addpay": true, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "Kill Image", "x": 760, "y": 640, "wires": [ [], [], [] ] }, { "id": "182d9940.d0c327", "type": "function", "z": "4e7b0c26.1eecb4", "name": "Image", "func": "var in_path = context.get(\"in_path\") || 0; //get from context or default to 0\nvar sample_project = context.get(\"sample_project\") || 0; //get from context or default to 0\nvar sample_id = context.get(\"sample_id\") || 0; //get from context or default to 0\nvar acq_id = context.get(\"acq_id\") || 0; //get from context or default to 0\n\nswitch (msg.topic){\n case \"in_path\":\n in_path = msg.payload; //payload NOT paydoad :)\n context.set(\"in_path\", in_path); //store in context for next time \n break;\n case \"sample_project\":\n sample_project = msg.payload; //payload NOT paydoad :)\n context.set(\"sample_project\", sample_project); //store in context for next time \n break;\n case \"sample_id\":\n sample_id = msg.payload; //payload NOT paydoad :)\n context.set(\"sample_id\", sample_id); //store in context for next time \n break;\n case \"acq_id\":\n acq_id = msg.payload; //payload NOT paydoad :)\n context.set(\"acq_id\", acq_id); //store in context for next time \n break;\n}\nif(msg.topic === \"stop\"){\n \n in_path = String(in_path);\n sample_project = String(sample_project);\n sample_id = String(sample_id);\n acq_id = String(acq_id);\n\n msg.payload = [in_path, sample_project, sample_id, acq_id].filter(x => typeof x === 'string' && x.length > 0).join(\" \");\n return msg;\n}", "outputs": 1, "noerr": 0, "x": 610, "y": 640, "wires": [ [ "46d0bcb6.694744" ] ], "info": "### Image\n##### image.py `in_path` `sample_project` `sample_id` `acq_id` `volume` `flowrate`\n\n- `in_path` : **string** - directory to store acquisitions **the path has to end with /**\n- `sample_project` : **string**\n- `sample_id` : **string**\n- `acq_id` : **string**\n- `volume` : **integer**\n- `flowrate` : **float**\n\nExample:\n\n python3.7 $HOME/PlanktonScope/scripts/image.py $HOME/PlanktonScope/Acquisitions/ tara_pacific station_125 exp_1 24 3.2\n " }, { "id": "ddc97106.8b2e7", "type": "exec", "z": "4e7b0c26.1eecb4", "command": "python3.7 $HOME/PlanktonScope/scripts/pump.py", "addpay": true, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "pump.py", "x": 760, "y": 360, "wires": [ [], [], [] ] }, { "id": "f5e45860.0bc0d8", "type": "function", "z": "4e7b0c26.1eecb4", "name": "Image", "func": "var acq_fnumber_objective = String(msg.payload);\n\nswitch(acq_fnumber_objective) {\n case \"25\":\n flowrate = String(' 3');\n break;\n case \"16\":\n flowrate = String(' 2.4');\n break;\n case \"12\":\n flowrate = String(' 1.25');\n break;\n case \"8\":\n flowrate = String(' 0.42');\n break;\n case \"6\":\n flowrate = String(' 0.32');\n break;\n}\n\nif(msg.topic === \"start\"){\n \n msg.payload = [\"24\", flowrate, \"foward\"].filter(x => typeof x === 'string' && x.length > 0).join(\" \");\n return msg;\n}", "outputs": 1, "noerr": 0, "x": 470, "y": 400, "wires": [ [ "ddc97106.8b2e7" ] ], "info": "### Image\n##### image.py `in_path` `sample_project` `sample_id` `acq_id` `volume` `flowrate`\n\n- `in_path` : **string** - directory to store acquisitions **the path has to end with /**\n- `sample_project` : **string**\n- `sample_id` : **string**\n- `acq_id` : **string**\n- `volume` : **integer**\n- `flowrate` : **float**\n\nExample:\n\n python3.7 $HOME/PlanktonScope/scripts/image.py $HOME/PlanktonScope/Acquisitions/ tara_pacific station_125 exp_1 24 3.2\n " }, { "id": "d324c4b.31afb38", "type": "exec", "z": "4e7b0c26.1eecb4", "command": "bash $HOME/PlanktonScope/scripts/killer.sh pump.py && bash $HOME/PlanktonScope/scripts/killer.sh pump.py", "addpay": false, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "Kill Pump", "x": 760, "y": 700, "wires": [ [], [], [] ] }, { "id": "4b3ea5bd.03248c", "type": "ui_button", "z": "7f885510.6173fc", "name": "backward", "group": "c62ffbd3.787ef8", "order": 8, "width": 3, "height": 1, "passthru": false, "label": "Backward", "tooltip": "", "color": "", "bgcolor": "", "icon": "arrow_back", "payload": "backward", "payloadType": "str", "topic": "backward", "x": 520, "y": 400, "wires": [ [ "84fd85fd.426878" ] ] }, { "id": "cfe9783a.286438", "type": "ui_button", "z": "7f885510.6173fc", "name": "foward", "group": "c62ffbd3.787ef8", "order": 10, "width": 3, "height": 1, "passthru": true, "label": "Forward", "tooltip": "", "color": "", "bgcolor": "", "icon": "arrow_forward", "payload": "foward", "payloadType": "str", "topic": "foward", "x": 530, "y": 480, "wires": [ [ "84fd85fd.426878" ] ] }, { "id": "f94950fb.4454f", "type": "ui_text_input", "z": "7f885510.6173fc", "name": "volume", "label": "Volume (ml)*", "tooltip": "", "group": "c62ffbd3.787ef8", "order": 9, "width": 3, "height": 1, "passthru": false, "mode": "number", "delay": 300, "topic": "volume", "x": 520, "y": 440, "wires": [ [ "84fd85fd.426878" ] ] }, { "id": "83d75b6b.6afa28", "type": "ui_button", "z": "7f885510.6173fc", "name": "kill_pump", "group": "c62ffbd3.787ef8", "order": 11, "width": 3, "height": 1, "passthru": false, "label": "Cancel pump", "tooltip": "", "color": "#AD1625", "bgcolor": "#333333", "icon": "pause", "payload": "", "payloadType": "str", "topic": "", "x": 520, "y": 520, "wires": [ [ "8fc930df.c7ae6" ] ] }, { "id": "84fd85fd.426878", "type": "function", "z": "7f885510.6173fc", "name": "pump", "func": "if(msg.topic === \"volume\"){\n volume = msg.payload;\n global.set(\"volume\",volume);\n}\nif(msg.topic === \"foward\"){\n\n volume = global.get(\"volume\");\n flowrate = global.get(\"flowrate\");\n\n action = \" foward\";\n\n msg.payload = String(volume).concat(' ',flowrate, action);\n return msg;\n}\nif(msg.topic === \"backward\"){\n \n volume = global.get(\"volume\");\n flowrate = global.get(\"flowrate\");\n\n action = \" backward\";\n msg.payload = String(volume).concat(' ',flowrate, action);\n\n return msg;\n}\n\n", "outputs": 1, "noerr": 0, "x": 670, "y": 440, "wires": [ [ "649f7ec8.06a84" ] ], "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/PlanktonScope/scripts/focus.py 650 up\n" }, { "id": "649f7ec8.06a84", "type": "exec", "z": "7f885510.6173fc", "command": "python3.7 $HOME/PlanktonScope/scripts/pump.py", "addpay": true, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "pump.py", "x": 820, "y": 440, "wires": [ [], [], [] ], "icon": "font-awesome/fa-rotate-left" }, { "id": "8fc930df.c7ae6", "type": "exec", "z": "7f885510.6173fc", "command": "bash $HOME/PlanktonScope/scripts/killer.sh pump.py && bash $HOME/PlanktonScope/scripts/killer.sh pump.py", "addpay": false, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "Kill Pump", "x": 820, "y": 520, "wires": [ [], [], [] ], "icon": "font-awesome/fa-stop" }, { "id": "13ad31b4.5b682e", "type": "ui_template", "z": "7f885510.6173fc", "group": "77a6994b.e3efb8", "name": "Device ID", "order": 3, "width": 0, "height": 0, "format": "
\n Device ID :\n \n Odezenne\n \n
", "storeOutMessages": true, "fwdInMessages": true, "templateScope": "local", "x": 180, "y": 540, "wires": [ [] ] }, { "id": "6bf10b4c.c83c84", "type": "ui_button", "z": "7f885510.6173fc", "name": "start", "group": "c62ffbd3.787ef8", "order": 14, "width": 6, "height": 1, "passthru": false, "label": "Start Acquisition", "tooltip": "", "color": "", "bgcolor": "", "icon": "play_circle_fill", "payload": "", "payloadType": "str", "topic": "start", "x": 530, "y": 680, "wires": [ [ "3fe055c2.6ab7da" ] ] }, { "id": "2c9498e7.bf0c38", "type": "ui_button", "z": "7f885510.6173fc", "name": "cancel", "group": "c62ffbd3.787ef8", "order": 15, "width": 6, "height": 1, "passthru": false, "label": "Cancel Acquisition", "tooltip": "", "color": "#AD1625", "bgcolor": "#333333", "icon": "pause_circle_filled", "payload": "", "payloadType": "str", "topic": "cancel", "x": 530, "y": 740, "wires": [ [ "f2acb5e0.c2c898" ] ] }, { "id": "b0fda998.f0ad48", "type": "file", "z": "7f885510.6173fc", "name": "logs.json", "filename": "/home/pi/PlanktonScope/logs.json", "appendNewline": true, "createDir": false, "overwriteFile": "false", "encoding": "none", "x": 820, "y": 680, "wires": [ [] ] }, { "id": "3fe055c2.6ab7da", "type": "function", "z": "7f885510.6173fc", "name": "get global", "func": "msg.payload = {\n \"sample\":{\n \"sample_project\":global.get(\"sample_project\"),\n \"sample_ship\":global.get(\"sample_ship\"),\n \"sample_operator\":global.get(\"sample_operator\"),\n \"sample_id\":global.get(\"sample_id\"),\n \"sample_sampling_gear\":global.get(\"sample_sampling_gear\"),\n \"sample_hour\":global.get(\"sample_hour\"),\n \"sample_minute\":global.get(\"sample_minute\"),\n \"sample_day\":global.get(\"sample_day\"),\n \"sample_month\":global.get(\"sample_month\"),\n \"sample_year\":global.get(\"sample_year\")\n },\n \"object\":{\n \"object_lat\":global.get(\"object_lat\"),\n \"object_lon\":global.get(\"object_lon\")\n },\n \"acquisition\":{\n \"acq_id\":global.get(\"acq_id\"),\n \"acq_fnumber_objective\":global.get(\"acq_fnumber_objective\"),\n \"acq_celltype\":global.get(\"acq_celltype\"),\n \"acq_maximum_mesh\":global.get(\"acq_maximum_mesh\"),\n \"acq_minimum_mesh\":global.get(\"acq_minimum_mesh\"),\n \"process_pixel\":global.get(\"process_pixel\"),\n \"acq_camera\":global.get(\"acq_camera\"),\n \"acq_instrument\":global.get(\"acq_instrument\"),\n \"acq_software\":global.get(\"acq_software\"),\n \"acq_instrument_ID\":global.get(\"acq_instrument_ID\")\n },\n \"process\":{\n \"process_pixel\":global.get(\"process_pixel\")\n }\n}\nreturn msg;", "outputs": 1, "noerr": 0, "x": 680, "y": 680, "wires": [ [ "b0fda998.f0ad48" ] ] }, { "id": "f2acb5e0.c2c898", "type": "exec", "z": "7f885510.6173fc", "command": "sed -ie '$d' /home/pi/PlanktonScope/logs.json", "addpay": false, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "Remove last log", "x": 840, "y": 740, "wires": [ [], [], [] ], "icon": "font-awesome/fa-close" }, { "id": "546bd06b.de8ae", "type": "exec", "z": "7f885510.6173fc", "command": "python3.7 $HOME/PlanktonScope/scripts/pump.py", "addpay": true, "append": "", "useSpawn": "false", "timer": "", "oldrc": false, "name": "pump.py", "x": 820, "y": 800, "wires": [ [], [], [] ], "icon": "font-awesome/fa-rotate-left" } ]