Add notification-board folder with detailed README for the Notification Board script
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user