Also, Gruppenstatus sind so eine Sache, schon gleich bei Strings, weil die Berechnungen (AVG, SUM, MAX, MIN, EQU) hier nicht funktionieren. Ja, auch Equality, denn es wird auf
numerische Gleichheit geprüft.
Es ist aber ohnehin nicht gut, auf
Item groupitem changed zu triggern. Es wurde mal vor Jahren etwas genauer auf den Code geschaut, weil nämlich eine Rule bei einem Update eines GroupItems einmal pro Member ausgelöst wird (egal, ob dieser Member upgedatet wurde oder nicht). Das ist ziemlich sicher kein erwünschtes Verhalten. Bei changed ist es nicht so kritisch, aber trotzdem nicht schön.
Daraufhin wurde
Member of als Trigger hinzugefügt, welcher dann sauber nur einmal pro geändertem/upgedatetem Item triggert.
In der Programmierung ergeben sich keine Einschränkungen, im Gegenteil, mit
triggeringItem steht sogar noch ein implizites Objekt zur Verfügung, um die Arbeit zu erleichtern.
Um nun Equality zu testen, sähe eine Rule so aus:
Code: Alles auswählen
rule "Smokealarm Gruppe prüfen"
when
Member of gSysSmokeAlarm changed
then
val lItems = gSysSmokeAlarm.members.filter[i|!(i.state.toString.contains("IDLE_OFF"))]
if(lItems.size > 0) {
gSysSmokeAlarm.postUpdate("ALARM")
lItems.forEach[j|
logInfo("smoke","Item {} hat Status {}",j.name,j.state)
]
} else
gSysSmokeAlarm.postUpdate("IDLE_OFF")
end
Die Definition des Objekts lItems ist nicht zwingend, erhöht hier aber hoffentlich die Lesbarkeit. Das Objekt enthält eine gefilterte Liste aller Member der Gruppe. der Filter sucht alle Items heraus, deren Status nicht den (Teil-)String IDLE_OFF enthalten.
Die if-Anweisung prüft, ob die Liste Items enthält (size ist die Anzahl der Items) und setzt dann das Gruppenitem gezielt auf den korrekten Wert (Wobei Alarm hier sicher nicht mit Rauchalarm gleichzusetzen ist, weil es vermutlich neben IDLE_OFF auch andere Status geben wird, die nicht unmittelsbar Brand oder Rauch bedeuten. Entsprechend wird zusätzlich der Status jedes Items, welches nicht IDLE_OFF als Status führt ins log geschrieben.
Wie man sieht, braucht es nicht mal das triggernde Item, da ja die gesamte Gruppe betrachtet werden soll.