Skip to content

Home Assistant

Home Assistant Device

Currently, I am using the Node-Red addon to make this work with Home Assistant.

This new code:

  1. Encapsulates all of the controls/ sensors in 1 device.
  2. (Hopefully) Refines the logic so it works more correctly.
  3. Removes most of the hard-coded values into number entities which are configurable from the HA front-end.
  4. Is much more responsive (the previous method required a change being made to a HA entity, which would be picked up by an event handler in Node-RED). After testing, temperature changes take 1-2 seconds as opposed to up to 5s that it would previously take.

Changelog

v 1.1

  • Correct logic and simplify Timeout function using better nodes
  • Correct logic of google assistant switch
  • All variables should now be configurable via number entities

v 1.0:

Initial Release

To-Do

  1. ~~Handling when flow is first deployed (the required flow variables may not be set).~~
  2. Bugchecking
  3. Bath fill mode (low priority I do not use this function)

Working Theory

The below Node-Red flow creates a "Rheem Hot Water System" device with 7 (9 with the optional Google Home helper) entities:

  • number.hot_water_temperature: This is used to set the desired hot water temperature in degrees C. It accepts the same values as the app - namely between 37C and 50C.
  • sensor.hot_water_current_temperature: This is the currently set hot water temperature in degrees. This may not always be the same as the requested temperature in number.hot_water_temperature because, for example, the worker thread is still requesting the new temperature or if sensor.hot_water_flow is non-zero for safety reasons the temperature cannot be set.
  • sensor.hot_water_flow: The current flow rate through the hot water system in L/minute.
  • switch.automation_hot_water_timeout: This enables/ disables the automatic timeout of the set hot water temperature. This is a safety feature because even though 50C meets Australian Standards for hot water1; 50C is far too hot for me as an adult and is still capable of scalding especially vulnerable persons such as the elderly and children. Enabling this will reset the temperature to the set default temperature (see below) after the set timeout (see below).
  • number.hot_water_default_temperature: This sets temperature that the hot water system will return to after the relevant timeout.
  • number.hot_water_timeout: This sets how long to wait until the temperature is reset to default.
  • binary_sensor.hot_water_system_fault: This will report a fault if the update worker cannot retrieve the status from the Rheem System. This is likely due to the connection dropping out and based upon my experience can happen sporadically.

  • switch.hot_water (optional): This is an on/off switch which switches between number.hot_water_default_temperature and number.hot_water_google_assistant_hot_temperature. Not strictly necessary but google assistant and siri cannot handle number so this is a workaround which allows you to switch between your two most frequent settings (I use this for the laundry/ dishwasher which needs hotter temperatures).

  • number.hot_water_google_assistant_hot_temperature (optional): This is used to set the "hot" temperature used by assistants when the switch is turned on. Additionally the logic will automatically turn on the switch if number.hot_water_temperature is equal to or above this value (allowing you to turn the hot water "off").

Code v1.1

Node-Red Flow

flow screenshot

Import the following flow into Node Red - do not forget to configure the IP addresses and the HA API integrations as relevant for you.

