====== Automationen – Code: Überwachung und Tests ======
[[ha:raderbroich:installation:automationen|← 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 851603710) 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:
- 851603710
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 [[ha:raderbroich:installation:proxmox|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 851603710) 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:
- 851603710
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