Re: Notification über openHAB App
Verfasst: 11. Jan 2024 13:02
stimmt, danke an die Funktion hatte ich nicht gedacht.
Vielen Dank für deine Unterstützung.
Gruß Lenschi
Vielen Dank für deine Unterstützung.
Gruß Lenschi
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: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.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
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:und die zugehörigen Rules für das Update: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 nein, auch ich habe diese Rules nicht getestet...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
Also alles nur bunte Theorie...