Node Red Stop Loop Timer

Figured I’d share my leak detector notification flow that I built off this thread’s basic ideas. I wanted a centralized notification flow so I could easily add more sensors as needed.

This flow has a 5 min backoff after each round of notifications so I don’t get overwhelmed by some errant sensor. You need a “Leak Sensors” group containing all sensors’ binary_sensor values.

[{"id":"cc79f244762aa45f","type":"tab","label":"Leak","disabled":false,"info":"","env":[]},{"id":"141bbf58f22cfdf5","type":"api-call-service","z":"cc79f244762aa45f","name":"","server":"6897d4d.3c81f2c","version":5,"debugenabled":false,"domain":"notify","service":"gmail","areaId":[],"deviceId":[],"entityId":[],"data":"{    \t    \"title\": \"Leak detected: \"  & $.displayName,\t    \"message\": \"There is a leak on \" & $.displayName\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":850,"y":60,"wires":[["7d771f6904109666"]]},{"id":"84c215adfd69e407","type":"server-state-changed","z":"cc79f244762aa45f","name":"Upstairs Bathroom Leak","server":"6897d4d.3c81f2c","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.leak_bathroom_upstairs_aq1","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"5","forType":"num","forUnits":"seconds","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":170,"y":120,"wires":[["a4af3efaf9117b65"],[]]},{"id":"6198caf18f7a35c8","type":"server-state-changed","z":"cc79f244762aa45f","name":"Downstairs Bathroom Leak","server":"6897d4d.3c81f2c","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.leak_sensor_aq2","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"5","forType":"num","forUnits":"seconds","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":170,"y":180,"wires":[["a4af3efaf9117b65"],[]]},{"id":"7d771f6904109666","type":"api-call-service","z":"cc79f244762aa45f","name":"","server":"6897d4d.3c81f2c","version":5,"debugenabled":false,"domain":"notify","service":"persistent_notification","areaId":[],"deviceId":[],"entityId":[],"data":"{    \t    \"title\": \"Leak detected: \"  & $.displayName,\t    \"message\": \"There is a leak on \" & $.displayName\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":900,"y":120,"wires":[["28b1ea1f15c023db"]]},{"id":"28b1ea1f15c023db","type":"api-call-service","z":"cc79f244762aa45f","name":"","server":"6897d4d.3c81f2c","version":5,"debugenabled":false,"domain":"notify","service":"mobile_app_pixel_4a_5g","areaId":[],"deviceId":[],"entityId":[],"data":"{    \t    \"title\": \"Leak detected: \"  & $.displayName,\t    \"message\": \"There is a leak on \" & $.displayName\t}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":910,"y":180,"wires":[["89f6a0a7732f052a"]]},{"id":"a4af3efaf9117b65","type":"function","z":"cc79f244762aa45f","name":"Get Friendly Device Name","func":"const haCtx = global.get(\"homeassistant\");\n\n// Note: the 'homeassistant' below must match the server name\nconst configCtx = haCtx.homeassistant;\nconst entity = configCtx.states[msg.topic];\nmsg.displayName = entity.attributes.friendly_name;\n// node.warn(\"displayName is: \" + msg.displayName);\n//msg.entityState = entity.state === \"on\" ? true : false;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":510,"y":200,"wires":[["141bbf58f22cfdf5"]]},{"id":"89f6a0a7732f052a","type":"ha-wait-until","z":"cc79f244762aa45f","name":"wait until all leak sensors report dry","server":"6897d4d.3c81f2c","version":2,"outputs":2,"entityId":"binary_sensor.leak_sensors","entityIdFilterType":"exact","property":"state","comparator":"is","value":"off","valueType":"str","timeout":"1","timeoutType":"num","timeoutUnits":"seconds","checkCurrentState":true,"blockInputOverrides":true,"outputProperties":[],"entityLocation":"data","entityLocationType":"none","x":920,"y":260,"wires":[[],["df142fd9ae42a1b0"]]},{"id":"f54d509b60cdca30","type":"server-state-changed","z":"cc79f244762aa45f","name":"Dishwasher Leak","server":"6897d4d.3c81f2c","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.wleak_aq1_dishwasher","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"5","forType":"num","forUnits":"seconds","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":200,"y":240,"wires":[["a4af3efaf9117b65"],[]]},{"id":"513c6a671834dc98","type":"server-state-changed","z":"cc79f244762aa45f","name":"Downstairs Washing Machine Leak","server":"6897d4d.3c81f2c","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.wleak_aq1_washingmachine","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"5","forType":"num","forUnits":"seconds","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"},{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"}],"x":140,"y":300,"wires":[["a4af3efaf9117b65"],[]]},{"id":"738d4059108b0671","type":"delay","z":"cc79f244762aa45f","name":"Delay by msg.delay (ms)","pauseType":"delayv","timeout":"0","timeoutUnits":"minutes","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":510,"y":260,"wires":[["141bbf58f22cfdf5"]]},{"id":"df142fd9ae42a1b0","type":"function","z":"cc79f244762aa45f","name":"Add 5 mins to delay.","func":"const five_minutes = 1000 * 60 * 5; \nlet delay = five_minutes; // // Default delay 5 mins\nif (msg.delay)\n{\n    delay = msg.delay + five_minutes;\n    // node.warn(\"delay is now: \" + delay / 1000 / 60 + ' minutes');\n}\nmsg.delay = delay;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":900,"y":360,"wires":[["738d4059108b0671"]]},{"id":"18f019f684c02d88","type":"comment","z":"cc79f244762aa45f","name":"Leak sensors need to be in group \"Leak Sensors\"","info":"","x":180,"y":80,"wires":[]},{"id":"6897d4d.3c81f2c","type":"server","name":"homeassistant","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}]

2 Likes