Verständnisfrage zu Regel mit Gruppenitem

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
damkru
Beiträge: 16
Registriert: 2. Mär 2020 08:47

Verständnisfrage zu Regel mit Gruppenitem

Beitrag von damkru »

Hallo zusammen,

nachdem ich nun einige Zeit an einer einfachen Regel verbracht habe, aber noch nicht verstanden habe warum diese in der einen Form funktioniert, mit der anderen aber nicht, hoffe ich, dass Ihr mir hier helfen könnt. Vielleicht ist es auch nur schon zu spät... dann bitte ich um Verzeihung.

Folgende Regel mit der Action Member of funktioniert:

Code: Alles auswählen

//Meldung wenn während der Abwesenheit ein Fenster geöffnet wurde
//-------------------------------------
rule "Abwesend"
when
    Member of gWindow changed to OPEN
then
    if (abwesend.state == OFF){
        sendBroadcastNotification("ALARM, eine Türo oder Fenster wurde geöffnet!!!")
    }
end
Mit der Action item bekomme ich aber kein Ergebnis:

Code: Alles auswählen

//Meldung wenn während der Abwesenheit ein Fenster geöffnet wurde
//-------------------------------------
rule "Abwesend"
when
      item gWindow changed to OPEN
then
    if (abwesend.state == OFF){
        sendBroadcastNotification("ALARM, eine Türo oder Fenster wurde geöffnet!!!")
    }
end
Könnt Ihr mir hier auf die Sprünge helfen woran das liegt?

Mir geht es darum, dass ich das Gruppenitem "gWindow" gerne in einer weiteren Regel im Rahmen einer THEN-Bedingung nutzen möchte, und ich nicht wüsste, wie ich das mit "Member of" sonst bewerkstelligen kann.

Ich danke Euch.
HomematicIP über raspberrymatic (RaspPi 3b+).
OpenHAB2 auf RaspPi 3b+
Philips Hue-Bridge
Conbee II auf eigenem RaspPi 3b+

- HMIP: verschiedene Lichtaktoren, Thermostat und Fensterkontakte
- Hue: verschiedene Lightstrips
- Xiaomi: Multisensoren und Bewegungsmelder

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Verständnisfrage zu Regel mit Gruppenitem

Beitrag von Darkwin101 »

Das liegt daran das die gruppenitems erst den Status annehmen wenn alle member den gleichen Zustand haben sonst ist der Status undefiniert.


Gesendet von iPad mit Tapatalk

damkru
Beiträge: 16
Registriert: 2. Mär 2020 08:47

Re: Verständnisfrage zu Regel mit Gruppenitem

Beitrag von damkru »

Ach so. Im VSC wird mir das Gruppen-item mit dem Status OPEN angezeigt, sobald sich der Status nur eines Members ändert. Daher dachte ich, ich kann das abgreifen.

Dann muss ich mir für meine andere Regel wohl was neues überlegen. :-)

Danke.
HomematicIP über raspberrymatic (RaspPi 3b+).
OpenHAB2 auf RaspPi 3b+
Philips Hue-Bridge
Conbee II auf eigenem RaspPi 3b+

- HMIP: verschiedene Lichtaktoren, Thermostat und Fensterkontakte
- Hue: verschiedene Lightstrips
- Xiaomi: Multisensoren und Bewegungsmelder

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

Re: Verständnisfrage zu Regel mit Gruppenitem

Beitrag von udo1toni »

Moment.

Erstmal geht es damit los, dass das Schlüsselwort Item ist, nicht item. Danach kommt es noch darauf an, wie das Item definiert ist.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

damkru
Beiträge: 16
Registriert: 2. Mär 2020 08:47

Re: Verständnisfrage zu Regel mit Gruppenitem

Beitrag von damkru »

Hallo udo1toni,

die Schreibweise beim Item ist mir am Ende dann auch aufgefallen, und ich konnte die Regel fertig stellen. War einfach zu spät an dem Tag :D .
Eine Abfrage auf den Gruppenstatus ist dann doch möglich, auch wenn nur eines der Geräte den geänderten Zustand hat.

Aber vielleicht kannst Du mir bei einem weiteren Problem in der Richtung helfen, oder mich auf einen passenden Link leiten. Ich habe nichts gefunden.

In Erweiterung der ersten Regel, habe ich mit dem Gruppenstatus folgende Regel erstellt:

Code: Alles auswählen

rule "Fenster_noch_offen"
when
    Item abwesend received update OFF
then
    if (gWindow.state == OPEN)
    {
        sendTelegram("XXX", "Ein Fenster ist noch offen!!!")
        sendCommand(abwesend,ON)
    }