Node-Red Flow
[{"id":"5b42f717a84ae8e1","type":"http request","z":"0696dd904aa6c7de","name":"Get Current Info","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://XXX.XXX.XXX.XXX/getInfo.cgi","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":700,"y":100,"wires":[["2396d678c51f07e1"]]},{"id":"b5f5f860f82d95f1","type":"inject","z":"0696dd904aa6c7de","name":"Status Update Worker","props":[{"p":"payload"}],"repeat":"1","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":210,"y":100,"wires":[["e9d184371b445d91"]]},{"id":"ab64e497209d9b70","type":"change","z":"0696dd904aa6c7de","name":"Store it in flow.temperature","rules":[{"t":"set","p":"temperature","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1040,"y":340,"wires":[["c3f6338723a63d68"]]},{"id":"eced634799386a54","type":"http request","z":"0696dd904aa6c7de","name":"Take Control of Rheem System","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://XXX.XXX.XXX.XXX/ctrl.cgi?sid=0&heatingCtrl=1","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":230,"y":480,"wires":[["9746d74387ecf508"]]},{"id":"9746d74387ecf508","type":"switch","z":"0696dd904aa6c7de","name":"Check if Error","property":"payload.sid","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":480,"y":480,"wires":[[],["b14b73714804ea04"]]},{"id":"b14b73714804ea04","type":"change","z":"0696dd904aa6c7de","name":"Store Session ID in flow.sid","rules":[{"t":"set","p":"sid","pt":"flow","to":"payload.sid","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":480,"wires":[["0693e8ca6891c5db"]]},{"id":"0693e8ca6891c5db","type":"function","z":"0696dd904aa6c7de","name":"Setup the url","func":"var t = flow.get(\"temperature\");\nvar s = flow.get(\"sid\");\n\nmsg.url = \"http://XXX.XXX.XXX.XXX/set.cgi?sid=\" + s + \"&setTemp=\" + t\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":930,"y":480,"wires":[["537a2e81dc41d614"]]},{"id":"537a2e81dc41d614","type":"http request","z":"0696dd904aa6c7de","name":"Request New Temp","method":"GET","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":1110,"y":480,"wires":[["74d1ee1c63cfa749"]]},{"id":"74d1ee1c63cfa749","type":"switch","z":"0696dd904aa6c7de","name":"Check for Error State","property":"payload.reqtemp","propertyType":"msg","rules":[{"t":"eq","v":"temperature","vt":"flow"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":1320,"y":480,"wires":[["51a197d8852cecb5"],["d4d276c7a7a33b42","62334558a9bb2eb5","51a197d8852cecb5"]]},{"id":"62334558a9bb2eb5","type":"debug","z":"0696dd904aa6c7de","name":"Print Payload for Debugging","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1630,"y":560,"wires":[]},{"id":"d4d276c7a7a33b42","type":"debug","z":"0696dd904aa6c7de","name":"Print encoded url for Debugging","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"url","targetType":"msg","statusVal":"","statusType":"auto","x":1640,"y":600,"wires":[]},{"id":"51a197d8852cecb5","type":"delay","z":"0696dd904aa6c7de","name":"Wait 1s","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1540,"y":480,"wires":[["ad81a1605da79aad"]]},{"id":"ad81a1605da79aad","type":"function","z":"0696dd904aa6c7de","name":"Setup the url","func":"var s = flow.get(\"sid\");\n\nmsg.url = \"http://XXX.XXX.XXX.XXX/ctrl.cgi?sid=\" + s + \"&heatingCtrl=0\"\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1710,"y":480,"wires":[["a76078cb19481e28"]]},{"id":"a76078cb19481e28","type":"http request","z":"0696dd904aa6c7de","name":"Relinquish Control","method":"GET","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":1890,"y":480,"wires":[["9c423f42122a3e93","ac8632db6b12bc0d"]]},{"id":"9c423f42122a3e93","type":"switch","z":"0696dd904aa6c7de","name":"Check for Error State","property":"payload.sTimeout","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":2100,"y":480,"wires":[[],["5d703d0aac38620e","5d333b0168fd49af"]]},{"id":"5d703d0aac38620e","type":"debug","z":"0696dd904aa6c7de","name":"Print Payload for Debugging","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2070,"y":560,"wires":[]},{"id":"5d333b0168fd49af","type":"debug","z":"0696dd904aa6c7de","name":"Print encoded url for Debugging","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"url","targetType":"msg","statusVal":"","statusType":"auto","x":2080,"y":600,"wires":[]},{"id":"8078e213ff20ebe9","type":"api-call-service","z":"0696dd904aa6c7de","name":"Reset to Default Temperature","server":"f1028730287dd073","version":5,"debugenabled":false,"domain":"number","service":"set_value","areaId":[],"deviceId":[],"entityId":["number.hot_water_temperature"],"data":"{ \"value\": default_temperature }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":700,"y":880,"wires":[[]]},{"id":"ac8632db6b12bc0d","type":"change","z":"0696dd904aa6c7de","name":"Enable Set Temp","rules":[{"t":"set","p":"set_temp_enable","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":2090,"y":440,"wires":[[]]},{"id":"c896f86b6918ce48","type":"inject","z":"0696dd904aa6c7de","name":"Reset","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1910,"y":420,"wires":[["ac8632db6b12bc0d"]]},{"id":"c3f6338723a63d68","type":"switch","z":"0696dd904aa6c7de","name":"Only 1 at a time","property":"set_temp_enable","propertyType":"flow","rules":[{"t":"false"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":1260,"y":340,"wires":[[],["042514a7082e23c7"]],"info":"Setting this bit only allows one change to occur at a time. This can be an issue if the temperature is adjusted multiple times very quickly."},{"id":"9e45702398f76732","type":"change","z":"0696dd904aa6c7de","name":"Disable Set Temp","rules":[{"t":"set","p":"set_temp_enable","pt":"flow","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":2090,"y":340,"wires":[["eced634799386a54"]]},{"id":"3559c1ec83840f53","type":"inject","z":"0696dd904aa6c7de","name":"Reset Enable Flag Worker","props":[{"p":"payload"}],"repeat":"5","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":220,"y":980,"wires":[["b99426195443e181","a77eab72b919fa50"]],"info":"The device is very finicky and even with my hot water heater around 3 metres from the wifi module it drops out every now and then.\r\nThis resets the enable flags once per minute in case there is a connectivity issue to deal with this potential issue."},{"id":"b99426195443e181","type":"switch","z":"0696dd904aa6c7de","name":"Status Enable Flag","property":"get_status_enable","propertyType":"flow","rules":[{"t":"false"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":490,"y":960,"wires":[["177d3d08ba3c7dac"],[]]},{"id":"a77eab72b919fa50","type":"switch","z":"0696dd904aa6c7de","name":"Temp Enable Flag","property":"set_temp_enable","propertyType":"flow","rules":[{"t":"false"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":490,"y":1020,"wires":[["e453f5396d7ade80"],[]]},{"id":"177d3d08ba3c7dac","type":"delay","z":"0696dd904aa6c7de","name":"Rate Limit to 1 per Minute","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":730,"y":960,"wires":[["923ef1f2ef005460"]]},{"id":"e453f5396d7ade80","type":"delay","z":"0696dd904aa6c7de","name":"Rate Limit to 1 per Minute","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":730,"y":1020,"wires":[["2edd37d95f8da095"]]},{"id":"923ef1f2ef005460","type":"delay","z":"0696dd904aa6c7de","name":"Wait 1 minute","pauseType":"delay","timeout":"1","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1000,"y":960,"wires":[["2d2af9e970c7c24a"]]},{"id":"2edd37d95f8da095","type":"delay","z":"0696dd904aa6c7de","name":"Wait 1 minute","pauseType":"delay","timeout":"1","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1000,"y":1020,"wires":[["eae7323633b22869"]]},{"id":"2d2af9e970c7c24a","type":"change","z":"0696dd904aa6c7de","name":"Enable Status check","rules":[{"t":"set","p":"get_status_enable","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1220,"y":960,"wires":[["72a9ccfb8a182444"]]},{"id":"eae7323633b22869","type":"change","z":"0696dd904aa6c7de","name":"Enable Set Temp","rules":[{"t":"set","p":"set_temp_enable","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1210,"y":1020,"wires":[["d0f52e80b4f985e0"]]},{"id":"72a9ccfb8a182444","type":"change","z":"0696dd904aa6c7de","name":"Reset","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1430,"y":960,"wires":[["923ef1f2ef005460","177d3d08ba3c7dac"]]},{"id":"d0f52e80b4f985e0","type":"change","z":"0696dd904aa6c7de","name":"Reset","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1430,"y":1020,"wires":[["2edd37d95f8da095","e453f5396d7ade80"]]},{"id":"e9d184371b445d91","type":"delay","z":"0696dd904aa6c7de","name":"Maximum 1 per 1 second(s)","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":true,"outputs":1,"x":470,"y":100,"wires":[["5b42f717a84ae8e1"]]},{"id":"2396d678c51f07e1","type":"switch","z":"0696dd904aa6c7de","name":"Check Status Code","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"200","vt":"num"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":890,"y":100,"wires":[["384128d5d75a8c8e","193d8d9d89153d32","30fb9c2a26d1c6bc"],["21057ddd5151fd0a"]]},{"id":"21057ddd5151fd0a","type":"change","z":"0696dd904aa6c7de","name":"Change Rate Limit to 1/5min","rules":[{"t":"delete","p":"payload","pt":"msg"},{"t":"set","p":"rate","pt":"msg","to":"300000","tot":"num"},{"t":"set","p":"payload.state","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1060,"y":180,"wires":[["e9d184371b445d91","a7839f383614bfc2"]],"info":"Lower the rate limit if the device appears to be offline. There can be issues with requests queuing up and then bombarding the device all at once."},{"id":"384128d5d75a8c8e","type":"change","z":"0696dd904aa6c7de","name":"Change Rate Limit to 1/1s","rules":[{"t":"delete","p":"payload","pt":"msg"},{"t":"set","p":"rate","pt":"msg","to":"1000","tot":"num"},{"t":"set","p":"payload.state","pt":"msg","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1130,"y":40,"wires":[["e9d184371b445d91","a7839f383614bfc2"]],"info":"The rate limit is set to 1s because the device is naive and will block all requests if too many requests are sent per second (this can happen if for example if the status worker queues a request every second but the request takes more than 1 second to complete (resulting in multiple requests hitting the device at a time))."},{"id":"a7839f383614bfc2","type":"ha-binary-sensor","z":"0696dd904aa6c7de","name":"Hot Water System Fault","entityConfig":"1f0b4dda838ff26f","version":0,"state":"payload","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[],"x":1650,"y":180,"wires":[[]]},{"id":"51cf436bbd7cbaf4","type":"ha-number","z":"0696dd904aa6c7de","name":"Hot Water Temperature","version":1,"debugenabled":false,"inputs":0,"outputs":1,"entityConfig":"45814c1df11da288","mode":"listen","value":"payload","valueType":"msg","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"value"}],"x":200,"y":340,"wires":[["c49192547f6f2c1c"]]},{"id":"e05abb2bfb924b50","type":"ha-sensor","z":"0696dd904aa6c7de","name":"Hot Water Current Temperature","entityConfig":"8f5d41d1249b7816","version":0,"state":"payload.temp","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[],"x":1650,"y":100,"wires":[[]]},{"id":"508645f10065beeb","type":"ha-sensor","z":"0696dd904aa6c7de","name":"Hot Water Flow","entityConfig":"1ce788ad9baaf0e1","version":0,"state":"payload.flow","stateType":"msg","attributes":[],"inputOverride":"block","outputProperties":[],"x":1580,"y":40,"wires":[[]]},{"id":"193d8d9d89153d32","type":"change","z":"0696dd904aa6c7de","name":"Rewrite Msg","rules":[{"t":"set","p":"payload.state","pt":"msg","to":"payload.flow","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1290,"y":80,"wires":[["508645f10065beeb"]]},{"id":"30fb9c2a26d1c6bc","type":"change","z":"0696dd904aa6c7de","name":"Rewrite Msg","rules":[{"t":"set","p":"payload.state","pt":"msg","to":"payload.temp","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1290,"y":140,"wires":[["e05abb2bfb924b50"]]},{"id":"bac57b6064eedf90","type":"switch","z":"0696dd904aa6c7de","name":"Compare Requested and Current","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"current_temperature","vt":"msg"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":740,"y":340,"wires":[[],["ab64e497209d9b70"]]},{"id":"c49192547f6f2c1c","type":"api-current-state","z":"0696dd904aa6c7de","name":"Check Current Temperature","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.hot_water_current_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"current_temperature","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":460,"y":340,"wires":[["bac57b6064eedf90"]]},{"id":"3462a5e5c5120024","type":"ha-number","z":"0696dd904aa6c7de","name":"Hot Water Default Temperature","version":1,"debugenabled":false,"inputs":0,"outputs":1,"entityConfig":"8660e8bc5b0a715e","mode":"listen","value":"payload","valueType":"msg","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"value"},{"property":"previousValue","propertyType":"msg","value":"","valueType":"previousValue"}],"x":210,"y":640,"wires":[["fb4de64eada90c7f"]]},{"id":"fb4de64eada90c7f","type":"change","z":"0696dd904aa6c7de","name":"Set flow.default_temperature","rules":[{"t":"set","p":"default_temperature","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":640,"wires":[["c95a99d6cb4e8061"]]},{"id":"b59baed7a9f31063","type":"ha-number","z":"0696dd904aa6c7de","name":"Hot Water Timeout","version":1,"debugenabled":false,"inputs":0,"outputs":1,"entityConfig":"8d8d8a2ce2269de0","mode":"listen","value":"payload","valueType":"msg","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"value"}],"x":170,"y":720,"wires":[["76b7c7aa0a8ad2de"]]},{"id":"76b7c7aa0a8ad2de","type":"function","z":"0696dd904aa6c7de","name":"Convert to milliseconds","func":"msg.payload = msg.payload * 60 * 1000;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":720,"wires":[["04e4f3819fda56d7"]]},{"id":"04e4f3819fda56d7","type":"change","z":"0696dd904aa6c7de","name":"Set flow.delay","rules":[{"t":"set","p":"delay","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":920,"y":720,"wires":[[]]},{"id":"c95a99d6cb4e8061","type":"api-call-service","z":"0696dd904aa6c7de","name":"Set Temperature to Default","server":"f1028730287dd073","version":5,"debugenabled":false,"domain":"number","service":"set_value","areaId":[],"deviceId":[],"entityId":["number.hot_water_temperature"],"data":"{ \"value\": payload }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":940,"y":640,"wires":[[]]},{"id":"2cdefe2e3a3c1b76","type":"inject","z":"0696dd904aa6c7de","name":"Run Once on Startup","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":200,"y":780,"wires":[["6a835e9ed6f964c6"]]},{"id":"6a835e9ed6f964c6","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get Hot Water Timeout","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"number.hot_water_timeout","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":420,"y":780,"wires":[["76b7c7aa0a8ad2de"]]},{"id":"6f5879b3c824d8c1","type":"inject","z":"0696dd904aa6c7de","name":"Run Once on Startup","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":180,"y":580,"wires":[["1ad6d0113da91aee"]]},{"id":"1ad6d0113da91aee","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get Hot Water Default Temperature","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"number.hot_water_default_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":440,"y":580,"wires":[["fb4de64eada90c7f"]]},{"id":"042514a7082e23c7","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get Current Flow","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.hot_water_flow","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"flow","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":1490,"y":340,"wires":[["2db0d4223a2f0ec1"]],"info":"This makes the loop wait until the requested temp = current temp (otherwise the temperature change worker is likely still operating)"},{"id":"2db0d4223a2f0ec1","type":"switch","z":"0696dd904aa6c7de","name":"Check if Flow is 0","property":"flow","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":1750,"y":340,"wires":[["9e45702398f76732"],["2e9dec374b153988"]]},{"id":"2e9dec374b153988","type":"delay","z":"0696dd904aa6c7de","name":"Wait 5 Seconds and Recheck","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":1620,"y":260,"wires":[["042514a7082e23c7"]]},{"id":"8ed1f3b56286ca70","type":"inject","z":"0696dd904aa6c7de","name":"Reset","props":[{"p":"reset","v":"true","vt":"bool"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":1350,"y":260,"wires":[["2e9dec374b153988"]]},{"id":"84f7eb2439a04beb","type":"api-current-state","z":"0696dd904aa6c7de","name":"Check Flow","server":"f1028730287dd073","version":3,"outputs":2,"halt_if":"0","halt_if_type":"num","halt_if_compare":"is","entity_id":"sensor.hot_water_flow","state_type":"num","blockInputOverrides":false,"outputProperties":[],"for":"delay","forType":"flow","forUnits":"milliseconds","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":450,"y":880,"wires":[["8078e213ff20ebe9"],[]]},{"id":"7c97616ad0acbe51","type":"server-state-changed","z":"0696dd904aa6c7de","name":"Automation - Hot Water Timeout","server":"f1028730287dd073","version":5,"outputs":2,"exposeAsEntityConfig":"020edd2b2bd16f44","entityId":"number.hot_water_temperature","entityIdType":"exact","outputInitially":false,"stateType":"num","ifState":"default_temperature","ifStateType":"flow","ifStateOperator":"is_not","outputOnlyOnStateChange":true,"for":"delay","forType":"flow","forUnits":"milliseconds","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"default_temperature","propertyType":"msg","value":"default_temperature","valueType":"flow"}],"x":210,"y":880,"wires":[["84f7eb2439a04beb"],[]]},{"id":"f1028730287dd073","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"1f0b4dda838ff26f","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Binary Sensor for Hot Water System Fault","version":"6","entityType":"binary_sensor","haConfig":[{"property":"name","value":"Hot Water System Fault"},{"property":"icon","value":""},{"property":"entity_category","value":"diagnostic"},{"property":"entity_picture","value":""},{"property":"device_class","value":"problem"}],"resend":false,"debugEnabled":false},{"id":"45814c1df11da288","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Number for Hot Water Temperature","version":"6","entityType":"number","haConfig":[{"property":"name","value":"Hot Water Temperature"},{"property":"icon","value":"mdi:kettle-steam-outline"},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":"temperature"},{"property":"unit_of_measurement","value":"°C"},{"property":"min_value","value":37},{"property":"max_value","value":50},{"property":"step_value","value":1},{"property":"mode","value":"auto"}],"resend":false,"debugEnabled":false},{"id":"8f5d41d1249b7816","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Sensor Config for Hot Water Current Temperature","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Hot Water Current Temperature"},{"property":"icon","value":""},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":"temperature"},{"property":"unit_of_measurement","value":"°C"},{"property":"state_class","value":"measurement"}],"resend":false,"debugEnabled":false},{"id":"1ce788ad9baaf0e1","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Sensor Config for Hot Water Flow","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Hot Water Flow"},{"property":"icon","value":"mdi:faucet"},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":"L/min"},{"property":"state_class","value":"measurement"}],"resend":false,"debugEnabled":false},{"id":"8660e8bc5b0a715e","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Number Config for Hot Water Default Temperature","version":"6","entityType":"number","haConfig":[{"property":"name","value":"Hot Water Default Temperature"},{"property":"icon","value":"mdi:thermometer-chevron-down"},{"property":"entity_picture","value":""},{"property":"entity_category","value":"config"},{"property":"device_class","value":"temperature"},{"property":"unit_of_measurement","value":"°C"},{"property":"min_value","value":37},{"property":"max_value","value":50},{"property":"step_value","value":1},{"property":"mode","value":"auto"}],"resend":false,"debugEnabled":false},{"id":"8d8d8a2ce2269de0","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Number for Hot Water Timeout","version":"6","entityType":"number","haConfig":[{"property":"name","value":"Hot Water Timeout"},{"property":"icon","value":"mdi:timer"},{"property":"entity_picture","value":""},{"property":"entity_category","value":"config"},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":"min"},{"property":"min_value","value":1},{"property":"max_value","value":60},{"property":"step_value","value":1},{"property":"mode","value":"box"}],"resend":false,"debugEnabled":false},{"id":"020edd2b2bd16f44","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"exposed as for Automation - Hot Water Timeout","version":"6","entityType":"switch","haConfig":[{"property":"name","value":"Automation - Hot Water Timeout"},{"property":"icon","value":"mdi:timer-cancel"},{"property":"entity_category","value":"config"},{"property":"entity_picture","value":""},{"property":"device_class","value":""}],"resend":false,"debugEnabled":false},{"id":"ac4d05f67b79f774","type":"ha-device-config","name":"Rheem Hot Water System","hwVersion":"","manufacturer":"Rheem","model":"","swVersion":""}]

Node-Red Flow (Optional Google Home/ Siri Components)

subflow screenshot

Import this onto the same flow as the above.

Node-Red Flow (Optional Google Home/ Siri Components)
[{"id":"65619639265cf5ea","type":"api-call-service","z":"0696dd904aa6c7de","name":"Set Water Hot","server":"f1028730287dd073","version":5,"debugenabled":false,"domain":"number","service":"set_value","areaId":[],"deviceId":[],"entityId":["number.hot_water_temperature"],"data":"{\"value\":payload}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1160,"y":1300,"wires":[[]]},{"id":"741797cf63baafe2","type":"api-call-service","z":"0696dd904aa6c7de","name":"Set Water Normal","server":"f1028730287dd073","version":5,"debugenabled":false,"domain":"number","service":"set_value","areaId":[],"deviceId":[],"entityId":["number.hot_water_temperature"],"data":"{ \"value\" : payload }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1170,"y":1360,"wires":[[]]},{"id":"02ded775b14645ca","type":"switch","z":"0696dd904aa6c7de","name":"Check Temp","property":"payload","propertyType":"msg","rules":[{"t":"lte","v":"default_temperature","vt":"flow"},{"t":"gte","v":"ga_hot_temperature","vt":"flow"},{"t":"else"}],"checkall":"false","repair":false,"outputs":3,"x":630,"y":1440,"wires":[["4e7cfaf142737137"],["0894899f5f2d3261"],[]]},{"id":"2aa646efaaf4bad9","type":"inject","z":"0696dd904aa6c7de","name":"Hot Water Switch Update Worker","props":[{"p":"payload"}],"repeat":"5","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":260,"y":1440,"wires":[["cc50e38cf7f45292"]]},{"id":"cc50e38cf7f45292","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get State","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"number.hot_water_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":480,"y":1440,"wires":[["02ded775b14645ca"]]},{"id":"4e7cfaf142737137","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get Switch State","server":"f1028730287dd073","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"switch.hot_water","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":830,"y":1420,"wires":[["e5ebe23f84a26b15"],[]]},{"id":"8103ab9894b106a7","type":"api-call-service","z":"0696dd904aa6c7de","name":"Turn off Switch","server":"f1028730287dd073","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["switch.hot_water"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1300,"y":1420,"wires":[["a12a4ea3cf6f74c8"]]},{"id":"1d92721dc5c2d73e","type":"ha-switch","z":"0696dd904aa6c7de","name":"Hot Water Switch - Google Helper","version":0,"inputs":1,"outputs":2,"entityConfig":"5ac0a59db72278da","enableInput":true,"outputOnStateChange":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"$entity().state ? \"on\": \"off\"","valueType":"jsonata"}],"x":220,"y":1320,"wires":[["0a07992ba542fdfe"],["b8d4ad85feb2585b"]],"info":"Google Home/ Assistant doesn't currently allow number inputs. This allows switching between two hot and normal using Google devices."},{"id":"b58efdd7978d22ca","type":"change","z":"0696dd904aa6c7de","name":"Set payload to flow.default_temperature","rules":[{"t":"set","p":"payload","pt":"msg","to":"default_temperature","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":880,"y":1360,"wires":[["741797cf63baafe2"]]},{"id":"0894899f5f2d3261","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get Switch State","server":"f1028730287dd073","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"switch.hot_water","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":830,"y":1480,"wires":[["dbdca9f51c06b445"],[]]},{"id":"8f9fb0f0f96e626e","type":"api-call-service","z":"0696dd904aa6c7de","name":"Turn on Switch","server":"f1028730287dd073","version":5,"debugenabled":false,"domain":"switch","service":"turn_on","areaId":[],"deviceId":[],"entityId":["switch.hot_water"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1300,"y":1480,"wires":[["e8ed2fbb661c9e1e"]]},{"id":"437e01bd717d10f1","type":"ha-number","z":"0696dd904aa6c7de","name":"Hot Water Google Assistant Hot Temperature","version":1,"debugenabled":false,"inputs":0,"outputs":1,"entityConfig":"d7a35d4246adf20c","mode":"listen","value":"payload","valueType":"msg","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"value"}],"x":250,"y":1220,"wires":[["0d31ba78cc822680"]]},{"id":"0d31ba78cc822680","type":"change","z":"0696dd904aa6c7de","name":"Set flow.ga_hot_temperature","rules":[{"t":"set","p":"ga_hot_temperature","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":1220,"wires":[[]]},{"id":"519efd6c76a4d5ce","type":"inject","z":"0696dd904aa6c7de","name":"Run Once on Startup","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":180,"y":1160,"wires":[["fdc1ab0543682c70"]]},{"id":"fdc1ab0543682c70","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get Hot Water Google Assistant Hot Temperature","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"number.hot_water_google_assistant_hot_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":490,"y":1160,"wires":[["0d31ba78cc822680"]]},{"id":"afb8b51eb801ea92","type":"change","z":"0696dd904aa6c7de","name":"Set payload to flow.ga_hot_temperature","rules":[{"t":"set","p":"payload","pt":"msg","to":"ga_hot_temperature","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":880,"y":1300,"wires":[["65619639265cf5ea"]]},{"id":"e5ebe23f84a26b15","type":"change","z":"0696dd904aa6c7de","name":"Set ga_ignore flag","rules":[{"t":"set","p":"ga_ignore","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1050,"y":1420,"wires":[["8103ab9894b106a7"]]},{"id":"dbdca9f51c06b445","type":"change","z":"0696dd904aa6c7de","name":"Set ga_ignore flag","rules":[{"t":"set","p":"ga_ignore","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1050,"y":1480,"wires":[["8f9fb0f0f96e626e"]]},{"id":"a12a4ea3cf6f74c8","type":"change","z":"0696dd904aa6c7de","name":"Unset ga_ignore flag","rules":[{"t":"set","p":"ga_ignore","pt":"flow","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1540,"y":1420,"wires":[[]]},{"id":"e8ed2fbb661c9e1e","type":"change","z":"0696dd904aa6c7de","name":"Unset ga_ignore flag","rules":[{"t":"set","p":"ga_ignore","pt":"flow","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1540,"y":1480,"wires":[[]]},{"id":"0a07992ba542fdfe","type":"switch","z":"0696dd904aa6c7de","name":"Check ga_ignore Flag","property":"ga_ignore","propertyType":"flow","rules":[{"t":"false"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":540,"y":1300,"wires":[["afb8b51eb801ea92"],[]]},{"id":"b8d4ad85feb2585b","type":"switch","z":"0696dd904aa6c7de","name":"Check ga_ignore Flag","property":"ga_ignore","propertyType":"flow","rules":[{"t":"false"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":540,"y":1360,"wires":[["b58efdd7978d22ca"],[]]},{"id":"f1028730287dd073","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"5ac0a59db72278da","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"switch config for Hot Water Switch - Google Helper","version":"6","entityType":"switch","haConfig":[{"property":"name","value":"Hot Water"},{"property":"icon","value":"mdi:kettle-steam-outline"},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":""}],"resend":true,"debugEnabled":false},{"id":"d7a35d4246adf20c","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Number Config for Hot Water Google Assistant Hot Temperature","version":"6","entityType":"number","haConfig":[{"property":"name","value":"Hot Water Google Assistant Hot Temperature"},{"property":"icon","value":"mdi:thermometer-chevron-up"},{"property":"entity_picture","value":""},{"property":"entity_category","value":"config"},{"property":"device_class","value":"temperature"},{"property":"unit_of_measurement","value":"°C"},{"property":"min_value","value":37},{"property":"max_value","value":50},{"property":"step_value","value":1},{"property":"mode","value":"auto"}],"resend":false,"debugEnabled":false},{"id":"ac4d05f67b79f774","type":"ha-device-config","name":"Rheem Hot Water System","hwVersion":"","manufacturer":"Rheem","model":"","swVersion":""}]

Code v1.0

Node-Red Flow

flow screenshot

Import the following flow into Node Red - do not forget to configure the IP addresses and the HA API integrations as relevant for you.

Node-Red Flow
[{"id":"35bc46e08a2a88b3","type":"delay","z":"0696dd904aa6c7de","name":"Wait for set timeout","pauseType":"delayv","timeout":"10","timeoutUnits":"seconds","rate":"1","nbRateUnits":"30","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":1670,"y":880,"wires":[["8078e213ff20ebe9"]]},{"id":"959ae573c614ed1d","type":"change","z":"0696dd904aa6c7de","name":"Reset Loops","rules":[{"t":"set","p":"reset","pt":"msg","to":"reset","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1970,"y":980,"wires":[["35bc46e08a2a88b3"]]},{"id":"5b42f717a84ae8e1","type":"http request","z":"0696dd904aa6c7de","name":"Get Current Info","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://XXX.XXX.XXX.XXX/getInfo.cgi","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":700,"y":100,"wires":[["2396d678c51f07e1"]]},{"id":"b5f5f860f82d95f1","type":"inject","z":"0696dd904aa6c7de","name":"Status Update Worker","props":[{"p":"payload"}],"repeat":"1","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":210,"y":100,"wires":[["e9d184371b445d91"]]},{"id":"ab64e497209d9b70","type":"change","z":"0696dd904aa6c7de","name":"Store it in flow.temperature","rules":[{"t":"set","p":"temperature","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1040,"y":300,"wires":[["c3f6338723a63d68"]]},{"id":"eced634799386a54","type":"http request","z":"0696dd904aa6c7de","name":"Take Control of Rheem System","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://XXX.XXX.XXX.XXX/ctrl.cgi?sid=0&heatingCtrl=1","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":230,"y":440,"wires":[["9746d74387ecf508"]]},{"id":"9746d74387ecf508","type":"switch","z":"0696dd904aa6c7de","name":"Check if Error","property":"payload.sid","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":480,"y":440,"wires":[[],["b14b73714804ea04"]]},{"id":"b14b73714804ea04","type":"change","z":"0696dd904aa6c7de","name":"Store Session ID in flow.sid","rules":[{"t":"set","p":"sid","pt":"flow","to":"payload.sid","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":440,"wires":[["0693e8ca6891c5db"]]},{"id":"0693e8ca6891c5db","type":"function","z":"0696dd904aa6c7de","name":"Setup the url","func":"var t = flow.get(\"temperature\");\nvar s = flow.get(\"sid\");\n\nmsg.url = \"http://XXX.XXX.XXX.XXX/set.cgi?sid=\" + s + \"&setTemp=\" + t\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":930,"y":440,"wires":[["537a2e81dc41d614"]]},{"id":"537a2e81dc41d614","type":"http request","z":"0696dd904aa6c7de","name":"Request New Temp","method":"GET","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":1110,"y":440,"wires":[["74d1ee1c63cfa749"]]},{"id":"74d1ee1c63cfa749","type":"switch","z":"0696dd904aa6c7de","name":"Check for Error State","property":"payload.reqtemp","propertyType":"msg","rules":[{"t":"eq","v":"temperature","vt":"flow"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":1320,"y":440,"wires":[["51a197d8852cecb5"],["d4d276c7a7a33b42","62334558a9bb2eb5","51a197d8852cecb5"]]},{"id":"62334558a9bb2eb5","type":"debug","z":"0696dd904aa6c7de","name":"Print Payload for Debugging","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1630,"y":520,"wires":[]},{"id":"d4d276c7a7a33b42","type":"debug","z":"0696dd904aa6c7de","name":"Print encoded url for Debugging","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"url","targetType":"msg","statusVal":"","statusType":"auto","x":1640,"y":560,"wires":[]},{"id":"51a197d8852cecb5","type":"delay","z":"0696dd904aa6c7de","name":"Wait 1s","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1540,"y":440,"wires":[["ad81a1605da79aad"]]},{"id":"ad81a1605da79aad","type":"function","z":"0696dd904aa6c7de","name":"Setup the url","func":"var s = flow.get(\"sid\");\n\nmsg.url = \"http://XXX.XXX.XXX.XXX/ctrl.cgi?sid=\" + s + \"&heatingCtrl=0\"\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1710,"y":440,"wires":[["a76078cb19481e28"]]},{"id":"a76078cb19481e28","type":"http request","z":"0696dd904aa6c7de","name":"Relinquish Control","method":"GET","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":1890,"y":440,"wires":[["9c423f42122a3e93","ac8632db6b12bc0d"]]},{"id":"9c423f42122a3e93","type":"switch","z":"0696dd904aa6c7de","name":"Check for Error State","property":"payload.sTimeout","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":2100,"y":440,"wires":[[],["5d703d0aac38620e","5d333b0168fd49af"]]},{"id":"5d703d0aac38620e","type":"debug","z":"0696dd904aa6c7de","name":"Print Payload for Debugging","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2070,"y":520,"wires":[]},{"id":"5d333b0168fd49af","type":"debug","z":"0696dd904aa6c7de","name":"Print encoded url for Debugging","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"url","targetType":"msg","statusVal":"","statusType":"auto","x":2080,"y":560,"wires":[]},{"id":"d179e77ab80c9fe8","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get Requested Temp","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"number.hot_water_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":500,"y":820,"wires":[["268fd77321587985"]]},{"id":"95b372d14c567897","type":"switch","z":"0696dd904aa6c7de","name":"Compare Requested and Actual","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"current_temperature","vt":"msg"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":1330,"y":820,"wires":[["91fea70b06d951e5"],["b838db2d3d9b6ded"]]},{"id":"681e05a0cfa36406","type":"switch","z":"0696dd904aa6c7de","name":"Check != flow.default_temperature","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"default_temperature","vt":"flow"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":1020,"y":820,"wires":[[],["95b372d14c567897"]]},{"id":"b838db2d3d9b6ded","type":"delay","z":"0696dd904aa6c7de","name":"Wait 5 Seconds and Recheck","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":720,"y":940,"wires":[["d179e77ab80c9fe8"]]},{"id":"8078e213ff20ebe9","type":"api-call-service","z":"0696dd904aa6c7de","name":"Reset to Default Temperature","server":"f1028730287dd073","version":5,"debugenabled":false,"domain":"number","service":"set_value","areaId":[],"deviceId":[],"entityId":["number.hot_water_temperature"],"data":"{ \"value\": default_temperature }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1960,"y":880,"wires":[["959ae573c614ed1d"]]},{"id":"5332bd453508c644","type":"switch","z":"0696dd904aa6c7de","name":"Check Temp","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"default_temperature","vt":"flow"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":990,"y":980,"wires":[["e164b7b994e53747"],[]]},{"id":"e164b7b994e53747","type":"change","z":"0696dd904aa6c7de","name":"Reset Loop","rules":[{"t":"set","p":"reset","pt":"msg","to":"reset","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1170,"y":960,"wires":[["35bc46e08a2a88b3"]]},{"id":"ac8632db6b12bc0d","type":"change","z":"0696dd904aa6c7de","name":"Enable Set Temp","rules":[{"t":"set","p":"set_temp_enable","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":2090,"y":400,"wires":[[]]},{"id":"c896f86b6918ce48","type":"inject","z":"0696dd904aa6c7de","name":"Reset","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1910,"y":380,"wires":[["ac8632db6b12bc0d"]]},{"id":"c3f6338723a63d68","type":"switch","z":"0696dd904aa6c7de","name":"Only 1 at a time","property":"set_temp_enable","propertyType":"flow","rules":[{"t":"false"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":1260,"y":300,"wires":[[],["9e45702398f76732"]],"info":"Setting this bit only allows one change to occur at a time. This can be an issue if the temperature is adjusted multiple times very quickly."},{"id":"9e45702398f76732","type":"change","z":"0696dd904aa6c7de","name":"Disable Set Temp","rules":[{"t":"set","p":"set_temp_enable","pt":"flow","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1470,"y":300,"wires":[["eced634799386a54"]]},{"id":"3559c1ec83840f53","type":"inject","z":"0696dd904aa6c7de","name":"Reset Enable Flag Worker","props":[{"p":"payload"}],"repeat":"5","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":220,"y":1140,"wires":[["b99426195443e181","a77eab72b919fa50"]],"info":"The device is very finicky and even with my hot water heater around 3 metres from the wifi module it drops out every now and then.\r\nThis resets the enable flags once per minute in case there is a connectivity issue to deal with this potential issue."},{"id":"b99426195443e181","type":"switch","z":"0696dd904aa6c7de","name":"Status Enable Flag","property":"get_status_enable","propertyType":"flow","rules":[{"t":"false"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":490,"y":1120,"wires":[["177d3d08ba3c7dac"],[]]},{"id":"a77eab72b919fa50","type":"switch","z":"0696dd904aa6c7de","name":"Temp Enable Flag","property":"set_temp_enable","propertyType":"flow","rules":[{"t":"false"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":490,"y":1180,"wires":[["e453f5396d7ade80"],[]]},{"id":"177d3d08ba3c7dac","type":"delay","z":"0696dd904aa6c7de","name":"Rate Limit to 1 per Minute","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":730,"y":1120,"wires":[["923ef1f2ef005460"]]},{"id":"e453f5396d7ade80","type":"delay","z":"0696dd904aa6c7de","name":"Rate Limit to 1 per Minute","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"minute","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":730,"y":1180,"wires":[["2edd37d95f8da095"]]},{"id":"923ef1f2ef005460","type":"delay","z":"0696dd904aa6c7de","name":"Wait 1 minute","pauseType":"delay","timeout":"1","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1000,"y":1120,"wires":[["2d2af9e970c7c24a"]]},{"id":"2edd37d95f8da095","type":"delay","z":"0696dd904aa6c7de","name":"Wait 1 minute","pauseType":"delay","timeout":"1","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":1000,"y":1180,"wires":[["eae7323633b22869"]]},{"id":"2d2af9e970c7c24a","type":"change","z":"0696dd904aa6c7de","name":"Enable Status check","rules":[{"t":"set","p":"get_status_enable","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1220,"y":1120,"wires":[["72a9ccfb8a182444"]]},{"id":"eae7323633b22869","type":"change","z":"0696dd904aa6c7de","name":"Enable Set Temp","rules":[{"t":"set","p":"set_temp_enable","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1210,"y":1180,"wires":[["d0f52e80b4f985e0"]]},{"id":"72a9ccfb8a182444","type":"change","z":"0696dd904aa6c7de","name":"Reset","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1430,"y":1120,"wires":[["923ef1f2ef005460","177d3d08ba3c7dac"]]},{"id":"d0f52e80b4f985e0","type":"change","z":"0696dd904aa6c7de","name":"Reset","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1430,"y":1180,"wires":[["2edd37d95f8da095","e453f5396d7ade80"]]},{"id":"e9d184371b445d91","type":"delay","z":"0696dd904aa6c7de","name":"Maximum 1 per 1 second(s)","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":true,"outputs":1,"x":470,"y":100,"wires":[["5b42f717a84ae8e1"]]},{"id":"2396d678c51f07e1","type":"switch","z":"0696dd904aa6c7de","name":"Check Status Code","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"200","vt":"num"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":890,"y":100,"wires":[["384128d5d75a8c8e","193d8d9d89153d32","30fb9c2a26d1c6bc"],["21057ddd5151fd0a"]]},{"id":"21057ddd5151fd0a","type":"change","z":"0696dd904aa6c7de","name":"Change Rate Limit to 1/5min","rules":[{"t":"delete","p":"payload","pt":"msg"},{"t":"set","p":"rate","pt":"msg","to":"300000","tot":"num"},{"t":"set","p":"payload.state","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1060,"y":180,"wires":[["e9d184371b445d91","a7839f383614bfc2"]],"info":"Lower the rate limit if the device appears to be offline. There can be issues with requests queuing up and then bombarding the device all at once."},{"id":"384128d5d75a8c8e","type":"change","z":"0696dd904aa6c7de","name":"Change Rate Limit to 1/1s","rules":[{"t":"delete","p":"payload","pt":"msg"},{"t":"set","p":"rate","pt":"msg","to":"1000","tot":"num"},{"t":"set","p":"payload.state","pt":"msg","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1130,"y":40,"wires":[["e9d184371b445d91","a7839f383614bfc2"]],"info":"The rate limit is set to 1s because the device is naive and will block all requests if too many requests are sent per second (this can happen if for example if the status worker queues a request every second but the request takes more than 1 second to complete (resulting in multiple requests hitting the device at a time))."},{"id":"a7839f383614bfc2","type":"ha-binary-sensor","z":"0696dd904aa6c7de","name":"Hot Water System Fault","entityConfig":"1f0b4dda838ff26f","version":0,"state":"payload","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[],"x":1650,"y":180,"wires":[[]]},{"id":"24961fb23aa2b21f","type":"server-state-changed","z":"0696dd904aa6c7de","name":"Automation - Hot Water Timeout","server":"f1028730287dd073","version":5,"outputs":1,"exposeAsEntityConfig":"020edd2b2bd16f44","entityId":"number.hot_water_temperature","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":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":230,"y":820,"wires":[["d179e77ab80c9fe8","959ae573c614ed1d"]]},{"id":"51cf436bbd7cbaf4","type":"ha-number","z":"0696dd904aa6c7de","name":"Hot Water Temperature","version":1,"debugenabled":false,"inputs":0,"outputs":1,"entityConfig":"45814c1df11da288","mode":"listen","value":"payload","valueType":"msg","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"value"}],"x":200,"y":300,"wires":[["c49192547f6f2c1c"]]},{"id":"e05abb2bfb924b50","type":"ha-sensor","z":"0696dd904aa6c7de","name":"Hot Water Current Temperature","entityConfig":"8f5d41d1249b7816","version":0,"state":"payload.temp","stateType":"msg","attributes":[],"inputOverride":"allow","outputProperties":[],"x":1650,"y":100,"wires":[[]]},{"id":"508645f10065beeb","type":"ha-sensor","z":"0696dd904aa6c7de","name":"Hot Water Flow","entityConfig":"1ce788ad9baaf0e1","version":0,"state":"payload.flow","stateType":"msg","attributes":[],"inputOverride":"block","outputProperties":[],"x":1580,"y":40,"wires":[[]]},{"id":"193d8d9d89153d32","type":"change","z":"0696dd904aa6c7de","name":"Rewrite Msg","rules":[{"t":"set","p":"payload.state","pt":"msg","to":"payload.flow","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1290,"y":80,"wires":[["508645f10065beeb"]]},{"id":"30fb9c2a26d1c6bc","type":"change","z":"0696dd904aa6c7de","name":"Rewrite Msg","rules":[{"t":"set","p":"payload.state","pt":"msg","to":"payload.temp","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1290,"y":140,"wires":[["e05abb2bfb924b50"]]},{"id":"bac57b6064eedf90","type":"switch","z":"0696dd904aa6c7de","name":"Compare Requested and Current","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"current_temperature","vt":"msg"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":740,"y":300,"wires":[[],["ab64e497209d9b70"]]},{"id":"c49192547f6f2c1c","type":"api-current-state","z":"0696dd904aa6c7de","name":"Check Current Temperature","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.hot_water_current_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"current_temperature","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":460,"y":300,"wires":[["bac57b6064eedf90"]]},{"id":"3462a5e5c5120024","type":"ha-number","z":"0696dd904aa6c7de","name":"Hot Water Default Temperature","version":1,"debugenabled":false,"inputs":0,"outputs":1,"entityConfig":"8660e8bc5b0a715e","mode":"listen","value":"payload","valueType":"msg","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"value"},{"property":"previousValue","propertyType":"msg","value":"","valueType":"previousValue"}],"x":210,"y":600,"wires":[["fb4de64eada90c7f"]]},{"id":"fb4de64eada90c7f","type":"change","z":"0696dd904aa6c7de","name":"Set flow.default_temperature","rules":[{"t":"set","p":"default_temperature","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":600,"wires":[["c95a99d6cb4e8061"]]},{"id":"ca16e3a8acc1e20b","type":"server-state-changed","z":"0696dd904aa6c7de","name":"Check if Temp Manually Changed","server":"f1028730287dd073","version":5,"outputs":1,"exposeAsEntityConfig":"","entityId":"sensor.hot_water_current_temperature","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":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":710,"y":1020,"wires":[["5332bd453508c644"]]},{"id":"268fd77321587985","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get Current Temperature","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.hot_water_current_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"current_temperature","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":750,"y":820,"wires":[["681e05a0cfa36406"]],"info":"This makes the loop wait until the requested temp = current temp (otherwise the temperature change worker is likely still operating)"},{"id":"b59baed7a9f31063","type":"ha-number","z":"0696dd904aa6c7de","name":"Hot Water Timeout","version":1,"debugenabled":false,"inputs":0,"outputs":1,"entityConfig":"8d8d8a2ce2269de0","mode":"listen","value":"payload","valueType":"msg","outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"value"}],"x":170,"y":680,"wires":[["76b7c7aa0a8ad2de"]]},{"id":"76b7c7aa0a8ad2de","type":"function","z":"0696dd904aa6c7de","name":"Convert to milliseconds","func":"msg.payload = msg.payload * 60 * 1000;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":680,"wires":[["04e4f3819fda56d7"]]},{"id":"04e4f3819fda56d7","type":"change","z":"0696dd904aa6c7de","name":"Set flow.delay","rules":[{"t":"set","p":"delay","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":920,"y":680,"wires":[[]]},{"id":"91fea70b06d951e5","type":"change","z":"0696dd904aa6c7de","name":"Set Delay and Default Temperature","rules":[{"t":"set","p":"delay","pt":"msg","to":"delay","tot":"flow"},{"t":"set","p":"default_temperature","pt":"msg","to":"default_temperature","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":1660,"y":820,"wires":[["35bc46e08a2a88b3"]]},{"id":"c95a99d6cb4e8061","type":"api-call-service","z":"0696dd904aa6c7de","name":"Set Temperature to Default","server":"f1028730287dd073","version":5,"debugenabled":false,"domain":"number","service":"set_value","areaId":[],"deviceId":[],"entityId":["number.hot_water_temperature"],"data":"{ \"value\": payload }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":940,"y":600,"wires":[[]]},{"id":"2cdefe2e3a3c1b76","type":"inject","z":"0696dd904aa6c7de","name":"Run Once on Startup","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":200,"y":740,"wires":[["6a835e9ed6f964c6"]]},{"id":"6a835e9ed6f964c6","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get Hot Water Timeout","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"number.hot_water_timeout","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":420,"y":740,"wires":[["76b7c7aa0a8ad2de"]]},{"id":"6f5879b3c824d8c1","type":"inject","z":"0696dd904aa6c7de","name":"Run Once on Startup","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":"10","topic":"","payload":"","payloadType":"date","x":180,"y":540,"wires":[["1ad6d0113da91aee"]]},{"id":"1ad6d0113da91aee","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get Hot Water Timeout","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"number.hot_water_default_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":400,"y":540,"wires":[["fb4de64eada90c7f"]]},{"id":"f1028730287dd073","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"1f0b4dda838ff26f","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Binary Sensor for Hot Water System Fault","version":"6","entityType":"binary_sensor","haConfig":[{"property":"name","value":"Hot Water System Fault"},{"property":"icon","value":""},{"property":"entity_category","value":"diagnostic"},{"property":"entity_picture","value":""},{"property":"device_class","value":"problem"}],"resend":false,"debugEnabled":false},{"id":"020edd2b2bd16f44","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"exposed as for Automation - Hot Water Timeout","version":"6","entityType":"switch","haConfig":[{"property":"name","value":"Automation - Hot Water Timeout"},{"property":"icon","value":"mdi:timer-cancel"},{"property":"entity_category","value":"config"},{"property":"entity_picture","value":""},{"property":"device_class","value":""}],"resend":false,"debugEnabled":false},{"id":"45814c1df11da288","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Number for Hot Water Temperature","version":"6","entityType":"number","haConfig":[{"property":"name","value":"Hot Water Temperature"},{"property":"icon","value":"mdi:kettle-steam-outline"},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":"temperature"},{"property":"unit_of_measurement","value":"°C"},{"property":"min_value","value":37},{"property":"max_value","value":50},{"property":"step_value","value":1},{"property":"mode","value":"auto"}],"resend":false,"debugEnabled":false},{"id":"8f5d41d1249b7816","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Sensor Config for Hot Water Current Temperature","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Hot Water Current Temperature"},{"property":"icon","value":""},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":"temperature"},{"property":"unit_of_measurement","value":"°C"},{"property":"state_class","value":"measurement"}],"resend":false,"debugEnabled":false},{"id":"1ce788ad9baaf0e1","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Sensor Config for Hot Water Flow","version":"6","entityType":"sensor","haConfig":[{"property":"name","value":"Hot Water Flow"},{"property":"icon","value":"mdi:faucet"},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":"L/min"},{"property":"state_class","value":"measurement"}],"resend":false,"debugEnabled":false},{"id":"8660e8bc5b0a715e","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Number Config for Hot Water Default Temperature","version":"6","entityType":"number","haConfig":[{"property":"name","value":"Hot Water Default Temperature"},{"property":"icon","value":"mdi:thermometer"},{"property":"entity_category","value":"config"},{"property":"entity_picture","value":""},{"property":"device_class","value":"temperature"},{"property":"unit_of_measurement","value":"°C"},{"property":"min_value","value":37},{"property":"max_value","value":50},{"property":"step_value","value":1},{"property":"mode","value":"auto"}],"resend":false,"debugEnabled":false},{"id":"8d8d8a2ce2269de0","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"Number for Hot Water Timeout","version":"6","entityType":"number","haConfig":[{"property":"name","value":"Hot Water Timeout"},{"property":"icon","value":"mdi:timer"},{"property":"entity_category","value":"config"},{"property":"entity_picture","value":""},{"property":"device_class","value":""},{"property":"unit_of_measurement","value":"min"},{"property":"min_value","value":0},{"property":"max_value","value":60},{"property":"step_value","value":1},{"property":"mode","value":"box"}],"resend":false,"debugEnabled":false},{"id":"ac4d05f67b79f774","type":"ha-device-config","name":"Rheem Hot Water System","hwVersion":"","manufacturer":"Rheem","model":"","swVersion":""}]

Node-Red Flow (Optional Google Home/ Siri Components)

subflow screenshot

Import this onto the same flow as the above.

Node-Red Flow (Optional Google Home/ Siri Components)
[{"id":"65619639265cf5ea","type":"api-call-service","z":"0696dd904aa6c7de","name":"Set Water Hot","server":"f1028730287dd073","version":5,"debugenabled":false,"domain":"number","service":"set_value","areaId":[],"deviceId":[],"entityId":["number.hot_water_temperature"],"data":"{\"value\":\"50\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":520,"y":1500,"wires":[[]]},{"id":"741797cf63baafe2","type":"api-call-service","z":"0696dd904aa6c7de","name":"Set Water Normal","server":"f1028730287dd073","version":5,"debugenabled":false,"domain":"number","service":"set_value","areaId":[],"deviceId":[],"entityId":["number.hot_water_temperature"],"data":"{ \"value\" : payload }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":890,"y":1560,"wires":[[]]},{"id":"02ded775b14645ca","type":"switch","z":"0696dd904aa6c7de","name":"Check Temp","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"default_temperature","vt":"flow"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":650,"y":1640,"wires":[["4e7cfaf142737137"],[]]},{"id":"2aa646efaaf4bad9","type":"inject","z":"0696dd904aa6c7de","name":"Hot Water Switch Update Worker","props":[{"p":"payload"}],"repeat":"5","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":280,"y":1640,"wires":[["cc50e38cf7f45292"]]},{"id":"cc50e38cf7f45292","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get State","server":"f1028730287dd073","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"number.hot_water_temperature","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":500,"y":1640,"wires":[["02ded775b14645ca"]]},{"id":"4e7cfaf142737137","type":"api-current-state","z":"0696dd904aa6c7de","name":"Get Switch State","server":"f1028730287dd073","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"switch.hot_water","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":850,"y":1640,"wires":[["8103ab9894b106a7"],[]]},{"id":"8103ab9894b106a7","type":"api-call-service","z":"0696dd904aa6c7de","name":"Turn off Switch","server":"f1028730287dd073","version":5,"debugenabled":false,"domain":"switch","service":"turn_off","areaId":[],"deviceId":[],"entityId":["switch.hot_water"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1060,"y":1640,"wires":[[]]},{"id":"1d92721dc5c2d73e","type":"ha-switch","z":"0696dd904aa6c7de","name":"Hot Water Switch - Google Helper","version":0,"inputs":1,"outputs":2,"entityConfig":"5ac0a59db72278da","enableInput":true,"outputOnStateChange":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"$entity().state ? \"on\": \"off\"","valueType":"jsonata"}],"x":240,"y":1520,"wires":[["65619639265cf5ea"],["b58efdd7978d22ca"]],"info":"Google Home/ Assistant doesn't currently allow number inputs. This allows switching between two hot and normal using Google devices."},{"id":"b58efdd7978d22ca","type":"change","z":"0696dd904aa6c7de","name":"Set payload to flow.default_temperature","rules":[{"t":"set","p":"payload","pt":"msg","to":"default_temperature","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":600,"y":1560,"wires":[["741797cf63baafe2"]]},{"id":"f1028730287dd073","type":"server","name":"Home Assistant","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m","enableGlobalContextStore":true},{"id":"5ac0a59db72278da","type":"ha-entity-config","server":"f1028730287dd073","deviceConfig":"ac4d05f67b79f774","name":"switch config for Hot Water Switch - Google Helper","version":"6","entityType":"switch","haConfig":[{"property":"name","value":"Hot Water"},{"property":"icon","value":"mdi:kettle-steam-outline"},{"property":"entity_category","value":""},{"property":"entity_picture","value":""},{"property":"device_class","value":""}],"resend":true,"debugEnabled":false},{"id":"ac4d05f67b79f774","type":"ha-device-config","name":"Rheem Hot Water System","hwVersion":"","manufacturer":"Rheem","model":"","swVersion":""}]

  1. Australian Building Codes Board, Handbook: Warm water systems, page 4: https://www.abcb.gov.au/sites/default/files/resources/2022/Handbook-warm-water-systems.pdf