====== Automationen – Code: System ======
[[ha:raderbroich:installation:automationen|← zurück zur Automationen-Übersicht]]
Stand: **25.09.2026**. YAML wie in HA unter ⋮ → „In YAML bearbeiten“.
===== System: Alarmstatus nach Neustart wiederherstellen =====
id: "1790141729317"
alias: "System: Alarmstatus nach Neustart wiederherstellen"
description: Liest nach einem Neustart den echten Status der Homematic-Alarmanlage aus und setzt den Dashboard-Helfer.
triggers:
- trigger: homeassistant
event: start
conditions: []
actions:
- action: input_select.select_option
target:
entity_id: input_select.alarmstatus
data:
option: |-
{% set current = states('alarm_control_panel.hmip_raderbroich_hmip_alarm_control_panel') %} {% set state_map = {
'armed_away': 'Scharf',
'armed': 'Scharf',
'armed_home': 'Hüllenschutz',
'armed_night': 'Hüllenschutz',
'disarmed': 'Unscharf',
'triggered': 'Ausgelöst'
} %} {{ state_map.get(current, 'Unscharf') }}
mode: single
===== System: FRITZ!Box täglich neu starten =====
id: "1790311930180"
alias: "System: FRITZ!Box täglich neu starten"
description: >-
Startet die FRITZ!Box 6591 Cable in Korschenbroich jeden Tag um 00:15 Uhr über die
AVM-FRITZ!Box-Tools-Integration neu.
triggers:
- trigger: time
at: "00:15:00"
actions:
- action: button.press
target:
entity_id: button.fritz_box_6591_cable_neu_starten
mode: single
===== System: HA-Lebenszeichen und Ausfallerkennung =====
id: "1790314999636"
alias: "System: HA-Lebenszeichen und Ausfallerkennung"
description: >-
Schreibt jede Minute ein Lebenszeichen in input_datetime.ha_lebenszeichen. Liegt das letzte
Lebenszeichen mehr als 15 Minuten zurück (HA war aus/abgestürzt/stromlos), werden Beginn und
Ende des Ausfalls gespeichert und input_boolean.stoerung_ha_offline eingeschaltet (bleibt an bis
zur Bestätigung). Die Erkennung erfolgt beim ersten Lebenszeichen nach dem Neustart, dadurch
keine Race-Condition beim Start.
triggers:
- trigger: time_pattern
minutes: /1
variables:
letzt: "{{ state_attr('input_datetime.ha_lebenszeichen', 'timestamp') | float(0) }}"
jetzt: "{{ as_timestamp(now()) | int }}"
ausfall: "{{ letzt > 0 and (jetzt - letzt) > 900 }}"
actions:
- action: input_datetime.set_datetime
target:
entity_id: input_datetime.ha_lebenszeichen
data:
timestamp: "{{ jetzt }}"
- if:
- condition: template
value_template: "{{ ausfall }}"
then:
- action: input_datetime.set_datetime
target:
entity_id: input_datetime.ha_ausfall_beginn
data:
timestamp: "{{ letzt | int }}"
- action: input_datetime.set_datetime
target:
entity_id: input_datetime.ha_ausfall_ende
data:
timestamp: "{{ jetzt }}"
- action: input_boolean.turn_on
target:
entity_id: input_boolean.stoerung_ha_offline
mode: single
===== System: Internet-Ausfall überwachen =====
id: "1790315008251"
alias: "System: Internet-Ausfall überwachen"
description: >-
Ist die FRITZ!Box-Internetverbindung länger als 15 Minuten weg (aus oder nicht verfügbar),
wird der Beginn gespeichert und input_boolean.internet_ausfall_laeuft eingeschaltet (Dashboard
zeigt "Internet ist weg"). Kommt die Verbindung zurück, wird das Ende gespeichert und
internet_ausfall_laeuft ausgeschaltet – das löst Protokolleintrag und Benachrichtigung aus,
weil Push/Telegram erst dann wieder zugestellt werden können.
triggers:
- trigger: state
entity_id: binary_sensor.fritz_box_6591_cable_verbindung
to:
- "off"
- unavailable
for:
minutes: 15
id: weg
- trigger: state
entity_id: binary_sensor.fritz_box_6591_cable_verbindung
to: "on"
id: zurueck
actions:
- choose:
- conditions:
- condition: trigger
id: weg
sequence:
- action: input_datetime.set_datetime
target:
entity_id: input_datetime.internet_ausfall_beginn
data:
timestamp: "{{ as_timestamp(trigger.to_state.last_changed) | int }}"
- action: input_boolean.turn_on
target:
entity_id:
- input_boolean.internet_ausfall_laeuft
- conditions:
- condition: trigger
id: zurueck
- condition: state
entity_id: input_boolean.internet_ausfall_laeuft
state: "on"
sequence:
- action: input_datetime.set_datetime
target:
entity_id: input_datetime.internet_ausfall_ende
data:
timestamp: "{{ as_timestamp(now()) | int }}"
- action: input_boolean.turn_off
target:
entity_id: input_boolean.internet_ausfall_laeuft
mode: queued
===== System: Startmeldung per Telegram =====
id: "1790237790652"
alias: "System: Startmeldung per Telegram"
description: >-
Sendet nach jedem Start von Home Assistant genau eine Telegram-Nachricht mit Alarmzustand,
offenen Türen und leeren Batterien. Beendet danach die Startphase.
triggers:
- trigger: homeassistant
event: start
conditions: []
actions:
- action: input_boolean.turn_on
target:
entity_id: input_boolean.system_startphase
- delay:
minutes: 2
- variables:
alarm_map:
armed_away: Scharf
armed_home: Hüllenschutz
armed_night: Hüllenschutz
arming: Wird scharf geschaltet
disarmed: Unscharf
pending: Verzögerung
triggered: AUSGELÖST
alarm_raw: "{{ states('alarm_control_panel.hmip_raderbroich_hmip_alarm_control_panel') }}"
alarm_text: "{{ alarm_map.get(alarm_raw, alarm_raw) }}"
leere_batterien: >-
{{ states.binary_sensor | selectattr('attributes.device_class', 'defined')
| selectattr('attributes.device_class', 'eq', 'battery')
| selectattr('state', 'eq', 'on') | list | count }}
offene_tueren: >-
{{ states.binary_sensor | selectattr('attributes.device_class', 'defined')
| selectattr('attributes.device_class', 'in', ['door', 'window', 'opening', 'garage_door'])
| selectattr('state', 'eq', 'on') | list | count }}
- action: script.telegram_universal_versand
data:
message: |-
🔄 *Home Assistant gestartet*
🔒 Alarmzustand: *{{ alarm_text }}*
🚪 Offene Türen: *{{ offene_tueren }}*
🔋 Leere Batterien: *{{ leere_batterien }}*
- action: input_boolean.turn_off
target:
entity_id: input_boolean.system_startphase
mode: single
===== System: Störungsmeldung HA/Internet senden =====
id: "1790315026098"
alias: "System: Störungsmeldung HA/Internet senden"
description: >-
Wenn Home Assistant länger als 15 Minuten aus war (input_boolean.stoerung_ha_offline wird von
der Lebenszeichen-Automation eingeschaltet) oder das Internet länger als 15 Minuten weg war
(nach Wiederkehr, input_boolean.internet_ausfall_laeuft geht aus): legt einen offenen Eintrag
im Störungsprotokoll (todo.storungsprotokoll) an, sendet Telegram an Norbert und Ute (Skript)
und Push mit Bestätigen-Knopf an Norberts iPhone. Danach wird input_boolean.stoerung_ha_offline
wieder ausgeschaltet, damit der nächste Ausfall erneut auslöst. 1 Minute Wartezeit, damit
Netzwerk/Telegram nach Neustart bereit sind.
triggers:
- trigger: state
entity_id: input_boolean.stoerung_ha_offline
from: "off"
to: "on"
for:
minutes: 1
id: ha
- trigger: state
entity_id: input_boolean.internet_ausfall_laeuft
from: "on"
to: "off"
for:
minutes: 1
id: internet
variables:
b: "{{ state_attr('input_datetime.ha_ausfall_beginn' if trigger.id == 'ha' else 'input_datetime.internet_ausfall_beginn', 'timestamp') | float(0) }}"
e: "{{ state_attr('input_datetime.ha_ausfall_ende' if trigger.id == 'ha' else 'input_datetime.internet_ausfall_ende', 'timestamp') | float(0) }}"
zeitraum: >-
{% set m = ((e - b) / 60) | round(0) | int %}{{ b | timestamp_custom('%d.%m. %H:%M') }} –
{{ e | timestamp_custom('%H:%M') }} Uhr ({{ (m // 60) ~ ' h ' ~ (m % 60) ~ ' min' if m >= 60 else m ~ ' min' }})
titel: "{{ '🏠 Home Assistant war offline' if trigger.id == 'ha' else '🌐 Internet war weg' }}"
kurz: "{{ '🏠 HA offline' if trigger.id == 'ha' else '🌐 Internet weg' }}"
actions:
- action: todo.add_item
continue_on_error: true
target:
entity_id: todo.storungsprotokoll
data:
item: "{{ kurz }} · {{ zeitraum }}"
description: Offen – noch nicht zur Kenntnis genommen
- action: script.telegram_universal_versand
continue_on_error: true
data:
message: |-
*{{ titel }}*
{{ zeitraum }}
Bitte im Dashboard zur Kenntnis nehmen.
parse_mode: markdown
- action: notify.mobile_app_iphone_von_norbert
continue_on_error: true
data:
title: "{{ titel }}"
message: "{{ zeitraum }}"
data:
tag: STOERUNG
actions:
- action: STOERUNG_OK
title: Kenntnis genommen
- action: input_boolean.turn_off
target:
entity_id: input_boolean.stoerung_ha_offline
mode: queued
===== System: Störungsmeldung per Push zur Kenntnis nehmen =====
id: "1790315033773"
alias: "System: Störungsmeldung per Push zur Kenntnis nehmen"
description: >-
Wird in der iPhone-Push der Knopf 'Kenntnis genommen' getippt, werden alle offenen Einträge im
Störungsprotokoll (todo.storungsprotokoll) abgehakt und mit Name + Zeitpunkt der Kenntnisnahme
versehen. Danach wird die Mitteilung vom iPhone entfernt. (Kenntnisnahme im Dashboard per
Häkchen wird von 'System: Störungsprotokoll Kenntnisnahme erfassen' erledigt.)
triggers:
- trigger: event
event_type: mobile_app_notification_action
event_data:
action: STOERUNG_OK
variables:
benutzer: >-
{% set uid = trigger.event.context.user_id %}{% set p = states.person
| selectattr('attributes.user_id', 'eq', uid) | map(attribute='name') | list %}{{ (p[0]
if uid and p | count > 0 else 'Norbert') ~ ' (iPhone)' }}
actions:
- action: todo.get_items
target:
entity_id: todo.storungsprotokoll
data:
status: needs_action
response_variable: liste
- repeat:
for_each: "{{ liste['todo.storungsprotokoll']['items'] | map(attribute='uid') | list }}"
sequence:
- action: todo.update_item
target:
entity_id: todo.storungsprotokoll
data:
item: "{{ repeat.item }}"
status: completed
description: "✔ Kenntnis genommen von {{ benutzer }} am {{ now().strftime('%d.%m.%Y %H:%M') }} Uhr"
- action: notify.mobile_app_iphone_von_norbert
continue_on_error: true
data:
message: clear_notification
data:
tag: STOERUNG
mode: queued
===== System: Störungsprotokoll Kenntnisnahme erfassen =====
id: "1790315899760"
alias: "System: Störungsprotokoll Kenntnisnahme erfassen"
description: >-
Wenn im Störungsprotokoll (todo.storungsprotokoll) ein Ereignis abgehakt wird, wird in dessen
Beschreibung eingetragen, wer (HA-Benutzer → Person) und wann es zur Kenntnis genommen hat.
Wird ein Haken wieder entfernt, wird die Beschreibung auf 'Offen' zurückgesetzt.
triggers:
- trigger: state
entity_id: todo.storungsprotokoll
not_from:
- unavailable
- unknown
not_to:
- unavailable
- unknown
variables:
benutzer: >-
{% set uid = trigger.to_state.context.user_id %}{% set p = states.person
| selectattr('attributes.user_id', 'eq', uid) | map(attribute='name') | list %}{{ p[0]
if uid and p | count > 0 else 'Home Assistant' }}
actions:
- action: todo.get_items
target:
entity_id: todo.storungsprotokoll
data:
status:
- completed
- needs_action
response_variable: liste
- variables:
neu_bestaetigt: >-
{% set ns = namespace(l=[]) %}{% for i in liste['todo.storungsprotokoll']['items']
if i.status == 'completed' and not (i.description | default('', true)).startswith('✔')
%}{% set ns.l = ns.l + [i.uid] %}{% endfor %}{{ ns.l }}
wieder_offen: >-
{% set ns = namespace(l=[]) %}{% for i in liste['todo.storungsprotokoll']['items']
if i.status == 'needs_action' and (i.description | default('', true)).startswith('✔')
%}{% set ns.l = ns.l + [i.uid] %}{% endfor %}{{ ns.l }}
- repeat:
for_each: "{{ neu_bestaetigt }}"
sequence:
- action: todo.update_item
target:
entity_id: todo.storungsprotokoll
data:
item: "{{ repeat.item }}"
description: "✔ Kenntnis genommen von {{ benutzer }} am {{ now().strftime('%d.%m.%Y %H:%M') }} Uhr"
- repeat:
for_each: "{{ wieder_offen }}"
sequence:
- action: todo.update_item
target:
entity_id: todo.storungsprotokoll
data:
item: "{{ repeat.item }}"
description: Offen – noch nicht zur Kenntnis genommen
mode: queued
===== System: Täglicher Neustart =====
id: "1790237785284"
alias: "System: Täglicher Neustart"
description: >-
Startet das komplette Home-Assistant-System (Host-Reboot) zur Uhrzeit aus
input_datetime.system_neustart_uhrzeit neu.
triggers:
- trigger: time
at: input_datetime.system_neustart_uhrzeit
conditions: []
actions:
- action: hassio.host_reboot
data: {}
mode: single