Notification über openHAB App

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Notification über openHAB App

Beitrag von lenschith »

Hallo zusammen,

ich hätte eine Frage bzgl. der Notifications. Ich habe kürzlich das Update von 3.4.5 auf 4.1.1 durchgeführt.
Und möchte jetzt meine alten ECMA 5.1 Scripte ablösen. Ich habe relativ viele einzelne Regeln für die Benachrichtigungen erstellt. Hat hier jemand eine Idee ob und wie ich das vereinfachen könnte? Möchte das ganze über Blockly neu machen.

Hiergrund, ich habe einige User diese können über ein SwitchItem einstellen zu welchen Geräten sie Benachrichtigungen bekommen wollen.
Hier ein Auszug aus einem der Scripte, der Aufbau ist immer der selbe:

Code: Alles auswählen

var NotificationAction = org.openhab.io.openhabcloud.NotificationAction;                    

//Filter Steckdose ausgeschaltet
if (itemRegistry.getItem('Tasmota03AquariumPumpe_Power').getState() == 'OFF'){
  if (itemRegistry.getItem('notificationHans_Aquarium').getState() == 'ON'){
    NotificationAction.sendNotification('hans@xyz.com', 'Aquarium Filter ausgeschaltet', "fish", "Kritisch");                    
  }
  if (itemRegistry.getItem('notificationLisa_Aquarium').getState() == 'ON'){
    NotificationAction.sendNotification('lisa@xyz.com', 'Aquarium Filter ausgeschaltet', "fish", "Kritisch");
  }
  if (itemRegistry.getItem('notificationHorst_Aquarium').getState() == 'ON'){
    NotificationAction.sendNotification('horst@xyz.com', 'Aquarium Filter ausgeschaltet', "fish", "Kritisch");
  }
  if (itemRegistry.getItem('notificationAnne_Aquarium').getState() == 'ON'){
    NotificationAction.sendNotification('anne@xyz.de', 'Aquarium Filter ausgeschaltet', "fish", "Kritisch");
  }
}
Gibt es da eine Möglichkeit meine vielen einzelnen Rules evtl. in einer Rule abzufangen?
Bzw. ist das Sinnvoll.

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

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Notification über openHAB App

Beitrag von Harka »

Moin,
eine Lösung wäre ein extra Script, welches Du immer dann aufrufst wenn eine Benachrichtigung verschickt werden soll (oberer Block). Dazu müssen alle deine Items (notificationHans_Aquarium, ...) in eine Gruppe (hier TestGruppe) und nach dem gleichem Schema benannt sein.

Das Script (unterer Block) durchsucht erst alle Namen der Mitglieder der Testgruppe nach z.B. Aqarium. Wird er fündig wird in der nächsten Schleife der Empfänger ermittelt und die eMail-Adresse zugewiesen. Wenn jetzt noch der Status des Items auf ON steht kann die Nachricht verschickt werden.
ACHTUNG - Ich habe das nicht getestet und es enthält mit Sicherheit noch Fehler.
NotificationGruppeForum.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Notification über openHAB App

Beitrag von udo1toni »

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...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

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

Re: Notification über openHAB App

Beitrag von lenschith »

Harka hat geschrieben: 9. Jan 2024 20:30 Moin,
eine Lösung wäre ein extra Script, welches Du immer dann aufrufst wenn eine Benachrichtigung verschickt werden soll (oberer Block). Dazu müssen alle deine Items (notificationHans_Aquarium, ...) in eine Gruppe (hier TestGruppe) und nach dem gleichem Schema benannt sein.

Das Script (unterer Block) durchsucht erst alle Namen der Mitglieder der Testgruppe nach z.B. Aqarium. Wird er fündig wird in der nächsten Schleife der Empfänger ermittelt und die eMail-Adresse zugewiesen. Wenn jetzt noch der Status des Items auf ON steht kann die Nachricht verschickt werden.
ACHTUNG - Ich habe das nicht getestet und es enthält mit Sicherheit noch Fehler.
NotificationGruppeForum.png
Ich habe das jetzt als erstes einmal versucht nach zu bauen. Nur eine Frage. Was steht denn im inline script?
Steh bestimmt auf'n Schlauch.

Danke.
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

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Notification über openHAB App

Beitrag von Harka »

Hi,

Code: Alles auswählen

actions.NotificationAction.sendNotification(Mailadresse, sText, Icon, Status);
Die vorhandenen Notification-Blöcke haben nicht alle Dir benötigten Funktionen.

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

Re: Notification über openHAB App

Beitrag von lenschith »

