ich bin noch relativ neu im Thema Openhab. Ich habe gleich eine - wahrscheinlich - Anfängerfrage.
Wie verhält sich eine rule, wenn ich auf eine Item Änderung reagiere, und in der rule den Item Zustand noch einmal ändere. Läuft die rule dann in eine Endlosschleife?
Konkret:
Ich will eine Alarmanlage aufbauen. Wenn der Alarm auf "aktiv" gesetzt wird ItemAlarmstatus = 1, dann will ich mit einer rule "react on change" prüfen, ob alle Fensterkontakte geschlossen sind, wenn nicht soll das ItemAlarmstatus auf = 0 zurückgesetzt werden
rule "React on Alarm Status (ItemAlarm_Status) change/update"
when
Item ItemAlarm_Status changed from 0 to 1
then
// Hier wird geprüft ob alle Kontakte geschlossen sind.
// Wenn nein dann:
ItemAlarm_Status.sendCommand(0)
End
Ich hoffe mir kann jemand helfen.
Vielen Dank im voraus.
Ich hab den "sendCommand"-Befehl einfach nur ausserhalb der if/else-Klausel gesetzt, den musst du halt dort hinsetzen, wo du ihn haben willst.
Wenn du mit der Group-Members-Methode arbeitest, weil du da die einzelnen Items sehen kannst, ist es auch möglich anstelle des Item-Namens [name] die Item-Bezeichnung [label] zu nehmen.
Wird die Alarmanlage von dir selbst angeschaltet (also auf den Wert 1?
Wenn ja ist es ja kein Problem.
Dann schaltet sich halt die Alarmanlage automatisch aus, insofern noch ein Fenster offen ist.
Eine Schleife entsteht ja nur, wenn du immer wieder auf "an klickst" und er wieder da rein rennt.
Lass dir eine push schicken, dann siehst du gleich welches Fenster (oder das eines offen ist) und kannst darauf reagieren.
Wenn deine when wäre: Item itemalarm_status changed dann würde er den Status zweimal durchlaufen (einmal beim aktivieren, einmal wenn der Status von der rule auf 0 gesetzt wird. (meinem Verständnis nach)
rule "React on Alarm Status (ItemAlarm_Status) change/update"
when
Item Dummy_6 changed from OFF to ON
then
// Hier wird über ein Gruppen-Item geprüft ob alle Kontakte geschlossen sind.
if(gWindow.state == OPEN ) {
logInfo("Dummy-Test", "Fenster sind noch offen: {}", gWindow.state)
// noch etwas eleganter
val msg = gWindow.members.filter[ i | i.state == OPEN ].map[ name ].reduce[ s, name | s + ", " + name ]
logInfo("Dummy-Test", "folgende Fenster sind noch offen: {} ", msg)
}
else {
logInfo("Dummy-Test", "alle Fenster sind geschlossen: {}", gWindow.state)
}
Dummy_6.sendCommand(OFF)
end
Vielen Dank für die Antworten, das hilft mir weiter.
@Peter Pan: danke für die Modifizierung, damit hast du mir auch die zweite Frage beantwortet, die ich gehabt hätte. Ich wollte wissen, wie man den Item-Namen einer Gruppe herausfinden und pushen kann, da ich meine Fensterkontakte gruppiert.
Ich hab den "sendCommand"-Befehl einfach nur ausserhalb der if/else-Klausel gesetzt, den musst du halt dort hinsetzen, wo du ihn haben willst.
Wenn du mit der Group-Members-Methode arbeitest, weil du da die einzelnen Items sehen kannst, ist es auch möglich anstelle des Item-Namens [name] die Item-Bezeichnung [label] zu nehmen.
Baumtasche hat geschrieben: ↑16. Sep 2020 22:01
Der erste Teil ist mir klar aber was genau macht :
....also richtig kann ich das nicht, aber vielleicht kann @udo1toni das besser.
Es handelt sich um eine GroupItem Methode und im Prinzip werden die gefilterten Werte addiert/summiert bzw. bei Strings aneinander gehängt/konkateniert.
Das hat wohl was mit Lambdas zu tun.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian
Lustigerweise habe ich das auch noch nie genutzt. Soweit ich das verstehe, ist map[ name ] eben die Liste der Einträge (in diesem Fall die Namen der Items) reduce[ s, name | s + ", " + name ] reduziert die Liste zu einem String. Dabei ists die Variable, die zum bilden des Ausgabestrings verwendet wird und name ist der jeweilige Eintrag aus der Map. Hinter dem senkrechten Strich ist die Anweisung, wie der String gebildet wird.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
udo1toni hat geschrieben: ↑17. Sep 2020 22:28
Lustigerweise habe ich das auch noch nie genutzt
...ich hab's nur von Von Rich Koshak (Design Pattern) "geklaut". Da ist das auch als Beispiel, einmal um zu summieren und einmal als Stringbuilder, drin . Kann u.U. auch ein langer String werden
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian