Notification über openHAB App

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
lenschith
Beiträge: 313
Answers: 0
Registriert: 11. Dez 2020 22:36

Re: Notification über openHAB App

Beitrag von lenschith »

stimmt, danke an die Funktion hatte ich nicht gedacht.

Vielen Dank für deine Unterstützung.

Gruß Lenschi
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

Pierrecinema
Beiträge: 32
Answers: 0
Registriert: 12. Apr 2021 01:15

Re: Notification über openHAB App

Beitrag von Pierrecinema »

Ich habe eine Action für ein item on off gemacht. Wenn ich die Mitteilungen auf Android runter ziehe zeigt mir die Vorschau einen on und einen off Button an. Leidet wenn ich die Mitteilung selber anklicke wird nur die alarm Meldung angezeigt. Scheint noch ein Bug zu sein odet einfach nicht implementiert

Gruss

udo1toni hat geschrieben: 9. Jan 2024 20:57 Leider gibt es kein ENUM Item mit multi-Auswahl, man könnte aber relativ leicht eine passende Möglichkeit bauen. Idee hierzu:

1. In der Oberfläche gibt es ein Selection Widget, in dem alle Benachrichtigungen gelistet sind. Weiterhin gibt es für jeden Anwender einen Schalter, also hans, lisa, horst und anne.
Wählt man nun über das Selection Widget eine Benachrichtigung aus, so werden die Schalter entsprechend eingestellt, also welche User eine Nachricht bekommen sollen. Wird ein Schalter verstellt, so wird die Änderung in der gewählten Benachrichtigung gespeichert.
Dabei bekommen die Schalter unterschiedliche Werte zugewiesen, anne 1, hans 2, horst 4 und lisa 8. Die Reihenfolge ist also alphabetisch, was später noch eine Rolle spielt.
Diese Switch Items speichern wir in einer Gruppe ab, gNames. Im Label der Items steht die eMail-Adresse. Der Name der Items ist egal, wichtig ist aber, dass diese Items alphabetisch sortiert auch eine alphabetisch sortierte Liste der eMail-Adressen ergibt (so dass anschließend die Zuordnung der Bits wieder stimmt)
Im Item für die Benachrichtigung wird die Summe der eingeschalteten Schalter gespeichert, also 15, wenn alle benachrichtigt werden sollen, oder z.B. 9 für anne und lisa und so weiter.
Alle Speicheritems sind vom Typ Number und befinden sich in der Gruppe gSource. Der Name dieser Items endet passend, also z.B. source_fish.

Wenn eine Nachricht verschickt werden soll, schreibst Du diese als String in ein Item Meldung, und zwar per sendCommand(), also z.B.
Meldung.sendCommand("Aquarium Filter ausgeschaltet@fish@Kritisch")

Für die Benachrichtigung kannst Du nun eine Schleife programmieren:

Code: Alles auswählen

rule "Meldung ausgeben"
when
    Item Meldung received command
then
    val message = receivedCommand.toString.split("@")
    if(message.length < 2) return;                                                 // Nachricht potenziell korrekt?

    val text   = message.get(0)
    val source = message.get(1)
    val level  = message.get(2)

    val mask = gSource.members.filter[s|s.name.endsWith(source)].head.state        // Status des passendem Maskenitems
    if(mask === null) return;                                                      // falls nicht existent Abbruch
    val bits = DecimalType.valueOf(mask).toBigDecimal.toBigInteger                 // Bitmaske erstellen
    gNames.members.sortBy[name].forEach[n,c|                                       // für jeden User
        if(bits.testBit(c-1)) {                                                    // Prüfe ob zugehöriges Bit gesetzt
            val eMail = n.label                                                    // Nimm Label als Mailadresse
            sendNotification(eMail, text, source, level)                           // versende Mitteilung
        }
    ]
end
Natürlich kann man das auch per Blockly schreiben, nur hab ich keine Ahnung von Blockly. Der Punkt ist, Du brauchst tatsächlich nur eine einzige Rule, welche alle Meldungen verschickt. Die eigentliche Meldung erstellst Du mit einer super-simple-rule, welche einfach nur die gewünschte Nachricht im passenden Format in das String Item schreibt, welches dann die eigentliche Nachricht versendet.
Durch die beiden Gruppen kannst Du easy über alle Nachrichten und User gehen, Du brauchst nur ein Item pro User und nur ein Item pro Message. Über das Bitmuster ist die Auswertung simpel, genau wie Konfiguration, z.B. über eine Sitemap:

Code: Alles auswählen

Frame label="Benachrichtigungen" {
    Selection item=messages mappings=[fish="Aquarium"] // hier weitere Quellen eintragen
    Text label="" icon="" // leeres Feld, damit die Schalter auch zweispaltig schön angezeigt werden
    Switch item=anne
    Switch item=hans
    Switch item=horst
    Switch item=lisa
}
und die zugehörigen Rules für das Update:

Code: Alles auswählen

rule "setze Switches"
when
    Item messages received command                                                 // Selection wurde geändert
then
    val mask = gSource.members.filter[s.name.endsWith(receivedCommand)].head.state // Status des passendem Maskenitems
    if(mask === null) return;                                                      // falls nicht existent Abbruch
    val bits = DecimalType.valueOf(mask).toBigDecimal.toBigInteger                 // Bitmaske erstellen
    gNames.members.sortBy[name].forEach[n,c|                                       // für jeden User
        n.postUpdate(if(bits.testBit(c-1)) ON else OFF)                            // setze Schalter entsprechend der Bitmaske
    ]
end

rule "setze Maske"
when
    Member of gNames received command                                              // Benachrichtigung wurde (de-)aktiviert
then
    var bits = 0                                                                   // Grundeinstellung keine Nachricht
    gNames.members.sortBy[name].forEach[n,c|                                       // für jeden User
        if(n.state == ON) bits += 2^c                                              // Falls Schalter ON setze Bit
    ]
    gSource.members.filter[s.name.endsWith(messages.state)].head.postUpdate(bits)  // sende Maske an passendes Item
end
Und nein, auch ich habe diese Rules nicht getestet... :) Also alles nur bunte Theorie...

Antworten