Habe das jetzt einmal nachgebaut und bekomme folgenden Fehler, komme aber nicht drauf wo der Fehler liegt.

Code: Alles auswählen

2024-01-10 20:27:28.614 [ERROR] [tomation.script.ui.Notification_Test] - Script_Notification aufgerufen

2024-01-10 20:27:32.367 [ERROR] [mation.script.ui.Script_Notification] - LOG: Variable einlesen [object Object],,,

2024-01-10 20:27:32.376 [ERROR] [b.automation.script.javascript.stack] - Failed to execute script:

org.graalvm.polyglot.PolyglotException: TypeError: invokeMember (getItem) on org.openhab.core.internal.items.ItemRegistryImpl@76f68047 failed due to: Cannot convert '[object Object]'(language: JavaScript, type: W) to Java type 'java.lang.String': Invalid or lossy primitive coercion.

2024-01-10 20:27:32.387 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Script_Notification' failed: org.graalvm.polyglot.PolyglotException: TypeError: invokeMember (getItem) on org.openhab.core.internal.items.ItemRegistryImpl@76f68047 failed due to: Cannot convert '[object Object]'(language: JavaScript, type: W) to Java type 'java.lang.String': Invalid or lossy primitive coercion..
Das ist beim ersten Block wo im Script die Variablen eingelesen werden.

Code: Alles auswählen

LOG: Variable einlesen [object Object],[object Object],,
Eine Idee?

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

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Notification über openHAB App

Beitrag von Harka »

mmmh, wenn Du in Blockly unten rechts auf den Pfeil v klickst und runter scrollst - steht dort ECMAScript 262 Edition 11 ?
Ich habe bis hier (Bild) nur ein Fehler gefunden. Bei get_name_of_item darf nicht noch das get_item rein. Die innere Schleife habe ich temporär in ein Funktionsblock geparkt und eine meiner Gruppen zum Testobjekt gemacht.
NotifikationFehler1Forum.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Notification über openHAB App

Beitrag von udo1toni »

Protipp :)

Statt die Grafiken zu posten kann man auch auf die Code Ansicht umschalten und den Inhalt kopieren und als Text posten. Das hat den Vorteil, dass man nicht aufwändig die einzelnen Teile zusammensuchen und nachbauen muss, Stattdessen kopiert man einfach den Code und fügt ihn in einer leeren UI Rule ein (gleich welche Art...!) Nach dem Speichern der Rule steht diese dann auch als Blockly Rule zur Verfügung und kann auch bearbeitet werden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

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

Re: Notification über openHAB App

Beitrag von lenschith »

ja es ist das richtige Java ausgewählt: ECMAScript 262 Edition 11

Liegt bestimmt irgendwo an mir.

Start über die Rule:

Code: Alles auswählen

2024-01-11 06:42:06.653 [ERROR] [tomation.script.ui.Notification_Test] - Script_Notification aufgerufen
Script:

Code: Alles auswählen

2024-01-11 06:42:10.332 [ERROR] [mation.script.ui.Script_Notification] - Variable einlesen: Empf_Liste: [object Object],[object Object],[object Object],[object Object] Status: Info Icon: fish1 sText: TEST Aquarium unterGruppe: Aquarium

2024-01-11 06:42:10.336 [ERROR] [mation.script.ui.Script_Notification] - Name: notificationStefan_Aquarium (Type=SwitchItem, State=ON, Label=StefanNotification_Aquarium, Category=switch, Groups=[gNotification, gNotificationStefan])

2024-01-11 06:42:10.340 [ERROR] [b.automation.script.javascript.stack] - Failed to execute script:

org.graalvm.polyglot.PolyglotException: TypeError: Cannot read property "Name" from undefined

Code: Alles auswählen

2024-01-11 06:42:10.351 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Script_Notification' failed: org.graalvm.polyglot.PolyglotException: TypeError: Cannot read property "Name" from undefined
Screenshot 2024-01-11 064527.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
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

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Notification über openHAB App

Beitrag von Harka »

Sieht soweit gar nicht so schlimm aus. Im 2. If ist noch der oben genannte Fehler mit dem übereifrig eingefügtem get_item drin.
Tip: setze die Logmeldungen lieber auf Info oder Warn. Das lässt sich imho besser bewerten.

Udo - Danke, aber mache ich mit Absicht nicht. Bei Blockly gilt der Spruch "Man muss nicht alles wissen. Man muss nur wissen, wo es steht." Da helfen solche Übungen mit dem selbst zusammen klicken, auch wenn es manchmal lästig ist.

Antworten