NEWS
Node-RED: Nur ersten Status als payload verwenden
-
Hallo Leute,
ich bin ziemlich neu in der Welt von Node-RED und möchte einen Flow erstellen, bei dem ich allerdings nicht weiterkomme. Folgende Idee:
Ich möchte durch das Triggern eines Alexa-Befehls den Status der Lampe 1 abrufen (true/false) diesen payload dann weiterleiten zu einem Change-Node, welcher dann wiederum den payload umkehrt (true -> false / false -> true) um die Lampe dementsprechend umzuschalten. Gleichzeitig möchte ich mit Lampe 2 ebenfalls verfahren. Ziel ist es, dass, wenn Lampe 1 aus- und Lampe 2 eingeschaltet ist (oder umgekehrt), ein Wechsel der Leuchtmittel stattfindet, also der Zustand true bzw. an bei jedem erneuten Alexa Befehl zwischen den beiden Lampen wechselt.
Ich habe diesen Flow auch soweit hinbekommen, mein Problem ist allerdings, dass durch das Umschalten der Lampe der State der entsprechenden Lampe (auf dem die Umschaltung ja basiert) natürlich umgestellt wird und durch diese "Stateänderung" ein erneutes Umkehren des Zustandes der Lampe erfolgt. Im Endeffekt wechseln sich die beiden Leuchtmittel also (eigentlich wie gewollt) ab, allerdings ohne Ende, bei nur einmaligem Absetzen des Alexa-Befehls.
Ich suche also nach einer Lösung, dass ein auf einem Status basierter payload nur bei der ersten Abfrage weitergegeben wird und die darausfolgende Umstellung des Status keine weitere Umstellung mehr zur Folge hat.
Ich hoffe ihr versteht was ich meine und könnt mir weiterhelfen. Schonmal vielen Dank im voraus
-
@dari-jo dann exportiere mal deinen Flow und stelle ihn hier ein. So kann dir am ehesten geholfen werden.
-
Na klar @rewenode,
Das ist der Flow:
Funktion ist ja soweit schon beschrieben.. zwischendurch muss der payload mit den state-Werten der jeweiligen Lampe nur auf den boolean-Wert "payload.on" beschränkt werden, damit der nachfolgende Switch-Node den payload "true" zum Ausgang 1 und "false" zum Ausgang 2 weiterleiten kann.
-
@dari-jo Na ja, das ist ein screenshot. Sieht hübsch aus. Aber da kann niemand sehen, was in deinen nodes so konkret drinsteht. Mit Export meine ich eigentlich Export.
Un das Ganze dann mit Code-Tags als Spoiler einstellen.
-
[ { "id": "91eb4469.206338", "type": "tab", "label": "Switch", "disabled": false, "info": "" }, { "id": "7a86fbb1.892a94", "type": "change", "z": "91eb4469.206338", "name": "payload löschen", "rules": [ { "t": "delete", "p": "payload", "pt": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 260, "y": 280, "wires": [ [ "e0cdbce7.7845" ] ] }, { "id": "14959eb4.01e4d1", "type": "change", "z": "91eb4469.206338", "name": "payload löschen", "rules": [ { "t": "delete", "p": "payload", "pt": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 260, "y": 120, "wires": [ [ "d7887f81.cf3ae" ] ] }, { "id": "d7887f81.cf3ae", "type": "hue-light", "z": "91eb4469.206338", "name": "Deckenfluter", "bridge": "eca64637.113a08", "lightid": "13", "colornamer": false, "skipevents": false, "x": 390, "y": 60, "wires": [ [ "55fc7d01.82caa4" ] ] }, { "id": "e0cdbce7.7845", "type": "hue-light", "z": "91eb4469.206338", "name": "Bodenlicht", "bridge": "eca64637.113a08", "lightid": "7", "colornamer": false, "skipevents": false, "x": 390, "y": 340, "wires": [ [ "8f7fc458.489478" ] ] }, { "id": "f1226d48.c41f6", "type": "change", "z": "91eb4469.206338", "name": "setze false", "rules": [ { "t": "change", "p": "payload", "pt": "msg", "from": "true", "fromt": "bool", "to": "false", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 930, "y": 80, "wires": [ [ "702a4283.167a1c" ] ] }, { "id": "451c70b9.f3a61", "type": "change", "z": "91eb4469.206338", "name": "setze false", "rules": [ { "t": "change", "p": "payload", "pt": "msg", "from": "true", "fromt": "bool", "to": "false", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 930, "y": 220, "wires": [ [ "c2832d87.80019" ] ] }, { "id": "1174e3aa.3082ec", "type": "change", "z": "91eb4469.206338", "name": "setze true", "rules": [ { "t": "change", "p": "payload", "pt": "msg", "from": "false", "fromt": "bool", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 920, "y": 140, "wires": [ [ "e2deb4df.1433c8" ] ] }, { "id": "26f9cbbe.768b54", "type": "change", "z": "91eb4469.206338", "name": "setze true", "rules": [ { "t": "change", "p": "payload", "pt": "msg", "from": "false", "fromt": "bool", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 920, "y": 280, "wires": [ [ "6fae2d3c.e36a34" ] ] }, { "id": "6fae2d3c.e36a34", "type": "ioBroker out", "z": "91eb4469.206338", "name": "Bodenlicht", "topic": "hue.0.Bodenlicht.on", "ack": "false", "autoCreate": "false", "x": 1110, "y": 280, "wires": [] }, { "id": "702a4283.167a1c", "type": "ioBroker out", "z": "91eb4469.206338", "name": "Deckenfluter", "topic": "hue.0.Deckenfluter.on", "ack": "false", "autoCreate": "false", "x": 1110, "y": 80, "wires": [] }, { "id": "c2832d87.80019", "type": "ioBroker out", "z": "91eb4469.206338", "name": "Bodenlicht", "topic": "hue.0.Bodenlicht.on", "ack": "false", "autoCreate": "false", "x": 1110, "y": 220, "wires": [] }, { "id": "e2deb4df.1433c8", "type": "ioBroker out", "z": "91eb4469.206338", "name": "Deckenfluter", "topic": "hue.0.Deckenfluter.on", "ack": "false", "autoCreate": "false", "x": 1110, "y": 140, "wires": [] }, { "id": "96a9f109.c9132", "type": "ioBroker out", "z": "91eb4469.206338", "name": "Bodenlicht", "topic": "hue.0.Bodenlicht.level", "ack": "false", "autoCreate": "false", "x": 1110, "y": 340, "wires": [] }, { "id": "74c9df7d.2c82a", "type": "change", "z": "91eb4469.206338", "name": "setze 50 %", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "50", "tot": "num" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 930, "y": 340, "wires": [ [ "96a9f109.c9132" ] ] }, { "id": "55fc7d01.82caa4", "type": "change", "z": "91eb4469.206338", "name": "payload extrahieren", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload.on", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 540, "y": 120, "wires": [ [ "fde18f9b.c772f" ] ] }, { "id": "8f7fc458.489478", "type": "change", "z": "91eb4469.206338", "name": "payload extrahieren", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "payload.on", "tot": "msg" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 540, "y": 280, "wires": [ [ "e653f266.7229d" ] ] }, { "id": "b47f8fb2.4f89b", "type": "alexa-home", "z": "91eb4469.206338", "conf": "6cff960.27ca96c", "device": "89644", "acknoledge": true, "name": "Switch", "topic": "", "x": 90, "y": 200, "wires": [ [ "14959eb4.01e4d1", "7a86fbb1.892a94" ] ] }, { "id": "fde18f9b.c772f", "type": "switch", "z": "91eb4469.206338", "name": "", "property": "payload", "propertyType": "msg", "rules": [ { "t": "true" }, { "t": "false" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 750, "y": 120, "wires": [ [ "f1226d48.c41f6" ], [ "1174e3aa.3082ec" ] ] }, { "id": "e653f266.7229d", "type": "switch", "z": "91eb4469.206338", "name": "", "property": "payload", "propertyType": "msg", "rules": [ { "t": "true" }, { "t": "false" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 750, "y": 280, "wires": [ [ "451c70b9.f3a61" ], [ "26f9cbbe.768b54", "74c9df7d.2c82a" ] ] }, { "id": "eca64637.113a08", "type": "hue-bridge", "z": "", "name": "Philips Hue", "bridge": "192.168.0.235", "key": "0lHCZFEFVScfsrmcsoaahY7V3th6JMbldt4ChELY", "interval": "3000", "disableupdates": false }, { "id": "6cff960.27ca96c", "type": "alexa-home-conf", "z": "", "username": "dari-jo" } ]
Meinst du so?
-
@dari-jo Genau so
Ich schau mal rein
-
Du fragst die Lampe mit dem Alexa-Home ab.
Der Status wird dir als payload.on von der Lampe zurückgemeldet.
Den erhaltenen Status negierst du und schaltest die Lampe damit über den ioBroker-out. Was wiederum zur Folge hat, dass Deine Lampe sofort wieder den Status meldet was wiederum... und da beißt sich die Katze...
Also bräuchtest du eine Möglichkeit, dass der Status an deinen ioBroker-out nur dann weitergeleitet wird, wenn es sich um einen Alexabefehl handelte, nicht aber, wenn der Schaltbefehl über den ioBroker-out gekommen ist.
Falls das so ist, muss der Flow wissen, ob der Status durch eine Alexa-anfrage initiiert wurde oder nicht.
Das kann man z.B. mit einer Flow-Variablen machen.Da ich weder Hue-node noch Alexa-node verwende, hab ich das Ganze mal simuliert. Ich hoffe, du versteht, wie ich das meine.
Deine Alexa-Abfrage geht zu einem change. Dort wird eine Flow.Variable vLampe1 auf true gesetzt. Das soll bedeuten, eine Alexaabfrage fand statt.
Deine Lampe gibt den Status in payload.on an ein switch-node, der ihn nur weiterleitet, wenn vLampe1 gesetzt ist, also die Abfrage von Alexa kam.
Das folgende change-node negiert payload.on und überträgt ihn nach payload.
Außerdem wird in diesem change-node auch vLampe1 auf false gesetzt.
Der Ausgang kann nun direkt an dein ioBroker-out für die Lampe.
Wird diese nun geschaltet, kann der Status nicht durch das switch-node, weil vLampe1 ja inzwischen wieder false ist.
Der untere Switch simuliert die Rückkopplung die ja normalerweise stattfindet.
Damit hab ich nur getestet, ob das Ganze funktioniert. In deinem Original-flow hat dieser Rückkopplungszweig natürlich nichts zu suchen.Ich habe mal dein Konstrukt aus "payload extrahieren -> Switch -> Setze true/false" in einem change zusammengefasst. Das tut es genauso.
Falls du das mal durchspielen willst, hier der Flow.
Ich hoffe, ich habe dein Problem richtig verstanden.
-
Hallo @rewenode,
sorry, dass ich jetzt erst auf deine Antwort eingehe, aber bin momentan beruflich, wie privat sehr eingespannt und komme daher nicht so oft mich um das Smarthome-Thema zu kümmern. Bin auch nur zu Node-RED gewechselt, weil die kostenlose Variante des Cloud Adapters ja zum Anfang des Jahres nicht mehr betrieben wird. Dementsprechend musste ich mich schon zeitlich beschränkt mit Node-RED auseinandersetzen und ich lerne jedes mal dazu. Also nicht, dass du denkst, dass du dir jetzt die Mühe gemacht hast, mir zu helfen und ich antworte noch nicht mal mehr. Somit, vielen Dank für deine Mühe!
So jetzt zum eigentlichen..du hast mein Problem auf jeden Fall erkannt und ich denke, dass es mit deiner Lösung auch funktionieren wird. Ich werde mir mal deinen Flow importieren und die einzelnen Nodes mit den tatsächlichen Nodes ersetzen. Vielleicht komme ich heute nachmittag schon dazu. Ich werde dir auf jeden Fall eine Rückmeldung geben, ob es geklappt hat.
Und nochmal vielen Dank für deine Hilfe!
-
@dari-jo Alles gut
Und keine Hektik!
-
Hallo @rewenode,
ich wollte mich eigentlich schon viel früher melden, aber ich habe es erst heute endlich geschafft deinen Flow zu importieren und mit meinen Lampen-Nodes anzupassen. Habe zwischenzeitlich auch schon mehrmals einen Import versucht, doch da ist mir ständig der Raspberry abgekackt..also der Bildschirm war einfach gefreezed und er hat nichts mehr gemacht. Danach hatte ich schon keine Motivation mehrDeswegen war ich echt froh, dass es jetzt endlich geklappt hat
Also neben den beiden Lampen-Nodes (Deckenfluter und Bodenlicht), welche den jeweiligen Status der Lampen weitergeben, habe ich vor den Lampen-Nodes noch einen Change-Node, welcher den payload löscht eingefügt, da der Lampen-Node ansonsten direkt schaltet. Statt dem ioBroker-out Node am Ende des Flows habe ich jeweils einen Debug-Node eingefügt um zu gucken, mit welchem Befehl die Lampe letztendlich geschaltet wird. Demnach sieht mein Flow nun folgendermaßen aus:
Habe im Screenshot auch direkt mal das Debug-Fenster mit den jeweiligen Ausgaben der Debug-Nodes abgebildet, damit du siehst was an welcher Stelle raus kommt.
Bei der Flowlinie mit dem Deckenfluter funktioniert alles super. Also es wird am Ende immer der zum aktuellen Status gegenteilige boolean-Wert ausgegeben. Hatte zwischenzeitlich neben dem Debug Node auch den iobroker-out Node für den Deckenfluter eingefügt und es fand kein erneutes umschalten aufgrund der Statusänderung statt
Auf der unteren Flowlinie für das Bodenlicht funktioniert es allerdings nicht, da nach dem Switch-Node (Überprüfung ob flow.vLampe1 = true) kein payload mehr weitergegeben wird (siehe auch Debug-Node "3" = kein Wert im Debug-Fenster).
Ich habe selber mal geguckt, woran es vielleicht liegen könnte, aber bin leider nicht fündig geworden
Beim Erstellen des Flows, habe ich deinen Flow genommen, wie oben beschrieben angepasst und dann für die "Bodenlicht-Flowlinie" darunter kopiert. Also an deinen Nodes selber habe ich nichts mehr geändert und irgendeine Abhängigkeit zum "Deckenfluter" hattest du ja auch nicht eingebaut, weshalb ich mir nicht erklären kann, weshalb es beim Bodenlicht nicht funktioniert.Vielleicht findest du ja den Fehler..auf jeden Fall vielen Dank im Voraus!