Inhaltsverzeichnis

Automationen – Code: System

← 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