Warten, payload nochmal prüfen und erst dann reagieren, aber wie?

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

Antworten
rucksman007
Beiträge: 138
Registriert: 04.11.2018, 13:17
Hat sich bedankt: 7 Mal
Danksagung erhalten: 1 Mal

Warten, payload nochmal prüfen und erst dann reagieren, aber wie?

Beitrag von rucksman007 » 02.06.2021, 17:35

Blöder Betreff, aber sinnvoller hab ichs nicht hingekriegt.

Folgendes Szenario: Meine Gartenbewässerung steuere ich über ein Node Red dashboard und MQTT. Wenn ich nun zB alle Bewässerungskreise hintereinander laufen lassen will, tippe ich im Dashboard auf einen Button und los gehts.

Problem: Die Pumpe wird ebenfalls über MQTT gesteuert, und zwar in Abhängigkeit der einzelnen Kreise. Das heisst, dass nach dem Ende von Kreis 1 die Pumpe abgeschaltet, aber sofort wieder angeschaltet wird, weil ja Kreis 2 startet. Diesen unnötigen Schaltvorgang will ich verhindern. Ich will also nicht sofort mit Ende von Kreis 1 die Pumpe abschalten, sondern zB 1 Sekunde warten und dann erst auf die zuletzt eingegangene Payload reagieren.
Ablauf aktuell ist also:
  1. Kreis 1 ist zu Ende -> Kreis 1 schickt per MQTT "off" an die Pumpe -> Pumpe schaltet ab
  2. Kreis 2 startet -> Kreis 2 schickt per MQTT "on" an die Pumpe -> Pumpe schaltet wieder an
Gewollt wäre zB.:
  1. Kreis 1 ist zu Ende -> Kreis 1 schickt per MQTT "off" an die Pumpe -> 1 Sekunde warten, Payload nicht sofort an die Pumpe weiterleiten
  2. Kreis 2 startet -> Kreis 2 schickt per MQTT "on" an die Pumpe -> Pumpe reagiert erst nach der Wartezeit von 1 Sekunde, und zwar:
    1. Ist die letzte eingetroffene Payload "on" (Kreis 2 ist also bereits gestartet), dann mache nichts (bleib an)
    2. Ist die letzte eingetroffene Payload "off" (der letzte Kreis ist zu Ende, es kam also innerhalb der Wartezeit keine weitere Payload), dann verwerte Payload "off"
War das halbwegs verständlich? Danke für eure Denkanstöße!

ptweety
Beiträge: 522
Registriert: 07.01.2017, 16:48
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 48 Mal
Danksagung erhalten: 66 Mal

Re: Warten, payload nochmal prüfen und erst dann reagieren, aber wie?

Beitrag von ptweety » 02.06.2021, 22:25

Warnung vorab: die Lösung ist vielleicht etwas aufgebläht, lässt sich dafür aber auf beliebig viele Bewässerungskreise erweitern.

Prinzip:
  • Sende eine Nachricht ab und starte damit deine Pumpe und gleichzeitig n gewünschten Abläufe. Diese können parallel oder nacheinander oder beliebig verketten laufen.
  • Warte auf ein Signal jedes Ablaufs und sammle alle Ergebnisse ein.
  • Sind alle Abläufe durch, dann halte die Pumpe an
Anpassungen:
  • Die Anzahl der Abläufe wird im setParts-Knoten definiert
  • weniger Abläufe: preJoin vom Ende her löschen
  • mehr Abläufe: preJoin kopieren, ans Ende anhängen und parts.index entsprechend erhöhen
Bildschirmfoto 2021-06-02 um 22.20.48.png

Code: Alles auswählen

