Inhaltsverzeichnis

Automationen – Code: Überwachung und Tests

← zurück zur Automationen-Übersicht

Stand: 25.09.2026. YAML wie in HA unter ⋮ → „In YAML bearbeiten“.

NAS: Synology-Warnungen an Norbert melden

id: "1790320220049"
alias: "NAS: Synology-Warnungen an Norbert melden"
description: >-
  Meldet Warnungen und Fehler der Synology DS920+ (nasnbruch) nur an Norbert: Telegram
  (Chat-ID zentral in input_text.telegram_chat_id_norbert) und kritische Push-Nachricht aufs iPhone (kommt auch bei Lautlos/Fokus durch).
  Auslöser: Volume- oder Festplattenstatus wechselt von 'normal' auf etwas anderes (2 min stabil),
  SMART-Warnung (fehlerhafte Sektoren / Restlebensdauer), Sicherheitsstatus unsicher,
  NAS-Temperatur > 60 °C oder Plattentemperatur > 50 °C (je 10 min), NAS 10 min nicht im Netz.
  Bereits bestehende Warnzustände lösen nicht erneut aus, nur neue Wechsel.
triggers:
  - trigger: state
    entity_id:
      - sensor.nasnbruch_volume_1_status
      - sensor.nasnbruch_volume_2_status
      - sensor.nasnbruch_volume_3_status
      - sensor.nasnbruch_volume_4_status
      - sensor.nasnbruch_volume_5_status
      - sensor.nasnbruch_volume_6_status
      - sensor.nasnbruch_drive_1_status
      - sensor.nasnbruch_drive_2_status
      - sensor.nasnbruch_drive_3_status
      - sensor.nasnbruch_drive_4_status
    not_from:
      - unavailable
      - unknown
    not_to:
      - normal
      - unavailable
      - unknown
    for:
      minutes: 2
    id: status
  - trigger: state
    entity_id:
      - binary_sensor.nasnbruch_drive_1_max_fehlerhafte_sektoren_uberschritten
      - binary_sensor.nasnbruch_drive_2_max_fehlerhafte_sektoren_uberschritten
      - binary_sensor.nasnbruch_drive_3_max_fehlerhafte_sektoren_uberschritten
      - binary_sensor.nasnbruch_drive_4_max_fehlerhafte_sektoren_uberschritten
      - binary_sensor.nasnbruch_drive_1_unterhalb_der_mindestrestlebensdauer
      - binary_sensor.nasnbruch_drive_2_unterhalb_der_mindestrestlebensdauer
      - binary_sensor.nasnbruch_drive_3_unterhalb_der_mindestrestlebensdauer
      - binary_sensor.nasnbruch_drive_4_unterhalb_der_mindestrestlebensdauer
      - binary_sensor.nasnbruch_sicherheitsstatus
    from: "off"
    to: "on"
    id: warnung
  - trigger: numeric_state
    entity_id: sensor.nasnbruch_temperatur
    above: 60
    for:
      minutes: 10
    id: temp
  - trigger: numeric_state
    entity_id:
      - sensor.nasnbruch_drive_1_temperatur
      - sensor.nasnbruch_drive_2_temperatur
      - sensor.nasnbruch_drive_3_temperatur
      - sensor.nasnbruch_drive_4_temperatur
    above: 50
    for:
      minutes: 10
    id: temp
  - trigger: state
    entity_id: device_tracker.nasnbruch
    from: home
    to: not_home
    for:
      minutes: 10
    id: offline
conditions:
  - condition: template
    value_template: "{{ trigger.id != 'temp' or trigger.from_state.state not in ['unavailable', 'unknown'] }}"
variables:
  was: "{{ trigger.to_state.name | replace('nasnbruch ', '') | trim }}"
  zustand: >-
    {% set s = trigger.to_state.state %}{% set t = {'attention': 'Achtung', 'warning': 'Warnung',
    'degraded': 'beeinträchtigt', 'crashed': 'abgestürzt', 'failing': 'fällt aus',
    'not_use': 'nicht in Benutzung', 'on': 'ja', 'not_home': 'nicht erreichbar'} %}{% if
    trigger.id == 'temp' %}{{ s }} °C{% elif trigger.id == 'warnung' and 'sicherheit' in
    trigger.entity_id %}unsicher{% else %}{{ t.get(s, s) }}{% endif %}
