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