end
Die Definition von abwesend ist:

Code: Alles auswählen

Switch abwesend         "Status [MAP(sicherheit.map):%s]"
Mein Ziel ist es, wenn der Schalter "abwesend" auf "OFF" gesetzt wird, zu prüfen, ob ein Fenster geöffnet ist. Ist dies der Fall, dann soll eine Meldung erfolgen und der Schalter zurück auf "ON" gesetzt werden.

Das funktioniert mit der Regel und der Abfrage auf den Gruppenstatus sehr gut.

Nun wollte ich das ganze erweitern, indem ich erfahre, welches Fenster in der Gruppe den offenen Zustand ausweist, so dass ich nicht erst im ganzen Haus suchen muss.

Leider habe ich hier noch keinen Weg gefunden dies sauber zu realisieren. Im Moment frage ich hier jedes Fenster einzeln ab, lasse eine Nachricht senden und den Status auf "ON" zurücksetzen.

Hier die Regel:

Code: Alles auswählen

rule "Fenster_noch_offen"
when
    Item abwesend received update OFF
then
    if (GF_Dining_Window.state == OPEN)
    {
        sendTelegram("XXX", "Fenster Esszimmer noch offen!!!")
        sendCommand(abwesend,ON)
    }
    if (GF_Kitchen_Window.state == OPEN)
    {
        sendTelegram("XXX", "Fenster Küche noch offen!!!")
        sendCommand(abwesend,ON)
    }
    if (GF_Toilet_Window.state == OPEN)
    {
        sendTelegram("XXX", "Fenster Gäste-WC noch offen!!!")
        sendCommand(abwesend,ON)
    }
    if (FF_Bathroom_Window.state == OPEN)
    {
        sendTelegram("XXX", "Fenster Badezimmer noch offen!!!")
        sendCommand(abwesend,ON)
    }
    if (FF_KidsRoom_WindowL.state == OPEN)
    {
        sendTelegram("XXX", "Fenster noch offen!!!")
        sendCommand(abwesend,ON)
    }
    if (FF_KidsRoom_WindowR.state == OPEN)
    {
        sendTelegram("XXX", "Fenster noch offen!!!")
        sendCommand(abwesend,ON)
    }

end
Auch das funktioniert. Sind mehrere Fenster offen, bekomme ich auch für jedes offene Fenster eine Meldung. Allerdings setze ich den Befehl "ON" dann auch mehrfach ab. Da bin ich mir nicht sicher, ob das dem System gut tut.

Außerdem muss sowas doch einfacher gehen. ;)

Für einen kleinen Stups in die richtige Richtung wäre ich dankbar.
HomematicIP über raspberrymatic (RaspPi 3b+).
OpenHAB2 auf RaspPi 3b+
Philips Hue-Bridge
Conbee II auf eigenem RaspPi 3b+

- HMIP: verschiedene Lichtaktoren, Thermostat und Fensterkontakte
- Hue: verschiedene Lightstrips
- Xiaomi: Multisensoren und Bewegungsmelder

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

Re: Verständnisfrage zu Regel mit Gruppenitem

Beitrag von udo1toni »

Das mit dem wiederholten ON auf das Item ist egal. Die Rule lässt sich aber leicht optimieren, allerdings mit Einschränkungen.

Code: Alles auswählen

var String strOpen=""

rule "Fenster_noch_offen"
when
    Item abwesend changed to OFF
then
    strOpen=""
    val Integer iAnz = gWindow.members.filter[i|i.state == OPEN].size
    if(iAnz==0) return;
    gWindow.members.filter[i|i.state == OPEN].forEach[
        if(strOpen!="") strOpen=strOpen+", "
        strOpen=strOpen+i.name
    ]
    abwesend.postUpdate(ON)
    sendTelegram("XXX", "Es sind noch "+iAnz.toString+" Fenster offen ("+strOpen+")!!!")
end
Zunächst triggert die Rule nur bei changed, ich gehe davon aus, dass das Item auf jeden Fall vorher auf ON steht.
Die Rule initialisiert die globale Variable strOpen mit einem leeren String.
Anschließend prüft die Rule, wieviele Fenster geöffnet sind, indem es die Gruppe filtert und die Anzahl der Elemente in die Variable speichert.
Ist die Anzahl 0, wird die Rule abgebrochen.
Ist die Anzahl nicht 0, wird nun die Variable strOpen Stück für Stück mit den Itemnamen der offenen Fenster gefüllt. Zum Abschluss wird das Item auf ON gesetzt und eine Meldung mit Anzahl der offenen Fenster und den zugehörigen Itemnamen ausgegeben.

