15 KiB
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)
- 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 Aufruftruesind. Bei den Alexa-Feldern wird per Template automatisch nach allennotify.*_durchsagenbzw.notify.*_sprechen-Entities gesucht; alternativ können übernotify_alexa_durchsagen_geraete/notify_alexa_sprechen_geraetegezielt einzelne Geräte ausgewählt werden. - Kamera-Snapshot (optional): Ist
ntfy_cameragesetzt, wird vorab ein Snapshot der Kamera nach/config/www/notification_board_snapshot.jpggeschrieben und je nach Kanal als Anhang mitgeschickt (ntfy, Telegram, Pushover). - Versand-Schleife: Für jedes Ziel in
notify_targetswird perrepeat.for_eachder passende Service mit dem passenden Datenformat aufgerufen (z. B. Pushover mitpriority: 2, sound: sirenbeicritical: true, Mobile App mitpush.sound.critical: 1, Alexa übernotify.send_message, Telegram übertelegram_bot.send_message/send_photoinkl. optionalem Inline-Keyboard). - ntfy separat: ntfy-Topics werden am Ende nochmal separat behandelt
(eigenes Feld
ntfy_topics, nicht Teil der generischennotify_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)
- Einstellungen → Automatisierungen & Szenen → Skripte → Skript hinzufügen
- Oben rechts auf die drei Punkte → "In YAML bearbeiten" wechseln.
- Den YAML-Block unten (Felder-Definition) einfügen bzw. als Basis nehmen und um die Sequenz-Logik ergänzen (siehe Hinweis unten).
- Speichern, Skript in
script.notification_boardumbenennen (Entity-ID wird beim ersten Speichern aus dem AliasNotification Boarderzeugt).
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)
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):
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.