-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathflows_raspberrypi.json
More file actions
1 lines (1 loc) · 216 KB
/
flows_raspberrypi.json
File metadata and controls
1 lines (1 loc) · 216 KB
1
[{"id":"b7f34080.d736b","type":"tab","label":"RPi"},{"id":"f5c189e4.4369e8","type":"tab","label":"Utilities"},{"id":"30043e7f.63d8b2","type":"tab","label":"Climate"},{"id":"bc28262d.7e0fb","type":"tab","label":"Security"},{"id":"718348e1.4331e8","type":"tab","label":"Reporting"},{"id":"1523804c.6a58f","type":"tab","label":"TelegramBot"},{"id":"f0fb06f8.1d895","type":"tab","label":"Flow 1"},{"id":"5457368.c53bf48","type":"tab","label":"Flow 2","disabled":false,"info":""},{"id":"95aa150c.0e5218","type":"ui_group","z":"","name":"Gauges","tab":"1c5ba393.3832dc","order":1,"disp":false,"width":"6"},{"id":"1c5ba393.3832dc","type":"ui_tab","z":"","name":"Central","icon":"link","order":1},{"id":"d75e7fda.6ec568","type":"ui_base","theme":{"name":"theme-light","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":{"default":"#4B7930","baseColor":"#0094CE","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","reset":false},"themeState":{"base-color":{"default":"#0094CE","value":"#0094CE","edited":false},"page-titlebar-backgroundColor":{"value":"#0094ce","edited":false},"page-backgroundColor":{"value":"#fafafa","edited":false},"page-sidebar-backgroundColor":{"value":"#ffffff","edited":false},"group-textColor":{"value":"#1bbfff","edited":false},"group-borderColor":{"value":"#ffffff","edited":false},"group-backgroundColor":{"value":"#ffffff","edited":false},"widget-textColor":{"value":"#111111","edited":false},"widget-backgroundColor":{"value":"#0094ce","edited":false},"widget-borderColor":{"value":"#ffffff","edited":false},"base-font":{"value":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"}}},"site":{"name":"Node-RED Dashboard","hideToolbar":"false","allowSwipe":"false","dateFormat":"DD/MM/YYYY","sizes":{"sx":48,"sy":48,"gx":6,"gy":6,"cx":12,"cy":6,"px":0,"py":0}}},{"id":"1cd082c0.e0a865","type":"telegram bot","z":"","botname":"@tamabot","usernames":"","chatids":""},{"id":"6071fa98.953c0c","type":"sqlitedb","z":"","db":"/home/pi/Databases/invoices"},{"id":"11d5bdee.25af8a","type":"darksky-credentials","z":"","key_identifier":"aleonnet"},{"id":"ae0fb445.795808","type":"sqlitedb","z":"","db":"/home/pi/Databases/quotes"},{"id":"3f9f7390.9dae5c","type":"mqtt-broker","z":"","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""},{"id":"d335a060.256518","type":"ui_tab","z":"","name":"Utilities","icon":"lightbulb_outline","order":3},{"id":"c1d65bde.c687c8","type":"ui_group","z":"","name":"Report","tab":"fdfe44c.0ee7f38","order":1,"disp":false,"width":"6"},{"id":"1e2ce10.ed3329f","type":"ui_group","z":"","name":"Filters","tab":"fdfe44c.0ee7f38","order":2,"disp":false,"width":"6"},{"id":"2ffd12e8.b785a6","type":"ui_group","z":"","name":"Power 30 days","tab":"fdfe44c.0ee7f38","order":3,"disp":false,"width":"2"},{"id":"27714eb6.f1b642","type":"ui_group","z":"","name":"Power 7 days","tab":"fdfe44c.0ee7f38","order":4,"disp":false,"width":"2"},{"id":"fdfe44c.0ee7f38","type":"ui_tab","z":"","name":"Reporting","icon":"trending_up","order":5},{"id":"9fc5371c.2f8848","type":"ui_group","z":"","name":"Control 1","tab":"d335a060.256518","order":5,"disp":false,"width":"6"},{"id":"a450b6b4.16cc48","type":"sqlitedb","z":"","db":"/home/pi/Databases/nodered"},{"id":"567b54fe.496c3c","type":"ui_group","z":"","name":"Control 2","tab":"d335a060.256518","order":6,"disp":false,"width":"6"},{"id":"5b854372.1756bc","type":"ui_group","z":"","name":"Control 3","tab":"d335a060.256518","order":7,"disp":false,"width":"6"},{"id":"436c2fa1.ce6228","type":"ui_group","z":"","name":"Display","tab":"d335a060.256518","order":4,"disp":false,"width":"6"},{"id":"e034cca6.13c258","type":"ui_group","z":"","name":"Air conditioner","tab":"9d6918b9.283b28","order":1,"disp":false,"width":"6"},{"id":"9d6918b9.283b28","type":"ui_tab","z":"","name":"Climate","icon":"toys","order":4},{"id":"79f08e26.0967e8","type":"ui_group","z":"","name":"Camera","tab":"69074531.71e844","order":2,"disp":false,"width":"6"},{"id":"69074531.71e844","type":"ui_tab","z":"","name":"Security","icon":"lock","order":2},{"id":"f6487965.411238","type":"ui_group","z":"","name":"Sensors","tab":"69074531.71e844","order":1,"disp":false,"width":"6"},{"id":"1b61a0cd.e7d997","type":"ui_group","z":"","name":"Control","tab":"1c5ba393.3832dc","disp":false,"width":"6"},{"id":"3ada94d9.42d164","type":"ui_group","z":"","name":"Control","tab":"69074531.71e844","order":3,"disp":false,"width":"6"},{"id":"7be02a6.3551454","type":"ui_group","z":"","name":"Control","tab":"9d6918b9.283b28","order":2,"disp":false,"width":"6"},{"id":"2b5198e9.a9f5d","type":"ui_tab","z":"","name":"Configuration","icon":"settings","order":6},{"id":"b306725d.0dfb18","type":"ui_group","z":"","name":"Notifications","tab":"2b5198e9.a9f5d","order":1,"disp":true,"width":"6"},{"id":"76ec5afa.44f88c","type":"ui_group","z":"","name":"Power","tab":"d335a060.256518","order":1,"disp":false,"width":"3"},{"id":"a9de599b.28e13","type":"ui_group","z":"","name":"Flow","tab":"d335a060.256518","order":2,"disp":false,"width":"3"},{"id":"1e4de5f.63b119a","type":"alexa-home-conf","z":"","username":"ABHOME"},{"id":"9b443040.499ed","type":"ui_group","z":"","name":"Test Suite","tab":"46e86076.fb6c98","order":1,"disp":true,"width":"6"},{"id":"101c7b7.af84985","type":"ui_group","z":"","name":"Unrecognized Commands","tab":"46e86076.fb6c98","order":2,"disp":true,"width":"12"},{"id":"46e86076.fb6c98","type":"ui_tab","z":"","name":"Ecolect","icon":"mic"},{"id":"fc4e4ae7.7aa3d8","type":"ui_gauge","z":"b7f34080.d736b","name":"","group":"95aa150c.0e5218","order":4,"width":"2","height":"2","gtype":"gage","title":"°C","label":"C","format":"{{value}}","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"x":470,"y":120,"wires":[]},{"id":"18759469.f7e7f4","type":"exec","z":"b7f34080.d736b","command":"vcgencmd measure_temp","addpay":false,"append":"","useSpawn":"","timer":"","name":"Temp","x":290,"y":80,"wires":[["3ca53c83.07f2d4"],[],[]]},{"id":"8885e5fd.0f4db8","type":"inject","z":"b7f34080.d736b","name":"","topic":"","payload":"","payloadType":"date","repeat":"60","crontab":"","once":true,"x":124.5,"y":88.25,"wires":[["18759469.f7e7f4","f149b2bc.682658","d76feb7c.6549e8","9a5a87c6.ac5ba8"]]},{"id":"3ca53c83.07f2d4","type":"function","z":"b7f34080.d736b","name":"Temp","func":"str = msg.payload;\nmsg1 = {payload: {Temp: parseFloat(str.substring(5,9)).toFixed(1)}};\nmsg2 = {payload: str.substring(5,9)};\n\nreturn [msg1, msg2];","outputs":"2","noerr":0,"x":470,"y":80,"wires":[["df0e0728.0cd6b"],["fc4e4ae7.7aa3d8"]]},{"id":"f149b2bc.682658","type":"exec","z":"b7f34080.d736b","command":"top -d 0.5 -b -n2 | grep \"Cpu(s)\"|tail -n 1 | awk '{print $2 + $4}'","addpay":false,"append":"","useSpawn":"","timer":"","name":"CPU","x":290,"y":160,"wires":[["1d562c25.11c0ec","b7110287.850228"],[],[]]},{"id":"d76feb7c.6549e8","type":"exec","z":"b7f34080.d736b","command":"free | grep Mem | awk '{print 100*($4+$6+$7)/$2}'","addpay":false,"append":"","useSpawn":"","timer":"","name":"RAM","x":290,"y":240,"wires":[["d85ce470.86b96","9322b99a.6869"],[],[]]},{"id":"b7110287.850228","type":"ui_gauge","z":"b7f34080.d736b","name":"","group":"95aa150c.0e5218","order":2,"width":"2","height":"2","gtype":"gage","title":"CPU","label":"CPU","format":"{{value}}","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"x":470,"y":200,"wires":[]},{"id":"9322b99a.6869","type":"ui_gauge","z":"b7f34080.d736b","name":"","group":"95aa150c.0e5218","order":3,"width":"2","height":"2","gtype":"gage","title":"RAM","label":"RAM","format":"{{value.toFixed(1)}}","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"x":470,"y":280,"wires":[]},{"id":"dfabcd9f.f170c","type":"ui_template","z":"b7f34080.d736b","group":"95aa150c.0e5218","name":"Time and Temp","order":1,"width":"6","height":"2","format":"<script>\n var icon=\"t\";\n\n \n var colours={\n \"blackOnOrange\": {items:[\"#222\",\"#fb7c00\"]}, \n \"blackOnGreen\" : {items:[\"#222\",\"#66ac66\"]},\n \"blackOnBlue\" : {items:[\"#222\",\"#8888ff\"]},\n \"blackOnYellow\" : {items:[\"#222\",\"#bbbb44\"]},\n \"blackOnWhite\" : {items:[\"#222\",\"#aaaaaa\"]},\n \"blackOnPink\" : {items:[\"#222\",\"#ff8888\"]},\n \"yellowOnRed\" : {items:[\"#ccaa22\",\"#aa2222\"]},\n \"whiteOnCyan\" : {items:[\"#dddddd\",\"#227777\"]},\n \"orangeOnBlack\" : {items:[\"#ff8800\",\"#000000\"]}, \n \"limeOnBlack\" : {items:[\"#00cc55\",\"#000000\"]}, \n } \n \n var daylist = [\"sun\", \"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\"];\n (function(scope){ \n scope.$watch('msg', function(msg) {\n if (typeof(msg.type) != \"undefined\") icon=msg.type;\n \n if (icon==\"t\")\n {\n $(\"#DSEGWEATHER-BACK\").text(\" \");\n $(\"#DSEGWEATHER-ICON\").text(\" \");\n $(\"#DSEGTempcF\").text(\"C\");\n $(\"#DSEGTempcB\").text(\"8\"); \n if (typeof(msg.payload) != \"undefined\") { $(\"#DSEGTempF\").text(msg.payload); $(\"#DSEGTempB\").text(\"88\"); }\n }\n else\n {\n $(\"#DSEGTempF\").text(\"\");\n $(\"#DSEGTempcF\").text(\"\");\n $(\"#DSEGTempB\").text(\"\");\n $(\"#DSEGTempcB\").text(\"\");\n $(\"#DSEGWEATHER-BACK\").text(\"0\");\n if (typeof(msg.payload) != \"undefined\") $(\"#DSEGWEATHER-ICON\").text(msg.payload);\n \n }\n if (typeof(msg.colour) != \"undefined\") {\n $(\".Clock-Wrapper\").css('background-color', colours[msg.colour].items[1]); $(\".lcdClock\").css('color', colours[msg.colour].items[0]); \n if (colours[msg.colour].items[1]==\"#000000\") $(\".background\").css('color',\"rgba(255,255,255,0.15)\"); else $(\".background\").css('color',\"rgba(0,0,0,0.1)\");\n }\n });\n })(scope);\n\n function genTimerStrings(tm, num){\n \n \tvar i;\n \tvar ret = tm.toString(10);\n \tvar left = ret.length;\n \n \tif( left < num){\n \t\tfor(i=0; i<( num - left ); i++ ){\n \t\t\tret = String(0) + ret;\n \t\t}\n \t}\n \treturn ret;\n }\n\n function updateTimer(){\n \tvar ret;\n \tvar date = new Date();\n \tvar tm_year, tm_mon, tm_date, tm_hour, tm_min, tm_sec, tm_msec,tm_day;\n \tvar colon;\n \ttm_year = date.getFullYear();\n \ttm_mon = date.getMonth()+1;\n \ttm_date = date.getDate();\n \ttm_day = date.getDay();\n \ttm_hour = date.getHours();\n \ttm_min = date.getMinutes();\n \ttm_sec = date.getSeconds();\n \ttm_msec = date.getMilliseconds();\n \n \ttm_mon = genTimerStrings(tm_mon, 2);\n \ttm_date = genTimerStrings(tm_date, 2);\n \ttm_hour = genTimerStrings(tm_hour, 2);\n \ttm_min = genTimerStrings(tm_min, 2);\n \ttm_sec = genTimerStrings(tm_sec, 2);\n \ttm_day = daylist[tm_day];\n \n \tif( tm_msec > 499 ){\n \t\tcolon = ' ';\n \t}else{\n \t\tcolon = ':';\n \t}\n \n \tdocument.getElementById(\"DSEGClock\").innerHTML = tm_hour + colon + tm_min + \"<span style=\\\"font-size:30px;\\\">\" + tm_sec + \"</span>\";\n \tdocument.getElementById(\"DSEGClock-Year\").innerHTML = \"<span class=\\\"D7MI\\\">\" + tm_year + \"-\" + tm_mon + \"-\" + tm_date + ' ' + \"</span><span class=\\\"D14MI\\\">\" + tm_day + \".\" + \"</span>\";\n \n \tsetTimeout(\"updateTimer()\", 500 - date.getMilliseconds()%500 );\n }\n\n updateTimer();\n \n</script>\n\n<style type=\"text/css\">\n.lcdClock {\n\tbackground-color:#fbfbfb;\n\tfont-size:100%;\n\tpadding-left:10px;\n\tpadding-right:10px;\n\tpadding-bottom:10px;\n\tmax-width:300px;\n\tline-height:160%;\n\tcolor:#222;\n\tfont-family:Meiryo, 'Lucida Grande','Hiragino Kaku Gothic ProN', sans-serif;\n}\n\n@font-face {\n font-family: \"D7MI\";\n src: url(\"/fonts/DSEG7Modern-Italic.woff\") format('woff');\n}\n\n@font-face {\n font-family: \"D14MI\";\n src: url(\"/fonts/DSEG14Modern-Italic.woff\") format('woff');\n}\n\n@font-face {\n font-family: \"D7MBI\";\n src: url(\"/fonts/DSEG7Modern-BoldItalic.woff\") format('woff');\n}\n\n@font-face {\n font-family: \"DWEATHER\";\n src: url(\"/fonts/DSEGWeather.woff\") format('woff');\n}\n\n.Weather-Background{\n\tz-index:50;\n\tposition:absolute;\n\ttop:24px;\n\tleft:226px;\n\tfont-size:68px;\n}\n\n.Weather-Front{\n\tz-index:51;\n\tposition:absolute;\n\ttop:24px;\n\tleft:226px;\n\tfont-size:68px;\n}\n\n.D7MI {\nfont-family: \"D7MI\";\n}\n\n.D7MBI {\nfont-family: \"D7MBI\";\n}\n\n.D14MI {\nfont-family: \"D14MI\";\n}\n\n.DWEATHER {\nfont-family: \"DWEATHER\";\nfont-size:68px;\nheight:68px;\n}\n\n.Clock-Wrapper{\n\tposition:relative;\n\tborder:6px solid #000;\n\tborder-radius:9px;\n\theight:68px;\n\twidth:280px;\n\tbackground-color:#fb7c00;\n\tbackground-color:#aaaaaa;\n\tbox-shadow: 4px 4px 28px 0px rgba(0,0,0,0.3) inset; \n}\n\n.Clock-Time-Background{\n\tz-index:50;\n}\n\n.Clock-Time-Front{\n\tz-index:51;\n}\n\n.Clock-Time-Background,.Clock-Time-Front {\n \tposition:absolute;\n\ttop:38px;\n\tleft:5px; \n\tfont-size:42px;\n}\n\n.background { color:rgba(0,0,0,0.1); }\n\n.Clock-Year-Background{\n\tz-index:50;\n\tfont-size:18px;\n}\n\n.Clock-Year-Front{\n\tz-index:51;\n}\n\n.Clock-Year-Background,.Clock-Year-Front {\n \tposition:absolute;\n\ttop:2px;\n\tleft:5px; \n\tfont-size:18px;\n}\n\n.temp { z-index:51; }\n.tempBack { z-index:50; color:rgba(0,0,0,0.1); }\n.temp,.tempBack {\n \tposition:absolute;\n\ttop:28px;\n\tleft:210px; \n\tfont-size:42px;\n}\n\n.tempc { z-index:51; }\n.tempcBack { z-index:50; }\n.tempc,.tempcBack {\n \tposition:absolute;\n\ttop:36px;\n\tleft:278px; \n\tfont-size:24px;\n}\n\n#DSEG7_OUTPUT{\n\tfont-family: \"D7MI\";\n}\n\n#DSEG14_OUTPUT{\n\tfont-family: \"D14MI\";\n}\n\n#DSEG14_OUTPUT, #DSEG7_OUTPUT{\n\tfont-size:18px;\n\tmargin-top:2px;\n\tmargin-bottom:10px;\n}\n\n</style>\n\n\n<div class=\"Clock-Wrapper center lcdClock\">\n\t<span class=\"Clock-Time-Background background D7MBI\">88:88<span style=\"font-size:30px;\">88</span></span>\n\t<span id=\"DSEGClock\" class=\"Clock-Time-Front D7MBI\"></span>\n\t<span class=\"Clock-Year-Background background\"><span class=\"D7MI\">2088-88-88</span><span class=\"D14MI\"> ~~~</span></span>\n\t<span id=\"DSEGClock-Year\" class=\"Clock-Year-Front\"></span>\n\t\n\t<span id=\"DSEGTempF\" class=\"temp D7MBI\">00</span>\n\t<span id=\"DSEGTempB\" class=\"tempBack background D7MBI\">88</span>\t\n\t<span id=\"DSEGTempcF\" class=\"tempc D7MI\">C</span>\n\t<span id=\"DSEGTempcB\" class=\"tempcBack background D7MI\">8</span>\n\t\n\t\n\t<span id=\"DSEGWEATHER-BACK\" class=\"Weather-Background background DWEATHER\"></span>\n\t<span id=\"DSEGWEATHER-ICON\" class=\"Weather-Front DWEATHER\"></span>\n\t\t\n</div>\n\n","storeOutMessages":true,"fwdInMessages":false,"templateScope":"local","x":1420,"y":280,"wires":[[]]},{"id":"7ce7936c.92224c","type":"inject","z":"b7f34080.d736b","name":"21c","topic":"","payload":"21","payloadType":"num","repeat":"","crontab":"","once":false,"x":950,"y":40,"wires":[["dfabcd9f.f170c"]]},{"id":"cd4aa6c2.e4738","type":"inject","z":"b7f34080.d736b","name":"green","topic":"","payload":"blackOnGreen","payloadType":"str","repeat":"","crontab":"","once":false,"x":950,"y":200,"wires":[["e725a725.69cb28"]]},{"id":"136bff9b.d3cd3","type":"inject","z":"b7f34080.d736b","name":"orange","topic":"","payload":"blackOnOrange","payloadType":"str","repeat":"","crontab":"","once":false,"x":950,"y":240,"wires":[["e725a725.69cb28"]]},{"id":"e725a725.69cb28","type":"function","z":"b7f34080.d736b","name":"Colour","func":"msg.colour=msg.payload;\nmsg.payload=undefined;\nreturn msg;","outputs":1,"noerr":0,"x":1230,"y":280,"wires":[["dfabcd9f.f170c"]]},{"id":"175a5f9d.572f5","type":"inject","z":"b7f34080.d736b","name":"blue","topic":"","payload":"blackOnBlue","payloadType":"str","repeat":"","crontab":"","once":false,"x":950,"y":280,"wires":[["e725a725.69cb28"]]},{"id":"c152c764.5d6138","type":"inject","z":"b7f34080.d736b","name":"yellow","topic":"","payload":"blackOnYellow","payloadType":"str","repeat":"","crontab":"","once":false,"x":950,"y":320,"wires":[["e725a725.69cb28"]]},{"id":"5d5eaec1.f7e0a8","type":"inject","z":"b7f34080.d736b","name":"white","topic":"","payload":"blackOnWhite","payloadType":"str","repeat":"","crontab":"","once":false,"x":950,"y":360,"wires":[["e725a725.69cb28"]]},{"id":"2b1bf194.4dd3fe","type":"inject","z":"b7f34080.d736b","name":"pink","topic":"","payload":"blackOnPink","payloadType":"str","repeat":"","crontab":"","once":false,"x":950,"y":400,"wires":[["e725a725.69cb28"]]},{"id":"6f8c2710.37603","type":"inject","z":"b7f34080.d736b","name":"red and light text","topic":"","payload":"yellowOnRed","payloadType":"str","repeat":"","crontab":"","once":false,"x":980,"y":440,"wires":[["e725a725.69cb28"]]},{"id":"573e6655.049938","type":"inject","z":"b7f34080.d736b","name":"cyan and white","topic":"","payload":"whiteOnCyan","payloadType":"str","repeat":"","crontab":"","once":false,"x":980,"y":480,"wires":[["e725a725.69cb28"]]},{"id":"7026191c.ba4d9","type":"inject","z":"b7f34080.d736b","name":"Type t for TEXT","topic":"","payload":"t","payloadType":"str","repeat":"","crontab":"","once":false,"x":980,"y":560,"wires":[["f5a032ac.cfd05"]]},{"id":"d2835e7a.2ed35","type":"inject","z":"b7f34080.d736b","name":"Type w for weather","topic":"","payload":"w","payloadType":"str","repeat":"","crontab":"","once":false,"x":990,"y":600,"wires":[["f5a032ac.cfd05"]]},{"id":"f5a032ac.cfd05","type":"function","z":"b7f34080.d736b","name":"Type","func":"msg.type=msg.payload;\nmsg.payload=undefined;\nreturn msg;","outputs":1,"noerr":0,"x":1230,"y":560,"wires":[["dfabcd9f.f170c"]]},{"id":"e132c87e.4dce98","type":"inject","z":"b7f34080.d736b","name":"weather 2","topic":"","payload":"2","payloadType":"str","repeat":"","crontab":"","once":false,"x":960,"y":119,"wires":[["dfabcd9f.f170c"]]},{"id":"553d2678.b573b8","type":"inject","z":"b7f34080.d736b","name":"weather 3","topic":"","payload":"3","payloadType":"str","repeat":"","crontab":"","once":false,"x":960,"y":159,"wires":[["dfabcd9f.f170c"]]},{"id":"b3d9b7a6.757e","type":"inject","z":"b7f34080.d736b","name":"lime on black","topic":"","payload":"limeOnBlack","payloadType":"str","repeat":"","crontab":"","once":false,"x":970,"y":520,"wires":[["e725a725.69cb28"]]},{"id":"9a5a87c6.ac5ba8","type":"function","z":"b7f34080.d736b","name":"get temp","func":"var temp = parseInt(global.get('temperature'));\nmsg.payload = temp;\nreturn msg;","outputs":"1","noerr":0,"x":940,"y":80,"wires":[["dfabcd9f.f170c"]]},{"id":"ad8eccbb.692068","type":"telegram sender","z":"1523804c.6a58f","name":"send response","bot":"1cd082c0.e0a865","x":1160,"y":240,"wires":[[]]},{"id":"3c3d0259.b9c5fe","type":"function","z":"1523804c.6a58f","name":"Create help text","func":"\nvar helpMessage = \"Olá! Sou o Tamabot :)\\r\\n\";\nhelpMessage = \"/help - mostra ajuda\\r\\n\";\nhelpMessage += \"/temp - informa a temperatura\\r\\n\";\nhelpMessage += \"/pic - tira uma foto do local do sensor\\r\\n\";\nhelpMessage += \"/cpf [CPF] - valida cpf\\r\\n\";\nhelpMessage += \"/fat [CPF] [dataNasc] [mesFat]\\r\\n\";\nhelpMessage += \"/quote [valor] [moeda]\\r\\n\";\nhelpMessage += \"/ip - informa o IP atual\\r\\n\";\nhelpMessage += \"/ping - ...pong :)\\r\\n\";\nhelpMessage += \"Seu Id é \" + msg.payload.chatId;\n\nhelpMessage += \"\\r\\n\";\nhelpMessage += \"Seja bem vindo \"+ msg.originalMessage.from.first_name + \"[\" + msg.originalMessage.from.username + \"]\";\nhelpMessage += \"\\r\\n\";\n\nmsg.payload.content = helpMessage;\nreturn msg;","outputs":1,"noerr":0,"x":340,"y":120,"wires":[["ad8eccbb.692068"]]},{"id":"6b7a8190.92c968","type":"function","z":"1523804c.6a58f","name":"/pong","func":"var CID = msg.originalMessage.from.id;\nmsg.payload = {chatId : CID, type : 'message', content : 'pong ;)'};\nreturn msg;","outputs":1,"noerr":0,"x":370,"y":240,"wires":[["ad8eccbb.692068"]]},{"id":"59a10454.8eab34","type":"telegram command","z":"1523804c.6a58f","name":"/help","command":"/help","bot":"1cd082c0.e0a865","x":170,"y":180,"wires":[["3c3d0259.b9c5fe"],[]]},{"id":"b52163cb.66db58","type":"telegram command","z":"1523804c.6a58f","name":"/ping","command":"/ping","bot":"1cd082c0.e0a865","x":170,"y":240,"wires":[["6b7a8190.92c968"],[]]},{"id":"d0988912.de40d","type":"file","z":"1523804c.6a58f","name":"","filename":"Logfile","appendNewline":true,"createDir":false,"overwriteFile":"false","x":490,"y":420,"wires":[]},{"id":"2d85df4d.f846f","type":"telegram receiver","z":"1523804c.6a58f","name":"Unauthorized","bot":"1cd082c0.e0a865","x":190,"y":420,"wires":[[],["d70a9990.ec7ff8"]]},{"id":"d70a9990.ec7ff8","type":"function","z":"1523804c.6a58f","name":"Create log","func":"var chatId = msg.payload.chatId;\nvar username = msg.originalMessage.from.username;\nmsg.originalMessage.timestamp = new Date();\nvar message = JSON.stringify(msg.originalMessage);\n\nmsg.topic = username + ' ' + chatId;\nmsg.payload = [msg.topic, message];\n\nreturn msg;","outputs":1,"noerr":0,"x":350,"y":420,"wires":[["d0988912.de40d"]]},{"id":"4e2b1c3b.8d646c","type":"sentiment","z":"1523804c.6a58f","name":"Sentiment","x":490,"y":720,"wires":[["308b8273.0cae1e"]]},{"id":"308b8273.0cae1e","type":"function","z":"1523804c.6a58f","name":"Send response","func":"var CID = msg.originalMessage.from.id;\nvar USER = msg.originalMessage.from.first_name\n\nif(msg.sentiment.score > 0)\n{\n msg.payload = {chatId : CID, type : 'message', content : USER + ' that looks good!'}\n return msg;\n}\nelse\n{\n msg.payload = {chatId : CID, type : 'message', content : USER + ' it looks bad...'}\n return msg;\n}\n","outputs":1,"noerr":0,"x":660,"y":720,"wires":[["ad8eccbb.692068"]]},{"id":"3e5cc40.eb103bc","type":"function","z":"1523804c.6a58f","name":"GetPayload","func":"msg.payload = msg.payload.content\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":720,"wires":[["4e2b1c3b.8d646c"]]},{"id":"2b2c3ab4.00b48e","type":"telegram command","z":"1523804c.6a58f","name":"/pic","command":"/pic","bot":"1cd082c0.e0a865","x":170,"y":300,"wires":[["f085eae1.074da8"],[]]},{"id":"e7635576.e42fa8","type":"function","z":"1523804c.6a58f","name":"/pic","func":"var CID = msg.originalMessage.from.id;\nvar USER = msg.originalMessage.from.first_name;\nmsg.payload = {chatId : CID, type : 'photo', content : '/home/pi/current'};\n\nreturn msg;","outputs":1,"noerr":0,"x":490,"y":300,"wires":[["ad8eccbb.692068"]]},{"id":"9345392d.19b098","type":"function","z":"1523804c.6a58f","name":"CPF validation","func":"var chatId = msg.originalMessage.from.id;\n\nvar arr = msg.payload.content.split(\" \");\n\nvar cpf=arr[1].trim();\n\nif (cpf.length===11 || cpf.length>11){\n var content = '';\n if (isValidCPF(cpf)===false){\n content = content + 'O cpf '+ cpf + ' é inválido.';\n }\n else{\n content = content + 'O cpf '+ cpf + ' é válido.';\n }\nvar msg = { payload: {chatId : chatId, type : 'message', content : content}};\nreturn msg;\n}\n\nfunction isValidCPF(cpf) { \n// cpf = cpf.replace(/[^\\d]+/g,''); \n if(cpf === '') return false; \n // Elimina CPFs invalidos conhecidos \n if (cpf.length != 11 || \n cpf == \"00000000000\" || \n cpf == \"11111111111\" || \n cpf == \"22222222222\" || \n cpf == \"33333333333\" || \n cpf == \"44444444444\" || \n cpf == \"55555555555\" || \n cpf == \"66666666666\" || \n cpf == \"77777777777\" || \n cpf == \"88888888888\" || \n cpf == \"99999999999\")\n return false; \n // Valida 1o digito \n add = 0; \n for (i=0; i < 9; i ++) \n add += parseInt(cpf.charAt(i)) * (10 - i); \n rev = 11 - (add % 11); \n if (rev == 10 || rev == 11) \n rev = 0; \n if (rev != parseInt(cpf.charAt(9))) \n return false; \n // Valida 2o digito \n add = 0; \n for (i = 0; i < 10; i ++) \n add += parseInt(cpf.charAt(i)) * (11 - i); \n rev = 11 - (add % 11); \n if (rev == 10 || rev == 11) \n rev = 0; \n if (rev != parseInt(cpf.charAt(10)))\n return false; \n return true; \n}\n","outputs":1,"noerr":0,"x":340,"y":360,"wires":[["ad8eccbb.692068"]]},{"id":"e71a77c4.111818","type":"telegram command","z":"1523804c.6a58f","name":"/start","command":"/start","bot":"1cd082c0.e0a865","x":170,"y":120,"wires":[["3c3d0259.b9c5fe"],[]]},{"id":"ec70f29c.f89998","type":"http request","z":"1523804c.6a58f","name":"Get quotation","method":"GET","ret":"obj","url":"","tls":"","x":780,"y":540,"wires":[["6e33e461.bb7ebc"]]},{"id":"e5eb63c1.90b5d","type":"telegram command","z":"1523804c.6a58f","name":"/quote","command":"/quote","bot":"1cd082c0.e0a865","x":170,"y":480,"wires":[["15da92a7.72b6fd"],[]]},{"id":"6a2722a4.5b2c7c","type":"inject","z":"1523804c.6a58f","name":"","topic":"","payload":"","payloadType":"date","repeat":"600","crontab":"","once":false,"x":190,"y":540,"wires":[["574df0.ba002a1"]]},{"id":"6546ee77.38a008","type":"comment","z":"1523804c.6a58f","name":"Telegrambot","info":"","x":190,"y":60,"wires":[]},{"id":"28ff6787.e1799","type":"telegram command","z":"1523804c.6a58f","name":"/cpf","command":"/cpf","bot":"1cd082c0.e0a865","x":170,"y":360,"wires":[["9345392d.19b098"],[]]},{"id":"3c96f8f0.709748","type":"sqlite","z":"1523804c.6a58f","mydb":"ae0fb445.795808","name":"users","x":490,"y":480,"wires":[["d98fb8f.e0f4e48"]]},{"id":"d98fb8f.e0f4e48","type":"function","z":"1523804c.6a58f","name":"Set monitor","func":"var chatId= msg.chatId;\nvar first_name = msg.first_name;\nvar value = msg.value;\nvar currency = msg.currency;\nvar getcc = true;\nvar url = \"https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20csv%20where%20url%3D%22http%3A%2F%2Ffinance.yahoo.com%2Fd%2Fquotes.csv%3Fe%3D.csv%26f%3Dc4l1%26s%3D\" + currency + \"%3DX%22%3B&format=json&diagnostics=true&callback=\";\n\nif (msg.payload.length>0){\n if (value>0){\n topic = \"UPDATE users SET first_name='\" + first_name + \"', value='\" + value + \"', currency='\" + currency + \"' WHERE chatId='\" + chatId + \"'\";\n content = \"O target de \" + value + \" de \" + currency + \" será monitorado!\"\n }\n else{\n topic = \"DELETE FROM users WHERE chatId='\" + chatId + \"'\"\n content = \"Monitoramento interrompido.\" \n }\n}\nelse{\n if (value>0){\n topic = \"INSERT INTO users (chatId, first_name, value, currency) VALUES ('\" + chatId + \"', '\" + first_name + \"', '\" + value + \"', '\" + currency + \"')\"; \n content = \"O target de \" + value + \" de \" + currency + \" será monitorado!\"\n }\n else{\n content = \"Valor zero não será monitorado.\"; \n }\n}\n\nmsg1 = { payload: {chatId : chatId, type : 'message', content : content}, advertise: {chatId : chatId, first_name : first_name, value : value, currency : currency}, topic : topic, url : url, getcc: getcc};\n\nnode.send(msg1);\n\n\n//var msg = { payload: {chatId : chatId, type : 'message', content : content}, topic : topic, url : url};\n//return msg;","outputs":"1","noerr":0,"x":630,"y":480,"wires":[["722d34eb.f8db54","ad8eccbb.692068"]]},{"id":"4f376c43.4ce444","type":"sqlite","z":"1523804c.6a58f","mydb":"ae0fb445.795808","name":"currencies","x":970,"y":480,"wires":[[]]},{"id":"15da92a7.72b6fd","type":"function","z":"1523804c.6a58f","name":"Check user","func":"var chatId = msg.originalMessage.from.id;\nvar first_name = msg.originalMessage.from.first_name;\nvar arr = msg.payload.content.split(\" \");\n//var value = arr[0].replace(/^\\s+|\\s+$/gm,'');\nvar value = arr[1];\nvar currency = arr[2];\n\nif (currency === null || currency === undefined){\n currency = \"USDBRL\";\n}\n\nvar topic = \"SELECT * FROM users WHERE chatId='\" + chatId + \"'\";\n\nvar msg = { chatId : chatId, first_name : first_name, type : 'message', value : value, currency: currency, topic : topic};\n\nreturn msg;\n","outputs":"1","noerr":0,"x":350,"y":480,"wires":[["3c96f8f0.709748"]]},{"id":"b2625fa9.ffebc","type":"sqlite","z":"1523804c.6a58f","mydb":"ae0fb445.795808","name":"quotes","x":490,"y":540,"wires":[["76254b06.7b290c"]]},{"id":"574df0.ba002a1","type":"function","z":"1523804c.6a58f","name":"Get users","func":"msg.topic = \"SELECT * FROM users\";\n\nreturn msg;","outputs":1,"noerr":0,"x":360,"y":540,"wires":[["b2625fa9.ffebc"]]},{"id":"76254b06.7b290c","type":"function","z":"1523804c.6a58f","name":"Monitor","func":"var size = msg.payload.length;\n\nfor (var i=0; i<size; i++) {\n chatId = msg.payload[i].chatId;\n first_name = msg.payload[i].first_name;\n value = msg.payload[i].value;\n currency = msg.payload[i].currency;\n url = \"https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20csv%20where%20url%3D%22http%3A%2F%2Ffinance.yahoo.com%2Fd%2Fquotes.csv%3Fe%3D.csv%26f%3Dc4l1%26s%3D\" + currency + \"%3DX%22%3B&format=json&diagnostics=true&callback=\";\n\n msg1 = { advertise: {chatId : chatId, first_name : first_name, value : value, currency : currency}, url : url};\n\n node.send(msg1);\n}\n","outputs":1,"noerr":0,"x":620,"y":540,"wires":[["ec70f29c.f89998"]]},{"id":"6e33e461.bb7ebc","type":"function","z":"1523804c.6a58f","name":"Advertise","func":"var chatId = msg.advertise.chatId;\nvar first_name = msg.advertise.first_name;\nvar spvalue = msg.advertise.value;\nvar currency = msg.advertise.currency;\nvar getcc = msg.getcc;\n\nvar qtvalue = msg.payload.query.results.row.col1;\n\nif (qtvalue<=spvalue||getcc===true){\n content = first_name + \" a cotacao \" + currency + \" é \" + qtvalue;\n var msg = { payload: {chatId : chatId, type : 'message', content : content}};\n return msg;\n}\n\n//content = first_name + \" a cotacao \" + currency + \" é \" + qtvalue;\n\n//var msg = { payload: {chatId : chatId, type : 'message', content : content}};\n\n//return msg;\n\n//else{\n// content = \"Monitorando \" + setpoint + \". A cotacao atual do dolar e \" + value;\n// var msg = { payload: {chatId : chatId, type : 'message', content : content}};\n// return msg;\n//}\n","outputs":1,"noerr":0,"x":940,"y":540,"wires":[["ad8eccbb.692068"]]},{"id":"722d34eb.f8db54","type":"http request","z":"1523804c.6a58f","name":"Get quotation","method":"GET","ret":"obj","url":"","tls":"","x":800,"y":480,"wires":[["4f376c43.4ce444","6e33e461.bb7ebc"]]},{"id":"d30386ba.f182a8","type":"function","z":"1523804c.6a58f","name":"List all invoices","func":"msg.topic = \"SELECT * FROM invoices WHERE 1\";\n\nreturn msg;","outputs":1,"noerr":0,"x":360,"y":1000,"wires":[["d5b6da6e.078e88"]]},{"id":"d5b6da6e.078e88","type":"sqlite","z":"1523804c.6a58f","mydb":"6071fa98.953c0c","name":"invoices","x":520,"y":1000,"wires":[[]]},{"id":"8cfd5ad9.1f4b78","type":"inject","z":"1523804c.6a58f","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":180,"y":1000,"wires":[["d30386ba.f182a8"]]},{"id":"9bbdf6c8.30c998","type":"function","z":"1523804c.6a58f","name":"SQL Splitter","func":"var arr = msg.topic.split(\";\");\nfor(var i=0;i<arr.length;i++) {\n msg.topic=arr[i];\n node.send(msg);\n}","outputs":1,"noerr":0,"x":350,"y":1040,"wires":[["d5b6da6e.078e88"]]},{"id":"dbaece14.001a3","type":"inject","z":"1523804c.6a58f","name":"myinvoice","topic":"select contractid as contract from credentials where cpf=76773108691 and birthdate='16/03/1970' or pwd='tamabot'; select invoiceid as invoice from invoices where strftime('%m', duedate)='11' and contractid=99208427","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":180,"y":1040,"wires":[["9bbdf6c8.30c998"]]},{"id":"a325dd49.42929","type":"sqlite","z":"1523804c.6a58f","mydb":"6071fa98.953c0c","name":"Get contract","x":510,"y":600,"wires":[["c2175f99.d392e8"]]},{"id":"c2175f99.d392e8","type":"function","z":"1523804c.6a58f","name":"Contractid","func":"var chatId = msg.originalMessage.from.id;\nvar User = msg.originalMessage.from.first_name;\nvar content ='';\n\ntry {\n // try to do something\n var contract = msg.payload[0].contract;\n month = global.get('month');\n msg.topic = \"Select invoiceid as invoice from invoices where strftime('%m', duedate)='\" + month + \"' and contractid='\" + contract + \"'\";\n content = \"Aqui esta sua fatura!\";\n} catch (e) {\n // handle errors\n content = \"Contrato nao encontrado.\"\n} finally {\n var msg1 = { payload: {chatId : chatId, type : 'message', content : content}};\n msg.payload = [msg.payload];\n return [msg, msg1];\n}\n","outputs":"2","noerr":0,"x":670,"y":600,"wires":[["f99a9a03.1342c8"],["39d814ef.5de964"]]},{"id":"f99a9a03.1342c8","type":"sqlite","z":"1523804c.6a58f","mydb":"6071fa98.953c0c","name":"Get invoice","x":830,"y":600,"wires":[["6a68189b.5ccf38"]]},{"id":"6a68189b.5ccf38","type":"function","z":"1523804c.6a58f","name":"Send invoice","func":"var chatId = msg.originalMessage.from.id;\nvar invoice = msg.payload[0].invoice;\n\nmsg.payload = {chatId: chatId, type : 'document', content : '/home/pi/Downloads/fatura-'+ invoice + '.pdf'};\nreturn msg;","outputs":1,"noerr":0,"x":990,"y":600,"wires":[["ad8eccbb.692068"]]},{"id":"733fb9ee.f573c8","type":"telegram command","z":"1523804c.6a58f","name":"/fat","command":"/fat","bot":"1cd082c0.e0a865","x":170,"y":600,"wires":[["4722acfa.73a444"],[]]},{"id":"d7a15fda.073f18","type":"function","z":"1523804c.6a58f","name":"Validate CPF","func":"var cpf = msg.payload\n\nfunction validarCPF(cpf) { \n// cpf = cpf.replace(/[^\\d]+/g,''); \n if(cpf === '') return false; \n // Elimina CPFs invalidos conhecidos \n if (cpf.length != 11 || \n cpf == \"00000000000\" || \n cpf == \"11111111111\" || \n cpf == \"22222222222\" || \n cpf == \"33333333333\" || \n cpf == \"44444444444\" || \n cpf == \"55555555555\" || \n cpf == \"66666666666\" || \n cpf == \"77777777777\" || \n cpf == \"88888888888\" || \n cpf == \"99999999999\")\n return false; \n // Valida 1o digito \n add = 0; \n for (i=0; i < 9; i ++) \n add += parseInt(cpf.charAt(i)) * (10 - i); \n rev = 11 - (add % 11); \n if (rev == 10 || rev == 11) \n rev = 0; \n if (rev != parseInt(cpf.charAt(9))) \n return false; \n // Valida 2o digito \n add = 0; \n for (i = 0; i < 10; i ++) \n add += parseInt(cpf.charAt(i)) * (11 - i); \n rev = 11 - (add % 11); \n if (rev == 10 || rev == 11) \n rev = 0; \n if (rev != parseInt(cpf.charAt(10)))\n return false; \n return true; \n}\n\nmsg.payload = validarCPF(cpf);\nreturn msg;\n","outputs":1,"noerr":0,"x":350,"y":1100,"wires":[[]]},{"id":"9f232a07.37254","type":"inject","z":"1523804c.6a58f","name":"","topic":"","payload":"76773108691","payloadType":"str","repeat":"","crontab":"","once":false,"x":190,"y":1100,"wires":[["d7a15fda.073f18"]]},{"id":"95c4a442.a37aa","type":"function","z":"1523804c.6a58f","name":"Validade Date","func":"var date = msg.payload\n\nfunction isValidDate(date) {\n\n //dd/mm/yyyy\n var date_regex = /^(0?[1-9]|[12][0-9]|3[01])[\\/\\-](0?[1-9]|1[012])[\\/\\-]\\d{4}$/;\n\n //mm/dd/yyyy\n //var date_regex = /^(0[1-9]|1[0-2])\\/(0[1-9]|1\\d|2\\d|3[01])\\/(19|20)\\d{2}$/;\n\n //yyyy/mm/dd\n //var date_regex = /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/;\n\n if (!(date_regex.test(date))) {\n return false\n }\n else {\n return true\n }\n}\n\nmsg.payload = isValidDate(date);\nreturn msg;","outputs":1,"noerr":0,"x":360,"y":1140,"wires":[[]]},{"id":"fc2c9578.eeb1f8","type":"inject","z":"1523804c.6a58f","name":"","topic":"","payload":"16/03/1970","payloadType":"str","repeat":"","crontab":"","once":false,"x":190,"y":1140,"wires":[["95c4a442.a37aa"]]},{"id":"4722acfa.73a444","type":"function","z":"1523804c.6a58f","name":"Parse & validate","func":"var chatId = msg.originalMessage.from.id;\nvar first_name = msg.originalMessage.from.first_name;\n\nif (msg.payload.content.length>4){\n\nvar arr = msg.payload.content.split(\" \");\nvar allvalid = true;\n\nvar cpf=arr[1];\nvar date=arr[2];\n\nvar datearr = date.split(\"/\");\nvar dd=datearr[0];\nvar mm=datearr[1];\nvar yy=datearr[2];\nif(dd.length<2){\n dd='0' + dd;\n}\nif(mm.length<2){\n mm='0' + mm;\n}\nif(yy.length<4){\n yy='19' + yy;\n}\ndate=dd+'/'+mm+'/'+yy;\n\n//date = date.toString();\n\n//month=arr[3];\nif(arr[3].length<2){\n arr[3]='0' + arr[3]\n}\nglobal.set('month',arr[3]);\nmonth = global.get('month');\n\nvar content = '';\n\nif (isValidCPF(cpf)===false){\n content = content + 'O cpf: '+ cpf + ' é invalido.';\n allvalid=false; \n}\n\nif (isValidDate(date)===false){\n content = content + ' A data ' + date + ' está incorreta e deve estar no formato dd/mm/yyyy.';\n allvalid=false; \n}\n\nif (isValidMonth(month)===false){\n content = content + ' A referência ' + month + ' não é válida. Deve ser de 6 a 11.';\n allvalid=false; \n}\n\nif (allvalid===true){\n content = first_name + \", por favor aguarde...\";\n msg.topic = \"Select contractid as contract from credentials where cpf='\"+ cpf + \"' and birthdate='\" + date + \"'\";\n}\n}\nelse{\ncontent = \"Envie novamente o comando com os parametros.\";\n}\n\nvar msg1 = { payload: {chatId : chatId, type : 'message', content : content}};\n\nreturn [msg, msg1];\n\n\nfunction isValidCPF(cpf) { \n// cpf = cpf.replace(/[^\\d]+/g,''); \n if(cpf === '') return false; \n // Elimina CPFs invalidos conhecidos \n if (cpf.length != 11 || \n cpf == \"00000000000\" || \n cpf == \"11111111111\" || \n cpf == \"22222222222\" || \n cpf == \"33333333333\" || \n cpf == \"44444444444\" || \n cpf == \"55555555555\" || \n cpf == \"66666666666\" || \n cpf == \"77777777777\" || \n cpf == \"88888888888\" || \n cpf == \"99999999999\")\n return false; \n // Valida 1o digito \n add = 0; \n for (i=0; i < 9; i ++) \n add += parseInt(cpf.charAt(i)) * (10 - i); \n rev = 11 - (add % 11); \n if (rev == 10 || rev == 11) \n rev = 0; \n if (rev != parseInt(cpf.charAt(9))) \n return false; \n // Valida 2o digito \n add = 0; \n for (i = 0; i < 10; i ++) \n add += parseInt(cpf.charAt(i)) * (11 - i); \n rev = 11 - (add % 11); \n if (rev == 10 || rev == 11) \n rev = 0; \n if (rev != parseInt(cpf.charAt(10)))\n return false; \n return true; \n}\n\nfunction isValidDate(date) {\n //dd/mm/yyyy\n var date_regex = /^(0?[1-9]|[12][0-9]|3[01])[\\/\\-](0?[1-9]|1[012])[\\/\\-]\\d{4}$/;\n //mm/dd/yyyy\n //var date_regex = /^(0[1-9]|1[0-2])\\/(0[1-9]|1\\d|2\\d|3[01])\\/(19|20)\\d{2}$/;\n //yyyy/mm/dd\n //var date_regex = /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/;\n if (!(date_regex.test(date))) {\n return false;\n }\n else {\n return true;\n }\n}\n\nfunction isValidMonth(mes) {\n if (mes>12 || mes<6){\n return false;\n }\n else {\n return true;\n }\n}\n","outputs":"2","noerr":0,"x":340,"y":600,"wires":[["a325dd49.42929"],["ad8eccbb.692068"]]},{"id":"fe7e82e7.6c79e","type":"comment","z":"1523804c.6a58f","name":"Debug","info":"","x":150,"y":960,"wires":[]},{"id":"39d814ef.5de964","type":"delay","z":"1523804c.6a58f","name":"msg sync","pauseType":"delay","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":980,"y":640,"wires":[["ad8eccbb.692068"]]},{"id":"cdef1121.345e3","type":"telegram receiver","z":"1523804c.6a58f","name":"location","bot":"1cd082c0.e0a865","x":170,"y":660,"wires":[["1c08593a.281587"],[]]},{"id":"1c08593a.281587","type":"function","z":"1523804c.6a58f","name":"Location message","func":"if(msg.payload.type == 'location')\n{\n global.set('chatId_g', msg.originalMessage.from.id);\n var lat = msg.payload.content.latitude;\n var lon = msg.payload.content.longitude;\n var time = Date.now();\n\n var msg = { location: {lat : lat, lon : lon}, time : time};\n\n// msg.payload.type = 'message';\n// msg.payload.content = msg.originalMessage.from.first_name + ' você está em ' + 'lat=' + lat + ' lon=' + lon;\n return msg;\n}\nelse\n{\n return null;\n}\n","outputs":1,"noerr":0,"x":330,"y":660,"wires":[["5aa5f73b.bff9a"]]},{"id":"dbd6724e.912b58","type":"function","z":"1523804c.6a58f","name":"Weather message","func":"chatId = global.get('chatId_g');\n\nvar temperature = msg.data.currently.temperature;\nvar humidity = Math.round(msg.payload.humidity*100);\nvar detail = msg.payload.detail;\n\ncontent = detail + \" A temperatura é de \" + temperature + \"°C, humidade relativa de \" + humidity + \"%.\";\n\nvar msg = { payload: {chatId : chatId, type : 'message', content : content}};\n\nreturn msg;\n","outputs":1,"noerr":0,"x":670,"y":660,"wires":[["ad8eccbb.692068"]]},{"id":"5aa5f73b.bff9a","type":"darksky","z":"1523804c.6a58f","darksky":"11d5bdee.25af8a","name":"","lon":"","lat":"","date":"","time":"","mode":"node","units":"auto","x":500,"y":660,"wires":[["dbd6724e.912b58"]]},{"id":"664026bc.9e6e3","type":"exec","z":"1523804c.6a58f","command":"ifconfig","append":"","useSpawn":false,"name":"ifconfig","x":440,"y":780,"wires":[["aaca2ce6.63b5a"],[],[]]},{"id":"aaca2ce6.63b5a","type":"function","z":"1523804c.6a58f","name":"Parse IP","func":"// Initialize variables\nvar input, tokens, inet, bcast, mask;\nvar outString = \"Network config\\n\";\n\n// Parse the entire string by spaces, and put each item into an array called tokens\n\ninput = msg.payload;\ntokens = input.split(\":\", 10);\n\n// Get the 7th token (example: \"addr:192.168.0.120\")\n// and get the substring from character 6 to the end\ninet = tokens[7].split(\" \", 1);\noutString += \"\\n\" + \"inet_addr: \" + inet[0];\n\n// Get the 8th token (example: \"Bcast:192.168.0.255\")\n// and get the substring from character 7 to the end\nbcast = tokens[8].split(\" \", 1);\noutString += \"\\n\" + \"Bcast: \" + bcast[0];\n\n// Get the 9th token (example: \"Mask:255.255.255.0\")\n// and get the substring from character 6 to the end\nmask = tokens[9].split(\" \", 1);\noutString += \"\\n\" + \"Mask: \" + mask[0];\n\nglobal.set(\"myIP\", \" \" + inet[0]);\n\nmsg.payload = global.get (\"myIP\");\n\nreturn msg;\n","outputs":1,"noerr":0,"x":580,"y":780,"wires":[["646b3195.405358"]]},{"id":"646b3195.405358","type":"exec","z":"1523804c.6a58f","command":"iwgetid","addpay":false,"append":"","useSpawn":false,"timer":"","name":"iwgetid","x":720,"y":780,"wires":[["84e3143d.3acca8"],[],[]]},{"id":"2ce529bf.06f6fe","type":"telegram command","z":"1523804c.6a58f","name":"/ip","command":"/ip","bot":"1cd082c0.e0a865","x":170,"y":780,"wires":[["b4e8b170.a99378"],[]]},{"id":"d2a1e81a.7043a8","type":"function","z":"1523804c.6a58f","name":"Send IP & SSID","func":"var myIP = global.get (\"myIP\");\nvar mySSID = global.get (\"mySSID\");\n\nvar content = \"I'm with IP address \" + myIP + \" @ \" + mySSID;\n\nvar msg = { payload: {chatId : 95387852, type : 'message', content : content}};\n\nreturn msg;\n\n\n\n\n","outputs":1,"noerr":0,"x":1020,"y":780,"wires":[["ad8eccbb.692068"]]},{"id":"84e3143d.3acca8","type":"function","z":"1523804c.6a58f","name":"Get SSID","func":"SSID = msg.payload;\n\nglobal.set(\"mySSID\", SSID);\n\nmsg.payload = global.get (\"mySSID\");\n\nreturn msg;\n","outputs":1,"noerr":0,"x":860,"y":780,"wires":[["d2a1e81a.7043a8"]]},{"id":"b4e8b170.a99378","type":"function","z":"1523804c.6a58f","name":"wlan0","func":"msg.payload = \"wlan0\";\nreturn msg;","outputs":1,"noerr":0,"x":310,"y":780,"wires":[["664026bc.9e6e3"]]},{"id":"15aa4c88.0f85bb","type":"mqtt out","z":"f5c189e4.4369e8","name":"","topic":"cmnd/sonoff1/POWER","qos":"1","retain":"","broker":"3f9f7390.9dae5c","x":740,"y":360,"wires":[]},{"id":"9a83a4e1.143868","type":"mqtt in","z":"f5c189e4.4369e8","name":"","topic":"tele/pow1/ENERGY","qos":"0","broker":"3f9f7390.9dae5c","x":990,"y":120,"wires":[["121b72ad.5b314d"]]},{"id":"4fb6e392.b45d44","type":"mqtt out","z":"f5c189e4.4369e8","name":"","topic":"cmnd/pow1/POWER","qos":"1","retain":"","broker":"3f9f7390.9dae5c","x":740,"y":120,"wires":[]},{"id":"9388da9.c3f89a8","type":"inject","z":"f5c189e4.4369e8","name":"","topic":"","payload":"ON","payloadType":"str","repeat":"","crontab":"","once":true,"x":110,"y":280,"wires":[["261961fc.d96a2e","398876d6.80fe82","f126bfeb.af9d4","e5796ed6.c4306"]]},{"id":"3b600d92.4a6152","type":"inject","z":"f5c189e4.4369e8","name":"","topic":"","payload":"OFF","payloadType":"str","repeat":"","crontab":"","once":false,"x":110,"y":400,"wires":[["261961fc.d96a2e"]]},{"id":"e5796ed6.c4306","type":"ui_switch","z":"f5c189e4.4369e8","name":"","label":"pow1","group":"9fc5371c.2f8848","order":1,"width":"3","height":"1","passthru":false,"decouple":"false","topic":"","style":"","onvalue":"ON","onvalueType":"str","onicon":"","oncolor":"","offvalue":"OFF","offvalueType":"str","officon":"","offcolor":"","x":430,"y":120,"wires":[["f9592d6e.e9f73"]]},{"id":"e899632f.e6b3f","type":"function","z":"f5c189e4.4369e8","name":"Parse values","func":"function formattime () {\n now = new Date();\n year = \"\" + now.getFullYear();\n month = \"\" + (now.getMonth() + 1); if (month.length == 1) { month = \"0\" + month; }\n day = \"\" + now.getDate(); if (day.length == 1) { day = \"0\" + day; }\n hour = \"\" + now.getHours(); if (hour.length == 1) { hour = \"0\" + hour; }\n minute = \"\" + now.getMinutes(); if (minute.length == 1) { minute = \"0\" + minute; }\n second = \"\" + now.getSeconds(); if (second.length == 1) { second = \"0\" + second; }\n return year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + second;\n}\n\nvar now = new Date();\nvar datetext = now.toTimeString();\nvar Time = datetext.split(' ')[0];\n\nvar msg1 = {payload: msg.payload.Current};\nvar msg2 = {payload: msg.payload.Voltage.toFixed(0)};\nvar msg3 = {payload: msg.payload.Power};\nvar msg4 = {payload: msg.payload.Factor};\nvar msg5 = {payload: msg.payload.Today};\nvar msg6 = {payload: msg.payload.Yesterday};\n\nreturn [msg1, msg2, msg3, msg4, msg5, msg6];","outputs":"6","noerr":0,"x":1510,"y":160,"wires":[[],[],[],[],[],[]]},{"id":"121b72ad.5b314d","type":"json","z":"f5c189e4.4369e8","name":"","x":1190,"y":160,"wires":[["3559e252.bfe65e","24b8161a.8045fa"]]},{"id":"e8d5e332.f1aed","type":"function","z":"f5c189e4.4369e8","name":"Record data","func":"function formattime () {\n now = new Date();\n year = \"\" + now.getFullYear();\n month = \"\" + (now.getMonth() + 1); if (month.length == 1) { month = \"0\" + month; }\n day = \"\" + now.getDate(); if (day.length == 1) { day = \"0\" + day; }\n hour = \"\" + now.getHours(); if (hour.length == 1) { hour = \"0\" + hour; }\n minute = \"\" + now.getMinutes(); if (minute.length == 1) { minute = \"0\" + minute; }\n second = \"\" + now.getSeconds(); if (second.length == 1) { second = \"0\" + second; }\n return year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + second;\n}\n\nvar sql = [];\nvar Value = [];\nvar Sensor = [];\nvar i = 0;\nvar input, parts, X, Device;\n\n// Parse the entire string by slash, and put each item into an array called parts\n\ninput = msg.topic;\nparts = input.split(\"/\", 3);\n\n// Get the 2nd token and get the substring from character 6 to the end\nX = parts[1].split(\" \", 1);\nDevice = X[0];\n\n//Device = \"pow1\";\n\nSensor[0] = \"Total\";\nSensor[1] = \"Yesterday\";\nSensor[2] = \"Today\";\nSensor[3] = \"Period\";\nSensor[4] = \"Power\";\nSensor[5] = \"Factor\";\nSensor[6] = \"Voltage\";\nSensor[7] = \"Current\";\n\nValue[0] = msg.payload.Total.toFixed(1);\nValue[1] = msg.payload.Yesterday.toFixed(1);\nValue[2] = msg.payload.Today.toFixed(1);\nValue[3] = msg.payload.Period.toFixed(1);\nValue[4] = msg.payload.Power.toFixed(1);\nValue[5] = msg.payload.Factor.toFixed(1);\nValue[6] = msg.payload.Voltage.toFixed(1);\nValue[7] = msg.payload.Current.toFixed(1);\n\nvar now = new Date();\nvar Epoch = now.getTime();\nvar Time = formattime();\n\nfor (var i = 0; i < Sensor.length; i++) {\n sql.push({ topic:\"INSERT INTO hdata (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[i] + \"', '\" + Value[i] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n}\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[2] + \"', '\" + Value[2] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[3] + \"', '\" + Value[3] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[4] + \"', '\" + Value[4] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[5] + \"', '\" + Value[5] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[6] + \"', '\" + Value[6] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[7] + \"', '\" + Value[7] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n\nreturn [ sql ];","outputs":1,"noerr":0,"x":1510,"y":240,"wires":[["f0b02c50.917528"]]},{"id":"f0b02c50.917528","type":"sqlite","z":"f5c189e4.4369e8","mydb":"a450b6b4.16cc48","name":"hdata","x":1670,"y":240,"wires":[[]]},{"id":"7226bce1.d47bd4","type":"comment","z":"f5c189e4.4369e8","name":"Energy","info":"","x":290,"y":80,"wires":[]},{"id":"9c6687a3.0ee74","type":"ui_dropdown","z":"f5c189e4.4369e8","name":"","label":"Timer","group":"9fc5371c.2f8848","order":2,"width":"2","height":"1","passthru":false,"options":[{"label":"00:00","value":"00:00","type":"str"},{"label":"00:01","value":"00:01","type":"str"},{"label":"00:05","value":"00:05","type":"str"},{"label":"00:15","value":"00:15","type":"str"},{"label":"00:30","value":"00:30","type":"str"},{"label":"01:00","value":"01:00","type":"str"},{"label":"01:30","value":"01:30","type":"str"},{"label":"02:00","value":"02:00","type":"str"},{"label":"02:30","value":"02:30","type":"str"},{"label":"03:00","value":"03:00","type":"str"},{"label":"03:30","value":"03:30","type":"str"},{"label":"04:00","value":"04:00","type":"str"},{"label":"04:30","value":"04:30","type":"str"},{"label":"05:00","value":"05:00","type":"str"},{"label":"05:30","value":"05:30","type":"str"},{"label":"06:00","value":"06:00","type":"str"},{"label":"06:30","value":"06:30","type":"str"},{"label":"07:00","value":"07:00","type":"str"},{"label":"07:30","value":"07:30","type":"str"},{"label":"08:00","value":"08:00","type":"str"},{"label":"08:30","value":"08:30","type":"str"},{"label":"09:00","value":"09:00","type":"str"},{"label":"09:30","value":"09:30","type":"str"},{"label":"10:00","value":"10:00","type":"str"},{"label":"10:30","value":"10:30","type":"str"},{"label":"11:00","value":"11:00","type":"str"},{"label":"11:30","value":"11:30","type":"str"},{"label":"12:00","value":"12:00","type":"str"}],"payload":"","topic":"","x":310,"y":160,"wires":[["2d009aed.4d0246"]]},{"id":"2d009aed.4d0246","type":"function","z":"f5c189e4.4369e8","name":"Seconds","func":"var hms = msg.payload;\nvar a = hms.split(':'); // split it at the colons\nvar seconds = (+parseInt(a[0])) * 60 * 60 + (+parseInt(a[1])) * 60; \n\nmsg = {topic: \"delay\", payload: seconds};\n\nreturn msg;","outputs":1,"noerr":0,"x":440,"y":160,"wires":[["f9592d6e.e9f73"]]},{"id":"f9592d6e.e9f73","type":"function","z":"f5c189e4.4369e8","name":"Delay","func":"var delay = context.delay || 0;\nif (msg.topic === \"delay\") {\n delay = msg.payload *1000;\n context.delay = delay;\n node.warn(\"Set delay to \"+msg.payload+\" seconds\");\n}\nelse {\n setTimeout(function() {\n node.send(msg);\n }, delay);\n}\nreturn null;","outputs":1,"noerr":0,"x":570,"y":120,"wires":[["4fb6e392.b45d44"]]},{"id":"4ac4cfb.850303","type":"function","z":"b7f34080.d736b","name":"Record data hkpi","func":"function formattime () {\n now = new Date();\n year = \"\" + now.getFullYear();\n month = \"\" + (now.getMonth() + 1); if (month.length == 1) { month = \"0\" + month; }\n day = \"\" + now.getDate(); if (day.length == 1) { day = \"0\" + day; }\n hour = \"\" + now.getHours(); if (hour.length == 1) { hour = \"0\" + hour; }\n minute = \"\" + now.getMinutes(); if (minute.length == 1) { minute = \"0\" + minute; }\n second = \"\" + now.getSeconds(); if (second.length == 1) { second = \"0\" + second; }\n return year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + second;\n}\n\nvar sql = [];\nvar Value = [];\nvar Sensor = [];\nvar i = 0;\n\nvar Device = \"rpi1\";\n\nSensor[0] = \"Temp\";\nSensor[1] = \"RAM\";\nSensor[2] = \"CPU\";\n\nValue[0] = msg.payload.Temp;\nValue[1] = msg.payload.RAM;\nValue[2] = msg.payload.CPU;\n\nvar now = new Date();\nvar Epoch = now.getTime();\nvar Time = formattime();\n\nfor (var i = 0; i < Sensor.length; i++) {\n sql.push({ topic:\"INSERT INTO hdata (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[i] + \"', '\" + Value[i] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n}\n\nreturn [ sql ];","outputs":1,"noerr":0,"x":970,"y":640,"wires":[["8f2a5212.fded2"]]},{"id":"8f2a5212.fded2","type":"sqlite","z":"b7f34080.d736b","mydb":"a450b6b4.16cc48","name":"hdata","x":1170,"y":640,"wires":[[]]},{"id":"1d562c25.11c0ec","type":"function","z":"b7f34080.d736b","name":"CPU","func":"msg = {payload: {CPU: parseFloat(msg.payload).toFixed(1)}};\n\nreturn msg;","outputs":1,"noerr":0,"x":470,"y":160,"wires":[["df0e0728.0cd6b"]]},{"id":"d85ce470.86b96","type":"function","z":"b7f34080.d736b","name":"RAM","func":"msg = {payload: {RAM: parseFloat(msg.payload).toFixed(0)}};\n\nreturn msg;","outputs":1,"noerr":0,"x":470,"y":240,"wires":[["df0e0728.0cd6b"]]},{"id":"df0e0728.0cd6b","type":"join","z":"b7f34080.d736b","name":"","mode":"custom","build":"merged","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","timeout":"","count":"3","x":630,"y":160,"wires":[["363aa0e0.8206e8"]]},{"id":"574a2735.993d3","type":"inject","z":"f5c189e4.4369e8","name":"Start","topic":"","payload":"00:00","payloadType":"str","repeat":"","crontab":"","once":true,"x":110,"y":160,"wires":[["9c6687a3.0ee74","755d6fa8.eda38","1c695abe.f318a5","705b1e4d.f5f73"]]},{"id":"29f7618c.455bfe","type":"exec","z":"b7f34080.d736b","command":"sudo reboot","addpay":false,"append":"","useSpawn":"","timer":"","name":"Reboot","x":298,"y":360,"wires":[[],[],[]]},{"id":"7bbb817.f42828","type":"exec","z":"b7f34080.d736b","command":"sudo shutdown -h now","addpay":false,"append":"","useSpawn":"","timer":"","name":"Shutdown","x":310,"y":420,"wires":[[],[],[]]},{"id":"3559e252.bfe65e","type":"function","z":"f5c189e4.4369e8","name":"Filter Device","func":"var input, parts, X, deviceX;\n\n// Parse the entire string by slash, and put each item into an array called parts\n\ninput = msg.topic;\nparts = input.split(\"/\", 3);\n\n// Get the 2nd token and get the substring from character 6 to the end\nX = parts[1].split(\" \", 1);\ndeviceX = X[0];\n\nvar device = global.get('device');\n\n\nif (device === deviceX){\n var msg1 = {payload: msg.payload};\n}\n\n//msg1 = {payload: deviceX};\n\nreturn msg1;","outputs":1,"noerr":0,"x":1350,"y":160,"wires":[["e899632f.e6b3f"]]},{"id":"f580975a.70a88","type":"mqtt in","z":"f5c189e4.4369e8","name":"","topic":"tele/pow2/ENERGY","qos":"0","broker":"3f9f7390.9dae5c","x":990,"y":160,"wires":[["121b72ad.5b314d"]]},{"id":"53930f12.9061c8","type":"mqtt in","z":"f5c189e4.4369e8","name":"","topic":"tele/pow3/ENERGY","qos":"0","broker":"3f9f7390.9dae5c","x":990,"y":200,"wires":[["121b72ad.5b314d"]]},{"id":"24b8161a.8045fa","type":"delay","z":"f5c189e4.4369e8","name":"Delay","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":1330,"y":240,"wires":[["e8d5e332.f1aed"]]},{"id":"1c7b5b1e.621a75","type":"mqtt in","z":"f5c189e4.4369e8","name":"","topic":"power","qos":"0","broker":"3f9f7390.9dae5c","x":1030,"y":300,"wires":[["a5a3a9c.b4ad2d8"]]},{"id":"a5a3a9c.b4ad2d8","type":"json","z":"f5c189e4.4369e8","name":"","x":1190,"y":300,"wires":[["daf2033d.e9cb98","ca3acd57.64e0b"]]},{"id":"c112c8b.db266b8","type":"function","z":"f5c189e4.4369e8","name":"Record data","func":"function formattime () {\n now = new Date();\n year = \"\" + now.getFullYear();\n month = \"\" + (now.getMonth() + 1); if (month.length == 1) { month = \"0\" + month; }\n day = \"\" + now.getDate(); if (day.length == 1) { day = \"0\" + day; }\n hour = \"\" + now.getHours(); if (hour.length == 1) { hour = \"0\" + hour; }\n minute = \"\" + now.getMinutes(); if (minute.length == 1) { minute = \"0\" + minute; }\n second = \"\" + now.getSeconds(); if (second.length == 1) { second = \"0\" + second; }\n return year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + second;\n}\n\nvar sql = [];\nvar Value = [];\nvar Sensor = [];\nvar i = 0;\nvar Device;\n\n// Parse the entire string by slash, and put each item into an array called parts\n\nDevice = msg.topic;\n\nSensor[0] = \"current1\";\nSensor[1] = \"current2\";\nSensor[2] = \"current3\";\nSensor[3] = \"Current\";\nSensor[4] = \"Voltage\";\nSensor[5] = \"Power\";\nSensor[6] = \"accpower\";\n\ncurrent1 = msg.payload.c1;\ncurrent2 = msg.payload.c2;\ncurrent3 = msg.payload.c3;\naccpower = msg.payload.accpower/1000;\nVoltage = msg.payload.voltage;\nCurrent = current1 + current2 + current3;\nPower = Current * Voltage;\n\nValue[0] = current1.toFixed(1);\nValue[1] = current2.toFixed(1);\nValue[2] = current3.toFixed(1);\nValue[3] = Current.toFixed(1);\nValue[4] = Voltage.toFixed(1);\nValue[5] = Power.toFixed(1);\nValue[6] = accpower.toFixed(1);\n\nvar now = new Date();\nvar Epoch = now.getTime();\nvar Time = formattime();\n\nfor (var i = 0; i < Sensor.length; i++) {\n sql.push({ topic:\"INSERT INTO hdata (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[i] + \"', '\" + Value[i] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n}\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[2] + \"', '\" + Value[2] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[3] + \"', '\" + Value[3] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[4] + \"', '\" + Value[4] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[5] + \"', '\" + Value[5] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[6] + \"', '\" + Value[6] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[7] + \"', '\" + Value[7] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n\nreturn [ sql ];","outputs":1,"noerr":0,"x":1510,"y":300,"wires":[["f0b02c50.917528"]]},{"id":"ca3acd57.64e0b","type":"delay","z":"f5c189e4.4369e8","name":"Delay","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":1330,"y":300,"wires":[["c112c8b.db266b8"]]},{"id":"daf2033d.e9cb98","type":"function","z":"f5c189e4.4369e8","name":"Parse values","func":"function formattime () {\n now = new Date();\n year = \"\" + now.getFullYear();\n month = \"\" + (now.getMonth() + 1); if (month.length == 1) { month = \"0\" + month; }\n day = \"\" + now.getDate(); if (day.length == 1) { day = \"0\" + day; }\n hour = \"\" + now.getHours(); if (hour.length == 1) { hour = \"0\" + hour; }\n minute = \"\" + now.getMinutes(); if (minute.length == 1) { minute = \"0\" + minute; }\n second = \"\" + now.getSeconds(); if (second.length == 1) { second = \"0\" + second; }\n return year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + second;\n}\n\nvar now = new Date();\nvar datetext = now.toTimeString();\nvar Time = datetext.split(' ')[0];\n\ncurrent1 = msg.payload.c1;\ncurrent2 = msg.payload.c2;\ncurrent3 = msg.payload.c3;\naccpower = msg.payload.accpower/1000;\nVoltage = msg.payload.voltage;\nCurrent = current1 + current2 + current3;\nPower = Current * Voltage;\n\nvar msg1 = {payload: Current.toFixed(2)};\nvar msg2 = {payload: Voltage.toFixed(0)};\nvar msg3 = {payload: Power.toFixed(0), total: accpower.toFixed(1)};\n//var msg4 = {total: accpower.toFixed(1)};\n\nreturn [msg1, msg2, msg3];","outputs":"3","noerr":0,"x":1510,"y":360,"wires":[[],[],["5fdcc5ac.b532a4"]]},{"id":"d70bc671.24a7d8","type":"mqtt out","z":"f5c189e4.4369e8","name":"","topic":"cmnd/pow2/POWER","qos":"1","retain":"","broker":"3f9f7390.9dae5c","x":740,"y":200,"wires":[]},{"id":"f126bfeb.af9d4","type":"ui_switch","z":"f5c189e4.4369e8","name":"","label":"pow2","group":"567b54fe.496c3c","order":1,"width":"3","height":"1","passthru":false,"decouple":"false","topic":"","style":"","onvalue":"ON","onvalueType":"str","onicon":"","oncolor":"","offvalue":"OFF","offvalueType":"str","officon":"","offcolor":"","x":430,"y":200,"wires":[["c2c2c04a.fb4ea"]]},{"id":"755d6fa8.eda38","type":"ui_dropdown","z":"f5c189e4.4369e8","name":"","label":"Timer","group":"567b54fe.496c3c","order":2,"width":"2","height":"1","passthru":false,"options":[{"label":"00:00","value":"00:00","type":"str"},{"label":"00:01","value":"00:01","type":"str"},{"label":"00:05","value":"00:05","type":"str"},{"label":"00:15","value":"00:15","type":"str"},{"label":"00:30","value":"00:30","type":"str"},{"label":"01:00","value":"01:00","type":"str"},{"label":"01:30","value":"01:30","type":"str"},{"label":"02:00","value":"02:00","type":"str"},{"label":"02:30","value":"02:30","type":"str"},{"label":"03:00","value":"03:00","type":"str"},{"label":"03:30","value":"03:30","type":"str"},{"label":"04:00","value":"04:00","type":"str"},{"label":"04:30","value":"04:30","type":"str"},{"label":"05:00","value":"05:00","type":"str"},{"label":"05:30","value":"05:30","type":"str"},{"label":"06:00","value":"06:00","type":"str"},{"label":"06:30","value":"06:30","type":"str"},{"label":"07:00","value":"07:00","type":"str"},{"label":"07:30","value":"07:30","type":"str"},{"label":"08:00","value":"08:00","type":"str"},{"label":"08:30","value":"08:30","type":"str"},{"label":"09:00","value":"09:00","type":"str"},{"label":"09:30","value":"09:30","type":"str"},{"label":"10:00","value":"10:00","type":"str"},{"label":"10:30","value":"10:30","type":"str"},{"label":"11:00","value":"11:00","type":"str"},{"label":"11:30","value":"11:30","type":"str"},{"label":"12:00","value":"12:00","type":"str"}],"payload":"","topic":"","x":310,"y":240,"wires":[["6d46ab67.5ce8fc"]]},{"id":"6d46ab67.5ce8fc","type":"function","z":"f5c189e4.4369e8","name":"Seconds","func":"var hms = msg.payload;\nvar a = hms.split(':'); // split it at the colons\nvar seconds = (+parseInt(a[0])) * 60 * 60 + (+parseInt(a[1])) * 60; \n\nmsg = {topic: \"delay\", payload: seconds};\n\nreturn msg;","outputs":1,"noerr":0,"x":440,"y":240,"wires":[["c2c2c04a.fb4ea"]]},{"id":"c2c2c04a.fb4ea","type":"function","z":"f5c189e4.4369e8","name":"Delay","func":"var delay = context.delay || 0;\nif (msg.topic === \"delay\") {\n delay = msg.payload *1000;\n context.delay = delay;\n node.warn(\"Set delay to \"+msg.payload+\" seconds\");\n}\nelse {\n setTimeout(function() {\n node.send(msg);\n }, delay);\n}\nreturn null;","outputs":1,"noerr":0,"x":570,"y":200,"wires":[["d70bc671.24a7d8"]]},{"id":"c309e8a2.44bd18","type":"mqtt out","z":"f5c189e4.4369e8","name":"","topic":"cmnd/pow3/POWER","qos":"1","retain":"","broker":"3f9f7390.9dae5c","x":740,"y":280,"wires":[]},{"id":"398876d6.80fe82","type":"ui_switch","z":"f5c189e4.4369e8","name":"","label":"pow3","group":"5b854372.1756bc","order":1,"width":"3","height":"1","passthru":false,"decouple":"false","topic":"","style":"","onvalue":"ON","onvalueType":"str","onicon":"","oncolor":"","offvalue":"OFF","offvalueType":"str","officon":"","offcolor":"","x":430,"y":280,"wires":[["ae268250.3bf718"]]},{"id":"1c695abe.f318a5","type":"ui_dropdown","z":"f5c189e4.4369e8","name":"","label":"Timer","group":"5b854372.1756bc","order":2,"width":"2","height":"1","passthru":false,"options":[{"label":"00:00","value":"00:00","type":"str"},{"label":"00:01","value":"00:01","type":"str"},{"label":"00:05","value":"00:05","type":"str"},{"label":"00:15","value":"00:15","type":"str"},{"label":"00:30","value":"00:30","type":"str"},{"label":"01:00","value":"01:00","type":"str"},{"label":"01:30","value":"01:30","type":"str"},{"label":"02:00","value":"02:00","type":"str"},{"label":"02:30","value":"02:30","type":"str"},{"label":"03:00","value":"03:00","type":"str"},{"label":"03:30","value":"03:30","type":"str"},{"label":"04:00","value":"04:00","type":"str"},{"label":"04:30","value":"04:30","type":"str"},{"label":"05:00","value":"05:00","type":"str"},{"label":"05:30","value":"05:30","type":"str"},{"label":"06:00","value":"06:00","type":"str"},{"label":"06:30","value":"06:30","type":"str"},{"label":"07:00","value":"07:00","type":"str"},{"label":"07:30","value":"07:30","type":"str"},{"label":"08:00","value":"08:00","type":"str"},{"label":"08:30","value":"08:30","type":"str"},{"label":"09:00","value":"09:00","type":"str"},{"label":"09:30","value":"09:30","type":"str"},{"label":"10:00","value":"10:00","type":"str"},{"label":"10:30","value":"10:30","type":"str"},{"label":"11:00","value":"11:00","type":"str"},{"label":"11:30","value":"11:30","type":"str"},{"label":"12:00","value":"12:00","type":"str"}],"payload":"","topic":"","x":310,"y":320,"wires":[["6b0de7e8.7fee3"]]},{"id":"6b0de7e8.7fee3","type":"function","z":"f5c189e4.4369e8","name":"Seconds","func":"var hms = msg.payload;\nvar a = hms.split(':'); // split it at the colons\nvar seconds = (+parseInt(a[0])) * 60 * 60 + (+parseInt(a[1])) * 60; \n\nmsg = {topic: \"delay\", payload: seconds};\n\nreturn msg;","outputs":1,"noerr":0,"x":440,"y":320,"wires":[["ae268250.3bf718"]]},{"id":"ae268250.3bf718","type":"function","z":"f5c189e4.4369e8","name":"Delay","func":"var delay = context.delay || 0;\nif (msg.topic === \"delay\") {\n delay = msg.payload *1000;\n context.delay = delay;\n node.warn(\"Set delay to \"+msg.payload+\" seconds\");\n}\nelse {\n setTimeout(function() {\n node.send(msg);\n }, delay);\n}\nreturn null;","outputs":1,"noerr":0,"x":570,"y":280,"wires":[["c309e8a2.44bd18"]]},{"id":"e5d46d94.39b7a","type":"mqtt out","z":"f5c189e4.4369e8","name":"","topic":"meta","qos":"","retain":"","broker":"3f9f7390.9dae5c","x":690,"y":440,"wires":[]},{"id":"261961fc.d96a2e","type":"ui_switch","z":"f5c189e4.4369e8","name":"","label":"display","group":"436c2fa1.ce6228","order":1,"width":"3","height":"1","passthru":false,"decouple":"false","topic":"","style":"","onvalue":"ON","onvalueType":"str","onicon":"","oncolor":"","offvalue":"OFF","offvalueType":"str","officon":"","offcolor":"","x":440,"y":440,"wires":[["f0487534.d54138"]]},{"id":"f0487534.d54138","type":"function","z":"f5c189e4.4369e8","name":"Delay","func":"var delay = context.delay || 0;\nif (msg.topic === \"delay\") {\n delay = msg.payload *1000;\n context.delay = delay;\n node.warn(\"Set delay to \"+msg.payload+\" seconds\");\n}\nelse {\n setTimeout(function() {\n node.send(msg);\n }, delay);\n}\nreturn null;","outputs":1,"noerr":0,"x":570,"y":440,"wires":[["e5d46d94.39b7a"]]},{"id":"fbfb7f6e.93a3c8","type":"function","z":"f5c189e4.4369e8","name":"Seconds","func":"var hms = msg.payload;\nvar a = hms.split(':'); // split it at the colons\nvar seconds = (+parseInt(a[0])) * 60 * 60 + (+parseInt(a[1])) * 60; \n\nmsg = {topic: \"delay\", payload: seconds};\n\nreturn msg;","outputs":1,"noerr":0,"x":440,"y":480,"wires":[["f0487534.d54138"]]},{"id":"705b1e4d.f5f73","type":"ui_dropdown","z":"f5c189e4.4369e8","name":"","label":"Timer","group":"436c2fa1.ce6228","order":2,"width":"2","height":"1","passthru":false,"options":[{"label":"00:00","value":"00:00","type":"str"},{"label":"00:01","value":"00:01","type":"str"},{"label":"00:05","value":"00:05","type":"str"},{"label":"00:15","value":"00:15","type":"str"},{"label":"00:30","value":"00:30","type":"str"},{"label":"01:00","value":"01:00","type":"str"},{"label":"01:30","value":"01:30","type":"str"},{"label":"02:00","value":"02:00","type":"str"},{"label":"02:30","value":"02:30","type":"str"},{"label":"03:00","value":"03:00","type":"str"},{"label":"03:30","value":"03:30","type":"str"},{"label":"04:00","value":"04:00","type":"str"},{"label":"04:30","value":"04:30","type":"str"},{"label":"05:00","value":"05:00","type":"str"},{"label":"05:30","value":"05:30","type":"str"},{"label":"06:00","value":"06:00","type":"str"},{"label":"06:30","value":"06:30","type":"str"},{"label":"07:00","value":"07:00","type":"str"},{"label":"07:30","value":"07:30","type":"str"},{"label":"08:00","value":"08:00","type":"str"},{"label":"08:30","value":"08:30","type":"str"},{"label":"09:00","value":"09:00","type":"str"},{"label":"09:30","value":"09:30","type":"str"},{"label":"10:00","value":"10:00","type":"str"},{"label":"10:30","value":"10:30","type":"str"},{"label":"11:00","value":"11:00","type":"str"},{"label":"11:30","value":"11:30","type":"str"},{"label":"12:00","value":"12:00","type":"str"}],"payload":"","topic":"","x":310,"y":480,"wires":[["fbfb7f6e.93a3c8"]]},{"id":"236e00c6.fa846","type":"function","z":"f5c189e4.4369e8","name":"SQL","func":"var msg = {payload: msg.payload.sync};\nvar sql = [];\nif (msg.payload===0){\n sql.push({ topic: \"SELECT max(value) as maxvalue FROM hdata WHERE sensor='accpower' and device='power'\"});\n}\n\nreturn sql;\n\n","outputs":1,"noerr":0,"x":1190,"y":460,"wires":[["ad273dee.2f2ab8"]]},{"id":"ad273dee.2f2ab8","type":"sqlite","z":"f5c189e4.4369e8","mydb":"a450b6b4.16cc48","name":"hdata","x":1310,"y":460,"wires":[["efe1ee9c.8bbc68"]]},{"id":"efe1ee9c.8bbc68","type":"function","z":"f5c189e4.4369e8","name":"use","func":"payload = msg.payload[0].maxvalue;\n\nif (payload ===null){\n payload = \"0\";\n}\n\nmsg = {payload: payload};\n\nreturn msg;","outputs":1,"noerr":0,"x":1430,"y":460,"wires":[["ee3f3409.da5688","c23da9b2.0cdcb8"]]},{"id":"4eade2c7.dfb1a4","type":"mqtt out","z":"f5c189e4.4369e8","name":"","topic":"poweruse","qos":"","retain":"","broker":"3f9f7390.9dae5c","x":1680,"y":460,"wires":[]},{"id":"8ba31b08.9aab08","type":"mqtt in","z":"f5c189e4.4369e8","name":"","topic":"powersync","qos":"2","broker":"3f9f7390.9dae5c","x":940,"y":460,"wires":[["eadc5ac4.4d06a8"]]},{"id":"eadc5ac4.4d06a8","type":"json","z":"f5c189e4.4369e8","name":"","x":1070,"y":460,"wires":[["236e00c6.fa846"]]},{"id":"ee3f3409.da5688","type":"delay","z":"f5c189e4.4369e8","name":"Delay","pauseType":"delay","timeout":"10","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1550,"y":460,"wires":[["4eade2c7.dfb1a4"]]},{"id":"64d33f69.f2b638","type":"inject","z":"f5c189e4.4369e8","name":"","topic":"","payload":"433.5","payloadType":"num","repeat":"","crontab":"","once":false,"x":1550,"y":500,"wires":[["4eade2c7.dfb1a4"]]},{"id":"f61529c5.13e5d8","type":"ui_template","z":"30043e7f.63d8b2","group":"e034cca6.13c258","name":"Nest","order":1,"width":"0","height":"0","format":"<div id=\"thermostat\"></div>\n\n<style>\n@import url(http://fonts.googleapis.com/css?family=Open+Sans:300);\n#thermostat {\n margin: 0 auto;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n.dial {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.dial.away .dial__ico__leaf {\n visibility: hidden;\n}\n.dial.away .dial__lbl--target {\n visibility: hidden;\n}\n.dial.away .dial__lbl--target--half {\n visibility: hidden;\n}\n.dial.away .dial__lbl--away {\n opacity: 1;\n}\n.dial .dial__shape {\n -webkit-transition: fill 0.5s;\n transition: fill 0.5s;\n}\n.dial__ico__leaf {\n fill: #13EB13;\n opacity: 0;\n -webkit-transition: opacity 0.5s;\n transition: opacity 0.5s;\n pointer-events: none;\n}\n.dial.has-leaf .dial__ico__leaf {\n display: block;\n opacity: 1;\n pointer-events: initial;\n}\n.dial__editableIndicator {\n fill: white;\n fill-rule: evenodd;\n opacity: 0;\n -webkit-transition: opacity 0.5s;\n transition: opacity 0.5s;\n}\n.dial--edit .dial__editableIndicator {\n opacity: 1;\n}\n.dial--state--off .dial__shape {\n fill: #3d3c3c;\n}\n.dial--state--heating .dial__shape {\n fill: #E36304;\n}\n.dial--state--cooling .dial__shape {\n fill: #007AF1;\n}\n.dial__ticks path {\n fill: rgba(255, 255, 255, 0.3);\n}\n.dial__ticks path.active {\n fill: rgba(255, 255, 255, 0.8);\n}\n.dial text {\n fill: white;\n text-anchor: middle;\n font-family: Helvetica, sans-serif;\n alignment-baseline: central;\n}\n.dial__lbl--target {\n font-size: 120px;\n font-weight: bold;\n}\n.dial__lbl--target--half {\n font-size: 40px;\n font-weight: bold;\n opacity: 0;\n -webkit-transition: opacity 0.1s;\n transition: opacity 0.1s;\n}\n.dial__lbl--target--half.shown {\n opacity: 1;\n -webkit-transition: opacity 0s;\n transition: opacity 0s;\n}\n.dial__lbl--ambient {\n font-size: 22px;\n font-weight: bold;\n}\n.dial__lbl--away {\n font-size: 72px;\n font-weight: bold;\n opacity: 0;\n pointer-events: none;\n}\n#controls {\n font-family: Open Sans;\n background-color: rgba(255, 255, 255, 0.25);\n padding: 20px;\n border-radius: 5px;\n position: absolute;\n left: 50%;\n -webkit-transform: translatex(-50%);\n transform: translatex(-50%);\n margin-top: 20px;\n}\n#controls label {\n text-align: left;\n display: block;\n}\n#controls label span {\n display: inline-block;\n width: 200px;\n text-align: right;\n font-size: 0.8em;\n text-transform: uppercase;\n}\n#controls p {\n margin: 0;\n margin-bottom: 1em;\n padding-bottom: 1em;\n border-bottom: 2px solid #ccc;\n}\n</style>\n<script>\n var thermostatDial = (function() {\n\t\n\t/*\n\t * Utility functions\n\t */\n\t\n\t// Create an element with proper SVG namespace, optionally setting its attributes and appending it to another element\n\tfunction createSVGElement(tag,attributes,appendTo) {\n\t\tvar element = document.createElementNS('http://www.w3.org/2000/svg',tag);\n\t\tattr(element,attributes);\n\t\tif (appendTo) {\n\t\t\tappendTo.appendChild(element);\n\t\t}\n\t\treturn element;\n\t}\n\t\n\t// Set attributes for an element\n\tfunction attr(element,attrs) {\n\t\tfor (var i in attrs) {\n\t\t\telement.setAttribute(i,attrs[i]);\n\t\t}\n\t}\n\t\n\t// Rotate a cartesian point about given origin by X degrees\n\tfunction rotatePoint(point, angle, origin) {\n\t\tvar radians = angle * Math.PI/180;\n\t\tvar x = point[0]-origin[0];\n\t\tvar y = point[1]-origin[1];\n\t\tvar x1 = x*Math.cos(radians) - y*Math.sin(radians) + origin[0];\n\t\tvar y1 = x*Math.sin(radians) + y*Math.cos(radians) + origin[1];\n\t\treturn [x1,y1];\n\t}\n\t\n\t// Rotate an array of cartesian points about a given origin by X degrees\n\tfunction rotatePoints(points, angle, origin) {\n\t\treturn points.map(function(point) {\n\t\t\treturn rotatePoint(point, angle, origin);\n\t\t});\n\t}\n\t\n\t// Given an array of points, return an SVG path string representing the shape they define\n\tfunction pointsToPath(points) {\n\t\treturn points.map(function(point, iPoint) {\n\t\t\treturn (iPoint>0?'L':'M') + point[0] + ' ' + point[1];\n\t\t}).join(' ')+'Z';\n\t}\n\t\n\tfunction circleToPath(cx, cy, r) {\n\t\treturn [\n\t\t\t\"M\",cx,\",\",cy,\n\t\t\t\"m\",0-r,\",\",0,\n\t\t\t\"a\",r,\",\",r,0,1,\",\",0,r*2,\",\",0,\n\t\t\t\"a\",r,\",\",r,0,1,\",\",0,0-r*2,\",\",0,\n\t\t\t\"z\"\n\t\t].join(' ').replace(/\\s,\\s/g,\",\");\n\t}\n\t\n\tfunction donutPath(cx,cy,rOuter,rInner) {\n\t\treturn circleToPath(cx,cy,rOuter) + \" \" + circleToPath(cx,cy,rInner);\n\t}\n\t\n\t// Restrict a number to a min + max range\n\tfunction restrictToRange(val,min,max) {\n\t\tif (val < min) return min;\n\t\tif (val > max) return max;\n\t\treturn val;\n\t}\n\t\n\t// Round a number to the nearest 0.5\n\tfunction roundHalf(num) {\n\t\treturn Math.round(num*2)/2;\n\t}\n\t\n\tfunction setClass(el, className, state) {\n\t\tel.classList[state ? 'add' : 'remove'](className);\n\t}\n\t\n\t/*\n\t * The \"MEAT\"\n\t */\n\n\treturn function(targetElement, options) {\n\t\tvar self = this;\n\t\t\n\t\t/*\n\t\t * Options\n\t\t */\n\t\toptions = options || {};\n\t\toptions = {\n\t\t\tdiameter: options.diameter || 400,\n\t\t\tminValue: options.minValue || 16, // Minimum value for target temperature\n\t\t\tmaxValue: options.maxValue || 30, // Maximum value for target temperature\n\t\t\tnumTicks: options.numTicks || 200, // Number of tick lines to display around the dial\n\t\t\tonSetTargetTemperature: options.onSetTargetTemperature || function() {}, // Function called when new target temperature set by the dial\n\t\t};\n\t\t\n\t\t/*\n\t\t * Properties - calculated from options in many cases\n\t\t */\n\t\tvar properties = {\n\t\t\ttickDegrees: 300, // Degrees of the dial that should be covered in tick lines\n\t\t\trangeValue: options.maxValue - options.minValue,\n\t\t\tradius: options.diameter/2,\n\t\t\tticksOuterRadius: options.diameter / 30,\n\t\t\tticksInnerRadius: options.diameter / 8,\n\t\t\thvac_states: ['off', 'heating', 'cooling'],\n\t\t\tdragLockAxisDistance: 15,\n\t\t}\n\t\tproperties.lblAmbientPosition = [properties.radius, properties.ticksOuterRadius-(properties.ticksOuterRadius-properties.ticksInnerRadius)/2]\n\t\tproperties.offsetDegrees = 180-(360-properties.tickDegrees)/2;\n\t\t\n\t\t/*\n\t\t * Object state\n\t\t */\n\t\tvar state = {\n\t\t\ttarget_temperature: options.minValue,\n\t\t\tambient_temperature: options.minValue,\n\t\t\thvac_state: properties.hvac_states[0],\n\t\t\thas_leaf: false,\n\t\t\taway: false\n\t\t};\n\t\t\n\t\t/*\n\t\t * Property getter / setters\n\t\t */\n\t\tObject.defineProperty(this,'target_temperature',{\n\t\t\tget: function() {\n\t\t\t\treturn state.target_temperature;\n\t\t\t},\n\t\t\tset: function(val) {\n\t\t\t\tstate.target_temperature = restrictTargetTemperature(+val);\n\t\t\t\trender();\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(this,'ambient_temperature',{\n\t\t\tget: function() {\n\t\t\t\treturn state.ambient_temperature;\n\t\t\t},\n\t\t\tset: function(val) {\n\t\t\t\tstate.ambient_temperature = roundHalf(+val);\n\t\t\t\trender();\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(this,'hvac_state',{\n\t\t\tget: function() {\n\t\t\t\treturn state.hvac_state;\n\t\t\t},\n\t\t\tset: function(val) {\n\t\t\t\tif (properties.hvac_states.indexOf(val)>=0) {\n\t\t\t\t\tstate.hvac_state = val;\n\t\t\t\t\trender();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(this,'has_leaf',{\n\t\t\tget: function() {\n\t\t\t\treturn state.has_leaf;\n\t\t\t},\n\t\t\tset: function(val) {\n\t\t\t\tstate.has_leaf = !!val;\n\t\t\t\trender();\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(this,'away',{\n\t\t\tget: function() {\n\t\t\t\treturn state.away;\n\t\t\t},\n\t\t\tset: function(val) {\n\t\t\t\tstate.away = !!val;\n\t\t\t\trender();\n\t\t\t}\n\t\t});\n\t\t\n\t\t/*\n\t\t * SVG\n\t\t */\n\t\tvar svg = createSVGElement('svg',{\n\t\t\twidth: '100%', //options.diameter+'px',\n\t\t\theight: '100%', //options.diameter+'px',\n\t\t\tviewBox: '0 0 '+options.diameter+' '+options.diameter,\n\t\t\tclass: 'dial'\n\t\t},targetElement);\n\t\t// CIRCULAR DIAL\n\t\tvar circle = createSVGElement('circle',{\n\t\t\tcx: properties.radius,\n\t\t\tcy: properties.radius,\n\t\t\tr: properties.radius,\n\t\t\tclass: 'dial__shape'\n\t\t},svg);\n\t\t// EDITABLE INDICATOR\n\t\tvar editCircle = createSVGElement('path',{\n\t\t\td: donutPath(properties.radius,properties.radius,properties.radius-4,properties.radius-8),\n\t\t\tclass: 'dial__editableIndicator',\n\t\t},svg);\n\t\t\n\t\t/*\n\t\t * Ticks\n\t\t */\n\t\tvar ticks = createSVGElement('g',{\n\t\t\tclass: 'dial__ticks'\t\n\t\t},svg);\n\t\tvar tickPoints = [\n\t\t\t[properties.radius-1, properties.ticksOuterRadius],\n\t\t\t[properties.radius+1, properties.ticksOuterRadius],\n\t\t\t[properties.radius+1, properties.ticksInnerRadius],\n\t\t\t[properties.radius-1, properties.ticksInnerRadius]\n\t\t];\n\t\tvar tickPointsLarge = [\n\t\t\t[properties.radius-1.5, properties.ticksOuterRadius],\n\t\t\t[properties.radius+1.5, properties.ticksOuterRadius],\n\t\t\t[properties.radius+1.5, properties.ticksInnerRadius+20],\n\t\t\t[properties.radius-1.5, properties.ticksInnerRadius+20]\n\t\t];\n\t\tvar theta = properties.tickDegrees/options.numTicks;\n\t\tvar tickArray = [];\n\t\tfor (var iTick=0; iTick<options.numTicks; iTick++) {\n\t\t\ttickArray.push(createSVGElement('path',{d:pointsToPath(tickPoints)},ticks));\n\t\t};\n\t\t\n\t\t/*\n\t\t * Labels\n\t\t */\n\t\tvar lblTarget = createSVGElement('text',{\n\t\t\tx: properties.radius,\n\t\t\ty: properties.radius,\n\t\t\tclass: 'dial__lbl dial__lbl--target'\n\t\t},svg);\n\t\tvar lblTarget_text = document.createTextNode('');\n\t\tlblTarget.appendChild(lblTarget_text);\n\t\t//\n\t\tvar lblTargetHalf = createSVGElement('text',{\n\t\t\tx: properties.radius + properties.radius/2.5,\n\t\t\ty: properties.radius - properties.radius/8,\n\t\t\tclass: 'dial__lbl dial__lbl--target--half'\n\t\t},svg);\n\t\tvar lblTargetHalf_text = document.createTextNode('5');\n\t\tlblTargetHalf.appendChild(lblTargetHalf_text);\n\t\t//\n\t\tvar lblAmbient = createSVGElement('text',{\n\t\t\tclass: 'dial__lbl dial__lbl--ambient'\n\t\t},svg);\n\t\tvar lblAmbient_text = document.createTextNode('');\n\t\tlblAmbient.appendChild(lblAmbient_text);\n\t\t//\n\t\tvar lblAway = createSVGElement('text',{\n\t\t\tx: properties.radius,\n\t\t\ty: properties.radius,\n\t\t\tclass: 'dial__lbl dial__lbl--away'\n\t\t},svg);\n\t\tvar lblAway_text = document.createTextNode('AWAY');\n\t\tlblAway.appendChild(lblAway_text);\n\t\t//\n\t\tvar icoLeaf = createSVGElement('path',{\n\t\t\tclass: 'dial__ico__leaf'\n\t\t},svg);\n\t\t\n\t\t/*\n\t\t * LEAF\n\t\t */\n\t\tvar leafScale = properties.radius/5/100;\n\t\tvar leafDef = [\"M\", 3, 84, \"c\", 24, 17, 51, 18, 73, -6, \"C\", 100, 52, 100, 22, 100, 4, \"c\", -13, 15, -37, 9, -70, 19, \"C\", 4, 32, 0, 63, 0, 76, \"c\", 6, -7, 18, -17, 33, -23, 24, -9, 34, -9, 48, -20, -9, 10, -20, 16, -43, 24, \"C\", 22, 63, 8, 78, 3, 84, \"z\"].map(function(x) {\n\t\t\treturn isNaN(x) ? x : x*leafScale;\n\t\t}).join(' ');\n\t\tvar translate = [properties.radius-(leafScale*100*0.5),properties.radius*1.5]\n\t\tvar icoLeaf = createSVGElement('path',{\n\t\t\tclass: 'dial__ico__leaf',\n\t\t\td: leafDef,\n\t\t\ttransform: 'translate('+translate[0]+','+translate[1]+')'\n\t\t},svg);\n\t\t\t\n\t\t/*\n\t\t * RENDER\n\t\t */\n\t\tfunction render() {\n\t\t\trenderAway();\n\t\t\trenderHvacState();\n\t\t\trenderTicks();\n\t\t\trenderTargetTemperature();\n\t\t\trenderAmbientTemperature();\n\t\t\trenderLeaf();\n\t\t}\n\t\trender();\n\n\t\t/*\n\t\t * RENDER - ticks\n\t\t */\n\t\tfunction renderTicks() {\n\t\t\tvar vMin, vMax;\n\t\t\tif (self.away) {\n\t\t\t\tvMin = self.ambient_temperature;\n\t\t\t\tvMax = vMin;\n\t\t\t} else {\n\t\t\t\tvMin = Math.min(self.ambient_temperature, self.target_temperature);\n\t\t\t\tvMax = Math.max(self.ambient_temperature, self.target_temperature);\n\t\t\t}\n\t\t\tvar min = restrictToRange(Math.round((vMin-options.minValue)/properties.rangeValue * options.numTicks),0,options.numTicks-1);\n\t\t\tvar max = restrictToRange(Math.round((vMax-options.minValue)/properties.rangeValue * options.numTicks),0,options.numTicks-1);\n\t\t\t//\n\t\t\ttickArray.forEach(function(tick,iTick) {\n\t\t\t\tvar isLarge = iTick==min || iTick==max;\n\t\t\t\tvar isActive = iTick >= min && iTick <= max;\n\t\t\t\tattr(tick,{\n\t\t\t\t\td: pointsToPath(rotatePoints(isLarge ? tickPointsLarge: tickPoints,iTick*theta-properties.offsetDegrees,[properties.radius, properties.radius])),\n\t\t\t\t\tclass: isActive ? 'active' : ''\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\n\t\t/*\n\t\t * RENDER - ambient temperature\n\t\t */\n\t\tfunction renderAmbientTemperature() {\n\t\t\tlblAmbient_text.nodeValue = Math.floor(self.ambient_temperature);\n\t\t\tif (self.ambient_temperature%1!=0) {\n\t\t\t\tlblAmbient_text.nodeValue += '⁵';\n\t\t\t}\n\t\t\tvar peggedValue = restrictToRange(self.ambient_temperature, options.minValue, options.maxValue);\n\t\t\tdegs = properties.tickDegrees * (peggedValue-options.minValue)/properties.rangeValue - properties.offsetDegrees;\n\t\t\tif (peggedValue > self.target_temperature) {\n\t\t\t\tdegs += 8;\n\t\t\t} else {\n\t\t\t\tdegs -= 8;\n\t\t\t}\n\t\t\tvar pos = rotatePoint(properties.lblAmbientPosition,degs,[properties.radius, properties.radius]);\n\t\t\tattr(lblAmbient,{\n\t\t\t\tx: pos[0],\n\t\t\t\ty: pos[1]\n\t\t\t});\n\t\t}\n\n\t\t/*\n\t\t * RENDER - target temperature\n\t\t */\n\t\tfunction renderTargetTemperature() {\n\t\t\tlblTarget_text.nodeValue = Math.floor(self.target_temperature);\n\t\t\tsetClass(lblTargetHalf,'shown',self.target_temperature%1!=0);\n\t\t}\n\t\t\n\t\t/*\n\t\t * RENDER - leaf\n\t\t */\n\t\tfunction renderLeaf() {\n\t\t\tsetClass(svg,'has-leaf',self.has_leaf);\n\t\t}\n\t\t\n\t\t/*\n\t\t * RENDER - HVAC state\n\t\t */\n\t\tfunction renderHvacState() {\n\t\t\tArray.prototype.slice.call(svg.classList).forEach(function(c) {\n\t\t\t\tif (c.match(/^dial--state--/)) {\n\t\t\t\t\tsvg.classList.remove(c);\n\t\t\t\t};\n\t\t\t});\n\t\t\tsvg.classList.add('dial--state--'+self.hvac_state);\n\t\t}\n\t\t\n\t\t/*\n\t\t * RENDER - away\n\t\t */\n\t\tfunction renderAway() {\n\t\t\tsvg.classList[self.away ? 'add' : 'remove']('away');\n\t\t}\n\t\t\n\t\t/*\n\t\t * Drag to control\n\t\t */\n\t\tvar _drag = {\n\t\t\tinProgress: false,\n\t\t\tstartPoint: null,\n\t\t\tstartTemperature: 0,\n\t\t\tlockAxis: undefined\n\t\t};\n\t\t\n\t\tfunction eventPosition(ev) {\n\t\t\tif (ev.targetTouches && ev.targetTouches.length) {\n\t\t\t\treturn [ev.targetTouches[0].clientX, ev.targetTouches[0].clientY];\n\t\t\t} else {\n\t\t\t\treturn [ev.x, ev.y];\n\t\t\t};\n\t\t}\n\t\t\n\t\tvar startDelay;\n\t\tfunction dragStart(ev) {\n\t\t\tstartDelay = setTimeout(function() {\n\t\t\t\tsetClass(svg, 'dial--edit', true);\n\t\t\t\t_drag.inProgress = true;\n\t\t\t\t_drag.startPoint = eventPosition(ev);\n\t\t\t\t_drag.startTemperature = self.target_temperature || options.minValue;\n\t\t\t\t_drag.lockAxis = undefined;\n\t\t\t},1000);\n\t\t};\n\t\t\n\t\tfunction dragEnd (ev) {\n\t\t\tclearTimeout(startDelay);\n\t\t\tsetClass(svg, 'dial--edit', false);\n\t\t\tif (!_drag.inProgress) return;\n\t\t\t_drag.inProgress = false;\n\t\t\tif (self.target_temperature != _drag.startTemperature) {\n\t\t\t\tif (typeof options.onSetTargetTemperature == 'function') {\n\t\t\t\t\toptions.onSetTargetTemperature(self.target_temperature);\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t\t\n\t\tfunction dragMove(ev) {\n\t\t\tev.preventDefault();\n\t\t\tif (!_drag.inProgress) return;\n\t\t\tvar evPos = eventPosition(ev);\n\t\t\tvar dy = _drag.startPoint[1]-evPos[1];\n\t\t\tvar dx = evPos[0] - _drag.startPoint[0];\n\t\t\tvar dxy;\n\t\t\tif (_drag.lockAxis == 'x') {\n\t\t\t\tdxy = dx;\n\t\t\t} else if (_drag.lockAxis == 'y') {\n\t\t\t\tdxy = dy;\n\t\t\t} else if (Math.abs(dy) > properties.dragLockAxisDistance) {\n\t\t\t\t_drag.lockAxis = 'y';\n\t\t\t\tdxy = dy;\n\t\t\t} else if (Math.abs(dx) > properties.dragLockAxisDistance) {\n\t\t\t\t_drag.lockAxis = 'x';\n\t\t\t\tdxy = dx;\n\t\t\t} else {\n\t\t\t\tdxy = (Math.abs(dy) > Math.abs(dx)) ? dy : dx;\n\t\t\t};\n\t\t\tvar dValue = (dxy*getSizeRatio())/(options.diameter)*properties.rangeValue;\n\t\t\tself.target_temperature = roundHalf(_drag.startTemperature+dValue);\n\t\t}\n\t\t\n\t\tsvg.addEventListener('mousedown',dragStart);\n\t\tsvg.addEventListener('touchstart',dragStart);\n\t\t\n\t\tsvg.addEventListener('mouseup',dragEnd);\n\t\tsvg.addEventListener('mouseleave',dragEnd);\n\t\tsvg.addEventListener('touchend',dragEnd);\n\t\t\n\t\tsvg.addEventListener('mousemove',dragMove);\n\t\tsvg.addEventListener('touchmove',dragMove);\n\t\t//\n\t\t\n\t\t/*\n\t\t * Helper functions\n\t\t */\n\t\tfunction restrictTargetTemperature(t) {\n\t\t\treturn restrictToRange(roundHalf(t),options.minValue,options.maxValue);\n\t\t}\n\t\t\n\t\tfunction angle(point) {\n\t\t\tvar dx = point[0] - properties.radius;\n\t\t\tvar dy = point[1] - properties.radius;\n\t\t\tvar theta = Math.atan(dx/dy) / (Math.PI/180);\n\t\t\tif (point[0]>=properties.radius && point[1] < properties.radius) {\n\t\t\t\ttheta = 90-theta - 90;\n\t\t\t} else if (point[0]>=properties.radius && point[1] >= properties.radius) {\n\t\t\t\ttheta = 90-theta + 90;\n\t\t\t} else if (point[0]<properties.radius && point[1] >= properties.radius) {\n\t\t\t\ttheta = 90-theta + 90;\n\t\t\t} else if (point[0]<properties.radius && point[1] < properties.radius) {\n\t\t\t\ttheta = 90-theta+270;\n\t\t\t}\n\t\t\treturn theta;\n\t\t};\n\t\t\n\t\tfunction getSizeRatio() {\n\t\t\treturn options.diameter / targetElement.clientWidth;\n\t\t}\n\t\t\n\t};\n})();\n\n/* ==== */\n(function(scope) {\n \n var nest = new thermostatDial(document.getElementById('thermostat'),{\n \tonSetTargetTemperature: function(v) {\n \t\tscope.send({topic: \"target_temperature\", payload: v});\n \t}\n });\n\n\n scope.$watch('msg', function(data) {\n //console.log(data.topic+\" \"+data.payload);\n if (data.topic == \"ambient_temperature\") {\n nest.ambient_temperature = data.payload;\n } if (data.topic == \"target_temperature\") {\n nest.target_temperature = data.payload;\n } if (data.topic == \"hvac_state\") {\n nest.hvac_state = data.payload;\n } if (data.topic == \"has_leaf\") {\n nest.has_leaf = data.payload;\n } if (data.topic == \"away\") {\n nest.away = data.payload;\n }\n });\n})(scope);\n\n</script>","storeOutMessages":true,"fwdInMessages":false,"templateScope":"local","x":730,"y":200,"wires":[["8b0b035b.e8d018"]]},{"id":"8b0b035b.e8d018","type":"function","z":"30043e7f.63d8b2","name":"target_temp","func":"if (msg.topic == \"target_temperature\") {\nsetpoint = msg.payload;\nglobal.set('target_temperature', setpoint);\nreturn msg;\n}\n\n","outputs":1,"noerr":0,"x":950,"y":200,"wires":[["a468e607.7dd958","c2460b8.bcc49f8"]]},{"id":"880f1152.b5b16","type":"mqtt in","z":"30043e7f.63d8b2","name":"","topic":"temperature","qos":"2","broker":"3f9f7390.9dae5c","x":150,"y":200,"wires":[["1ad99eb5.ba3ff1"]]},{"id":"c5d32bdf.441fb8","type":"function","z":"30043e7f.63d8b2","name":"hvac_state","func":"var temperature = msg.payload.temperature;\nvar humidity = msg.payload.humidity;\nglobal.set('temperature', temperature);\nvar target_temperature = global.get('target_temperature');\nvar hvac_status = global.get('hvac_status');\nvar away = false;\n\nif (hvac_status == \"on\"){\n if (target_temperature<temperature){\n hvac_state = \"cooling\";\n } else{\n hvac_state = \"heating\";\n }\n} else{\n hvac_state = \"off\";\n}\n\nif ((target_temperature<26) && (target_temperature>18)){\n has_leaf = true;\n} else{\n has_leaf = false;\n}\n\n//if (target_temperature>40){\n// away = true;\n//} else{\n// away = false;\n//}\n\n\nvar msg1 = {payload: temperature, topic : \"ambient_temperature\"};\nvar msg2 = {payload: target_temperature, topic : \"target_temperature\"};\nvar msg3 = {payload: hvac_state, topic : \"hvac_state\"};\nvar msg4 = {payload: has_leaf, topic : \"has_leaf\"};\nvar msg5 = {payload: away, topic : \"away\"};\n\nvar msg6 = {payload: temperature};\nvar msg7 = {setpoint: target_temperature};\n\n//var msg7 = {payload: humidity};\n\n\nreturn [msg1, msg2, msg3, msg4, msg5, msg6, msg7];","outputs":"7","noerr":0,"x":550,"y":200,"wires":[["f61529c5.13e5d8"],["f61529c5.13e5d8"],["f61529c5.13e5d8"],["f61529c5.13e5d8"],["f61529c5.13e5d8"],["f61529c5.13e5d8"],[]]},{"id":"ea46e855.c5e06","type":"mqtt out","z":"30043e7f.63d8b2","name":"","topic":"ir_server/send","qos":"","retain":"","broker":"3f9f7390.9dae5c","x":1160,"y":160,"wires":[]},{"id":"e5c0bd7b.551f48","type":"mqtt in","z":"30043e7f.63d8b2","name":"","topic":"ir_server/sent","qos":"2","broker":"3f9f7390.9dae5c","x":1150,"y":220,"wires":[["cdc28a7e.c1709"]]},{"id":"29c82cf8.d7a924","type":"function","z":"1523804c.6a58f","name":"/temp","func":"var CID = msg.originalMessage.from.id;\nvar USER = msg.originalMessage.from.first_name\n\ncontext.previousTemp = context.previousTemp || 0;\nvar temp = global.get('temperature');\nvar upperThreshold = 25;\nvar lowerThreshold = 20;\nvar content = '';\n\n// Check if the new temp is different from the previous\nif (context.previousTemp != temp){\n\tif (temp >= upperThreshold){\n\t\tcontent = \"It's too hot! \";\n\t}\n\telse if (temp <= lowerThreshold){\n\t\tcontent = \"It's too cold! \";\n\t}\n}\n\nmsg.payload = {chatId : CID, type : 'message', content : USER + ', a temperatura é de '+ temp + '°C' + '. ' + content};\n\nreturn msg;","outputs":"1","noerr":0,"x":310,"y":840,"wires":[["ad8eccbb.692068"]]},{"id":"81f7258d.e584f8","type":"telegram command","z":"1523804c.6a58f","name":"/temp","command":"/temp","bot":"1cd082c0.e0a865","x":170,"y":840,"wires":[["29c82cf8.d7a924"],[]]},{"id":"1ad99eb5.ba3ff1","type":"json","z":"30043e7f.63d8b2","name":"","x":290,"y":200,"wires":[["dde427d9.bacc8","175ea301.ca5ddd"]]},{"id":"dde427d9.bacc8","type":"delay","z":"30043e7f.63d8b2","name":"Delay","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"5","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":410,"y":200,"wires":[["c5d32bdf.441fb8"]]},{"id":"a468e607.7dd958","type":"function","z":"30043e7f.63d8b2","name":"Code2IR","func":"\n//Mesg Desc.: Power: On, Mode: 1 (COOL), Temp: 16C, Fan: 0 (AUTO), Turbo: Off, Quiet: Off, XFan: Off, IonFilter: On, Light: Off, Swing (Horizontal): Off, Swing (Vertical): On\n\n\nswitch(parseInt(msg.payload)) {\n case 16:\n Code = \"18,49804450012000904980446000680FD1\";\n break;\n case 17:\n Code = \"18,49814450012000A04981446000580FD1\";\n break;\n case 18:\n Code = \"18,49824450012000B04982446000580FE1\";\n break;\n case 19:\n Code = \"18,49834450012000C04983446000480FE1\";\n break;\n case 20:\n Code = \"18,49844450012000D04984446000480FF1\";\n break;\n case 21:\n Code = \"18,49854450012000E04985446000480F01\";\n break;\n case 22:\n Code = \"18,49864450012000F04986446000480F11\";\n break;\n case 23:\n Code = \"18,49874450012000004987446000380F11\";\n break;\n case 24:\n Code = \"18,49884450012000104988446000380F21\";\n break;\n case 25:\n Code = \"18,49894450012000204989446000380F31\";\n break;\n case 26:\n Code = \"18,498A445001200030498A446000280F31\";\n break;\n case 27:\n Code = \"18,498B445001200040498B446000280F41\";\n break;\n case 28:\n Code = \"18,498C445001200050498C446000180F41\";\n break;\n case 29:\n Code = \"18,498D445001200060498D446000180F51\";\n break;\n case 30:\n Code = \"18,498E445001200070498E446000180F61\";\n break;\n}\nmsg = {payload:Code};\nreturn msg;","outputs":1,"noerr":0,"x":940,"y":240,"wires":[[]]},{"id":"5db89e5.e56a1e","type":"function","z":"30043e7f.63d8b2","name":"Code2IR_L","func":"\n//Mesg Desc.: Power: On, Mode: 1 (COOL), Temp: 16C, Fan: 0 (AUTO), Turbo: Off, Quiet: Off, XFan: Off, IonFilter: On, Light: Off, Swing (Horizontal): Off, Swing (Vertical): On\n\n\nswitch(parseInt(msg.payload)) {\n case 16:\n Code = \"18,49906350012000804990636000080E61\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 17:\n Code = \"18,49916350012000904991636000F80D61\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 18:\n Code = \"18,49926350012000A04992636000E80D61\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 19:\n Code = \"18,49936350012000B04993636000E80D71\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 20:\n Code = \"18,49946350012000C04994636000E80D81\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 21:\n Code = \"18,49956350012000D04995636000D80D81\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 22:\n Code = \"18,49966350012000E04996636000D80D91\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 23:\n Code = \"18,49976350012000F04997636000D80DA1\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 24:\n Code = \"18,49986350012000004998636000C80DA1\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 25:\n Code = \"18,49996350012000104999636000C80DB1\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 26:\n Code = \"18,499A635001200020499A636000C80DC1\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 27:\n Code = \"18,499B635001200030499B636000C80DD1\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 28:\n Code = \"18,499C635001200040499C636000B80DD1\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 29:\n Code = \"18,499D635001200050499D636000B80DE1\";\n var hvac_state = \"on\";\n global.set('hvac_status', hvac_state);\n break;\n case 30:\n// Code = \"18,499E635001200060499E636000B80DF1\";\n Code = \"18,41870450012000804187046000880EE1\";\n var hvac_state = \"off\";\n global.set('hvac_status', hvac_state);\n break;\n}\n\n//switch(msg.payload) {\n// case \"on\":\n// Code = \"18,49874450012000004987446000380F11\";\n// break;\n// case \"off\":\n// Code = \"18,41870450012000804187046000880EE1\";\n// break;\n//}\n\nmsg = {payload:Code};\nreturn msg;","outputs":1,"noerr":0,"x":890,"y":60,"wires":[[]]},{"id":"cdc28a7e.c1709","type":"debug","z":"30043e7f.63d8b2","name":"","active":true,"console":"false","complete":"false","x":1330,"y":220,"wires":[]},{"id":"e3af83b5.fadf38","type":"sqlite","z":"718348e1.4331e8","mydb":"a450b6b4.16cc48","name":"hdata","x":770,"y":180,"wires":[["7aa5dee6.2d4c5"]]},{"id":"5c1c32.781cb3d","type":"ui_chart","z":"718348e1.4331e8","name":"Chart","group":"c1d65bde.c687c8","order":2,"width":"0","height":"0","label":"","chartType":"line","legend":"false","xformat":"dd HH:mm","interpolate":"linear","nodata":"Select options","dot":false,"ymin":"","ymax":"","removeOlder":"1","removeOlderPoints":"","removeOlderUnit":"604800","cutout":"","useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":1250,"y":220,"wires":[[],[]]},{"id":"48359ee2.125058","type":"function","z":"718348e1.4331e8","name":"Chart Prep","func":"var msg2 = [];\n\nif (msg.payload[0].length>0) {\n // this is the logic when there are multiple data sets are received\n for (var i=0; i<msg.payload.length; i++) {\n var output = [];\n for (var j=0; j<msg.payload[i].length; j++) {\n output.push([msg.payload[i][j].epoch, msg.payload[i][j].value]);\n }\n msg2.push({ key: msg.payload[i][0].device+\"/\"+msg.payload[i][0].sensor, values : output});\n //msg2.push({ key: \"test\", values : output});\n }\n} \n\nmsg.payload=msg2;\n//msg.payload = [ { key: \"Power\", values : output} ];\n//msg.topic = \"Power\";\nreturn msg;","outputs":1,"noerr":0,"x":1070,"y":220,"wires":[["5c1c32.781cb3d"]]},{"id":"1db12d6d.e52883","type":"inject","z":"718348e1.4331e8","name":"Reset chart","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":910,"y":260,"wires":[["62dce13c.018ff"]]},{"id":"62dce13c.018ff","type":"function","z":"718348e1.4331e8","name":"Empty payload","func":"msg.payload = [];\nreturn msg;","outputs":1,"noerr":0,"x":1080,"y":260,"wires":[["5c1c32.781cb3d"]]},{"id":"7aa5dee6.2d4c5","type":"join","z":"718348e1.4331e8","name":"","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","timeout":"","count":"","x":910,"y":180,"wires":[["44f4f1ab.29f94","48359ee2.125058"]]},{"id":"76624656.5702","type":"ui_dropdown","z":"718348e1.4331e8","name":"Period","label":"","group":"1e2ce10.ed3329f","order":3,"width":"6","height":"1","passthru":true,"options":[{"label":"Today","value":"today","type":"str"},{"label":"Yesterday","value":"yesterday","type":"str"},{"label":"This week","value":"thisweek","type":"str"},{"label":"Last week","value":"lastweek","type":"str"},{"label":"Last hour","value":"lasthour","type":"str"},{"label":"Last 24 hours","value":"last24h","type":"str"},{"label":"Last 7 days","value":"last7d","type":"str"},{"label":"Last 30 days","value":"last30d","type":"str"}],"payload":"","topic":"period","x":470,"y":180,"wires":[["c4e4cc9b.cf3ac"]]},{"id":"a802d99.f184328","type":"change","z":"718348e1.4331e8","name":"Reset","rules":[{"t":"set","p":"payload","pt":"msg","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":180,"wires":[["76624656.5702"]]},{"id":"44f4f1ab.29f94","type":"change","z":"718348e1.4331e8","name":"Title","rules":[{"t":"set","p":"payload","pt":"msg","to":"title","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1050,"y":180,"wires":[["f5bbae74.5a8148"]]},{"id":"f5bbae74.5a8148","type":"ui_text","z":"718348e1.4331e8","group":"c1d65bde.c687c8","order":1,"width":"6","height":"1","name":"Chart title","label":"","format":"{{msg.payload}}","layout":"row-center","x":1260,"y":180,"wires":[]},{"id":"de08006.0fa538","type":"comment","z":"718348e1.4331e8","name":"Historical data","info":"","x":170,"y":100,"wires":[]},{"id":"c4e4cc9b.cf3ac","type":"function","z":"718348e1.4331e8","name":"SQL","func":"// This will handle any device and any attribute as long as it is in the DB\nvar p_30d = 1000*60*60*24*30 ; //30 Days\nvar p_7d = 1000*60*60*24*7 ; //7 Days\nvar p_1d = 1000*60*60*24 ; // 1 Day\nvar p_1h = 1000*60*60; //1 hour\nvar d = new Date();\nvar current = d.getTime();\nvar today0h = d.setHours(0,0,0,0);\nvar day = d.getDay();\nvar monday0h = today0h - (day + (day === 0 ? -6:1)) * p_1d;\nvar fromdate = 0;\nvar enddate = 0;\nvar sql = [];\nvar sourcelist = [];\nvar title = \"\";\n\n\n// Get the period and the list of data sources \n// also set some default values if one or the other does not exist yet\nsourcelist = context.get(\"sourcelist\");\nif (sourcelist===undefined) { // if running for the first time\n sourcelist = \"power/Power\";\n}\nfromdate = context.get(\"fromdate\");\nif (fromdate===undefined) {\n // set the period to a default if it is not selected yet\n fromdate = current-p_1d;\n}\nenddate = context.get(\"enddate\");\nif (enddate===undefined) {\n // set the period to a default if it is not selected yet\n enddate = current;\n}\n\nswitch(msg.topic) {\n case \"period\":\n switch(msg.payload) {\n case \"today\":\n fromdate = today0h;\n enddate = today0h+p_1d;\n break;\n case \"yesterday\":\n fromdate = today0h-p_1d;\n enddate = today0h;\n break;\n case \"thisweek\":\n fromdate = monday0h;\n enddate = monday0h+p_7d;\n break;\n case \"lastweek\":\n fromdate = monday0h-p_7d;\n enddate = monday0h;\n break;\n case \"lasthour\":\n fromdate = current-p_1h;\n enddate = current;\n break;\n case \"last24h\":\n fromdate = current-p_1d;\n enddate = current;\n break;\n case \"last7d\":\n fromdate = current-p_7d;\n enddate = current;\n break;\n case \"last30d\":\n fromdate = current-p_30d;\n enddate = current;\n break;\n }\n context.set(\"fromdate\",fromdate);\n context.set(\"enddate\",enddate);\n break;\n case \"sensor\":\n if (msg.payload===\"delete\") {\n // remove all previous data sources\n sourcelist = [];\n } else {\n sourcelist = context.get(\"sourcelist\");\n if (sourcelist===undefined) { // if running for the first time\n sourcelist = [];\n }\n sourcelist.push(msg.payload);\n }\n context.set(\"sourcelist\",sourcelist);\n break;\n case \"minus1w\":\n fromdate = fromdate-p_7d;\n enddate = enddate-p_7d;\n context.set(\"fromdate\",fromdate);\n context.set(\"enddate\",enddate);\n break;\n case \"plus1w\":\n fromdate = fromdate+p_7d;\n enddate = enddate+p_7d;\n context.set(\"fromdate\",fromdate);\n context.set(\"enddate\",enddate);\n break;\n case \"minus1d\":\n fromdate = fromdate-p_1d;\n enddate = enddate-p_1d;\n context.set(\"fromdate\",fromdate);\n context.set(\"enddate\",enddate);\n break;\n case \"plus1d\":\n fromdate = fromdate+p_1d;\n enddate = enddate+p_1d;\n context.set(\"fromdate\",fromdate);\n context.set(\"enddate\",enddate);\n break;\n case \"minus1h\":\n fromdate = fromdate-p_1h;\n enddate = enddate-p_1h;\n context.set(\"fromdate\",fromdate);\n context.set(\"enddate\",enddate);\n break;\n case \"plus1h\":\n fromdate = fromdate+p_1h;\n enddate = enddate+p_1h;\n context.set(\"fromdate\",fromdate);\n context.set(\"enddate\",enddate);\n break;\n}\n\n\n// Regenerate the SQL statements\n// Run through the data source list an generate the SQL statements\nsql = [];\nif (sourcelist.length>0) {\n for (var i = 0; i < sourcelist.length; i++) {\n var parts = sourcelist[i].split(\"/\");\n sql.push({ topic: \"SELECT * FROM hdata WHERE device='\"+parts[0]+\"' AND sensor='\"+parts[1]+\"' AND epoch >= \" + fromdate + \" AND epoch <= \" + enddate });\n }\n}\nif (sql.length===0) { \n // Dummy select that returns nothing to clear the chart\n sql.push({ topic: \"SELECT * FROM hdata WHERE device='xxxx'\" });\n}\n\n// set the completed flag for the join node later\nsql[sql.length-1].complete=true;\n// pass along the email flag to redirect the flow later\nif (msg.topic===\"email\") {\n sql[sql.length-1].email=true;\n}\n\n// Generate report title\nif (sourcelist.length===0) {\n title = \"No data source\";\n} else {\n if (sourcelist.length!==0) {\n title = title + sourcelist.toString()+ \", \";\n }\n title = title.substring(0,title.length-2);\n title = title + \" | \";\n\n var d = new Date();\n d.setTime(fromdate);\n var yyyy = d.getFullYear();\n var mm = d.getMonth() < 9 ? \"0\" + (d.getMonth() + 1) : (d.getMonth() + 1); // getMonth() is zero-based\n var dd = d.getDate() < 10 ? \"0\" + d.getDate() : d.getDate();\n var hh = d.getHours() < 10 ? \"0\" + d.getHours() : d.getHours();\n var mmm = d.getMinutes() < 10 ? \"0\" + d.getMinutes() : d.getMinutes();\n var ss = d.getSeconds() < 10 ? \"0\" + d.getSeconds() : d.getSeconds();\n title = title + dd + \".\" + mm + \".\" + yyyy;\n d.setTime(enddate);\n yyyy = d.getFullYear();\n mm = d.getMonth() < 9 ? \"0\" + (d.getMonth() + 1) : (d.getMonth() + 1); // getMonth() is zero-based\n dd = d.getDate() < 10 ? \"0\" + d.getDate() : d.getDate();\n hh = d.getHours() < 10 ? \"0\" + d.getHours() : d.getHours();\n mmm = d.getMinutes() < 10 ? \"0\" + d.getMinutes() : d.getMinutes();\n ss = d.getSeconds() < 10 ? \"0\" + d.getSeconds() : d.getSeconds();\n title = title + \" - \" + dd + \".\" + mm + \".\" + yyyy;\n}\nsql[sql.length-1].title=title;\n\nreturn [ sql ];\n\n","outputs":1,"noerr":0,"x":650,"y":180,"wires":[["e3af83b5.fadf38"]]},{"id":"20efdbf7.b097dc","type":"ui_dropdown","z":"718348e1.4331e8","name":"Sensors","label":"","place":"","group":"1e2ce10.ed3329f","order":2,"width":"6","height":"1","passthru":false,"options":[{"label":"[Remove all]","value":"delete","type":"str"}],"payload":"","topic":"sensor","x":480,"y":140,"wires":[["c4e4cc9b.cf3ac","4944071d.2a5a2"]]},{"id":"cb95faa6.5f75b","type":"ui_dropdown","z":"718348e1.4331e8","name":"Devices","label":"","place":"","group":"1e2ce10.ed3329f","order":1,"width":"6","height":"1","passthru":true,"options":[{"label":"[Select sensor]","value":"sensor","type":"str"},{"label":"rpi1","value":"rpi1","type":"str"},{"label":"flow1","value":"flow1","type":"str"},{"label":"power","value":"power","type":"str"},{"label":"pow1","value":"pow1","type":"str"},{"label":"pow2","value":"pow2","type":"str"},{"label":"pow3","value":"pow3","type":"str"},{"label":"temp1","value":"temp1","type":"str"},{"label":"door1","value":"door1","type":"str"},{"label":"camera1","value":"camera1","type":"str"}],"payload":"","topic":"device","x":480,"y":100,"wires":[["a374ab84.80bf98"]]},{"id":"a374ab84.80bf98","type":"function","z":"718348e1.4331e8","name":"Sync","func":"\nswitch(msg.topic) {\n case \"device\":\n switch(msg.payload) {\n case \"rpi1\":\n msg.options = [ {\"[Remove all]\":\"delete\"}, {\"Temp\": msg.payload + \"/Temp\"}, {\"CPU\": msg.payload + \"/CPU\"}, {\"RAM\": msg.payload + \"/RAM\"} ];\n break;\n case \"power\":\n msg.options = [ {\"[Remove all]\":\"delete\"}, {\"Power\": msg.payload + \"/Power\"}, {\"Current\": msg.payload + \"/Current\"}, {\"Voltage\": msg.payload + \"/Voltage\"} ];\n break;\n case \"flow1\":\n msg.options = [ {\"[Remove all]\":\"delete\"}, {\"Use\": msg.payload + \"/Use\"}, {\"Flow\": msg.payload + \"/Flow\"} ];\n break;\n case \"pow1\":\n msg.options = [ {\"[Remove all]\":\"delete\"}, {\"Power\": msg.payload + \"/Power\"}, {\"Current\": msg.payload + \"/Current\"}, {\"Voltage\": msg.payload + \"/Voltage\"}, {\"Factor\": msg.payload + \"/Factor\"} ];\n break;\n case \"pow2\":\n msg.options = [ {\"[Remove all]\":\"delete\"}, {\"Power\": msg.payload + \"/Power\"}, {\"Current\": msg.payload + \"/Current\"}, {\"Voltage\": msg.payload + \"/Voltage\"}, {\"Factor\": msg.payload + \"/Factor\"} ];\n break;\n case \"pow3\":\n msg.options = [ {\"[Remove all]\":\"delete\"}, {\"Power\": msg.payload + \"/Power\"}, {\"Current\": msg.payload + \"/Current\"}, {\"Voltage\": msg.payload + \"/Voltage\"}, {\"Factor\": msg.payload + \"/Factor\"} ];\n break;\n case \"temp1\":\n msg.options = [ {\"[Remove all]\":\"delete\"}, {\"Temperature\": msg.payload + \"/Temperature\"} ];\n break;\n case \"door1\":\n msg.options = [ {\"[Remove all]\":\"delete\"}, {\"State\": msg.payload + \"/State\"} ];\n break;\n case \"camera1\":\n msg.options = [ {\"[Remove all]\":\"delete\"}, {\"Motion\": msg.payload + \"/Motion\"} ];\n break;\n default:\n msg.options = [ {\"[Remove all]\":\"delete\"} ];\n break;\n }\n}\nglobal.set('device', msg.payload);\n\nreturn msg;","outputs":"1","noerr":0,"x":350,"y":140,"wires":[["20efdbf7.b097dc"]]},{"id":"4944071d.2a5a2","type":"function","z":"718348e1.4331e8","name":"Sync","func":"msg = {payload: \"today\"};\n\nreturn msg;","outputs":"1","noerr":0,"x":650,"y":140,"wires":[["76624656.5702"]]},{"id":"6fec39bf.a175a8","type":"inject","z":"718348e1.4331e8","name":"Start","topic":"","payload":"power","payloadType":"str","repeat":"","crontab":"","once":true,"x":350,"y":100,"wires":[["cb95faa6.5f75b"]]},{"id":"363aa0e0.8206e8","type":"delay","z":"b7f34080.d736b","name":"Delay","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":790,"y":640,"wires":[["4ac4cfb.850303"]]},{"id":"353c1136.49af9e","type":"ui_template","z":"718348e1.4331e8","group":"2ffd12e8.b785a6","name":"Trend","order":1,"width":"2","height":"2","format":"<div layout=\"row\" layout-align=\"space-between\">\n <table width=\"100%\" height=\"100%\">\n <tr>\n <td colspan=\"2\">{{msg.title}}</td>\n </tr>\n <tr>\n <td rowspan=\"2\" style=\"text-align: center;\"><span style=\"font-size: 200%; font-weight: bold;\">{{msg.current}}</span><br/>{{msg.unit}}</td>\n <td style=\"text-align: center; font-size: 200%; font-weight: bold;\" ng-style=\"{color: msg.trend === 'up' ? 'green' : 'red'}\">{{(msg.trend === 'up') ? '⇧' : '⇩'}}</td>\n </tr>\n <tr>\n <td style=\"text-align: center; font-style: italic;\">{{msg.reference}}</td>\n </tr>\n </table>\n</div>","storeOutMessages":false,"fwdInMessages":false,"templateScope":"local","x":1250,"y":380,"wires":[[]]},{"id":"484ee41a.ea878c","type":"inject","z":"718348e1.4331e8","name":"","topic":"","payload":"","payloadType":"date","repeat":"3600","crontab":"","once":true,"x":490,"y":380,"wires":[["74bbefdd.4f7d38"]]},{"id":"74bbefdd.4f7d38","type":"function","z":"718348e1.4331e8","name":"SQL","func":"var p_30d = 1000*60*60*24*30 ; //30 Days\nvar p_7d = 1000*60*60*24*7 ; //7 Days\nvar p_1d = 1000*60*60*24 ; // 1 Day\nvar d = new Date();\nvar current = d.getTime();\nvar today0h = d.setHours(0,0,0,0);\nvar day = d.getDay();\nvar monday0h = today0h - (day + (day === 0 ? -6:1)) * p_1d;\nvar fromdate = 0;\nvar enddate = 0;\nvar sql = [];\n\nfromdate = today0h - p_30d;\nenddate = today0h;\nsql.push({ topic: \"SELECT sum(value) AS value FROM hdata WHERE device='power' AND sensor='Power' AND epoch >= \" + fromdate + \" AND epoch <= \" + enddate });\n\nfromdate = fromdate - p_30d;\nenddate = enddate - p_30d;\nsql.push({ topic: \"SELECT sum(value) AS value FROM hdata WHERE device='power' AND sensor='Power' AND epoch >= \" + fromdate + \" AND epoch <= \" + enddate });\n\n// set the completed flag for the join node later\nsql[sql.length-1].complete=true;\n\nreturn [ sql ];","outputs":1,"noerr":0,"x":650,"y":380,"wires":[["3613492d.cc5f66"]]},{"id":"3613492d.cc5f66","type":"sqlite","z":"718348e1.4331e8","mydb":"a450b6b4.16cc48","name":"hdata","x":770,"y":380,"wires":[["b5bdd6cb.18033"]]},{"id":"b5bdd6cb.18033","type":"join","z":"718348e1.4331e8","name":"","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","timeout":"","count":"","x":910,"y":380,"wires":[["18e0fe96.deb999"]]},{"id":"18e0fe96.deb999","type":"function","z":"718348e1.4331e8","name":"Prep Data","func":"// Output format for the ui_template node\n// msg.current: current values displayed in large numbers\n// msg.unit: unit value shown under the current value\n// msg.trend = up|down: displays the up/down trend arrow\n// msg.reference: reference/past value displayed in smaller numbers\n// msg.title: KPI title shown on the top\n\nmsg.title = \"30 days\";\nmsg.current = Math.floor(msg.payload[0][0].value/1000000);\nmsg.unit = \"kWh\";\nmsg.reference = Math.floor(msg.payload[1][0].value/1000000);\nif (msg.payload[0][0].value>msg.payload[1][0].value) {\n msg.trend = \"up\";\n} else {\n msg.trend = \"down\";\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":1060,"y":380,"wires":[["353c1136.49af9e"]]},{"id":"55b772d.8d9470c","type":"ui_template","z":"718348e1.4331e8","group":"27714eb6.f1b642","name":"Trend","order":1,"width":"2","height":"2","format":"<div layout=\"row\" layout-align=\"space-between\">\n <table width=\"100%\" height=\"100%\">\n <tr>\n <td colspan=\"2\">{{msg.title}}</td>\n </tr>\n <tr>\n <td rowspan=\"2\" style=\"text-align: center;\"><span style=\"font-size: 200%; font-weight: bold;\">{{msg.current}}</span><br/>{{msg.unit}}</td>\n <td style=\"text-align: center; font-size: 200%; font-weight: bold;\" ng-style=\"{color: msg.trend === 'up' ? 'green' : 'red'}\">{{(msg.trend === 'up') ? '⇧' : '⇩'}}</td>\n </tr>\n <tr>\n <td style=\"text-align: center; font-style: italic;\">{{msg.reference}}</td>\n </tr>\n </table>\n</div>","storeOutMessages":false,"fwdInMessages":false,"templateScope":"local","x":1250,"y":420,"wires":[[]]},{"id":"a060c4c7.4d763","type":"inject","z":"718348e1.4331e8","name":"","topic":"","payload":"","payloadType":"date","repeat":"3600","crontab":"","once":true,"x":490,"y":420,"wires":[["42928dfd.390c3c"]]},{"id":"42928dfd.390c3c","type":"function","z":"718348e1.4331e8","name":"SQL","func":"var p_30d = 1000*60*60*24*30 ; //30 Days\nvar p_7d = 1000*60*60*24*7 ; //7 Days\nvar p_1d = 1000*60*60*24 ; // 1 Day\nvar d = new Date();\nvar current = d.getTime();\nvar today0h = d.setHours(0,0,0,0);\nvar day = d.getDay();\nvar monday0h = today0h - (day + (day === 0 ? -6:1)) * p_1d;\nvar fromdate = 0;\nvar enddate = 0;\nvar sql = [];\n\nfromdate = today0h - p_7d;\nenddate = today0h;\nsql.push({ topic: \"SELECT sum(value) AS value FROM hdata WHERE device='power' AND sensor='Power' AND epoch >= \" + fromdate + \" AND epoch <= \" + enddate });\n\nfromdate = fromdate - p_7d;\nenddate = enddate - p_7d;\nsql.push({ topic: \"SELECT sum(value) AS value FROM hdata WHERE device='power' AND sensor='Power' AND epoch >= \" + fromdate + \" AND epoch <= \" + enddate });\n\n// set the completed flag for the join node later\nsql[sql.length-1].complete=true;\n\nreturn [ sql ];","outputs":1,"noerr":0,"x":650,"y":420,"wires":[["bbf40a97.cb12c"]]},{"id":"bbf40a97.cb12c","type":"sqlite","z":"718348e1.4331e8","mydb":"a450b6b4.16cc48","name":"hdata","x":770,"y":420,"wires":[["7aed44f3.bd27c4"]]},{"id":"7aed44f3.bd27c4","type":"join","z":"718348e1.4331e8","name":"","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","timeout":"","count":"","x":910,"y":420,"wires":[["6b5d0ec2.c7e228"]]},{"id":"6b5d0ec2.c7e228","type":"function","z":"718348e1.4331e8","name":"Prep Data","func":"// Output format for the ui_template node\n// msg.current: current values displayed in large numbers\n// msg.unit: unit value shown under the current value\n// msg.trend = up|down: displays the up/down trend arrow\n// msg.reference: reference/past value displayed in smaller numbers\n// msg.title: KPI title shown on the top\n\nmsg.title = \"7 days\";\nmsg.current = parseFloat(msg.payload[0][0].value/1000000).toFixed(0);\nmsg.unit = \"kWh\";\nmsg.reference = Math.abs(Math.floor((msg.payload[0][0].value-msg.payload[1][0].value)/msg.payload[0][0].value*100)) + \"%\";\nif (msg.payload[0][0].value>msg.payload[1][0].value) {\n msg.trend = \"up\";\n} else {\n msg.trend = \"down\";\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":1060,"y":420,"wires":[["55b772d.8d9470c"]]},{"id":"416095c7.de05cc","type":"mqtt in","z":"f5c189e4.4369e8","name":"","topic":"water","qos":"2","broker":"3f9f7390.9dae5c","x":910,"y":700,"wires":[["da39dc58.805908"]]},{"id":"5b1e094.6de7f78","type":"function","z":"f5c189e4.4369e8","name":"Parse values","func":"var use = (msg.payload.use/1000).toFixed(1);\n\nvar msg = {payload: msg.payload.flow, total: use};\n\nreturn msg;","outputs":"1","noerr":0,"x":1290,"y":700,"wires":[["d3eeb652.f5ba38"]]},{"id":"da39dc58.805908","type":"json","z":"f5c189e4.4369e8","name":"","x":1030,"y":700,"wires":[["5b1e094.6de7f78","59320e8.d9f7df"]]},{"id":"dcf43730.87447","type":"comment","z":"f5c189e4.4369e8","name":"Water","info":"","x":910,"y":640,"wires":[]},{"id":"56c25fd5.fc6f28","type":"function","z":"f5c189e4.4369e8","name":"Record data","func":"function formattime () {\n now = new Date();\n year = \"\" + now.getFullYear();\n month = \"\" + (now.getMonth() + 1); if (month.length == 1) { month = \"0\" + month; }\n day = \"\" + now.getDate(); if (day.length == 1) { day = \"0\" + day; }\n hour = \"\" + now.getHours(); if (hour.length == 1) { hour = \"0\" + hour; }\n minute = \"\" + now.getMinutes(); if (minute.length == 1) { minute = \"0\" + minute; }\n second = \"\" + now.getSeconds(); if (second.length == 1) { second = \"0\" + second; }\n return year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + second;\n}\n\nvar sql = [];\nvar Value = [];\nvar Sensor = [];\nvar i = 0;\n\nvar Device = \"flow1\";\n\nSensor[0] = \"Flow\";\nSensor[1] = \"Use\";\n\nValue[0] = msg.payload.flow;\nValue[1] = msg.payload.use;\n\nvar now = new Date();\nvar Epoch = now.getTime();\nvar Time = formattime();\n\nfor (var i = 0; i < Sensor.length; i++) {\n sql.push({ topic:\"INSERT INTO hdata (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[i] + \"', '\" + Value[i] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n}\n\nreturn [ sql ];","outputs":1,"noerr":0,"x":1290,"y":760,"wires":[["9022ceae.030c08"]]},{"id":"9022ceae.030c08","type":"sqlite","z":"f5c189e4.4369e8","mydb":"a450b6b4.16cc48","name":"hdata","x":1430,"y":760,"wires":[[]]},{"id":"c1dcd99a.a7245","type":"function","z":"f5c189e4.4369e8","name":"SQL","func":"var msg = {payload: msg.payload.sync};\nvar sql = [];\nif (msg.payload===0){\n sql.push({ topic: \"SELECT max(value) as maxvalue FROM hdata WHERE sensor='Use' and device ='flow1'\"});\n}\n\nreturn sql;\n\n","outputs":1,"noerr":0,"x":1190,"y":800,"wires":[["f11dbc52.eec8"]]},{"id":"f11dbc52.eec8","type":"sqlite","z":"f5c189e4.4369e8","mydb":"a450b6b4.16cc48","name":"hdata","x":1310,"y":800,"wires":[["7a3d5569.1a775c"]]},{"id":"7a3d5569.1a775c","type":"function","z":"f5c189e4.4369e8","name":"use","func":"payload = msg.payload[0].maxvalue;\n\nif (payload ===null){\n payload = \"0\";\n}\n\nmsg = {payload: payload};\n\nreturn msg;","outputs":1,"noerr":0,"x":1430,"y":800,"wires":[["55124fc2.4bfe3"]]},{"id":"534a662d.e90ce","type":"mqtt out","z":"f5c189e4.4369e8","name":"","topic":"wateruse","qos":"","retain":"","broker":"3f9f7390.9dae5c","x":1680,"y":800,"wires":[]},{"id":"ae07633e.309988","type":"mqtt in","z":"f5c189e4.4369e8","name":"","topic":"watersync","qos":"2","broker":"3f9f7390.9dae5c","x":940,"y":800,"wires":[["63ea086f.f51d6"]]},{"id":"63ea086f.f51d6","type":"json","z":"f5c189e4.4369e8","name":"","x":1070,"y":800,"wires":[["c1dcd99a.a7245"]]},{"id":"55124fc2.4bfe3","type":"delay","z":"f5c189e4.4369e8","name":"Delay","pauseType":"delay","timeout":"10","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1550,"y":800,"wires":[["534a662d.e90ce"]]},{"id":"37b1a4e8.885e54","type":"inject","z":"f5c189e4.4369e8","name":"","topic":"","payload":"0","payloadType":"num","repeat":"","crontab":"","once":false,"x":1550,"y":840,"wires":[["534a662d.e90ce"]]},{"id":"59320e8.d9f7df","type":"delay","z":"f5c189e4.4369e8","name":"Delay","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":1150,"y":760,"wires":[["56c25fd5.fc6f28"]]},{"id":"175ea301.ca5ddd","type":"delay","z":"30043e7f.63d8b2","name":"Delay","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":410,"y":300,"wires":[["338bd73a.b32bd"]]},{"id":"338bd73a.b32bd","type":"function","z":"30043e7f.63d8b2","name":"Record data","func":"function formattime () {\n now = new Date();\n year = \"\" + now.getFullYear();\n month = \"\" + (now.getMonth() + 1); if (month.length == 1) { month = \"0\" + month; }\n day = \"\" + now.getDate(); if (day.length == 1) { day = \"0\" + day; }\n hour = \"\" + now.getHours(); if (hour.length == 1) { hour = \"0\" + hour; }\n minute = \"\" + now.getMinutes(); if (minute.length == 1) { minute = \"0\" + minute; }\n second = \"\" + now.getSeconds(); if (second.length == 1) { second = \"0\" + second; }\n return year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + second;\n}\n\nvar sql = [];\nvar Value = [];\nvar Sensor = [];\nvar i = 0;\nvar Device;\n\n// Parse the entire string by slash, and put each item into an array called parts\n\n//Device = msg.topic;\nDevice = \"temp1\";\n\nSensor[0] = \"temperature\";\n\ntemperature = msg.payload.temperature;\n\nValue[0] = temperature.toFixed(1);\n\nvar now = new Date();\nvar Epoch = now.getTime();\nvar Time = formattime();\n\nfor (var i = 0; i < Sensor.length; i++) {\n sql.push({ topic:\"INSERT INTO hdata (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[i] + \"', '\" + Value[i] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n}\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[2] + \"', '\" + Value[2] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[3] + \"', '\" + Value[3] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[4] + \"', '\" + Value[4] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[5] + \"', '\" + Value[5] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[6] + \"', '\" + Value[6] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[7] + \"', '\" + Value[7] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n\nreturn [ sql ];","outputs":1,"noerr":0,"x":550,"y":300,"wires":[["9e0875f6.1f6b5"]]},{"id":"9e0875f6.1f6b5","type":"sqlite","z":"30043e7f.63d8b2","mydb":"a450b6b4.16cc48","name":"hdata","x":730,"y":300,"wires":[[]]},{"id":"c23da9b2.0cdcb8","type":"debug","z":"f5c189e4.4369e8","name":"","active":true,"console":"false","complete":"false","x":1620,"y":620,"wires":[]},{"id":"e77f5135.4e2168","type":"function","z":"b7f34080.d736b","name":"Setup global variables","func":"global.set('sent_opened', true);\nglobal.set('sent_motion', false);\nglobal.set('door_closed', 1);\nglobal.set('motion_detected', 0);\nglobal.set('target_temperature', 21);\nglobal.set('hvac_status', \"off\");\nglobal.set('telegram_door1', true);\nglobal.set('telegram_camera1', true);\nglobal.set('temperature', 30);\n\nvar remote_state = [];\n\nvar sync_start = \"*\";\nvar hvac_system = \"Kelvinator\";\nvar setPower = false;\nvar setTemp = 21;\nvar setFan = 0;\nvar setMode = 1;\nvar setSwingVertical = true;\nvar setSwingHorizontal = true;\nvar setQuiet = true;\nvar setIonFilter = true;\nvar setLight = true;\nvar setXFan = false;\nvar setTurbo = false;\nvar sync_end = \"*\";\n\nremote_state[0] = sync_start;\nremote_state[1] = hvac_system;\nremote_state[2] = setPower;\nremote_state[3] = setTemp;\nremote_state[4] = setFan;\nremote_state[5] = setMode;\nremote_state[6] = setSwingVertical;\nremote_state[7] = setSwingHorizontal;\nremote_state[8] = setQuiet;\nremote_state[9] = setIonFilter;\nremote_state[10] = setLight;\nremote_state[11] = setXFan;\nremote_state[12] = setTurbo;\nremote_state[13] = sync_end;\n\nglobal.set('remote_state', remote_state);\n\nreturn msg;","outputs":"1","noerr":0,"x":340,"y":600,"wires":[[]]},{"id":"2785c037.508948","type":"inject","z":"b7f34080.d736b","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":150,"y":600,"wires":[["e77f5135.4e2168"]]},{"id":"21970257.b7cb56","type":"link in","z":"1523804c.6a58f","name":"door_sensor_in","links":["a538a9ea.a5bac8"],"x":815,"y":840,"wires":[["ad8eccbb.692068"]]},{"id":"47ea861c.076528","type":"mqtt in","z":"bc28262d.7e0fb","name":"door1","topic":"door1","qos":"2","broker":"3f9f7390.9dae5c","x":130,"y":100,"wires":[["7dde5d43.5c5bac"]]},{"id":"7dde5d43.5c5bac","type":"json","z":"bc28262d.7e0fb","name":"","x":290,"y":100,"wires":[["24b6363e.fab11a"]]},{"id":"24b6363e.fab11a","type":"function","z":"bc28262d.7e0fb","name":"Door warning","func":"function formattime () {\n now = new Date();\n year = \"\" + now.getFullYear();\n month = \"\" + (now.getMonth() + 1); if (month.length == 1) { month = \"0\" + month; }\n day = \"\" + now.getDate(); if (day.length == 1) { day = \"0\" + day; }\n hour = \"\" + now.getHours(); if (hour.length == 1) { hour = \"0\" + hour; }\n minute = \"\" + now.getMinutes(); if (minute.length == 1) { minute = \"0\" + minute; }\n second = \"\" + now.getSeconds(); if (second.length == 1) { second = \"0\" + second; }\n return year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + second;\n}\n\nvar telegram_door1 = global.get('telegram_door1');\nvar msg1 = null;\nvar msg2 = null;\n\nvar Time = formattime();\nvar door_closed = msg.payload.door_closed;\nvar sent_opened = global.get('sent_opened');\n\nif ((door_closed === 0 || door_closed === -1) && sent_opened === true){\n var content = \"The door was opened at \" + Time;\n global.set('sent_opened', false);\n global.set('door_closed', 0);\n if (telegram_door1===true){\n msg1 = { payload: {chatId : 95387852, type : 'message', content : content}};\n }else{\n msg1 = null;\n }\n var msg2 = msg;\n return [msg1, msg2];\n}\nif (door_closed === 1 && sent_opened === false){\n var content = \"The door was closed at \" + Time;\n global.set('sent_opened', true);\n global.set('door_closed', 1);\n if (telegram_door1===true){\n msg1 = { payload: {chatId : 95387852, type : 'message', content : content}};\n }else{\n msg1 = null;\n }\n var msg2 = msg;\n return [msg1, msg2];\n}\n\n\n//if (door_closed === -1){ //debug\n// var content = \"I'm awake and reading sensor state...\";\n//}\n\nreturn [null, null];\n","outputs":"2","noerr":0,"x":460,"y":100,"wires":[["a538a9ea.a5bac8"],["4246e416.393af4"]]},{"id":"4246e416.393af4","type":"function","z":"bc28262d.7e0fb","name":"Record data","func":"function formattime () {\n now = new Date();\n year = \"\" + now.getFullYear();\n month = \"\" + (now.getMonth() + 1); if (month.length == 1) { month = \"0\" + month; }\n day = \"\" + now.getDate(); if (day.length == 1) { day = \"0\" + day; }\n hour = \"\" + now.getHours(); if (hour.length == 1) { hour = \"0\" + hour; }\n minute = \"\" + now.getMinutes(); if (minute.length == 1) { minute = \"0\" + minute; }\n second = \"\" + now.getSeconds(); if (second.length == 1) { second = \"0\" + second; }\n return year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + second;\n}\n\nvar sql = [];\nvar Value = [];\nvar Sensor = [];\nvar i = 0;\nvar Device;\n\n// Parse the entire string by slash, and put each item into an array called parts\n\nDevice = msg.topic;\n\nSensor[0] = \"State\";\n\ndoor1 = msg.payload.door_closed;\n\nValue[0] = door1;\n\nvar now = new Date();\nvar Epoch = now.getTime();\nvar Time = formattime();\n\nfor (var i = 0; i < Sensor.length; i++) {\n sql.push({ topic:\"INSERT INTO hdata (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[i] + \"', '\" + Value[i] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n}\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[2] + \"', '\" + Value[2] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[3] + \"', '\" + Value[3] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[4] + \"', '\" + Value[4] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[5] + \"', '\" + Value[5] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[6] + \"', '\" + Value[6] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[7] + \"', '\" + Value[7] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n\nreturn [ sql ];","outputs":1,"noerr":0,"x":670,"y":120,"wires":[["fc173ba9.0cb448"]]},{"id":"fc173ba9.0cb448","type":"sqlite","z":"bc28262d.7e0fb","mydb":"a450b6b4.16cc48","name":"hdata","x":870,"y":200,"wires":[[]]},{"id":"a538a9ea.a5bac8","type":"link out","z":"bc28262d.7e0fb","name":"door_sensor_out","links":["21970257.b7cb56"],"x":835,"y":100,"wires":[]},{"id":"6642ede5.b7a564","type":"function","z":"bc28262d.7e0fb","name":"Door","func":"var green = '<i class=\"fa fa-circle fa-lg nr-dashboard-ok\"></i>';\nvar red = '<i class=\"fa fa-circle fa-lg nr-dashboard-error\"></i>';\n\nvar door_closed = global.get('door_closed');\n\n\nif (door_closed === 0 || door_closed === -1) {\n var content = red;\n var status = \"opened\";\n}\n\nif (door_closed === 1) {\n var content = green;\n var status = \"closed\";\n}\n\nmsg = {payload:content, status:status};\n\nreturn msg;","outputs":1,"noerr":0,"x":430,"y":340,"wires":[["a8689011.35f6e"]]},{"id":"7e4e47b6.594d48","type":"inject","z":"bc28262d.7e0fb","name":"watchdog","topic":"","payload":"","payloadType":"date","repeat":"1","crontab":"","once":false,"x":150,"y":340,"wires":[["6642ede5.b7a564","afe09de6.362a98"]]},{"id":"a8689011.35f6e","type":"ui_text","z":"bc28262d.7e0fb","group":"f6487965.411238","order":1,"width":"3","height":"1","name":"status","label":"Door {{msg.status}}","format":"{{msg.payload}}","layout":"row-spread","x":650,"y":340,"wires":[]},{"id":"ba2d6d4c.ae987","type":"mqtt in","z":"bc28262d.7e0fb","name":"motion1","topic":"camera1","qos":"2","broker":"3f9f7390.9dae5c","x":140,"y":220,"wires":[["8110d935.a76e8"]]},{"id":"8b8c888f.f3f548","type":"ui_template","z":"bc28262d.7e0fb","group":"79f08e26.0967e8","name":"Pi camera","order":3,"width":"6","height":"6","format":"<style>\n #Camera {\n width: 100%;\n height: 100%;\n }\n</style>\n\n<script type=\"text/javascript\">\n function reload(){\n var container = document.getElementById(\"Camera\");\n var content = container.innerHTML;\n container.innerHTML= content;\n }\n\n (function(scope) {\n scope.send({payload: \"preload\"}); // this gets sent when the view is opened in the browser\n scope.$watch('msg', function(msg) {\n if (msg) {\n reload();\n }\n });\n })(scope);\n</script>\n\n<!--a href=\"javascript: reload()\">Reload</a-->\n<div id=\"Camera\">\n <img src=\"http://abhome.homeip.net:8091\" height=\"300\" width=\"360\" />\n</div>\n","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":660,"y":680,"wires":[[]]},{"id":"8110d935.a76e8","type":"json","z":"bc28262d.7e0fb","name":"","x":290,"y":220,"wires":[["45261d6d.08fe04","53eba61f.dbb998"]]},{"id":"e7a7ea1b.5a48b","type":"ui_switch","z":"bc28262d.7e0fb","name":"","label":"Detection","group":"79f08e26.0967e8","order":2,"width":"3","height":"1","passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":280,"y":580,"wires":[["9d58c2e0.d16b18"]]},{"id":"45261d6d.08fe04","type":"function","z":"bc28262d.7e0fb","name":"Motion warning","func":"function formattime () {\n now = new Date();\n year = \"\" + now.getFullYear();\n month = \"\" + (now.getMonth() + 1); if (month.length == 1) { month = \"0\" + month; }\n day = \"\" + now.getDate(); if (day.length == 1) { day = \"0\" + day; }\n hour = \"\" + now.getHours(); if (hour.length == 1) { hour = \"0\" + hour; }\n minute = \"\" + now.getMinutes(); if (minute.length == 1) { minute = \"0\" + minute; }\n second = \"\" + now.getSeconds(); if (second.length == 1) { second = \"0\" + second; }\n return year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + second;\n}\n\nvar telegram_camera1 = global.get('telegram_camera1');\nvar msg1 = null;\nvar msg2 = null;\n\nvar Time = formattime();\nvar motion_detected = msg.payload;\nvar sent_motion = global.get('sent_motion');\nglobal.set('motion_detected', motion_detected);\n\nif (motion_detected === 1 && sent_motion === false){\n var content = \"The motion started at \" + Time;\n global.set('sent_motion', true);\n if (telegram_camera1===true){\n msg1 = { payload: {chatId : 95387852, type : 'message', content : content}};\n }else{\n msg1 = null;\n }\n var msg2 = msg;\n return [msg1, msg2];\n}\nif (motion_detected === 0 && sent_motion === true){\n var content = \"The motion stopped at \" + Time;\n global.set('sent_motion', false);\n if (telegram_camera1===true){\n msg1 = { payload: {chatId : 95387852, type : 'message', content : content}};\n }else{\n msg1 = null;\n }\n msg2 = msg;\n return [msg1, msg2];\n}\n\n\n//if (door_closed === -1){ //debug\n// var content = \"I'm awake and reading sensor state...\";\n//}\n\nreturn [null, null];\n","outputs":"2","noerr":0,"x":460,"y":220,"wires":[["a538a9ea.a5bac8"],["cd301914.013508"]]},{"id":"a82e3ac8.ab8b2","type":"ui_text","z":"bc28262d.7e0fb","group":"79f08e26.0967e8","order":1,"width":"3","height":"1","name":"motion","label":"Motion {{msg.status}}","format":"{{msg.payload}}","layout":"row-spread","x":650,"y":380,"wires":[]},{"id":"afe09de6.362a98","type":"function","z":"bc28262d.7e0fb","name":"Camera","func":"var green = '<i class=\"fa fa-circle fa-lg nr-dashboard-ok\"></i>';\nvar red = '<i class=\"fa fa-circle fa-lg nr-dashboard-error\"></i>';\n\nvar motion_detected = global.get('motion_detected');\n\n\nif (motion_detected === 1) {\n var content = red;\n var status = \"started\";\n}\n\nif (motion_detected === 0) {\n var content = green;\n var status = \"stopped\";\n}\n\nmsg = {payload:content, status:status};\n\nreturn msg;","outputs":1,"noerr":0,"x":440,"y":380,"wires":[["a82e3ac8.ab8b2"]]},{"id":"cd301914.013508","type":"function","z":"bc28262d.7e0fb","name":"Record data","func":"function formattime () {\n now = new Date();\n year = \"\" + now.getFullYear();\n month = \"\" + (now.getMonth() + 1); if (month.length == 1) { month = \"0\" + month; }\n day = \"\" + now.getDate(); if (day.length == 1) { day = \"0\" + day; }\n hour = \"\" + now.getHours(); if (hour.length == 1) { hour = \"0\" + hour; }\n minute = \"\" + now.getMinutes(); if (minute.length == 1) { minute = \"0\" + minute; }\n second = \"\" + now.getSeconds(); if (second.length == 1) { second = \"0\" + second; }\n return year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + second;\n}\n\nvar sql = [];\nvar Value = [];\nvar Sensor = [];\nvar i = 0;\nvar Device;\n\n// Parse the entire string by slash, and put each item into an array called parts\n\nDevice = msg.topic;\n\nSensor[0] = \"Motion\";\n\ncamera1 = msg.payload;\n\nValue[0] = camera1;\n\nvar now = new Date();\nvar Epoch = now.getTime();\nvar Time = formattime();\n\nfor (var i = 0; i < Sensor.length; i++) {\n sql.push({ topic:\"INSERT INTO hdata (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[i] + \"', '\" + Value[i] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n}\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[2] + \"', '\" + Value[2] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[3] + \"', '\" + Value[3] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[4] + \"', '\" + Value[4] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[5] + \"', '\" + Value[5] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[6] + \"', '\" + Value[6] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n//sql.push({ topic:\"INSERT INTO hpower (device, sensor, value, epoch, timestamp) VALUES ('\" + Device + \"', '\" + Sensor[7] + \"', '\" + Value[7] + \"', '\" + Epoch + \"', '\" + Time + \"')\"});\n\nreturn [ sql ];","outputs":1,"noerr":0,"x":670,"y":240,"wires":[["fc173ba9.0cb448"]]},{"id":"8958f414.a27468","type":"exec","z":"bc28262d.7e0fb","command":"curl http://192.168.86.240:7999/1/detection/pause -s -o /dev/null","addpay":true,"append":"","useSpawn":"","timer":"","name":"Motion pause","x":680,"y":620,"wires":[[],[],[]]},{"id":"45b9982b.1c1ae8","type":"exec","z":"bc28262d.7e0fb","command":"curl http://192.168.86.240:7999/1/detection/start -s -o /dev/null","addpay":true,"append":"","useSpawn":"","timer":"","name":"Motion start","x":670,"y":540,"wires":[[],[],[]]},{"id":"9d58c2e0.d16b18","type":"function","z":"bc28262d.7e0fb","name":"Motion control","func":"var motion_control = msg.payload\n\nif (motion_control === true ){\n var msg1 = { payload: motion_control};\n var msg2 = null;\n return [msg1, msg2];\n}\n\nif (motion_control === false ){\n var msg1 = null;\n var msg2 = { payload: motion_control};\n return [msg1, msg2];\n}\n\n//if (door_closed === -1){ //debug\n// var content = \"I'm awake and reading sensor state...\";\n//}\n\nreturn [null, null];\n","outputs":"2","noerr":0,"x":460,"y":580,"wires":[["45b9982b.1c1ae8"],["8958f414.a27468"]]},{"id":"b696310d.c7bea","type":"inject","z":"bc28262d.7e0fb","name":"Setup","topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"","once":true,"x":110,"y":500,"wires":[["59659ce.d8cbee4","435fc7f5.2d6ed"]]},{"id":"519a5f85.27888","type":"ui_template","z":"b7f34080.d736b","group":"1b61a0cd.e7d997","name":"Reboot","order":1,"width":"3","height":"1","format":"\n<md-button class=\"vibrate filled touched smallfont rounded\" style=\"background-color:#2980b9\" ng-click=\"send({payload: true})\"> \n Reboot<br/>\n</md-button> \n\n","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":120,"y":360,"wires":[["29f7618c.455bfe"]]},{"id":"ae2cfa9c.7843a","type":"ui_template","z":"b7f34080.d736b","group":"1b61a0cd.e7d997","name":"css style","order":3,"width":"0","height":"0","format":"<style>\n .filled { \n height: 100% !important;\n\n padding: 0 !important;\n margin: 0 !important;\n }\n .nr-dashboard-template {\n padding: 0;\n margin: 0;\n }\n \n .rounded {\n border-radius: 12px 12px 12px 12px;\n}\n \n .bigfont {\n font-size: 18px;\n}\n\n .smallfont {\n font-size: 12px;\n}\n \n</style>\n\n<script>\n$('.vibrate').on('click', function() {\n navigator.vibrate(100);\n});\n\nfunction restore_bg(x) {\n $(this).css(\"background-color\", x);\n };\n\n$('.touched').on('mousedown', function() {\n \n var x= $(this).css(\"background-color\");\n $(this).css(\"background-color\", \"yellow\");\n \n setTimeout(restore_bg.bind(this,x),100);\n navigator.vibrate(80);\n });\n \n</script>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":120,"y":320,"wires":[[]]},{"id":"1c7bb183.95754e","type":"ui_template","z":"b7f34080.d736b","group":"1b61a0cd.e7d997","name":"Shutdown","order":2,"width":"3","height":"1","format":"\n<md-button class=\"vibrate filled touched smallfont rounded\" style=\"background-color:#2980b9\" ng-click=\"send({payload: true})\"> \n Shutdown<br/>\n</md-button> \n\n","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":130,"y":420,"wires":[["7bbb817.f42828"]]},{"id":"8f27e415.d20ed8","type":"ui_template","z":"bc28262d.7e0fb","group":"3ada94d9.42d164","name":"Camera management","order":1,"width":"6","height":"1","format":"<md-button href=\"http://abhome.homeip.net:8765\" target=\"_blank\" class=\"vibrate filled touched smallfont rounded\" style=\"background-color:#2980b9\" ng-click=\"send({payload: true})\"> \n <br>Camera Management\n</md-button>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":700,"y":720,"wires":[[]]},{"id":"18b4ce2a.b38c82","type":"ui_template","z":"bc28262d.7e0fb","group":"3ada94d9.42d164","name":"stuff","order":2,"width":"6","height":"1","format":"<style>\n .filled { \n height: 100% !important;\n\n padding: 0 !important;\n margin: 0 !important;\n }\n .nr-dashboard-template {\n padding: 0;\n margin: 0;\n }\n \n .rounded {\n border-radius: 12px 12px 12px 12px;\n}\n \n .bigfont {\n font-size: 18px;\n}\n\n .smallfont {\n font-size: 12px;\n}\n \n</style>\n\n<script>\n$('.vibrate').on('click', function() {\n navigator.vibrate(100);\n});\n\nfunction restore_bg(x) {\n $(this).css(\"background-color\", x);\n };\n\n$('.touched').on('mousedown', function() {\n \n var x= $(this).css(\"background-color\");\n $(this).css(\"background-color\", \"yellow\");\n \n setTimeout(restore_bg.bind(this,x),100);\n navigator.vibrate(80);\n });\n \n</script>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":650,"y":760,"wires":[[]]},{"id":"c2460b8.bcc49f8","type":"function","z":"30043e7f.63d8b2","name":"Code2IR_L","func":"\n//Mesg Desc.: Power: On, Mode: 1 (COOL), Temp: 16C, Fan: 0 (AUTO), Turbo: Off, Quiet: Off, XFan: Off, IonFilter: On, Light: Off, Swing (Horizontal): Off, Swing (Vertical): On\n//Modes\n//KELVINATOR_AUTO 0\n//KELVINATOR_COOL 1\n//KELVINATOR_HEAT 2\n//KELVINATOR_DRY 3\n//KELVINATOR_FAN 4\n\nremote_state = global.get('remote_state');\n\nvar setTemp = parseInt(msg.payload);\n\nif (setTemp >29){\n var hvac_state = \"off\";\n setPower = false;\n}\nelse{\n var hvac_state = \"on\";\n setPower = true;\n}\n\nglobal.set('hvac_status', hvac_state);\n\nremote_state[3] = setTemp;\nremote_state[2] = setPower;\n\nglobal.set('remote_state', remote_state);\n\nvar Code = remote_state;\n\nmsg = {payload:Code};\n\nreturn msg;","outputs":1,"noerr":0,"x":950,"y":160,"wires":[["f61529c5.13e5d8","ea46e855.c5e06"]]},{"id":"e8a1ece.c43ad9","type":"ui_template","z":"30043e7f.63d8b2","group":"7be02a6.3551454","name":"Turbo","order":6,"width":"3","height":"1","format":"\n<md-button class=\"vibrate filled touched smallfont rounded\" style=\"background-color:{{msg.payload}}\" ng-click=\"send({payload: true})\"> \n Turbo<br/>\n</md-button> \n\n","storeOutMessages":true,"fwdInMessages":false,"templateScope":"local","x":730,"y":460,"wires":[["e702afcd.7e2e58"]]},{"id":"62ada48e.e86bcc","type":"ui_template","z":"30043e7f.63d8b2","group":"7be02a6.3551454","name":"css style","order":1,"width":"0","height":"0","format":"<style>\n .filled { \n height: 100% !important;\n\n padding: 0 !important;\n margin: 0 !important;\n }\n .nr-dashboard-template {\n padding: 0;\n margin: 0;\n }\n \n .rounded {\n border-radius: 12px 12px 12px 12px;\n}\n \n .bigfont {\n font-size: 18px;\n}\n\n .smallfont {\n font-size: 12px;\n}\n \n</style>\n\n<script>\n$('.vibrate').on('click', function() {\n navigator.vibrate(100);\n});\n\nfunction restore_bg(x) {\n $(this).css(\"background-color\", x);\n };\n\n$('.touched').on('mousedown', function() {\n \n var x= $(this).css(\"background-color\");\n $(this).css(\"background-color\", \"yellow\");\n \n setTimeout(restore_bg.bind(this,x),100);\n navigator.vibrate(80);\n });\n \n</script>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":740,"y":700,"wires":[[]]},{"id":"e702afcd.7e2e58","type":"function","z":"30043e7f.63d8b2","name":"SetTurbo","func":"\nremote_state = global.get('remote_state');\n\nvar setTurbo = remote_state[12];\n\nsetTurbo = !setTurbo;\n\nremote_state[12] = setTurbo;\n\nglobal.set('remote_state', remote_state);\n\nvar Code = remote_state;\n\nmsg = {payload:Code};\n\nreturn msg;","outputs":"2","noerr":0,"x":920,"y":460,"wires":[["ea46e855.c5e06"],[]]},{"id":"953d1fbe.8ecb4","type":"inject","z":"30043e7f.63d8b2","name":"","topic":"","payload":"","payloadType":"date","repeat":"1","crontab":"","once":true,"x":330,"y":400,"wires":[["d228181e.fbd3b8","6df8bf9f.76afa","c36ddb2e.6d5098","9115de99.422f4"]]},{"id":"d228181e.fbd3b8","type":"function","z":"30043e7f.63d8b2","name":"GetTurbo","func":"\nremote_state = global.get('remote_state');\n\nvar setTurbo = remote_state[12];\n\nif (setTurbo === false) {\n //red\n var content = '#c0392b';\n}\nelse{\n //blue\n var content = '#2980b9';\n //green\n// var content = '#27ae60';\n}\n\nmsg = {payload:content, status:setTurbo};\n\nreturn msg;","outputs":"1","noerr":0,"x":540,"y":460,"wires":[["e8a1ece.c43ad9"]]},{"id":"2581ae76.3d1f62","type":"ui_template","z":"30043e7f.63d8b2","group":"7be02a6.3551454","name":"Power","order":3,"width":"3","height":"1","format":"\n<md-button class=\"vibrate filled touched smallfont rounded\" style=\"background-color:{{msg.payload}}\" ng-click=\"send({payload: true})\"> \n Power<br/>\n</md-button> \n\n","storeOutMessages":true,"fwdInMessages":false,"templateScope":"local","x":730,"y":380,"wires":[["b2857b27.f6f61","f3e435d0.1fed78"]]},{"id":"b2857b27.f6f61","type":"function","z":"30043e7f.63d8b2","name":"SetPower","func":"\nremote_state = global.get('remote_state');\n\nvar setPower = remote_state[2];\n\nsetPower = !setPower;\n\nremote_state[2] = setPower;\n\nglobal.set('remote_state', remote_state);\n\nif (setPower === false){\n var hvac_state = \"off\";\n}\nelse{\n var hvac_state = \"on\";\n}\n\nglobal.set('hvac_status', hvac_state);\n\nvar Code = remote_state;\n\nmsg = {payload:Code};\n\nreturn msg;","outputs":"1","noerr":0,"x":920,"y":380,"wires":[["ea46e855.c5e06"]]},{"id":"8daf86d9.6472","type":"ui_template","z":"30043e7f.63d8b2","group":"7be02a6.3551454","name":"SwingVertical","order":9,"width":"3","height":"1","format":"\n<md-button class=\"vibrate filled touched smallfont rounded\" style=\"background-color:{{msg.payload}}\" ng-click=\"send({payload: true})\"> \n Swing<br/>\n</md-button> \n\n","storeOutMessages":true,"fwdInMessages":false,"templateScope":"local","x":760,"y":620,"wires":[["a956f050.ab9d7"]]},{"id":"a956f050.ab9d7","type":"function","z":"30043e7f.63d8b2","name":"SetSwingVertical","func":"\nremote_state = global.get('remote_state');\n\nvar setSwingVertical = remote_state[6];\n\nsetSwingVertical = !setSwingVertical;\n\nremote_state[6] = setSwingVertical;\n\nglobal.set('remote_state', remote_state);\n\nvar Code = remote_state;\n\nmsg = {payload:Code};\n\nreturn msg;","outputs":"2","noerr":0,"x":950,"y":620,"wires":[["ea46e855.c5e06"],[]]},{"id":"6df8bf9f.76afa","type":"function","z":"30043e7f.63d8b2","name":"GetSwingVertical","func":"\nremote_state = global.get('remote_state');\n\nvar setSwingVertical = remote_state[6];\n\nif (setSwingVertical === false) {\n //red\n var content = '#c0392b';\n}\nelse{\n //blue\n var content = '#2980b9';\n //green\n// var content = '#27ae60';\n}\n\nmsg = {payload:content, status:setSwingVertical};\n\nreturn msg;","outputs":"1","noerr":0,"x":570,"y":620,"wires":[["8daf86d9.6472"]]},{"id":"f24421da.ce8b48","type":"ui_template","z":"30043e7f.63d8b2","group":"7be02a6.3551454","name":"Light","order":7,"width":"3","height":"1","format":"\n<md-button class=\"vibrate filled touched smallfont rounded\" style=\"background-color:{{msg.payload}}\" ng-click=\"send({payload: true})\"> \n Light<br/>\n</md-button> \n\n","storeOutMessages":true,"fwdInMessages":false,"templateScope":"local","x":730,"y":540,"wires":[["7e299e89.ee8bc8"]]},{"id":"7e299e89.ee8bc8","type":"function","z":"30043e7f.63d8b2","name":"SetLight","func":"\nremote_state = global.get('remote_state');\n\nvar setLight = remote_state[10];\n\nsetLight = !setLight;\n\nremote_state[10] = setLight;\n\nglobal.set('remote_state', remote_state);\n\nvar Code = remote_state;\n\nmsg = {payload:Code};\n\nreturn msg;","outputs":"2","noerr":0,"x":920,"y":540,"wires":[["ea46e855.c5e06"],[]]},{"id":"c36ddb2e.6d5098","type":"function","z":"30043e7f.63d8b2","name":"GetLight","func":"\nremote_state = global.get('remote_state');\n\nvar setLight = remote_state[10];\n\nif (setLight === false) {\n //red\n var content = '#c0392b';\n}\nelse{\n //blue\n var content = '#2980b9';\n //green\n// var content = '#27ae60';\n}\n\nmsg = {payload:content, status:setLight};\n\nreturn msg;","outputs":"1","noerr":0,"x":540,"y":540,"wires":[["f24421da.ce8b48"]]},{"id":"9115de99.422f4","type":"function","z":"30043e7f.63d8b2","name":"GetPower","func":"\nremote_state = global.get('remote_state');\n\nvar setPower = remote_state[2];\n\nif (setPower === false) {\n //red\n var content = '#c0392b';\n}\nelse{\n //blue\n var content = '#2980b9';\n //green\n// var content = '#27ae60';\n}\n\nmsg = {payload:content, status:setPower};\n\nreturn msg;","outputs":"1","noerr":0,"x":540,"y":380,"wires":[["2581ae76.3d1f62"]]},{"id":"fb002a5f.618158","type":"inject","z":"30043e7f.63d8b2","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":330,"y":100,"wires":[["c5d32bdf.441fb8"]]},{"id":"37dcd616.a0fc52","type":"ui_template","z":"718348e1.4331e8","group":"1e2ce10.ed3329f","name":"-1H","order":4,"width":"3","height":"1","format":"\n<md-button class=\"vibrate filled touched smallfont rounded\" style=\"background-color:#2980b9\" ng-click=\"send({payload: true, topic: 'minus1h'})\"> \n -hour<br/>\n</md-button> \n\n","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":150,"y":140,"wires":[["c4e4cc9b.cf3ac"]]},{"id":"855f28a0.93d9f","type":"ui_template","z":"718348e1.4331e8","group":"1e2ce10.ed3329f","name":"css style","order":8,"width":"0","height":"0","format":"<style>\n .filled { \n height: 100% !important;\n\n padding: 0 !important;\n margin: 0 !important;\n }\n .nr-dashboard-template {\n padding: 0;\n margin: 0;\n }\n \n .rounded {\n border-radius: 12px 12px 12px 12px;\n}\n \n .bigfont {\n font-size: 18px;\n}\n\n .smallfont {\n font-size: 12px;\n}\n \n</style>\n\n<script>\n$('.vibrate').on('click', function() {\n navigator.vibrate(100);\n});\n\nfunction restore_bg(x) {\n $(this).css(\"background-color\", x);\n };\n\n$('.touched').on('mousedown', function() {\n \n var x= $(this).css(\"background-color\");\n $(this).css(\"background-color\", \"yellow\");\n \n setTimeout(restore_bg.bind(this,x),100);\n navigator.vibrate(80);\n });\n \n</script>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":160,"y":300,"wires":[[]]},{"id":"da86a71f.79b39","type":"ui_template","z":"718348e1.4331e8","group":"1e2ce10.ed3329f","name":"+1H","order":5,"width":"3","height":"1","format":"\n<md-button class=\"vibrate filled touched smallfont rounded\" style=\"background-color:#2980b9\" ng-click=\"send({payload: true, topic: 'plus1h'})\"> \n hour+<br/>\n</md-button> \n\n","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":150,"y":180,"wires":[["c4e4cc9b.cf3ac"]]},{"id":"807765e9.cb0c88","type":"ui_template","z":"718348e1.4331e8","group":"1e2ce10.ed3329f","name":"-1D","order":6,"width":"3","height":"1","format":"\n<md-button class=\"vibrate filled touched smallfont rounded\" style=\"background-color:#2980b9\" ng-click=\"send({payload: true, topic: 'minus1d'})\"> \n -day<br/>\n</md-button> \n\n","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":150,"y":220,"wires":[["a802d99.f184328","c4e4cc9b.cf3ac"]]},{"id":"c4fc82da.63db78","type":"ui_template","z":"718348e1.4331e8","group":"1e2ce10.ed3329f","name":"+1D","order":7,"width":"3","height":"1","format":"\n<md-button class=\"vibrate filled touched smallfont rounded\" style=\"background-color:#2980b9\" ng-click=\"send({payload: true, topic: 'plus1d'})\"> \n day+<br/>\n</md-button> \n\n","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":150,"y":260,"wires":[["c4e4cc9b.cf3ac","a802d99.f184328"]]},{"id":"435fc7f5.2d6ed","type":"ui_switch","z":"bc28262d.7e0fb","name":"door1","label":"door1","group":"b306725d.0dfb18","order":0,"width":"3","height":"1","passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":270,"y":520,"wires":[["9b62bf1.dba354"]]},{"id":"59659ce.d8cbee4","type":"ui_switch","z":"bc28262d.7e0fb","name":"camera1","label":"camera1","group":"b306725d.0dfb18","order":0,"width":"3","height":"1","passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":280,"y":480,"wires":[["5d8f5c74.e922cc"]]},{"id":"9b62bf1.dba354","type":"function","z":"bc28262d.7e0fb","name":"Set door notification","func":"global.set('telegram_door1', msg.payload);\n\nreturn msg;","outputs":1,"noerr":0,"x":480,"y":520,"wires":[[]]},{"id":"5d8f5c74.e922cc","type":"function","z":"bc28262d.7e0fb","name":"Set camera msg","func":"global.set('telegram_camera1', msg.payload);\n\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":480,"wires":[[]]},{"id":"a5fadd81.8e1db8","type":"function","z":"bc28262d.7e0fb","name":"Motion picture","func":"var sent_motion = global.get('sent_motion');\n\nif (sent_motion === true){\n msg = { payload: {chatId : 95387852, type : 'photo', content : '/home/pi/current'}};\n return msg;\n}\n\nreturn null;\n","outputs":"1","noerr":0,"x":680,"y":180,"wires":[["a538a9ea.a5bac8"]]},{"id":"53eba61f.dbb998","type":"exec","z":"bc28262d.7e0fb","command":"curl -O http://192.168.86.240:8765/picture/1/current > /home/pi/current.jpg","addpay":false,"append":"","useSpawn":"","timer":"","name":"Save picture","x":470,"y":160,"wires":[["a5fadd81.8e1db8"],[],[]]},{"id":"f085eae1.074da8","type":"exec","z":"1523804c.6a58f","command":"curl -O http://192.168.86.240:8765/picture/1/current > /home/pi/current.jpg","addpay":false,"append":"","useSpawn":"","timer":"","name":"Save picture","x":330,"y":300,"wires":[["e7635576.e42fa8"],[],[]]},{"id":"99cde72c.0e9668","type":"inject","z":"bc28262d.7e0fb","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":510,"y":680,"wires":[["8b8c888f.f3f548"]]},{"id":"5fdcc5ac.b532a4","type":"ui_template","z":"f5c189e4.4369e8","group":"76ec5afa.44f88c","name":"Power","order":1,"width":"3","height":"3","format":"<!DOCTYPE html>\n<html>\n<head>\n<script type=\"text/javascript\">\n/*\n\tcircleDonutChart - (c) by Valerio Neri - 2013\n\tVersion 1.93\n\t\n\tUsage:\n\tcreate a new chart:\n\t\tvar newChart = new circleDonutChart(targetElementID);\n\t\tnewChart.draw(options);\n\tclear / reset the chart:\n\t\tnewChart.clear();\n\t\t\n\tdelete the chart:\n\t\tnewChart.delete();\n\t\t\n\treload the chart:\n\t\tnewChart.reload();\n\t\t\n\toptions = {...}\n\t\n\tPossible options:\n\t\n\tstart\t\t\t\t\tstarting value, ignored if chart already has a status\n\tend\t\t\t \t\t\tending value [mandatory]\n\touterCircleColor\t\tovverrides the color of outer circle\n\tinnerCircleColor\t\tovverrides the color of inner circle\n\ttextColor\t\t\t\tovverrides the color of text\n\tanimationSpeed = 0\t\tno Animation\n\tanimationSpeed = 1\t\tnormal speed\n\tscaling\t\t\t\t\tscaling value, 1 for normal\n\tsize\t\t\t\t\tin px, the size of the chart\n\tgetValue()\t\t\t\tgets actual value\n\tsetValue()\t\t\t\tsets a value without animation\n\tunitText\t\t\t\tsets the unit for the shown number\n\tmaxValue\t\t\t\toptional parameter that overrides 100% with a maximal Value\n\ttitleText\t\t\t\tA title for the Chart (<12 chars for inner-bottom and inner-top readibility)\n\ttitlePosition\t\t\twhere the title gets displayed, [\"outer-bottom\" | \"outer-top\" | \"inner-bottom\" | \"inner-top\"]\n\ttitleColor\t\t\t\tovverrides the standard colors for the title\n\t\t\t\n*/\n\t\t\t\n\nvar circleDonutChart = function(chartElementID){\n\tvar centerx = 0;\n\tvar centery = 0;\n\tvar offsetx = 0;\n\tvar offsety = 14;\n\tvar sizex = 0;\n\tvar sizey = 0;\n\tvar scaling = 0;\n\tvar radius = 0;\n\tvar startx = 0;\n\tvar starty = 0;\n\tvar endx = 0;\n\tvar endy = 0;\n\tvar animationSpeed = 1;\n\tvar firedAnimation = false;\n\tvar innerCircleColor = \"#666666\";\n\tvar outerCircleColor = \"#aade87\";\n\tvar textColor = \"#ffffff\";\n\tvar unitText = \"%\";\n\tvar innerCircleDOM = undefined;\n\tvar outerCircleDOM = undefined;\n\tvar tNumberDOM = undefined;\n\tvar textDOM = undefined;\n\tvar tUnitDOM = undefined;\n\tvar titleDOM = undefined;\n\tvar svg = undefined;\n\tvar chartID = chartElementID;\n\tvar chart = undefined;\n\tvar lastValue = -1;\n\tvar startValue = 0;\n\tvar endValue = 0;\n\tvar loaded = false;\n\tvar that=this;\n\tvar maxValue = 100;\n\tvar titleText =\"\";\n\tvar titlePosition = \"top\";\n\tvar titleColor = \"#ffffff\";\n\tvar textShift = 20; // this is required for moving the chart\n\tvar textScaling = 1;\n\n\t// update: unfortunately in some cases the event is fired, and nobody tells us - that's why we just wait for the element to be available\n\t// wait for the DOM, otherwise you won't find the reference to elements\n\t//document.addEventListener(\"DOMContentLoaded\", onLoad);\n\tonLoad();\n\t\n\t// this is used for refreshing the animation\n\t(function() {\n\t\tvar requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame || window.msRequestAnimationFrame;\n\t\twindow.requestAnimationFrame = requestAnimationFrame;\n\t})();\n\n\tthis.getValue = function(){\n\t\tif (lastValue>-1)\n\t\t\treturn Math.round(lastValue/360*maxValue*10)/10;\n\t\telse\n\t\t\treturn 0;\n\t}\n\t\n\tthis.setValue = function(value){\n\t\tthat.draw({end:value, animationSpeed:0});\n\t}\n\t\n\tfunction setAnimate(fromD, toD, duration){\n\t\tdAct = fromD;\n\t\t// determine direction (up or down)\n\t\tif (dAct<toD)\n\t\t\tdoIt(dAct, toD, duration, \"up\");\n\t\telse\n\t\t\tdoIt(dAct, toD, duration, \"down\");\n\t}\t\n\n\t// this function is used for the animation - it uses an exponential acceleration\n\tfunction calculateAccValue(xx, m){\n\t\tvar mxValue = m;\n\t\tvar x=Math.round(xx);\n\t\tif (m==0){\n\t\t\tmxValue=1;\n\t\t}\n\t\tif (x==0){\n\t\t\tx=1;\n\t\t}\n\t\tif (Math.abs(x)>=mxValue){\n\t\t\treturn mxValue;\n\t\t}else{\n\t\t\t//return ( Math.pow( (-2),( (-1*x) + (Math.log(maxValue)/Math.log(2)) ) ) + maxValue);\n\t\t\tvar num1 = -2;\n\t\t\tvar num2 = Math.round( ((-1*x)+(Math.log(mxValue)/Math.log(2))) );\n\t\t\treturn Math.pow(num1 , num2 )+mxValue;\n\t\t}\n\t}\n\n\tfunction textSetter(DOM, text){\n\t\t// text scaling\n\t\tif ((text>=1000)&&(textScaling=1)){\n\t\t\ttextScaling=1-((Math.floor( (Math.log(text)/Math.log(10))-2))/10)-0.1;\n\t\t\ttNumberDOM.setAttribute('font-size', 50*scaling*textScaling);\n\t\t\ttUnitDOM.setAttribute('font-size', 30*scaling*textScaling);\n\t\t} else{\n\t\t\ttextScaling = 1;\n\t\t\ttNumberDOM.setAttribute('font-size', 50*scaling*textScaling);\n\t\t\ttUnitDOM.setAttribute('font-size', 30*scaling*textScaling);\n\t\t}\t\n\t\tDOM.textContent = text;\n\t}\n\t\n\tfunction doIt(dAct, toD, duration, direction){\n\t\tvar toString = \"\";\n\t\t// -0.0001 is used for preventing IE reach 360 and close the circle\n\t\ttoString = getD(dAct-0.0001);\n\t\touterCircleDOM.setAttribute('d',toString);\n\t\t\n\t\ttextSetter(tNumberDOM, Math.round(dAct/360*maxValue*10)/10);\n\t\t\n\t\t//console.log('dAct '+dAct+ ' toD'+toD);\n\t\t// determine direction (up or down)\n\t\tif (direction==\"up\")\n\t\t\tdAct = dAct + 5.5;\n\t\telse\n\t\t\tdAct = dAct - 5.5;\n\t\t\t\n\t\tduration = duration - calculateAccValue(duration, 500);\n\t\tif (direction==\"up\"){\n\t\t\tif (dAct < toD){\n\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t// animate it according to refresh rate\n\t\t\t\t\trequestAnimationFrame(function(){\n\t\t\t\t\t\tdoIt(dAct, toD, duration, direction);\n\t\t\t\t\t})\n\t\t\t\t},duration);\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\touterCircleDOM.setAttribute('d',getD((toD-0.0001)));\n\t\t\t\ttextSetter(tNumberDOM, Math.round(toD/360*maxValue*10)/10);\n\t\t\t}\n\t\t} else {\n\t\t\tif (dAct >= toD){\n\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t// animate it according to refresh rate\n\t\t\t\t\trequestAnimationFrame(function(){\n\t\t\t\t\t\tdoIt(dAct, toD, duration, direction);\n\t\t\t\t\t})\n\t\t\t\t},duration);\n\t\t\t} else {\n\t\t\t\touterCircleDOM.setAttribute('d',getD(toD-0.0001));\n\t\t\t\ttextSetter(tNumberDOM ,Math.round(toD/360*maxValue*10)/10);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\n\t// this function gives us the circle coordinates\n\tfunction getCoordinates(radius,offset,degrees){\n\t\tvar radians = degreesToRadians(degrees);\n\t\tvar x = offset.x + radius * Math.cos(radians)\n\t\tvar y = offset.y + radius * Math.sin(radians)\n\t\treturn {x:x,y:y};\n\t};\n\t\n\t// small converstion beween degrees and radians\n\tfunction degreesToRadians(degrees){\n\t\tvar radians = (degrees * Math.PI) / 180;\n\t\treturn radians\n\t};\n\n\t// this function returns the \"d\" string for the path, according to the degrees\n\tfunction getD(degree){\n\t\tradius = 100*scaling;\n\t\tstartx = centerx+radius;\n\t\tstarty = centery;\n\t\tvar coor = getCoordinates(radius, {x:startx,y:starty},degree);\n\t\tendx = coor.x;\n\t\tendy = coor.y;\n\t\tvar largearc = 0;\n\t\tif (degree>180){\n\t\t\tlargearc=1;\n\t\t} else {\n\t\t\tlargearc=0;\n\t\t}\n\t\t// don't ask me how I did it folks\n\t\td=\"M \"+startx+\" \"+starty+\" a \"+radius+\" \"+radius+\" 0 \"+largearc+\" 1 \"+(endx-startx-radius)+\" \"+(endy-starty)+\" L \"+(centerx)+\" \"+(centery)+\" Z\";\n\t\t//console.log('GETd '+degree+ \" \"+d);\n\t\treturn d;\n\t}\n\n\t// this function checks, if an element is fully visible (according to the scrolling)\n\tfunction checkVisible(){\n\t\tif (firedAnimation){\n\t\t\t// animation has already fired, detach the event listeners\n\t\t\tdocument.removeEventListener(\"scroll\", checkVisible, false);\n\t\t\twindow.removeEventListener(\"resize\", checkVisible, false);\n\t\t\treturn;\n\t\t}\n\t\tvar rect = chart.getBoundingClientRect();\n\t\tvar top = window.pageYOffset || document.documentElement.scrollTop;\n\t\tvar left = window.pageXOffset || document.documentElement.scrollLeft;\n\n\t\tif ((rect.top>=0)&&(rect.top+rect.height<window.innerHeight) && \n\t\t\t(rect.left>=0)&&(rect.left+rect.width<window.innerWidth)){\n\t\t\t// this means that we fully see the chart\n\t\t\t// fire the animation (only once)\n\t\t\tfiredAnimation = true;\n\t\t\tsetAnimate(startValue, endValue, (500/animationSpeed));\t\t\t\t\t\n\t\t}\n\t}\n\t\n\tvar waitingLoad =0;\n\t\n\tfunction onLoad(){\n\t\t// get the container for the chart\n\t\tchart = document.getElementById(chartID);\n\t\t\n\t\t// if the container is not ready in the DOM, then retry\n\t\t// try for around 20secs, then throw an exception\n\t\tif (chart==null){\n\t\t\t\n\t\t\t// after 10 seconds, pause a little bit\n\t\t\tif ((waitingLoad > 10000)&&(waitingLoad<20000)){\n\t\t\t\tsetTimeout(onLoad, 1000);\n\t\t\t\twaitingLoad = waitingLoad +1000;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (waitingLoad > 20000){\n\t\t\t\tthrow('circleDonutChart: onLoad() - The chart element \"'+chartID+'\" could not be loaded in the last 20 seconds');\n\t\t\t}\n\t\t\tsetTimeout(onLoad, 500);\n\t\t\twaitingLoad = waitingLoad +500;\n\t\t\treturn;\n\t\t}\n\t\t// create an svg object and all other things - thanks to Thoka\n\t\tsvg = document.createElementNS('http://www.w3.org/2000/svg','svg');\n\t\tinnerCircleDOM = document.createElementNS('http://www.w3.org/2000/svg','circle');\n\t\touterCircleDOM = document.createElementNS('http://www.w3.org/2000/svg','path');\n\t\ttextDOM = document.createElementNS('http://www.w3.org/2000/svg','text');\n\t\ttNumberDOM = document.createElementNS('http://www.w3.org/2000/svg','tspan');\n\t\ttUnitDOM = document.createElementNS('http://www.w3.org/2000/svg','tspan');\n\t\ttitleDOM = document.createElementNS('http://www.w3.org/2000/svg','text');\n\t\t\n\t\t// append to the chart\n\t\tchart.appendChild(svg);\n\t\tsvg.appendChild(outerCircleDOM);\n\t\tsvg.appendChild(innerCircleDOM);\n\t\tsvg.appendChild(textDOM);\n\t\tsvg.appendChild(titleDOM);\n\t\t\n\t\ttextDOM.appendChild(tNumberDOM);\n\t\ttextDOM.appendChild(tUnitDOM);\n\t\tloaded = true;\n\t}\n\t\n\tthis.reload = function(){\n\t\tif (!loaded)\n\t\t\tonLoad();\n\t}\n\t\n\tthis.clear = function(){\n\t\t// reinitialize some parameters\n\t\tfiredAnimation = false;\n\t\tanimationSpeed = 1;\n\t\tmaxValue = 100;\n\t\tunitText = \"%\";\n\t\tlastValue = -1;\n\t\tthis.setValue(0);\n\t}\n\t\n\tthis.delete = function(){\n\t\t// remove everything\n\t\tthis.clear();\n\t\ttextDOM.removeChild(tNumberDOM);\n\t\ttextDOM.removeChild(tUnitDOM);\n\t\tsvg.removeChild(textDOM);\n\t\tsvg.removeChild(titleDOM);\n\t\tsvg.removeChild(outerCircleDOM);\n\t\tsvg.removeChild(innerCircleDOM);\n\t\tchart.removeChild(svg);\n\t\tloaded = false;\n\t\t// yes but we leave chart, because it was provided\n\t}\n\t\n\tthis.draw = function(options){\n\t\t// check if main function has already loaded, if not, reiterate\n\t\tif (!loaded){\n\t\t\tsetTimeout(function(){\n\t\t\t\tthat.draw(options);\n\t\t\t}, 500);\n\t\t\treturn;\n\t\t}\n\n\t\t// OPTION CHECK - contains the options\n\t\t// check if all options are set\n\t\tvar oTester = [];\n\t\toTester.options = typeof(options)!=\"undefined\";\n\t\t\n\t\tif (! (oTester.options)){\n\t\t\tthrow('circleDonutChart: draw() - Not enough parameters or no parameters set in object');\n\t\t\treturn;\n\t\t}\n\t\t\n\t\toTester.end = typeof(options.end)!=\"undefined\";\n\t\toTester.start = typeof(options.start)!=\"undefined\";\n\t\toTester.scaling = typeof(options.scaling)!=\"undefined\";\n\t\toTester.size = typeof(options.size)!=\"undefined\";\n\t\toTester.animationSpeed = typeof(options.animationSpeed)!=\"undefined\";\n\t\toTester.textColor = typeof(options.textColor)!=\"undefined\";\n\t\toTester.innerCircleColor = typeof(options.innerCircleColor)!=\"undefined\";\n\t\toTester.outerCircleColor = typeof(options.outerCircleColor)!=\"undefined\";\n\t\toTester.unitText = typeof(options.unitText)!=\"undefined\";\n\t\toTester.maxValue = typeof(options.maxValue)!=\"undefined\";\n\t\toTester.titleText = typeof(options.titleText)!=\"undefined\";\n\t\toTester.titleColor = typeof(options.titleColor)!=\"undefined\";\n\t\toTester.titlePosition = typeof(options.titlePosition)!=\"undefined\";\n\t\t\n\t\tif (! (oTester.end)){\n\t\t\tthrow('circleDonutChart: draw() - No \"end\" value specified');\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// reinitialize some parameters\n\t\tfiredAnimation = false;\n\t\tanimationSpeed = 1;\n\t\tmaxValue = 100;\n\t\tunitText = \"%\";\n\t\ttextShift = 20;\n\t\ttextScaling = 1;\n\t\t\n\t\t// if the values are not set, set the standard\n\t\tif (!oTester.size){\n\t\t\toptions.size = 200;\n\t\t}\n\t\t\n\t\tif (!oTester.scaling){\n\t\t\toptions.scaling = 1;\n\t\t}\n\t\t\n\t\t// if size ist not set, then take the options.scaling and the standard size of 200x200\n\t\tif (!oTester.size){\n\t\t\tsvg.setAttribute('width', 200*options.scaling);\n\t\t\tsvg.setAttribute('height', 200*options.scaling);\n\t\t\toptions.size = 200*options.scaling;\n\t\t}\n\t\t// if scaling not set, then take the size anc calculate the options.scaling\n\t\tif (!oTester.scaling){\n\t\t\tsvg.setAttribute('width', options.size);\n\t\t\tsvg.setAttribute('height', options.size);\n\t\t\tif (svg.getAttribute('width')<svg.getAttribute('height')){\n\t\t\t\toptions.scaling = svg.getAttribute('width') / 200;\n\t\t\t} else{\n\t\t\t\toptions.scaling = svg.getAttribute('height') / 200;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// set the colors, if set\n\t\tif (oTester.outerCircleColor){\n\t\t\touterCircleColor = options.outerCircleColor;\n\t\t}\n\t\tif (oTester.innerCircleColor){\n\t\t\tinnerCircleColor = options.innerCircleColor;\n\t\t}\n\t\tif (oTester.textColor){\n\t\t\ttextColor = options.textColor;\n\t\t}\n\t\t\n\t\t// set the unitText, if set\n\t\tif (oTester.unitText){\n\t\t\tunitText = options.unitText;\n\t\t}\n\t\t\n\t\t// set the title, if set\n\t\tif (oTester.titleText){\n\t\t\ttitleText = options.titleText;\n\t\t}\n\t\tif (oTester.titleColor){\n\t\t\ttitleColor = options.titleColor;\n\t\t}\n\t\tif (oTester.titlePosition){\n\t\t\ttitlePosition = options.titlePosition;\n\t\t}\t\t\n\t\t\n\t\t\n\t\t// set the maxValue, if set\n\t\tif (oTester.maxValue){\n\t\t\tmaxValue = options.maxValue;\n\t\t}\n\n\t\t// set the starting position, if set\n\t\tif (oTester.start){\n\t\t\toptions.start = Math.round(parseFloat(options.start)*10)/10;\n\t\t\tif (options.start>maxValue)\n\t\t\t\toptions.start = maxValue;\n\t\t\tif (options.start<0)\n\t\t\t\toptions.start = 0;\n\t\t\tif (isNaN(options.start)){\n\t\t\t\t// not a number and not parseable, ignore\n\t\t\t\toptions.start = 0;\n\t\t\t\toTester.start = false;\n\t\t\t}\n\t\t\tstartValue = options.start/maxValue*360;\n\t\t}\n\t\t\n\t\toptions.end = Math.round(parseFloat(options.end)*10)/10;\n\n\t\tif (options.end>maxValue)\n\t\t\toptions.end = maxValue;\n\t\tif (options.end<0)\n\t\t\toptions.end = 0;\n\t\t\n\t\tif (isNaN(options.end)){\n\t\t\t// not a number and not parseable, ignore\n\t\t\treturn;\n\t\t}\n\t\t\n\t\toptions.end = options.end/maxValue*360;\n\t\tendValue = options.end;\n\t\t\n\t\ttextShift = textShift*options.scaling;\n\t\t\n\t\t// set the size and the center\n\t\tsizex = options.size;\n\t\tsizey = options.size+2*textShift;\n\t\tcenterx = (sizex/2)-offsetx;\n\t\tcentery = (sizey/2)-offsety;\n\t\tscaling = options.scaling;\n\t\t\n\t\t// set animation speed (0 = no animation), standard is one\n\t\tif(oTester.animationSpeed){\n\t\t\tanimationSpeed = options.animationSpeed;\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t// initialise with start position\n\t\touterCircleDOM.setAttribute('d', getD(startValue));\n\t\t\n\t\tchart.style.width = sizex;\n\t\tchart.style.height = sizey;\n\t\t\n\t\tsvg.setAttribute('height', sizey);\n\t\tsvg.setAttribute('class', 'circleDonutChart');\n\t\tsvg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n\t\tsvg.setAttribute('version', '1.1');\n\n\t\tinnerCircleDOM.setAttribute('cx', centerx);\n\t\tinnerCircleDOM.setAttribute('cy', centery);\n\t\tinnerCircleDOM.setAttribute('r', 80*options.scaling);\n\t\tinnerCircleDOM.setAttribute('stroke', 'none');\n\t\tinnerCircleDOM.setAttribute('stroke-width', '2');\n\t\tinnerCircleDOM.setAttribute('fill', innerCircleColor);\n\n\t\touterCircleDOM.setAttribute('fill', outerCircleColor);\n\t\touterCircleDOM.setAttribute('stroke', 'none');\n\t\touterCircleDOM.setAttribute('stroke-width', '36');\n\t\t\n\t\ttNumberDOM.setAttribute('x', centerx);\n\t\ttNumberDOM.setAttribute('y', centery+Math.round(18.75*options.scaling));\n\t\ttNumberDOM.setAttribute('font-size', 50*options.scaling);\n\t\ttNumberDOM.setAttribute('fill', textColor);\n\t\ttNumberDOM.setAttribute('font-family', 'helvetica');\n\t\ttNumberDOM.setAttribute('font-weight', 'normal');\n\t\ttNumberDOM.setAttribute('text-anchor', 'middle');\n\t\t\n\t\ttUnitDOM.setAttribute('font-size', 30*options.scaling);\n\t\ttUnitDOM.textContent = unitText;\n\t\ttUnitDOM.setAttribute('fill', textColor);\n\t\ttUnitDOM.setAttribute('text-anchor', 'middle');\n\t\ttUnitDOM.setAttribute('font-family', 'helvetica');\n\t\ttUnitDOM.setAttribute('font-weight', 'normal');\n\t\t\n\t\ttitleDOM.setAttribute('x', centerx);\n\t\t// set the position of the title\n\t\tswitch(titlePosition){\n\t\t\tcase \"inner-bottom\":\n\t\t\t\tif (!oTester.titleColor)\n\t\t\t\t\ttitleColor = \"#ffffff\";\n\t\t\t\ttitleDOM.setAttribute('y', centery+sizey/5+textShift/2);\n\t\t\t\tbreak;\n\n\t\t\t\tcase \"outer-bottom\":\n\t\t\t\tif (!oTester.titleColor)\n\t\t\t\t\ttitleColor = \"#666666\";\n\t\t\t\t\n\t\t\t\ttitleDOM.setAttribute('y', sizey-textShift/2);\n\t\t\t\tbreak;\n\n\t\t\tcase \"inner-top\":\n\t\t\t\tif (!oTester.titleColor)\n\t\t\t\t\ttitleColor = \"#ffffff\";\n\t\t\t\ttitleDOM.setAttribute('y', centery-sizey/5-textShift/2);\n\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\tcase \"outer-top\":\n\t\t\t\tif (!oTester.titleColor)\n\t\t\t\t\ttitleColor = \"#666666\";\n\t\t\t\t\n\t\t\t\ttitleDOM.setAttribute('y', textShift/2);\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\ttitleDOM.setAttribute('font-size', 24*options.scaling);\n\t\ttitleDOM.setAttribute('fill', titleColor);\n\t\ttitleDOM.setAttribute('font-family', 'helvetica');\n\t\ttitleDOM.setAttribute('font-weight', 'normal');\n\t\ttitleDOM.setAttribute('text-anchor', 'middle');\n\t\ttitleDOM.textContent = titleText;\n\t\t\n\t\t\n\t\t// if the animation has been chosen\n\t\tif (animationSpeed>0){\n\t\t\t// ignore start value if lastvalue is already set\n\t\t\tif (lastValue>-1){\n\t\t\t\tstartValue = lastValue;\n\t\t\t}\n\t\t\twindow.addEventListener(\"resize\", checkVisible, false);\n\t\t\tdocument.addEventListener(\"scroll\", checkVisible, false);\n\t\t\ttNumberDOM.textContent = Math.round(startValue/360*maxValue*10)/10;\n\t\t\tcheckVisible();\n\t\t} else {\n\t\t\t// set the circle to the end position, without animation\n\t\t\t// the 0.0001 is for avoiding the circle to disappear, due to some browser\n\t\t\touterCircleDOM.setAttribute('d', getD(options.end-0.0001));\n\t\t\ttNumberDOM.textContent = Math.round(options.end/360*maxValue*10)/10;\n\t\t}\n\t\tlastValue = endValue;\n\t}\n} \n</script>\n<script>\n (function(scope) {\n scope.$watch('msg.payload', function(data) {\n if (data){\n circle1.draw( {scaling:0.7, unitText: \"\", maxValue:8000, titlePosition:\"inner-bottom\", end:data} );\n }\n });\n })(scope);\n</script>\n \n<script type=\"text/javascript\">\n var circle1 = new circleDonutChart('Power');\n circle1.draw({scaling:0.7, unitText: \"\", end:0,start:0, maxValue:8000, titlePosition:\"inner-bottom\", titleText:\"Watts\", outerCircleColor:'#178BCA', innerCircleColor:'#909081'});\n</script>\n</head>\n<body>\n <svg id=\"Power\"></svg>\n</body>\n</html>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":1670,"y":400,"wires":[[]]},{"id":"d3eeb652.f5ba38","type":"ui_template","z":"f5c189e4.4369e8","group":"a9de599b.28e13","name":"Flow","order":1,"width":"3","height":"3","format":"<!DOCTYPE html>\n<html>\n<head>\n<script type=\"text/javascript\">\n/*\n\tcircleDonutChart - (c) by Valerio Neri - 2013\n\tVersion 1.93\n\t\n\tUsage:\n\tcreate a new chart:\n\t\tvar newChart = new circleDonutChart(targetElementID);\n\t\tnewChart.draw(options);\n\tclear / reset the chart:\n\t\tnewChart.clear();\n\t\t\n\tdelete the chart:\n\t\tnewChart.delete();\n\t\t\n\treload the chart:\n\t\tnewChart.reload();\n\t\t\n\toptions = {...}\n\t\n\tPossible options:\n\t\n\tstart\t\t\t\t\tstarting value, ignored if chart already has a status\n\tend\t\t\t \t\t\tending value [mandatory]\n\touterCircleColor\t\tovverrides the color of outer circle\n\tinnerCircleColor\t\tovverrides the color of inner circle\n\ttextColor\t\t\t\tovverrides the color of text\n\tanimationSpeed = 0\t\tno Animation\n\tanimationSpeed = 1\t\tnormal speed\n\tscaling\t\t\t\t\tscaling value, 1 for normal\n\tsize\t\t\t\t\tin px, the size of the chart\n\tgetValue()\t\t\t\tgets actual value\n\tsetValue()\t\t\t\tsets a value without animation\n\tunitText\t\t\t\tsets the unit for the shown number\n\tmaxValue\t\t\t\toptional parameter that overrides 100% with a maximal Value\n\ttitleText\t\t\t\tA title for the Chart (<12 chars for inner-bottom and inner-top readibility)\n\ttitlePosition\t\t\twhere the title gets displayed, [\"outer-bottom\" | \"outer-top\" | \"inner-bottom\" | \"inner-top\"]\n\ttitleColor\t\t\t\tovverrides the standard colors for the title\n\t\t\t\n*/\n\t\t\t\n\nvar circleDonutChart = function(chartElementID){\n\tvar centerx = 0;\n\tvar centery = 0;\n\tvar offsetx = 0;\n\tvar offsety = 14;\n\tvar sizex = 0;\n\tvar sizey = 0;\n\tvar scaling = 0;\n\tvar radius = 0;\n\tvar startx = 0;\n\tvar starty = 0;\n\tvar endx = 0;\n\tvar endy = 0;\n\tvar animationSpeed = 1;\n\tvar firedAnimation = false;\n\tvar innerCircleColor = \"#666666\";\n\tvar outerCircleColor = \"#aade87\";\n\tvar textColor = \"#ffffff\";\n\tvar unitText = \"%\";\n\tvar innerCircleDOM = undefined;\n\tvar outerCircleDOM = undefined;\n\tvar tNumberDOM = undefined;\n\tvar textDOM = undefined;\n\tvar tUnitDOM = undefined;\n\tvar titleDOM = undefined;\n\tvar svg = undefined;\n\tvar chartID = chartElementID;\n\tvar chart = undefined;\n\tvar lastValue = -1;\n\tvar startValue = 0;\n\tvar endValue = 0;\n\tvar loaded = false;\n\tvar that=this;\n\tvar maxValue = 100;\n\tvar titleText =\"\";\n\tvar titlePosition = \"top\";\n\tvar titleColor = \"#ffffff\";\n\tvar textShift = 20; // this is required for moving the chart\n\tvar textScaling = 1;\n\n\t// update: unfortunately in some cases the event is fired, and nobody tells us - that's why we just wait for the element to be available\n\t// wait for the DOM, otherwise you won't find the reference to elements\n\t//document.addEventListener(\"DOMContentLoaded\", onLoad);\n\tonLoad();\n\t\n\t// this is used for refreshing the animation\n\t(function() {\n\t\tvar requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame || window.msRequestAnimationFrame;\n\t\twindow.requestAnimationFrame = requestAnimationFrame;\n\t})();\n\n\tthis.getValue = function(){\n\t\tif (lastValue>-1)\n\t\t\treturn Math.round(lastValue/360*maxValue*10)/10;\n\t\telse\n\t\t\treturn 0;\n\t}\n\t\n\tthis.setValue = function(value){\n\t\tthat.draw({end:value, animationSpeed:0});\n\t}\n\t\n\tfunction setAnimate(fromD, toD, duration){\n\t\tdAct = fromD;\n\t\t// determine direction (up or down)\n\t\tif (dAct<toD)\n\t\t\tdoIt(dAct, toD, duration, \"up\");\n\t\telse\n\t\t\tdoIt(dAct, toD, duration, \"down\");\n\t}\t\n\n\t// this function is used for the animation - it uses an exponential acceleration\n\tfunction calculateAccValue(xx, m){\n\t\tvar mxValue = m;\n\t\tvar x=Math.round(xx);\n\t\tif (m==0){\n\t\t\tmxValue=1;\n\t\t}\n\t\tif (x==0){\n\t\t\tx=1;\n\t\t}\n\t\tif (Math.abs(x)>=mxValue){\n\t\t\treturn mxValue;\n\t\t}else{\n\t\t\t//return ( Math.pow( (-2),( (-1*x) + (Math.log(maxValue)/Math.log(2)) ) ) + maxValue);\n\t\t\tvar num1 = -2;\n\t\t\tvar num2 = Math.round( ((-1*x)+(Math.log(mxValue)/Math.log(2))) );\n\t\t\treturn Math.pow(num1 , num2 )+mxValue;\n\t\t}\n\t}\n\n\tfunction textSetter(DOM, text){\n\t\t// text scaling\n\t\tif ((text>=1000)&&(textScaling=1)){\n\t\t\ttextScaling=1-((Math.floor( (Math.log(text)/Math.log(10))-2))/10)-0.1;\n\t\t\ttNumberDOM.setAttribute('font-size', 50*scaling*textScaling);\n\t\t\ttUnitDOM.setAttribute('font-size', 30*scaling*textScaling);\n\t\t} else{\n\t\t\ttextScaling = 1;\n\t\t\ttNumberDOM.setAttribute('font-size', 50*scaling*textScaling);\n\t\t\ttUnitDOM.setAttribute('font-size', 30*scaling*textScaling);\n\t\t}\t\n\t\tDOM.textContent = text;\n\t}\n\t\n\tfunction doIt(dAct, toD, duration, direction){\n\t\tvar toString = \"\";\n\t\t// -0.0001 is used for preventing IE reach 360 and close the circle\n\t\ttoString = getD(dAct-0.0001);\n\t\touterCircleDOM.setAttribute('d',toString);\n\t\t\n\t\ttextSetter(tNumberDOM, Math.round(dAct/360*maxValue*10)/10);\n\t\t\n\t\t//console.log('dAct '+dAct+ ' toD'+toD);\n\t\t// determine direction (up or down)\n\t\tif (direction==\"up\")\n\t\t\tdAct = dAct + 5.5;\n\t\telse\n\t\t\tdAct = dAct - 5.5;\n\t\t\t\n\t\tduration = duration - calculateAccValue(duration, 500);\n\t\tif (direction==\"up\"){\n\t\t\tif (dAct < toD){\n\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t// animate it according to refresh rate\n\t\t\t\t\trequestAnimationFrame(function(){\n\t\t\t\t\t\tdoIt(dAct, toD, duration, direction);\n\t\t\t\t\t})\n\t\t\t\t},duration);\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\touterCircleDOM.setAttribute('d',getD((toD-0.0001)));\n\t\t\t\ttextSetter(tNumberDOM, Math.round(toD/360*maxValue*10)/10);\n\t\t\t}\n\t\t} else {\n\t\t\tif (dAct >= toD){\n\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t// animate it according to refresh rate\n\t\t\t\t\trequestAnimationFrame(function(){\n\t\t\t\t\t\tdoIt(dAct, toD, duration, direction);\n\t\t\t\t\t})\n\t\t\t\t},duration);\n\t\t\t} else {\n\t\t\t\touterCircleDOM.setAttribute('d',getD(toD-0.0001));\n\t\t\t\ttextSetter(tNumberDOM ,Math.round(toD/360*maxValue*10)/10);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\n\t// this function gives us the circle coordinates\n\tfunction getCoordinates(radius,offset,degrees){\n\t\tvar radians = degreesToRadians(degrees);\n\t\tvar x = offset.x + radius * Math.cos(radians)\n\t\tvar y = offset.y + radius * Math.sin(radians)\n\t\treturn {x:x,y:y};\n\t};\n\t\n\t// small converstion beween degrees and radians\n\tfunction degreesToRadians(degrees){\n\t\tvar radians = (degrees * Math.PI) / 180;\n\t\treturn radians\n\t};\n\n\t// this function returns the \"d\" string for the path, according to the degrees\n\tfunction getD(degree){\n\t\tradius = 100*scaling;\n\t\tstartx = centerx+radius;\n\t\tstarty = centery;\n\t\tvar coor = getCoordinates(radius, {x:startx,y:starty},degree);\n\t\tendx = coor.x;\n\t\tendy = coor.y;\n\t\tvar largearc = 0;\n\t\tif (degree>180){\n\t\t\tlargearc=1;\n\t\t} else {\n\t\t\tlargearc=0;\n\t\t}\n\t\t// don't ask me how I did it folks\n\t\td=\"M \"+startx+\" \"+starty+\" a \"+radius+\" \"+radius+\" 0 \"+largearc+\" 1 \"+(endx-startx-radius)+\" \"+(endy-starty)+\" L \"+(centerx)+\" \"+(centery)+\" Z\";\n\t\t//console.log('GETd '+degree+ \" \"+d);\n\t\treturn d;\n\t}\n\n\t// this function checks, if an element is fully visible (according to the scrolling)\n\tfunction checkVisible(){\n\t\tif (firedAnimation){\n\t\t\t// animation has already fired, detach the event listeners\n\t\t\tdocument.removeEventListener(\"scroll\", checkVisible, false);\n\t\t\twindow.removeEventListener(\"resize\", checkVisible, false);\n\t\t\treturn;\n\t\t}\n\t\tvar rect = chart.getBoundingClientRect();\n\t\tvar top = window.pageYOffset || document.documentElement.scrollTop;\n\t\tvar left = window.pageXOffset || document.documentElement.scrollLeft;\n\n\t\tif ((rect.top>=0)&&(rect.top+rect.height<window.innerHeight) && \n\t\t\t(rect.left>=0)&&(rect.left+rect.width<window.innerWidth)){\n\t\t\t// this means that we fully see the chart\n\t\t\t// fire the animation (only once)\n\t\t\tfiredAnimation = true;\n\t\t\tsetAnimate(startValue, endValue, (500/animationSpeed));\t\t\t\t\t\n\t\t}\n\t}\n\t\n\tvar waitingLoad =0;\n\t\n\tfunction onLoad(){\n\t\t// get the container for the chart\n\t\tchart = document.getElementById(chartID);\n\t\t\n\t\t// if the container is not ready in the DOM, then retry\n\t\t// try for around 20secs, then throw an exception\n\t\tif (chart==null){\n\t\t\t\n\t\t\t// after 10 seconds, pause a little bit\n\t\t\tif ((waitingLoad > 10000)&&(waitingLoad<20000)){\n\t\t\t\tsetTimeout(onLoad, 1000);\n\t\t\t\twaitingLoad = waitingLoad +1000;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (waitingLoad > 20000){\n\t\t\t\tthrow('circleDonutChart: onLoad() - The chart element \"'+chartID+'\" could not be loaded in the last 20 seconds');\n\t\t\t}\n\t\t\tsetTimeout(onLoad, 500);\n\t\t\twaitingLoad = waitingLoad +500;\n\t\t\treturn;\n\t\t}\n\t\t// create an svg object and all other things - thanks to Thoka\n\t\tsvg = document.createElementNS('http://www.w3.org/2000/svg','svg');\n\t\tinnerCircleDOM = document.createElementNS('http://www.w3.org/2000/svg','circle');\n\t\touterCircleDOM = document.createElementNS('http://www.w3.org/2000/svg','path');\n\t\ttextDOM = document.createElementNS('http://www.w3.org/2000/svg','text');\n\t\ttNumberDOM = document.createElementNS('http://www.w3.org/2000/svg','tspan');\n\t\ttUnitDOM = document.createElementNS('http://www.w3.org/2000/svg','tspan');\n\t\ttitleDOM = document.createElementNS('http://www.w3.org/2000/svg','text');\n\t\t\n\t\t// append to the chart\n\t\tchart.appendChild(svg);\n\t\tsvg.appendChild(outerCircleDOM);\n\t\tsvg.appendChild(innerCircleDOM);\n\t\tsvg.appendChild(textDOM);\n\t\tsvg.appendChild(titleDOM);\n\t\t\n\t\ttextDOM.appendChild(tNumberDOM);\n\t\ttextDOM.appendChild(tUnitDOM);\n\t\tloaded = true;\n\t}\n\t\n\tthis.reload = function(){\n\t\tif (!loaded)\n\t\t\tonLoad();\n\t}\n\t\n\tthis.clear = function(){\n\t\t// reinitialize some parameters\n\t\tfiredAnimation = false;\n\t\tanimationSpeed = 1;\n\t\tmaxValue = 100;\n\t\tunitText = \"%\";\n\t\tlastValue = -1;\n\t\tthis.setValue(0);\n\t}\n\t\n\tthis.delete = function(){\n\t\t// remove everything\n\t\tthis.clear();\n\t\ttextDOM.removeChild(tNumberDOM);\n\t\ttextDOM.removeChild(tUnitDOM);\n\t\tsvg.removeChild(textDOM);\n\t\tsvg.removeChild(titleDOM);\n\t\tsvg.removeChild(outerCircleDOM);\n\t\tsvg.removeChild(innerCircleDOM);\n\t\tchart.removeChild(svg);\n\t\tloaded = false;\n\t\t// yes but we leave chart, because it was provided\n\t}\n\t\n\tthis.draw = function(options){\n\t\t// check if main function has already loaded, if not, reiterate\n\t\tif (!loaded){\n\t\t\tsetTimeout(function(){\n\t\t\t\tthat.draw(options);\n\t\t\t}, 500);\n\t\t\treturn;\n\t\t}\n\n\t\t// OPTION CHECK - contains the options\n\t\t// check if all options are set\n\t\tvar oTester = [];\n\t\toTester.options = typeof(options)!=\"undefined\";\n\t\t\n\t\tif (! (oTester.options)){\n\t\t\tthrow('circleDonutChart: draw() - Not enough parameters or no parameters set in object');\n\t\t\treturn;\n\t\t}\n\t\t\n\t\toTester.end = typeof(options.end)!=\"undefined\";\n\t\toTester.start = typeof(options.start)!=\"undefined\";\n\t\toTester.scaling = typeof(options.scaling)!=\"undefined\";\n\t\toTester.size = typeof(options.size)!=\"undefined\";\n\t\toTester.animationSpeed = typeof(options.animationSpeed)!=\"undefined\";\n\t\toTester.textColor = typeof(options.textColor)!=\"undefined\";\n\t\toTester.innerCircleColor = typeof(options.innerCircleColor)!=\"undefined\";\n\t\toTester.outerCircleColor = typeof(options.outerCircleColor)!=\"undefined\";\n\t\toTester.unitText = typeof(options.unitText)!=\"undefined\";\n\t\toTester.maxValue = typeof(options.maxValue)!=\"undefined\";\n\t\toTester.titleText = typeof(options.titleText)!=\"undefined\";\n\t\toTester.titleColor = typeof(options.titleColor)!=\"undefined\";\n\t\toTester.titlePosition = typeof(options.titlePosition)!=\"undefined\";\n\t\t\n\t\tif (! (oTester.end)){\n\t\t\tthrow('circleDonutChart: draw() - No \"end\" value specified');\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// reinitialize some parameters\n\t\tfiredAnimation = false;\n\t\tanimationSpeed = 1;\n\t\tmaxValue = 100;\n\t\tunitText = \"%\";\n\t\ttextShift = 20;\n\t\ttextScaling = 1;\n\t\t\n\t\t// if the values are not set, set the standard\n\t\tif (!oTester.size){\n\t\t\toptions.size = 200;\n\t\t}\n\t\t\n\t\tif (!oTester.scaling){\n\t\t\toptions.scaling = 1;\n\t\t}\n\t\t\n\t\t// if size ist not set, then take the options.scaling and the standard size of 200x200\n\t\tif (!oTester.size){\n\t\t\tsvg.setAttribute('width', 200*options.scaling);\n\t\t\tsvg.setAttribute('height', 200*options.scaling);\n\t\t\toptions.size = 200*options.scaling;\n\t\t}\n\t\t// if scaling not set, then take the size anc calculate the options.scaling\n\t\tif (!oTester.scaling){\n\t\t\tsvg.setAttribute('width', options.size);\n\t\t\tsvg.setAttribute('height', options.size);\n\t\t\tif (svg.getAttribute('width')<svg.getAttribute('height')){\n\t\t\t\toptions.scaling = svg.getAttribute('width') / 200;\n\t\t\t} else{\n\t\t\t\toptions.scaling = svg.getAttribute('height') / 200;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// set the colors, if set\n\t\tif (oTester.outerCircleColor){\n\t\t\touterCircleColor = options.outerCircleColor;\n\t\t}\n\t\tif (oTester.innerCircleColor){\n\t\t\tinnerCircleColor = options.innerCircleColor;\n\t\t}\n\t\tif (oTester.textColor){\n\t\t\ttextColor = options.textColor;\n\t\t}\n\t\t\n\t\t// set the unitText, if set\n\t\tif (oTester.unitText){\n\t\t\tunitText = options.unitText;\n\t\t}\n\t\t\n\t\t// set the title, if set\n\t\tif (oTester.titleText){\n\t\t\ttitleText = options.titleText;\n\t\t}\n\t\tif (oTester.titleColor){\n\t\t\ttitleColor = options.titleColor;\n\t\t}\n\t\tif (oTester.titlePosition){\n\t\t\ttitlePosition = options.titlePosition;\n\t\t}\t\t\n\t\t\n\t\t\n\t\t// set the maxValue, if set\n\t\tif (oTester.maxValue){\n\t\t\tmaxValue = options.maxValue;\n\t\t}\n\n\t\t// set the starting position, if set\n\t\tif (oTester.start){\n\t\t\toptions.start = Math.round(parseFloat(options.start)*10)/10;\n\t\t\tif (options.start>maxValue)\n\t\t\t\toptions.start = maxValue;\n\t\t\tif (options.start<0)\n\t\t\t\toptions.start = 0;\n\t\t\tif (isNaN(options.start)){\n\t\t\t\t// not a number and not parseable, ignore\n\t\t\t\toptions.start = 0;\n\t\t\t\toTester.start = false;\n\t\t\t}\n\t\t\tstartValue = options.start/maxValue*360;\n\t\t}\n\t\t\n\t\toptions.end = Math.round(parseFloat(options.end)*10)/10;\n\n\t\tif (options.end>maxValue)\n\t\t\toptions.end = maxValue;\n\t\tif (options.end<0)\n\t\t\toptions.end = 0;\n\t\t\n\t\tif (isNaN(options.end)){\n\t\t\t// not a number and not parseable, ignore\n\t\t\treturn;\n\t\t}\n\t\t\n\t\toptions.end = options.end/maxValue*360;\n\t\tendValue = options.end;\n\t\t\n\t\ttextShift = textShift*options.scaling;\n\t\t\n\t\t// set the size and the center\n\t\tsizex = options.size;\n\t\tsizey = options.size+2*textShift;\n\t\tcenterx = (sizex/2)-offsetx;\n\t\tcentery = (sizey/2)-offsety;\n\t\tscaling = options.scaling;\n\t\t\n\t\t// set animation speed (0 = no animation), standard is one\n\t\tif(oTester.animationSpeed){\n\t\t\tanimationSpeed = options.animationSpeed;\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t// initialise with start position\n\t\touterCircleDOM.setAttribute('d', getD(startValue));\n\t\t\n\t\tchart.style.width = sizex;\n\t\tchart.style.height = sizey;\n\t\t\n\t\tsvg.setAttribute('height', sizey);\n\t\tsvg.setAttribute('class', 'circleDonutChart');\n\t\tsvg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n\t\tsvg.setAttribute('version', '1.1');\n\n\t\tinnerCircleDOM.setAttribute('cx', centerx);\n\t\tinnerCircleDOM.setAttribute('cy', centery);\n\t\tinnerCircleDOM.setAttribute('r', 80*options.scaling);\n\t\tinnerCircleDOM.setAttribute('stroke', 'none');\n\t\tinnerCircleDOM.setAttribute('stroke-width', '2');\n\t\tinnerCircleDOM.setAttribute('fill', innerCircleColor);\n\n\t\touterCircleDOM.setAttribute('fill', outerCircleColor);\n\t\touterCircleDOM.setAttribute('stroke', 'none');\n\t\touterCircleDOM.setAttribute('stroke-width', '36');\n\t\t\n\t\ttNumberDOM.setAttribute('x', centerx);\n\t\ttNumberDOM.setAttribute('y', centery+Math.round(18.75*options.scaling));\n\t\ttNumberDOM.setAttribute('font-size', 50*options.scaling);\n\t\ttNumberDOM.setAttribute('fill', textColor);\n\t\ttNumberDOM.setAttribute('font-family', 'helvetica');\n\t\ttNumberDOM.setAttribute('font-weight', 'normal');\n\t\ttNumberDOM.setAttribute('text-anchor', 'middle');\n\t\t\n\t\ttUnitDOM.setAttribute('font-size', 30*options.scaling);\n\t\ttUnitDOM.textContent = unitText;\n\t\ttUnitDOM.setAttribute('fill', textColor);\n\t\ttUnitDOM.setAttribute('text-anchor', 'middle');\n\t\ttUnitDOM.setAttribute('font-family', 'helvetica');\n\t\ttUnitDOM.setAttribute('font-weight', 'normal');\n\t\t\n\t\ttitleDOM.setAttribute('x', centerx);\n\t\t// set the position of the title\n\t\tswitch(titlePosition){\n\t\t\tcase \"inner-bottom\":\n\t\t\t\tif (!oTester.titleColor)\n\t\t\t\t\ttitleColor = \"#ffffff\";\n\t\t\t\ttitleDOM.setAttribute('y', centery+sizey/5+textShift/2);\n\t\t\t\tbreak;\n\n\t\t\t\tcase \"outer-bottom\":\n\t\t\t\tif (!oTester.titleColor)\n\t\t\t\t\ttitleColor = \"#666666\";\n\t\t\t\t\n\t\t\t\ttitleDOM.setAttribute('y', sizey-textShift/2);\n\t\t\t\tbreak;\n\n\t\t\tcase \"inner-top\":\n\t\t\t\tif (!oTester.titleColor)\n\t\t\t\t\ttitleColor = \"#ffffff\";\n\t\t\t\ttitleDOM.setAttribute('y', centery-sizey/5-textShift/2);\n\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\tcase \"outer-top\":\n\t\t\t\tif (!oTester.titleColor)\n\t\t\t\t\ttitleColor = \"#666666\";\n\t\t\t\t\n\t\t\t\ttitleDOM.setAttribute('y', textShift/2);\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\ttitleDOM.setAttribute('font-size', 24*options.scaling);\n\t\ttitleDOM.setAttribute('fill', titleColor);\n\t\ttitleDOM.setAttribute('font-family', 'helvetica');\n\t\ttitleDOM.setAttribute('font-weight', 'normal');\n\t\ttitleDOM.setAttribute('text-anchor', 'middle');\n\t\ttitleDOM.textContent = titleText;\n\t\t\n\t\t\n\t\t// if the animation has been chosen\n\t\tif (animationSpeed>0){\n\t\t\t// ignore start value if lastvalue is already set\n\t\t\tif (lastValue>-1){\n\t\t\t\tstartValue = lastValue;\n\t\t\t}\n\t\t\twindow.addEventListener(\"resize\", checkVisible, false);\n\t\t\tdocument.addEventListener(\"scroll\", checkVisible, false);\n\t\t\ttNumberDOM.textContent = Math.round(startValue/360*maxValue*10)/10;\n\t\t\tcheckVisible();\n\t\t} else {\n\t\t\t// set the circle to the end position, without animation\n\t\t\t// the 0.0001 is for avoiding the circle to disappear, due to some browser\n\t\t\touterCircleDOM.setAttribute('d', getD(options.end-0.0001));\n\t\t\ttNumberDOM.textContent = Math.round(options.end/360*maxValue*10)/10;\n\t\t}\n\t\tlastValue = endValue;\n\t}\n} \n</script>\n<script>\n (function(scope) {\n scope.$watch('msg.payload', function(data) {\n if (data>=0){\n circle2.draw( {scaling:0.7, unitText: \"\", maxValue:1350, titlePosition:\"inner-bottom\", end:data} );\n }\n });\n })(scope);\n</script>\n \n<script type=\"text/javascript\">\n var circle2 = new circleDonutChart('Flow');\n circle2.draw({scaling:0.7, unitText: \"\", end:0,start:0, maxValue:1350, titlePosition:\"inner-bottom\", titleText:\"Litros/h\", outerCircleColor:'#178BCA', innerCircleColor:'#909081'});\n</script>\n</head>\n<body>\n <svg id=\"Flow\"></svg>\n</body>\n</html>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":1430,"y":700,"wires":[[]]},{"id":"15de161b.cf9622","type":"alexa-home","z":"f5c189e4.4369e8","conf":"1e4de5f.63b119a","device":"17119","acknoledge":true,"name":"Side table switch","topic":"","x":400,"y":360,"wires":[["ddc7e505.85b6f8"]]},{"id":"ddc7e505.85b6f8","type":"function","z":"f5c189e4.4369e8","name":"On/Off","func":"var state = msg.payload;\n\nif (state===true){\n msg.payload = \"ON\";\n} else{\n msg.payload = \"OFF\";\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":570,"y":360,"wires":[["15aa4c88.0f85bb"]]},{"id":"673bdb66.c8236c","type":"inject","z":"30043e7f.63d8b2","name":"","topic":"","payload":"25","payloadType":"num","repeat":"5","crontab":"","once":false,"x":90,"y":300,"wires":[["7355b06e.42db6"]]},{"id":"7355b06e.42db6","type":"function","z":"30043e7f.63d8b2","name":"Set Temperature","func":"msg = {payload:{temperature: msg.payload}};\n\nreturn msg;","outputs":1,"noerr":0,"x":240,"y":300,"wires":[["c5d32bdf.441fb8"]]},{"id":"ea10721f.1fab5","type":"function","z":"30043e7f.63d8b2","name":"Set tgt temp","func":"\nif (msg.payload < 16 || msg.payload > 30) {\n var range = {\n min: 16,\n max: 30\n }\n msg.payload = false;\n msg.extra = range;\n \n} else {\n \n// global.set(\"target_temperature\", msg.payload);\n msg.topic = \"target_temperature\";\n msg.extra = {\n targetTemperature: {\n value: msg.payload\n }\n }\n msg.payload = true;\n}\n\nreturn msg;","outputs":"1","noerr":0,"x":550,"y":780,"wires":[["1c880af5.433b25","e2741abc.4cab"]]},{"id":"b5df297f.d7fc3","type":"switch","z":"30043e7f.63d8b2","name":"","property":"command","propertyType":"msg","rules":[{"t":"eq","v":"SetTargetTemperatureRequest","vt":"str"},{"t":"eq","v":"GetTemperatureReadingRequest","vt":"str"},{"t":"eq","v":"IncrementTargetTemperatureRequest","vt":"str"},{"t":"eq","v":"DecrementTargetTemperatureRequest","vt":"str"},{"t":"eq","v":"GetTargetTemperatureRequest","vt":"str"},{"t":"eq","v":"TurnOnRequest","vt":"str"},{"t":"eq","v":"TurnOffRequest","vt":"str"},{"t":"else"}],"checkall":"true","outputs":8,"x":330,"y":900,"wires":[["ea10721f.1fab5"],["e58a0d1d.9e786"],["77b3a3b6.06e554"],["8eb403d3.5cd87"],["c3cb9e0f.a0c78"],["617d8fa9.b04988"],["617d8fa9.b04988"],["da171798.5a1838"]]},{"id":"da171798.5a1838","type":"function","z":"30043e7f.63d8b2","name":"Otherwise","func":"msg.payload = false;\nreturn msg;","outputs":1,"noerr":0,"x":540,"y":1020,"wires":[["1c880af5.433b25"]]},{"id":"e58a0d1d.9e786","type":"function","z":"30043e7f.63d8b2","name":"Get cur temp","func":"var temperature = global.get(\"temperature\");\n\nmsg.extra = {\n \"temperatureReading\": {\n \"value\": temperature\n },\n \"applianceResponseTimestamp\": new Date().toISOString()\n};\nmsg.payload = true;\nreturn msg;","outputs":1,"noerr":0,"x":550,"y":820,"wires":[["1c880af5.433b25"]]},{"id":"77b3a3b6.06e554","type":"function","z":"30043e7f.63d8b2","name":"Inc tgt temp","func":"var current = global.get(\"target_temperature\");\n\nvar newtemp = current + msg.payload;\n\nif (newtemp < 16 || newtemp > 30) {\n var range = {\n min: 16,\n max: 30\n }\n msg.payload = false;\n msg.extra = range;\n} else {\n global.set(\"target_temperature\", newtemp);\n msg.payload = true;\n msg.extra = {\n targetTemperature: {\n value: newtemp\n }\n }\n}\nreturn msg;","outputs":1,"noerr":0,"x":550,"y":860,"wires":[["1c880af5.433b25"]]},{"id":"c3cb9e0f.a0c78","type":"function","z":"30043e7f.63d8b2","name":"Get tgt Temp","func":"var target_temperature = global.get(\"target_temperature\") || 22;\nmsg.extra = {\n \"targetTemperature\": {\n \"value\": target_temperature\n },\n \"applianceResponseTimestamp\": new Date().toISOString(),\n \"temperatureMode\": {\n \"value\": \"AUTO\"\n }\n};\nmsg.payload = true;\n\nreturn msg;","outputs":1,"noerr":0,"x":550,"y":940,"wires":[["1c880af5.433b25"]]},{"id":"213a34b4.0f8904","type":"alexa-home","z":"30043e7f.63d8b2","conf":"1e4de5f.63b119a","device":"17189","acknoledge":false,"name":"Living room","topic":"","x":170,"y":900,"wires":[["b5df297f.d7fc3"]]},{"id":"1c880af5.433b25","type":"alexa-home-resp","z":"30043e7f.63d8b2","x":840,"y":900,"wires":[]},{"id":"8eb403d3.5cd87","type":"function","z":"30043e7f.63d8b2","name":"Dec tgt temp","func":"var current = global.get(\"target_temperature\");\n\nvar newtemp = current + msg.payload;\n\nif (newtemp < 16 || newtemp > 30) {\n var range = {\n min: 16,\n max: 30\n }\n msg.payload = false;\n msg.extra = range;\n} else {\n global.set(\"target_temperature\", newtemp);\n msg.payload = true;\n msg.extra = {\n targetTemperature: {\n value: newtemp\n }\n }\n}\nreturn msg;","outputs":1,"noerr":0,"x":550,"y":900,"wires":[["1c880af5.433b25"]]},{"id":"e2741abc.4cab","type":"function","z":"30043e7f.63d8b2","name":"Adapt2Nest","func":"msg.payload = msg.extra.targetTemperature.value;\n\nreturn msg;","outputs":1,"noerr":0,"x":730,"y":780,"wires":[["8b0b035b.e8d018","f61529c5.13e5d8"]]},{"id":"1ff54ff9.be23a8","type":"inject","z":"30043e7f.63d8b2","name":"","topic":"","payload":"30","payloadType":"num","repeat":"","crontab":"","once":false,"x":90,"y":340,"wires":[["7355b06e.42db6"]]},{"id":"f3e435d0.1fed78","type":"debug","z":"30043e7f.63d8b2","name":"","active":true,"console":"false","complete":"true","x":1130,"y":420,"wires":[]},{"id":"617d8fa9.b04988","type":"function","z":"30043e7f.63d8b2","name":"Turn On/Off","func":"var setPower = msg.payload;\n\nvar remote_state = global.get('remote_state');\n\nremote_state[2] = setPower;\n\nglobal.set('remote_state', remote_state);\n\nif (setPower === false){\n var hvac_state = \"off\";\n}\nelse{\n var hvac_state = \"on\";\n}\n\nglobal.set('hvac_status', hvac_state);\n\nvar Code = remote_state;\n\nmsg1 = {payload:Code};\n\nvar msg2 = msg;\nmsg2.payload = true;\n\nreturn [msg1, msg2];\n\n","outputs":"2","noerr":0,"x":550,"y":980,"wires":[["ea46e855.c5e06"],["1c880af5.433b25","ef313c24.8aed28"]]},{"id":"ef313c24.8aed28","type":"debug","z":"30043e7f.63d8b2","name":"","active":true,"console":"false","complete":"true","x":820,"y":980,"wires":[]},{"id":"c29f4a8f.114f4","type":"google-action in","z":"f0fb06f8.1d895","name":"Action Request","topic":"action","port":"8443","url":"/","key":"/home/sysadmin/.node-red/server.key","cert":"/home/sysadmin/.node-red/server.crt","x":220,"y":260,"wires":[["4f548136.c864e","d9132df8.5c9288"]]},{"id":"4f548136.c864e","type":"debug","z":"f0fb06f8.1d895","name":"","active":true,"console":"false","complete":"true","x":1330,"y":260,"wires":[]},{"id":"25ceb3dc.c48dec","type":"google-action response","z":"f0fb06f8.1d895","name":"","x":1320,"y":360,"wires":[]},{"id":"efba9732.c2bef8","type":"change","z":"f0fb06f8.1d895","name":"Goodbye","rules":[{"t":"set","p":"payload","pt":"msg","to":"See ya later","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":800,"y":540,"wires":[["4f548136.c864e","25ceb3dc.c48dec"]]},{"id":"faee298c.e8e14","type":"switch","z":"f0fb06f8.1d895","name":"Question","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"temperature","vt":"str"},{"t":"cont","v":"fancy","vt":"str"},{"t":"else"}],"checkall":"true","outputs":3,"x":600,"y":380,"wires":[["16d1453e.e3ae63"],["3e18337c.2addec"],["45095103.10f498"]]},{"id":"78ff535d.88103c","type":"change","z":"f0fb06f8.1d895","name":"Number","rules":[{"t":"set","p":"closeConversation","pt":"msg","to":"false","tot":"bool"},{"t":"set","p":"payload","pt":"msg","to":"\"My number is \" & $floor($random() * 10)\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":920,"y":340,"wires":[["4f548136.c864e","25ceb3dc.c48dec"]]},{"id":"45095103.10f498","type":"change","z":"f0fb06f8.1d895","name":"Don't understand","rules":[{"t":"set","p":"closeConversation","pt":"msg","to":"false","tot":"bool"},{"t":"set","p":"payload","pt":"msg","to":"I'm sorry, I don't understand","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":830,"y":460,"wires":[["4f548136.c864e","25ceb3dc.c48dec"]]},{"id":"9ad80dae.0dd1a8","type":"change","z":"f0fb06f8.1d895","name":"","rules":[{"t":"set","p":"closeConversation","pt":"msg","to":"false","tot":"bool"},{"t":"set","p":"payload","pt":"msg","to":"This is Node Red","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":780,"y":300,"wires":[["4f548136.c864e","25ceb3dc.c48dec"]]},{"id":"d9132df8.5c9288","type":"switch","z":"f0fb06f8.1d895","name":"Intent","property":"intent","propertyType":"msg","rules":[{"t":"eq","v":"actions.intent.MAIN","vt":"str"},{"t":"eq","v":"actions.intent.TEXT","vt":"str"},{"t":"eq","v":"actions.intent.CANCEL","vt":"str"}],"checkall":"true","outputs":3,"x":390,"y":360,"wires":[["9ad80dae.0dd1a8"],["faee298c.e8e14","8971e4a0.6b0a38"],["efba9732.c2bef8"]]},{"id":"16d1453e.e3ae63","type":"random","z":"f0fb06f8.1d895","name":"","low":"1","high":"10","inte":"true","x":760,"y":360,"wires":[["78ff535d.88103c"]]},{"id":"3e18337c.2addec","type":"change","z":"f0fb06f8.1d895","name":"Fancy","rules":[{"t":"set","p":"closeConversation","pt":"msg","to":"false","tot":"bool"},{"t":"set","p":"payload","pt":"msg","to":"<speak> Here are <say-as interpret-as=\"characters\">SSML</say-as> samples. I can pause <break time=\"3s\"/>. I can play a sound <audio src=\"http://www.sample-videos.com/audio/mp3/crowd-cheering.mp3\">didn't get your MP3 audio file</audio>. I can speak in cardinals. Your number is <say-as interpret-as=\"cardinal\">10</say-as>. Or I can speak in ordinals. You are <say-as interpret-as=\"ordinal\">10</say-as> in line. Or I can even speak in digits. The digits for ten are <say-as interpret-as=\"characters\">10</say-as>. I can also substitute phrases, like the <sub alias=\"World Wide Web Consortium\">W3C</sub>. Finally, I can speak a paragraph with two sentences. <p><s>This is sentence one.</s><s>This is sentence two.</s></p> </speak>","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":810,"y":400,"wires":[["4f548136.c864e","25ceb3dc.c48dec"]]},{"id":"1d25c074.b92408","type":"ecolect","z":"5457368.c53bf48","name":"Language Processing","topics":[{"name":"switch","phrases":"turn {state} the {device}\nturn the {device} {state}\nturn the {device} {state} in {timelapse} {timeunit}\nturn {state} the {device} in {timelapse} {timeunit}\nturn {state} the {device} at {time}\nturn the {device} {state} at {time}","values":[{"name":"device","type":"enumeration","enumerations":["christmas light","garden light","planter"]},{"name":"state","type":"enumeration","enumerations":["off","on"]},{"name":"timelapse","type":"integer","enumerations":[]},{"name":"timeunit","type":"enumeration","enumerations":["minute","minutes","hour","hours"]},{"name":"time","type":"time","enumerations":[]}]},{"name":"query","phrases":"what is the state of the {device}?\nis the {device} {state}?\ntell me the state of the {device}?","values":[{"name":"device","type":"enumeration","enumerations":["christmas light","garden tree","planter"]},{"name":"state","type":"enumeration","enumerations":["on","off"]}]}],"outputs":3,"x":596.6666259765625,"y":403.3333435058594,"wires":[["3121a28.54e30de"],["3121a28.54e30de"],["9764e77a.a3a76","5e134a0f.d45424"]]},{"id":"e0fd9ff4.5ee868","type":"inject","z":"5457368.c53bf48","name":"turn off the christmas light","topic":"","payload":"turn off the christmas light","payloadType":"str","repeat":"","crontab":"","once":false,"x":246.6666259765625,"y":43.333343505859375,"wires":[["36dd2892.b2509"]]},{"id":"c73d1af7.9982e8","type":"inject","z":"5457368.c53bf48","name":"turn the christmas light off","topic":"","payload":"turn the christmas light off","payloadType":"str","repeat":"","crontab":"","once":false,"x":246.6666259765625,"y":83.33334350585938,"wires":[["36dd2892.b2509"]]},{"id":"db275eda.7323f","type":"debug","z":"5457368.c53bf48","name":"","active":true,"console":"false","complete":"true","x":1066.6666259765625,"y":303.3333435058594,"wires":[]},{"id":"5e134a0f.d45424","type":"debug","z":"5457368.c53bf48","name":"","active":true,"console":"false","complete":"true","x":846.6666259765625,"y":843.3333435058594,"wires":[]},{"id":"d51d35e8.b4e868","type":"function","z":"5457368.c53bf48","name":"Topic","func":"msg.payload = msg.topic;\nnode.status({fill:\"blue\",shape:\"ring\",text:\"Value: \"+msg.topic});\nreturn msg;","outputs":1,"noerr":0,"x":1066.6666259765625,"y":343.3333435058594,"wires":[["d7bc1246.b031"]]},{"id":"7ffad630.29dc38","type":"function","z":"5457368.c53bf48","name":"Device","func":"var value = msg.values.device;\nif (value===undefined) {\n node.status({fill:\"red\",shape:\"ring\",text:\"No value\"});\n msg.payload = \"[No value]\";\n} else {\n node.status({fill:\"blue\",shape:\"ring\",text:\"Value: \"+value});\n msg.payload = value;\n}\nreturn msg;","outputs":1,"noerr":0,"x":1066.6666259765625,"y":403.3333435058594,"wires":[["b8716a45.5408b8"]]},{"id":"b1fc327f.457ea","type":"function","z":"5457368.c53bf48","name":"State","func":"var value = msg.values.state;\nif (value===undefined) {\n node.status({fill:\"red\",shape:\"ring\",text:\"No value\"});\n msg.payload = \"[No value]\";\n} else {\n node.status({fill:\"blue\",shape:\"ring\",text:\"Value: \"+value});\n msg.payload = value;\n}\nreturn msg;","outputs":1,"noerr":0,"x":1066.6666259765625,"y":463.3333435058594,"wires":[["3b6c4209.b2100e"]]},{"id":"36dd2892.b2509","type":"function","z":"5457368.c53bf48","name":"Dummy","func":"\nreturn msg;","outputs":1,"noerr":0,"x":1014.1666259765625,"y":165.33334350585938,"wires":[["1d25c074.b92408"]]},{"id":"cb879878.b8eea8","type":"inject","z":"5457368.c53bf48","name":"turn the christmas light off in 10 minutes","topic":"","payload":"turn the christmas light off in 10 minutes","payloadType":"str","repeat":"","crontab":"","once":false,"x":286.6666259765625,"y":123.33334350585938,"wires":[["36dd2892.b2509"]]},{"id":"1d85b2a9.b3eddd","type":"function","z":"5457368.c53bf48","name":"Time lapse","func":"var value = msg.values.timelapse;\nif (value===undefined) {\n node.status({fill:\"red\",shape:\"ring\",text:\"No value\"});\n msg.payload = \"[No value]\";\n} else {\n node.status({fill:\"blue\",shape:\"ring\",text:\"Value: \"+value.value});\n msg.payload = value.value;\n}\nreturn msg;","outputs":1,"noerr":0,"x":1086.6666259765625,"y":523.3333435058594,"wires":[["e8a700e2.5f48"]]},{"id":"acc39fd.fc6e3e","type":"function","z":"5457368.c53bf48","name":"Time unit","func":"var value = msg.values.timeunit;\nif (value===undefined) {\n node.status({fill:\"red\",shape:\"ring\",text:\"No value\"});\n msg.payload = \"[No value]\";\n} else {\n node.status({fill:\"blue\",shape:\"ring\",text:\"Value: \"+value});\n msg.payload = value;\n}\nreturn msg;","outputs":1,"noerr":0,"x":1076.6666259765625,"y":583.3333435058594,"wires":[["aa1047de.58722"]]},{"id":"c0769422.4010d8","type":"function","z":"5457368.c53bf48","name":"Time","func":"var value = msg.values.time;\nif (value===undefined) {\n node.status({fill:\"red\",shape:\"ring\",text:\"No value\"});\n msg.payload = \"[No value]\";\n} else {\n node.status({fill:\"blue\",shape:\"ring\",text:\"Value: \"+value.hour+\":\"+value.minute});\n msg.payload = value.hour+\":\"+value.minute;\n}\nreturn msg;","outputs":1,"noerr":0,"x":1066.6666259765625,"y":643.3333435058594,"wires":[["4faba9d0.5c0608"]]},{"id":"b6efd107.71a608","type":"inject","z":"5457368.c53bf48","name":"turn the garden light on at 6:30","topic":"","payload":"turn the garden light on at 6:30","payloadType":"str","repeat":"","crontab":"","once":false,"x":256.6666259765625,"y":163.33334350585938,"wires":[["36dd2892.b2509"]]},{"id":"3121a28.54e30de","type":"function","z":"5457368.c53bf48","name":"Dummy","func":"\nreturn msg;","outputs":1,"noerr":0,"x":896.6666259765625,"y":403.3333435058594,"wires":[["db275eda.7323f","d51d35e8.b4e868","7ffad630.29dc38","b1fc327f.457ea","1d85b2a9.b3eddd","acc39fd.fc6e3e","c0769422.4010d8"]]},{"id":"c904cdad.ccebd8","type":"ui_text_input","z":"5457368.c53bf48","name":"","label":"Phrase","group":"9b443040.499ed","order":0,"width":0,"height":0,"passthru":true,"mode":"text","delay":"0","topic":"","x":221.09520612444203,"y":470.19051252092595,"wires":[["1d25c074.b92408"]]},{"id":"d7bc1246.b031","type":"ui_text","z":"5457368.c53bf48","group":"9b443040.499ed","order":0,"width":0,"height":0,"name":"","label":"Topic","format":"{{msg.payload}}","layout":"row-spread","x":1266.6666259765625,"y":343.3333435058594,"wires":[]},{"id":"b8716a45.5408b8","type":"ui_text","z":"5457368.c53bf48","group":"9b443040.499ed","order":0,"width":0,"height":0,"name":"","label":"Device","format":"{{msg.payload}}","layout":"row-spread","x":1266.6666259765625,"y":403.3333435058594,"wires":[]},{"id":"3b6c4209.b2100e","type":"ui_text","z":"5457368.c53bf48","group":"9b443040.499ed","order":0,"width":0,"height":0,"name":"","label":"State","format":"{{msg.payload}}","layout":"row-spread","x":1266.6666259765625,"y":463.3333435058594,"wires":[]},{"id":"e8a700e2.5f48","type":"ui_text","z":"5457368.c53bf48","group":"9b443040.499ed","order":0,"width":0,"height":0,"name":"","label":"Time lapse:","format":"{{msg.payload}}","layout":"row-spread","x":1286.6666259765625,"y":523.3333435058594,"wires":[]},{"id":"aa1047de.58722","type":"ui_text","z":"5457368.c53bf48","group":"9b443040.499ed","order":0,"width":0,"height":0,"name":"","label":"Time unit:","format":"{{msg.payload}}","layout":"row-spread","x":1276.6666259765625,"y":583.3333435058594,"wires":[]},{"id":"4faba9d0.5c0608","type":"ui_text","z":"5457368.c53bf48","group":"9b443040.499ed","order":0,"width":0,"height":0,"name":"","label":"Time:","format":"{{msg.payload}}","layout":"row-spread","x":1266.6666259765625,"y":643.3333435058594,"wires":[]},{"id":"9764e77a.a3a76","type":"function","z":"5457368.c53bf48","name":"Collect unrecognized commands","func":"// Get the previously stored commands\nvar temp = context.get(\"commands\");\nif (temp===undefined) {\n temp = [];\n}\n\nif (msg.topic===\"--ClearList--\") {\n // Clear the current list\n temp = [];\n} else {\n // Add the new one \n temp.push(msg.payload);\n}\ncontext.set(\"commands\",temp);\n\n\n//Format the output\nmsg.payload = \"\";\nfor (var i=0; i<temp.length; i++) {\n msg.payload += temp[i] + \"<br/>\";\n}\nreturn msg;","outputs":1,"noerr":0,"x":926.6666259765625,"y":803.3333435058594,"wires":[["3314fc82.8113e4"]]},{"id":"3314fc82.8113e4","type":"ui_template","z":"5457368.c53bf48","group":"101c7b7.af84985","name":"Log output","order":2,"width":0,"height":0,"format":"<div ng-bind-html=\"msg.payload\" height=\"600\" style=\"height: 600px;\"><br/></div>","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":1326.6666259765625,"y":803.3333435058594,"wires":[[]]},{"id":"5c7a0f68.823428","type":"ui_button","z":"5457368.c53bf48","name":"","group":"101c7b7.af84985","order":1,"width":0,"height":0,"passthru":false,"label":"Clear List","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"--ClearList--","x":601.095206124442,"y":764.76191493443,"wires":[["9764e77a.a3a76"]]},{"id":"8971e4a0.6b0a38","type":"ecolect","z":"f0fb06f8.1d895","name":"","topics":[{"name":"climate","phrases":"What is the target {reading} {room}\nWhat is the {reading} {room}\nWhat is {room} {reading}\nTell me the target {reading} {room}\nTell me the {reading} {room}\nTell me the {room} {reading}","values":[{"name":"room","type":"enumeration","enumerations":["living","master","guest","bed"]},{"name":"reading","type":"enumeration","enumerations":["temperature","humidity"]}]}],"outputs":2,"x":494.16668701171875,"y":511.6666564941406,"wires":[["4f548136.c864e"],["45095103.10f498"]]}]