Rapid Temperature Rise Notification by topic/area
I was looking for a flow that could alert me if temperature rose in an area of my home rapidly as a backup to my smoke/fire alarms.
This allows you to easily set the areas you want to monitor to exclude the areas you don't want.
[{"id":"405f829e0a28b82e","type":"api-call-service","z":"892eaa13311e821a","name":"Notify John","server":"c33123cf.c144e","version":5,"debugenabled":false,"domain":"notify","service":"mobile_app_pixel_7_pro","areaId":[],"deviceId":[],"entityId":[],"data":"{ \"message\": payload }","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"data"}],"queue":"none","x":1670,"y":2260,"wires":[[]]},{"id":"de1b06b9e93f77a9","type":"server-state-changed","z":"892eaa13311e821a","name":"All entities that contain word temperature","server":"c33123cf.c144e","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"temperature","entityidfiltertype":"substring","outputinitially":true,"state_type":"num","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":180,"y":2300,"wires":[["5050be2bd911b8eb"]]},{"id":"53898adb1b4cd249","type":"comment","z":"892eaa13311e821a","name":"Rapid Temp Alert Flow","info":"","x":700,"y":2260,"wires":[]},{"id":"5050be2bd911b8eb","type":"switch","z":"892eaa13311e821a","name":"Allow Numbers Only","property":"payload","propertyType":"msg","rules":[{"t":"istype","v":"number","vt":"number"}],"checkall":"true","repair":false,"outputs":1,"x":480,"y":2440,"wires":[["8ed162e203f625d8"]]},{"id":"b801bf0cadd6db71","type":"debug","z":"892eaa13311e821a","name":"debug 24","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1920,"y":2460,"wires":[]},{"id":"9ad1cd94e76fe6c5","type":"comment","z":"892eaa13311e821a","name":"Averaging Mean Temps by Topic","info":"","x":1510,"y":2400,"wires":[]},{"id":"8ed162e203f625d8","type":"function","z":"892eaa13311e821a","name":"Filter by Topic then check if Current Temp rise higher than 10 degrees over average","func":"var targetWords = [\"Bedroom\", \"Laundry\", \"Utility\", \"Garage\", \"Office\", \"Family\", \"Hallway\", \"Door\", \"Bathroom\", \"Kitchen\"]; // Words in topic you want to include IE I want sensor.kitchen_temperature not sensor.openweather_temperature\n\nvar words = msg.topic.split(/[_\\.]/); // split at _ and .\n\nvar formatted = words.map(function (word) {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}).join(\" \"); // capitalize first letter of each word and join with space\n\nmsg.normtopic = formatted; // set msg.normtopic with the formatted string - from sensor.kitchen_temperature to Sensor Kitchen Temperature\n\nif (targetWords.some(word => msg.normtopic.includes(word))) { // only allow msg.topic that inclulde the above targetWords\n let avetemp = parseFloat(flow.get(msg.topic))// retrieve the value of the flow variable based on topic\n let delta = 10 // Different in Temp \n let deltatemp = Math.round(avetemp + delta) // Calc Delta Temp\n let curtemp = parseFloat(msg.payload.toFixed(0)) // Get Current Temp from Payload\n let alert = \"Temperature High at\" // Set Alert Text\n let area = msg.normtopic\n\n // Check if msg topic includes allowed areas and if current temp exceeds average temp + delta\n if (curtemp > avetemp + delta) {\n var notify = { topic: msg.topic, payload: \"The \" + area + \" \" + alert + \" \" + curtemp + \"°\", avetemp: avetemp, currenttemp: curtemp, deltatemp: deltatemp};\n var temp = { topic: msg.topic, payload: curtemp, avetemp: avetemp, currenttemp: curtemp, deltatemp: deltatemp};\n node.status({\n text: msg.topic + \", \" + msg.payload + \" Average Temp: \" + avetemp + ' ' + \"Current Temp: \" + curtemp\n });\n return [notify,temp]\n } else {\n var temp = { topic: msg.topic, payload: curtemp, avetemp: avetemp, currenttemp: curtemp, deltatemp: deltatemp};\n node.status({\n text: area + \" Normal\"\n });\n return [null, temp];\n }\n\n}\nreturn null;","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":930,"y":2440,"wires":[["405f829e0a28b82e"],["159be8ad752dc34f"]]},{"id":"60e8b82f5bcf2217","type":"inject","z":"892eaa13311e821a","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"sensor.kitchen_temperature","payload":"40","payloadType":"num","x":170,"y":2440,"wires":[["5050be2bd911b8eb"]]},{"id":"b6be28357461368b","type":"inject","z":"892eaa13311e821a","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"sensor.openweather_temperature","payload":"40","payloadType":"num","x":180,"y":2600,"wires":[["5050be2bd911b8eb"]]},{"id":"24b2d14ca54ef68e","type":"comment","z":"892eaa13311e821a","name":"Monitored Temperature Sensor Test","info":"","x":160,"y":2380,"wires":[]},{"id":"9f80a6d0dc40613f","type":"comment","z":"892eaa13311e821a","name":"Non Monitored Temperature Sensor Test","info":"","x":180,"y":2540,"wires":[]},{"id":"8307ee3896b4d366","type":"inject","z":"892eaa13311e821a","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"sensor.kitchen_temperature","payload":"99","payloadType":"num","x":170,"y":2480,"wires":[["5050be2bd911b8eb"]]},{"id":"7db6db814d864955","type":"inject","z":"892eaa13311e821a","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"sensor.openweather_temperature","payload":"99","payloadType":"num","x":180,"y":2640,"wires":[["5050be2bd911b8eb"]]},{"id":"159be8ad752dc34f","type":"smooth","z":"892eaa13311e821a","name":"","property":"currenttemp","action":"mean","count":"20","round":"","mult":"multi","reduce":false,"x":1360,"y":2460,"wires":[["1274bba11fdabbe5"]]},{"id":"1274bba11fdabbe5","type":"function","z":"892eaa13311e821a","name":"Set Flow Variable Average Temp by Topic","func":"flow.set(msg.topic, msg.currenttemp.toFixed(0))\nnode.status({text: msg.topic + \", \" + msg.currenttemp})\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1660,"y":2460,"wires":[["b801bf0cadd6db71"]]},{"id":"c33123cf.c144e","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}]