actions:
  - action: telegram_bot.send_message
    continue_on_error: true
    data:
      chat_id: >-
        {% set raw = states('input_text.telegram_chat_id_norbert') %}{{ [ (raw if raw not in ['', 'unknown', 'unavailable'] else '851603710') | int ] }}
      message: |-
        *⚠️ Synology nasnbruch*
        {{ was }}: {{ zustand }}
        {{ now().strftime('%d.%m. %H:%M') }} Uhr – Details im DSM (Speicher-Manager / Sicherheitsberater).
      parse_mode: markdown
  - action: notify.mobile_app_iphone_von_norbert
    continue_on_error: true
    data:
      title: ⚠️ Synology nasnbruch
      message: "{{ was }}: {{ zustand }}"
      data:
        push:
          sound:
            critical: 1
            name: default
            volume: 1
        tag: NAS_WARNUNG
mode: queued
max: 20

Proxmox: Warnungen an Norbert melden

Siehe auch Proxmox-Server.

id: "1790322543101"
alias: "Proxmox: Warnungen an Norbert melden"
description: >-
  Meldet Probleme des Proxmox-Servers pve (192.168.192.3) nur an Norbert: Telegram
  (Chat-ID zentral in input_text.telegram_chat_id_norbert) und kritische Push-Nachricht aufs iPhone (kommt auch bei Lautlos/Fokus durch).
  Aufbau wie 'NAS: Synology-Warnungen an Norbert melden'. Auslöser: Node-Status offline (5 min),
  Proxmox 10 min nicht im Netz, DokuWiki-Container gestoppt (5 min), CPU oder RAM > 90 %
  (je 10 min), Storage local oder local-lvm > 90 % belegt (10 min). Bereits bestehende
  Warnzustände lösen nicht erneut aus, nur neue Wechsel. Die HA-VM selbst wird nicht überwacht,
  weil HA bei deren Ausfall nichts senden kann; haos14.2 ist bewusst aus und wird ebenfalls
  nicht überwacht.
triggers:
  - trigger: state
    entity_id: binary_sensor.tools_pve_status
    from: "on"
    to: "off"
    for:
      minutes: 5
    id: status
  - trigger: state
    entity_id: device_tracker.proxmox
    from: home
    to: not_home
    for:
      minutes: 10
    id: offline
  - trigger: state
    entity_id: binary_sensor.dokuwiki_status
    from: "on"
    to: "off"
    for:
      minutes: 5
    id: status
  - trigger: numeric_state
    entity_id:
      - sensor.tools_pve_cpu_auslastung
      - sensor.tools_pve_arbeitsspeicher_auslastung_2
    above: 90
    for:
      minutes: 10
    id: prozent
  - trigger: numeric_state
    entity_id:
      - sensor.storage_local_speicherauslastung_in_prozent
      - sensor.storage_local_lvm_speicherauslastung_in_prozent
    above: 90
    for:
      minutes: 10
    id: prozent
conditions:
  - condition: template
    value_template: "{{ trigger.id != 'prozent' or trigger.from_state.state not in ['unavailable', 'unknown'] }}"
variables:
  was: >-
    {% set n = {'binary_sensor.tools_pve_status': 'Node pve',
    'device_tracker.proxmox': 'Proxmox-Server',
    'binary_sensor.dokuwiki_status': 'DokuWiki (CT 102)',
    'sensor.tools_pve_cpu_auslastung': 'CPU-Auslastung',
    'sensor.tools_pve_arbeitsspeicher_auslastung_2': 'RAM-Auslastung',
    'sensor.storage_local_speicherauslastung_in_prozent': 'Storage local (Backups/ISOs)',
    'sensor.storage_local_lvm_speicherauslastung_in_prozent': 'Storage local-lvm (VM-Disks)'}
    %}{{ n.get(trigger.entity_id, trigger.to_state.name) }}
  zustand: >-
    {% if trigger.id == 'prozent' %}{{ trigger.to_state.state | float(0) | round(0) | int }}
    %{% elif trigger.id == 'offline' %}nicht erreichbar{% else %}gestoppt / offline{% endif %}
