Seite 1 von 1
Gefahr einer Endlosschleife bei rules ??
Verfasst: 15. Sep 2020 21:12
von Baumtasche
Hallo zusammen,
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
Code:
Code: Alles auswählen
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.
Re: Gefahr einer Endlosschleife bei rules ??
Verfasst: 16. Sep 2020 15:49
von desidia
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)
Re: Gefahr einer Endlosschleife bei rules ??
Verfasst: 16. Sep 2020 18:03
von peter-pan
Ich habe deine Regel mal etwas "modifziert". (das "end" am Rule-Ende schreibt man übrigends klein)
Randbedingungen:
.items:
Code: Alles auswählen
// Schalter zum aktivieren der Regel
Switch Dummy_6 "Testschalter Dummy6 [%s]" (gPower,gPower1)
// Gruppenitem der Fenstersensoren
Group:Contact:OR(OPEN,CLOSED) gWindow "Fenster [MAP(de.map):%s]" <window>
.rules:
Code: Alles auswählen
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
Vielleicht hilft dir das weiter.
logger:
Code: Alles auswählen
2020-09-16 17:58:49.541 [INFO ] [se.smarthome.model.script.Dummy-Test] - Fenster sind noch offen: OPEN
2020-09-16 17:58:49.559 [INFO ] [se.smarthome.model.script.Dummy-Test] - folgende Fenster sind noch offen: HmIP_SWDO_6A36_1STATECONTACT, HmIP_SWDO_A4E4_1STATECONTACT, HmIP_SWDO_6AF9_1STATECONTACT, HmIP_SWDO_D6D5_1STATECONTACT
Re: Gefahr einer Endlosschleife bei rules ??
Verfasst: 16. Sep 2020 21:16
von Baumtasche
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.
Re: Gefahr einer Endlosschleife bei rules ??
Verfasst: 16. Sep 2020 21:50
von peter-pan
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.
Code: Alles auswählen
val msg = gWindow.members.filter[ i | i.state == OPEN ].map[ label ].reduce[ s, label | s + ", " + label ]
Das Ergebnis sieht dann etwa so aus:
Code: Alles auswählen
2020-09-16 21:43:03.108 [INFO ] [se.smarthome.model.script.Dummy-Test] - folgende Fenster sind noch offen: Fenster Claudia Kontakt, Fenster Badezimmer Kontakt, Fenster WC Kontakt, Fenster Küche Kontakt, Fenster Arbeitszimmer Nord Kontakt
Das pushen musst du halt auch noch in den if-Teil einbauen.
Re: Gefahr einer Endlosschleife bei rules ??
Verfasst: 16. Sep 2020 22:01
von Baumtasche
@Peter Pan kannst du mir bitte noch die Syntax von deinem Beispiel erklären?
Der erste Teil ist mir klar aber was genau macht :
Übrigens hat deine Modifikation prima funktioniert, ich bekomme jetzt eine Meldung mit pushover auf mein Handy, welches Fenster offen ist.
Re: Gefahr einer Endlosschleife bei rules ??
Verfasst: 17. Sep 2020 09:27
von peter-pan
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.
Re: Gefahr einer Endlosschleife bei rules ??
Verfasst: 17. Sep 2020 22:28
von udo1toni

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.
Re: Gefahr einer Endlosschleife bei rules ??
Verfasst: 18. Sep 2020 01:03
von peter-pan
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

Re: Gefahr einer Endlosschleife bei rules ??
Verfasst: 18. Sep 2020 07:26
von udo1toni
Das Basic Gegenstück dazu wäre in etwa:
Code: Alles auswählen
s = “”
for each item in group
If s=“” then
s=Item.name
Else
s=s+”, “+item.name
Next
Das schöne ist also, dass man sich nicht um die Initialisierung oder auch die Unterscheidung erstes-alle weiteren Items kümmern muss.
Gesendet von iPad mit Tapatalk