Gefahr einer Endlosschleife bei rules ??

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

Gefahr einer Endlosschleife bei rules ??

Beitrag 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.
von peter-pan » 16. Sep 2020 21:50
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.
Gehe zur vollständigen Antwort

desidia
Beiträge: 22
Registriert: 20. Okt 2017 23:15
Answers: 0

Re: Gefahr einer Endlosschleife bei rules ??

Beitrag 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)

Benutzeravatar
peter-pan
Beiträge: 2767
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Gefahr einer Endlosschleife bei rules ??

Beitrag 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 
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

Re: Gefahr einer Endlosschleife bei rules ??

Beitrag 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.

Benutzeravatar
peter-pan
Beiträge: 2767
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Gefahr einer Endlosschleife bei rules ??

Beitrag 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.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Baumtasche
Beiträge: 82
Registriert: 14. Sep 2020 21:52
Answers: 0

Re: Gefahr einer Endlosschleife bei rules ??

Beitrag 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 :

Code: Alles auswählen


 xxxx.map[ name ].reduce[ s, name | s + ", " + name ]

Übrigens hat deine Modifikation prima funktioniert, ich bekomme jetzt eine Meldung mit pushover auf mein Handy, welches Fenster offen ist.

Benutzeravatar
peter-pan
Beiträge: 2767
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Gefahr einer Endlosschleife bei rules ??

Beitrag 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.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
udo1toni
Beiträge: 15264
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Gefahr einer Endlosschleife bei rules ??

Beitrag von udo1toni »

:D 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

Benutzeravatar
peter-pan
Beiträge: 2767
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Gefahr einer Endlosschleife bei rules ??

Beitrag 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 :lol:
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
udo1toni
Beiträge: 15264
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Gefahr einer Endlosschleife bei rules ??

Beitrag 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
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten