Zone in Node-RED "zwischenspeichern"

Ich habe mir n Note-Red ein Flow gebaut, der eine Benachrichtigung an die Handys schickt, wenn jemand eine Zone (Home, Arbeit o.ä.) verlässt. Jetzt wollte ich noch in die Mitteilung einbauen, welche Zone verlassen wurde.
Ausgelöst wird das Ganze mit einer “events: state-Node”
Und genau da ist das Problem. Zu diesem Zeitpunkt ist der Zustand ja auf “not_home” gewechselt (Trigger)
und in der Nachricht steht dann entsprechend auch “Person hat not_home verlassen”
Wie kann ich den vorigen Zustand bzw. den Namen der verlassenen Zone zwischenspeichern und dann entsprechend in die Nachricht einbauen?

function-node
const ort = msg.payload;

msg.payload = { "data": { "message": "Sabrina hat " + ort + " verlassen(Node-RED Info)" , "title": "Abwesenheitsbenachrichtigung!", "data": { "push": { "thread-id": "Sabsestatus" } } } };

return msg;

So ?

const ort = msg.data.old_state.state;

msg.payload = { "data": { "message": "Sabrina hat " + ort + " verlassen(Node-RED Info)" , "title": "Abwesenheitsbenachrichtigung!", "data": { "push": { "thread-id": "Sabsestatus" } } } };

return msg;

Leider nein. Es kommt folgender Fehler
TypeError: Cannot read properties of undefined (reading 'state')

Zeige mal den komplette Inhalt der msg, dann finden wir das Feld leichter

Sorry. Was genau meinst du. Das von mir gepostete ist alles was eine angehängte Debug-Node meldet.

Dann poste mal bitte deinen Flow.

Getestet habe ich es mit einer Inject-Node vor der Verzögerung, da ich keinen Eingang bei der “events: state” Node hinbekommen habe um dort zu starten.