[{"id":"3345fb6e.bb480c","type":"debug","z":"f48abf30.643098","name":"pump on","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":340,"y":2520,"wires":[]},{"id":"c3ef4890.37faf","type":"inject","z":"f48abf30.643098","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"do","payload":"true","payloadType":"bool","x":170,"y":2400,"wires":[["c2523672.9898b8","3345fb6e.bb480c"]]},{"id":"aeb3b25.58449d","type":"change","z":"f48abf30.643098","name":"preJoin 1","rules":[{"t":"set","p":"parts.id","pt":"msg","to":"parts._msgid","tot":"flow"},{"t":"set","p":"parts.type","pt":"msg","to":"parts.type","tot":"flow"},{"t":"set","p":"parts.count","pt":"msg","to":"parts.count","tot":"flow"},{"t":"set","p":"parts.len","pt":"msg","to":"parts.len","tot":"flow"},{"t":"set","p":"parts.index","pt":"msg","to":"1","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":960,"y":2340,"wires":[["a0f12b1e.a9abb"]]},{"id":"5da4d05a.9fbc68","type":"debug","z":"f48abf30.643098","name":"pump off","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1300,"y":2300,"wires":[]},{"id":"a0f12b1e.a9abb","type":"join","z":"f48abf30.643098","name":"","mode":"auto","build":"string","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":"false","timeout":"","count":"","reduceRight":false,"x":1130,"y":2300,"wires":[["5da4d05a.9fbc68"]]},{"id":"14db268e.953c71","type":"change","z":"f48abf30.643098","name":"preJoin 0","rules":[{"t":"set","p":"parts.id","pt":"msg","to":"parts._msgid","tot":"flow"},{"t":"set","p":"parts.type","pt":"msg","to":"parts.type","tot":"flow"},{"t":"set","p":"parts.count","pt":"msg","to":"parts.count","tot":"flow"},{"t":"set","p":"parts.len","pt":"msg","to":"parts.len","tot":"flow"},{"t":"set","p":"parts.index","pt":"msg","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":960,"y":2300,"wires":[["a0f12b1e.a9abb"]]},{"id":"c2523672.9898b8","type":"change","z":"f48abf30.643098","name":"setParts","rules":[{"t":"set","p":"parts","pt":"flow","to":"$","tot":"jsonata"},{"t":"set","p":"parts.type","pt":"flow","to":"array","tot":"str"},{"t":"set","p":"parts.count","pt":"flow","to":"5","tot":"num"},{"t":"set","p":"parts.len","pt":"flow","to":"1","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":340,"y":2300,"wires":[["71af2e26.03c75","55fdfc7d.02aa24","a88abb01.9270c","2ea26133.de8846","c32bcb68.29405"]]},{"id":"a790c8df.5cc3e8","type":"change","z":"f48abf30.643098","name":"preJoin 2","rules":[{"t":"set","p":"parts.id","pt":"msg","to":"parts._msgid","tot":"flow"},{"t":"set","p":"parts.type","pt":"msg","to":"parts.type","tot":"flow"},{"t":"set","p":"parts.count","pt":"msg","to":"parts.count","tot":"flow"},{"t":"set","p":"parts.len","pt":"msg","to":"parts.len","tot":"flow"},{"t":"set","p":"parts.index","pt":"msg","to":"2","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":960,"y":2380,"wires":[["a0f12b1e.a9abb"]]},{"id":"eff29999.29ea38","type":"change","z":"f48abf30.643098","name":"preJoin 3","rules":[{"t":"set","p":"parts.id","pt":"msg","to":"parts._msgid","tot":"flow"},{"t":"set","p":"parts.type","pt":"msg","to":"parts.type","tot":"flow"},{"t":"set","p":"parts.count","pt":"msg","to":"parts.count","tot":"flow"},{"t":"set","p":"parts.len","pt":"msg","to":"parts.len","tot":"flow"},{"t":"set","p":"parts.index","pt":"msg","to":"3","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":960,"y":2420,"wires":[["a0f12b1e.a9abb"]]},{"id":"35ec3697.9ba052","type":"change","z":"f48abf30.643098","name":"preJoin 4","rules":[{"t":"set","p":"parts.id","pt":"msg","to":"parts._msgid","tot":"flow"},{"t":"set","p":"parts.type","pt":"msg","to":"parts.type","tot":"flow"},{"t":"set","p":"parts.count","pt":"msg","to":"parts.count","tot":"flow"},{"t":"set","p":"parts.len","pt":"msg","to":"parts.len","tot":"flow"},{"t":"set","p":"parts.index","pt":"msg","to":"4","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":960,"y":2460,"wires":[["a0f12b1e.a9abb"]]},{"id":"74c98d99.a2d6ec","type":"comment","z":"f48abf30.643098","name":"{count} anpassen","info":"","x":360,"y":2260,"wires":[]},{"id":"2f896ede.fa2682","type":"debug","z":"f48abf30.643098","name":"do 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":630,"y":2340,"wires":[]},{"id":"a7ff9565.0fca6","type":"inject","z":"f48abf30.643098","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"done","payload":"true","payloadType":"bool","x":800,"y":2340,"wires":[["aeb3b25.58449d"]]},{"id":"e74cacd1.8665f8","type":"debug","z":"f48abf30.643098","name":"do 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":630,"y":2380,"wires":[]},{"id":"cda3eb55.58a4f8","type":"inject","z":"f48abf30.643098","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"done","payload":"true","payloadType":"bool","x":800,"y":2380,"wires":[["a790c8df.5cc3e8"]]},{"id":"ef7c7e36.98de78","type":"debug","z":"f48abf30.643098","name":"do 4","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":630,"y":2420,"wires":[]},{"id":"aeab2dbe.10a55","type":"inject","z":"f48abf30.643098","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"done","payload":"true","payloadType":"bool","x":800,"y":2420,"wires":[["eff29999.29ea38"]]},{"id":"e4696462.cc7c18","type":"debug","z":"f48abf30.643098","name":"do 5","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":630,"y":2460,"wires":[]},{"id":"57ed731e.c49384","type":"inject","z":"f48abf30.643098","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"done","payload":"true","payloadType":"bool","x":800,"y":2460,"wires":[["35ec3697.9ba052"]]},{"id":"71af2e26.03c75","type":"delay","z":"f48abf30.643098","name":"delay","pauseType":"delay","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":510,"y":2340,"wires":[["2f896ede.fa2682"]]},{"id":"55fdfc7d.02aa24","type":"delay","z":"f48abf30.643098","name":"delay","pauseType":"delay","timeout":"4","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":510,"y":2380,"wires":[["e74cacd1.8665f8"]]},{"id":"a88abb01.9270c","type":"delay","z":"f48abf30.643098","name":"delay","pauseType":"delay","timeout":"6","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":510,"y":2420,"wires":[["ef7c7e36.98de78"]]},{"id":"2ea26133.de8846","type":"delay","z":"f48abf30.643098","name":"delay","pauseType":"delay","timeout":"8","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":510,"y":2460,"wires":[["e4696462.cc7c18"]]},{"id":"c32bcb68.29405","type":"debug","z":"f48abf30.643098","name":"do 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":630,"y":2300,"wires":[]},{"id":"2d10d1f9.dfa52e","type":"inject","z":"f48abf30.643098","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"done","payload":"true","payloadType":"bool","x":800,"y":2300,"wires":[["14db268e.953c71"]]},{"id":"82f7bf69.c4eb2","type":"comment","z":"f48abf30.643098","name":"Starte {count} Kreise","info":"","x":710,"y":2260,"wires":[]},{"id":"4a8bb46.1c65b4c","type":"comment","z":"f48abf30.643098","name":"warte auf alle Ergebnisse","info":"","x":1050,"y":2260,"wires":[]}]

rucksman007
Beiträge: 138
Registriert: 04.11.2018, 13:17
Hat sich bedankt: 7 Mal
Danksagung erhalten: 1 Mal

Re: Warten, payload nochmal prüfen und erst dann reagieren, aber wie?

Beitrag von rucksman007 » 04.06.2021, 10:04

Wow, danke für die umfangreiche Antwort! Das muss ich mir in Ruhe anschauen, dafür fehlt mir jobbedingt gerade die Zeit. Mal sehen, ob ich das am Wochenende schaffe...

Garbsen
Beiträge: 295
Registriert: 12.07.2017, 21:08
Hat sich bedankt: 1 Mal
Danksagung erhalten: 14 Mal

Re: Warten, payload nochmal prüfen und erst dann reagieren, aber wie?

Beitrag von Garbsen » 06.07.2021, 09:23

Dafür gibt es einen combine-defer node. Der verzögert eine eingehende true-payload um x Sekunden und löscht den payload, wenn in der Zeit ein false eingeht. Das ganze lässt sich auch invertieren, dh. Verzögerung von false und löschen, wenn innerhalb er Verzögerung ein true eingeht.
Musst du über die Palette node-red-contrib-combine installieren
512 Kanäle in 101 Geräten und 145 CUxD-Kanäle in 19 CUxD-Geräten:
--------------------------------------------
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/Downloads/eq3/downl ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907

Antworten

Zurück zu „RedMatic“