Code: Alles auswählen
rule "Alarm"
when
Member of gContact_Open changed to OPEN // Ein Item der Gruppe wechselt auf OPEN
then
if(Ueberwachung.state != ON) // Falls Überwachung aus
return; // regel abbrechen
val StringBuilder message = new StringBuilder // Stringbuilder initialisieren
val opened = gContact_Open.members.filter[i|i.state == OPEN] // Nimm die Gruppe und filtere auf offene Kontakte
message.append("Fenster ") // Starte den Text
opened.forEach[w, i| // durchlaufe die Liste der Items
message.append(w.label) // hänge das Label an
if(i == opened.size -1) // falls vorletztes Element der Liste
message.append(" und ") // hänge " und " an
else if(opened.size > 2 && i < opened.size - 1) // Falls Liste größer als zwei Elemente und nicht letztes oder vorletztes Element
message.append(", ") // hänge ", " an
]
if(opened.size == 1) // Falls Listengröße 1
message.append(" ist") // hänge " ist" an
else // sonst
message.append(" sind") // hänge " sind" an
message.append(" geöffnet.") // beende den Text
sendBroadcastNotification(message.toString) // sende Text
end
Die oben gezeigte Rule macht das anders.
Erster Schritt: sie triggert jedes Mal, wenn ein Fenster geöffnet wurde, egal, ob dies das erste oder ein weiteres Fenster ist.
Ist die Rule gestartet, so prüft sie, ob das Item Ueberwachung den Status (!) ON hat. Ist dies nicht der Fall, bricht die Rule ab. Das ist insofern eleganter, als dass der restliche Code nicht Teil eines Blocks sein muss.
Zu diesem Zeitpunkt ist also klar: 1. mindestens ein Fenster ist offen und 2., das soll auch gemeldet werden.
Nun wird ein Stringbuilder initialisiert. Im nächsten Schritt wird die Gruppe auf alle offenen Kontakte gefiltert.
Anschließend wird der Meldetext generiert, Stück für Stück.
Für jedes Fenster wird das Label des Items an die bereits aufgebaute Meldung angehängt.
beinhaltet die Liste mehr als ein Item, so müssen jeweils Kommata unmittelbar nach dem Label eingefügt werden, bis auf das vorletzte Element, welchem (mit einem Leerzeichen Abstand) das Wort "und" folgen muss.
Nach dem letzten Label muss abhängig von der Anzahl der Fenster entweder ein " ist" oder ein " sind" angehängt werden.
Nach Vervollständigung der Meldung wird sie versendet.
Die schnöde Variante, die eher Deiner Variante entspricht:
Code: Alles auswählen
rule "Alarm"
when
Member of gContact_Open changed to OPEN
then
if(Ueberwachung.state != ON)
return;
val message = "Fenster "+triggeringItem.label" + wurde geöffnet."
sendBroadcastNotification(message)}
end
Natürlich müssen die Label so gestaltet sein, dass die Meldung sinnvoll daraus generiert werden kann. Ist das nicht der Fall, gibt es weitere fiese Tricks um dennoch ohne if-Wüste auszukommen.
EDIT: Denkfehler meinerseits... der letzte Begriff in der Message ist immer ein Label, mithin muss auch vor dem "sind" ein Leerzeichen stehen.... Ich habe das im Code geändert...
EDIT2: Noch zwei Typos entfernt...