[{"id":"44884235f083196f","type":"tab","label":"Testen","disabled":false,"info":"","env":[]},{"id":"ee625b19310b3965","type":"server-state-changed","z":"44884235f083196f","name":"Wenn Sabse geht","server":"be07aea0.e26e6","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"person.sabse","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"not_home","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":130,"y":180,"wires":[["1db00fba8cbf19c2"],[]]},{"id":"1db00fba8cbf19c2","type":"delay","z":"44884235f083196f","name":"","pauseType":"delay","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":240,"y":280,"wires":[["c7906841b3025275"]]},{"id":"c7906841b3025275","type":"api-current-state","z":"44884235f083196f","name":"","server":"be07aea0.e26e6","version":3,"outputs":2,"halt_if":"home","halt_if_type":"str","halt_if_compare":"is_not","entity_id":"person.sabse","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"2","forType":"num","forUnits":"seconds","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":520,"y":280,"wires":[["78761d3a6e7869a4"],[]]},{"id":"78761d3a6e7869a4","type":"function","z":"44884235f083196f","name":"function 9","func":"const ort = msg.data.old_state.state;\nmsg.payload = { \"data\": { \"message\": \"Sabrina hat \" + ort + \" verlassen(Node-RED Info)\" , \"title\": \"Abwesenheitsbenachrichtigung!\", \"data\": { \"push\": { \"thread-id\": \"Sabsestatus\" } } } };\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":780,"y":280,"wires":[["ac7d59407ab07053"]]},{"id":"ac7d59407ab07053","type":"api-call-service","z":"44884235f083196f","name":"Sabse geht iPhone Torsten","server":"be07aea0.e26e6","version":5,"debugenabled":false,"domain":"notify","service":"mobile_app_antfon","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1000,"y":280,"wires":[[]]},{"id":"be07aea0.e26e6","type":"server","name":"Home Assistant","addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"","connectionDelay":false,"cacheJson":false,"heartbeat":false,"heartbeatInterval":"","statusSeparator":"","enableGlobalContextStore":false}]

Du könntest es mal so versuchen, der untere Node stellt eine Alternative zu dem Funktionnode dar.

[{"id":"a371a0d8a5125282","type":"server-state-changed","z":"832855e556ee9a98","name":"Wenn Sabse geht","server":"","version":5,"outputs":2,"exposeAsEntityConfig":"","entityId":"person.sabse","entityIdType":"exact","outputInitially":false,"stateType":"str","ifState":"not_home","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":130,"y":180,"wires":[["87044730493cc1f0","7d6811dd1dd1b8f0"],[]]},{"id":"f5531267289b10c4","type":"api-call-service","z":"832855e556ee9a98","name":"Sabse geht iPhone Torsten","server":"","version":5,"debugenabled":false,"domain":"notify","service":"mobile_app_antfon","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1010,"y":180,"wires":[[]]},{"id":"87044730493cc1f0","type":"function","z":"832855e556ee9a98","name":"function 26","func":"const ort = msg.data.old_state.state;\nmsg.payload = { \"data\": { \"message\": \"Sabrina hat \" + ort + \" verlassen(Node-RED Info)\" , \"title\": \"Abwesenheitsbenachrichtigung!\", \"data\": { \"push\": { \"thread-id\": \"Sabsestatus\" } } } };\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":160,"wires":[["f5531267289b10c4"]]},{"id":"7d6811dd1dd1b8f0","type":"change","z":"832855e556ee9a98","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"data\":{\"message\":\"Sabrina hat \" & msg.data.old_state.state & \" verlassen(Node-RED Info)\",\"title\":\"Abwesenheitsbenachrichtigung!\",\"data\":{\"push\":{\"thread-id\":\"Sabsestatus\"}}}}","tot":"jsonata"},{"t":"delete","p":"data","pt":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":550,"y":260,"wires":[["f5531267289b10c4"]]}]

Danke, werde ich mal versuchen.
Ich muss dann den Funktion Node löschen/deaktivieren, richtig?
Kann ich das irgendwie testen, ohne meine Frau durch die Zonen zu schicken? Ich denke, das erfüllt nicht den WAF :wink:

Testen kannst du es, indem du in den Entwicklertools den Status setzt. Du kannst beide Nodes aktiv lassen, bekommst dann die Notify nur doppelt, so zumindest der Plan.

1 „Gefällt mir“

Danke, wenn ich “not_home” bei Zustände im device_tracker setzte, scheinen tatsächlich beide Lösungen zu funktionieren.
Es lang wohl an der falschen Testmethode. Ich werde das mal beobachten und dann Rückmeldung geben.
Das mit den Zuständen ändern, war generell ein guter Tipp.
Vielen Dank dafür.
Ich muss/sollten den Zustand dann aber auch wieder händisch zurücksetzten, oder?
Der “Aktualisieren”-Knopf mach das nicht bzw. was tut er?

Nicht nur die Testmethode ist anders, es fehlen jetzt auch zwei Nodes :wink:

Jetzt wo du es schreibst, fällt mir wieder ein, warum ich die eingefügt habe bzw. brauche. Ich habe, vor allem nachts, häufig das Problem, dass wir als abwesend erkannt werden, weil wir sehr kurz (meist < 1 s) in der Fritz!Box offline und auch damit in HA abwesend sind. Deshalb die Verzögerung und die erneute Abfrage. Das hat die Falschmeldungen vollkommen eliminiert.
Wenn ich die Zusatzabfrage einbaue, funktioniert die function nicht mehr und die Change liefert als Ergebnis Leerzeichen. :frowning:

Du kannst im events: state-Node angeben, für wie lange der neue Zustand aktiv sein muss, bevor getriggert wird. In deinem Fall würde ich es dann mit 2 Sekunden versuchen.
grafik

Das müsste es dann gewesen sein. So einfach :wink:
Danke nochmals.