Du musst die Regel schon korrekt triggern lassen
Abgesehen davon ist die Regel ungenau.
Also Punkt 1, die Meldung beim Start... wenn openHAB startet, haben alle Items den Zustand NULL. Mithin triggert Deine Rule - völlig zurecht - für jeden Member der Gruppe gRM, der erstmalig nach Start OFF meldet. Stattdessen sollte die Rule auf
triggern. Beachte bitte auch, dass ich keine Anführungszeichen gesetzt habe. Es handelt sich ja bei den Items wohl nicht um String Items, sondern um Switch Items. Der Text "ON" ist etwas anderes als der Status ON. openHAB ist schlau genug, sich dennoch korrekt zu verhalten
Punkt 2: Eine Meldung "Feueralarm ist aus", ist sinnvoller, wenn KEINER der Melder Zustand ON liefert. Besser wäre die Rule also so:
Code: Alles auswählen
rule "send fire alarm off message"
when
Member of gRM changed from ON to OFF
then
if(gRM.members.filter[m|m.state != OFF].size > 0) return;
sendBroadcastNotification("Letzter Melder Feueralarm beendet: {}", triggeringItem.label)
end
Falls mindestens einer der Member der Gruppe nicht den Zustand OFF hat, wird die Rule abgebrochen, bevor die Meldung ausgegeben wird.
Da durch den Trigger gewährleistet ist, dass zuvor mindestens einer der Member den Zustand ON hatte, ist so alles abgedeckt.
Falls Du dennoch lieber für jeden einzelnen Melder die Aus-Meldung haben möchtest, wäre es vermutlich sinnvoll, auszugeben, wie viele (und welche) Melder welchen Zustand haben:
Code: Alles auswählen
rule "send fire alarm message"
when
Member of gRM changed from ON to OFF or // Melder beendet Alarm
Member of gRM changed from OFF to ON // Melder beginnt Alarm
then
val nAnzahl = gRM.members.size // Anzahl Melder gesamt
val nAlarm = gRM.members.filter[m|m.state == ON].size // Anzahl Alarmzustand
val nOK = gRM.members.filter[m|m.state == OFF].size // Anzahl Ruhezustand
val nUnklar = nAnzahl - nOK - nAlarm // Anzahl unklar
val Stringbuilder strMessage = new Stringbuilder // Meldetext
if(nAnzahl == nOK) { // Alle Melder OK
strMessage.append("Alle Melder im Ruhezustand. Alarm beendet.")
}
if(nAlarm > 0) { // Mindestens ein Melder Alarm
strMessage.append("FEUERALARM! Von ")
strMessage.append(nAnzahl.toString)
strMessage.append(" Meldern sind ")
strMessage.append(nAlarm.toString)
strMessage.append(" im Alarmzustand!")
}
if(nUnklar > 0) { // Mindestens ein Melder unklar
if(strMessage.toString.length > 0) // falls schon Text vorhanden
strMessage.append(" ") // Leerzeichen ergänzen.
strMessage.append("Von ")
strMessage.append(nAnzahl.toString)
strMessage.append(" Meldern sind ")
strMessage.append(nUnklar.toString)
strMessage.append(" ohne Zustandsmeldung.")
}
if(nAnzahl - nOK > 0) { // Mindestens ein Melder nicht OK
if(strMessage.toString.length > 0)
strMessage.append(" Melderzustand Alarm: ")
gRM.members.filter[m|m.state == ON].forEach[i,a| // für alle Melder im Alarmzustand
strMessage.append(i.label)
if(a < nAlarm - 1) // falls mehr als 2, mit Komma trenenn
strMessage.append(", ")
else if(a == nAlarm - 1) // bis auf den letzten...
strMessage.append(" und ")
else
strMessage.append("; ")
]
strMessage.append(" Melderzustand OK: ")
gRM.members.filter[m|m.state == OFF].forEach[i,a| // für alle Melder um Ruhezustand
strMessage.append(i.label)
if(a < nOK - 1)
strMessage.append(", ")
else if(a == nOK - 1)
strMessage.append(" und ")
else
strMessage.append("; ")
]
strMessage.append(" Melderzustand unklar: ")
gRM.members.filter[m|m.state != OFF && m.state != ON ].forEach[i,a| // für den Rest
strMessage.append(i.label)
if(a < nUnklar - 1)
strMessage.append(", ")
else if(a == nUnklar - 1)
strMessage.append(" und ")
else
strMessage.append(".")
]
}
sendBroadcastNotification(strMessage.toString) // Meldung senden
end
Die Rule kümmert sich um alle möglichen Zustände. Sollten alle Melder im Ruhezustand sein, so wird eine Abschlussmeldung ausgegeben.
Sollte mindestens ein Melder Alarm melden, so wird der Alarm gemeldet.
Sollte mindestens ein Melder nicht im Ruhezustand sein, wird der Zustand aller Melder ausgegeben, sortiert nach Zustand.
Da die Rule nur auslöst, wenn ein Melder zwischen ON und OFF wechselt, gibt es allerdings keine Meldung wenn ein Melderzustand nach NULL wechselt.
Die Rule ist ungetestet
evtl. ist der Schleifenindex (a) nicht 0-basiert, dann müsste man eins dazu zählen (oder so ähnlich...) und bestimmt habe ich noch irgendwo was übersehen...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet