I would like to see if I can get some feedback at my attempt at nutrient dosing through Node-Red. Ill provide some background info:
I use Node-Red for all of my automations and basically use Home Assistant for the front end and for push notifications to my iPhone.
Here is the front end Here is the sequence behind it in Node-Red
Code: Select all
[{"id":"a5f899af6f39c852","type":"server-state-changed","z":"e68e0e7d0532f2ea","name":"Start Dosing","server":"db25b3f8.bea35","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_boolean.begin_nutrient_dosing","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":70,"y":1280,"wires":[["0798f47957c80fd3"]]},{"id":"1a9e7aa6a578243b","type":"api-call-service","z":"e68e0e7d0532f2ea","name":"Stop Dosing (Button Reset)","server":"db25b3f8.bea35","version":3,"debugenabled":false,"service_domain":"input_boolean","service":"turn_off","entityId":"input_boolean.begin_nutrient_dosing","data":"","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1440,"y":1940,"wires":[[]]},{"id":"71a203d2625e5bdb","type":"switch","z":"e68e0e7d0532f2ea","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":870,"y":1280,"wires":[["7622d7e68d3144c8"],["3eb3c4e31ae74013","c3da6b16cc66063c"]]},{"id":"879054dfee476838","type":"server-state-changed","z":"e68e0e7d0532f2ea","name":"Pump 1 ml input","server":"db25b3f8.bea35","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_number.dose_pump_1","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":80,"y":1220,"wires":[["829d71b09a2bebfa"]]},{"id":"0798f47957c80fd3","type":"function","z":"e68e0e7d0532f2ea","name":"ml to secs - Pump 1","func":"//var timeouttime = 10;\n// or whatever data source you want like:\nvar timeouttime = flow.get('dosing_pump_1');\n// then simply\nmsg.timeout = timeouttime;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":380,"y":1280,"wires":[["e3ef786dea7ccbc0"]]},{"id":"e3ef786dea7ccbc0","type":"mytimeout","z":"e68e0e7d0532f2ea","name":"","outtopic":"","outsafe":"on","outwarning":"","outunsafe":"off","warning":"5","timer":"30","debug":false,"ndebug":false,"ignoreCase":false,"repeat":false,"again":false,"x":710,"y":1280,"wires":[["71a203d2625e5bdb"],["244a3e7b2ac49d24"]]},{"id":"829d71b09a2bebfa","type":"change","z":"e68e0e7d0532f2ea","name":"Pump 1 Payload Variable","rules":[{"t":"set","p":"dosing_pump_1","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":1220,"wires":[[]]},{"id":"2cebd7d325614c99","type":"server-state-changed","z":"e68e0e7d0532f2ea","name":"Pump 2 ml input","server":"db25b3f8.bea35","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_number.dose_pump_2","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":80,"y":1380,"wires":[["656286728de064c5"]]},{"id":"656286728de064c5","type":"change","z":"e68e0e7d0532f2ea","name":"Pump 2 Payload Variable","rules":[{"t":"set","p":"dosing_pump_2","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":490,"y":1380,"wires":[[]]},{"id":"5cf822d33b516ad5","type":"function","z":"e68e0e7d0532f2ea","name":"ml to secs - Pump 2","func":"//var timeouttime = 10;\n// or whatever data source you want like:\nvar timeouttime = flow.get('dosing_pump_2');\n// then simply\nmsg.timeout = timeouttime;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":840,"y":1440,"wires":[["3ba694f68a273c4c"]]},{"id":"3ba694f68a273c4c","type":"mytimeout","z":"e68e0e7d0532f2ea","name":"","outtopic":"","outsafe":"on","outwarning":"","outunsafe":"off","warning":"5","timer":"30","debug":false,"ndebug":false,"ignoreCase":false,"repeat":false,"again":false,"x":1050,"y":1440,"wires":[["ad9d1b0b53a7841e"],["7b92437a2f8ebb3d"]]},{"id":"ad9d1b0b53a7841e","type":"switch","z":"e68e0e7d0532f2ea","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1230,"y":1400,"wires":[["91c533394335f3b3"],["b545cb98b28b3d75","a07e8f3e46810a0f"]]},{"id":"d581c8ce96de38bd","type":"comment","z":"e68e0e7d0532f2ea","name":"Dosing Pump 1","info":"","x":80,"y":1180,"wires":[]},{"id":"983df505e3c37c34","type":"comment","z":"e68e0e7d0532f2ea","name":"Dosing Pump 2","info":"","x":80,"y":1340,"wires":[]},{"id":"c50f17b601c34720","type":"change","z":"e68e0e7d0532f2ea","name":"Off -> On","rules":[{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"on","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":1440,"wires":[["5cf822d33b516ad5"]]},{"id":"91c533394335f3b3","type":"debug","z":"e68e0e7d0532f2ea","name":"Pump 2 On","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1390,"y":1340,"wires":[]},{"id":"b545cb98b28b3d75","type":"debug","z":"e68e0e7d0532f2ea","name":"Pump 2 Off","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1410,"y":1440,"wires":[]},{"id":"7622d7e68d3144c8","type":"debug","z":"e68e0e7d0532f2ea","name":"Pump 1 On","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1070,"y":1220,"wires":[]},{"id":"c3da6b16cc66063c","type":"debug","z":"e68e0e7d0532f2ea","name":"Pump 1 Off","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1070,"y":1300,"wires":[]},{"id":"3eb3c4e31ae74013","type":"delay","z":"e68e0e7d0532f2ea","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":100,"y":1460,"wires":[["d09f9d521f081145"]]},{"id":"d09f9d521f081145","type":"api-current-state","z":"e68e0e7d0532f2ea","name":"Check Begin Nutrient Dosing","server":"db25b3f8.bea35","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.begin_nutrient_dosing","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":320,"y":1460,"wires":[["0561572435535374"]]},{"id":"0561572435535374","type":"switch","z":"e68e0e7d0532f2ea","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":510,"y":1460,"wires":[["c50f17b601c34720"],[]]},{"id":"8e87827565d48e62","type":"server-state-changed","z":"e68e0e7d0532f2ea","name":"Pump 3 ml input","server":"db25b3f8.bea35","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_number.dose_pump_3","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":80,"y":1560,"wires":[["7fd52d5a418abd4d"]]},{"id":"7fd52d5a418abd4d","type":"change","z":"e68e0e7d0532f2ea","name":"Pump 3 Payload Variable","rules":[{"t":"set","p":"dosing_pump_3","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":490,"y":1560,"wires":[[]]},{"id":"e2361ac97e488ace","type":"function","z":"e68e0e7d0532f2ea","name":"ml to sec - Pump 3","func":"//var timeouttime = 10;\n// or whatever data source you want like:\nvar timeouttime = flow.get('dosing_pump_3');\n// then simply\nmsg.timeout = timeouttime;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":850,"y":1620,"wires":[["0014ac73dfc0683b"]]},{"id":"0014ac73dfc0683b","type":"mytimeout","z":"e68e0e7d0532f2ea","name":"","outtopic":"","outsafe":"on","outwarning":"","outunsafe":"off","warning":"5","timer":"30","debug":false,"ndebug":false,"ignoreCase":false,"repeat":false,"again":false,"x":1050,"y":1620,"wires":[["d43c01783999abc4"],["039fc15a7a938270"]]},{"id":"d43c01783999abc4","type":"switch","z":"e68e0e7d0532f2ea","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1230,"y":1580,"wires":[["1da99af57c2339b0"],["91a296877ddaf246","975e9b161f2cd379"]]},{"id":"072510b69cab3cd7","type":"comment","z":"e68e0e7d0532f2ea","name":"Dosing Pump 3","info":"","x":80,"y":1520,"wires":[]},{"id":"6125d070d705ca6f","type":"change","z":"e68e0e7d0532f2ea","name":"Off -> On","rules":[{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"on","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":1620,"wires":[["e2361ac97e488ace"]]},{"id":"1da99af57c2339b0","type":"debug","z":"e68e0e7d0532f2ea","name":"Pump 3 On","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1390,"y":1520,"wires":[]},{"id":"91a296877ddaf246","type":"debug","z":"e68e0e7d0532f2ea","name":"Pump 3 Off","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1390,"y":1620,"wires":[]},{"id":"a07e8f3e46810a0f","type":"delay","z":"e68e0e7d0532f2ea","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":100,"y":1640,"wires":[["993404963fefdce4"]]},{"id":"993404963fefdce4","type":"api-current-state","z":"e68e0e7d0532f2ea","name":"Check Begin Nutrient Dosing","server":"db25b3f8.bea35","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.begin_nutrient_dosing","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":320,"y":1640,"wires":[["65e0e5574fb0265a"]]},{"id":"65e0e5574fb0265a","type":"switch","z":"e68e0e7d0532f2ea","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":530,"y":1640,"wires":[["6125d070d705ca6f"],[]]},{"id":"211b39aef759d0a9","type":"server-state-changed","z":"e68e0e7d0532f2ea","name":"Pump 4 ml input","server":"db25b3f8.bea35","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_number.dose_pump_4","entityidfiltertype":"exact","outputinitially":true,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":80,"y":1780,"wires":[["48ef40762ce8a2b4"]]},{"id":"48ef40762ce8a2b4","type":"change","z":"e68e0e7d0532f2ea","name":"Pump 4 Payload Variable ","rules":[{"t":"set","p":"dosing_pump_4","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":490,"y":1780,"wires":[[]]},{"id":"5e1dc4d7220ce658","type":"function","z":"e68e0e7d0532f2ea","name":"ml to sec - Pump 4","func":"//var timeouttime = 10;\n// or whatever data source you want like:\nvar timeouttime = flow.get('dosing_pump_4');\n// then simply\nmsg.timeout = timeouttime;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":850,"y":1840,"wires":[["77fe0359411d8115"]]},{"id":"77fe0359411d8115","type":"mytimeout","z":"e68e0e7d0532f2ea","name":"","outtopic":"","outsafe":"on","outwarning":"","outunsafe":"off","warning":"5","timer":"30","debug":false,"ndebug":false,"ignoreCase":false,"repeat":false,"again":false,"x":1070,"y":1840,"wires":[["56b95437dddb628f"],["40949363ef8fe404"]]},{"id":"56b95437dddb628f","type":"switch","z":"e68e0e7d0532f2ea","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1230,"y":1800,"wires":[["48b1b09e2a187bcb"],["d727b91a2bb7dfae","1a9e7aa6a578243b","3ea798dd3bf669b5","2999353bc681dde5"]]},{"id":"5849f9ac72ccb726","type":"change","z":"e68e0e7d0532f2ea","name":"Off -> On","rules":[{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"on","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":1840,"wires":[["5e1dc4d7220ce658"]]},{"id":"48b1b09e2a187bcb","type":"debug","z":"e68e0e7d0532f2ea","name":"Pump 4 On","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1390,"y":1740,"wires":[]},{"id":"d727b91a2bb7dfae","type":"debug","z":"e68e0e7d0532f2ea","name":"Pump 4 Off","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1390,"y":1840,"wires":[]},{"id":"975e9b161f2cd379","type":"delay","z":"e68e0e7d0532f2ea","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":100,"y":1860,"wires":[["804f09c3e0e1c993"]]},{"id":"804f09c3e0e1c993","type":"api-current-state","z":"e68e0e7d0532f2ea","name":"Check Begin Nutrient Dosing","server":"db25b3f8.bea35","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.begin_nutrient_dosing","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":320,"y":1860,"wires":[["258e85523f5d16b6"]]},{"id":"258e85523f5d16b6","type":"switch","z":"e68e0e7d0532f2ea","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":510,"y":1860,"wires":[["5849f9ac72ccb726"],[]]},{"id":"a8afa0bcad96811c","type":"comment","z":"e68e0e7d0532f2ea","name":"Dosing Pump 4","info":"","x":80,"y":1720,"wires":[]},{"id":"6ab50e00c593135a","type":"api-call-service","z":"e68e0e7d0532f2ea","name":"Turn pH Up Control On","server":"db25b3f8.bea35","version":3,"debugenabled":false,"service_domain":"input_boolean","service":"turn_on","entityId":"input_boolean.ph_down","data":"","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1960,"y":1780,"wires":[[]]},{"id":"4a46ee74c14cce0b","type":"delay","z":"e68e0e7d0532f2ea","name":"","pauseType":"delay","timeout":"10","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1730,"y":1800,"wires":[["ab2a3e03618c642e"]]},{"id":"3ea798dd3bf669b5","type":"change","z":"e68e0e7d0532f2ea","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"off","fromt":"str","to":"on","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1500,"y":1800,"wires":[["4a46ee74c14cce0b"]]},{"id":"ab2a3e03618c642e","type":"debug","z":"e68e0e7d0532f2ea","name":"Turn Ph Up Control","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1960,"y":1840,"wires":[]},{"id":"244a3e7b2ac49d24","type":"mqtt out","z":"e68e0e7d0532f2ea","name":"Dose Pump 1 Readout","topic":"Dose Pump 1 Readout","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"6435d43e.84026c","x":940,"y":1340,"wires":[]},{"id":"7b92437a2f8ebb3d","type":"mqtt out","z":"e68e0e7d0532f2ea","name":"Dose Pump 2 Readout","topic":"Dose Pump 2 Readout","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"6435d43e.84026c","x":1180,"y":1520,"wires":[]},{"id":"039fc15a7a938270","type":"mqtt out","z":"e68e0e7d0532f2ea","name":"Dose Pump 3 Readout","topic":"Dose Pump 3 Readout","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"6435d43e.84026c","x":1160,"y":1700,"wires":[]},{"id":"40949363ef8fe404","type":"mqtt out","z":"e68e0e7d0532f2ea","name":"Dose Pump 4 Readout","topic":"Dose Pump 4 Readout","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"6435d43e.84026c","x":1180,"y":1920,"wires":[]},{"id":"2999353bc681dde5","type":"api-call-service","z":"e68e0e7d0532f2ea","name":"Res Change Done","server":"db25b3f8.bea35","version":3,"debugenabled":false,"service_domain":"notify","service":"mobile_app_iphone_12_pro","entityId":"","data":"{\t\"title\": \"Nutrient Change Done\",\t\"message\":\"Plants have fresh Nutrients!\"\t}","dataType":"jsonata","mergecontext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1390,"y":2020,"wires":[[]]},{"id":"db25b3f8.bea35","type":"server","name":"Home Assistant","version":2,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":false,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30},{"id":"6435d43e.84026c","type":"mqtt-broker","name":"Home Assistant","broker":"192.168.1.70","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]
It does not have calibration features so I will have to do that manually my self by adjusting the PWM on the pumps, example would be to run the pump for 100 seconds to get 100ml of solution in the res. I am using this method for my pH dosing however that's a little easier because I dose a little at a time until I reach the pH target.