Fensterkontakt mit Alarm auf Handyapp

Allgemeine Fragen zum Thema "Smart Home" und Entscheidungshilfen

Moderator: seppy

Benutzeravatar
udo1toni
Beiträge: 11105
Registriert: 11. Apr 2018 18:05
Answers: 157
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.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
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...
EDIT2: Noch zwei Typos entfernt...
openHAB3.4.1 in einem Debian-Container (Proxmox, LXC)

AndRe5575
Beiträge: 64
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.

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

Re: Fensterkontakt mit Alarm auf Handyapp

Beitrag von AndRe5575 »

@udo1toni

leider war meine SD Karte defekt und ich hatte kein Backup von dem Stand, alles von davor läuft Gott sei Dank :-)
Nun habe ich meine Kontakte neu angelegt:

Items:

Code: Alles auswählen

Switch   Ueberwachung
Contact  Kontakt_Eingangstuer_Open    "Offen/geschlossen"    (gContact_Open)    {channel="deconz:openclosesensor:def:abc:open"}
Sitemap:

Code: Alles auswählen

Frame label="Tür-/ Fensterkontakte" {
    Default item=Kontakt_Eingangstuer_Open    label="Eingangstür [MAP(de.map):%s]" icon="frontdoor" 
}
Frame label="Überwachung Ein-/Ausschalten" {
    Switch item=Ueberwachung    label="Überwachung Ein-/Ausschalten"  mappings=[ON="Ein", OFF="Aus"] 
}
Deine Rule:

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
Nun erhalte ich folgende Meldung: Fenster sind geöffnet.

Ich stehe gerade auf dem Schlauch. Habe es auch ohne die MAP versucht, allerdings kommt das gleiche bei rum.
Ich habe den Eindruck, jedes mal wenn ich ein neues Thema angehe starte ich bei 0 :-D
Bin mir auch nicht mehr sicher ob eine Sitemap noch dem entspricht, was man heut zu Tage nutzt.

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

Re: Fensterkontakt mit Alarm auf Handyapp

Beitrag von udo1toni »

Da ist ein Fehler drin... :) In der vierten Zeile nach dem then muss es hinten i.state == OPEN heißen, nicht i.name.
Immer wieder lustig, was man für Fehler findet, die man selbst fabriziert hat...


Ich habe das oben korrigiert, falls mal jemand auf den Code stößt.
openHAB3.4.1 in einem Debian-Container (Proxmox, LXC)

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

Re: Fensterkontakt mit Alarm auf Handyapp

Beitrag von AndRe5575 »

Merkwürdig ist eher, dass es lief :-D
Oder ich habe es durch Zufall gefunden gehabt und vergessen, glaube ich aber nicht so ganz.

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

Re: Fensterkontakt mit Alarm auf Handyapp

Beitrag von AndRe5575 »

lösche ggf auch noch die } Klammer am Ende

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

Re: Fensterkontakt mit Alarm auf Handyapp

Beitrag von udo1toni »

Jawohl, die gehört da auch nicht hin. :)
openHAB3.4.1 in einem Debian-Container (Proxmox, LXC)

Antworten