Wer in einem Mehrpersonenhaushalt wohnt, weiß, wie schnell scheinbar einfache Benachrichtigungsszenarien in komplexe Automationen ausarten können.
Ein klassisches Beispiel:
Versende eine Benachrichtigung nur an Personen, die derzeit Zuhause sind.
Ich habe das schon sehr früh über die Custom Integration cadavre/iq_notify (github.com) gelöst.
Meine am häufigsten genutzten Szenarien waren dabei:
- Nur Personen benachrichtigen, die zu Hause sind.. (
only_home) - Nur Personen benachrichtigen, die nicht zu Hause sind. (
only_away) - Versuche, Personen zu Hause zu benachrichtigen; falls keine zu Hause sind, benachrichtige Personen, die nicht zu Hause sind. (
only_home_then_away)
Was mich auf Dauer jedoch gestört hat:
- Es ist eine zusätzliche Custom Integration
- Die Konfiguration erfolgt starr über die
configuration.yaml - Das letzte Update liegt bereits 5 Jahre zurück
Das war für mich der Anlass, die Funktionalitäten der Integration aufzugreifen und direkt in ein schlankes Home Assistant Script zu überführen.
Das Ziel: Ein zentrales Script als flexibles Gerüst für alle Benachrichtigungen, das ganz einfach aus jeder beliebigen Automation heraus aufgerufen werden kann.
Diesen Ansatz möchte ich heute gerne mit der Community teilen.
Ein kleiner Hinweis vorab:
Das Script dient als solide Grundlage – etwaige individuelle Anpassungen oder Funktionserweiterungen müsst ihr daher bitte in Eigenregie umsetzen.
Beginnen wir also mit dem eigentlichen Skript..
1. Schritt: Skript kopieren
alias: Intelligente Benachrichtigungslogik
fields:
message:
name: Nachricht
required: true
selector:
text: null
title:
name: Titel (optional)
required: false
selector:
text: null
data:
name: Daten (optional, z.B. für Action ID)
required: false
selector:
object: null
mode:
name: "Benachrichtigungsmodus (Default: all)"
required: false
default: all
selector:
select:
options:
- all
- only_home
- only_away
- just_arrived
- just_left
- staying_home
- staying_away
- only_home_then_away
- just_left_then_away
time_minutes:
name: "Zeitfenster (Minuten, Default: 2)"
required: false
default: 2
selector:
number:
min: 1
max: 60
unit_of_measurement: min
sequence:
- variables:
time_threshold_s: "{{ (time_minutes | default(2) | int) * 60 }}"
mode_select: "{{ mode | default('all') }}"
user_pairs:
- entity: person.chris
service: mobile_app_pixel_8
- entity: person.iris
service: mobile_app_tb330fu
- entity: person.michael
service: mobile_app_pixel_9a
- variables:
minutes: "{{ time_minutes | default(2) | int }}"
is_anyone_home: >
{{ states.person | selectattr('state', 'in', ['home', 'on']) | list |
length > 0 }}
is_anyone_just_left: >
{% set threshold = now() - timedelta(minutes=minutes) %} {{
states.person
| selectattr('state', 'in', ['not_home', 'off'])
| selectattr('last_changed', '>', threshold)
| list | length > 0 }}
- repeat:
for_each: "{{ user_pairs }}"
sequence:
- variables:
user_entity: "{{ repeat.item.entity }}"
notify_service: "{{ repeat.item.service }}"
current_state: "{{ states(user_entity) }}"
is_home: "{{ current_state in ['home', 'on'] }}"
time_duration_s: >
{% set last_changed = states[user_entity].last_changed %} {{
(now() - last_changed).total_seconds() | int(0) }}
notify_condition: false
- choose:
- conditions:
- condition: template
value_template: >-
{{ mode_select == 'all' or (mode_select == 'only_home' and
is_home) or (mode_select == 'only_away' and not is_home) }}
sequence:
- variables:
notify_condition: true
- conditions:
- condition: template
value_template: >
{{ (mode_select == 'just_arrived' and is_home and
time_duration_s < time_threshold_s) or
(mode_select == 'just_left' and not is_home and time_duration_s < time_threshold_s) }}
sequence:
- variables:
notify_condition: true
- conditions:
- condition: template
value_template: >
{{ (mode_select == 'staying_home' and is_home and
time_duration_s >= time_threshold_s) or
(mode_select == 'staying_away' and not is_home and time_duration_s >= time_threshold_s) }}
sequence:
- variables:
notify_condition: true
- conditions:
- condition: template
value_template: |
{{ mode_select == 'only_home_then_away' and (
(is_anyone_home and is_home) or
(not is_anyone_home and not is_home)
) }}
sequence:
- variables:
notify_condition: true
- conditions:
- condition: template
value_template: >
{{ mode_select == 'just_left_then_away' and not is_home and
(
(is_anyone_just_left and time_duration_s < time_threshold_s) or
(not is_anyone_just_left)
) }}
sequence:
- variables:
notify_condition: true
- if:
- condition: template
value_template: "{{ notify_condition }}"
then:
- data:
message: "{{ message }}"
title: "{{ title if title is not none else 'Home Assistant' }}"
data: "{{ data | default({}) }}"
action: notify.{{ notify_service }}
description: >-
Ermöglicht die Selektion von Benachrichtigungen basierend auf dem Zustand der
jeweiligen Person(en) zum Beispiel Zuhause/Abwesend.
Mögliche Modi: all (Default), only_home, only_away, just_arrived, just_left,
staying_home, staying_away, only_home_then_away & just_left_then_away
Zeitfenster in Minuten (Default: 2) definiert den zeitlichen Schwellwert für
die Unterscheidung "Gerade passiert" und "Länger anhaltend". Dieses ermöglicht
zwischen "just_arrived" & "staying_home" über die Dauer zu deferenzieren.
Analog verhält es sich bei "just_left" & "staying_away".
Data ermöglich weiterhin zusätzliche Optionen wie Action IDs, Priorität u.a.
icon: mdi:message-arrow-right
Zum Kopieren & Einfügen in ein Neues Skript im In YAML bearbeiten Kontext.
2. Schritt: Skript anpassen
Bevor jetzt jedoch das Skript zum Einsatz bereit ist, sollte folgender Bereich angepasst werden:
- entity: person.chris
service: mobile_app_pixel_8
- entity: person.iris
service: mobile_app_tb330fu
- entity: person.michael
service: mobile_app_pixel_9a
Ersetzt person.chris, person.iris, person.michael durch eure tatsächlichen Personen-Entitäten.
Geht analog dazu mit den Benachrichtigungs-Geräten vor, die den jeweiligen Personen zugeordnet sind.
Wenn ihr unsicher seid, schaut mal unter Aktion in einer Automatisierung (oder den Entwicklungswerkzeugen).
In diesem Beispiel benötigt ihr lediglich den gelb markierten Bereich. Das
notify. davor bitte unbedingt ignorieren und nicht mit in das Skript übernehmen bzw. kopieren.Wenn das Skript mit euren Änderungen gespeichert wurde, ist es nun vollständig einsatzbereit.
3. Schritt: Skript in Automation(en) verwenden.
Der Standardname des Skriptes, wenn der Code aus dem 1. Schritt kopiert wurde, lautet Skript: Intelligente Benachrichtigungslogik und kann als Aktion in jeder beliebigen Automatisierung hinzugefügt werden:
Danach ergeben sich die weiteren Anpassungsmöglichkeiten:
Die einzelnen Felder einmal von oben nach unten im Detail:
Nachricht
Der Text der Nachricht, die ihr senden wollt.
Titel (optional)
Sollte dieses nicht gefüllt werden, wird automatisch Home Assistant eingesetzt.
Daten (optional)
Falls Bedarf ist, kann hier mit Action IDs oder Prioritäten gearbeitet werden.
Benachrichtigungsmodus (Default: all)
Jetzt dürfte es interessanter werden, denn es wird entschieden wer benachrichtigt werden soll.
- all (alle in Schritt 2 eingestellten Benutzer)
- only_home (nur wer Zuhause ist)
- only_away (nur wer Abwesend ist)
- just arrived (nur wer gerade Zuhause angekommen ist)
- just left (nur wer gerade die Homezone verlassen hat)
- staying_home (wenn jemand Zuhause ankommt und ein definiertes Zeitfenster bleibt)
- staying_away (wenn jemand die Homezone verlässt und auch ein definiertes Zeitfenster wegbleibt)
- only_home_then away (wenn jemand Zuhause ist, wird diese nur Person benachrichtigt; ist keiner Zuhause alle Abwesenden)
- just_left_then away (wenn jemand das Haus gerade verlassen hat, wird nur diese Person benachrichtigt; ist die definierte Zeit jedoch überschritten, alle Abwesenden)
Zeitfenster (Minuten, Default: 2)
Dieses Zeitfenster ermöglicht zwischen just_arrived & staying_home über die Dauer zu deferenzieren. Analog verhält es sich bei just_left & staying_away.
Antwortvariable (optional)
Falls ein Ergebnis bzw. die Rückgabe) eines Dienstaufrufs gespeichert werden soll, damit man in Automationen oder Skripten direkt darauf zugreifen und damit weiterarbeiten kann.
Beispiele
Standard-Benachrichtigung (only_home)
action: script.intelligente_benachrichtigungslogik
metadata: {}
data:
mode: only_home
message: Trockner ist fertig - bitte ausräumen!
Benachrichtigung mit data Sektion (only_home)
action: script.intelligente_benachrichtigungslogik
metadata: {}
data:
mode: only_home
message: Die Post ✉️ war da!
title: Sie haben Post - 📬
data:
ttl: 0
priority: high
importance: high
Benachrichtigung (only_home_then_away)
action: script.intelligente_benachrichtigungslogik
metadata: {}
data:
mode: only_home_then_away
time_minutes: 2
message: Das Garagentor steht seit 10 Minuten offen..!
title: "WARNUNG: Garagentor"
Viel Spaß damit ![]()