actions:
  - action: telegram_bot.send_message
    continue_on_error: true
    data:
      chat_id: >-
        {% set raw = states('input_text.telegram_chat_id_norbert') %}{{ [ (raw if raw not in ['', 'unknown', 'unavailable'] else '851603710') | int ] }}
      message: |-
        *⚠️ Proxmox pve*
        {{ was }}: {{ zustand }}
        {{ now().strftime('%d.%m. %H:%M') }} Uhr – Details in der Proxmox-Oberfläche (https://192.168.192.3:8006).
      parse_mode: markdown
  - action: notify.mobile_app_iphone_von_norbert
    continue_on_error: true
    data:
      title: ⚠️ Proxmox pve
      message: "{{ was }}: {{ zustand }}"
      data:
        push:
          sound:
            critical: 1
            name: default
            volume: 1
        tag: PVE_WARNUNG
mode: queued
max: 20

USV: Stromausfall melden und protokollieren

id: "1790317242293"
alias: "USV: Stromausfall melden und protokollieren"
description: >-
  Wenn die USV (APC Back-UPS ES 700G an der Synology, per NUT) auf Batteriebetrieb umschaltet
  (binary_sensor.usv_batteriebetrieb an): Beginn speichern, Zähler counter.usv_stromausfalle
  erhöhen, offenen Eintrag im Störungsprotokoll (todo.storungsprotokoll) anlegen, Telegram an
  Norbert und Ute (Skript) und Push mit 'Kenntnis genommen'-Knopf an Norberts iPhone. Wenn der
  Strom zurück ist: Ende speichern, den laufenden Protokolleintrag mit Zeitraum und Dauer
  umbenennen und Entwarnung senden. Die Kenntnisnahme läuft über die bestehenden Automationen
  des Störungsprotokolls (Push-Knopf STOERUNG_OK oder Häkchen im Dashboard).
triggers:
  - trigger: state
    entity_id: binary_sensor.usv_batteriebetrieb
    from: "off"
    to: "on"
    id: start
  - trigger: state
    entity_id: binary_sensor.usv_batteriebetrieb
    from: "on"
    to: "off"
    id: ende
variables:
  akku: "{{ states('sensor.ups_batterie_ladung') | int(0) }}"
  laufzeit: "{{ (states('sensor.ups_batterielaufzeit') | float(0) / 60) | round(0) | int }}"
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: start
        sequence:
          - action: input_datetime.set_datetime
            target:
              entity_id: input_datetime.usv_stromausfall_beginn
            data:
              timestamp: "{{ as_timestamp(now()) | int }}"
          - action: counter.increment
            target:
              entity_id: counter.usv_stromausfalle
          - action: todo.add_item
            continue_on_error: true
            target:
              entity_id: todo.storungsprotokoll
            data:
              item: "🔌 Stromausfall · {{ now().strftime('%d.%m. %H:%M') }} Uhr – läuft"
              description: Offen – noch nicht zur Kenntnis genommen
          - action: script.telegram_universal_versand
            continue_on_error: true
            data:
              message: |-
                *🔌 Stromausfall – USV läuft auf Batterie*
                Seit {{ now().strftime('%H:%M') }} Uhr · Akku {{ akku }} %{{ ' · Restlaufzeit ca. ' ~ laufzeit ~ ' min' if laufzeit > 0 else '' }}
                Bitte im Dashboard zur Kenntnis nehmen.
              parse_mode: markdown
          - action: notify.mobile_app_iphone_von_norbert
            continue_on_error: true
            data:
              title: 🔌 Stromausfall – USV auf Batterie
              message: "Seit {{ now().strftime('%H:%M') }} Uhr · Akku {{ akku }} %{{ ' · ca. ' ~ laufzeit ~ ' min' if laufzeit > 0 else '' }}"
              data:
                tag: STOERUNG
                actions:
                  - action: STOERUNG_OK
                    title: Kenntnis genommen
      - conditions:
          - condition: trigger
            id: ende
        sequence:
          - action: input_datetime.set_datetime
            target:
              entity_id: input_datetime.usv_stromausfall_ende
            data:
              timestamp: "{{ as_timestamp(now()) | int }}"
          - variables:
              b: "{{ state_attr('input_datetime.usv_stromausfall_beginn', 'timestamp') | float(0) }}"
              e: "{{ as_timestamp(now()) }}"
              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' }})
          - action: todo.get_items
            continue_on_error: true
            target:
              entity_id: todo.storungsprotokoll
            data:
              status:
                - needs_action
                - completed
            response_variable: liste
          - repeat:
              for_each: >-
                {{ (liste['todo.storungsprotokoll']['items'] if liste is defined else [])
                | selectattr('summary', 'search', '^🔌 Stromausfall .*– läuft$')
                | map(attribute='uid') | list }}
              sequence:
                - action: todo.update_item
                  continue_on_error: true
                  target:
                    entity_id: todo.storungsprotokoll
                  data:
                    item: "{{ repeat.item }}"
                    rename: "🔌 Stromausfall · {{ zeitraum }}"
          - action: script.telegram_universal_versand
            continue_on_error: true
            data:
              message: |-
                *✅ Strom ist wieder da*
                {{ zeitraum }}
                Akku {{ akku }} %
              parse_mode: markdown
          - action: notify.mobile_app_iphone_von_norbert
            continue_on_error: true
            data:
              title: ✅ Strom ist wieder da
              message: "{{ zeitraum }}"
              data:
                tag: STOERUNG
                actions:
                  - action: STOERUNG_OK
                    title: Kenntnis genommen
mode: queued

Test: Push-Nachricht an Norberts iPhone (deaktiviert)

id: "1790168002091"
alias: "Test: Push-Nachricht an Norberts iPhone"
description: Einfache Test-Automatisierung für Norberts iPhone.
triggers:
  - trigger: homeassistant
    event: start
actions:
  - action: notify.mobile_app_iphone_von_norbert
    data:
      title: Testalarm
      message: Push-Nachricht an Norberts iPhone funktioniert!
      data:
        push:
          sound:
            name: default
            critical: 1
            volume: 1
  - action: notify.mobile_app_iphone_13_ute
    data:
      title: Testalarm
      message: Push-Nachricht an Utes iPhone funktioniert!
      data:
        push:
          sound:
            name: default
            critical: 1
            volume: 1
mode: single

Test: Ute betritt/verlässt Zuhause (kritische Benachrichtigung)

id: "1790246724878"
alias: "Test: Ute betritt/verlässt Zuhause (kritische Benachrichtigung)"
description: >-
  Testautomation: Kritische Push-Benachrichtigung an Norberts iPhone, wenn Ute (person.ute)
  die Zone Home betritt oder verlässt.
triggers:
  - trigger: state
    entity_id: person.ute
    to: home
    not_from:
      - unavailable
      - unknown
    id: betreten
  - trigger: state
    entity_id: person.ute
    from: home
    not_to:
      - unavailable
      - unknown
    id: verlassen
conditions: []
actions:
  - action: notify.mobile_app_iphone_von_norbert
    data:
      title: 📍 Ute
      message: >-
        Ute hat die Zone Home {% if trigger.id == 'betreten' %}betreten 🏠{% else %}verlassen 🚗{% endif %}
        ({{ now().strftime('%H:%M') }} Uhr).
      data:
        push:
          sound:
            critical: 1
            name: default
            volume: 1
mode: queued

Norbert verlässt Raderbroich (kritische Benachrichtigung)

id: "1790424265316"
alias: Norbert verlässt Raderbroich (kritische Benachrichtigung)
description: 'Kritische Push-Benachrichtigung an Norberts iPhone (kommt auch bei Lautlos/Fokus durch),
  wenn Norbert (person.norbert) die Zone Raderbroich (zone.home) verlässt. Pendant zu ''Test: Ute betritt/verlässt
  Zuhause''.'
triggers:
- trigger: state
  entity_id: person.norbert
  from: home
  not_to:
  - unavailable
  - unknown
  id: verlassen
conditions: []
actions:
- action: notify.mobile_app_iphone_von_norbert
  data:
    title: 📍 Raderbroich verlassen
    message: Du hast die Zone Raderbroich verlassen 🚗 ({{ now().strftime('%H:%M') }} Uhr).
    data:
      push:
        sound:
          name: default
          critical: 1
          volume: 1
mode: queued

Zone: Willkommen im Alten Brauhaus (kritische Benachrichtigung)

id: "1790431953337"
alias: "Zone: Willkommen im Alten Brauhaus (kritische Benachrichtigung)"
description: >-
  Wer die Zone 'Zum alten Brauhaus' (Gaststätte Zum Alten Brauhaus Dresen, Raderbroich 13)
  betritt, bekommt eine kritische Push-Nachricht auf das eigene iPhone – Norbert auf das
  iPhone von Norbert, Ute auf das iPhone 13 Ute. Jeder nur für sich.
triggers:
  - trigger: zone
    entity_id: person.norbert
    zone: zone.zum_alten_brauhaus
    event: enter
    id: norbert
  - trigger: zone
    entity_id: person.ute
    zone: zone.zum_alten_brauhaus
    event: enter
    id: ute
conditions: []
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: norbert
        sequence:
          - action: notify.mobile_app_iphone_von_norbert
            data:
              title: 🍺 Zum alten Brauhaus
              message: Herzlich willkommen in der Gaststätte Zum alten Brauhaus. PROST 🍺
              data:
                push:
                  sound:
                    name: default
                    critical: 1
                    volume: 1
      - conditions:
          - condition: trigger
            id: ute
        sequence:
          - action: notify.mobile_app_iphone_13_ute
            data:
              title: 🍺 Zum alten Brauhaus
              message: Herzlich willkommen in der Gaststätte Zum alten Brauhaus. PROST 🍺
              data:
                push:
                  sound:
                    name: default
                    critical: 1
                    volume: 1
mode: parallel
max: 5