[{"id":"574147b3.9ac248","type":"tab","label":"NETIO AN49b","disabled":false,"info":""},{"id":"f236270a.65d0c8","type":"inject","z":"574147b3.9ac248","name":"","topic":"","payload":"","payloadType":"date","repeat":"1","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":40,"wires":[["859aa17d.5b8f5"]]},{"id":"859aa17d.5b8f5","type":"http request","z":"574147b3.9ac248","name":"","method":"GET","ret":"txt","url":"http://192.168.1.91/netio.json","tls":"","x":290,"y":40,"wires":[["50c31e4f.8e847"]]},{"id":"50c31e4f.8e847","type":"json","z":"574147b3.9ac248","name":"","property":"payload","action":"","pretty":false,"x":430,"y":40,"wires":[["318c23ca.7a605c"]]},{"id":"318c23ca.7a605c","type":"function","z":"574147b3.9ac248","name":"main logic","func":"//set parameters\nvar total_duration = flow.get(\"total_duration\")\nvar min_difference = flow.get(\"min_difference\")\nvar max_difference = flow.get(\"max_difference\")\nvar post_trigger_waiting = flow.get(\"post_trigger_waiting\")\n//------------------------------------------------------------------------------- \n\n\n// load flow variables\nvar energy = msg.payload.Outputs[0].Energy; \nflow.set(\"last_energy_value\", energy); \nvar segment_array = flow.get(\"segment_array\") || []; \nvar coffees = flow.get(\"coffees\") || 0; \nvar last_coffee_time = flow.get(\"last_coffee_time\") || \"00:00\";\nvar failed_segment_counter= flow.get(\"failed_segment_counter\") || 0;\nvar failed_segment_sequence = flow.get(\"failed_segment_sequence\") || true;\nvar recorded_coffee_timestamps = flow.get(\"recorded_coffee_timestamps\") || [];\n\n// \nif(segment_array.length < total_duration) // fill segment_array with same amount of items as total_duration parameter\n{ \n segment_array.push(energy);\n} \nelse \n{ \n current_segment_difference = segment_array[total_duration - 1] - segment_array[0];\n \n // check if current segment is within parameters\n if(current_segment_difference >= min_difference && current_segment_difference <= max_difference) \n { \n if(failed_segment_counter >= post_trigger_waiting) \n { \n failed_segment_sequence = false; \n failed_segment_counter = 0; \n coffees += 1; \n \n // get timestamp of coffee\n var date = new Date(); \n var hour = date.getHours(); \n hour = (hour < 10 ? \"0\" : \"\") + hour;\n var min = date.getMinutes(); \n min = (min < 10 ? \"0\" : \"\") + min; \n var sec = date.getSeconds(); \n sec = (sec < 10 ? \"0\" : \"\") + sec; \n last_coffee_time = hour + \":\" + min + \":\" + sec;\n } \n \n } \n else \n { \n if(failed_segment_sequence === true) \n { \n failed_segment_counter += 1; \n } \n } \n \n segment_array.shift(); // remove first item from array\n segment_array.push(energy); // add last energy value into array\n}\n\n\n\n \n\n// if new coffee was counted then add timestamp to array\nif(coffees > flow.get(\"coffees\"))\n{\n if(recorded_coffee_timestamps.length < 5)\n {\n recorded_coffee_timestamps.push(last_coffee_time);\n }\n else\n {\n recorded_coffee_timestamps.shift();\n recorded_coffee_timestamps.push(last_coffee_time);\n }\n \n}\n\n// convert array with coffee timestamps to single formatted string for dashboard\nvar index;\nvar formatted_timestamp_string = \"\";\nfor (index = 0; index < recorded_coffee_timestamps.length; ++index) {\n formatted_timestamp_string += recorded_coffee_timestamps[index];\n if(index < recorded_coffee_timestamps.length - 1)\n {\n formatted_timestamp_string += \"
\"\n }\n}\n// set flow variables\nflow.set(\"segment_array\", segment_array);\nflow.set(\"coffees\", coffees);\nflow.set(\"last_coffee_time\", last_coffee_time);\nflow.set(\"failed_segment_sequence\", failed_segment_sequence);\nflow.set(\"failed_segment_counter\", failed_segment_counter);\nflow.set(\"recorded_coffee_timestamps\", recorded_coffee_timestamps);\n\nflow.set(\"total_duration\", total_duration);\nflow.set(\"min_difference\", min_difference);\nflow.set(\"max_difference\", max_difference);\nflow.set(\"post_trigger_waiting\", post_trigger_waiting);\n\n// set msg properties for dashboard\nmsg.coffees = coffees;\nmsg.energy = energy;\nmsg.last_coffee = last_coffee_time;\nmsg.Load = msg.payload.Outputs[0].Load;\nmsg.Current = msg.payload.Outputs[0].Current;\nmsg.History_timestamps = formatted_timestamp_string;\nmsg.payload = energy;\nreturn msg;","outputs":1,"noerr":0,"x":560,"y":40,"wires":[["d1606e8a.cff96","16eb7792.254488","f156e17.f8a662","d72fd621.722a18","97a9d6ad.4285b8","bcd48581.c6a628"]]},{"id":"9fb357fe.590248","type":"catch","z":"574147b3.9ac248","name":"","scope":["859aa17d.5b8f5"],"x":390,"y":100,"wires":[["9b25e66a.9a64d8"]]},{"id":"9b25e66a.9a64d8","type":"function","z":"574147b3.9ac248","name":"request timeout","func":"//set parameters\nvar total_duration = flow.get(\"total_duration\")\nvar min_difference = flow.get(\"min_difference\")\nvar max_difference = flow.get(\"max_difference\")\nvar post_trigger_waiting = flow.get(\"post_trigger_waiting\")\n//------------------------------------------------------------------------------- \n\n// load flow variables\nvar energy = flow.get(\"last_energy_value\");\nvar segment_array = flow.get(\"segment_array\") || []; \nvar coffees = flow.get(\"coffees\") || 0; \nvar last_coffee_time = flow.get(\"last_coffee_time\") || \"00:00\";\nvar failed_segment_counter = flow.get(\"failed_segment_counter\") || 0;\nvar failed_segment_sequence = flow.get(\"failed_segment_sequence\") || true;\nvar recorded_coffee_timestamps = flow.get(\"recorded_coffee_timestamps\") || [];\n\n// \nif(segment_array.length < total_duration) // fill segment_array with same amount of items as total_duration parameter\n{ \n segment_array.push(energy);\n} \nelse \n{ \n current_segment_difference = segment_array[total_duration - 1] - segment_array[0];\n \n // check if current segment is within parameters\n if(current_segment_difference >= min_difference && current_segment_difference <= max_difference) \n { \n if(failed_segment_counter >= post_trigger_waiting) \n { \n failed_segment_sequence = false; \n failed_segment_counter = 0; \n coffees += 1; \n \n // get timestamp of coffee\n var date = new Date(); \n var hour = date.getHours(); \n hour = (hour < 10 ? \"0\" : \"\") + hour;\n var min = date.getMinutes(); \n min = (min < 10 ? \"0\" : \"\") + min; \n var sec = date.getSeconds(); \n sec = (sec < 10 ? \"0\" : \"\") + sec; \n last_coffee_time = hour + \":\" + min + \":\" + sec;\n } \n \n } \n else \n { \n if(failed_segment_sequence === true) \n { \n failed_segment_counter += 1; \n } \n } \n \n segment_array.shift(); // remove first item from array\n segment_array.push(energy); // add last energy value into array\n}\n\n\n \n\n// if new coffee was counted then add timestamp to array\nif(coffees > flow.get(\"coffees\"))\n{\n if(recorded_coffee_timestamps.length < 5)\n {\n recorded_coffee_timestamps.push(last_coffee_time);\n }\n else\n {\n recorded_coffee_timestamps.shift();\n recorded_coffee_timestamps.push(last_coffee_time);\n }\n \n}\n\n// convert array with coffee timestamps to single formatted string for dashboard\nvar index;\nvar formatted_timestamp_string;\nfor (index = 0; index < recorded_coffee_timestamps.length; ++index) {\n formatted_timestamp_string += recorded_coffee_timestamps[index];\n if(index < recorded_coffee_timestamps.length - 1)\n {\n formatted_timestamp_string += \"
\"\n }\n}\n\n// set flow variables\nflow.set(\"segment_array\", segment_array);\nflow.set(\"coffees\", coffees);\nflow.set(\"last_coffee_time\", last_coffee_time);\nflow.set(\"failed_segment_sequence\", failed_segment_sequence);\nflow.set(\"failed_segment_counter\", failed_segment_counter);\nflow.set(\"recorded_coffee_timestamps\", recorded_coffee_timestamps);\n\nflow.set(\"total_duration\", total_duration);\nflow.set(\"min_difference\", min_difference);\nflow.set(\"max_difference\", max_difference);\nflow.set(\"post_trigger_waiting\", post_trigger_waiting);\n\n// set msg properties for dashboard\nmsg.coffees = coffees;\nmsg.energy = energy;\nmsg.last_coffee = last_coffee_time;\nmsg.Load = msg.payload.Outputs[0].Load;\nmsg.Current = msg.payload.Outputs[0].Current;\nmsg.History_timestamps = formatted_timestamp_string;\nmsg.payload = energy;\nreturn msg;","outputs":1,"noerr":0,"x":540,"y":100,"wires":[["d1606e8a.cff96","16eb7792.254488","f156e17.f8a662","d72fd621.722a18"]]},{"id":"f156e17.f8a662","type":"ui_gauge","z":"574147b3.9ac248","name":"","group":"2d63999a.5e0586","order":1,"width":0,"height":0,"gtype":"gage","title":"Load","label":"[W]","format":"{{msg.Load}}","min":0,"max":"3600","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":750,"y":120,"wires":[]},{"id":"d1606e8a.cff96","type":"ui_text","z":"574147b3.9ac248","group":"d6e5989a.ebc778","order":5,"width":0,"height":0,"name":"","label":"Total number of coffees","format":"{{msg.coffees}}","layout":"row-spread","x":810,"y":40,"wires":[]},{"id":"16eb7792.254488","type":"ui_text","z":"574147b3.9ac248","group":"d6e5989a.ebc778","order":6,"width":0,"height":0,"name":"","label":"Time of last coffee","format":"{{msg.last_coffee}}","layout":"row-spread","x":790,"y":80,"wires":[]},{"id":"d72fd621.722a18","type":"ui_gauge","z":"574147b3.9ac248","name":"","group":"2d63999a.5e0586","order":3,"width":0,"height":0,"gtype":"gage","title":"Current","label":"[mA]","format":"{{msg.Current}}","min":0,"max":"16000","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":760,"y":160,"wires":[]},{"id":"97a9d6ad.4285b8","type":"ui_chart","z":"574147b3.9ac248","name":"","group":"bec6108a.c212e","order":1,"width":0,"height":0,"label":"Energy","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":760,"y":200,"wires":[[]]},{"id":"aa3a1bd5.ce3c58","type":"ui_numeric","z":"574147b3.9ac248","name":"","label":"Total duration [s]","tooltip":"","group":"d6e5989a.ebc778","order":1,"width":0,"height":0,"wrap":false,"passthru":true,"topic":"","format":"{{msg.payload}}","min":0,"max":"180","step":1,"x":120,"y":200,"wires":[["ecacfaa9.572288"]]},{"id":"6f8e1aa4.cc0454","type":"ui_numeric","z":"574147b3.9ac248","name":"","label":"Min difference [Wh]","tooltip":"","group":"d6e5989a.ebc778","order":2,"width":0,"height":0,"wrap":false,"passthru":true,"topic":"","format":"{{msg.payload}}","min":0,"max":"100","step":1,"x":130,"y":240,"wires":[["56605f4f.25e55"]]},{"id":"a5ffbec0.f1bb2","type":"ui_numeric","z":"574147b3.9ac248","name":"","label":"Max difference [Wh]","tooltip":"","group":"d6e5989a.ebc778","order":3,"width":0,"height":0,"wrap":false,"passthru":true,"topic":"","format":"{{msg.payload}}","min":0,"max":"100","step":1,"x":140,"y":280,"wires":[["12ba1351.db1d6d"]]},{"id":"1df2ffaf.e88ab","type":"ui_numeric","z":"574147b3.9ac248","name":"","label":"post_trigger_waiting [s]","tooltip":"","group":"d6e5989a.ebc778","order":4,"width":0,"height":0,"wrap":false,"passthru":true,"topic":"","format":"{{msg.payload}}","min":0,"max":"60","step":1,"x":150,"y":320,"wires":[["d56205aa.b9b6c8"]]},{"id":"ecacfaa9.572288","type":"change","z":"574147b3.9ac248","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"total_duration","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":300,"y":200,"wires":[[]]},{"id":"56605f4f.25e55","type":"change","z":"574147b3.9ac248","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"min_difference","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":320,"y":240,"wires":[[]]},{"id":"12ba1351.db1d6d","type":"change","z":"574147b3.9ac248","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"max_difference","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":340,"y":280,"wires":[[]]},{"id":"d56205aa.b9b6c8","type":"change","z":"574147b3.9ac248","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"post_trigger_waiting","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":320,"wires":[[]]},{"id":"bcd48581.c6a628","type":"ui_text","z":"574147b3.9ac248","group":"bec6108a.c212e","order":0,"width":"8","height":"5","name":"","label":"History of coffees","format":"{{msg.History_timestamps}}","layout":"col-center","x":790,"y":240,"wires":[]},{"id":"2d63999a.5e0586","type":"ui_group","name":"Group 2","tab":"c9dc0f44.358ac","order":2,"disp":true,"width":7},{"id":"d6e5989a.ebc778","type":"ui_group","z":"","name":"Group 1","tab":"c9dc0f44.358ac","order":1,"disp":true,"width":"6","collapse":false},{"id":"bec6108a.c212e","type":"ui_group","z":"","name":"Group 3","tab":"c9dc0f44.358ac","order":3,"disp":true,"width":"8","collapse":false},{"id":"c9dc0f44.358ac","type":"ui_tab","z":"","name":"Dashboard version","icon":"dashboard","order":22,"disabled":false,"hidden":false}]