Also, als erstes mal eine Bemerkung zu den drei Status: Es wäre besser, die Standard Status für Fenster zu nehmen:
OPEN, CLOSED und AJAR. Wenn Du diese Strings verwendest (und auch bitte nur Großbuchstaben verwendest), wird ein verknüpftes Icon window automatisch die korrekte Anzeige bringen, eben geöffnet, geschlossen oder gekippt.
Was Du mit "script... mqtt..." meinst, verstehe ich nicht so ganz, aber da dieser Teil wohl funktioniert, soll das hier keine Rolle spielen. Nur so viel: openHAB beherrscht mqtt eigentlich gut genug, um selbst auf per mqtt gelieferte topics zu reagieren. Aber vielleicht sendet ja Dein Script die Zustände per mqtt an openHAB?
Egal. Deine Rule soll unter zwei Bedingungen eine Nachricht verschicken:
- Du verlässt das Haus
- Niemand ist zuhause und der Zustand eines Fensterkontakts ändert sich
Entsprechend brauchst Du also ein Item, welches das Verlassen das Hauses meldet - ich nenne das Item jetzt mal Anwesenheit.
Code: Alles auswählen
rule "fensterzustand melden"
when
Item Anwesenheit changed to OFF or // Haus wird gerade verlassen
Member of GSElements_TuF changed // Zustand eines Kontakts hat sich geändert
then
if(Anwesenheit.state == OFF && GSElements_TuF.members.filter[ i | i.state.toString != "CLOSED" ].size > 0) { // niemand zuhause und mindestens ein Kontakt meldet nicht "CLOSED"
var String strList = "" // Variable initialisieren
GSElements_TuF.members.filter[ i | i.state.toString != "CLOSED" ].forEach[ k | strList = strList + k.name + ", "] // Liste mit Elementen füllen
sendNotification("Es ist noch mindestens ein Fenster unverschlossen: " + strList) // Meldung senden.
}
end
Das sendNotification soll hier stellvertretend für beliebige Nachrichten stehen. Die ausgegebene Meldung schreibt alle Itemnamen hin, die sollten also passend gewählt sein. Wenn das nicht so einfach ist, z.B. weil man im Namen noch andere Dinge untergebracht hat, kann man auch nur einen Teil des Itemnamens verwenden. Dazu verwendet man dann split() und get(). Stell Dir vor, alle Namen folgen der Konvention Kontakt_Geschoss_Raum_Fensternummer, dann kann der String so zusammengesetzt werden:
Code: Alles auswählen
GSElements_TuF.members.filter[ i | i.state != "CLOSED" ].forEach[ k | strList = strList + k.name.split("_").get(1) + " " +
k.name.split("_").get(2) + " " + k.name.split("_").get(3) + ", "]
weil das Wort "Kontakt" hier unnötig ist.
Im If kannst Du auch sehen, dass Du leicht die Menge der Items einer bestimmten Sorte ausgeben kannst. Hier eine andere Rule:
Code: Alles auswählen
rule "genaue Information über alle Fenster"
when
Member of GSElements_TuF changed
then
var String strClosed = ""
var String strOpen = ""
var String strAjar = ""
var Number nClosed = GSElements_TuF.members.filter[i | i.state == "CLOSED"].size
var Number nOpen = GSElements_TuF.members.filter[i | i.state == "OPEN"].size
var Number nAjar = GSElements_TuF.members.filter[i | i.state == "AJAR"].size
GSElements_TuF.members.filter[i | i.state == "CLOSED"].forEach[k | strClosed = strClosed + k.name + ", "]
GSElements_TuF.members.filter[i | i.state == "OPEN"].forEach[k | strOpen = strOpen + k.name + ", "]
GSElements_TuF.members.filter[i | i.state == "AJAR"].forEach[k | strAjar = strAjar + k.name + ", "]
logInfo("fensterinfo","{} Fenster geschlossen: {}",nClosed,strClosed)
logInfo("fensterinfo","{} Fenster geöffnet: {}",nOpen,strOpen)
logInfo("fensterinfo","{} Fenster geskippt: {}",nAjar,strAjar)
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet