Files

356 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.