Fensterkontakt mit Alarm auf Handyapp

Allgemeine Fragen zum Thema "Smart Home" und Entscheidungshilfen

Moderator: seppy

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

Re: Fensterkontakt mit Alarm auf Handyapp

Beitrag von udo1toni »

Nicht kürzer, aber eleganter:

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.name == 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
Erst mal meldet Deine Rule immer nur ein offenes Fenster, falls mehrere Fenster geöffnet wurden, wird das ignoriert.
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
Hier wird also nur das Fenster gemeldet, welches gerade geöffnet wurde. Aber auch hier wird zumindest für jedes Fenster eine Meldung generiert, welches geöffnet wird, unabhängig davon, ob bereits andere Fenster geöffnet sind.

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...
openHAB3.3.0 in einem Debian-Container (Proxmox, LXC)

AndRe5575
Beiträge: 55
Registriert: 8. Jun 2020 20:16

Re: Fensterkontakt mit Alarm auf Handyapp

Beitrag von AndRe5575 »

Vielen Dank für Deine Lösung, ich kann wieder einmal nur den Hut ziehen.
Viele Dank dafür.

Antworten