-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathPi-ve flow v2-14beta
1 lines (1 loc) · 185 KB
/
Pi-ve flow v2-14beta
1
[{"id":"c9204266.8fed5","type":"tab","label":"Pi-ve v2.14","disabled":false,"info":""},{"id":"4007f7a1.964b98","type":"mqtt in","z":"c9204266.8fed5","name":"","topic":"pive2mqtt/SLR/#","qos":"2","datatype":"auto","broker":"87a36cb6.d5267","x":140,"y":280,"wires":[["47ecf0f9.aa6db"]]},{"id":"7f5371ed.69ade","type":"split","z":"c9204266.8fed5","name":"SplitKeys","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"topic","x":120,"y":400,"wires":[["58fb60d0.06f7","b4b39b7b.1269d8"]]},{"id":"58fb60d0.06f7","type":"switch","z":"c9204266.8fed5","name":"SLR MQTT Topics","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"linkquality","vt":"str"},{"t":"eq","v":"local_temperature_heat","vt":"str"},{"t":"eq","v":"occupied_heating_setpoint_heat","vt":"str"},{"t":"eq","v":"occupied_heating_setpoint_water","vt":"str"},{"t":"eq","v":"running_state_heat","vt":"str"},{"t":"eq","v":"running_state_water","vt":"str"},{"t":"eq","v":"system_mode","vt":"str"},{"t":"eq","v":"temperature_setpoint_hold_heat","vt":"str"},{"t":"eq","v":"temperature_setpoint_hold_water","vt":"str"},{"t":"eq","v":"system_mode_heat","vt":"str"},{"t":"eq","v":"system_mode_water","vt":"str"},{"t":"eq","v":"last_seen","vt":"str"}],"checkall":"true","repair":false,"outputs":12,"x":470,"y":300,"wires":[[],["c2ca4df4.91553"],["ab9deb6d.d44a38"],["449da31a.a2409c"],["7cb7b39f.90bb7c"],["6e199f0d.1f139"],["b006043.25446f8"],["1b2eec62.2ae504"],["d7dbeb1a.69b5d8"],["ac46fb46.1aac38"],["b164ea85.e3ba48"],["2b76a13b.bf34be"]]},{"id":"a501ef05.aed9d","type":"inject","z":"c9204266.8fed5","name":"CH system_mode (payload) / 1min Ticker","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"60","crontab":"","once":false,"onceDelay":"1","topic":"","payload":"{\"system_mode_heat\": \"\"}","payloadType":"str","x":210,"y":80,"wires":[["24d011f2.f0ab7e"]]},{"id":"2d3f1fa2.5e9e5","type":"mqtt out","z":"c9204266.8fed5","name":"Controller/heat/set/occupied_heating_setpoint","topic":"pive2mqtt/SLR/heat/set/occupied_heating_setpoint","qos":"2","retain":"true","broker":"87a36cb6.d5267","x":1300,"y":200,"wires":[]},{"id":"9e41382d.60d7f8","type":"mqtt out","z":"c9204266.8fed5","name":"Controller/heat/set/system_mode","topic":"pive2mqtt/SLR/heat/set/system_mode","qos":"2","retain":"true","broker":"87a36cb6.d5267","x":1260,"y":260,"wires":[]},{"id":"91eabe45.9795e","type":"function","z":"c9204266.8fed5","name":"System Heat Payload/Boost off?","func":"var value = msg.payload;\nmsg.payload = {\"system_mode_heat\": value}\nmsg.value = value\nif (msg.value === 'heat'){\n flow.set('switchStateCH', \"On\");\n}\nelse {\n flow.set('switchStateCH', \"Off\");\n flow.set('boostTimeEndCH', flow.get('SSE')); //effectively ends boost (if active)\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":370,"y":1280,"wires":[["514d623d.ce2b7c","89d05726.9eed48"]]},{"id":"4c307c87.ebc9b4","type":"function","z":"c9204266.8fed5","name":"System Water Payload/Boost off?","func":"var value = msg.payload;\nmsg.value = value\nmsg.payload = {\"system_mode_water\": value}\nflow.set('switchStateHW', msg.value);\nif (msg.value === 'heat'){\n flow.set('switchStateHW', \"On\");\n}\nelse {\n flow.set('switchStateHW', \"Off\");\n flow.set('boostTimeEndHW', flow.get('SSE')); //effectively ends boost (if active)\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1560,"y":1280,"wires":[["dd4ced6a.da8f3","1e1958ee.d3ea67"]]},{"id":"24d011f2.f0ab7e","type":"mqtt out","z":"c9204266.8fed5","name":"Controller/get","topic":"pive2mqtt/SLR/get","qos":"2","retain":"true","broker":"87a36cb6.d5267","x":200,"y":140,"wires":[],"info":"zigbee2mqtt/Boiler Controller SLR2/heat/set = topic\n\nthen set on zigbee2mqtt gui works..."},{"id":"1e1958ee.d3ea67","type":"function","z":"c9204266.8fed5","name":"\"temperature_setpoint_hold_water\" pub to SLR","func":"if (msg.value === \"off\") {\n msg.payload = '{\"temperature_setpoint_hold_water\": \"0\"}';\n} else {\n msg.payload = '{\"temperature_setpoint_hold_water\": \"1\"}';\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":2000,"y":1320,"wires":[["13109ec4.f1d1a1"]]},{"id":"4dd5c7d.2332a38","type":"mqtt out","z":"c9204266.8fed5","name":"Controller/set","topic":"pive2mqtt/SLR/set","qos":"2","retain":"true","broker":"87a36cb6.d5267","x":1190,"y":140,"wires":[],"info":"zigbee2mqtt/Boiler Controller SLR2/heat/set = topic\n\nthen set on zigbee2mqtt gui works..."},{"id":"89d05726.9eed48","type":"function","z":"c9204266.8fed5","name":"\"temperature_setpoint_hold_heat\" pub to SLR","func":"if (msg.value === \"off\") {\n msg.payload = '{\"temperature_setpoint_hold_heat\": \"0\"}';\n} else {\n msg.payload = '{\"temperature_setpoint_hold_heat\": \"1\"}';\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":800,"y":1320,"wires":[["928e14f6.7d2cb8"]]},{"id":"48c710e3.48239","type":"link in","z":"c9204266.8fed5","name":"Controller/get","links":["b05f2e7a.f467d","bded5310.8d646","39d5c783.6134b8"],"x":55,"y":140,"wires":[["24d011f2.f0ab7e"]]},{"id":"13109ec4.f1d1a1","type":"link out","z":"c9204266.8fed5","name":"Controller/set","links":["fa9923a0.be45e"],"x":2215,"y":1320,"wires":[]},{"id":"fa9923a0.be45e","type":"link in","z":"c9204266.8fed5","name":"Controller/set","links":["13109ec4.f1d1a1","928e14f6.7d2cb8","dd4ced6a.da8f3","514d623d.ce2b7c"],"x":1035,"y":140,"wires":[["4dd5c7d.2332a38"]]},{"id":"928e14f6.7d2cb8","type":"link out","z":"c9204266.8fed5","name":"Controller/set","links":["fa9923a0.be45e"],"x":1015,"y":1320,"wires":[]},{"id":"dd4ced6a.da8f3","type":"link out","z":"c9204266.8fed5","name":"Controller/set","links":["fa9923a0.be45e","1d5dc33b.7b0dad"],"x":1835,"y":1280,"wires":[]},{"id":"514d623d.ce2b7c","type":"link out","z":"c9204266.8fed5","name":"Controller/set","links":["fa9923a0.be45e"],"x":635,"y":1280,"wires":[]},{"id":"5fe8e7a8.7274d8","type":"delay","z":"c9204266.8fed5","name":"Delay Therm Payload & pub","pauseType":"delay","timeout":"500","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":860,"y":1400,"wires":[["b51a6fb7.b2f2"]]},{"id":"ac46fb46.1aac38","type":"link out","z":"c9204266.8fed5","name":"system_mode_heat","links":["a589eb81.20f098","fddde02d.ff846"],"x":655,"y":480,"wires":[]},{"id":"b164ea85.e3ba48","type":"link out","z":"c9204266.8fed5","name":"system_mode_water","links":["bc1bd10b.98732"],"x":675,"y":520,"wires":[]},{"id":"ab9deb6d.d44a38","type":"link out","z":"c9204266.8fed5","name":"occupied_heating_setpoint_heat","links":["e439906c.aae5"],"x":655,"y":200,"wires":[]},{"id":"7cb7b39f.90bb7c","type":"link out","z":"c9204266.8fed5","name":"running_state_heat","links":["94e8ce01.2f3e6","5e5ffe2b.c2ab6"],"x":655,"y":280,"wires":[]},{"id":"94e8ce01.2f3e6","type":"link in","z":"c9204266.8fed5","name":"running_state_heat","links":["7cb7b39f.90bb7c"],"x":75,"y":1080,"wires":[["f0196479.994b58","626b791.ca50a88","bc49ab52.0dba28"]]},{"id":"6e199f0d.1f139","type":"link out","z":"c9204266.8fed5","name":"running_state_water","links":["56f9c158.bae0a","9331ed15.b485"],"x":675,"y":320,"wires":[]},{"id":"56f9c158.bae0a","type":"link in","z":"c9204266.8fed5","name":"running_state_water","links":["6e199f0d.1f139"],"x":1035,"y":1080,"wires":[["8d59f82b.816428","29ea65c2.b2f2fa","f118a87b.598c18"]]},{"id":"c2ca4df4.91553","type":"link out","z":"c9204266.8fed5","name":"local_temperature_heat","links":["d2718c8c.b2228","26c6923b.47bdde"],"x":655,"y":160,"wires":[]},{"id":"d2718c8c.b2228","type":"link in","z":"c9204266.8fed5","name":"Temp Disp","links":["c2ca4df4.91553"],"x":1035,"y":980,"wires":[["c3924fc1.13895","5fe5f7f1.dd70d8"]]},{"id":"83c83927.641828","type":"comment","z":"c9204266.8fed5","name":"Pi-ve - CH/HW Controller Project (Pi Zero W + Hive SLR/SLT) Beta 2.14","info":"","x":270,"y":40,"wires":[]},{"id":"bc6db5db.ebe358","type":"comment","z":"c9204266.8fed5","name":"local_temperature_heat","info":"","x":780,"y":160,"wires":[]},{"id":"aca63d26.5ab6","type":"comment","z":"c9204266.8fed5","name":"occupied_heating_setpoint_heat","info":"","x":810,"y":200,"wires":[]},{"id":"a6652d6d.b6f68","type":"comment","z":"c9204266.8fed5","name":"running_state_water","info":"","x":790,"y":320,"wires":[]},{"id":"c8cb7384.48019","type":"link in","z":"c9204266.8fed5","name":"Controller/heat/set/occupied_heating_setpoint","links":["b51a6fb7.b2f2","3e9ed23e.863e1e","539dcc76.2b5964","f2fc5ea9.134"],"x":1035,"y":200,"wires":[["2d3f1fa2.5e9e5"]]},{"id":"b51a6fb7.b2f2","type":"link out","z":"c9204266.8fed5","name":"Controller/heat/set/occupied_heating_setpoint","links":["c8cb7384.48019"],"x":1015,"y":1400,"wires":[]},{"id":"76297218.7a784c","type":"comment","z":"c9204266.8fed5","name":"running_state_heat","info":"","x":770,"y":280,"wires":[]},{"id":"8b84d98.0dab128","type":"comment","z":"c9204266.8fed5","name":"system_mode_heat","info":"","x":770,"y":480,"wires":[]},{"id":"22a01ab9.3f94c6","type":"comment","z":"c9204266.8fed5","name":"system_mode_water","info":"","x":790,"y":520,"wires":[]},{"id":"b006043.25446f8","type":"link out","z":"c9204266.8fed5","name":"system_mode","links":["bbca81c.524588"],"x":655,"y":440,"wires":[]},{"id":"208d9013.3b6ee","type":"comment","z":"c9204266.8fed5","name":"system_mode","info":"","x":750,"y":440,"wires":[]},{"id":"1b2eec62.2ae504","type":"link out","z":"c9204266.8fed5","name":"temperature_setpoint_hold_heat","links":["74310ead.91b41","ffe572b5.3a925"],"x":655,"y":360,"wires":[]},{"id":"41d5e2f5.ab30bc","type":"comment","z":"c9204266.8fed5","name":"temperature_setpoint_hold_heat","info":"","x":810,"y":360,"wires":[]},{"id":"d7dbeb1a.69b5d8","type":"link out","z":"c9204266.8fed5","name":"temperature_setpoint_hold_water","links":["aece101.52c99f","9e7ac1eb.398c8"],"x":675,"y":400,"wires":[]},{"id":"1fb54314.564e4d","type":"comment","z":"c9204266.8fed5","name":"temperature_setpoint_hold_water","info":"","x":830,"y":400,"wires":[]},{"id":"449da31a.a2409c","type":"link out","z":"c9204266.8fed5","name":"occupied_heating_setpoint_water","links":["1d5dc33b.7b0dad"],"x":675,"y":240,"wires":[]},{"id":"20dbf4f8.c596fc","type":"comment","z":"c9204266.8fed5","name":"occupied_heating_setpoint_water","info":"","x":830,"y":240,"wires":[]},{"id":"451abc43.749844","type":"comment","z":"c9204266.8fed5","name":"Heat and Hot Water On/Off flow - triggers relevant mqtt messages","info":"","x":1130,"y":1280,"wires":[]},{"id":"68f45c1b.015854","type":"comment","z":"c9204266.8fed5","name":"Display CH Thermostat Sliders - Get Changes. Publish to SLR and save","info":"","x":1350,"y":800,"wires":[]},{"id":"e88d6f8a.dea5","type":"comment","z":"c9204266.8fed5","name":"Display Thermostat Temperature Gauge and Value","info":"","x":1530,"y":980,"wires":[]},{"id":"c5fd448b.4270e8","type":"link in","z":"c9204266.8fed5","name":"Controller/heat/set/system_mode","links":["83d9d7b7.0f43a8"],"x":1035,"y":260,"wires":[["9e41382d.60d7f8"]]},{"id":"a5785910.6b50d8","type":"comment","z":"c9204266.8fed5","name":"Display CH and HW demand_state and demand icons","info":"","x":800,"y":1080,"wires":[]},{"id":"d125c963.70a358","type":"comment","z":"c9204266.8fed5","name":"mqqt publish topics to SLR","info":"","x":1130,"y":100,"wires":[]},{"id":"eab0093d.f09698","type":"comment","z":"c9204266.8fed5","name":"mqqt subscribe to SLR topics","info":"","x":180,"y":240,"wires":[]},{"id":"47ecf0f9.aa6db","type":"json","z":"c9204266.8fed5","name":"","property":"payload","action":"","pretty":false,"x":110,"y":360,"wires":[["7f5371ed.69ade"]]},{"id":"4e3ce1c7.72609","type":"comment","z":"c9204266.8fed5","name":"SLR/SLT status (online/offline)","info":"","x":180,"y":480,"wires":[]},{"id":"b4b39b7b.1269d8","type":"trigger","z":"c9204266.8fed5","name":"online trigger 65 secs","op1":"online","op2":"offline","op1type":"str","op2type":"str","duration":"65","extend":true,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":160,"y":520,"wires":[["7591e07b.a8547","261225aa.ea911a","4e833006.be165"]]},{"id":"72fc0111.73118","type":"template","z":"c9204266.8fed5","name":"HTML page","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n <head></head>\n <body>\n <h1>OK - {{req.params.cmd}}</h1>\n </body>\n</html>","x":1750,"y":1680,"wires":[["6f38a553.7f7f5c"]]},{"id":"6f38a553.7f7f5c","type":"http response","z":"c9204266.8fed5","name":"","x":2010,"y":1680,"wires":[]},{"id":"5baca31.f70645c","type":"http in","z":"c9204266.8fed5","name":"","url":"/cmd","method":"post","upload":false,"swaggerDoc":"","x":100,"y":1760,"wires":[["137a4ef0.052351"]]},{"id":"d6efb779.04eaf8","type":"switch","z":"c9204266.8fed5","name":"HW state","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"On","vt":"str"},{"t":"cont","v":"Off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":340,"y":1780,"wires":[["b6f9d90.b30d728","f71b9a52.3387e8"],["b6f9d90.b30d728","940fd6d7.cd72e8"]]},{"id":"c572da2c.8a2b18","type":"link out","z":"c9204266.8fed5","name":"HW On","links":["b0b0fdef.43cb"],"x":935,"y":1760,"wires":[]},{"id":"5b59f692.2dca78","type":"link out","z":"c9204266.8fed5","name":"HW Off","links":["b0b0fdef.43cb"],"x":935,"y":1800,"wires":[]},{"id":"9c956e05.df86","type":"link out","z":"c9204266.8fed5","name":"/GetHW","links":["b0b0fdef.43cb"],"x":2215,"y":1760,"wires":[]},{"id":"f8635c7f.66eaf","type":"switch","z":"c9204266.8fed5","name":"Check topic","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"HW","vt":"str"},{"t":"eq","v":"CH","vt":"str"},{"t":"eq","v":"SP","vt":"str"},{"t":"eq","v":"CHBoost","vt":"str"},{"t":"eq","v":"HWBoost","vt":"str"},{"t":"eq","v":"tmrActive","vt":"str"},{"t":"eq","v":"manActive","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":8,"x":110,"y":1920,"wires":[["d6efb779.04eaf8"],["71ccc136.397f9"],["54ab9b47.280be4"],["abd5aa3a.9b0c08"],["d3d77325.eb058"],["ff458ac6.067f38"],["e4bf8fd0.c48b"],["282edd95.483232"]]},{"id":"137a4ef0.052351","type":"split","z":"c9204266.8fed5","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"topic","x":90,"y":1820,"wires":[["f8635c7f.66eaf"]]},{"id":"71ccc136.397f9","type":"switch","z":"c9204266.8fed5","name":"CH state","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"On","vt":"str"},{"t":"cont","v":"Off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":340,"y":1820,"wires":[["b6f9d90.b30d728","86115dca.84306"],["b6f9d90.b30d728","605684e5.2fb71c"]]},{"id":"f2076921.71a808","type":"link out","z":"c9204266.8fed5","name":"CH On","links":["2fa07ed6.148c72"],"x":935,"y":1900,"wires":[]},{"id":"88060618.13d9a8","type":"link out","z":"c9204266.8fed5","name":"CH Off","links":["f58a9dac.df5d6","2fa07ed6.148c72"],"x":935,"y":1940,"wires":[]},{"id":"a822efa4.9f587","type":"link out","z":"c9204266.8fed5","name":"/GetCH","links":["2fa07ed6.148c72"],"x":2215,"y":1860,"wires":[]},{"id":"5fb754ff.c7a38c","type":"comment","z":"c9204266.8fed5","name":"HTTP GETs","info":"","x":1410,"y":1640,"wires":[]},{"id":"54ab9b47.280be4","type":"switch","z":"c9204266.8fed5","name":"SP Value","property":"payload","propertyType":"msg","rules":[{"t":"null"},{"t":"btwn","v":"1","vt":"num","v2":"30","v2t":"num"},{"t":"nnull"}],"checkall":"false","repair":false,"outputs":3,"x":340,"y":1720,"wires":[["282edd95.483232"],["b6bd077b.8cdda8","b6f9d90.b30d728"],["282edd95.483232"]]},{"id":"b6bd077b.8cdda8","type":"link out","z":"c9204266.8fed5","name":"/SP Out","links":["e955a218.a64af"],"x":815,"y":1680,"wires":[]},{"id":"282edd95.483232","type":"template","z":"c9204266.8fed5","name":"ERR","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n <head></head>\n <body>\n <h1>ERR</h1>\n </body>\n <meta http-equiv=\"refresh\" content=\"3; url=/ctrl/page\" />\n</html>","x":550,"y":1680,"wires":[["e49e18f4.367c98"]]},{"id":"e49e18f4.367c98","type":"http response","z":"c9204266.8fed5","name":"","x":890,"y":1640,"wires":[]},{"id":"b6f9d90.b30d728","type":"template","z":"c9204266.8fed5","name":"OK","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n <head></head>\n <body>\n <h1>OK</h1>\n </body>\n <meta http-equiv=\"refresh\" content=\"3; url=/ctrl/page\" />\n</html>","x":550,"y":1640,"wires":[["e49e18f4.367c98"]]},{"id":"ac149288.1eab7","type":"http in","z":"c9204266.8fed5","name":"","url":"/ctrl/:cmd","method":"get","upload":false,"swaggerDoc":"","x":1410,"y":1700,"wires":[["5f6b646c.6efefc"]]},{"id":"5fe5f7f1.dd70d8","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"temp","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1170,"y":1000,"wires":[[]]},{"id":"44e18f6e.dc465","type":"template","z":"c9204266.8fed5","name":"ctrl page","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<!DOCTYPE html>\n<html>\n <head>\n <meta http-equiv=\"refresh\" content=\"30\">\n <title>Pi-ve ctrl v0.47</title>\n <style>\n body {font-family: Arial, serif;}\n \n#slidecontainer {\n width: 100%;\n}\n\nbutton {/* Customize the button here*/\n font-size:20px;\n width:100px;\n height:35px;\n background:lightblue;\n border-radius: 12px;\n} \n \n.slider {\n -webkit-appearance: none;\n -webkit-transform: rotate(0deg);\n width: 400px;\n height: 10px;\n position:absolute;\n top:50%;\n left:50%;\n left:0px;\n top:230px;\n background: #e2dcdc;\n outline: none;\n opacity: 0.7;\n -webkit-transition: .2s;\n transition: opacity .2s;\n}\n\ninput[type=\"submit\"] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n font-size:20px;\n padding: 0px;\n height: 35px;\n width: 100px;\n border-radius: 12px;\n}\n \nsection {\n display: table;\n width: 100%;\n background-color: ;\n \tmax-width: 420px;\n \tbackground-color: ;\n}\n\n\n.bcol-1, .bcol-2, .bcol-3, .bcol-4 {\n width: 0%;\n display: table-cell;\n background-color: ;\n}\n\n \n}\n</style> </head>\n <body>\n <h1>Pi-ve HW/CH Controller</h1>\n <h2><span style=\" color:blue; background-color: #e2dcdc;\">Temperature:\n {{flow.temp}} C</span></h2>\n <h2 style=\" color:blue;\">Set Thermostat Setpoint</h2>\n <form action=\"/cmd\" method=\"POST\" id=\"form\" style=\"width: 455px;\">\n <p> <input name=\"SP\" min=\"0\" max=\"30\" value=\"20\" step=\"0.5\" class=\"slider\"\n\n id=\"myRange\" type=\"range\"> </p>\n <h3>SP Temp: <span id=\"sp\"></span>C</h3>\n <br>\n <br>\n <button type=\"submit\" value=\"SP\">Submit</button>\n <p></p>\n <br>\n </form>\n <h2><span style=\"color: #3333ff; background-color: #e2dcdc;\">HW -\n {{flow.switchStateHW}} / {{flow.modeHW}} / Demand = {{flow.DemandHW}}</span></h2>\n <section>\n <div class=\"bcol-1\"></div>\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"HW\" value=\"On\">HWOn</button>\n </form>\n </div>\n <div class=\"bcol-2\">\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"HW\" value=\"Off\">HWOff</button>\n </form>\n </div>\n </div>\n <div class=\"bcol-3\"></div>\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"tmrActive\" value=\"HW\">Timer\n </button></form> </div>\n <div class=\"bcol-4\">\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"manActive\" value=\"HW\">Manual\n </button></form> </div>\n </div>\n </section>\n <h2> <span style=\"color: #3333ff; background-color: #e2dcdc;\">CH -\n {{flow.switchStateCH}} / {{flow.modeCH}} / Demand = {{flow.DemandCH}}</span></h2>\n <section>\n <div class=\"bcol-1\"></div>\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"CH\" value=\"On\">CHOn</button>\n </form>\n </div>\n <div class=\"bcol-2\">\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"CH\" value=\"Off\">CHOff</button>\n </form>\n </div>\n </div>\n <div class=\"bcol-3\"></div>\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"tmrActive\" value=\"CH\">Timer\n </button></form> </div>\n <div class=\"bcol-4\">\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"manActive\" value=\"CH\">Manual\n </button></form> </div>\n </div>\n </section>\n <p> </p>\n <br>\n <h2><span style=\"color: #3333ff; background-color: #e2dcdc;\">HW Boost -\n {{flow.boostTxtHW}} {{flow.boostTimeTxtHW}}</span> </h2>\n <p> </p>\n <section>\n <div class=\"bcol-1\"></div>\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"HWBoost\" value=\"30\">+30m</button>\n </form>\n </div>\n <div class=\"bcol-2\">\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"HWBoost\" value=\"60\">+60m\n </button></form> </div>\n </div>\n <div class=\"bcol-3\"></div>\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"HWBoost\" value=\"90\">+90m\n </button></form> </div>\n <div class=\"bcol-4\">\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"HWBoost\" value=\"Off\">Off\n </button></form> </div>\n </div>\n </section>\n <h2><span style=\"color: #3333ff; background-color: #e2dcdc;\">CH Boost -\n {{flow.boostTxtCH}} {{flow.boostTimeTxtCH}}<br>\n </span></h2>\n <section>\n <div class=\"bcol-1\"></div>\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"CHBoost\" value=\"30\">+30m\n </button></form> </div>\n <div class=\"bcol-2\">\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"CHBoost\" value=\"60\">+60m\n </button></form> </div>\n </div>\n <div class=\"bcol-3\"></div>\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"CHBoost\" value=\"90\">+90m\n </button></form> </div>\n <div class=\"bcol-4\">\n <div class=\"section\">\n <form action=\"/cmd\" method=\"post\"> <button name=\"CHBoost\" value=\"Off\">Off\n </button></form> </div>\n </div>\n </section>\n <script> \nlet thermSP = {{flow.thermSP}};\nvar slider = document.getElementById(\"myRange\");\ndocument.getElementById(\"myRange\").defaultValue = thermSP;\n\nslider = document.getElementById(\"myRange\");\nvar output = document.getElementById(\"sp\");\noutput.innerHTML = slider.value;\n\nslider.oninput = function() {\n output.innerHTML = this.value;\n}\n\nslider.onmouseup = function () {\n document.getElementById(\"form\").submit();\n} \n </script>\n \n </body>\n</html>","x":1760,"y":1640,"wires":[["6f38a553.7f7f5c"]]},{"id":"a41a3f7e.987aa","type":"ui_slider","z":"c9204266.8fed5","name":"","label":"Thermostat SP","tooltip":"","group":"aaa48299.7b526","order":5,"width":6,"height":2,"passthru":true,"outs":"end","topic":"","topicType":"str","min":"1","max":"30","step":"0.5","x":1180,"y":740,"wires":[["f2fc5ea9.134","3959db27.4b7064"]]},{"id":"68c78f11.0fd71","type":"ui_text","z":"c9204266.8fed5","group":"aaa48299.7b526","order":1,"width":3,"height":1,"name":"Last Seen","label":"Last Seen:","format":"{{msg.payload}}","layout":"row-spread","x":500,"y":480,"wires":[]},{"id":"f0196479.994b58","type":"ui_text","z":"c9204266.8fed5","group":"aaa48299.7b526","order":8,"width":2,"height":1,"name":"CH Demand","label":"Demand:","format":"","layout":"row-spread","x":210,"y":1080,"wires":[]},{"id":"8d59f82b.816428","type":"ui_text","z":"c9204266.8fed5","group":"aaa48299.7b526","order":15,"width":2,"height":1,"name":"HW Demand","label":"Demand:","format":"","layout":"row-spread","x":1170,"y":1080,"wires":[]},{"id":"1e7704c7.50d51b","type":"ui_text","z":"c9204266.8fed5","group":"aaa48299.7b526","order":17,"width":2,"height":1,"name":"HW State","label":"State:","format":"","layout":"row-spread","x":1780,"y":1440,"wires":[]},{"id":"5668338b.36a5ac","type":"ui_text","z":"c9204266.8fed5","group":"aaa48299.7b526","order":10,"width":2,"height":1,"name":"CH State","label":"State:","format":"","layout":"row-spread","x":620,"y":1440,"wires":[]},{"id":"7591e07b.a8547","type":"ui_text","z":"c9204266.8fed5","group":"aaa48299.7b526","order":2,"width":2,"height":1,"name":"State","label":"State:","format":"{{value}}","layout":"row-spread","x":490,"y":520,"wires":[]},{"id":"c3924fc1.13895","type":"ui_gauge","z":"c9204266.8fed5","name":"Thermostat Temp Gauge","group":"aaa48299.7b526","order":4,"width":6,"height":3,"gtype":"gage","title":"SLR Thermostat Temperature","label":"","format":"{{value | number:2}}","min":0,"max":"30","colors":["#a9402d","#e6e600","#3acb4a"],"seg1":"15","seg2":"18","x":1210,"y":960,"wires":[]},{"id":"2b76a13b.bf34be","type":"function","z":"c9204266.8fed5","name":"Store 'Last Seen'","func":"let thisString = new Date(msg.payload);\nlet spl = thisString.toString().split(\" \");\nlet tme = spl[4].toString().split(\":\");\n\nmsg.payload = tme[0] + \":\" + tme[1];\nflow.set('lastSeen', msg.payload);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":470,"y":440,"wires":[["68c78f11.0fd71"]]},{"id":"e79dbe43.e402e","type":"ui_switch","z":"c9204266.8fed5","name":"HW Switch","label":"Manual Mode - Off/On","tooltip":"","group":"aaa48299.7b526","order":19,"width":6,"height":1,"passthru":true,"decouple":"false","topic":"offonSwitch","topicType":"str","style":"","onvalue":"heat","onvalueType":"str","onicon":"","oncolor":"","offvalue":"off","offvalueType":"str","officon":"","offcolor":"","animate":true,"x":1470,"y":1400,"wires":[["cbc6e563.84cf28","1e7704c7.50d51b","5215c1fd.811d8","e26068e9.0d4058","4c307c87.ebc9b4"]]},{"id":"7cd71fa9.0b43b","type":"ui_switch","z":"c9204266.8fed5","name":"CH Switch","label":"Manual Mode - Off/On","tooltip":"","group":"aaa48299.7b526","order":12,"width":6,"height":1,"passthru":true,"decouple":"false","topic":"offonSwitch","topicType":"str","style":"","onvalue":"heat","onvalueType":"str","onicon":"","oncolor":"","offvalue":"off","offvalueType":"str","officon":"","offcolor":"","animate":false,"x":310,"y":1400,"wires":[["362fd32.eb4482c","5668338b.36a5ac","75842ea8.d026b","6b11b04a.0e05f","91eabe45.9795e","2f8fe8c6.d6bea8"]]},{"id":"f4bc46df.f898c8","type":"change","z":"c9204266.8fed5","name":"-> selectedDayHW/dayIndex HW","rules":[{"t":"set","p":"dayIndexHW","pt":"flow","to":"$number(msg.topic)\t","tot":"jsonata"},{"t":"set","p":"selectedDayHW","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":2460,"wires":[["bc697157.2fefc"]]},{"id":"53a32db8.3cbe64","type":"ui_button","z":"c9204266.8fed5","name":"Sun HW","group":"4723d56a.5d74cc","order":7,"width":1,"height":1,"passthru":true,"label":"Sun","tooltip":"Show Sunday HW Time Slots in below list - Then Select a Time Slot to enable Edit functions ","color":"","bgcolor":"","icon":"","payload":"Sun","payloadType":"str","topic":"0","topicType":"str","x":80,"y":2460,"wires":[["f4bc46df.f898c8"]]},{"id":"478efbc1.dbf764","type":"ui_button","z":"c9204266.8fed5","name":"Mon HW","group":"4723d56a.5d74cc","order":1,"width":1,"height":1,"passthru":true,"label":"Mon","tooltip":"Show Monday HW Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Mon","payloadType":"str","topic":"1","topicType":"str","x":80,"y":2500,"wires":[["f4bc46df.f898c8"]]},{"id":"5a13ac9d.22ce24","type":"ui_button","z":"c9204266.8fed5","name":"Tue HW","group":"4723d56a.5d74cc","order":2,"width":1,"height":1,"passthru":true,"label":"Tue","tooltip":"Show Tuesday HW Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Tue","payloadType":"str","topic":"2","topicType":"str","x":80,"y":2540,"wires":[["f4bc46df.f898c8"]]},{"id":"57fcbe95.6bd16","type":"ui_button","z":"c9204266.8fed5","name":"Wed HW","group":"4723d56a.5d74cc","order":3,"width":1,"height":1,"passthru":true,"label":"Wed","tooltip":"Show Wednesday HW Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Wed","payloadType":"str","topic":"3","topicType":"str","x":80,"y":2580,"wires":[["f4bc46df.f898c8"]]},{"id":"36b3ae77.82c182","type":"ui_button","z":"c9204266.8fed5","name":"Thu HW","group":"4723d56a.5d74cc","order":4,"width":1,"height":1,"passthru":true,"label":"Thu","tooltip":"Show Thursday HW Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Thu","payloadType":"str","topic":"4","topicType":"str","x":80,"y":2620,"wires":[["f4bc46df.f898c8"]]},{"id":"6c2ada1b.5fc9c4","type":"ui_button","z":"c9204266.8fed5","name":"Fri HW","group":"4723d56a.5d74cc","order":5,"width":1,"height":1,"passthru":true,"label":"Fri","tooltip":"Show Friday HW Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Fri","payloadType":"str","topic":"5","topicType":"str","x":70,"y":2660,"wires":[["f4bc46df.f898c8"]]},{"id":"7b358c43.de7564","type":"ui_button","z":"c9204266.8fed5","name":"Sat HW","group":"4723d56a.5d74cc","order":6,"width":1,"height":1,"passthru":true,"label":"Sat","tooltip":"Show Saturday HW Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Sat","payloadType":"str","topic":"6","topicType":"str","x":80,"y":2700,"wires":[["f4bc46df.f898c8"]]},{"id":"bc697157.2fefc","type":"file in","z":"c9204266.8fed5","name":"Read HW (1)","filename":"Pive-HW","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":710,"y":2460,"wires":[["f716ec60.9dcef"]]},{"id":"f716ec60.9dcef","type":"json","z":"c9204266.8fed5","name":"","property":"payload","action":"","pretty":false,"x":390,"y":2520,"wires":[["2f7e2321.b83e6c"]]},{"id":"6e59164a.df04d8","type":"link in","z":"c9204266.8fed5","name":"Submit HW","links":["c01d044.f4838f8","38d10da5.56e762"],"x":955,"y":2500,"wires":[["cec57b93.d5fcc8","af2ed810.1ed758","bc697157.2fefc"]]},{"id":"611bedf1.479ad4","type":"change","z":"c9204266.8fed5","name":"-> weekday/dayIndexHW","rules":[{"t":"set","p":"dayIndexHW","pt":"flow","to":"dayIndexHW","tot":"msg"},{"t":"set","p":"selectedDayHW","pt":"flow","to":"dayHW","tot":"msg"},{"t":"set","p":"dbWriteLockHW","pt":"flow","to":"false","tot":"bool"},{"t":"set","p":"boostHW","pt":"flow","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":670,"y":2400,"wires":[["cec57b93.d5fcc8","af2ed810.1ed758","bc697157.2fefc"]]},{"id":"cec57b93.d5fcc8","type":"function","z":"c9204266.8fed5","name":"Reset Start/End","func":"msg.payload = '00:00';\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1220,"y":2500,"wires":[["8a17762d.58f378","5a08e16a.7a014"]]},{"id":"af2ed810.1ed758","type":"function","z":"c9204266.8fed5","name":"Reset Timeslot Title","func":"msg.payload = '<-- Select Day/Time Slot';\nflow.set('selectTSHW', \"-\")\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1230,"y":2460,"wires":[["1e3e1b6c.26c5b5"]]},{"id":"10237ae4.81afc5","type":"function","z":"c9204266.8fed5","name":"get date/time","func":"let date = Date();\nvar DayIndex = []; \nDayIndex['Sun'] = 0;\nDayIndex['Mon'] = 1;\nDayIndex['Tue'] = 2;\nDayIndex['Wed'] = 3;\nDayIndex['Thu'] = 4;\nDayIndex['Fri'] = 5;\nDayIndex['Sat'] = 6; //'Day' , DayIndex for lookup\n \nlet day = date.substring(0, 3);\nmsg.dayIndexHW = DayIndex[day];\nmsg.dayHW = day;\nmsg.payload = date;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":2400,"wires":[["611bedf1.479ad4"]]},{"id":"2f7e2321.b83e6c","type":"switch","z":"c9204266.8fed5","name":"Switch Day of Week HW","property":"selectedDayHW","propertyType":"flow","rules":[{"t":"eq","v":"Sun","vt":"str"},{"t":"eq","v":"Mon","vt":"str"},{"t":"eq","v":"Tue","vt":"str"},{"t":"eq","v":"Wed","vt":"str"},{"t":"eq","v":"Thu","vt":"str"},{"t":"eq","v":"Fri","vt":"str"},{"t":"eq","v":"Sat","vt":"str"}],"checkall":"true","repair":false,"outputs":7,"x":450,"y":2680,"wires":[["cba93ae8.267a38"],["797a5c2a.00fdf4"],["4cb7b7fd.7c58c8"],["e0c27baa.3e5298"],["de4b02e4.9ee66"],["bb07db0b.627288"],["5f92ec76.5c7b34"]]},{"id":"8d76c70.0b7ca38","type":"ui_text_input","z":"c9204266.8fed5","name":"TS Start","label":"Start","tooltip":"","group":"e22da41f.72dcc8","order":2,"width":4,"height":1,"passthru":true,"mode":"time","delay":"0","topic":"topic","topicType":"msg","x":1620,"y":2740,"wires":[["dccdaa70.d510f8"]]},{"id":"a34ba30a.22b38","type":"ui_text_input","z":"c9204266.8fed5","name":"TSEnd","label":"End","tooltip":"","group":"e22da41f.72dcc8","order":3,"width":4,"height":1,"passthru":true,"mode":"time","delay":"0","topic":"topic","topicType":"msg","x":1610,"y":2780,"wires":[["591db7f1.7d43f8"]]},{"id":"1e3e1b6c.26c5b5","type":"ui_text_input","z":"c9204266.8fed5","name":"Day/Time Slot","label":"Time Slot","tooltip":"","group":"e22da41f.72dcc8","order":1,"width":4,"height":1,"passthru":true,"mode":"text","delay":300,"topic":"topic","topicType":"msg","x":1460,"y":2700,"wires":[[]]},{"id":"a66e6c36.90a76","type":"inject","z":"c9204266.8fed5","name":"OnInit Setup","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"0.3","topic":"resetHW","payload":"","payloadType":"date","x":110,"y":2400,"wires":[["10237ae4.81afc5","28657e30.7f63d2"]]},{"id":"cba93ae8.267a38","type":"change","z":"c9204266.8fed5","name":"Sun array (0)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[0][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":2520,"wires":[["6e2f56e7.916638"]]},{"id":"797a5c2a.00fdf4","type":"change","z":"c9204266.8fed5","name":"Mon array (1)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[1][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":2560,"wires":[["6e2f56e7.916638"]]},{"id":"4cb7b7fd.7c58c8","type":"change","z":"c9204266.8fed5","name":"Tue array (2)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[2][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":2600,"wires":[["6e2f56e7.916638"]]},{"id":"e0c27baa.3e5298","type":"change","z":"c9204266.8fed5","name":"Wed array (3)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[3][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":2640,"wires":[["6e2f56e7.916638"]]},{"id":"de4b02e4.9ee66","type":"change","z":"c9204266.8fed5","name":"Thu array (4)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[4][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":2680,"wires":[["6e2f56e7.916638"]]},{"id":"bb07db0b.627288","type":"change","z":"c9204266.8fed5","name":"Fri array (5)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[5][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":2720,"wires":[["6e2f56e7.916638"]]},{"id":"5f92ec76.5c7b34","type":"change","z":"c9204266.8fed5","name":"Sat array (6)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[6][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":2760,"wires":[["6e2f56e7.916638"]]},{"id":"dccdaa70.d510f8","type":"moment","z":"c9204266.8fed5","name":"secs to dte/tme","topic":"","input":"","inputType":"msg","inTz":"Europe/London","adjAmount":0,"adjType":"days","adjDir":"add","format":"","locale":"en-GB","output":"","outputType":"msg","outTz":"Europe/London","x":1800,"y":2740,"wires":[["164bae82.74a3b1"]]},{"id":"7dbb7dfe.4b3944","type":"change","z":"c9204266.8fed5","name":"HW TS Start","rules":[{"t":"set","p":"dayHW","pt":"flow","to":"payload.title","tot":"msg"},{"t":"set","p":"savedDaySlotPayloadHW","pt":"flow","to":"payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"payload.description","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"$substringBefore(msg.payload, \" \")","tot":"jsonata"},{"t":"set","p":"StartTimeHW","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1209,"y":2740,"wires":[["8a17762d.58f378"]]},{"id":"591db7f1.7d43f8","type":"moment","z":"c9204266.8fed5","name":"secs to dte/tme","topic":"","input":"","inputType":"msg","inTz":"Europe/London","adjAmount":0,"adjType":"days","adjDir":"add","format":"","locale":"en-GB","output":"","outputType":"msg","outTz":"Europe/London","x":1800,"y":2780,"wires":[["1613d64b.ddc6ea"]]},{"id":"25f13603.89eb5a","type":"change","z":"c9204266.8fed5","name":"HW TS End","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.description","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"$substringAfter(msg.payload, \" - \")","tot":"jsonata"},{"t":"set","p":"EndTimeHW","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1209,"y":2780,"wires":[["5a08e16a.7a014"]]},{"id":"38a1a489.61945c","type":"change","z":"c9204266.8fed5","name":"HW Day/TS","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.title","tot":"msg"},{"t":"set","p":"selectTSHW","pt":"flow","to":"$substring(msg.payload, 20, 1)\t","tot":"jsonata"},{"t":"set","p":"selectedTSIndexHW","pt":"flow","to":"$number($substring(msg.payload, 20, 1)\t) -1","tot":"jsonata"},{"t":"set","p":"enabled","pt":"msg","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1210,"y":2700,"wires":[["1e3e1b6c.26c5b5"]]},{"id":"6e2f56e7.916638","type":"function","z":"c9204266.8fed5","name":"Make HW timeslots","func":"newPayload = []; //init new Array\nflow.set('savedSelectedDayHW', msg.payload); //save whole week HW array\nflow.set('savedSelectedTimeSlotHW', msg.period); //time slot elements from day selected\nflow.set('TSArraySizeHW', msg.period.length); //save length of daily time slot selected (eg 8)\nselectedDayHW = flow.get('selectedDayHW'); //get day selected eg \"Sat\" \n\nfunction timeConv(totalMins) { //convert mins to \"hh:mm\" function\nlet hours = Math.floor(totalMins / 60);\nlet minutes = totalMins - (hours*60);\n\n// If you want strings with leading zeroes:\nminutes = String(minutes).padStart(2, \"0\");\nhours = String(hours).padStart(2, \"0\");\ntimeString = (hours + \":\" + minutes);\nreturn timeString;\n}\n\n\n// create array ready to populate\nlet StartEndArrHW = new Array(2); //to contain start and end mins since midnight\nfor (var i = 0; i < msg.period.length; i++) { //create msg.period.length of them\n StartEndArrHW[i] = new Array(2);\n}\n\n\n//now loop through each element of selected day time slots (in msg.period) to \n//make time slot info in HW TS List on dashboard AND a StartEnd time array stored and used elsewhere\nmsg.period.forEach(doit,0); //loop thru daily time slots.. init i to be 0\nfunction doit(entry,i) {\n StartEndArrHW[i][0] = entry.startTime; //store start/end times in array\n StartEndArrHW[i][1] = entry.endTime;\n \n i++; //time slot number = index+1 then create 'title' and 'description' for dashboard\n newentry = {'title' : selectedDayHW + ' (On)Time - Slot ' +i,\n 'description' : timeConv(entry.startTime) + ' - ' + timeConv(entry.endTime)\n }\n newPayload.push(newentry); //put newly created element into newPayload array\n}\n\nflow.set('StartEndArrHW', StartEndArrHW); //save start/end array\nmsg.payload=newPayload; //and put new payload into payload\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1030,"y":2540,"wires":[["145b98d9.6a5d77"]]},{"id":"164bae82.74a3b1","type":"function","z":"c9204266.8fed5","name":"newStartTime","func":"//if empty string returned from formatter, then send old StartTime with 11 characters prepended\nif (msg.payload.length === 0) {\n flow.set('newStartTimeHW', '12345678901' + flow.get('StartTimeHW'));\n msg.payload = '12345678901' + flow.get('StartTimeHW');\n}\nelse {\n flow.set('newStartTimeHW', msg.payload);\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":2020,"y":2740,"wires":[["a3174b24.c76818"]]},{"id":"145b98d9.6a5d77","type":"ui_list","z":"c9204266.8fed5","group":"4723d56a.5d74cc","name":"HW TS List","order":9,"width":4,"height":12,"lineType":"three","actionType":"click","allowHTML":true,"outputs":1,"topic":"","x":1010,"y":2620,"wires":[["38a1a489.61945c","7dbb7dfe.4b3944","25f13603.89eb5a"]]},{"id":"2731ba4b.1be876","type":"change","z":"c9204266.8fed5","name":"Restore Daily TS","rules":[{"t":"set","p":"payload","pt":"msg","to":"savedDaySlotPayloadHW","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":950,"y":2800,"wires":[["7dbb7dfe.4b3944","25f13603.89eb5a"]]},{"id":"1613d64b.ddc6ea","type":"function","z":"c9204266.8fed5","name":"newEndTime","func":"//if empty string returned from formatter, then send old EndTime with 11 characters prepended\nif (msg.payload.length === 0) {\n flow.set('newEndTimeHW', '12345678901' + flow.get('EndTimeHW'));\n msg.payload = '12345678901' + flow.get('EndTimeHW');\n}\nelse {\n flow.set('newEndTimeHW', msg.payload);\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":2010,"y":2780,"wires":[["c52b98dd.976ae8"]]},{"id":"a3174b24.c76818","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"newStartTimeHW","pt":"flow","to":"$substring(msg.payload, 11, 5)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":2230,"y":2740,"wires":[[]]},{"id":"892cd7c.2382a28","type":"ui_button","z":"c9204266.8fed5","name":"Cancel HW","group":"e22da41f.72dcc8","order":6,"width":1,"height":1,"passthru":false,"label":"Cancel","tooltip":"Cancel Time Slot Edits and Restore Previous Value","color":"","bgcolor":"","icon":"","payload":"Cancel","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":2840,"wires":[["2731ba4b.1be876","6f271345.cd18fc"]]},{"id":"c52b98dd.976ae8","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"newEndTimeHW","pt":"flow","to":"$substring(msg.payload, 11, 5)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":2230,"y":2780,"wires":[[]]},{"id":"6f271345.cd18fc","type":"ui_toast","z":"c9204266.8fed5","position":"top right","displayTime":"3","highlight":"","sendall":true,"outputs":0,"ok":"OK","cancel":"","raw":false,"topic":"","name":"Status Toast","x":1410,"y":2900,"wires":[]},{"id":"c25236d0.fb7e68","type":"switch","z":"c9204266.8fed5","name":"SAVE ERROR - No TS Selected","property":"selectTSHW","propertyType":"flow","rules":[{"t":"eq","v":"-","vt":"str"},{"t":"neq","v":"-","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":990,"y":2960,"wires":[["6f271345.cd18fc"],["dbc7ee1f.f90f9"]]},{"id":"97c8ba75.e3ca18","type":"switch","z":"c9204266.8fed5","name":"ERR - No TS Selected","property":"selectTSHW","propertyType":"flow","rules":[{"t":"neq","v":"-","vt":"str"},{"t":"eq","v":"-","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":960,"y":2900,"wires":[["7a27e891.72b008"],["6f271345.cd18fc"]]},{"id":"e7418365.cf08d","type":"switch","z":"c9204266.8fed5","name":"ERROR - 8 TS Limit","property":"TSArraySizeHW","propertyType":"flow","rules":[{"t":"gte","v":"8","vt":"num"},{"t":"lt","v":"8","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":960,"y":3020,"wires":[["6f271345.cd18fc"],["2f3cee1e.27c6e2"]]},{"id":"62be0625.0b5088","type":"change","z":"c9204266.8fed5","name":"DEL #1 Error","rules":[{"t":"set","p":"payload","pt":"msg","to":"DELETE Error - Cannot Delete Time Slot #1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1410,"y":2860,"wires":[["6f271345.cd18fc"]]},{"id":"d6e0cca6.67353","type":"change","z":"c9204266.8fed5","name":"ADD Error - Select TS Mess","rules":[{"t":"set","p":"payload","pt":"msg","to":"ADD Error - Select Day/Time Slot","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1280,"y":3080,"wires":[["6f271345.cd18fc"]]},{"id":"2cd236e.249abca","type":"ui_button","z":"c9204266.8fed5","name":"Save HW","group":"e22da41f.72dcc8","order":5,"width":1,"height":1,"passthru":false,"label":"Save","tooltip":"Save Time Slot Edits","color":"","bgcolor":"","icon":"","payload":"SAVE Error - Select Day/Timeslot","payloadType":"str","topic":"topic","topicType":"msg","x":700,"y":2960,"wires":[["c25236d0.fb7e68"]]},{"id":"dbc7ee1f.f90f9","type":"function","z":"c9204266.8fed5","name":"Save EDIT","func":"dayIndexHW = flow.get('dayIndexHW');\nHWSelTS = flow.get('savedSelectedTimeSlotHW');\nsavedSelectedDayHW = flow.get('savedSelectedDayHW');\nNET = flow.get('newEndTimeHW');\nNST = flow.get('newStartTimeHW');\n\nNETmin = NET.split(':');\nNETmin = (Number(NETmin[0]) * 60) + Number(NETmin[1]);\nNSTmin = NST.split(':');\nNSTmin = (Number(NSTmin[0]) * 60) + Number(NSTmin[1]);\nmsg.NETmin = NETmin;\nmsg.NSTmin = NSTmin;\n\nvalidCheck = true;\nerrorMess = \"OK\";\nStartEndArrHW = flow.get('StartEndArrHW');\nTSArraySizeHW = flow.get('TSArraySizeHW');\n\nselectedTSIndexHW = flow.get('selectedTSIndexHW'); //Selected TS index\n\nmsg.dayIndexHW = dayIndexHW;\nmsg.HWSelTS = HWSelTS;\nmsg.NET = NET;\nmsg.NST = NST;\n\n//carry out sanity checks on new values dependant on position within total array being edited\nif (NETmin < NSTmin ){ //firstly end time must never be less than start time\n errorMess = \"SAVE ERROR - End < Start Time\";\n}\nelse if (selectedTSIndexHW+1 ==1 && TSArraySizeHW > 1) { //first and only element being edited?\n if (NETmin > StartEndArrHW[selectedTSIndexHW+1][0] ) { //check if ET < next ST\n errorMess = \"SAVE ERROR - End Time > Next Start\";\n }\n} \nelse if (selectedTSIndexHW+1 == TSArraySizeHW && TSArraySizeHW > 1) { //last element?\n if (NSTmin < StartEndArrHW[selectedTSIndexHW-1][1]) { //check if ST < prev ET\n errorMess = \"SAVE ERROR - Start Time < Prev End\";\n }\n}\nelse if (TSArraySizeHW > 1) {\n if (NETmin > StartEndArrHW[selectedTSIndexHW+1][0] ) { //neither first nor last, so check both prev and next\n errorMess = \"SAVE ERROR - End Time > Next Start\";\n }\n if (NSTmin < StartEndArrHW[selectedTSIndexHW-1][1]) {\n errorMess = \"SAVE ERROR - Start Time < Prev End\";\n }\n}\n\nmsg.errorMess = errorMess;\n\nHWSelTS[selectedTSIndexHW]['startTime'] = NSTmin; //set selected TS starttime to new value (in mins)\nHWSelTS[selectedTSIndexHW]['endTime'] = NETmin; //similar for endtime\nsavedSelectedDayHW[dayIndexHW][1] = HWSelTS; //now insert modified array back into weekly array\n\nmsg.postHWSelTS = HWSelTS;\nmsg.payload = savedSelectedDayHW;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1510,"y":2960,"wires":[["6b517e79.08ed5"]]},{"id":"e9967461.5014c8","type":"ui_button","z":"c9204266.8fed5","name":"Del HW","group":"e22da41f.72dcc8","order":8,"width":1,"height":1,"passthru":true,"label":"Delete","tooltip":"Delete Currently Selected Time Slot (not Slot 1)","color":"","bgcolor":"","icon":"","payload":"DELETE Error - Select Day/Timeslot","payloadType":"str","topic":"topic","topicType":"msg","x":700,"y":2900,"wires":[["97c8ba75.e3ca18"]]},{"id":"7a27e891.72b008","type":"switch","z":"c9204266.8fed5","name":"ERR - Del #1","property":"selectedTSIndexHW","propertyType":"flow","rules":[{"t":"neq","v":"0","vt":"num"},{"t":"eq","v":"0","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":1210,"y":2840,"wires":[["e110d14b.19b53"],["62be0625.0b5088"]]},{"id":"59c0db95.885c64","type":"ui_button","z":"c9204266.8fed5","name":"Add HW","group":"e22da41f.72dcc8","order":7,"width":1,"height":1,"passthru":false,"label":"Add","tooltip":"Add a New Time Slot","color":"","bgcolor":"","icon":"","payload":"ADD Error - Maximum 8 Time Slots","payloadType":"str","topic":"topic","topicType":"msg","x":700,"y":3020,"wires":[["e7418365.cf08d","2f3cee1e.27c6e2"]]},{"id":"7857a4b7.e8b4fc","type":"function","z":"c9204266.8fed5","name":"ADD new TS to day array","func":"//ADD.. ie insert new TS either between 2 entries, or appended to whole daily TS array\n\nmsg.payload = flow.get('savedSelectedTimeSlotHW');\nmsg.selectedDayHW = flow.get('savedSelectedTimeSlotHW');\nmsg.selectedTSIndexHW = flow.get('selectedTSIndexHW');\n\nnewTSArray = [];\nnewDayArrayHW = [];\nselectedTSIndexHW = flow.get('selectedTSIndexHW');\nselectedDayHW = flow.get('selectedDayHW');\nStartEndArrHW = flow.get('StartEndArrHW');\nerrorMess = \"OK\";\n\ni = 0;\nmsg.mpl = msg.payload.length;\nmsg.payload.forEach(doTS);\n\nfunction doTS(TSEntry) {\n if (i != selectedTSIndexHW) { //id day index is not selected TS\n newentry = TSEntry; //then make newentry = element\n newTSArray.push(newentry); //and push onto new array\n }\n else {\n newentry = TSEntry; //then make newentry = element\n newTSArray.push(newentry); //and push onto new array\n //now make new entry values based on StartEndArrHW: values\n \n if (i==msg.payload.length -1){ //appending last entry?\n newentry = { //yes...\n startTime : (StartEndArrHW[i][1]), //previous end time\n endTime : ((24*60)-1) //new end time 1 min to midnight\n }\n newTSArray.push(newentry);\n }\n else { //inserting new TS...so\n if ( (StartEndArrHW[i+1][0]) - (StartEndArrHW[i][1]) >2 ){ //is there space for entry between two ts?\n newentry = { //yes\n startTime : (StartEndArrHW[i][1]), //previous end time\n endTime : (StartEndArrHW[i+1][0]) //next TS start time\n }\n if (((StartEndArrHW[i][1])) < 24*60 && (StartEndArrHW[i][1] +1) <24*60) {\n newTSArray.push(newentry);\n }\n else {\n errorMess = \"ADD ERROR - Time Goes Into Next Day!\"; //last time goes into next day\n }\n }\n else {\n errorMess = \"ADD ERROR - Cannot Insert Time Slot\"; //no time between slots\n }\n }\n }\n i++;\n}\n\nmsg.errorMess = errorMess;\nnewDayArrayHW = [selectedDayHW, newTSArray]; //reconstruct array for day\nmsg.newDayArrayHW = newDayArrayHW;\nflow.set('newDayArrayHW', msg.newDayArrayHW);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1550,"y":3020,"wires":[["fbfe06e3.83db88"]]},{"id":"2f3cee1e.27c6e2","type":"switch","z":"c9204266.8fed5","name":"ERROR - No TS Selected","property":"selectTSHW","propertyType":"flow","rules":[{"t":"neq","v":"-","vt":"str"},{"t":"eq","v":"-","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":970,"y":3060,"wires":[["7857a4b7.e8b4fc"],["d6e0cca6.67353"]]},{"id":"6b517e79.08ed5","type":"switch","z":"c9204266.8fed5","name":"ERR Check for OK","property":"errorMess","propertyType":"msg","rules":[{"t":"eq","v":"OK","vt":"str"},{"t":"neq","v":"OK","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1790,"y":2960,"wires":[["e3656df3.3408b","38408842.7f9db8"],["e3656df3.3408b"]]},{"id":"e110d14b.19b53","type":"function","z":"c9204266.8fed5","name":"remove TS from selected day HW","func":"//for each element of the array input, copy it into a new temp array, skipping the selected array \n//(check for array element 0 and skip that one)\n\nmsg.payload = flow.get('savedSelectedTimeSlotHW');\nmsg.selectedDay = flow.get('savedSelectedTimeSlotHW'); //eg 'Wed'\nmsg.selectedTSIndexHW = flow.get('selectedTSIndexHW');\n\nnewTSArray = [];\nnewDayArrayHW = [];\nselectedTSIndexHW = flow.get('selectedTSIndexHW'); //array index picked from list of day TS eg 4\nselectedDayHW = flow.get('selectedDayHW'); //day picked eg \"Mon\"\n\ni = 0;\nmsg.payload.forEach(doTS);\n\nfunction doTS(TSEntry) {\n if (i != selectedTSIndexHW) { //id day index is not selected TS\n newentry = TSEntry; //then make newentry = element\n newTSArray.push(newentry); //and push onto new array\n }\n i++;\n}\n\nnewDayArrayHW = [selectedDayHW, newTSArray]; //reconstruct array for day\nmsg.newDayArrayHW = newDayArrayHW;\nflow.set('newDayArrayHW', msg.newDayArrayHW);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1700,"y":2840,"wires":[["9d4e8a8d.38b6b8"]]},{"id":"fbfe06e3.83db88","type":"switch","z":"c9204266.8fed5","name":"ERR Check for OK","property":"errorMess","propertyType":"msg","rules":[{"t":"neq","v":"OK","vt":"str"},{"t":"eq","v":"OK","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1790,"y":3020,"wires":[["e3656df3.3408b"],["e3656df3.3408b","9d4e8a8d.38b6b8"]]},{"id":"e3656df3.3408b","type":"change","z":"c9204266.8fed5","name":"Set SAVE Status","rules":[{"t":"set","p":"payload","pt":"msg","to":"errorMess","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":2210,"y":3040,"wires":[["e83d245d.173708"]]},{"id":"38408842.7f9db8","type":"link out","z":"c9204266.8fed5","name":"Update HW","links":["ca8b89ab.e4aa88"],"x":2095,"y":3120,"wires":[]},{"id":"9d4e8a8d.38b6b8","type":"function","z":"c9204266.8fed5","name":"reconstruct week array","func":"dayindexHW = flow.get('dayIndexHW');\nmsg.payload = flow.get('savedSelectedDayHW');\nnewDayArrayHW = flow.get('newDayArrayHW');\n\nnewWeekArray = [];\n\ni = 0;\nmsg.payload.forEach(doDay);\n\nfunction doDay(dayEntry) {\n if (i != dayindexHW) { //id day index is not modified day\n newentry = dayEntry; //then make newentry = current\n newWeekArray.push(newentry); //and push onto new array\n }\n else {\n newentry = newDayArrayHW; //get modified day array\n newWeekArray.push(newentry); //and push onto new array\n }\n i++;\n}\n\nmsg.payload = newWeekArray;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1800,"y":3080,"wires":[["38408842.7f9db8"]]},{"id":"e83d245d.173708","type":"ui_toast","z":"c9204266.8fed5","position":"top right","displayTime":"5","highlight":"","sendall":true,"outputs":0,"ok":"OK","cancel":"","raw":false,"topic":"","name":"SAVE Status","x":2390,"y":3040,"wires":[]},{"id":"b50f7c41.fa7f","type":"comment","z":"c9204266.8fed5","name":"Update db HW ","info":"","x":2200,"y":2840,"wires":[]},{"id":"95d51bd8.119c48","type":"comment","z":"c9204266.8fed5","name":"EDIT Time Slot timers","info":"","x":1660,"y":2700,"wires":[]},{"id":"413f5cc4.8916d4","type":"comment","z":"c9204266.8fed5","name":"Update dbHW & Refresh List","info":"","x":2240,"y":3120,"wires":[]},{"id":"50b78909.6a9168","type":"comment","z":"c9204266.8fed5","name":"HW Start/End Picker","info":"","x":1470,"y":2660,"wires":[]},{"id":"d8d5e592.e19b28","type":"comment","z":"c9204266.8fed5","name":"HW Daily Time Slots","info":"","x":1230,"y":2660,"wires":[]},{"id":"29036164.f14a7e","type":"comment","z":"c9204266.8fed5","name":"Init HW Weekly Schedule","info":"","x":190,"y":2860,"wires":[]},{"id":"e693d318.b03d4","type":"inject","z":"c9204266.8fed5","name":"Init HW Objects","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":180,"y":2900,"wires":[["ad1f42c5.720f5"]]},{"id":"ad1f42c5.720f5","type":"ui_button","z":"c9204266.8fed5","name":"INIT HW","group":"4723d56a.5d74cc","order":8,"width":1,"height":1,"passthru":true,"label":"C","tooltip":"Initialise HW Time Slots to Default Values - Double tap to Activate","color":"","bgcolor":"","icon":"","payload":"open","payloadType":"str","topic":"control","topicType":"str","x":160,"y":2940,"wires":[["2ab15cf8.f71964"]]},{"id":"8fce6f88.f5e9","type":"function","z":"c9204266.8fed5","name":"Init HW Data","func":"let dayPeriod = [0,1,2,3,4,5,6,7]; // array 8 periods in a day\n\ndpLen = dayPeriod.length; //init day periods\nfor (i = 0; i < dpLen; i++) {\n dayPeriod[i] = {\n startTime : (i*120+480),\n endTime : (i*120+480) +60\n }\n}\n\nlet HWDay = [['Sun', dayPeriod],\n ['Mon', dayPeriod],\n ['Tue', dayPeriod],\n ['Wed', dayPeriod],\n ['Thu', dayPeriod],\n ['Fri', dayPeriod],\n ['Sat', dayPeriod]]; //array 7 days\n\n\nmsg.payload = HWDay; //return with whole HWDay object in msg.payload\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":370,"y":3020,"wires":[["7fe4fcba.eb9c74"]]},{"id":"7fe4fcba.eb9c74","type":"link out","z":"c9204266.8fed5","name":"Init DB HW","links":["ca8b89ab.e4aa88"],"x":495,"y":3020,"wires":[]},{"id":"29a921b3.ddebee","type":"change","z":"c9204266.8fed5","name":"set db lock (true)","rules":[{"t":"set","p":"dbWriteLockHW","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":2210,"y":2880,"wires":[["fbd6115b.3bf8e"]]},{"id":"fbd6115b.3bf8e","type":"file","z":"c9204266.8fed5","name":"Save Pive-HW","filename":"Pive-HW","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":2200,"y":2920,"wires":[["e48a0c6e.0620f"]]},{"id":"e48a0c6e.0620f","type":"change","z":"c9204266.8fed5","name":"reset db lock (false)","rules":[{"t":"set","p":"dbWriteLockHW","pt":"flow","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":2210,"y":2960,"wires":[["c01d044.f4838f8"]]},{"id":"ca8b89ab.e4aa88","type":"link in","z":"c9204266.8fed5","name":"dbWriteHW","links":["38408842.7f9db8","7fe4fcba.eb9c74"],"x":2035,"y":2880,"wires":[["29a921b3.ddebee"]]},{"id":"c01d044.f4838f8","type":"link out","z":"c9204266.8fed5","name":"DB Updated HW","links":["6e59164a.df04d8"],"x":2375,"y":2960,"wires":[]},{"id":"7d7ab378.6398fc","type":"change","z":"c9204266.8fed5","name":"extract now time","rules":[{"t":"set","p":"nowDay","pt":"flow","to":"$substring(msg.payload, 0, 3)\t","tot":"jsonata"},{"t":"set","p":"nowMins","pt":"flow","to":"($number($substring(msg.payload, 16, 2)) *60) + ($number($substring(msg.payload, 19, 2))) ","tot":"jsonata"},{"t":"set","p":"nowDay","pt":"msg","to":"$substring(msg.payload, 0, 3)\t","tot":"jsonata"},{"t":"set","p":"nowMins","pt":"msg","to":"($number($substring(msg.payload, 16, 2)) *60) + ($number($substring(msg.payload, 19, 2))) ","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":120,"y":3700,"wires":[["91f475ef.323988","ae0dd6f9.4ffe78","1b8e0cae.a2c413"]]},{"id":"1bece2d6.13859d","type":"function","z":"c9204266.8fed5","name":"get date/time","func":"msg.payload = Date(); //get date in payload ready to extract parts next...\nflow.set('SSE',(Math.round(Date.now() / 1000))) //and store time in seconds since epoch (used for BOOST)\n\nmsg.dayPart = msg.payload.substring(0, 3); //get Day part of Date in msg.dayPart\n\nlet indexDay = {'Sun': 0,\n 'Mon': 1,\n 'Tue': 2,\n 'Wed': 3,\n 'Thu': 4,\n 'Fri': 5,\n 'Sat': 6};\n \nmsg.topic = indexDay[msg.dayPart];\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":110,"y":3640,"wires":[["7d7ab378.6398fc"]]},{"id":"91f475ef.323988","type":"switch","z":"c9204266.8fed5","name":"db WR Lock?","property":"dbWriteLockHW","propertyType":"flow","rules":[{"t":"true"},{"t":"false"}],"checkall":"true","repair":false,"outputs":2,"x":360,"y":3500,"wires":[[],["b52d6d49.d69f5"]]},{"id":"801cf614.882b08","type":"inject","z":"c9204266.8fed5","name":"1 Sec Ticker","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1","crontab":"","once":true,"onceDelay":"1","topic":"","payload":"","payloadType":"date","x":120,"y":3580,"wires":[["1bece2d6.13859d"]]},{"id":"b52d6d49.d69f5","type":"file in","z":"c9204266.8fed5","name":"Read HW (2)","filename":"Pive-HW","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":350,"y":3460,"wires":[["24d15424.9cda3c"]]},{"id":"24d15424.9cda3c","type":"json","z":"c9204266.8fed5","name":"","property":"payload","action":"","pretty":false,"x":490,"y":3460,"wires":[["63dacfe4.e9a22"]]},{"id":"63dacfe4.e9a22","type":"change","z":"c9204266.8fed5","name":"get array parts","rules":[{"t":"set","p":"dbHW","pt":"flow","to":"payload","tot":"msg"},{"t":"set","p":"savedarraydayHW","pt":"flow","to":"dbHW[0][0]","tot":"flow"},{"t":"set","p":"savedarrayTSHW","pt":"flow","to":"dbHW[0][1]","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":640,"y":3460,"wires":[["1aa47516.2bf9bb"]]},{"id":"19b45cbe.661563","type":"function","z":"c9204266.8fed5","name":"TS HW on/off - inc override check ","func":"hwOVERRIDE=flow.get('overActiveHW'); //get override active - true or false\nmsg.overActiveHW = flow.get('overActiveHW');\nmsg.topic='';\nonHW = 'off';\ndbHW = flow.get('dbHW');\nnowDay = msg.nowDay;\nnowMins = msg.nowMins;\n\nif (hwOVERRIDE && nowMins >= (flow.get('overrideEndTimeHW'))){ //if override active AND time >= stored override end time\n flow.set('overActiveHW', false); //then set override false and reset all the override variables\n flow.set('overrideStartTimeHW', 0);\n flow.set('overrideEndTimeHW', 0);\n hwOVERRIDE = false;\n msg.topic = 'resetHW'; //set topic to 'resetHW'\n msg.payload = 0;\n}\n\nfor (var day = 0; day < dbHW.length; day++) { //for each element of dbHW (ie the days)\n if (dbHW[day][0]===nowDay){ //check each 'day' array element [0] for current day\n for (var ts = 0; ts < dbHW[day][1].length; ts++) { //for each element of dbHW[day][1] (ie the ts objects)\n if((nowMins >= dbHW[day][1][ts].startTime && nowMins < dbHW[day][1][ts].endTime)){\n onHW = 'heat'; //HWon true if nowMins is between>=start and <end\n }\n }\n }\n} \n\nif (hwOVERRIDE) { //override active? if so, invert onHW\n if (onHW == 'heat') {\n onHW = 'off';\n }\n else {\n onHW = 'heat';\n }\n}\nmsg.hwOVERRIDE = hwOVERRIDE;\nflow.set('StateHW', onHW);\nmsg.payload = onHW;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1220,"y":3460,"wires":[["85d5ab7f.1bea48","39e031a4.522f8e"]]},{"id":"cbc6e563.84cf28","type":"ui_led","z":"c9204266.8fed5","order":18,"group":"aaa48299.7b526","width":1,"height":1,"label":"","labelPlacement":"left","labelAlignment":"left","colorForValue":[{"color":"#ff0000","value":"off","valueType":"str"},{"color":"#008000","value":"heat","valueType":"str"}],"allowColorForValueInMessage":false,"shape":"circle","showGlow":true,"name":"HW Ctrl","x":1780,"y":1400,"wires":[]},{"id":"ae0dd6f9.4ffe78","type":"switch","z":"c9204266.8fed5","name":"db WR Lock?","property":"dbWriteLockCH","propertyType":"flow","rules":[{"t":"true"},{"t":"false"}],"checkall":"true","repair":false,"outputs":2,"x":360,"y":3940,"wires":[[],["8632a3c8.6d128"]]},{"id":"8632a3c8.6d128","type":"file in","z":"c9204266.8fed5","name":"Read CH (2)","filename":"Pive-CH","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":350,"y":3900,"wires":[["ed7f918a.94618"]]},{"id":"ed7f918a.94618","type":"json","z":"c9204266.8fed5","name":"","property":"payload","action":"","pretty":false,"x":490,"y":3900,"wires":[["829013d4.3797f"]]},{"id":"829013d4.3797f","type":"change","z":"c9204266.8fed5","name":"get array parts","rules":[{"t":"set","p":"dbCH","pt":"flow","to":"payload","tot":"msg"},{"t":"set","p":"savedarraydayCH","pt":"flow","to":"dbCH[0][0]","tot":"flow"},{"t":"set","p":"savedarrayTSCH","pt":"flow","to":"dbCH[0][1]","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":640,"y":3900,"wires":[["8b13239f.3bcd6"]]},{"id":"1905f0ee.bb84cf","type":"function","z":"c9204266.8fed5","name":"TS CH on/off - inc override check ","func":"chOVERRIDE=flow.get('overActiveCH'); //get override active - true or false\nmsg.overActiveCH = flow.get('overActiveCH');\nmsg.topic='';\nonCH = 'off';\ndbCH = flow.get('dbCH');\nnowDay = msg.nowDay;\nnowMins = msg.nowMins;\ntempSP = -1;\n\nif (chOVERRIDE && nowMins >= (flow.get('overrideEndTimeCH'))){ //if override active AND time >= stored override end time\n flow.set('overActiveCH', false); //then set override false and reset all the override variables\n flow.set('overrideStartTimeCH', 0);\n flow.set('overrideEndTimeCH', 0);\n chOVERRIDE = false;\n msg.topic = 'resetCH'; //set topic to 'resetCH'\n msg.payload = 0;\n}\n\nfor (var day = 0; day < dbCH.length; day++) { //for each element of dbCH (ie the days)\n if (dbCH[day][0]===nowDay){ //check each 'day' array element [0] for current day\n for (var ts = 0; ts < dbCH[day][1].length; ts++) { //for each element of dbCH[day][1] (ie the ts objects)\n if((nowMins >= dbCH[day][1][ts].startTime && nowMins < dbCH[day][1][ts].endTime)){\n onCH = 'heat'; //CHon true if nowMins is between>=start and <end\n tempSP = dbCH[day][1][ts].SP; //SP from TS data\n }\n }\n }\n} \n\nif (chOVERRIDE) { //override active? if so, invert onCH\n if (onCH == 'heat') {\n onCH = 'off';\n }\n else {\n onCH = 'heat';\n }\n}\nmsg.chOVERRIDE = chOVERRIDE;\nflow.set('StateCH', onCH);\nmsg.tempSP = tempSP;\nmsg.payload = onCH;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1240,"y":3920,"wires":[["8f34904a.f2ed6","f889b47c.6a4058","17cd776a.60a2f9"]]},{"id":"362fd32.eb4482c","type":"ui_led","z":"c9204266.8fed5","order":11,"group":"aaa48299.7b526","width":1,"height":1,"label":"","labelPlacement":"left","labelAlignment":"left","colorForValue":[{"color":"#ff0000","value":"off","valueType":"str"},{"color":"#008000","value":"heat","valueType":"str"}],"allowColorForValueInMessage":false,"shape":"circle","showGlow":true,"name":"CH Ctrl","x":620,"y":1400,"wires":[]},{"id":"16dd662f.b9f67a","type":"link out","z":"c9204266.8fed5","name":"Update CH","links":["c86561f1.2e2e6","4c69a920.cbacb8"],"x":2035,"y":4980,"wires":[]},{"id":"5586e23.a08801c","type":"switch","z":"c9204266.8fed5","name":"ERR Check for OK","property":"errorMess","propertyType":"msg","rules":[{"t":"neq","v":"OK","vt":"str"},{"t":"eq","v":"OK","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1730,"y":4880,"wires":[["34975b2d.e86774"],["34975b2d.e86774","6c7e62b.7f07d9c"]]},{"id":"6c7e62b.7f07d9c","type":"function","z":"c9204266.8fed5","name":"reconstruct week array","func":"dayindexCH = flow.get('dayIndexCH');\nmsg.payload = flow.get('savedSelectedDayCH');\nnewDayArrayCH = flow.get('newDayArrayCH');\nnewWeekArray = [];\n\ni = 0;\nmsg.payload.forEach(doDay);\n\nfunction doDay(dayEntry) {\n if (i != dayindexCH) { //id day index is not modified day\n newentry = dayEntry; //then make newentry = current\n newWeekArray.push(newentry); //and push onto new array\n }\n else {\n newentry = newDayArrayCH; //get modified day array\n newWeekArray.push(newentry); //and push onto new array\n }\n i++;\n}\n\nmsg.payload = newWeekArray;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1740,"y":4940,"wires":[["16dd662f.b9f67a"]]},{"id":"a4de934e.dd568","type":"switch","z":"c9204266.8fed5","name":"ERR Check for OK","property":"errorMess","propertyType":"msg","rules":[{"t":"eq","v":"OK","vt":"str"},{"t":"neq","v":"OK","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1730,"y":4820,"wires":[["34975b2d.e86774","16dd662f.b9f67a"],["34975b2d.e86774"]]},{"id":"34975b2d.e86774","type":"change","z":"c9204266.8fed5","name":"Set SAVE Status","rules":[{"t":"set","p":"payload","pt":"msg","to":"errorMess","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":2150,"y":4900,"wires":[["a0af909.cde7d7"]]},{"id":"baf61c55.c4421","type":"function","z":"c9204266.8fed5","name":"remove TS from selected day CH","func":"//for each element of the array input, copy it into a new temp array, skipping the selected array \n//(check for array element 0 and skip that one)\n\nmsg.payload = flow.get('savedSelectedTimeSlotCH');\nmsg.selectedDay = flow.get('savedSelectedTimeSlotCH'); //eg 'Wed'\nmsg.selectedTSIndexCH = flow.get('selectedTSIndexCH');\n\nnewTSArray = [];\nnewDayArrayCH = [];\nselectedTSIndexCH = flow.get('selectedTSIndexCH');\nselectedDayCH = flow.get('selectedDayCH');\n\ni = 0;\nmsg.payload.forEach(doTS);\n\nfunction doTS(TSEntry) {\n if (i != selectedTSIndexCH) { //id day index is not selected TS\n newentry = TSEntry; //then make newentry = element\n newTSArray.push(newentry); //and push onto new array\n }\n i++;\n}\n\nnewDayArrayCH = [selectedDayCH, newTSArray]; //reconstruct array for day\nmsg.newDayArrayCH = newDayArrayCH;\nflow.set('newDayArrayCH', msg.newDayArrayCH);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1640,"y":4700,"wires":[["6c7e62b.7f07d9c"]]},{"id":"a0af909.cde7d7","type":"ui_toast","z":"c9204266.8fed5","position":"top right","displayTime":"5","highlight":"","sendall":true,"outputs":0,"ok":"OK","cancel":"","raw":false,"topic":"","name":"SAVE Status","x":2330,"y":4900,"wires":[]},{"id":"2691cf2d.b4524","type":"switch","z":"c9204266.8fed5","name":"ERROR - 8 TS Limit","property":"TSArraySizeCH","propertyType":"flow","rules":[{"t":"gte","v":"8","vt":"num"},{"t":"lt","v":"8","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":900,"y":4880,"wires":[["ff1f4a52.d01138"],["15d3bfc6.28d2f"]]},{"id":"58f34ae9.77e1c4","type":"switch","z":"c9204266.8fed5","name":"ERR - Del #1","property":"selectedTSIndexCH","propertyType":"flow","rules":[{"t":"neq","v":"0","vt":"num"},{"t":"eq","v":"0","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":1150,"y":4700,"wires":[["baf61c55.c4421"],["e3968837.0e9768"]]},{"id":"8e8bf3e2.44061","type":"switch","z":"c9204266.8fed5","name":"SAVE ERROR - No TS Selected","property":"selectTSCH","propertyType":"flow","rules":[{"t":"eq","v":"-","vt":"str"},{"t":"neq","v":"-","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":930,"y":4820,"wires":[["ff1f4a52.d01138"],["cb09e009.a789b"]]},{"id":"ff1f4a52.d01138","type":"ui_toast","z":"c9204266.8fed5","position":"top right","displayTime":"3","highlight":"","sendall":true,"outputs":0,"ok":"OK","cancel":"","raw":false,"topic":"","name":"Status Toast","x":1350,"y":4760,"wires":[]},{"id":"7f0a8ed.c062a7","type":"ui_button","z":"c9204266.8fed5","name":"Add CH","group":"9adbac80.1043b","order":7,"width":1,"height":1,"passthru":false,"label":"Add","tooltip":"Add a New Time Slot","color":"","bgcolor":"","icon":"","payload":"ADD Error - Maximum 8 Time Slots","payloadType":"str","topic":"topic","topicType":"msg","x":620,"y":4880,"wires":[["2691cf2d.b4524","15d3bfc6.28d2f"]]},{"id":"e3968837.0e9768","type":"change","z":"c9204266.8fed5","name":"DEL #1 Error","rules":[{"t":"set","p":"payload","pt":"msg","to":"DELETE Error - Cannot Delete Time Slot #1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1350,"y":4720,"wires":[["ff1f4a52.d01138"]]},{"id":"9b6ec8fe.75c588","type":"switch","z":"c9204266.8fed5","name":"ERR - No TS Selected","property":"selectTSCH","propertyType":"flow","rules":[{"t":"neq","v":"-","vt":"str"},{"t":"eq","v":"-","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":900,"y":4760,"wires":[["58f34ae9.77e1c4"],["ff1f4a52.d01138"]]},{"id":"96568ddd.c78c","type":"ui_button","z":"c9204266.8fed5","name":"Save CH","group":"9adbac80.1043b","order":5,"width":1,"height":1,"passthru":false,"label":"Save","tooltip":"Save Time Slot Edits","color":"","bgcolor":"","icon":"","payload":"SAVE Error - Select Day/Timeslot","payloadType":"str","topic":"topic","topicType":"msg","x":620,"y":4820,"wires":[["8e8bf3e2.44061"]]},{"id":"f2d89fff.cee02","type":"ui_button","z":"c9204266.8fed5","name":"Cancel CH","group":"9adbac80.1043b","order":6,"width":1,"height":1,"passthru":false,"label":"Cancel","tooltip":"Cancel Time Slot Edits and Restore Previous Value","color":"","bgcolor":"","icon":"","payload":"Cancel","payloadType":"str","topic":"topic","topicType":"msg","x":630,"y":4700,"wires":[["83631478.d93b68","ff1f4a52.d01138"]]},{"id":"59408c3.2ebd274","type":"change","z":"c9204266.8fed5","name":"ADD Error - Select TS Mess","rules":[{"t":"set","p":"payload","pt":"msg","to":"ADD Error - Select Day/Time Slot","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1220,"y":4940,"wires":[["ff1f4a52.d01138"]]},{"id":"15d3bfc6.28d2f","type":"switch","z":"c9204266.8fed5","name":"ERROR - No TS Selected","property":"selectTSCH","propertyType":"flow","rules":[{"t":"neq","v":"-","vt":"str"},{"t":"eq","v":"-","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":910,"y":4920,"wires":[["615dcf52.24bc9"],["59408c3.2ebd274"]]},{"id":"aa9ebb76.0769e8","type":"ui_button","z":"c9204266.8fed5","name":"Del CH","group":"9adbac80.1043b","order":8,"width":1,"height":1,"passthru":true,"label":"Delete","tooltip":"Delete Currently Selected Time Slot (not Slot 1)","color":"","bgcolor":"","icon":"","payload":"DELETE Error - Select Day/Timeslot","payloadType":"str","topic":"topic","topicType":"msg","x":620,"y":4760,"wires":[["9b6ec8fe.75c588"]]},{"id":"83631478.d93b68","type":"change","z":"c9204266.8fed5","name":"Restore Daily TS","rules":[{"t":"set","p":"payload","pt":"msg","to":"savedDaySlotPayloadCH","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":4660,"wires":[["729e26b7.549c98","f0197fe.eaba08","90171e01.c832f"]]},{"id":"729e26b7.549c98","type":"change","z":"c9204266.8fed5","name":"CH TS Start","rules":[{"t":"set","p":"dayCH","pt":"flow","to":"payload.title","tot":"msg"},{"t":"set","p":"savedDaySlotPayloadCH","pt":"flow","to":"payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"payload.description","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"$substringAfter(msg.payload, \"On Time \")","tot":"jsonata"},{"t":"set","p":"payload","pt":"msg","to":"$substringBefore(msg.payload, \" \")","tot":"jsonata"},{"t":"set","p":"StartTimeCH","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1149,"y":4560,"wires":[["f893587e.b7a7b8"]]},{"id":"f0197fe.eaba08","type":"change","z":"c9204266.8fed5","name":"CH TS End","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.description","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"$substringAfter(msg.payload, \" - \")","tot":"jsonata"},{"t":"set","p":"payload","pt":"msg","to":"$substringBefore(msg.payload, \" \")","tot":"jsonata"},{"t":"set","p":"EndTimeCH","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1149,"y":4600,"wires":[["64f5e507.e86b8c"]]},{"id":"7cde5c03.06c8a4","type":"ui_text_input","z":"c9204266.8fed5","name":"TS Start","label":"Start","tooltip":"","group":"9adbac80.1043b","order":2,"width":4,"height":1,"passthru":true,"mode":"time","delay":"0","topic":"topic","topicType":"msg","x":1560,"y":4560,"wires":[["3bdfb1db.d90bbe"]]},{"id":"68d13436.b4bb3c","type":"ui_list","z":"c9204266.8fed5","group":"4e5fc46e.0580dc","name":"CH TS List","order":9,"width":4,"height":12,"lineType":"three","actionType":"click","allowHTML":true,"outputs":1,"topic":"","x":950,"y":4480,"wires":[["2d3336a0.f70dba","729e26b7.549c98","f0197fe.eaba08","90171e01.c832f"]]},{"id":"be849b55.596e58","type":"ui_text_input","z":"c9204266.8fed5","name":"TSEnd","label":"End","tooltip":"","group":"9adbac80.1043b","order":3,"width":4,"height":1,"passthru":true,"mode":"time","delay":"0","topic":"topic","topicType":"msg","x":1550,"y":4600,"wires":[["bdd0cc84.b2e45"]]},{"id":"3bdfb1db.d90bbe","type":"moment","z":"c9204266.8fed5","name":"secs to dte/tme","topic":"","input":"","inputType":"msg","inTz":"Europe/London","adjAmount":0,"adjType":"days","adjDir":"add","format":"","locale":"en-GB","output":"","outputType":"msg","outTz":"Europe/London","x":1740,"y":4560,"wires":[["8976f5cd.722c28"]]},{"id":"46fe9988.04e4b8","type":"function","z":"c9204266.8fed5","name":"Reset Start/End","func":"msg.payload = '00:00';\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1160,"y":4340,"wires":[["f893587e.b7a7b8","64f5e507.e86b8c"]]},{"id":"2d3336a0.f70dba","type":"change","z":"c9204266.8fed5","name":"CH Day/TS","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.title","tot":"msg"},{"t":"set","p":"selectTSCH","pt":"flow","to":"$substring(msg.payload, 20, 1)\t","tot":"jsonata"},{"t":"set","p":"selectedTSIndexCH","pt":"flow","to":"$number($substring(msg.payload, 20, 1)) -1","tot":"jsonata"},{"t":"set","p":"enabled","pt":"msg","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1150,"y":4520,"wires":[["4c46a525.da10ec"]]},{"id":"d2dbdf72.59af9","type":"function","z":"c9204266.8fed5","name":"Make CH timeslots","func":"newPayload = []; //init new Array\nflow.set('savedSelectedDayCH', msg.payload); //save whole week CH array\nflow.set('savedSelectedTimeSlotCH', msg.period); //time slot elements from day selected\nflow.set('TSArraySizeCH', msg.period.length); //save length of daily time slot selected (eg 8)\nselectedDayCH = flow.get('selectedDayCH'); //get day selected eg \"Sat\" \n\nfunction timeConv(totalMins) { //convert mins to \"hh:mm\" function\nlet hours = Math.floor(totalMins / 60);\nlet minutes = totalMins - (hours*60);\n\n// If you want strings with leading zeroes:\nminutes = String(minutes).padStart(2, \"0\");\nhours = String(hours).padStart(2, \"0\");\ntimeString = (hours + \":\" + minutes);\nreturn timeString;\n}\n\n\n// create array ready to populate\nlet StartEndArrCH = new Array(2); //to contain start and end mins since midnight\nfor (var i = 0; i < msg.period.length; i++) { //create msg.period.length of them\n StartEndArrCH[i] = new Array(2);\n}\n\n\n//now loop through each element of selected day time slots (in msg.period) to \n//make time slot info in CH TS List on dashboard AND a StartEnd time array stored and used elsewhere\nmsg.period.forEach(doit,0); //loop thru daily time slots.. init i to be 0\nfunction doit(entry,i) {\n StartEndArrCH[i][0] = entry.startTime; //store start/end times in array\n StartEndArrCH[i][1] = entry.endTime;\n StartEndArrCH[i][2] = entry.SP\n \n i++; //time slot number = index+1 then create 'title' and 'description' for dashboard\n newentry = {'title' : selectedDayCH + ' (On)Time - Slot ' +i,\n 'description' : timeConv(entry.startTime) + ' - ' + timeConv(entry.endTime) + ' Temp ' + entry.SP //note 3 spaces before Temp. Important!\n }\n newPayload.push(newentry); //put newly created element into newPayload array\n}\n\nflow.set('StartEndArrCH', StartEndArrCH); //save start/end array\nmsg.payload=newPayload; //and put new payload into payload\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":970,"y":4420,"wires":[["68d13436.b4bb3c"]]},{"id":"bdd0cc84.b2e45","type":"moment","z":"c9204266.8fed5","name":"secs to dte/tme","topic":"","input":"","inputType":"msg","inTz":"Europe/London","adjAmount":0,"adjType":"days","adjDir":"add","format":"","locale":"en-GB","output":"","outputType":"msg","outTz":"Europe/London","x":1740,"y":4600,"wires":[["4b1c7fba.f622c"]]},{"id":"8976f5cd.722c28","type":"function","z":"c9204266.8fed5","name":"newStartTime","func":"//if empty string returned from formatter, then send old StartTime with 11 characters prepended\nif (msg.payload.length === 0) {\n flow.set('newStartTimeCH', '12345678901' + flow.get('StartTimeCH'));\n msg.payload = '12345678901' + flow.get('StartTimeCH');\n}\nelse {\n flow.set('newStartTimeCH', msg.payload);\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1960,"y":4560,"wires":[["ab402478.0ad898"]]},{"id":"4f0ef8f8.02a898","type":"link in","z":"c9204266.8fed5","name":"Refresh Dashboard CH","links":["1126039.b0893fc","38d10da5.56e762"],"x":895,"y":4360,"wires":[["46fe9988.04e4b8","86abcece.691e3","842b7753.fceaf8","227d40c7.6e67e"]]},{"id":"db3a11cd.30d27","type":"change","z":"c9204266.8fed5","name":"-> weekday/dayIndexCH","rules":[{"t":"set","p":"dayIndexCH","pt":"flow","to":"dayIndexCH","tot":"msg"},{"t":"set","p":"selectedDayCH","pt":"flow","to":"dayCH","tot":"msg"},{"t":"set","p":"dbWriteLockCH","pt":"flow","to":"false","tot":"bool"},{"t":"set","p":"boostCH","pt":"flow","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":650,"y":4240,"wires":[["842b7753.fceaf8","46fe9988.04e4b8","86abcece.691e3"]]},{"id":"4c46a525.da10ec","type":"ui_text_input","z":"c9204266.8fed5","name":"Day/Time Slot","label":"Time Slot","tooltip":"","group":"9adbac80.1043b","order":1,"width":4,"height":1,"passthru":true,"mode":"text","delay":300,"topic":"topic","topicType":"msg","x":1400,"y":4520,"wires":[[]]},{"id":"814973f.c8bc59","type":"change","z":"c9204266.8fed5","name":"Mon array (1)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[1][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":700,"y":4400,"wires":[["d2dbdf72.59af9"]]},{"id":"ebeacd5f.85d","type":"change","z":"c9204266.8fed5","name":"Tue array (2)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[2][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":690,"y":4440,"wires":[["d2dbdf72.59af9"]]},{"id":"e7e02e08.542b2","type":"change","z":"c9204266.8fed5","name":"Wed array (3)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[3][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":700,"y":4480,"wires":[["d2dbdf72.59af9"]]},{"id":"40776299.ba987c","type":"change","z":"c9204266.8fed5","name":"Thu array (4)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[4][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":690,"y":4520,"wires":[["d2dbdf72.59af9"]]},{"id":"6eba2392.ebbf8c","type":"change","z":"c9204266.8fed5","name":"Fri array (5)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[5][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":690,"y":4560,"wires":[["d2dbdf72.59af9"]]},{"id":"4dbbb4c7.a009ac","type":"change","z":"c9204266.8fed5","name":"Sat array (6)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[6][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":690,"y":4600,"wires":[["d2dbdf72.59af9"]]},{"id":"db871ff1.31ab4","type":"change","z":"c9204266.8fed5","name":"Sun array (0)","rules":[{"t":"set","p":"period","pt":"msg","to":"payload[0][1]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":690,"y":4360,"wires":[["d2dbdf72.59af9"]]},{"id":"4b1c7fba.f622c","type":"function","z":"c9204266.8fed5","name":"newEndTime","func":"//if empty string returned from formatter, then send old EndTime with 11 characters prepended\nif (msg.payload.length === 0) {\n flow.set('newEndTimeCH', '12345678901' + flow.get('EndTimeCH'));\n msg.payload = '12345678901' + flow.get('EndTimeCH');\n}\nelse {\n flow.set('newEndTimeCH', msg.payload);\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1950,"y":4600,"wires":[["911651cd.ec9ed"]]},{"id":"ab402478.0ad898","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"newStartTimeCH","pt":"flow","to":"$substring(msg.payload, 11, 5)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":2170,"y":4560,"wires":[[]]},{"id":"86abcece.691e3","type":"function","z":"c9204266.8fed5","name":"Reset Timeslot Title","func":"msg.payload = '<-- Select Day/Time Slot';\nflow.set('selectTSCH', \"-\")\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1170,"y":4300,"wires":[["4c46a525.da10ec"]]},{"id":"842b7753.fceaf8","type":"file in","z":"c9204266.8fed5","name":"Read-CH (1)","filename":"Pive-CH","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":690,"y":4300,"wires":[["27abd88b.5553b8"]]},{"id":"f383c7e2.137a68","type":"switch","z":"c9204266.8fed5","name":"Switch Day of WeekCH","property":"selectedDayCH","propertyType":"flow","rules":[{"t":"eq","v":"Sun","vt":"str"},{"t":"eq","v":"Mon","vt":"str"},{"t":"eq","v":"Tue","vt":"str"},{"t":"eq","v":"Wed","vt":"str"},{"t":"eq","v":"Thu","vt":"str"},{"t":"eq","v":"Fri","vt":"str"},{"t":"eq","v":"Sat","vt":"str"}],"checkall":"true","repair":false,"outputs":7,"x":430,"y":4540,"wires":[["db871ff1.31ab4"],["814973f.c8bc59"],["ebeacd5f.85d"],["e7e02e08.542b2"],["40776299.ba987c"],["6eba2392.ebbf8c"],["4dbbb4c7.a009ac"]]},{"id":"911651cd.ec9ed","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"newEndTimeCH","pt":"flow","to":"$substring(msg.payload, 11, 5)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":2170,"y":4600,"wires":[[]]},{"id":"27abd88b.5553b8","type":"json","z":"c9204266.8fed5","name":"","property":"payload","action":"","pretty":false,"x":370,"y":4360,"wires":[["f383c7e2.137a68"]]},{"id":"99aa885e.950a08","type":"change","z":"c9204266.8fed5","name":"-> selectedDayCH/dayIndexCH","rules":[{"t":"set","p":"dayIndexCH","pt":"flow","to":"$number(msg.topic)\t","tot":"jsonata"},{"t":"set","p":"selectedDayCH","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":370,"y":4300,"wires":[["842b7753.fceaf8"]]},{"id":"578087d3.ab8fb8","type":"inject","z":"c9204266.8fed5","name":"OnInit Setup","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"0.3","topic":"resetCH","payload":"","payloadType":"date","x":110,"y":4240,"wires":[["5ed111d2.6914f","aa2233a0.fde9a"]]},{"id":"8b249343.da6cb","type":"ui_button","z":"c9204266.8fed5","name":"Sun CH","group":"4e5fc46e.0580dc","order":7,"width":1,"height":1,"passthru":true,"label":"Sun","tooltip":"Show Sunday CH Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Sun","payloadType":"str","topic":"0","topicType":"str","x":80,"y":4300,"wires":[["99aa885e.950a08"]]},{"id":"31325d8e.cfc6c2","type":"ui_button","z":"c9204266.8fed5","name":"Mon CH","group":"4e5fc46e.0580dc","order":1,"width":1,"height":1,"passthru":true,"label":"Mon","tooltip":"Show Monday CH Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Mon","payloadType":"str","topic":"1","topicType":"str","x":80,"y":4340,"wires":[["99aa885e.950a08"]]},{"id":"d29cded1.41fd5","type":"ui_button","z":"c9204266.8fed5","name":"Tue CH","group":"4e5fc46e.0580dc","order":2,"width":1,"height":1,"passthru":true,"label":"Tue","tooltip":"Show Tuesday CH Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Tue","payloadType":"str","topic":"2","topicType":"str","x":80,"y":4380,"wires":[["99aa885e.950a08"]]},{"id":"c4377e0.cec748","type":"ui_button","z":"c9204266.8fed5","name":"Wed CH","group":"4e5fc46e.0580dc","order":3,"width":1,"height":1,"passthru":true,"label":"Wed","tooltip":"Show Wednesday CH Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Wed","payloadType":"str","topic":"3","topicType":"str","x":80,"y":4420,"wires":[["99aa885e.950a08"]]},{"id":"e981386e.d47ad8","type":"ui_button","z":"c9204266.8fed5","name":"Thu CH","group":"4e5fc46e.0580dc","order":4,"width":1,"height":1,"passthru":true,"label":"Thu","tooltip":"Show Thursday CH Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Thu","payloadType":"str","topic":"4","topicType":"str","x":80,"y":4460,"wires":[["99aa885e.950a08"]]},{"id":"22ec3b8f.392184","type":"ui_button","z":"c9204266.8fed5","name":"Fri CH","group":"4e5fc46e.0580dc","order":5,"width":1,"height":1,"passthru":true,"label":"Fri","tooltip":"Show Friday CH Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Fri","payloadType":"str","topic":"5","topicType":"str","x":70,"y":4500,"wires":[["99aa885e.950a08"]]},{"id":"f5a48e7d.9e2bb","type":"comment","z":"c9204266.8fed5","name":"Update dbCH & Refresh List","info":"","x":2180,"y":4980,"wires":[]},{"id":"3f537bd0.f7f7f4","type":"comment","z":"c9204266.8fed5","name":"EDIT Time Slot timers","info":"","x":1600,"y":4520,"wires":[]},{"id":"e0ef8454.4f3988","type":"comment","z":"c9204266.8fed5","name":"CH Start/End/SP Picker","info":"","x":1420,"y":4480,"wires":[]},{"id":"7ee8c943.29c978","type":"comment","z":"c9204266.8fed5","name":"CH Time Slots","info":"","x":1150,"y":4480,"wires":[]},{"id":"214a69a4.e0d016","type":"comment","z":"c9204266.8fed5","name":"Init CH Weekly Schedule","info":"","x":190,"y":4660,"wires":[]},{"id":"81ac025b.0a274","type":"function","z":"c9204266.8fed5","name":"Init CH Data","func":"let dayPeriod = [0,1,2,3,4,5,6,7]; // array 8 periods in a day\n\ndpLen = dayPeriod.length; //init day periods\nfor (i = 0; i < dpLen; i++) {\n dayPeriod[i] = {\n startTime : (i*120+480),\n endTime : (i*120+480) +60,\n SP : \"20\"\n }\n}\n\nlet CHDay = [['Sun', dayPeriod],\n ['Mon', dayPeriod],\n ['Tue', dayPeriod],\n ['Wed', dayPeriod],\n ['Thu', dayPeriod],\n ['Fri', dayPeriod],\n ['Sat', dayPeriod]]; //array 7 days\n\n\nmsg.payload = CHDay; //return with whole HWDay object in msg.payload\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":370,"y":4820,"wires":[["9d7db47b.99a1e8"]]},{"id":"9d7db47b.99a1e8","type":"link out","z":"c9204266.8fed5","name":"Init DB CH","links":["c86561f1.2e2e6"],"x":495,"y":4820,"wires":[]},{"id":"9258731d.813e7","type":"comment","z":"c9204266.8fed5","name":"Update db CH","info":"","x":2130,"y":4680,"wires":[]},{"id":"e703e03.9d8d62","type":"change","z":"c9204266.8fed5","name":"set db lock (true)","rules":[{"t":"set","p":"dbWriteLockCH","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":2150,"y":4720,"wires":[["2c46f361.b199dc"]]},{"id":"2c46f361.b199dc","type":"file","z":"c9204266.8fed5","name":"Save Pive-CH","filename":"Pive-CH","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":2140,"y":4760,"wires":[["310c5027.440c5"]]},{"id":"310c5027.440c5","type":"change","z":"c9204266.8fed5","name":"reset db lock (false)","rules":[{"t":"set","p":"dbWriteLockCH","pt":"flow","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":2150,"y":4800,"wires":[["1126039.b0893fc"]]},{"id":"1126039.b0893fc","type":"link out","z":"c9204266.8fed5","name":"DB Updated CH","links":["4f0ef8f8.02a898"],"x":2315,"y":4800,"wires":[]},{"id":"c86561f1.2e2e6","type":"link in","z":"c9204266.8fed5","name":"dbWriteCH","links":["16dd662f.b9f67a","9d7db47b.99a1e8"],"x":1995,"y":4720,"wires":[["e703e03.9d8d62"]]},{"id":"50275d33.504984","type":"link out","z":"c9204266.8fed5","name":"ch ctrl","links":["2fa07ed6.148c72"],"x":1355,"y":4000,"wires":[]},{"id":"1525171b.b9aab9","type":"link out","z":"c9204266.8fed5","name":"hw ctrl","links":["b0b0fdef.43cb"],"x":1375,"y":3500,"wires":[]},{"id":"2fa07ed6.148c72","type":"link in","z":"c9204266.8fed5","name":"MAN CH Off/On","links":["5ec24d33.bd64c4","88060618.13d9a8","a822efa4.9f587","50275d33.504984","f2076921.71a808","1c1a8a44.438ad6","45bcdb4f.b685c4","b35c34e9.5cafc8"],"x":155,"y":1440,"wires":[["7cd71fa9.0b43b"]]},{"id":"85d5ab7f.1bea48","type":"rbe","z":"c9204266.8fed5","name":"changes","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1120,"y":3500,"wires":[["ddd6ed85.83bb3"]]},{"id":"8f34904a.f2ed6","type":"rbe","z":"c9204266.8fed5","name":"changes","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1100,"y":4000,"wires":[["fd0643f1.685b9"]]},{"id":"52953ab1.957464","type":"ui_button","z":"c9204266.8fed5","name":"","group":"e22da41f.72dcc8","order":16,"width":0,"height":0,"passthru":true,"label":"HW Override Timer","tooltip":"HW Override Current Setting - (Timer Mode Only)","color":"","bgcolor":"","icon":"","payload":"toggleHW","payloadType":"str","topic":"toggleHW","topicType":"str","x":1730,"y":3380,"wires":[["9002f1e6.97976"]]},{"id":"bab378ce.6ac668","type":"ui_led","z":"c9204266.8fed5","order":17,"group":"e22da41f.72dcc8","width":0,"height":0,"label":"Override Active:","labelPlacement":"left","labelAlignment":"left","colorForValue":[{"color":"#ff0000","value":"false","valueType":"bool"},{"color":"#008000","value":"true","valueType":"bool"}],"allowColorForValueInMessage":false,"shape":"circle","showGlow":true,"name":"HW Override Active","x":2030,"y":3460,"wires":[]},{"id":"39e031a4.522f8e","type":"function","z":"c9204266.8fed5","name":"Set/Reset HW Override","func":"let stTmHW = 0;\noverrideEndTimeHW = 0; //init override end time to 0\nstateHW=flow.get('overActiveHW'); //override active? true/false\n\nif (msg.topic=='resetHW') { //reset received in topic\n startHW = false;\n stateHW = false;\n msg.payload = 0;\n msg.topic = '';\n flow.set('overActiveHW',false);\n flow.set('overrideStartTimeHW', 0);\n flow.set('overrideEndTimeHW', 0);\n \n}\n\nelse if (msg.topic=='toggleHW'){\n if (stateHW=== false){\n stateHW = true;\n msg.payload = 1;\n flow.set('overActiveHW',true); //override active\n stTm= flow.get('nowMins'); //override start time = nowMins\n flow.set('overrideStartTimeHW',flow.get('nowMins')); //save override start time\n }\n else {\n stateHW = false;\n msg.payload = 0;\n flow.set('overActiveHW',false); //override inactive\n flow.set('overrideStartTimeHW', 0);\n flow.set('overrideEndTimeHW', 0);\n }\n}\n\n//if override active... calc and store override end time\nif (stateHW){ //if override active then calc and store stop time\n dbHW = flow.get('dbHW'); //get weekly TS array\n nowDay = flow.get('nowDay'); //current day\n nowMins = flow.get('nowMins'); //and current time since 00:00 in mins\n stTmHW = flow.get('overrideStartTimeHW');\n\n for (var day = 0; day < dbHW.length; day++) { //for each element of dbHW (ie the days)\n if (dbHW[day][0]===nowDay){ //check each 'day' array element [0] for current day\n for (var ts = 0; ts < dbHW[day][1].length; ts++) { //for each element of dbHW[day][1] (ie the ts objects)\n if((stTmHW >= dbHW[day][1][ts].startTime && stTm < dbHW[day][1][ts].endTime)){\n overrideEndTimeHW = dbHW[day][1][ts].endTime; //if start time is between start/end of a TS then TS end=override end\n }\n if((stTmHW < dbHW[day][1][ts].startTime) && (overrideEndTimeHW === 0)){\n overrideEndTimeHW = dbHW[day][1][ts].startTime; //if start time is lt start of a TS then TS start=override end\n }\n }\n }\n }\n \n if(overrideEndTimeHW === 0){\n overrideEndTimeHW = 1439; //if no end time set, then now must be after last TS, so set end=23:59\n \n }\n flow.set('overrideEndTimeHW', overrideEndTimeHW); //checked all TS slots, so store end time\n}\nmsg.payload = stateHW; //return true/false as payload to control override active led\nreturn msg;","outputs":1,"noerr":0,"initialize":"// Code added here will be run once\n// whenever the node is deployed.\nstateHW = 0;\nstart = true;\nflow.set('overActiveHW',false);","finalize":"","libs":[],"x":1750,"y":3460,"wires":[["bab378ce.6ac668","48c67d67.0fea34","21d1320.57514ce"]]},{"id":"3e9dc77c.5f0198","type":"ui_text","z":"c9204266.8fed5","group":"e22da41f.72dcc8","order":18,"width":2,"height":1,"name":"Override Start","label":"Start","format":"{{value}}","layout":"row-spread","x":2380,"y":3380,"wires":[]},{"id":"c5779f84.4f5e3","type":"ui_text","z":"c9204266.8fed5","group":"e22da41f.72dcc8","order":19,"width":2,"height":1,"name":"Override End","label":"End","format":"{{value}}","layout":"row-spread","x":2370,"y":3420,"wires":[]},{"id":"48c67d67.0fea34","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"overrideStartTimeHW","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":2020,"y":3380,"wires":[["ef90a65b.d99e08"]]},{"id":"21d1320.57514ce","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"overrideEndTimeHW","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":2020,"y":3420,"wires":[["c0694315.a3a6c"]]},{"id":"c0694315.a3a6c","type":"function","z":"c9204266.8fed5","name":"min to hh:mm","func":"function time_convert(num)\n { \n var hours = Math.floor(num / 60); \n var minutes = num % 60;\n \n // Appends 0 when unit is less than 10\n if (hours < 10) {hours = \"0\"+hours;}\n if (minutes < 10) {minutes = \"0\"+minutes;}\n \n return hours + \":\" + minutes; \n}\n\n\nif (flow.get('overActiveHW')){\n // call function\n msg.payload= time_convert(msg.payload);\n}\nelse {\n msg.payload = \"--:--\";\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":2200,"y":3420,"wires":[["c5779f84.4f5e3"]]},{"id":"ef90a65b.d99e08","type":"function","z":"c9204266.8fed5","name":"min to hh:mm","func":"function time_convert(num)\n { \n var hours = Math.floor(num / 60); \n var minutes = num % 60;\n \n // Appends 0 when unit is less than 10\n if (hours < 10) {hours = \"0\"+hours;}\n if (minutes < 10) {minutes = \"0\"+minutes;}\n \n return hours + \":\" + minutes; \n}\n\n\nif (flow.get('overActiveHW')){\n // call function\n msg.payload= time_convert(msg.payload);\n}\nelse {\n msg.payload = \"--:--\";\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":2200,"y":3380,"wires":[["3e9dc77c.5f0198"]]},{"id":"95cfdb74.d68418","type":"ui_text","z":"c9204266.8fed5","group":"9adbac80.1043b","order":18,"width":2,"height":1,"name":"Override Start","label":"Start","format":"{{value}}","layout":"row-spread","x":2380,"y":3880,"wires":[]},{"id":"22648cb1.553494","type":"function","z":"c9204266.8fed5","name":"min to hh:mm","func":"function time_convert(num)\n { \n var hours = Math.floor(num / 60); \n var minutes = num % 60;\n \n // Appends 0 when unit is less than 10\n if (hours < 10) {hours = \"0\"+hours;}\n if (minutes < 10) {minutes = \"0\"+minutes;}\n \n return hours + \":\" + minutes; \n}\n\n\nif (flow.get('overActiveCH')){\n // call function\n msg.payload= time_convert(msg.payload);\n}\nelse {\n msg.payload = \"--:--\";\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":2200,"y":3880,"wires":[["95cfdb74.d68418"]]},{"id":"e4dc3ea7.09893","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"overrideStartTimeCH","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":2020,"y":3880,"wires":[["22648cb1.553494"]]},{"id":"f889b47c.6a4058","type":"function","z":"c9204266.8fed5","name":"Set/Reset CH Override","func":"let stTmCH = 0;\noverrideEndTimeCH = 0; //init override end time to 0\nstateCH=flow.get('overActiveCH'); //override active? true/false\n\nif (msg.topic=='resetCH') { //reset received in topic\n startCH = false;\n stateCH = false;\n msg.payload = 0;\n msg.topic = '';\n flow.set('overActiveCH',false);\n flow.set('overrideStartTimeCH', 0);\n flow.set('overrideEndTimeCH', 0);\n \n}\n\nelse if (msg.topic=='toggleCH'){\n if (stateCH=== false){\n stateCH = true;\n msg.payload = 1;\n flow.set('overActiveCH',true); //override active\n stTm= flow.get('nowMins'); //override start time = nowMins\n flow.set('overrideStartTimeCH',flow.get('nowMins')); //save override start time\n }\n else {\n stateCH = false;\n msg.payload = 0;\n flow.set('overActiveCH',false); //override inactive\n flow.set('overrideStartTimeCH', 0);\n flow.set('overrideEndTimeCH', 0);\n }\n}\n\n//if override active... calc and store override end time\nif (stateCH){ //if override active then calc and store stop time\n dbCH = flow.get('dbCH'); //get weekly TS array\n nowDay = flow.get('nowDay'); //current day\n nowMins = flow.get('nowMins'); //and current time since 00:00 in mins\n stTmCH = flow.get('overrideStartTimeCH');\n\n for (var day = 0; day < dbCH.length; day++) { //for each element of dbCH (ie the days)\n if (dbCH[day][0]===nowDay){ //check each 'day' array element [0] for current day\n for (var ts = 0; ts < dbCH[day][1].length; ts++) { //for each element of dbCH[day][1] (ie the ts objects)\n if((stTmCH >= dbCH[day][1][ts].startTime && stTm < dbCH[day][1][ts].endTime)){\n overrideEndTimeCH = dbCH[day][1][ts].endTime; //if start time is between start/end of a TS then TS end=override end\n }\n if((stTmCH < dbCH[day][1][ts].startTime) && (overrideEndTimeCH === 0)){\n overrideEndTimeCH = dbCH[day][1][ts].startTime; //if start time is lt start of a TS then TS start=override end\n }\n }\n }\n }\n \n if(overrideEndTimeCH === 0){\n overrideEndTimeCH = 1439; //if no end time set, then now must be after last TS, so set end=23:59\n \n }\n flow.set('overrideEndTimeCH', overrideEndTimeCH); //checked all TS slots, so store end time\n}\nmsg.payload = stateCH; //return true/false as payload to control override active led\nreturn msg;","outputs":1,"noerr":0,"initialize":"// Code added here will be run once\n// whenever the node is deployed.\nstateCH = 0;\nstart = true;\nflow.set('overActiveCH',false);","finalize":"","libs":[],"x":1740,"y":3960,"wires":[["6790836c.b682ec","e4dc3ea7.09893","5b1a2e2b.de9eb"]]},{"id":"2916566b.5e8eea","type":"ui_button","z":"c9204266.8fed5","name":"","group":"9adbac80.1043b","order":16,"width":4,"height":1,"passthru":true,"label":"CH Override Timer","tooltip":"CH Override Current Setting - (Timer Mode Only)","color":"","bgcolor":"","icon":"","payload":"toggleCH","payloadType":"str","topic":"toggleCH","topicType":"str","x":1730,"y":3880,"wires":[["fcbf68c3.dcd0a8"]]},{"id":"6790836c.b682ec","type":"ui_led","z":"c9204266.8fed5","order":17,"group":"9adbac80.1043b","width":4,"height":1,"label":"Override Active:","labelPlacement":"left","labelAlignment":"left","colorForValue":[{"color":"#ff0000","value":"false","valueType":"bool"},{"color":"#008000","value":"true","valueType":"bool"}],"allowColorForValueInMessage":false,"shape":"circle","showGlow":true,"name":"CH Override Active","x":2030,"y":3960,"wires":[]},{"id":"5b1a2e2b.de9eb","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"overrideEndTimeCH","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":2020,"y":3920,"wires":[["27536638.8c56da"]]},{"id":"27536638.8c56da","type":"function","z":"c9204266.8fed5","name":"min to hh:mm","func":"function time_convert(num)\n { \n var hours = Math.floor(num / 60); \n var minutes = num % 60;\n \n // Appends 0 when unit is less than 10\n if (hours < 10) {hours = \"0\"+hours;}\n if (minutes < 10) {minutes = \"0\"+minutes;}\n \n return hours + \":\" + minutes; \n}\n\n\nif (flow.get('overActiveCH')){\n // call function\n msg.payload= time_convert(msg.payload);\n}\nelse {\n msg.payload = \"--:--\";\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":2200,"y":3920,"wires":[["9161dfda.bff1f"]]},{"id":"9161dfda.bff1f","type":"ui_text","z":"c9204266.8fed5","group":"9adbac80.1043b","order":19,"width":2,"height":1,"name":"Override End","label":"End","format":"{{value}}","layout":"row-spread","x":2370,"y":3920,"wires":[]},{"id":"5ed111d2.6914f","type":"function","z":"c9204266.8fed5","name":"get date/time","func":"let date = Date();\nvar DayIndex = []; \nDayIndex['Sun'] = 0;\nDayIndex['Mon'] = 1;\nDayIndex['Tue'] = 2;\nDayIndex['Wed'] = 3;\nDayIndex['Thu'] = 4;\nDayIndex['Fri'] = 5;\nDayIndex['Sat'] = 6; //'Day' , DayIndex for lookup\n \nlet day = date.substring(0, 3);\nmsg.dayIndexCH = DayIndex[day];\nmsg.dayCH = day;\nmsg.payload = date;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":4240,"wires":[["db3a11cd.30d27"]]},{"id":"cb09e009.a789b","type":"function","z":"c9204266.8fed5","name":"Save EDIT","func":"dayIndexCH = flow.get('dayIndexCH');\nCHSelTS = flow.get('savedSelectedTimeSlotCH');\nsavedSelectedDayCH = flow.get('savedSelectedDayCH');\nNET = flow.get('newEndTimeCH');\nNST = flow.get('newStartTimeCH');\nnewSP = flow.get('newSP');\n\nNETmin = NET.split(':');\nNETmin = (Number(NETmin[0]) * 60) + Number(NETmin[1]);\nNSTmin = NST.split(':');\nNSTmin = (Number(NSTmin[0]) * 60) + Number(NSTmin[1]);\nmsg.NETmin = NETmin;\nmsg.NSTmin = NSTmin;\n\nvalidCheck = true;\nerrorMess = \"OK\";\nStartEndArrCH = flow.get('StartEndArrCH');\nTSArraySizeCH = flow.get('TSArraySizeCH');\n\nselectedTSIndexCH = flow.get('selectedTSIndexCH'); //Selected TS index\n\nmsg.dayIndexCH = dayIndexCH;\nmsg.CHSelTS = CHSelTS;\nmsg.NET = NET;\nmsg.NST = NST;\n\n//carry out sanity checks on new values dependant on position within total array being edited\nif (NETmin < NSTmin ){ //firstly end time must never be less than start time\n errorMess = \"SAVE ERROR - End < Start Time\";\n}\nelse if (selectedTSIndexCH+1 ==1 && TSArraySizeCH > 1) { //first and only element being edited?\n if (NETmin > StartEndArrCH[selectedTSIndexCH+1][0] ) { //check if ET < next ST\n errorMess = \"SAVE ERROR - End Time > Next Start\";\n }\n} \nelse if (selectedTSIndexCH+1 == TSArraySizeCH && TSArraySizeCH > 1) { //last element?\n if (NSTmin < StartEndArrCH[selectedTSIndexCH-1][1]) { //check if ST < prev ET\n errorMess = \"SAVE ERROR - Start Time < Prev End\";\n }\n}\nelse if (TSArraySizeCH > 1) {\n if (NETmin > StartEndArrCH[selectedTSIndexCH+1][0] ) { //neither first nor last, so check both prev and next\n errorMess = \"SAVE ERROR - End Time > Next Start\";\n }\n if (NSTmin < StartEndArrCH[selectedTSIndexCH-1][1]) {\n errorMess = \"SAVE ERROR - Start Time < Prev End\";\n }\n}\n\nmsg.errorMess = errorMess;\n\nCHSelTS[selectedTSIndexCH]['startTime'] = NSTmin; //set selected TS starttime to new value (in mins)\nCHSelTS[selectedTSIndexCH]['endTime'] = NETmin; //similar for endtime\nCHSelTS[selectedTSIndexCH]['SP'] = newSP; //save SP\nsavedSelectedDayCH[dayIndexCH][1] = CHSelTS; //now insert modified array back into weekly array\n\nmsg.postCHSelTS = CHSelTS;\nmsg.payload = savedSelectedDayCH;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1450,"y":4820,"wires":[["a4de934e.dd568"]]},{"id":"615dcf52.24bc9","type":"function","z":"c9204266.8fed5","name":"ADD new TS to day array","func":"//ADD.. ie insert new TS either between 2 entries, or appended to whole daily TS array\n\nmsg.payload = flow.get('savedSelectedTimeSlotCH');\nmsg.selectedDayCH = flow.get('savedSelectedTimeSlotCH');\nmsg.selectedTSIndexCH = flow.get('selectedTSIndexCH');\n\nnewTSArray = [];\nnewDayArrayCH = [];\nselectedTSIndexCH = flow.get('selectedTSIndexCH');\nselectedDayCH = flow.get('selectedDayCH');\nStartEndArrCH = flow.get('StartEndArrCH');\nerrorMess = \"OK\";\n\ni = 0;\nmsg.mpl = msg.payload.length;\nmsg.payload.forEach(doTS);\n\nfunction doTS(TSEntry) {\n if (i != selectedTSIndexCH) { //id day index is not selected TS\n newentry = TSEntry; //then make newentry = element\n newTSArray.push(newentry); //and push onto new array\n }\n else {\n newentry = TSEntry; //then make newentry = element\n newTSArray.push(newentry); //and push onto new array\n //now make new entry values based on StartEndArrCH: values\n \n if (i==msg.payload.length -1){ //appending last entry?\n newentry = { //yes...\n startTime : (StartEndArrCH[i][1]), //previous end time\n endTime : ((24*60)-1), //new end time 1 min to midnight\n SP : \"20\"\n }\n newTSArray.push(newentry); \n }\n else { //inserting new TS...so\n if ( (StartEndArrCH[i+1][0]) - (StartEndArrCH[i][1]) >2 ){ //is there space for entry between two ts?\n newentry = { //yes\n startTime : (StartEndArrCH[i][1]), //previous end time\n endTime : (StartEndArrCH[i+1][0]), //next TS start time\n SP : \"20\"\n }\n if (((StartEndArrCH[i][1])) < 24*60 && (StartEndArrCH[i][1] +1) <24*60) {\n newTSArray.push(newentry);\n }\n else {\n errorMess = \"ADD ERROR - Time Goes Into Next Day!\"; //last time goes into next day\n }\n }\n else {\n errorMess = \"ADD ERROR - Cannot Insert Time Slot\"; //no time between slots\n }\n }\n }\n i++;\n}\n\nmsg.errorMess = errorMess;\nnewDayArrayCH = [selectedDayCH, newTSArray]; //reconstruct array for day\nmsg.newDayArrayCH = newDayArrayCH;\nflow.set('newDayArrayCH', msg.newDayArrayCH);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1490,"y":4880,"wires":[["5586e23.a08801c"]]},{"id":"52d9c36f.4732ac","type":"ui_media","z":"c9204266.8fed5","group":"aaa48299.7b526","name":"HW Icon","width":1,"height":1,"order":16,"category":"Images","file":"HW_On.png","layout":"center","showcontrols":true,"loop":true,"onstart":false,"scope":"local","tooltip":"","x":1620,"y":1120,"wires":[[]]},{"id":"42209ce4.06f174","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"Images/HW_Off.png","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1400,"y":1120,"wires":[["52d9c36f.4732ac"]]},{"id":"8b24f338.3024b","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"Images/HW_On.png","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1400,"y":1080,"wires":[["52d9c36f.4732ac"]]},{"id":"29ea65c2.b2f2fa","type":"switch","z":"c9204266.8fed5","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"heat","vt":"str"},{"t":"eq","v":"idle","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1150,"y":1120,"wires":[["8b24f338.3024b"],["42209ce4.06f174"]]},{"id":"6d60a79f.ef5f58","type":"ui_media","z":"c9204266.8fed5","group":"aaa48299.7b526","name":"CH Icon","width":1,"height":1,"order":9,"category":"Images","file":"HW_On.png","layout":"center","showcontrols":true,"loop":true,"onstart":false,"scope":"local","tooltip":"","x":660,"y":1120,"wires":[[]]},{"id":"70cdba69.1de714","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"Images/CH_On.png","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":1080,"wires":[["6d60a79f.ef5f58"]]},{"id":"be835146.9e01a","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"Images/CH_Off.png","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":1120,"wires":[["6d60a79f.ef5f58"]]},{"id":"626b791.ca50a88","type":"switch","z":"c9204266.8fed5","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"heat","vt":"str"},{"t":"eq","v":"idle","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":190,"y":1120,"wires":[["70cdba69.1de714"],["be835146.9e01a"]]},{"id":"deaf74cc.36ed18","type":"change","z":"c9204266.8fed5","name":"thermSP","rules":[{"t":"set","p":"thermSP","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":560,"y":820,"wires":[["f74c590a.922da8"]]},{"id":"b34bfa8.6eec508","type":"ui_switch","z":"c9204266.8fed5","name":"Man/Tmr Mode HW","label":"Man<>Timer","tooltip":"","group":"e22da41f.72dcc8","order":21,"width":3,"height":1,"passthru":true,"decouple":"false","topic":"resetHW","topicType":"str","style":"","onvalue":"tmrActiveHW","onvalueType":"str","onicon":"","oncolor":"","offvalue":"manActiveHW","offvalueType":"str","officon":"","offcolor":"","animate":false,"x":870,"y":3380,"wires":[["707fada.cddb354"]]},{"id":"131a018d.f0264e","type":"function","z":"c9204266.8fed5","name":"","func":"if (msg.payload === 'tmrActiveHW'){\n flow.set('ctrlModeHW',msg.payload);\n flow.set('modeHW','Timer');\n msg.topic = 'ctrlModeHW';\n}\nelse {\n flow.set('ctrlModeHW','manActiveHW');\n flow.set('modeHW','Manual');\n msg.topic = 'ctrlModeHW';\n msg.payload = 'manActiveHW';\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1120,"y":3420,"wires":[["700b0cd0.db72c4","9002f1e6.97976","c1c646ae.e5aca8"]]},{"id":"700b0cd0.db72c4","type":"gate","z":"c9204266.8fed5","name":"man/tmr?","controlTopic":"ctrlModeHW","defaultState":"closed","openCmd":"tmrActiveHW","closeCmd":"manActiveHW","toggleCmd":"toggle","defaultCmd":"default","statusCmd":"status","persist":true,"x":1000,"y":3460,"wires":[["19b45cbe.661563"]]},{"id":"9002f1e6.97976","type":"gate","z":"c9204266.8fed5","name":"","controlTopic":"ctrlModeHW","defaultState":"closed","openCmd":"tmrActiveHW","closeCmd":"manActiveHW","toggleCmd":"toggle","defaultCmd":"default","statusCmd":"status","persist":true,"x":1690,"y":3420,"wires":[["39e031a4.522f8e"]]},{"id":"434be547.4184bc","type":"ui_switch","z":"c9204266.8fed5","name":"Man/Tmr Mode CH","label":"Man<>Timer","tooltip":"","group":"9adbac80.1043b","order":21,"width":3,"height":1,"passthru":true,"decouple":"false","topic":"resetCH","topicType":"str","style":"","onvalue":"tmrActiveCH","onvalueType":"str","onicon":"","oncolor":"","offvalue":"manActiveCH","offvalueType":"str","officon":"","offcolor":"","animate":true,"x":870,"y":3820,"wires":[["5b1ce8ab.2b2668"]]},{"id":"2b4f21f0.e16a9e","type":"function","z":"c9204266.8fed5","name":"","func":"if (msg.payload === 'tmrActiveCH'){\n flow.set('ctrlModeCH',msg.payload);\n flow.set('modeCH','Timer');\n msg.topic = 'ctrlModeCH';\n }\nelse {\n flow.set('ctrlModeCH','manActiveCH');\n flow.set('modeCH','Manual');\n msg.topic = 'ctrlModeCH';\n msg.payload = 'manActiveCH';\n }\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1120,"y":3860,"wires":[["b61ccfbc.7a613","fcbf68c3.dcd0a8","fee52191.1747f"]]},{"id":"b61ccfbc.7a613","type":"gate","z":"c9204266.8fed5","name":"man/tmr?","controlTopic":"ctrlModeCH","defaultState":"closed","openCmd":"tmrActiveCH","closeCmd":"manActiveCH","toggleCmd":"toggle","defaultCmd":"default","statusCmd":"status","persist":true,"x":1020,"y":3920,"wires":[["1905f0ee.bb84cf"]]},{"id":"fcbf68c3.dcd0a8","type":"gate","z":"c9204266.8fed5","name":"","controlTopic":"ctrlModeCH","defaultState":"closed","openCmd":"tmrActiveCH","closeCmd":"manActiveCH","toggleCmd":"toggle","defaultCmd":"default","statusCmd":"status","persist":true,"x":1690,"y":3920,"wires":[["f889b47c.6a4058"]]},{"id":"6a2adc41.a891c4","type":"ui_media","z":"c9204266.8fed5","group":"e22da41f.72dcc8","name":"HW Mode","width":1,"height":1,"order":22,"category":"Images","file":"tmrActiveCH.png","layout":"adjust","showcontrols":true,"loop":true,"onstart":false,"scope":"local","tooltip":"","x":1420,"y":3340,"wires":[[]]},{"id":"c1c646ae.e5aca8","type":"function","z":"c9204266.8fed5","name":"set image","func":"msg.payload = \"/Images/\" + msg.payload + \".png\"\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1420,"y":3380,"wires":[["6a2adc41.a891c4"]]},{"id":"f7a86ab8.91a2b8","type":"ui_media","z":"c9204266.8fed5","group":"9adbac80.1043b","name":"CH Mode","width":1,"height":1,"order":22,"category":"Images","file":"tmrActiveCH.png","layout":"adjust","showcontrols":true,"loop":true,"onstart":false,"scope":"local","tooltip":"","x":1420,"y":3780,"wires":[[]]},{"id":"fee52191.1747f","type":"function","z":"c9204266.8fed5","name":"set image","func":"msg.payload = \"/Images/\" + msg.payload + \".png\"\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1420,"y":3820,"wires":[["f7a86ab8.91a2b8"]]},{"id":"5653b4be.e7a25c","type":"ui_button","z":"c9204266.8fed5","name":"Central Heat Control/Status","group":"aaa48299.7b526","order":7,"width":6,"height":1,"passthru":true,"label":"Central Heating Control/Status","tooltip":"Toggle CH - Off/On","color":"","bgcolor":"","icon":"","payload":"CHOnOff","payloadType":"str","topic":"toggleCH","topicType":"str","x":120,"y":1520,"wires":[["75842ea8.d026b"]]},{"id":"a9f0c202.e216","type":"ui_template","z":"c9204266.8fed5","group":"2d4355f4.616c0a","name":"Button font - 11.5px","order":0,"width":0,"height":0,"format":"<style>\n.md-button {\n font-size: 11.5px !important;\n}\n</style>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":false,"templateScope":"global","x":1650,"y":80,"wires":[[]]},{"id":"a3f4f8b9.0beef8","type":"ui_button","z":"c9204266.8fed5","name":"Mode HW","group":"e22da41f.72dcc8","order":20,"width":4,"height":1,"passthru":true,"label":"Manual On/Off - Timer Mode","tooltip":"Toggle HW Mode - Manual/Timer","color":"","bgcolor":"","icon":"","payload":"HWModeToggle","payloadType":"str","topic":"topic","topicType":"msg","x":340,"y":3380,"wires":[["283577e.c00c588"]]},{"id":"1f96b62c.057cba","type":"ui_button","z":"c9204266.8fed5","name":"Mode CH","group":"9adbac80.1043b","order":20,"width":4,"height":1,"passthru":true,"label":"Manual On/Off - Timer Mode","tooltip":"Toggle CH Mode - Manual/Timer","color":"","bgcolor":"","icon":"","payload":"CHModeToggle","payloadType":"str","topic":"topic","topicType":"msg","x":340,"y":3820,"wires":[["2325bc7d.3d8184"]]},{"id":"283577e.c00c588","type":"function","z":"c9204266.8fed5","name":"Toggle/Reset HW","func":"if (msg.topic === 'resetHW'){\n if (msg.payload === 'tmrActiveHW'){\n state = 0; //tmr switch active\n }\n else {\n state = 1; //man switch active\n }\n}\n\n\nif (msg.payload === 'HWModeToggle') {\n if(state === 0){\n state = 1;\n msg.payload = 'manActiveHW';\n }\n else {\n state = 0;\n msg.payload = 'tmrActiveHW';\n }\n}\n\nmsg.topic = '';\nreturn msg;","outputs":1,"noerr":0,"initialize":"// Code added here will be run once\n// whenever the node is deployed\nstate=0;","finalize":"","x":530,"y":3380,"wires":[["687ee658.0048a8"]]},{"id":"2325bc7d.3d8184","type":"function","z":"c9204266.8fed5","name":"Toggle/Reset CH","func":"if (msg.topic === 'resetCH'){\n if (msg.payload === 'tmrActiveCH'){\n state = 0;\n }\n else {\n state = 1;\n }\n}\n\n\n\nif (msg.payload === 'CHModeToggle') {\n if(state === 0){\n state = 1;\n msg.payload = 'manActiveCH';\n }\n else {\n state = 0;\n msg.payload = 'tmrActiveCH';\n }\n}\n\nmsg.topic = '';\nreturn msg;","outputs":1,"noerr":0,"initialize":"// Code added here will be run once\n// whenever the node is deployed\nstate=0;","finalize":"","x":530,"y":3820,"wires":[["66212864.41ae58"]]},{"id":"75842ea8.d026b","type":"function","z":"c9204266.8fed5","name":"CH State/Toggle","func":"if (msg.topic === 'offonSwitch'){\n if (msg.payload === 'off'){ //off or heat\n chstate = 0;\n } \n else {\n chstate = 1;\n }\n}\n\n\nif (msg.payload === 'CHOnOff' && msg.topic === 'toggleCH'){ //toggle state with button\n msg.topic = 'offonSwitch';\n if (chstate === 0 ){\n chstate = 1 ;\n msg.payload = 'heat';\n }\n else {\n chstate = 0;\n msg.payload = 'off';\n }\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"// Code added here will be run once\n// whenever the node is deployed","finalize":"","x":360,"y":1520,"wires":[["ca43d692.28d4e8"]]},{"id":"2ab15cf8.f71964","type":"function","z":"c9204266.8fed5","name":"","func":"const now = new Date();\nconst thisSecEpoch = Math.round(now.getTime()/1000);\n\ndiff = thisSecEpoch - prevSecEpoch\nprevSecEpoch = thisSecEpoch;\nmsg.initTimeSlotsHW = false;\nmsg.payload = \"\";\n\nif(diff >=3){\n msg.payload = \"Press Button twice within 2 seconds to initialise default Hot Water time slots\"\n msg.topic = \"INITIALISE HOT WATER TIME SLOTS\";\n ctr = 0; //reset press/click counter if activation >= 3 secs\n}\nelse {\n ctr ++;\n}\n\nif (ctr >=1) { //more than 3 presses/clicks within 3 secs\n msg.payload = \"Resetting ...\"\n msg.topic = \"INITIALISE HOT WATER TIME SLOTS\";\n msg.initTimeSlotsHW = true;\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"// Code added here will be run once\n// whenever the node is deployed.\nprevSecEpoch = 0;","finalize":"","x":160,"y":2980,"wires":[["75abf655.c7ab28","783dba4e.d64124"]]},{"id":"75abf655.c7ab28","type":"ui_toast","z":"c9204266.8fed5","position":"top right","displayTime":"6","highlight":"","sendall":true,"outputs":0,"ok":"OK","cancel":"","raw":false,"topic":"","name":"Status Toast","x":370,"y":2980,"wires":[]},{"id":"783dba4e.d64124","type":"switch","z":"c9204266.8fed5","name":"","property":"msg.initTimeSlotsHW","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":170,"y":3020,"wires":[["8fce6f88.f5e9"]]},{"id":"766a9af8.8335d4","type":"switch","z":"c9204266.8fed5","name":"","property":"msg.initTimeSlotsCH","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":170,"y":4820,"wires":[["81ac025b.0a274"]]},{"id":"344d3874.fff2b8","type":"ui_toast","z":"c9204266.8fed5","position":"top right","displayTime":"6","highlight":"","sendall":true,"outputs":0,"ok":"OK","cancel":"","raw":false,"topic":"","name":"Status Toast","x":370,"y":4780,"wires":[]},{"id":"491d8c17.2b0184","type":"ui_button","z":"c9204266.8fed5","name":"INIT CH","group":"4e5fc46e.0580dc","order":8,"width":1,"height":1,"passthru":true,"label":"C","tooltip":"Initialise CH Time Slots to Default Values - Double tap to Activate","color":"","bgcolor":"","icon":"","payload":"open","payloadType":"str","topic":"control","topicType":"str","x":160,"y":4740,"wires":[["bfe00b4f.10dd48"]]},{"id":"e023dd3b.068be","type":"inject","z":"c9204266.8fed5","name":"Init CH Objects","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":180,"y":4700,"wires":[["491d8c17.2b0184"]]},{"id":"f8ab84a3.3256c8","type":"comment","z":"c9204266.8fed5","name":"Change Dashboard BUTTON font size","info":"","x":1710,"y":40,"wires":[]},{"id":"bfe00b4f.10dd48","type":"function","z":"c9204266.8fed5","name":"","func":"const now = new Date();\nconst thisSecEpoch = Math.round(now.getTime()/1000);\n\ndiff = thisSecEpoch - prevSecEpoch\nprevSecEpoch = thisSecEpoch;\nmsg.initTimeSlotsCH = false;\nmsg.payload = \"\";\n\nif(diff >=3){\n msg.payload = \"Press Button twice within 2 seconds to initialise default Central Heating time slots\"\n msg.topic = \"INITIALISE CENTRAL HEATING TIME SLOTS\";\n ctr = 0; //reset press/click counter if activation >= 3 secs\n}\nelse {\n ctr ++;\n}\n\nif (ctr >=1) { //more than 3 presses/clicks within 3 secs\n msg.payload = \"Resetting ...\"\n msg.topic = \"INITIALISE CENTRAL HEATING TIME SLOTS\";\n msg.initTimeSlotsCH = true;\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"// Code added here will be run once\n// whenever the node is deployed.\nprevSecEpoch = 0;","finalize":"","x":162,"y":4779.60009765625,"wires":[["766a9af8.8335d4","344d3874.fff2b8"]]},{"id":"f82aeb7e.ca6348","type":"mqtt out","z":"c9204266.8fed5","name":"pub SLR Control (ie Off/On/Therm setting.. etc)","topic":"","qos":"2","retain":"true","broker":"87a36cb6.d5267","x":1580,"y":580,"wires":[],"info":"zigbee2mqtt/Boiler Controller SLR2/heat/set = topic\n\nthen set on zigbee2mqtt gui works..."},{"id":"b0b0fdef.43cb","type":"link in","z":"c9204266.8fed5","name":"MAN HW Off/On","links":["1525171b.b9aab9","5b59f692.2dca78","9c956e05.df86","c572da2c.8a2b18","c36d472e.d929d8","fed80139.bb731","67d69193.d4577"],"x":1315,"y":1440,"wires":[["e79dbe43.e402e"]]},{"id":"40cf2811.696698","type":"mqtt in","z":"c9204266.8fed5","name":"","topic":"pive2mqtt/SLRCtrl/#","qos":"2","datatype":"auto","broker":"87a36cb6.d5267","x":150,"y":700,"wires":[["dcd79859.739378"]]},{"id":"dcd79859.739378","type":"switch","z":"c9204266.8fed5","name":"","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"pive2mqtt/SLRCtrl/StateSLR","vt":"str"},{"t":"eq","v":"pive2mqtt/SLRCtrl/HWManAuto","vt":"str"},{"t":"eq","v":"pive2mqtt/SLRCtrl/CHManAuto","vt":"str"},{"t":"eq","v":"pive2mqtt/SLRCtrl/CHOffOn","vt":"str"},{"t":"eq","v":"pive2mqtt/SLRCtrl/HWOffOn","vt":"str"},{"t":"eq","v":"pive2mqtt/SLRCtrl/savedSP","vt":"str"}],"checkall":"true","repair":false,"outputs":6,"x":410,"y":720,"wires":[["49398edf.8cb6f"],["dda03d.dcb5bfc"],["b2b1cdc4.8debd"],["1b75096b.b718a7"],["7df2e90c.144668"],["deaf74cc.36ed18","f092b0b3.3ea4"]]},{"id":"c264febd.359c9","type":"link in","z":"c9204266.8fed5","name":"HWManSwitchsub","links":["dda03d.dcb5bfc","4919caa6.7e6b14","49398edf.8cb6f"],"x":1095,"y":3340,"wires":[["3f8c0218.88d45e"]]},{"id":"dda03d.dcb5bfc","type":"link out","z":"c9204266.8fed5","name":"/SLRCtrl/HWManAuto","links":["c264febd.359c9"],"x":735,"y":700,"wires":[]},{"id":"198b587.417bfa8","type":"comment","z":"c9204266.8fed5","name":"/HWManAuto","info":"","x":830,"y":700,"wires":[]},{"id":"2e17c65f.778eba","type":"comment","z":"c9204266.8fed5","name":"to HW Off/On Switch","info":"","x":1490,"y":3500,"wires":[]},{"id":"542840f7.fa218","type":"comment","z":"c9204266.8fed5","name":"pub HW off/heat to SLR","info":"","x":1960,"y":1280,"wires":[]},{"id":"11f4ecd8.84b9f3","type":"comment","z":"c9204266.8fed5","name":"pub CH off/heat to SLR","info":"","x":760,"y":1280,"wires":[]},{"id":"7a195280.11a00c","type":"comment","z":"c9204266.8fed5","name":"to CH Off/On Switch","info":"","x":1470,"y":4000,"wires":[]},{"id":"707fada.cddb354","type":"link out","z":"c9204266.8fed5","name":"HWAutoManModepub","links":["482e8e6b.1801f"],"x":995,"y":3380,"wires":[]},{"id":"482e8e6b.1801f","type":"link in","z":"c9204266.8fed5","name":"pub SLR Ctrl HW","links":["707fada.cddb354"],"x":1035,"y":580,"wires":[["7c46a667.63a3f8"]]},{"id":"7c46a667.63a3f8","type":"change","z":"c9204266.8fed5","name":"HW Man/Auto","rules":[{"t":"set","p":"topic","pt":"msg","to":"pive2mqtt/SLRCtrl/HWManAuto","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1180,"y":580,"wires":[["f82aeb7e.ca6348"]]},{"id":"3f8c0218.88d45e","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"resetHW","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1190,"y":3340,"wires":[["131a018d.f0264e","283577e.c00c588"]]},{"id":"687ee658.0048a8","type":"rbe","z":"c9204266.8fed5","name":"changes","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":700,"y":3380,"wires":[["b34bfa8.6eec508"]]},{"id":"66212864.41ae58","type":"rbe","z":"c9204266.8fed5","name":"changes","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":700,"y":3820,"wires":[["434be547.4184bc"]]},{"id":"5b1ce8ab.2b2668","type":"link out","z":"c9204266.8fed5","name":"CHAutoManModepub","links":["820ed57e.e40798"],"x":995,"y":3820,"wires":[]},{"id":"820ed57e.e40798","type":"link in","z":"c9204266.8fed5","name":"pub SLR Ctrl CH","links":["5b1ce8ab.2b2668"],"x":1035,"y":620,"wires":[["d29f7e17.47bf5"]]},{"id":"d29f7e17.47bf5","type":"change","z":"c9204266.8fed5","name":"CH Man/Auto","rules":[{"t":"set","p":"topic","pt":"msg","to":"pive2mqtt/SLRCtrl/CHManAuto","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1180,"y":620,"wires":[["f82aeb7e.ca6348"]]},{"id":"b2b1cdc4.8debd","type":"link out","z":"c9204266.8fed5","name":"/SLRCtrl/CHManAuto","links":["ad56a139.c8d53"],"x":735,"y":740,"wires":[]},{"id":"835c61c7.6267f","type":"comment","z":"c9204266.8fed5","name":"/CHManAuto","info":"","x":830,"y":740,"wires":[]},{"id":"ad56a139.c8d53","type":"link in","z":"c9204266.8fed5","name":"CHManSwitchsub","links":["b2b1cdc4.8debd","c53b60d1.75ab6"],"x":1115,"y":3780,"wires":[["138c05f.62f64fa"]]},{"id":"138c05f.62f64fa","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"resetCH","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1210,"y":3780,"wires":[["2b4f21f0.e16a9e","2325bc7d.3d8184"]]},{"id":"3853f929.4348f6","type":"comment","z":"c9204266.8fed5","name":"CH Auto/Man sub","info":"","x":1180,"y":3740,"wires":[]},{"id":"5eff07a.03bb6f8","type":"comment","z":"c9204266.8fed5","name":"HW Auto/Man sub","info":"","x":1170,"y":3300,"wires":[]},{"id":"3959db27.4b7064","type":"change","z":"c9204266.8fed5","name":"savedSP","rules":[{"t":"set","p":"topic","pt":"msg","to":"pive2mqtt/SLRCtrl/savedSP","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1160,"y":660,"wires":[["f82aeb7e.ca6348"]]},{"id":"ca43d692.28d4e8","type":"rbe","z":"c9204266.8fed5","name":"change","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":400,"y":1480,"wires":[["7cd71fa9.0b43b"]]},{"id":"261225aa.ea911a","type":"switch","z":"c9204266.8fed5","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"offline","vt":"str"},{"t":"eq","v":"online","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":210,"y":560,"wires":[["8f585ac6.846758"],["9769547c.af95c8"]]},{"id":"8f585ac6.846758","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"Images/slr2-offline.png","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":560,"wires":[["d8a0a981.4ab558"]]},{"id":"9769547c.af95c8","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"Images/slr2-online.png","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":600,"wires":[["d8a0a981.4ab558"]]},{"id":"d8a0a981.4ab558","type":"ui_media","z":"c9204266.8fed5","group":"aaa48299.7b526","name":"Hive Status Icon","width":1,"height":1,"order":3,"category":"Images","file":"HW_On.png","layout":"center","showcontrols":true,"loop":true,"onstart":false,"scope":"local","tooltip":"","x":780,"y":600,"wires":[[]]},{"id":"7c4c9067.8e48","type":"comment","z":"c9204266.8fed5","name":"Toggle HW Override","info":"","x":1730,"y":3340,"wires":[]},{"id":"23bcfb0f.7d6404","type":"comment","z":"c9204266.8fed5","name":"Toggle CH Override","info":"","x":1730,"y":3840,"wires":[]},{"id":"ebf3e768.1b53f8","type":"comment","z":"c9204266.8fed5","name":"Switch HW IP","info":"","x":1230,"y":1440,"wires":[]},{"id":"478fe920.3992d8","type":"ui_button","z":"c9204266.8fed5","name":"Hot Water Control/Status","group":"aaa48299.7b526","order":14,"width":6,"height":1,"passthru":true,"label":"Hot Water Control/Status","tooltip":"Toggle HW - Off/On","color":"","bgcolor":"","icon":"","payload":"HWOnOff","payloadType":"str","topic":"toggleHW","topicType":"str","x":1270,"y":1520,"wires":[["5215c1fd.811d8"]]},{"id":"5215c1fd.811d8","type":"function","z":"c9204266.8fed5","name":"HW State/Toggle","func":"if (msg.topic === 'offonSwitch'){\n if (msg.payload === 'off'){ //off or heat\n hwstate = 0;\n } \n else {\n hwstate = 1;\n }\n}\n\n\nif (msg.payload === 'HWOnOff' && msg.topic === 'toggleHW'){ //toggle state with button\n msg.topic = 'offonSwitch';\n if (hwstate === 0 ){\n hwstate = 1 ;\n msg.payload = 'heat';\n }\n else {\n hwstate = 0;\n msg.payload = 'off';\n }\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1510,"y":1520,"wires":[["6ea54197.28f08"]]},{"id":"2f851c75.0ef774","type":"comment","z":"c9204266.8fed5","name":"Switch CH IP","info":"","x":70,"y":1440,"wires":[]},{"id":"85e935f1.6dc438","type":"comment","z":"c9204266.8fed5","name":"Every second, check for CH/HW off or on as stored in daily on/off timeslots","info":"","x":540,"y":3600,"wires":[]},{"id":"b726163a.ddaf38","type":"comment","z":"c9204266.8fed5","name":"Override HW (in timer mode)","info":"","x":1760,"y":3500,"wires":[]},{"id":"1e41a459.fefc0c","type":"comment","z":"c9204266.8fed5","name":"Display Override start/end if override active","info":"","x":2280,"y":3460,"wires":[]},{"id":"4247d3d6.fe222c","type":"comment","z":"c9204266.8fed5","name":"SLR subscribed topics","info":"","x":740,"y":120,"wires":[]},{"id":"df5def06.d80f4","type":"comment","z":"c9204266.8fed5","name":"sub to controls, off/on/thermostat setting etc","info":"","x":230,"y":660,"wires":[]},{"id":"d6aa5697.899f98","type":"comment","z":"c9204266.8fed5","name":"Man/Tmr switch and push button toggles for CH","info":"","x":460,"y":3780,"wires":[]},{"id":"8a4f203.9df9be","type":"comment","z":"c9204266.8fed5","name":"Man/Tmr switch and push button toggles for HW","info":"","x":460,"y":3340,"wires":[]},{"id":"f71b9a52.3387e8","type":"change","z":"c9204266.8fed5","name":"HW heat","rules":[{"t":"set","p":"payload","pt":"msg","to":"heat","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":800,"y":1760,"wires":[["c572da2c.8a2b18"]]},{"id":"940fd6d7.cd72e8","type":"change","z":"c9204266.8fed5","name":"HW off","rules":[{"t":"set","p":"payload","pt":"msg","to":"off","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":790,"y":1800,"wires":[["5b59f692.2dca78"]]},{"id":"86115dca.84306","type":"change","z":"c9204266.8fed5","name":"CH heat","rules":[{"t":"set","p":"payload","pt":"msg","to":"heat","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":800,"y":1900,"wires":[["f2076921.71a808"]]},{"id":"605684e5.2fb71c","type":"change","z":"c9204266.8fed5","name":"CH off","rules":[{"t":"set","p":"payload","pt":"msg","to":"off","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":790,"y":1940,"wires":[["88060618.13d9a8"]]},{"id":"125e59e9.218996","type":"comment","z":"c9204266.8fed5","name":"/savedSP","info":"","x":820,"y":860,"wires":[]},{"id":"f74c590a.922da8","type":"link out","z":"c9204266.8fed5","name":"/SLRCtrl/savedSP","links":["b4e7d182.cf4f7"],"x":735,"y":860,"wires":[]},{"id":"e955a218.a64af","type":"link in","z":"c9204266.8fed5","name":"pub SLR savedSP","links":["fabdbec8.a42da","43e59dc.cd4a764","7fba4ced.9cb5d4","b6bd077b.8cdda8","6780031b.5e746c"],"x":1035,"y":660,"wires":[["3959db27.4b7064"]]},{"id":"1cf9e406.a3265c","type":"ui_button","z":"c9204266.8fed5","name":"Sat CH","group":"4e5fc46e.0580dc","order":6,"width":1,"height":1,"passthru":true,"label":"Sat","tooltip":"Show Saturday CH Time Slots in below list - Then Select a Time Slot to enable Edit functions","color":"","bgcolor":"","icon":"","payload":"Sat","payloadType":"str","topic":"6","topicType":"str","x":80,"y":4540,"wires":[["99aa885e.950a08"]]},{"id":"69ef7339.1cb06c","type":"change","z":"c9204266.8fed5","name":"Restore SP","rules":[{"t":"set","p":"payload","pt":"msg","to":"boostsavedSPCH","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":2190,"y":4120,"wires":[["fabdbec8.a42da"]]},{"id":"f71df704.1f9758","type":"switch","z":"c9204266.8fed5","name":"Boost End?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"}],"checkall":"true","repair":false,"outputs":1,"x":1710,"y":4120,"wires":[["69ef7339.1cb06c","5a82e550.380d6c"]]},{"id":"fabdbec8.a42da","type":"link out","z":"c9204266.8fed5","name":"boostSPCH out","links":["e955a218.a64af","d1ca1dce.c5eed"],"x":2395,"y":4160,"wires":[]},{"id":"bc555f64.2dcb2","type":"change","z":"c9204266.8fed5","name":"BoostCH Setup","rules":[{"t":"set","p":"boostSecsCH","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"SSE","tot":"flow"},{"t":"set","p":"boostTimeEndCH","pt":"flow","to":"msg.payload + msg.boostSecsCH","tot":"jsonata"},{"t":"set","p":"boostsavedSPCH","pt":"flow","to":"thermSP","tot":"flow"},{"t":"set","p":"boostCH","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":2200,"y":4200,"wires":[["f1b08f81.2891a"]]},{"id":"3069f0ed.d1fa4","type":"ui_text","z":"c9204266.8fed5","group":"9adbac80.1043b","order":15,"width":4,"height":1,"name":"Boost remaining CH","label":"Boost Time Remaining","format":"{{msg.remain}}","layout":"row-spread","x":2220,"y":4080,"wires":[]},{"id":"f20552fc.81717","type":"function","z":"c9204266.8fed5","name":"CH Boost?","func":"msg.topic='';\nonCH = 'off';\n\nboostTimeEndCH = flow.get('boostTimeEndCH');\nboostCH = flow.get('boostCH');\nboostRemainingCH = 0;\nnowsse = flow.get('SSE');\n\nif (boostCH){ //if boost is true, then\n if (nowsse < boostTimeEndCH){ //if current time is less or equal boost end time\n boostRemainingCH = boostTimeEndCH - nowsse; //boost remaining in mins\n flow.set('boostRemainingCH',boostRemainingCH);\n flow.set('boostTxtCH','Active');\n onCH = 'heat'; //heat demand\n }\n else {\n onCH = 'off'; //boost ended\n boostRemainingCH = 0; //mins remaining\n flow.set('boostCH', false); //reset boost to false\n flow.set('boostTxtCH','InActive');\n }\n}\n\nflow.set('StateCH', onCH);\nmsg.payload = onCH;\nmsg.boostRemainingCH = boostRemainingCH;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":830,"y":4080,"wires":[["f71df704.1f9758","8f34904a.f2ed6","a86f15c4.4d3608"]]},{"id":"aca1e6dd.eda998","type":"ui_button","z":"c9204266.8fed5","name":"Boost +30m","group":"9adbac80.1043b","order":11,"width":1,"height":1,"passthru":true,"label":"+ 30m","tooltip":"Activate CH Boost for 30mins","color":"","bgcolor":"","icon":"","payload":"1800","payloadType":"num","topic":"topic","topicType":"msg","x":1710,"y":4180,"wires":[["8a3af67e.027f88"]]},{"id":"ddd96f07.1e0f4","type":"comment","z":"c9204266.8fed5","name":"pub Therm SP","info":"","x":2490,"y":4160,"wires":[]},{"id":"ece4d93b.4bebf8","type":"comment","z":"c9204266.8fed5","name":"BOOST CH","info":"","x":1930,"y":4200,"wires":[]},{"id":"f1b08f81.2891a","type":"change","z":"c9204266.8fed5","name":"CH Man Active","rules":[{"t":"set","p":"savedModeCH","pt":"flow","to":"ctrlModeCH","tot":"flow"},{"t":"set","p":"topic","pt":"msg","to":"resetCH","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"manActiveCH","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2200,"y":4240,"wires":[["edbb1bb4.294db8","cee687c2.b28608"]]},{"id":"c6000bb6.e2a728","type":"link in","z":"c9204266.8fed5","name":"ManTmrModeCH","links":["edbb1bb4.294db8","6c1a0e54.732fc"],"x":375,"y":3860,"wires":[["2325bc7d.3d8184"]]},{"id":"edbb1bb4.294db8","type":"link out","z":"c9204266.8fed5","name":"BoostUpdateModeCH","links":["c6000bb6.e2a728"],"x":2395,"y":4200,"wires":[]},{"id":"10f0c877.86aa58","type":"comment","z":"c9204266.8fed5","name":"Update Mode CH","info":"","x":2500,"y":4200,"wires":[]},{"id":"5a82e550.380d6c","type":"change","z":"c9204266.8fed5","name":"Restore Mode CH","rules":[{"t":"set","p":"payload","pt":"msg","to":"savedModeCH","tot":"flow"},{"t":"set","p":"topic","pt":"msg","to":"resetCH","tot":"str"},{"t":"set","p":"boostCH","pt":"flow","to":"false","tot":"bool"},{"t":"set","p":"boostTxtCH","pt":"flow","to":"InActive","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2210,"y":4160,"wires":[["edbb1bb4.294db8"]]},{"id":"1ef294a9.e246db","type":"change","z":"c9204266.8fed5","name":"Boost SP","rules":[{"t":"set","p":"boostSPCH","pt":"msg","to":"temp","tot":"flow"},{"t":"set","p":"boostSPCH","pt":"flow","to":"msg.boostSPCH + 1","tot":"jsonata"},{"t":"set","p":"payload","pt":"msg","to":"boostSPCH","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":2180,"y":4320,"wires":[["fabdbec8.a42da"]]},{"id":"8b13239f.3bcd6","type":"switch","z":"c9204266.8fed5","name":"Boost True?","property":"boostCH","propertyType":"flow","rules":[{"t":"false"},{"t":"true"}],"checkall":"true","repair":false,"outputs":2,"x":810,"y":3900,"wires":[["b61ccfbc.7a613"],["f20552fc.81717"]]},{"id":"9d7f4c11.9fe49","type":"ui_button","z":"c9204266.8fed5","name":"Boost +60m","group":"9adbac80.1043b","order":12,"width":1,"height":1,"passthru":true,"label":"+ 60m","tooltip":"Activate CH Boost for 60mins","color":"","bgcolor":"","icon":"","payload":"3600","payloadType":"num","topic":"topic","topicType":"msg","x":1710,"y":4220,"wires":[["8a3af67e.027f88"]]},{"id":"93772b0a.a327f8","type":"ui_button","z":"c9204266.8fed5","name":"Boost Cancel","group":"9adbac80.1043b","order":14,"width":1,"height":1,"passthru":true,"label":"Cancel","tooltip":"Cancel CH Boost","color":"","bgcolor":"","icon":"","payload":"1","payloadType":"num","topic":"topic","topicType":"msg","x":1710,"y":4300,"wires":[["efad75c3.5a7e78"]]},{"id":"efad75c3.5a7e78","type":"change","z":"c9204266.8fed5","name":"Boost 0","rules":[{"t":"set","p":"boostTimeEndCH","pt":"flow","to":"SSE","tot":"flow"},{"t":"set","p":"boostTxtCH","pt":"flow","to":"InActive","tot":"str"},{"t":"set","p":"boostTimeTxtCH","pt":"flow","to":"00:00","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2180,"y":4360,"wires":[[]]},{"id":"adcfb3a2.7dd6c","type":"change","z":"c9204266.8fed5","name":"Restore Mode HW","rules":[{"t":"set","p":"payload","pt":"msg","to":"savedModeHW","tot":"flow"},{"t":"set","p":"topic","pt":"msg","to":"resetHW","tot":"str"},{"t":"set","p":"boostHW","pt":"flow","to":"false","tot":"bool"},{"t":"set","p":"boostTxtHW","pt":"flow","to":"InActive","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2210,"y":3620,"wires":[["a0d2278c.ec8a58"]]},{"id":"cb5b0912.a881c8","type":"switch","z":"c9204266.8fed5","name":"Boost End?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"}],"checkall":"true","repair":false,"outputs":1,"x":1710,"y":3620,"wires":[["adcfb3a2.7dd6c"]]},{"id":"a0d2278c.ec8a58","type":"link out","z":"c9204266.8fed5","name":"BoostUpdateModeCH","links":["4d57de5e.9561b"],"x":2395,"y":3660,"wires":[]},{"id":"f43e833f.7af21","type":"change","z":"c9204266.8fed5","name":"HW Man Active","rules":[{"t":"set","p":"savedModeHW","pt":"flow","to":"ctrlModeHW","tot":"flow"},{"t":"set","p":"topic","pt":"msg","to":"resetHW","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"manActiveHW","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2200,"y":3700,"wires":[["a0d2278c.ec8a58","14f49c3b.14ce64"]]},{"id":"aaed6bd.7a01a98","type":"ui_text","z":"c9204266.8fed5","group":"e22da41f.72dcc8","order":15,"width":4,"height":1,"name":"Boost remaining HW","label":"Boost Time Remaining","format":"{{msg.remain}}","layout":"row-spread","x":2220,"y":3580,"wires":[]},{"id":"dfdb8242.b7759","type":"ui_button","z":"c9204266.8fed5","name":"Boost +30m","group":"e22da41f.72dcc8","order":11,"width":1,"height":1,"passthru":true,"label":"+ 30m","tooltip":"Activate HW Boost for 30mins","color":"","bgcolor":"","icon":"","payload":"1800","payloadType":"num","topic":"topic","topicType":"msg","x":1710,"y":3660,"wires":[["acf28c3.7717b7"]]},{"id":"c050622a.8a685","type":"ui_button","z":"c9204266.8fed5","name":"Boost +60m","group":"e22da41f.72dcc8","order":12,"width":1,"height":1,"passthru":true,"label":"+ 60m","tooltip":"Activate HW Boost for 60mins","color":"","bgcolor":"","icon":"","payload":"3600","payloadType":"num","topic":"topic","topicType":"msg","x":1710,"y":3700,"wires":[["acf28c3.7717b7"]]},{"id":"3d0ef045.cd30c","type":"change","z":"c9204266.8fed5","name":"BoostHW Setup","rules":[{"t":"set","p":"boostSecsHW","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"SSE","tot":"flow"},{"t":"set","p":"boostTimeEndHW","pt":"flow","to":"msg.payload + msg.boostSecsHW","tot":"jsonata"},{"t":"set","p":"boostsavedSPHW","pt":"flow","to":"thermSP","tot":"flow"},{"t":"set","p":"boostHW","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":2200,"y":3660,"wires":[["f43e833f.7af21"]]},{"id":"b09d029b.d73fa","type":"comment","z":"c9204266.8fed5","name":"Update Mode HW","info":"","x":2510,"y":3660,"wires":[]},{"id":"11e72b39.d756d5","type":"comment","z":"c9204266.8fed5","name":"BOOST HW","info":"","x":1950,"y":3660,"wires":[]},{"id":"71202ba1.438544","type":"ui_button","z":"c9204266.8fed5","name":"Boost Cancel","group":"e22da41f.72dcc8","order":14,"width":1,"height":1,"passthru":true,"label":"Cancel","tooltip":"Cancel HW Boost","color":"","bgcolor":"","icon":"","payload":"1","payloadType":"num","topic":"topic","topicType":"msg","x":1710,"y":3780,"wires":[["843581ca.612cd"]]},{"id":"843581ca.612cd","type":"change","z":"c9204266.8fed5","name":"Boost 0","rules":[{"t":"set","p":"boostTimeEndHW","pt":"flow","to":"SSE","tot":"flow"},{"t":"set","p":"boostTxtHW","pt":"flow","to":"InActive","tot":"str"},{"t":"set","p":"boostTimeTxtHW","pt":"flow","to":"00:00","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2180,"y":3780,"wires":[[]]},{"id":"1432f3c3.3a130c","type":"function","z":"c9204266.8fed5","name":"HW Boost?","func":"msg.topic='';\nonHW = 'off';\n\nboostTimeEndHW = flow.get('boostTimeEndHW');\nboostHW = flow.get('boostHW');\nboostRemainingHW = 0;\nnowsse = flow.get('SSE');\n\nif (boostHW){ //if boost is true, then\n if (nowsse < boostTimeEndHW){ //if current time is less or equal boost end time\n boostRemainingHW = boostTimeEndHW - nowsse; //boost remaining in mins\n flow.set('boostRemainingHW',boostRemainingHW);\n flow.set('boostTxtHW','Active');\n onHW = 'heat'; //heat demand\n }\n else {\n onHW = 'off'; //boost ended\n boostRemainingHW = 0; //mins remaining\n flow.set('boost', false); //reset boost to false\n flow.set('boostTxtHW','InActive');\n }\n}\n\nflow.set('StateHW', onHW);\nmsg.payload = onHW;\nmsg.boostRemainingHW = boostRemainingHW;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":810,"y":3500,"wires":[["cb5b0912.a881c8","84c978d2.4c0378","85d5ab7f.1bea48"]]},{"id":"1aa47516.2bf9bb","type":"switch","z":"c9204266.8fed5","name":"Boost True?","property":"boostHW","propertyType":"flow","rules":[{"t":"false"},{"t":"true"}],"checkall":"true","repair":false,"outputs":2,"x":810,"y":3460,"wires":[["700b0cd0.db72c4"],["1432f3c3.3a130c"]]},{"id":"c2d00598.ca37f8","type":"comment","z":"c9204266.8fed5","name":"Override CH (in timer mode)","info":"","x":1760,"y":4000,"wires":[]},{"id":"a176b6f2.63de28","type":"comment","z":"c9204266.8fed5","name":"Display Override start/end if override active","info":"","x":2280,"y":3960,"wires":[]},{"id":"4d57de5e.9561b","type":"link in","z":"c9204266.8fed5","name":"ManTmrModeHW","links":["a0d2278c.ec8a58"],"x":375,"y":3420,"wires":[["283577e.c00c588"]]},{"id":"84c978d2.4c0378","type":"function","z":"c9204266.8fed5","name":"Boost Tme","func":"function time_convert(num)\n { \n var minutes = Math.floor(num / 60); \n var seconds = num % 60;\n \n // Appends 0 when unit is less than 10\n if (minutes < 10) {minutes = \"0\"+minutes;}\n if (seconds < 10) {seconds = \"0\"+seconds;}\n \n return minutes + \":\" + seconds; \n}\n\n\nmsg.remain = time_convert(msg.boostRemainingHW);\nflow.set('boostTimeTxtHW',msg.remain);\nmsg.payload = msg.boostRemainingHW;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1710,"y":3580,"wires":[["cb5b0912.a881c8","aaed6bd.7a01a98"]]},{"id":"a86f15c4.4d3608","type":"function","z":"c9204266.8fed5","name":"Boost Tme","func":"function time_convert(num)\n { \n var minutes = Math.floor(num / 60); \n var seconds = num % 60;\n \n // Appends 0 when unit is less than 10\n if (minutes < 10) {minutes = \"0\"+minutes;}\n if (seconds < 10) {seconds = \"0\"+seconds;}\n \n return minutes + \":\" + seconds; \n}\n\n\nmsg.remain = time_convert(msg.boostRemainingCH);\nflow.set('boostTimeTxtCH',msg.remain);\nmsg.payload = msg.boostRemainingCH;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1710,"y":4080,"wires":[["3069f0ed.d1fa4","f71df704.1f9758"]]},{"id":"d5bc37db.b283d8","type":"ui_button","z":"c9204266.8fed5","name":"Boost +90m","group":"e22da41f.72dcc8","order":13,"width":1,"height":1,"passthru":true,"label":"+ 90m","tooltip":"Activate HW Boost for 90mins","color":"","bgcolor":"","icon":"","payload":"5400","payloadType":"num","topic":"topic","topicType":"msg","x":1710,"y":3740,"wires":[["acf28c3.7717b7"]]},{"id":"be33d988.0356a8","type":"ui_button","z":"c9204266.8fed5","name":"Boost +90m","group":"9adbac80.1043b","order":13,"width":1,"height":1,"passthru":true,"label":"+ 90m","tooltip":"Activate CH Boost for 90mins","color":"","bgcolor":"","icon":"","payload":"5400","payloadType":"num","topic":"topic","topicType":"msg","x":1710,"y":4260,"wires":[["8a3af67e.027f88"]]},{"id":"acf28c3.7717b7","type":"switch","z":"c9204266.8fed5","name":"Boost True?","property":"boostHW","propertyType":"flow","rules":[{"t":"false"},{"t":"true"}],"checkall":"true","repair":false,"outputs":2,"x":1950,"y":3720,"wires":[["3d0ef045.cd30c"],[]]},{"id":"8a3af67e.027f88","type":"switch","z":"c9204266.8fed5","name":"Boost True?","property":"boostCH","propertyType":"flow","rules":[{"t":"false"},{"t":"true"}],"checkall":"true","repair":false,"outputs":2,"x":1930,"y":4260,"wires":[["1ef294a9.e246db","bc555f64.2dcb2"],[]]},{"id":"645897c9.f5b9b8","type":"change","z":"c9204266.8fed5","name":"payload 'heat'","rules":[{"t":"set","p":"payload","pt":"msg","to":"heat","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2040,"y":1780,"wires":[["9c956e05.df86"]]},{"id":"70f4373d.bb4f08","type":"change","z":"c9204266.8fed5","name":"payload 'off'","rules":[{"t":"set","p":"payload","pt":"msg","to":"off","tot":"str"},{"t":"set","p":"url","pt":"msg","to":"req.url","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":2030,"y":1740,"wires":[["9c956e05.df86"]]},{"id":"bc49ab52.0dba28","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"DemandCH","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":248,"y":1166,"wires":[[]]},{"id":"f118a87b.598c18","type":"change","z":"c9204266.8fed5","name":"","rules":[{"t":"set","p":"DemandHW","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1200,"y":1160,"wires":[[]]},{"id":"1b8e0cae.a2c413","type":"rbe","z":"c9204266.8fed5","name":"Check for 'Day' change","func":"rbe","gap":"","start":"","inout":"out","property":"dayPart","x":390,"y":3640,"wires":[["2ae3ae14.4e99c2"]]},{"id":"38d10da5.56e762","type":"link out","z":"c9204266.8fed5","name":"","links":["4f0ef8f8.02a898","6e59164a.df04d8"],"x":535,"y":3680,"wires":[]},{"id":"2ae3ae14.4e99c2","type":"change","z":"c9204266.8fed5","name":"Set selectedDay/dayIndex","rules":[{"t":"set","p":"selectedDayHW","pt":"flow","to":"dayPart","tot":"msg"},{"t":"set","p":"selectedDayCH","pt":"flow","to":"dayPart","tot":"msg"},{"t":"set","p":"dayIndexHW","pt":"flow","to":"topic","tot":"msg"},{"t":"set","p":"dayIndexCH","pt":"flow","to":"topic","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":390,"y":3680,"wires":[["38d10da5.56e762"]]},{"id":"606554e5.4f972c","type":"comment","z":"c9204266.8fed5","name":"Day rollover - update Time Slots","info":"","x":690,"y":3680,"wires":[]},{"id":"3b3c5ee4.39c632","type":"inject","z":"c9204266.8fed5","name":"Init Time","props":[{"p":"remain","v":"00:00","vt":"str"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payloadType":"str","x":2180,"y":3540,"wires":[["aaed6bd.7a01a98"]]},{"id":"50dafa17.b6e064","type":"inject","z":"c9204266.8fed5","name":"Init Time","props":[{"p":"remain","v":"00:00","vt":"str"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payloadType":"str","x":2180,"y":4040,"wires":[["3069f0ed.d1fa4"]]},{"id":"5c2b1670.3ee3d8","type":"change","z":"c9204266.8fed5","name":"payload 'heat'","rules":[{"t":"set","p":"payload","pt":"msg","to":"heat","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2040,"y":1840,"wires":[["a822efa4.9f587"]]},{"id":"eadd97cc.6e1e18","type":"change","z":"c9204266.8fed5","name":"payload 'off'","rules":[{"t":"set","p":"payload","pt":"msg","to":"off","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2030,"y":1880,"wires":[["a822efa4.9f587"]]},{"id":"abd5aa3a.9b0c08","type":"switch","z":"c9204266.8fed5","name":"CH Boost","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"30","vt":"str"},{"t":"eq","v":"60","vt":"str"},{"t":"eq","v":"90","vt":"str"},{"t":"eq","v":"Off","vt":"str"},{"t":"else"}],"checkall":"false","repair":false,"outputs":5,"x":340,"y":1900,"wires":[["7908c8b2.1e9488","b6f9d90.b30d728"],["12944b09.b31335","b6f9d90.b30d728"],["20eabe97.cb2702","b6f9d90.b30d728"],["32830a02.c94a46","b6f9d90.b30d728"],["282edd95.483232"]]},{"id":"d3d77325.eb058","type":"switch","z":"c9204266.8fed5","name":"HW Boost","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"30","vt":"str"},{"t":"eq","v":"60","vt":"str"},{"t":"eq","v":"90","vt":"str"},{"t":"eq","v":"Off","vt":"str"},{"t":"else"}],"checkall":"false","repair":false,"outputs":5,"x":340,"y":2140,"wires":[["ae149979.4c3508","b6f9d90.b30d728"],["956e0a14.5e4008","b6f9d90.b30d728"],["6fe980a9.b6333","b6f9d90.b30d728"],["b6f9d90.b30d728","f3aea612.5ef538"],["282edd95.483232"]]},{"id":"c20a1f74.4fea9","type":"link in","z":"c9204266.8fed5","name":"CHBoost30","links":["7908c8b2.1e9488","d84f2df0.e1edf"],"x":1615,"y":4180,"wires":[["aca1e6dd.eda998"]]},{"id":"433450a6.8f34","type":"link in","z":"c9204266.8fed5","name":"CHBoost60","links":["12944b09.b31335","126feb27.eb5cd5"],"x":1615,"y":4220,"wires":[["9d7f4c11.9fe49"]]},{"id":"df52dcbc.fa54e","type":"link in","z":"c9204266.8fed5","name":"CHBoost90","links":["20eabe97.cb2702","b01e56f4.cdcc08"],"x":1615,"y":4260,"wires":[["be33d988.0356a8"]]},{"id":"af4392e.1b0227","type":"link in","z":"c9204266.8fed5","name":"CHBoostC","links":["32830a02.c94a46","cb0e44d3.3441d8"],"x":1575,"y":4300,"wires":[["93772b0a.a327f8"]]},{"id":"8e8df0b6.c871f","type":"link in","z":"c9204266.8fed5","name":"HWBoost30","links":["ae149979.4c3508","e3f75d31.eaedf"],"x":1615,"y":3660,"wires":[["dfdb8242.b7759"]]},{"id":"acc51051.cc729","type":"link in","z":"c9204266.8fed5","name":"HWBoost60","links":["956e0a14.5e4008","9d9dd56b.2c13b8"],"x":1615,"y":3700,"wires":[["c050622a.8a685"]]},{"id":"ce3d0dd9.1dbb5","type":"link in","z":"c9204266.8fed5","name":"HWBoost90","links":["6fe980a9.b6333","9b26f5ca.fd5e08"],"x":1615,"y":3740,"wires":[["d5bc37db.b283d8"]]},{"id":"effe1b1a.1c7198","type":"link in","z":"c9204266.8fed5","name":"HWBoostC","links":["f3aea612.5ef538","f1aa91ee.31b9d"],"x":1575,"y":3780,"wires":[["71202ba1.438544"]]},{"id":"7908c8b2.1e9488","type":"link out","z":"c9204266.8fed5","name":"CH30","links":["c20a1f74.4fea9"],"x":555,"y":1920,"wires":[]},{"id":"12944b09.b31335","type":"link out","z":"c9204266.8fed5","name":"CH60","links":["433450a6.8f34"],"x":595,"y":1940,"wires":[]},{"id":"20eabe97.cb2702","type":"link out","z":"c9204266.8fed5","name":"CH90","links":["df52dcbc.fa54e"],"x":555,"y":1960,"wires":[]},{"id":"32830a02.c94a46","type":"link out","z":"c9204266.8fed5","name":"CHC","links":["af4392e.1b0227"],"x":595,"y":1980,"wires":[]},{"id":"ae149979.4c3508","type":"link out","z":"c9204266.8fed5","name":"HW30","links":["8e8df0b6.c871f"],"x":555,"y":2100,"wires":[]},{"id":"956e0a14.5e4008","type":"link out","z":"c9204266.8fed5","name":"HW60","links":["acc51051.cc729"],"x":595,"y":2120,"wires":[]},{"id":"6fe980a9.b6333","type":"link out","z":"c9204266.8fed5","name":"HW90","links":["ce3d0dd9.1dbb5"],"x":555,"y":2140,"wires":[]},{"id":"f3aea612.5ef538","type":"link out","z":"c9204266.8fed5","name":"HWC","links":["effe1b1a.1c7198"],"x":595,"y":2160,"wires":[]},{"id":"ff458ac6.067f38","type":"switch","z":"c9204266.8fed5","name":"tmrActive dev","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"HW","vt":"str"},{"t":"eq","v":"CH","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":3,"x":320,"y":2000,"wires":[["b6f9d90.b30d728","1ee6dec3.046471"],["b6f9d90.b30d728","bacc246e.22c448"],["282edd95.483232"]]},{"id":"e4bf8fd0.c48b","type":"switch","z":"c9204266.8fed5","name":"manActive dev","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"HW","vt":"str"},{"t":"eq","v":"CH","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":3,"x":320,"y":2060,"wires":[["b6f9d90.b30d728","1ee6dec3.046471"],["b6f9d90.b30d728","bacc246e.22c448"],["282edd95.483232"]]},{"id":"4919caa6.7e6b14","type":"link out","z":"c9204266.8fed5","name":"HW Man/Tmr","links":["c264febd.359c9"],"x":935,"y":2060,"wires":[]},{"id":"c53b60d1.75ab6","type":"link out","z":"c9204266.8fed5","name":"CH Man/Tmr","links":["ad56a139.c8d53"],"x":935,"y":2100,"wires":[]},{"id":"bacc246e.22c448","type":"function","z":"c9204266.8fed5","name":"CH Tmr/Man","func":"msg.payload = msg.topic.concat(msg.payload);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":810,"y":2100,"wires":[["c53b60d1.75ab6"]]},{"id":"1ee6dec3.046471","type":"function","z":"c9204266.8fed5","name":"HW Tmr/Man","func":"msg.payload = msg.topic.concat(msg.payload);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":810,"y":2060,"wires":[["4919caa6.7e6b14"]]},{"id":"7d8e31b3.cba3e","type":"comment","z":"c9204266.8fed5","name":"HTTP /cmd POST handler","info":"","x":150,"y":1640,"wires":[]},{"id":"b7452d1.2da3bd","type":"comment","z":"c9204266.8fed5","name":"HW & CH Timer/Man cmd","info":"","x":850,"y":2020,"wires":[]},{"id":"479d8063.88137","type":"comment","z":"c9204266.8fed5","name":"CH Off/On cmd","info":"","x":820,"y":1860,"wires":[]},{"id":"e64c2555.6556d8","type":"comment","z":"c9204266.8fed5","name":"HW Off/On cmd","info":"","x":820,"y":1720,"wires":[]},{"id":"2439c10c.ac300e","type":"comment","z":"c9204266.8fed5","name":"SP cmd","info":"","x":890,"y":1680,"wires":[]},{"id":"794c4376.fa3fec","type":"comment","z":"c9204266.8fed5","name":"HW Boost cmds","info":"","x":700,"y":2160,"wires":[]},{"id":"595e6008.fe3b4","type":"comment","z":"c9204266.8fed5","name":"CH Boost cmds","info":"","x":710,"y":1980,"wires":[]},{"id":"d84f2df0.e1edf","type":"link out","z":"c9204266.8fed5","name":"getCHBoost30","links":["c20a1f74.4fea9"],"x":1875,"y":1900,"wires":[]},{"id":"126feb27.eb5cd5","type":"link out","z":"c9204266.8fed5","name":"getCHBoost60","links":["433450a6.8f34"],"x":1875,"y":1940,"wires":[]},{"id":"b01e56f4.cdcc08","type":"link out","z":"c9204266.8fed5","name":"getCHBoost90","links":["df52dcbc.fa54e"],"x":1875,"y":1980,"wires":[]},{"id":"cb0e44d3.3441d8","type":"link out","z":"c9204266.8fed5","name":"getCHBoostC","links":["af4392e.1b0227"],"x":1875,"y":2020,"wires":[]},{"id":"e3f75d31.eaedf","type":"link out","z":"c9204266.8fed5","name":"getHWBoost30","links":["8e8df0b6.c871f"],"x":1875,"y":2080,"wires":[]},{"id":"9d9dd56b.2c13b8","type":"link out","z":"c9204266.8fed5","name":"getHWBoost60","links":["acc51051.cc729"],"x":1875,"y":2120,"wires":[]},{"id":"9b26f5ca.fd5e08","type":"link out","z":"c9204266.8fed5","name":"getHWBoost90","links":["ce3d0dd9.1dbb5"],"x":1875,"y":2160,"wires":[]},{"id":"f1aa91ee.31b9d","type":"link out","z":"c9204266.8fed5","name":"getHWBoostC","links":["effe1b1a.1c7198"],"x":1875,"y":2200,"wires":[]},{"id":"5f6b646c.6efefc","type":"switch","z":"c9204266.8fed5","name":"Check :cmd","property":"req.params.cmd","propertyType":"msg","rules":[{"t":"eq","v":"page","vt":"str"},{"t":"eq","v":"HWOff","vt":"str"},{"t":"eq","v":"HWOn","vt":"str"},{"t":"eq","v":"CHOn","vt":"str"},{"t":"eq","v":"CHOff","vt":"str"},{"t":"eq","v":"CHBoost30","vt":"str"},{"t":"eq","v":"CHBoost60","vt":"str"},{"t":"eq","v":"CHBoost90","vt":"str"},{"t":"eq","v":"CHBoostC","vt":"str"},{"t":"eq","v":"HWBoost30","vt":"str"},{"t":"eq","v":"HWBoost60","vt":"str"},{"t":"eq","v":"HWBoost90","vt":"str"},{"t":"eq","v":"HWBoostC","vt":"str"},{"t":"eq","v":"SP","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":15,"x":1410,"y":1840,"wires":[["44e18f6e.dc465"],["72fc0111.73118","70f4373d.bb4f08"],["72fc0111.73118","645897c9.f5b9b8"],["5c2b1670.3ee3d8","72fc0111.73118"],["72fc0111.73118","eadd97cc.6e1e18"],["d84f2df0.e1edf","72fc0111.73118"],["72fc0111.73118","126feb27.eb5cd5"],["72fc0111.73118","b01e56f4.cdcc08"],["72fc0111.73118","cb0e44d3.3441d8"],["e3f75d31.eaedf","72fc0111.73118"],["72fc0111.73118","9d9dd56b.2c13b8"],["72fc0111.73118","9b26f5ca.fd5e08"],["72fc0111.73118","f1aa91ee.31b9d"],["3242171e.9b4808"],["f7035cd3.6f918"]]},{"id":"4dd535c6.db592c","type":"comment","z":"c9204266.8fed5","name":"to CHBoost switches","info":"","x":1990,"y":1960,"wires":[]},{"id":"930e438.1448bc","type":"comment","z":"c9204266.8fed5","name":"to HWBoost switches","info":"","x":2000,"y":2140,"wires":[]},{"id":"6576486.5ed69b8","type":"catch","z":"c9204266.8fed5","name":"No HW!","scope":["bc697157.2fefc"],"uncaught":false,"x":130,"y":2820,"wires":[["2bc4c04a.1ac9d"]]},{"id":"2bc4c04a.1ac9d","type":"link out","z":"c9204266.8fed5","name":"Init HW - No file!","links":["e936f989.616008","11f82ba7.02ee14"],"x":275,"y":2820,"wires":[]},{"id":"e936f989.616008","type":"link in","z":"c9204266.8fed5","name":"Init HW file","links":["2bc4c04a.1ac9d"],"x":35,"y":2940,"wires":[["ad1f42c5.720f5"]]},{"id":"11f82ba7.02ee14","type":"link in","z":"c9204266.8fed5","name":"Init CH file","links":["2bc4c04a.1ac9d","bbe3c086.9ef9d"],"x":35,"y":4740,"wires":[["491d8c17.2b0184"]]},{"id":"bbe3c086.9ef9d","type":"link out","z":"c9204266.8fed5","name":"Init CH - No file!","links":["11f82ba7.02ee14"],"x":215,"y":4620,"wires":[]},{"id":"8759ae68.1eb34","type":"catch","z":"c9204266.8fed5","name":"No CH!","scope":["842b7753.fceaf8"],"uncaught":false,"x":130,"y":4620,"wires":[["bbe3c086.9ef9d"]]},{"id":"f2fc5ea9.134","type":"link out","z":"c9204266.8fed5","name":"Slider SP","links":["c8cb7384.48019"],"x":1415,"y":740,"wires":[]},{"id":"b4e7d182.cf4f7","type":"link in","z":"c9204266.8fed5","name":"ThermSPInput","links":["f74c590a.922da8","1fc07e54.3b10c2"],"x":1035,"y":740,"wires":[["a41a3f7e.987aa"]]},{"id":"ff265172.7cd4a","type":"switch","z":"c9204266.8fed5","name":"","property":"switchStateCH","propertyType":"flow","rules":[{"t":"eq","v":"On","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":790,"y":1360,"wires":[["5fe8e7a8.7274d8"]]},{"id":"5a398224.96148c","type":"change","z":"c9204266.8fed5","name":"CH Off/On pub","rules":[{"t":"set","p":"topic","pt":"msg","to":"pive2mqtt/SLRCtrl/CHOffOn","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1180,"y":540,"wires":[["f82aeb7e.ca6348"]]},{"id":"416559c9.b44aa8","type":"change","z":"c9204266.8fed5","name":"HW Off/On pub","rules":[{"t":"set","p":"topic","pt":"msg","to":"pive2mqtt/SLRCtrl/HWOffOn","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1180,"y":500,"wires":[["f82aeb7e.ca6348"]]},{"id":"8daa172e.5fd8d8","type":"link in","z":"c9204266.8fed5","name":"HWOffOnpub","links":["c5404e15.2b3c7"],"x":1035,"y":500,"wires":[["416559c9.b44aa8"]]},{"id":"6e4b1b45.9a1ca4","type":"link in","z":"c9204266.8fed5","name":"CHOffOnpub","links":["a1730c85.836ef"],"x":1035,"y":540,"wires":[["5a398224.96148c"]]},{"id":"a1730c85.836ef","type":"link out","z":"c9204266.8fed5","name":"","links":["6e4b1b45.9a1ca4"],"x":715,"y":1480,"wires":[]},{"id":"c5404e15.2b3c7","type":"link out","z":"c9204266.8fed5","name":"","links":["8daa172e.5fd8d8"],"x":1875,"y":1480,"wires":[]},{"id":"4d529853.767f38","type":"comment","z":"c9204266.8fed5","name":"pub HW off/heat","info":"","x":1980,"y":1480,"wires":[]},{"id":"e34e80d6.d4d69","type":"comment","z":"c9204266.8fed5","name":"pub HW off/heat","info":"","x":820,"y":1480,"wires":[]},{"id":"1b75096b.b718a7","type":"link out","z":"c9204266.8fed5","name":"/SLRCtrl/CHOffOn","links":["468df6c3.454658"],"x":735,"y":780,"wires":[]},{"id":"7df2e90c.144668","type":"link out","z":"c9204266.8fed5","name":"/SLRCtrl/HWOffOn","links":["e62eb19f.f7d34"],"x":735,"y":820,"wires":[]},{"id":"e8271b1d.596928","type":"comment","z":"c9204266.8fed5","name":"/CHOffOn","info":"","x":820,"y":780,"wires":[]},{"id":"c1e6bea8.a4261","type":"comment","z":"c9204266.8fed5","name":"/HWOffOn","info":"","x":820,"y":820,"wires":[]},{"id":"e62eb19f.f7d34","type":"link in","z":"c9204266.8fed5","name":"subHWOffOnIP","links":["7df2e90c.144668"],"x":1295,"y":1380,"wires":[["e79dbe43.e402e"]]},{"id":"468df6c3.454658","type":"link in","z":"c9204266.8fed5","name":"subHWOffOnIP","links":["1b75096b.b718a7"],"x":135,"y":1380,"wires":[["7cd71fa9.0b43b"]]},{"id":"84e68449.064018","type":"comment","z":"c9204266.8fed5","name":"sub CH IP","info":"","x":60,"y":1380,"wires":[]},{"id":"21085dc7.a59452","type":"comment","z":"c9204266.8fed5","name":"sub HW IP","info":"","x":1220,"y":1380,"wires":[]},{"id":"6ea54197.28f08","type":"rbe","z":"c9204266.8fed5","name":"change","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1560,"y":1480,"wires":[["e79dbe43.e402e"]]},{"id":"6b11b04a.0e05f","type":"rbe","z":"c9204266.8fed5","name":"change","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":620,"y":1480,"wires":[["a1730c85.836ef"]]},{"id":"fd0643f1.685b9","type":"delay","z":"c9204266.8fed5","name":"","pauseType":"delay","timeout":"500","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1250,"y":4000,"wires":[["50275d33.504984"]]},{"id":"e26068e9.0d4058","type":"rbe","z":"c9204266.8fed5","name":"change","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1780,"y":1480,"wires":[["c5404e15.2b3c7"]]},{"id":"ddd6ed85.83bb3","type":"delay","z":"c9204266.8fed5","name":"","pauseType":"delay","timeout":"500","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1270,"y":3500,"wires":[["1525171b.b9aab9"]]},{"id":"28657e30.7f63d2","type":"link out","z":"c9204266.8fed5","name":"OnInitHW","links":["5213754f.ef24ec"],"x":235,"y":2360,"wires":[]},{"id":"5213754f.ef24ec","type":"link in","z":"c9204266.8fed5","name":"InitBoostHW","links":["28657e30.7f63d2"],"x":1495,"y":3640,"wires":[["71202ba1.438544","39e031a4.522f8e"]]},{"id":"aa2233a0.fde9a","type":"link out","z":"c9204266.8fed5","name":"OnInitCH","links":["ff82120f.66cf9","1074a65.472b95a"],"x":235,"y":4200,"wires":[]},{"id":"ff82120f.66cf9","type":"link in","z":"c9204266.8fed5","name":"InitBoostCH","links":["aa2233a0.fde9a"],"x":1495,"y":4140,"wires":[["f889b47c.6a4058","93772b0a.a327f8"]]},{"id":"4e89f437.0574ec","type":"comment","z":"c9204266.8fed5","name":"Init BOOST CH","info":"","x":1480,"y":4180,"wires":[]},{"id":"9eab7c5f.a2da6","type":"comment","z":"c9204266.8fed5","name":"Init BOOST HW","info":"","x":1480,"y":3680,"wires":[]},{"id":"1b25a1.7370ca6","type":"comment","z":"c9204266.8fed5","name":"publish controls, off/on/thermostat setting etc","info":"","x":1570,"y":640,"wires":[]},{"id":"f7035cd3.6f918","type":"template","z":"c9204266.8fed5","name":"HTML ERR","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<!DOCTYPE html>\n<html>\n <head>\n <title>CMD Error</title>\n </head>\n <body> \n <h1>ERROR, BAD CMD - {{req.params.cmd}}</h1>\n <br>\n <h2>Valid Commands:-</h2>\n <h3>page \n GUI page</h3>\n <h3>SP?temp=xx Set\n Thermostat SP to xx (Range 1 to 30)</h3>\n <h3>HWOn \n Hot Water - Switch Off</h3>\n <h3>HWOn \n Hot Water - Switch Off</h3>\n <h3>CHOff \n Central Heating - Switch Off</h3>\n <h3>CHOn \n Central Heating - Switch On</h3>\n <h3>HWBoost30 Hot\n Water - 30 minute Boost</h3>\n <h3>HWBoost60 Hot\n Water - 60 minute Boost</h3>\n <h3>HWBoost90 Hot\n Water - 90 minute Boost</h3>\n <h3>HWBoostC Hot\n Water - Clear Boost</h3>\n <h3>CHBoost30 \n Central Heating - 30 minute Boost</h3>\n <h3>CHBoost60 \n Central Heating - 60 minute Boost</h3>\n <h3>CHBoost90 \n Central Heating - 90 minute Boost</h3>\n <h3>CHBoostC \n Central Heating - Clear Boost</h3>\n </body>\n</html>\n","x":1750,"y":1720,"wires":[["6f38a553.7f7f5c"]]},{"id":"c4201666.ac0928","type":"trigger","z":"c9204266.8fed5","name":"Startup timeout","op1":"startup","op2":"startupTimeout","op1type":"str","op2type":"str","duration":"3","extend":false,"overrideDelay":false,"units":"s","reset":"resetTimeout","bytopic":"all","topic":"topic","outputs":1,"x":140,"y":800,"wires":[["fded3e71.96148"]]},{"id":"1074a65.472b95a","type":"link in","z":"c9204266.8fed5","name":"initStartup","links":["aa2233a0.fde9a"],"x":35,"y":880,"wires":[["c4201666.ac0928","8aee3e9.81247c","29cf1cf2.c26174","540204b7.080a3c","26e31a00.56cf16","2694f0a9.c5141"]]},{"id":"fded3e71.96148","type":"gate","z":"c9204266.8fed5","name":"","controlTopic":"resetCH","defaultState":"closed","openCmd":"startup","closeCmd":"startupTimeout","toggleCmd":"toggle","defaultCmd":"default","statusCmd":"status","persist":false,"x":330,"y":800,"wires":[["dcd79859.739378"]]},{"id":"8aee3e9.81247c","type":"change","z":"c9204266.8fed5","name":"HWMan","rules":[{"t":"set","p":"payload","pt":"msg","to":"manActiveHW","tot":"str"},{"t":"set","p":"topic","pt":"msg","to":"pive2mqtt/SLRCtrl/HWManAuto","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":160,"y":840,"wires":[["a1ab9caa.2ecb8"]]},{"id":"a1ab9caa.2ecb8","type":"delay","z":"c9204266.8fed5","name":"Init - Delay defaults","pauseType":"delay","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":370,"y":1000,"wires":[["fded3e71.96148"]]},{"id":"f092b0b3.3ea4","type":"change","z":"c9204266.8fed5","name":"close gate on SP","rules":[{"t":"set","p":"topic","pt":"msg","to":"resetCH","tot":"str"},{"t":"set","p":"payload","pt":"msg","to":"startupTimeout","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":530,"y":880,"wires":[["fded3e71.96148"]]},{"id":"29cf1cf2.c26174","type":"change","z":"c9204266.8fed5","name":"CHMan","rules":[{"t":"set","p":"payload","pt":"msg","to":"manActiveCH","tot":"str"},{"t":"set","p":"topic","pt":"msg","to":"pive2mqtt/SLRCtrl/CHManAuto","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":160,"y":880,"wires":[["a1ab9caa.2ecb8"]]},{"id":"26e31a00.56cf16","type":"change","z":"c9204266.8fed5","name":"HWOff","rules":[{"t":"set","p":"payload","pt":"msg","to":"off","tot":"str"},{"t":"set","p":"topic","pt":"msg","to":"pive2mqtt/SLRCtrl/HWOffOn","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":150,"y":960,"wires":[["a1ab9caa.2ecb8"]]},{"id":"540204b7.080a3c","type":"change","z":"c9204266.8fed5","name":"CHOff","rules":[{"t":"set","p":"payload","pt":"msg","to":"off","tot":"str"},{"t":"set","p":"topic","pt":"msg","to":"pive2mqtt/SLRCtrl/CHOffOn","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":150,"y":920,"wires":[["a1ab9caa.2ecb8"]]},{"id":"2694f0a9.c5141","type":"change","z":"c9204266.8fed5","name":"SP","rules":[{"t":"set","p":"payload","pt":"msg","to":"18","tot":"str"},{"t":"set","p":"topic","pt":"msg","to":"pive2mqtt/SLRCtrl/savedSP","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":150,"y":1000,"wires":[["a1ab9caa.2ecb8"]]},{"id":"932d6f8.3f0479","type":"comment","z":"c9204266.8fed5","name":"setup SLR default control values and publish if no values received on start","info":"","x":520,"y":920,"wires":[]},{"id":"cee687c2.b28608","type":"change","z":"c9204266.8fed5","name":"CH On","rules":[{"t":"set","p":"payload","pt":"msg","to":"heat","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2170,"y":4280,"wires":[["b35c34e9.5cafc8"]]},{"id":"b35c34e9.5cafc8","type":"link out","z":"c9204266.8fed5","name":"BoostUpdateCHON","links":["2fa07ed6.148c72"],"x":2395,"y":4280,"wires":[]},{"id":"babc4d8e.52c45","type":"comment","z":"c9204266.8fed5","name":"Update Off/On CH","info":"","x":2510,"y":4280,"wires":[]},{"id":"14f49c3b.14ce64","type":"change","z":"c9204266.8fed5","name":"HW On","rules":[{"t":"set","p":"payload","pt":"msg","to":"heat","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2180,"y":3740,"wires":[["67d69193.d4577"]]},{"id":"67d69193.d4577","type":"link out","z":"c9204266.8fed5","name":"BoostUpdateHWON","links":["b0b0fdef.43cb"],"x":2395,"y":3740,"wires":[]},{"id":"74618e9.c11377","type":"comment","z":"c9204266.8fed5","name":"Update Off/On HW","info":"","x":2510,"y":3740,"wires":[]},{"id":"2f8fe8c6.d6bea8","type":"change","z":"c9204266.8fed5","name":"Create Thermostat Payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"thermSP","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":580,"y":1360,"wires":[["ff265172.7cd4a"]]},{"id":"3242171e.9b4808","type":"switch","z":"c9204266.8fed5","name":"SP - temp 1 to 30?","property":"payload.temp","propertyType":"msg","rules":[{"t":"btwn","v":"1","vt":"num","v2":"30","v2t":"num"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":1350,"y":2080,"wires":[["61b51b2.3bccfe4","72fc0111.73118"],["ecf9dde2.7b5fc"]]},{"id":"ecf9dde2.7b5fc","type":"template","z":"c9204266.8fed5","name":"SP temp ERR","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n <head></head>\n <body>\n <h1>SP ERR</h1>\n </body>\n</html>","x":1580,"y":2100,"wires":[["6f38a553.7f7f5c"]]},{"id":"61b51b2.3bccfe4","type":"change","z":"c9204266.8fed5","name":"temp to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.temp","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1360,"y":2140,"wires":[["6780031b.5e746c"]]},{"id":"6780031b.5e746c","type":"link out","z":"c9204266.8fed5","name":"/SP Get Out","links":["e955a218.a64af"],"x":1495,"y":2140,"wires":[]},{"id":"9df6b3f9.3dac5","type":"comment","z":"c9204266.8fed5","name":"to saved SP","info":"","x":1590,"y":2140,"wires":[]},{"id":"25550fbf.222f7","type":"change","z":"c9204266.8fed5","name":"SLR State pub","rules":[{"t":"set","p":"topic","pt":"msg","to":"pive2mqtt/SLRCtrl/StateSLR","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1180,"y":460,"wires":[["f82aeb7e.ca6348"]]},{"id":"68d055a1.7e9b1c","type":"link in","z":"c9204266.8fed5","name":"StateSLRpub","links":["4e833006.be165"],"x":1035,"y":460,"wires":[["25550fbf.222f7"]]},{"id":"4e833006.be165","type":"link out","z":"c9204266.8fed5","name":"StateSLR","links":["68d055a1.7e9b1c"],"x":335,"y":480,"wires":[]},{"id":"49398edf.8cb6f","type":"link out","z":"c9204266.8fed5","name":"/SLRCtrl/StateSLR","links":["c264febd.359c9"],"x":735,"y":660,"wires":[]},{"id":"d982fdbc.96fe5","type":"comment","z":"c9204266.8fed5","name":"/StateSLR","info":"","x":820,"y":660,"wires":[]},{"id":"90171e01.c832f","type":"change","z":"c9204266.8fed5","name":"CH TS SP","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.description","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"$substringAfter(msg.payload, \"Temp \")","tot":"jsonata"},{"t":"set","p":"curSP","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1150,"y":4640,"wires":[["c0394cc8.87fc8"]]},{"id":"c0394cc8.87fc8","type":"ui_slider","z":"c9204266.8fed5","name":"Temp SP","label":"Temp","tooltip":"","group":"9adbac80.1043b","order":4,"width":4,"height":1,"passthru":true,"outs":"end","topic":"topic","topicType":"msg","min":0,"max":"30","step":"0.5","x":1380,"y":4640,"wires":[["810c5e28.24618"]]},{"id":"810c5e28.24618","type":"change","z":"c9204266.8fed5","name":"New SP","rules":[{"t":"set","p":"newSP","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1560,"y":4640,"wires":[[]]},{"id":"227d40c7.6e67e","type":"function","z":"c9204266.8fed5","name":"Reset SP","func":"msg.payload = '0';\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1140,"y":4380,"wires":[["c0394cc8.87fc8"]]},{"id":"17cd776a.60a2f9","type":"switch","z":"c9204266.8fed5","name":"SP not -1?","property":"tempSP","propertyType":"msg","rules":[{"t":"neq","v":"-1","vt":"num"}],"checkall":"true","repair":false,"outputs":1,"x":1110,"y":4040,"wires":[["d80b5843.680188"]]},{"id":"ee6655b7.be8b28","type":"rbe","z":"c9204266.8fed5","name":"changes","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":1440,"y":4040,"wires":[["1fc07e54.3b10c2"]]},{"id":"d80b5843.680188","type":"change","z":"c9204266.8fed5","name":"SP to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"tempSP","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1280,"y":4040,"wires":[["ee6655b7.be8b28"]]},{"id":"1fc07e54.3b10c2","type":"link out","z":"c9204266.8fed5","name":"TS Temp SP Out","links":["b4e7d182.cf4f7"],"x":1535,"y":4040,"wires":[]},{"id":"f893587e.b7a7b8","type":"function","z":"c9204266.8fed5","name":"Start in ms","func":"let time = msg.payload;\ntt=time.split(\":\");\nmsec=((tt[0]*3600)+(tt[1]*60))*1000;\nmsg.payload = msec;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1390,"y":4560,"wires":[["7cde5c03.06c8a4"]]},{"id":"64f5e507.e86b8c","type":"function","z":"c9204266.8fed5","name":"End in ms","func":"let time = msg.payload;\ntt=time.split(\":\");\nmsec=((tt[0]*3600)+(tt[1]*60))*1000;\nmsg.payload = msec;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1380,"y":4600,"wires":[["be849b55.596e58"]]},{"id":"8a17762d.58f378","type":"function","z":"c9204266.8fed5","name":"Start in ms","func":"let time = msg.payload;\ntt=time.split(\":\");\nmsec=((tt[0]*3600)+(tt[1]*60))*1000;\nmsg.payload = msec;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1450,"y":2740,"wires":[["8d76c70.0b7ca38"]]},{"id":"5a08e16a.7a014","type":"function","z":"c9204266.8fed5","name":"End in ms","func":"let time = msg.payload;\ntt=time.split(\":\");\nmsec=((tt[0]*3600)+(tt[1]*60))*1000;\nmsg.payload = msec;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1440,"y":2780,"wires":[["a34ba30a.22b38"]]},{"id":"7e9a20e3.bad7d","type":"ui_button","z":"c9204266.8fed5","name":"Repeat HW","group":"e22da41f.72dcc8","order":9,"width":4,"height":1,"passthru":false,"label":"Repeat Previous Day's Prog","tooltip":"Repeat (Copy) Previous Day's Time Slot Settings for Selected Day","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":3080,"wires":[["9f8020c8.07371"]]},{"id":"9f8020c8.07371","type":"function","z":"c9204266.8fed5","name":"Repeat & Make week","func":"dayIndexHW = flow.get('dayIndexHW'); //day selected (0=Sun - 6=Sat)\nmsg.payload = flow.get('savedSelectedDayHW'); //7 day HW day/TS array\n\nif (dayIndexHW === 0) {\n msg.payload[0][1] = msg.payload[6][1]; //copy Sat [6] TS into Sunday [0]\n}\nelse {\n msg.payload[dayIndexHW][1] = msg.payload[dayIndexHW -1][1]; //else copy previous days TS\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":960,"y":3120,"wires":[["38408842.7f9db8"]]},{"id":"fd81827c.38fba","type":"ui_button","z":"c9204266.8fed5","name":"Repeat CH","group":"9adbac80.1043b","order":9,"width":4,"height":1,"passthru":false,"label":"Repeat Previous Day's Prog","tooltip":"Repeat (Copy) Previous Day's Time Slot Settings for Selected Day","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":630,"y":4940,"wires":[["fa436933.4d8758"]]},{"id":"fa436933.4d8758","type":"function","z":"c9204266.8fed5","name":"Repeat & Make week","func":"dayIndexCH = flow.get('dayIndexCH'); //day selected (0=Sun - 6=Sat)\nmsg.payload = flow.get('savedSelectedDayCH'); //7 day CH day/TS array\n\nif (dayIndexCH === 0) {\n msg.payload[0][1] = msg.payload[6][1]; //copy Sat [6] TS into Sunday [0]\n}\nelse {\n msg.payload[dayIndexCH][1] = msg.payload[dayIndexCH -1][1]; //else copy previous days TS\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":900,"y":4980,"wires":[["16dd662f.b9f67a"]]},{"id":"87a36cb6.d5267","type":"mqtt-broker","name":"local mqtt broker","broker":"127.0.0.1","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"aaa48299.7b526","type":"ui_group","name":"SLR/SLT Control/Status","tab":"ba08abb2.6e0ea8","order":1,"disp":true,"width":"6","collapse":false},{"id":"4723d56a.5d74cc","type":"ui_group","name":"HW Daily Time Slots","tab":"ba08abb2.6e0ea8","order":4,"disp":true,"width":"4","collapse":false},{"id":"e22da41f.72dcc8","type":"ui_group","name":"HW Edit Time Slot","tab":"ba08abb2.6e0ea8","order":5,"disp":true,"width":"4","collapse":false},{"id":"9adbac80.1043b","type":"ui_group","name":"CH Edit Time Slot","tab":"ba08abb2.6e0ea8","order":3,"disp":true,"width":"4","collapse":false},{"id":"4e5fc46e.0580dc","type":"ui_group","name":"CH Daily Time Slots","tab":"ba08abb2.6e0ea8","order":2,"disp":true,"width":"4","collapse":false},{"id":"2d4355f4.616c0a","type":"ui_group","name":"Default","tab":"5e2e41aa.9826b","order":1,"disp":true,"width":"6","collapse":true},{"id":"ba08abb2.6e0ea8","type":"ui_tab","name":"Pi-ve Dashboard - Beta 2.14","icon":"dashboard","order":1,"disabled":false,"hidden":false},{"id":"5e2e41aa.9826b","type":"ui_tab","name":"Home","icon":"dashboard","order":9}]