Last updated December 28 2025
Status: Tested
The goal is to use the optimal amount of power from the solar panels and store it as warm water. In other words to keep the exchange to the grid at a minimum.

Variant 2

Use the P1 port from the smart meter to read the power delivery in Domoticz and send this data to a controller in Node Red which output is send to a ESP module with a PWM to control a variable load.
Step 1 read P1 values into Domoticz
There are many descriptions about this topic on the web to be found also you can have look at my notes


Step 2 Send values to a MQTT broker
Under hardware create a MQTT Client Gateway with LAN interface
When the values from the P1 are updated the MQTT server will also be updated.


Step 3 Process the delivery value with a calculation in Node Red
I measure the delivered power to the grid and scale the PWM output so that the heating element is going to use the same amount.
The ESP PWM output is controlled by a simple http request.
The advantage of steering the ESP by an URL is that there is no need for configuring the ESP other then flashing it with ESPEASY.
Device to convert PWM(3.3V) to 0-10 volt, needed for my PWM controlled heating element.
Below the result

Node red export
[{"id":"63219210d5a177ea","type":"tab","label":"Heat storage optimizer","disabled":false,"info":""},{"id":"3c34d8381248471f","type":"function","z":"63219210d5a177ea","name":"select reading","func":"var P1d;\nvar P1u;\nP1d = msg.payload.svalue6; // delivery\nP1u = msg.payload.svalue5; // usage\nmsg.payload = P1d - P1u;\n//msg.payload = msg.payload - flow.get('Pn_1'); //only for simulation mark line as comment in production\nmsg.topic = 'P1 Power';\nnode.status({text:msg.payload});\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":220,"y":580,"wires":[["9dc57bded649e9f8","c309be24167eb5b5"]]},{"id":"1ef825a68a100575","type":"function","z":"63219210d5a177ea","name":"Calculation & Limit","func":"if (flow.get('PWMm_a') == 'OFF') {\n flow.set('PWMo', 0); //Set output to zero\n}\n\nif(flow.get('PWMm_a') == 'MANUAL') {\n flow.set('PWMo', msg.payload);\n}\n\nif (flow.get('PWMm_a') === 'AUTOMATIC') {\n flow.set('PWMo',msg.payload + flow.get('PWMun_1')); //Correction on the new reading\n\n// MAX LIMIT\n if (flow.get('PWMo') > 768) {\n flow.set('PWMo', 768);\n }\n// MIN LIMIT\n if (flow.get('PWMo') < 0) {\n flow.set('PWMo', 0);\n }\n flow.set('PWMun_1', flow.get('PWMo')); //set current value to previous value\n}\n\n\nmsg.payload = flow.get('PWMo');\nnode.status({ text: \"PWMo \" + msg.payload + \" PWMun_1 \" + flow.get('PWMun_1')});\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":290,"y":820,"wires":[["c611869ba74b0c57"]]},{"id":"b986cc30f62e6f95","type":"inject","z":"63219210d5a177ea","name":"Actuate variable after change","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":80,"wires":[["777bc3703d2fe28f"]]},{"id":"777bc3703d2fe28f","type":"function","z":"63219210d5a177ea","name":"Set variable","func":"// Installation dependent parameters\nvar Pmax = 2000; // Power of heating element\nvar IP_heatingController = \"192.168.166.232\"; // IP address ESP PWM module\nvar ESPpwmPIN = 2; // pinnumber of PWM output on ESP \n\n// Process variabels\n\nflow.get('IP_heatingController');\n\nvar P1 = flow.get('P1'); // P1 meter reading \nvar P1d = flow.get('P1d'); // Delivery to the grid\nvar PWMu = flow.get('PWMu'); // PWM value for extra power usage\nvar PWMun_1 = flow.get('PWMun_1'); // PWM value from previous calculation\nvar PWMo = flow.get('PWMuo'); // PWM value to heating element\nvar PWMmo = flow.get('PWMmo'); // PWM Manual Output value\nvar PWMm_a = flow.get('PWMm_a');\nvar Pn_1 = flow.get('Pn_1');\nvar TSetpointBoiler = flow.get('TSetpointBoiler');\n\nflow.set('Pmax', Pmax);\nflow.set('IP_heatingController', IP_heatingController);\nflow.set('ESPpwmPIN', ESPpwmPIN);\nflow.set('PWMun_1',0);\nflow.set('PWMo', 0);\nflow.set('PWMmo', 0);\nflow.set('Loop',50)\nflow.set('Pn_1', 0);\nflow.set('TSetpointBoiler', 45);\n\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":410,"y":80,"wires":[[]]},{"id":"3c4f899fa4f52591","type":"http request","z":"63219210d5a177ea","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":1050,"y":880,"wires":[[]]},{"id":"f8f6ba971c07af54","type":"change","z":"63219210d5a177ea","name":"","rules":[{"t":"set","p":"url","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":890,"y":880,"wires":[["3c4f899fa4f52591"]]},{"id":"2f126fbbe2119374","type":"function","z":"63219210d5a177ea","name":"Create URL","func":"//msg.payload = \"http://192.168.166.104/control?cmd=PWM,2,\" + (parseInt(msg.payload));\n//msg.payload = \"http://192.168.166.104/control?cmd=PWM,2,\" + msg.payload;\nmsg.payload = \"http://\" + flow.get('IP_heatingController') + \"/control?cmd=PWM,2,\" + Math.round(msg.payload) + \",1500\";\n//msg.payload = \"http://192.168.166.104/control?cmd=PWM,2,\" + (1023 - parseInt(msg.payload));\n//msg.payload = \"control?cmd=PWM,2,\" + msg.payload;\n//msg.payload = \"test\";\nnode.status({ text: msg.payload });\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":880,"wires":[["f8f6ba971c07af54"]]},{"id":"af33715dc4df7ad6","type":"ui_chart","z":"63219210d5a177ea","name":"","group":"91f7ccea61c236ab","order":1,"width":"24","height":"8","label":"Heating","chartType":"line","legend":"true","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"2","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#ff0000","#00ff00","#0080ff","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"x":200,"y":1260,"wires":[[]]},{"id":"4cef6fcbd79f4b2a","type":"function","z":"63219210d5a177ea","name":"Manual/Automatic","func":"if(flow.get('PWMm_a') === 'OFF'){\n flow.set('PWMo',0);\n}\nif (flow.get('PWMm_a') === 'MANUAL') {\n flow.set('PWMo', flow.get('PWMmo'));\n}\nif (flow.get('PWMm_a') === 'AUTOMATIC') {\n flow.set('PWMo', msg.payload);\n}\nmsg.payload = flow.get('PWMo');\nnode.status({ text: msg.payload });\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":250,"y":700,"wires":[["4904c179c10786c9"]]},{"id":"d32964c0e2566cc1","type":"function","z":"63219210d5a177ea","name":"Manual value","func":"flow.set('PWMm_a',msg.payload);\nif(msg.payload == 'OFF'){\n msg.enabled = false;\n msg.payload=0;\n }\nif (msg.payload == 'MANUAL') {\n msg.enabled = true;\n msg.payload=flow.get('PWMo');\n}\nif (msg.payload == 'AUTOMATIC') {\n msg.enabled = false;\n msg.payload = flow.get('PWMo');\n}\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":380,"wires":[["6dd678c528dfc058","8490b288e3ff5a8d"]]},{"id":"6ed66abb9380b2ea","type":"ui_dropdown","z":"63219210d5a177ea","name":"","label":"Controller mode","tooltip":"","place":"Select option","group":"d0e817bf8dd2b2db","order":1,"width":0,"height":0,"passthru":true,"multiple":false,"options":[{"label":"OFF","value":"OFF","type":"str"},{"label":"MANUAL","value":"MANUAL","type":"str"},{"label":"AUTOMATIC","value":"AUTOMATIC","type":"str"}],"payload":"","topic":"topic","topicType":"msg","className":"","x":320,"y":380,"wires":[["d32964c0e2566cc1","4aa844560fe3d404"]]},{"id":"d0cc56f4e3b1b8ce","type":"inject","z":"63219210d5a177ea","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"0.5","topic":"","payload":"OFF","payloadType":"str","x":90,"y":380,"wires":[["6ed66abb9380b2ea"]]},{"id":"4fe5fcc9f9583660","type":"ui_text","z":"63219210d5a177ea","group":"d0e817bf8dd2b2db","order":4,"width":0,"height":0,"name":"","label":"Deviation","format":"{{msg.payload}}","layout":"row-spread","x":200,"y":1340,"wires":[]},{"id":"c611869ba74b0c57","type":"function","z":"63219210d5a177ea","name":"OFF?","func":"if(flow.get('PWMm_a') === 'OFF'){\n msg.payload = 0;\n flow.set('PWMo',0);\n flow.set('PWMun_1',0);\n}\nmsg.topic='PWMo';\nnode.status({text:msg.payload});\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":350,"y":880,"wires":[["7fca859a08e60c9f"]]},{"id":"6dd678c528dfc058","type":"ui_slider","z":"63219210d5a177ea","name":"","label":"Manual output(W)","tooltip":"","group":"d0e817bf8dd2b2db","order":5,"width":0,"height":0,"passthru":false,"outs":"end","topic":"topic","topicType":"msg","min":0,"max":"2000","step":1,"className":"","x":730,"y":420,"wires":[["8490b288e3ff5a8d"]]},{"id":"8490b288e3ff5a8d","type":"function","z":"63219210d5a177ea","name":"Store manual output","func":"//var PWMmo;\nflow.get('PWMmo');\nflow.set('PWMmo', msg.payload);\nflow.set('PWMun_1', msg.payload);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":940,"y":380,"wires":[[]]},{"id":"58301962b1923199","type":"inject","z":"63219210d5a177ea","name":"Setpoint","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"0.5","topic":"","payload":"100","payloadType":"num","x":100,"y":320,"wires":[["4aa844560fe3d404"]]},{"id":"fd26fb316ad54187","type":"ui_slider","z":"63219210d5a177ea","name":"Setpoint","label":"Setpoint(W)","tooltip":"","group":"d0e817bf8dd2b2db","order":3,"width":0,"height":0,"passthru":true,"outs":"end","topic":"topic","topicType":"msg","min":"-600","max":"600","step":"50","className":"","x":740,"y":320,"wires":[["d065a1afcd7287cc"]]},{"id":"d065a1afcd7287cc","type":"function","z":"63219210d5a177ea","name":"Store setpoint","func":"// Store the setpoint\nflow.get('SETPOINT');\nflow.set('SETPOINT', msg.payload);\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":920,"y":320,"wires":[[]]},{"id":"9dc57bded649e9f8","type":"function","z":"63219210d5a177ea","name":"Deviation & Gain","func":"// Calculate deviation\nmsg.payload = Math.round((msg.payload - flow.get('SETPOINT'))*0.8);\nnode.status({ text: msg.payload});\nmsg.topic = 'Deviation'\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":290,"y":640,"wires":[["8fc278644bc1eecf","4cef6fcbd79f4b2a"]]},{"id":"4aa844560fe3d404","type":"function","z":"63219210d5a177ea","name":"Manual value","func":"flow.set('PWMm_a',msg.payload);\nif(msg.payload == 'OFF'){\n msg.enabled = false;\n msg.payload = flow.get('SETPOINT');\n}\nif (msg.payload == 'MANUAL') {\n msg.enabled = true;\n msg.payload = flow.get('SETPOINT');\n}\nif (msg.payload == 'AUTOMATIC') {\n msg.enabled = true;\n msg.payload = flow.get('SETPOINT');\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":320,"wires":[["fd26fb316ad54187"]]},{"id":"78d6b53e5966a434","type":"comment","z":"63219210d5a177ea","name":"Adapt scaling to maximum power heating element","info":"Replace nodes below by P1 meter","x":860,"y":480,"wires":[]},{"id":"d6847d74e69bc62a","type":"mqtt in","z":"63219210d5a177ea","name":"","topic":"domoticz/out/rv14_DSMR/Power","qos":"2","datatype":"auto-detect","broker":"1784bd1e4e917438","nl":false,"rap":false,"inputs":0,"x":150,"y":520,"wires":[["3c34d8381248471f"]]},{"id":"4904c179c10786c9","type":"function","z":"63219210d5a177ea","name":"Scale to PWM","func":"msg.payload = Math.round(msg.payload / flow.get('Pmax') * 1024);\n\nnode.status({ text: msg.payload });\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":280,"y":760,"wires":[["1ef825a68a100575"]]},{"id":"81ebf4ef8c5f9fb6","type":"function","z":"63219210d5a177ea","name":"Scale to WATT","func":"msg.payload = Math.round(msg.payload / 1024 * flow.get('Pmax'));\n//flow.set('Pn_1', msg.payload); //only for simulation mark line as comment in production\nmsg.topic=\"Power to boiler\";\nnode.status({ text: msg.payload });\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1020,"y":940,"wires":[["6dd678c528dfc058","e7f70054e1626a86","d653edecc417f8d4"]]},{"id":"46befc55cc3a7f4a","type":"ui_text","z":"63219210d5a177ea","group":"d0e817bf8dd2b2db","order":2,"width":0,"height":0,"name":"","label":"Power (- from / + to grid)","format":"{{msg.payload}}","layout":"row-spread","x":250,"y":1300,"wires":[]},{"id":"5a354a7a6af289c9","type":"link in","z":"63219210d5a177ea","name":"link in 1","links":["c309be24167eb5b5"],"x":55,"y":1300,"wires":[["46befc55cc3a7f4a","af33715dc4df7ad6"]]},{"id":"c309be24167eb5b5","type":"link out","z":"63219210d5a177ea","name":"Power","mode":"link","links":["5a354a7a6af289c9"],"x":485,"y":580,"wires":[]},{"id":"8fc278644bc1eecf","type":"link out","z":"63219210d5a177ea","name":"Deviation","mode":"link","links":["ca8485107a8b5a01"],"x":545,"y":640,"wires":[]},{"id":"e7f70054e1626a86","type":"link out","z":"63219210d5a177ea","name":"PWM out","mode":"link","links":["13c9598d0f7651fd"],"x":1255,"y":940,"wires":[]},{"id":"13c9598d0f7651fd","type":"link in","z":"63219210d5a177ea","name":"link in 2","links":["e7f70054e1626a86"],"x":55,"y":1260,"wires":[["af33715dc4df7ad6"]]},{"id":"ca8485107a8b5a01","type":"link in","z":"63219210d5a177ea","name":"link in 3","links":["8fc278644bc1eecf"],"x":55,"y":1340,"wires":[["4fe5fcc9f9583660"]]},{"id":"decc01c61dc87606","type":"comment","z":"63219210d5a177ea","name":"!!!!!!! Adapt variables to your need and activate !!!!!!","info":"Replace nodes below by P1 meter","x":310,"y":40,"wires":[]},{"id":"75da9813137bd976","type":"ui ping","z":"63219210d5a177ea","name":"Ping","host":"","timeout":"5","requests":"1","x":490,"y":1720,"wires":[["1808178fa251d1ef"]]},{"id":"93082eaeb37479bd","type":"inject","z":"63219210d5a177ea","name":"Cycle 1 second","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"1","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":1720,"wires":[["aad5259cb1da2bd3"]]},{"id":"a484414f959b25e9","type":"ui_text","z":"63219210d5a177ea","group":"d0e817bf8dd2b2db","order":12,"width":0,"height":0,"name":"","label":"ESP module","format":"","layout":"row-spread","x":750,"y":1720,"wires":[]},{"id":"1808178fa251d1ef","type":"function","z":"63219210d5a177ea","name":"Test","func":"msg.color = (msg.payload === true)?\"lime\":\"red\";\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":610,"y":1720,"wires":[["a484414f959b25e9"]]},{"id":"aad5259cb1da2bd3","type":"function","z":"63219210d5a177ea","name":"Get IP address","func":"msg.host = flow.get('IP_heatingController')\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":340,"y":1720,"wires":[["75da9813137bd976"]]},{"id":"aceeafdee5b960aa","type":"comment","z":"63219210d5a177ea","name":"ADDITIONAL INSTALLED NODES","info":"node-red-dashboard\nnode-red-contrib-ui-ping","x":680,"y":40,"wires":[]},{"id":"048600d86564b6f9","type":"string","z":"63219210d5a177ea","name":"","methods":[{"name":"right","params":[{"type":"num","value":"1"}]}],"prop":"payload","propout":"payload","object":"msg","objectout":"msg","x":450,"y":1780,"wires":[["428747a1c0b9f70b"]]},{"id":"e1150b23fe7551cd","type":"inject","z":"63219210d5a177ea","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"ON ON","payloadType":"str","x":290,"y":1780,"wires":[["048600d86564b6f9"]]},{"id":"428747a1c0b9f70b","type":"debug","z":"63219210d5a177ea","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":680,"y":1780,"wires":[]},{"id":"6606aa8cae8b831a","type":"mqtt out","z":"63219210d5a177ea","name":"RV14_MQTT_Server","topic":"Sun2Boiler","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"83de9126.29e5d","x":400,"y":1080,"wires":[]},{"id":"e1f2bda89528ef5a","type":"function","z":"63219210d5a177ea","name":"global T_Boilervat","func":"var T_Boilervat = global.get('T_Boilervat');\nmsg.topic = 'T_Boilervat';\nif(0 < msg.payload && msg.payload < 75){\n global.set('T_Boilervat', msg.payload);\n}\nelse{\n global.set('T_Boilervat', 80);\n}\n//global.set('T_Boilervat',msg.payload);\nnode.status({ text: global.get('T_Boilervat')});\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":370,"y":1180,"wires":[[]]},{"id":"cf0e7df9cec0ab1c","type":"sensor-ds18b20","z":"63219210d5a177ea","name":"T_Boiler","topic":"","sensorid":"28-220ae6000900","timer":"600","repeat":false,"x":150,"y":1180,"wires":[["e1f2bda89528ef5a"]]},{"id":"d653edecc417f8d4","type":"function","z":"63219210d5a177ea","name":"select reading","func":"//msg.payload = msg.payload.svalue6; // delivery\nnode.status({text:msg.payload});\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":160,"y":1080,"wires":[["6606aa8cae8b831a","f379aa4b0bdd74e0"]]},{"id":"f379aa4b0bdd74e0","type":"debug","z":"63219210d5a177ea","name":"debug 4","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":360,"y":1140,"wires":[]},{"id":"f1a59556b61291b7","type":"mqtt in","z":"63219210d5a177ea","name":"","topic":"BoilerControl/BoilerHeatLevel_1_60/temperature","qos":"2","datatype":"auto-detect","broker":"1784bd1e4e917438","nl":false,"rap":false,"inputs":0,"x":220,"y":1400,"wires":[["f7ebd8c6806bea9a"]]},{"id":"f3e1f6ca86d138bc","type":"mqtt in","z":"63219210d5a177ea","name":"","topic":"BoilerControl/BoilerHeatLevel_2_30/temperature","qos":"2","datatype":"auto-detect","broker":"1784bd1e4e917438","nl":false,"rap":false,"inputs":0,"x":220,"y":1460,"wires":[["280a5aec2b103027"]]},{"id":"f89b0ca1983db34b","type":"mqtt in","z":"63219210d5a177ea","name":"","topic":"BoilerControl/BoilerHeatLevel_3_10/temperature","qos":"2","datatype":"auto-detect","broker":"1784bd1e4e917438","nl":false,"rap":false,"inputs":0,"x":220,"y":1520,"wires":[["13c2e6379df67b5a"]]},{"id":"8b9e0d6dfaeaa80b","type":"mqtt in","z":"63219210d5a177ea","name":"","topic":"BoilerControl/BoilerHeatLevel_Bottom_plate/temperature","qos":"2","datatype":"auto-detect","broker":"1784bd1e4e917438","nl":false,"rap":false,"inputs":0,"x":250,"y":1580,"wires":[["f12373408bc219f3"]]},{"id":"f7ebd8c6806bea9a","type":"function","z":"63219210d5a177ea","name":"global BoilerHeatLevel_1_60","func":"var BoilerHeatLevel_1_60 = global.get('BoilerHeatLevel_1_60');\n\nmsg.topic = 'BoilerHeatLevel_1_60';\nglobal.set('BoilerHeatLevel_1_60', msg.payload);\n\nnode.status({ text: msg.payload });\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":1400,"wires":[["09e99c8b844f91f2"]]},{"id":"280a5aec2b103027","type":"function","z":"63219210d5a177ea","name":"global BoilerHeatLevel_2_30","func":"var BoilerHeatLevel_2_30 = global.get('BoilerHeatLevel_2_30');\n\nmsg.topic = 'BoilerHeatLevel_2_30';\nglobal.set('BoilerHeatLevel_2_30', msg.payload);\n\nnode.status({ text: msg.payload });\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":1460,"wires":[["d63a676c5208c805"]]},{"id":"13c2e6379df67b5a","type":"function","z":"63219210d5a177ea","name":"global BoilerHeatLevel_3_10","func":"var BoilerHeatLevel_3_10 = global.get('BoilerHeatLevel_3_10');\n\nmsg.topic = 'BoilerHeatLevel_3_10';\nglobal.set('BoilerHeatLevel_3_10', msg.payload);\n\nnode.status(msg.payload);\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":1520,"wires":[["0c3e72618ea73377"]]},{"id":"f12373408bc219f3","type":"function","z":"63219210d5a177ea","name":"global BoilerHeatLevel_Bottom_plate","func":"var BoilerHeatLevel_Bottom_plate = global.get('BoilerHeatLevel_Bottom_plate');\n\nmsg.topic = 'BoilerHeatLevel_Bottom_plate';\nglobal.set('BoilerHeatLevel_Bottom_plate', msg.payload);\n\nnode.status(msg.payload);\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":1580,"wires":[["bbc5f0f30ba4fe59"]]},{"id":"7fca859a08e60c9f","type":"function","z":"63219210d5a177ea","name":"Boiler off when on temperature","func":"var BoilerHeatLevel_1_60 = global.get('BoilerHeatLevel_1_60');\nvar BoilerHeatLevel_2_30 = global.get('BoilerHeatLevel_2_30');\nvar BoilerHeatLevel_3_10 = global.get('BoilerHeatLevel_3_10');\nvar TSetpointBoiler = flow.get('TSetpointBoiler');\nvar TboilerReachedTsetpointBoiler = global.get('TboilerReachedTsetpointBoiler');\n\nif (BoilerHeatLevel_1_60 <= (TSetpointBoiler - 0.5) &&\n BoilerHeatLevel_2_30 <= (TSetpointBoiler - 0.5) &&\n BoilerHeatLevel_3_10 <= (TSetpointBoiler - 0.5)) {\n global.set('TboilerReachedTsetpointBoiler','ON');\n// node.status(\"ON \" + (TSetpointBoiler - 1));\n// return msg;\n}\n\nif (BoilerHeatLevel_1_60 >= TSetpointBoiler ||\n BoilerHeatLevel_2_30 >= TSetpointBoiler ||\n BoilerHeatLevel_3_10 >= TSetpointBoiler) {\n global.set('TboilerReachedTsetpointBoiler', 'OFF');\n// node.status(\"OFF \" + TSetpointBoiler);\n// return msg;\n}\n//else{\n// global.set('TboilerReachedTsetpointBoiler', 'HYST');\n//}\nif (global.get('TboilerReachedTsetpointBoiler') !== 'ON'){\n flow.set('PWMo', 0);\n flow.set('PWMun_1', 0);\n msg.payload = 0;\n}\n\n//msg.payload = 0;\nnode.status(global.get('TboilerReachedTsetpointBoiler') + \" | \" + TSetpointBoiler);\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":290,"y":940,"wires":[["d38860ee2e34a86d","81ebf4ef8c5f9fb6","2f126fbbe2119374"]]},{"id":"09e99c8b844f91f2","type":"ui_text","z":"63219210d5a177ea","group":"d0e817bf8dd2b2db","order":7,"width":0,"height":0,"name":"","label":"BoilerHeatLevel_1_60","format":"{{msg.payload | number:1}}°C","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":920,"y":1400,"wires":[]},{"id":"d63a676c5208c805","type":"ui_text","z":"63219210d5a177ea","group":"d0e817bf8dd2b2db","order":8,"width":0,"height":0,"name":"","label":"BoilerHeatLevel_2_30","format":"{{msg.payload | number:1}}°C","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":920,"y":1460,"wires":[]},{"id":"0c3e72618ea73377","type":"ui_text","z":"63219210d5a177ea","group":"d0e817bf8dd2b2db","order":9,"width":0,"height":0,"name":"","label":"BoilerHeatLevel_3_10","format":"{{msg.payload | number:1}}°C","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":920,"y":1520,"wires":[]},{"id":"bbc5f0f30ba4fe59","type":"ui_text","z":"63219210d5a177ea","group":"d0e817bf8dd2b2db","order":10,"width":0,"height":0,"name":"","label":"BoilerHeatLevel_Bottom_plate","format":"{{msg.payload | number:1}}°C","layout":"row-spread","className":"","style":false,"font":"","fontSize":16,"color":"#000000","x":950,"y":1580,"wires":[]},{"id":"3ff61842ff7ed38a","type":"ui_slider","z":"63219210d5a177ea","name":"","label":"Temperatuur","tooltip":"","group":"d0e817bf8dd2b2db","order":11,"width":0,"height":0,"passthru":true,"outs":"end","topic":"topic","topicType":"msg","min":"20","max":"55","step":1,"className":"","x":410,"y":200,"wires":[["a9717924f4c32ac5"]]},{"id":"a9717924f4c32ac5","type":"function","z":"63219210d5a177ea","name":"Setpoint Temperature Boiler","func":"flow.get('TSetpointBoiler');\nflow.set('TSetpointBoiler', msg.payload);\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":660,"y":200,"wires":[[]]},{"id":"d38860ee2e34a86d","type":"function","z":"63219210d5a177ea","name":"Dodeband","func":"var payload_prev = context.get('payload_prev')||0;\n//if (Math.abs(msg.payload - payload_prev) > 25) {\nif (msg.payload - payload_prev > 50) {\n payload_prev = context.set('payload_prev', msg.payload);\n node.status({ text: context.get('payload_prev') + \" i \" + msg.payload });\n return msg;\n}\nelse if(msg.payload - payload_prev < 0){\n payload_prev = context.set('payload_prev', msg.payload);\n node.status({ text: context.get('payload_prev') + \" i \" + msg.payload });\n return msg;\n}\n//else{\n// msg.payload = context.get('payload_prev')\n// node.status({ text: context.get('payload_prev') + \" e \" + msg.payload });\n//}\n//if (msg.payload == 0){\n// return msg;\n//}\n\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":980,"wires":[[]]},{"id":"0ccabb8489ca18be","type":"debug","z":"63219210d5a177ea","name":"debug 7","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":920,"y":1140,"wires":[]},{"id":"ac1508a736c3c203","type":"trigger","z":"63219210d5a177ea","name":"","op1":"true","op2":"false","op1type":"bool","op2type":"bool","duration":"500","extend":false,"overrideDelay":false,"units":"ms","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":620,"y":740,"wires":[["3d3808c20ede0ec3"]]},{"id":"4cf2a05d3db2ad8b","type":"ui_text","z":"63219210d5a177ea","group":"d0e817bf8dd2b2db","order":6,"width":0,"height":0,"name":"","label":"Correction","format":"","layout":"row-spread","className":"","style":false,"font":"","fontSize":"","color":"#000000","x":710,"y":820,"wires":[]},{"id":"3d3808c20ede0ec3","type":"function","z":"63219210d5a177ea","name":"Test","func":"msg.color = (msg.payload === true)?\"orange\":\"gray\";\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":670,"y":780,"wires":[["4cf2a05d3db2ad8b"]]},{"id":"bc39435df2f5dea5","type":"inject","z":"63219210d5a177ea","d":true,"name":"Boiler 40","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 07 * * 2,4,6","once":false,"onceDelay":0.1,"topic":"","payload":"40","payloadType":"num","x":110,"y":160,"wires":[["3ff61842ff7ed38a"]]},{"id":"1c8a8cb8bd14e3f7","type":"inject","z":"63219210d5a177ea","d":true,"name":"Boiler 55","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 07 * * 3,5,0","once":false,"onceDelay":0.1,"topic":"","payload":"55","payloadType":"num","x":110,"y":200,"wires":[["3ff61842ff7ed38a"]]},{"id":"014a29315b40faf1","type":"inject","z":"63219210d5a177ea","d":true,"name":"Boiler 20","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 18 * * 3,5,0","once":false,"onceDelay":0.1,"topic":"","payload":"20","payloadType":"num","x":110,"y":240,"wires":[["3ff61842ff7ed38a"]]},{"id":"8183e7bcbd5b0c47","type":"ui_spacer","z":"63219210d5a177ea","name":"spacer","group":"91f7ccea61c236ab","order":2,"width":1,"height":1},{"id":"91f7ccea61c236ab","type":"ui_group","name":"Charts","tab":"ae91e74a0c4cb063","order":2,"disp":true,"width":"24","collapse":false},{"id":"d0e817bf8dd2b2db","type":"ui_group","name":"Default","tab":"e8658b0abc09f0b7","order":1,"disp":true,"width":"6","collapse":false,"className":""},{"id":"1784bd1e4e917438","type":"mqtt-broker","name":"LE_MQTT_Server_Pjot01","broker":"192.168.166.201","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"83de9126.29e5d","type":"mqtt-broker","name":"RV14_MQTT_Server","broker":"192.168.166.201","port":"1883","clientid":"","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"ae91e74a0c4cb063","type":"ui_tab","name":"Energie","icon":"P1","order":2,"disabled":true,"hidden":false},{"id":"e8658b0abc09f0b7","type":"ui_tab","name":"ZON","icon":"dashboard","order":1,"disabled":false,"hidden":false}]