Die Einschränkung bezieht sich auf den Meldungstext, denn nun stehen hier die Itemnamen. Man kann hier versuchen, entweder sehr sprechende Namen zu verwenden (statt Leerzeichen den Unterstrich...) oder man verwendet nur Teilstrings (die Ausgabe wird an einer festgelegten Stelle des Itemnamens mit eingebaut und in der Rule mittels .split("_").get(x) separiert). Man könnte auch Tags definieren, allerdings wird die Rule dadurch natürlich auch wieder etwas komplexer.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

damkru
Beiträge: 16
Registriert: 2. Mär 2020 08:47

Re: Verständnisfrage zu Regel mit Gruppenitem

Beitrag von damkru »

Erstmal vielen Dank für die rule.

Allerdings bekomme ich die aktuell nicht ans laufen.

Code: Alles auswählen

2020-03-24 22:45:41.516 [ome.event.ItemCommandEvent] - Item 'abwesend' received command OFF

2020-03-24 22:45:41.522 [vent.ItemStateChangedEvent] - abwesend changed from ON to OFF
Das item stand auf "ON". Es sind auch 2 Fenster geöffnet, aber ich bekomme keine Mitteilung. Hast du eine Idee?
HomematicIP über raspberrymatic (RaspPi 3b+).
OpenHAB2 auf RaspPi 3b+
Philips Hue-Bridge
Conbee II auf eigenem RaspPi 3b+

- HMIP: verschiedene Lichtaktoren, Thermostat und Fensterkontakte
- Hue: verschiedene Lightstrips
- Xiaomi: Multisensoren und Bewegungsmelder

damkru
Beiträge: 16
Registriert: 2. Mär 2020 08:47

Re: Verständnisfrage zu Regel mit Gruppenitem

Beitrag von damkru »

Folgende Zeile wird im VSC moniert:

Code: Alles auswählen

strOpen=strOpen+i.name
mit dem Hinweis:
"The method or field i is undefined"
HomematicIP über raspberrymatic (RaspPi 3b+).
OpenHAB2 auf RaspPi 3b+
Philips Hue-Bridge
Conbee II auf eigenem RaspPi 3b+

- HMIP: verschiedene Lichtaktoren, Thermostat und Fensterkontakte
- Hue: verschiedene Lightstrips
- Xiaomi: Multisensoren und Bewegungsmelder

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

Re: Verständnisfrage zu Regel mit Gruppenitem

Beitrag von udo1toni »

Ups. Fehler... ich versuche es mal per Handy...

Dieser Teil:

Code: Alles auswählen

gWindow.members.filter[i|i.state == OPEN].forEach[
if(strOpen!="") strOpen=strOpen+", "
strOpen=strOpen+i.name
]
muss geändert werden zu

Code: Alles auswählen

gWindow.members.filter[i|i.state == OPEN].forEach[j|
if(strOpen!="") strOpen=strOpen+", "
strOpen=strOpen+j.name
]
Gesendet von meinem SM-G973F mit Tapatalk


openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

damkru
Beiträge: 16
Registriert: 2. Mär 2020 08:47

Re: Verständnisfrage zu Regel mit Gruppenitem

Beitrag von damkru »

Super. Klappt :-) Vielen Dank dafür.

Falls es jemand kopieren möchte, hier die rule in Gänze:

Code: Alles auswählen

var String strOpen=""

//System Neustarten und Backup
//--------------
rule "Init Service"
when
    System started        // Wenn System startet                          
then
    abwesend.sendCommand(ON)
    Status_Alarm.postUpdate(0)                      
end 



rule "Fenster_noch_offen"
when
    Item abwesend changed to OFF
then
    strOpen=""
    val Integer iAnz = gWindow.members.filter[i|i.state == OPEN].size
    if(iAnz==0) return;
    gWindow.members.filter[i|i.state == OPEN].forEach[j|
        if(strOpen!="") strOpen=strOpen+", "
        strOpen=strOpen+j.name
    ]
    abwesend.postUpdate(ON)
    sendTelegram("XXX", "Es sind noch "+iAnz.toString+" Fenster offen ("+strOpen+")!!!")
end
HomematicIP über raspberrymatic (RaspPi 3b+).
OpenHAB2 auf RaspPi 3b+
Philips Hue-Bridge
Conbee II auf eigenem RaspPi 3b+

- HMIP: verschiedene Lichtaktoren, Thermostat und Fensterkontakte
- Hue: verschiedene Lightstrips
- Xiaomi: Multisensoren und Bewegungsmelder

Antworten