From 3089573e51feb6872e34330e9efffd66c5da8336 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 14 Aug 2026 17:57:06 +0000 Subject: [PATCH] Add notification-board folder with detailed README for the Notification Board script --- README.md | 1 + notification-board/README.md | 355 +++++++++++++++++++++++++++++++++++ 2 files changed, 356 insertions(+) create mode 100644 notification-board/README.md diff --git a/README.md b/README.md index 82f98bb..90748a0 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ README. | Ordner | Beschreibung | |---|---| | [`verbraucher-rangliste/`](./verbraucher-rangliste) | Custom Lovelace-Karte „Power Ranking Card“: zeigt alle Verbraucher (Watt/kW-Entities) absteigend nach aktueller Leistung als animierte Rangliste an. Aktuell im Einsatz auf dem Dashboard `lovelace` → View „Energie“. | +| [`notification-board/`](./notification-board) | Home-Assistant-Script `script.notification_board`: zentrales Skript zum Versenden von Benachrichtigungen über mehrere Kanäle gleichzeitig (Mobile App, Alexa, TV, Pushover, Telegram, ntfy, persistente Benachrichtigung). | ## Konventionen diff --git a/notification-board/README.md b/notification-board/README.md new file mode 100644 index 0000000..fee141e --- /dev/null +++ b/notification-board/README.md @@ -0,0 +1,355 @@ +# Notification Board + +Zentrales Home-Assistant-**Script** (`script.notification_board`), das eine +Nachricht wahlweise über eine ganze Reihe von Kanälen gleichzeitig verschickt: +Mobile App (iOS), Alexa-Sprachausgabe, TV, Pushover, Telegram, ntfy und +persistente Benachrichtigung in Home Assistant. Statt in jeder Automation +einzelne `notify.*`-Actions zu pflegen, ruft man dieses eine Script mit den +gewünschten Feldern (`notify_oliver: true`, `pushover_lisa: true`, …) auf und +das Script kümmert sich um Routing, Formatierung und Sonderfälle (kritische +iOS-Alerts, Kamera-Foto als Anhang, Alexa Durchsage vs. Sprechen, …). + +## Voraussetzungen + +Damit alle Funktionen des Scripts nutzbar sind, werden folgende Integrationen +benötigt (jedes Feld ist aber einzeln optional/deaktivierbar – man braucht nur +die Integrationen, deren Felder man tatsächlich verwendet): + +| Integration | Wofür | +|---|---| +| **Mobile App** (iOS/Android) | `notify.mobile_app_*` – Push-Benachrichtigungen auf dem Handy, inkl. kritischer Alerts | +| **Alexa Devices** (`alexa_devices`) | `notify.*_durchsagen` / `notify.*_sprechen` – Sprachausgabe über Echo-Geräte | +| **Pushover** | `notify.pushover_*` – Push über Pushover-App | +| **Telegram Bot** (`telegram_bot`) | `telegram_bot.send_message` / `send_photo` – Nachrichten/Fotos über einen Telegram-Bot | +| **ntfy** | `notify.*` (Domain `ntfy`) – Push über selbstgehostete/öffentliche ntfy-Topics | +| **LG webOS TV** (oder anderer Media Player mit `notify`-Unterstützung) | Einblendung auf dem Fernseher | +| **Kamera-Integration** (optional) | `camera.snapshot` – Foto einer Kamera an ntfy/Telegram anhängen | + +Kern-Services (`system_log.write`, `notify.persistent_notification`) sind in +jeder Home-Assistant-Instanz bereits vorhanden. + +## Funktionsweise (Kurzüberblick) + +1. **Notify-Targets sammeln:** Das Script baut sich zu Beginn dynamisch eine + Liste aller Ziel-`notify`-Entities/Services (`notify_targets`) zusammen – + abhängig davon, welche Boolean-Felder (`notify_oliver`, `pushover_lisa`, + `notify_alexa_durchsagen`, …) beim Aufruf `true` sind. Bei den Alexa-Feldern + wird per Template automatisch nach allen `notify.*_durchsagen` bzw. + `notify.*_sprechen`-Entities gesucht; alternativ können über + `notify_alexa_durchsagen_geraete` / `notify_alexa_sprechen_geraete` gezielt + einzelne Geräte ausgewählt werden. +2. **Kamera-Snapshot (optional):** Ist `ntfy_camera` gesetzt, wird vorab ein + Snapshot der Kamera nach `/config/www/notification_board_snapshot.jpg` + geschrieben und je nach Kanal als Anhang mitgeschickt (ntfy, Telegram, + Pushover). +3. **Versand-Schleife:** Für jedes Ziel in `notify_targets` wird per + `repeat.for_each` der passende Service mit dem passenden Datenformat + aufgerufen (z. B. Pushover mit `priority: 2, sound: siren` bei + `critical: true`, Mobile App mit `push.sound.critical: 1`, Alexa über + `notify.send_message`, Telegram über `telegram_bot.send_message` / + `send_photo` inkl. optionalem Inline-Keyboard). +4. **ntfy separat:** ntfy-Topics werden am Ende nochmal separat behandelt + (eigenes Feld `ntfy_topics`, nicht Teil der generischen `notify_targets`), + inkl. Priorität, Action-Buttons und Kamera-Anhang. + +Mode: `queued`, `max: 10` – mehrere gleichzeitige Aufrufe werden nacheinander +abgearbeitet statt sich gegenseitig abzubrechen. + +## Felder (Inputs) + +| Feld | Typ | Beschreibung | +|---|---|---| +| `message` | Text (mehrzeilig) | Nachrichtentext | +| `title` | Text | Titel der Benachrichtigung | +| `critical` | Boolean | iOS "Kritische Benachrichtigung" bzw. Pushover-Priorität 2 + Sirene | +| `notify_persistent` | Boolean | Dauerhafte Benachrichtigung in der HA-Oberfläche | +| `notify_oliver` / `notify_lisa` | Boolean | Push über Mobile App für die jeweilige Person | +| `notify_familie` | Boolean | Push an beide Mobile Apps gleichzeitig | +| `notify_tv` | Boolean | Einblendung auf dem TV (nur wenn TV eingeschaltet ist) | +| `notify_alexa_durchsagen` | Boolean | Durchsage auf **allen** Alexa-Geräten mit `_durchsagen` | +| `notify_alexa_durchsagen_geraete` | Entity (mehrfach) | Durchsage nur auf ausgewählten Geräten (wirkt nur wenn obiges Feld `false`) | +| `notify_alexa_sprechen` | Boolean | Ansage im "Sprechen"-Modus auf **allen** Alexa-Geräten mit `_sprechen` | +| `notify_alexa_sprechen_geraete` | Entity (mehrfach) | Nur ausgewählte Geräte (wirkt nur wenn obiges Feld `false`) | +| `notify_alexa_multiroom_durchsagen` | Boolean | Durchsage über Multiroom-Gruppe(n) | +| `pushover_oliver` / `pushover_lisa` | Boolean | Push über Pushover | +| `telegram_oliver` | Boolean | Nachricht über Telegram senden | +| `telegram_bot_config_entry` | Config Entry (`telegram_bot`) | Welcher Telegram-Bot verwendet wird | +| `telegram_parse_mode` | Auswahl (`html` / `markdown` / keiner) | Formatierung der Telegram-Nachricht, Default `html` | +| `telegram_inline_keyboard` | Text (JSON) | Optionale Buttons unter der Telegram-Nachricht | +| `telegram_chat_id_oliver` | Text | Optionale explizite Chat-ID | +| `ntfy_topics` | Entity (mehrfach, Domain `notify`, Integration `ntfy`) | Ziel-Topics für ntfy | +| `ntfy_priority` | Auswahl `1`–`5` | ntfy-Priorität, Default `3` | +| `ntfy_actions` | Text (JSON) | Bis zu 3 Action-Buttons unter der ntfy-Benachrichtigung | +| `ntfy_camera` | Entity (Domain `camera`) | Kamera, deren aktuelles Bild an ntfy/Telegram angehängt wird | + +## Installation / Neu anlegen + +### Variante A – über die UI (empfohlen) + +1. **Einstellungen → Automatisierungen & Szenen → Skripte → Skript + hinzufügen** +2. Oben rechts auf die drei Punkte → **"In YAML bearbeiten"** wechseln. +3. Den YAML-Block unten (Felder-Definition) einfügen bzw. als Basis nehmen + und um die Sequenz-Logik ergänzen (siehe Hinweis unten). +4. Speichern, Skript in `script.notification_board` umbenennen (Entity-ID + wird beim ersten Speichern aus dem Alias `Notification Board` erzeugt). + +### Variante B – direkt in `scripts.yaml` + +Falls Skripte per YAML statt Storage verwaltet werden, den Skript-Schlüssel +`notification_board:` mit `alias`, `mode`, `max`, `fields` und `sequence` +unter `scripts.yaml` anlegen und danach **Entwicklerwerkzeuge → YAML neu +laden → Skripte** ausführen (oder `ha_reload_core(target="scripts")`). + +### Felder-Definition (YAML) + +```yaml +alias: Notification Board +mode: queued +max: 10 +description: '' +fields: + message: + name: Message + description: Nachricht + selector: + text: + multiline: true + title: + name: Title + description: Titel + selector: + text: null + critical: + name: Critical + description: iPhone Kritische Hinweise + selector: + boolean: {} + required: true + notify_alexa_multiroom_durchsagen: + name: Notify Alexa Multiroom (Durchsagen) + description: Sprachausgabe über alle Amazon-Geräte mit "_durchsagen" + selector: + boolean: {} + required: true + notify_alexa_durchsagen: + name: Notify Alexa (Durchsagen) + description: Sprachausgabe über Amazon-Geräte mit "_durchsagen" + selector: + boolean: {} + required: true + notify_alexa_sprechen: + name: Notify Alexa (Sprechen) + description: Sprachausgabe über Amazon-Geräte mit "_sprechen" + selector: + boolean: {} + required: true + notify_alexa_durchsagen_geraete: + name: Bestimmte Alexas (Durchsagen) + description: >- + Nur diese Geräte per Durchsage benachrichtigen (wirkt nur, wenn + "Notify Alexa (Durchsagen)" aus ist). Mehrfachauswahl möglich. + selector: + entity: + multiple: true + filter: + integration: alexa_devices + domain: notify + notify_alexa_sprechen_geraete: + name: Bestimmte Alexas (Sprechen) + description: >- + Nur diese Geräte im Sprechen-Modus benachrichtigen (wirkt nur, wenn + "Notify Alexa (Sprechen)" aus ist). Mehrfachauswahl möglich. + selector: + entity: + multiple: true + filter: + integration: alexa_devices + domain: notify + notify_tv: + name: Notify TV + description: Benachrichtigung auf TV Geräten + selector: + boolean: {} + required: true + telegram_oliver: + name: Telegram Oliver + description: Benachrichtigung über Telegram (Oliver) + selector: + boolean: {} + required: true + telegram_bot_config_entry: + name: Telegram Bot + description: Wähle den Telegram Bot aus + selector: + config_entry: + integration: telegram_bot + telegram_parse_mode: + name: Telegram Parse Mode + description: Parse Mode für Telegram + selector: + select: + options: + - label: HTML + value: html + - label: Markdown + value: markdown + - label: Kein + value: '' + default: html + telegram_inline_keyboard: + name: Telegram Inline Keyboard + description: >- + Inline Keyboard im Home Assistant Format (JSON). + Format 1 (einfach): ["/button1, /button2", "/button3"] + Format 2 (strukturiert): [[["Text btn1", "/button1"],["Text btn2", "/button2"]], [["Google link", "https://google.com"]]] + Beispiel: [["Strom-Bezug:/power_out", "Strom-Einspeisung:/power_in"], ["Planzenprobleme:/plant_problems"]] + selector: + text: + multiline: true + telegram_chat_id_oliver: + name: Telegram Chat ID (Oliver) + description: Chat ID für Oliver (optional, falls target benötigt wird) + selector: + text: null + pushover_oliver: + name: Pushover Oliver + description: Benachrichtigung über Pushover (Oliver) + selector: + boolean: {} + required: true + pushover_lisa: + name: Pushover Lisa + description: Benachrichtigung über Pushover (Lisa) + selector: + boolean: {} + required: true + notify_persistent: + name: Notify Persistent (Nur App) + description: Dauerhafte Benachrichtigung in Home Assistant + selector: + boolean: {} + required: true + notify_oliver: + name: Notify Oliver + description: Benachrichtigung über Mobile App (Oliver) + selector: + boolean: {} + required: true + notify_lisa: + name: Notify Lisa + description: Benachrichtigung über Mobile App (Lisa) + selector: + boolean: {} + required: true + notify_familie: + name: Notify Familie + description: Benachrichtigung über beide Mobile Apps + selector: + boolean: {} + required: true + ntfy_topics: + name: Ziel (ntfy Themen) + description: ntfy-Themen (Topics), an die gesendet werden soll + selector: + entity: + multiple: true + filter: + integration: ntfy + domain: notify + ntfy_priority: + name: Nachrichtenpriorität (ntfy) + description: Priorität der ntfy-Benachrichtigung (1 = minimal, 5 = maximal) + selector: + select: + options: + - label: 1 - Minimum + value: '1' + - label: 2 - Niedrig + value: '2' + - label: 3 - Standard + value: '3' + - label: 4 - Hoch + value: '4' + - label: 5 - Maximal + value: '5' + mode: dropdown + default: '3' + ntfy_actions: + name: Aktionsknöpfe (ntfy) + description: >- + Bis zu 3 Buttons unter der Benachrichtigung, als JSON-Liste. Das Feld + heisst "action" (nicht "type")! + Website/App oeffnen: {"action": "view", "label": "Text", "url": "https://...", "clear": true} + HTTP-Request senden: {"action": "http", "label": "Text", "url": "https://...", "method": "POST", "headers": {}, "body": "...", "clear": true} + Android-Broadcast senden: {"action": "broadcast", "label": "Text", "intent": "...", "extras": {}, "clear": true} + In Zwischenablage kopieren: {"action": "copy", "label": "Text", "value": "...", "clear": true} + Beispiel: [{"action": "view", "label": "Dashboard oeffnen", "url": "http://homeassistant.local:8123", "clear": true}] + selector: + text: + multiline: true + ntfy_camera: + name: Kamera-Foto + description: >- + Optional: Kamera, deren aktuelles Bild an ntfy- und + Telegram-Benachrichtigungen angehängt wird + selector: + entity: + filter: + domain: camera +``` + +> Die vollständige `sequence:` (Ablauflogik mit allen Templates) ist bewusst +> nicht 1:1 in dieser README abgedruckt, da sie stark auf die konkreten +> Entity-IDs dieser Instanz zugeschnitten ist (siehe nächster Abschnitt). Der +> einfachste Weg, das Script 1:1 zu übernehmen, ist ein Export/Import über +> **Einstellungen → Automatisierungen & Szenen → Skripte → Notification Board + → ⋮ → Herunterladen** auf der Quell-Instanz und Import auf der Ziel-Instanz, +> oder das Kopieren der Sequenz aus dem YAML-Editor der Quell-Instanz. + +## Anpassungen bei Neuaufbau auf einer anderen Instanz + +Folgende Stellen in der `sequence:` sind **hart auf diese Instanz** codiert +und müssen bei einer Neuinstallation angepasst werden: + +| Stelle | Aktueller Wert | Anpassen auf | +|---|---|---| +| TV-Zustand prüfen | `media_player.lg_webos_tv_75nano769qa` | eigene TV-`media_player`-Entity | +| TV-Benachrichtigung senden | `notify.lg_webos_tv_75nano769qa` | eigene TV-`notify`-Entity | +| Pushover Ziel Oliver | `notify.pushover_oliver` | eigene Pushover-`notify`-Entity | +| Pushover Ziel Lisa | `notify.pushover_lisa` | eigene Pushover-`notify`-Entity | +| Mobile App Oliver | `notify.mobile_app_iphone14pro_oliver` | eigene Mobile-App-`notify`-Entity | +| Mobile App Lisa | `notify.mobile_app_meins` | eigene Mobile-App-`notify`-Entity | +| Telegram Bot Fallback-ID | `telegram_config_entry_id` fällt, wenn `telegram_bot_config_entry` leer ist, auf die feste Config-Entry-ID `01KG2WFXSK97RRBGS7XF9990DV` zurück | eigene Telegram-Bot Config-Entry-ID (oder Fallback entfernen und das Feld verpflichtend machen) | +| Kamera-Snapshot Pfad | `/config/www/notification_board_snapshot.jpg` | kann so bleiben, muss aber im `www`-Ordner beschreibbar sein | + +Die Alexa-Erkennung (`notify.*_durchsagen`, `notify.*_sprechen`, +`notify.*multiroom_durchsagen`) ist **nicht** hart codiert, sondern läuft +per Namens-Pattern über alle vorhandenen `notify`-Entities – hier ist nur +wichtig, dass die eigenen Alexa-`notify`-Entities entsprechend benannt sind +(bzw. die passenden Felder für Geräteauswahl genutzt werden). + +## Beispielaufruf + +Als Service-Call (z. B. aus einer Automation): + +```yaml +action: script.notification_board +data: + title: "Waschmaschine fertig" + message: "Die Waschmaschine ist seit 5 Minuten fertig." + critical: false + notify_familie: true + notify_persistent: true + pushover_oliver: false + pushover_lisa: false + notify_tv: false + telegram_oliver: false + notify_alexa_durchsagen: false + notify_alexa_sprechen: false + notify_alexa_multiroom_durchsagen: false +``` + +Alle Boolean-Felder sind `required: true`, müssen beim Aufruf also explizit +mitgegeben werden (auch mit `false`), sofern man sie nicht über die +UI-Skriptmaske ausfüllt, die die Defaults automatisch setzt.