====== Skripte ======
[[ha:raderbroich:start|← zurück zur Übersicht]]
Stand: **25.09.2026**, 8 Skripte, alle in der Oberfläche angelegt (Einstellungen → Automationen & Szenen → Skripte).
===== Übersicht =====
^ Skript ^ Entität ^ Was es tut ^ Aufgerufen von ^
| Alarm: Schalten (Scharf/Hülle/Unscharf) | ''script.alarm_schalten_scharf_hulle_unscharf'' | Schickt den Befehl an Homematic, wartet bis 45 s auf das Ergebnis, setzt den Dashboard-Status und meldet Fehler. | Dashboard-Knöpfe; Alarm automatisch bei Abwesenheit; Nacht-Hüllenschutz |
| Alarm: Video per Telegram senden | ''script.alarm_video_senden'' | Wartet, bis ein Alarm-Video fertig ist, und schickt es mit „Alarm bestätigen“-Knopf an Norbert und Ute. | Alarm-Videoschleife |
| Heizung: Urlaubsmodus aktivieren | ''script.heizung_urlaub_aktivieren'' | Homematic-Urlaubsmodus bis ''heizung_urlaub_ende'' mit ''heizung_urlaub_temperatur''. | Dashboard |
| Heizung: Urlaubsmodus beenden | ''script.heizung_urlaub_beenden'' | Beendet den Homematic-Urlaubsmodus. | Dashboard |
| Reolink Clip aufnehmen (10 s) | ''script.reolink_clip_aufnehmen'' | 10-s-Video in Hochauflösung plus Vorschaubild nach ''/media/reolink''. | Dashboard (Kamera) |
| Reolink PTZ Schritt | ''script.reolink_ptz_schritt'' | Bewegt die Kamera in eine Richtung um ''reolink_ptz_schritte'' kurze Impulse. | Dashboard (Kamera-Pfeile) |
| Telegram Universal-Versand | ''script.telegram_universal_versand'' | Zentraler Versand von Text, Bild oder Video an alle Chat-IDs aus ''input_text.telegram_chat_ids_alle'' (Norbert und Ute). | fast alle Meldungs-Automationen |
| Push an alle Handys | ''script.push_an_alle_handys'' | Push an beide iPhones mit wählbarem Titel, Text, Ton und „kritisch“. | Alarmstatus via Telegram und iOS (Fehlermeldung) |
===== Alarm: Schalten (Scharf/Hülle/Unscharf) =====
alias: "Alarm: Schalten (Scharf/Hülle/Unscharf)"
description: >-
Sendet den Befehl an Homematic und synchronisiert input_select.alarmstatus mit dem tatsächlich
erreichten Zustand. Wird direkt von den Dashboard-Buttons aufgerufen.
fields:
ziel:
description: "Gewünschter Zustand: Scharf, Hüllenschutz oder Unscharf"
example: Hüllenschutz
sequence:
- variables:
aktueller_mapped: |-
{% set state_map = {
'armed_away': 'Scharf',
'armed': 'Scharf',
'armed_home': 'Hüllenschutz',
'armed_night': 'Hüllenschutz',
'disarmed': 'Unscharf',
'triggered': 'Ausgelöst'
} %} {{ state_map.get(states('alarm_control_panel.hmip_raderbroich_hmip_alarm_control_panel'), none) }}
- if:
- condition: template
value_template: "{{ aktueller_mapped == ziel }}"
then:
- action: input_boolean.turn_off
target:
entity_id: input_boolean.alarm_vorgang_laeuft
- action: input_text.set_value
target:
entity_id: input_text.alarm_letzter_fehler
data:
value: ""
- stop: Zielzustand bereits erreicht, nichts zu tun.
- action: input_boolean.turn_on
target:
entity_id: input_boolean.alarm_vorgang_laeuft
- action: input_text.set_value
target:
entity_id: input_text.alarm_letzter_fehler
data:
value: ""
- choose:
- conditions:
- condition: template
value_template: "{{ ziel == 'Scharf' }}"
sequence:
- action: alarm_control_panel.alarm_arm_away
continue_on_error: true
target:
entity_id: alarm_control_panel.hmip_raderbroich_hmip_alarm_control_panel
- conditions:
- condition: template
value_template: "{{ ziel == 'Hüllenschutz' }}"
sequence:
- action: alarm_control_panel.alarm_arm_home
continue_on_error: true
target:
entity_id: alarm_control_panel.hmip_raderbroich_hmip_alarm_control_panel
- conditions:
- condition: template
value_template: "{{ ziel == 'Unscharf' }}"
sequence:
- action: alarm_control_panel.alarm_disarm
continue_on_error: true
target:
entity_id: alarm_control_panel.hmip_raderbroich_hmip_alarm_control_panel
- wait_for_trigger:
- trigger: state
entity_id: alarm_control_panel.hmip_raderbroich_hmip_alarm_control_panel
not_to:
- pending
- arming
- disarming
timeout: "00:00:45"
continue_on_timeout: true
- variables:
hmip_final: "{{ states('alarm_control_panel.hmip_raderbroich_hmip_alarm_control_panel') }}"
final_text: |-
{% set state_map = {
'armed_away': 'Scharf',
'armed': 'Scharf',
'armed_home': 'Hüllenschutz',
'armed_night': 'Hüllenschutz',
'disarmed': 'Unscharf',
'triggered': 'Ausgelöst'
} %} {{ state_map.get(hmip_final, states('input_select.alarmstatus')) }}
- action: input_boolean.turn_off
target:
entity_id: input_boolean.alarm_vorgang_laeuft
- action: input_select.select_option
target:
entity_id: input_select.alarmstatus
data:
option: "{{ final_text }}"
- if:
- condition: template
value_template: "{{ final_text != ziel }}"
then:
- action: input_text.set_value
target:
entity_id: input_text.alarm_letzter_fehler
data:
value: "{{ ziel }} nicht möglich (Status: {{ final_text }})"
- action: persistent_notification.create
data:
title: "Alarmanlage: Schaltung fehlgeschlagen"
message: "Gewünscht: {{ ziel }}, tatsächlicher Status: {{ final_text }} (evtl. offene Tür/Fenster prüfen)"
mode: restart
===== Alarm: Video per Telegram senden =====
alias: "Alarm: Video per Telegram senden"
description: >-
Wartet, bis die Aufnahme fertig ist (Videolänge + 3 s Puffer; camera.record kehrt sofort
zurück), und sendet sie mit Bestätigungs-Button per Telegram.
icon: mdi:video-wireless
fields:
datei:
name: Datei
description: Pfad zur Videodatei
required: true
selector:
text: null
laenge:
name: Länge
description: Videolänge in Sekunden
required: true
selector:
number:
min: 5
max: 60
unit_of_measurement: s
nummer:
name: Nummer
description: Laufende Videonummer
required: false
selector:
number:
min: 0
max: 1000
mode: box
sequence:
- alias: Warten, bis Aufnahme fertig geschrieben ist
delay:
seconds: "{{ laenge | int(10) + 3 }}"
- action: telegram_bot.send_video
continue_on_error: true
data:
entity_id: notify.norbert_bruchmann
file: "{{ datei }}"
caption: "🚨 ALARM – Video {{ nummer | default('') }} ({{ laenge | int }} s, {{ now().strftime('%H:%M:%S') }})"
inline_keyboard:
- - - ✅ Alarm bestätigen
- /alarm_ack
- action: telegram_bot.send_video
continue_on_error: true
data:
entity_id: notify.ute_heister
file: "{{ datei }}"
caption: "🚨 ALARM – Video {{ nummer | default('') }} ({{ laenge | int }} s, {{ now().strftime('%H:%M:%S') }})"
inline_keyboard:
- - - ✅ Alarm bestätigen
- /alarm_ack
mode: parallel
max: 20
===== Heizung: Urlaubsmodus aktivieren =====
alias: "Heizung: Urlaubsmodus aktivieren"
description: >-
Aktiviert den Homematic IP Urlaubsmodus bis zum Zeitpunkt in input_datetime.heizung_urlaub_ende
mit der Temperatur aus input_number.heizung_urlaub_temperatur.
icon: mdi:airplane-takeoff
sequence:
- alias: Ende muss in der Zukunft liegen
condition: template
value_template: "{{ as_datetime(states('input_datetime.heizung_urlaub_ende')).replace(tzinfo=now().tzinfo) > now() }}"
- action: homematicip_cloud.activate_vacation
data:
endtime: "{{ as_datetime(states('input_datetime.heizung_urlaub_ende')).strftime('%Y-%m-%d %H:%M') }}"
temperature: "{{ states('input_number.heizung_urlaub_temperatur') | float(17) }}"
mode: single
===== Heizung: Urlaubsmodus beenden =====
alias: "Heizung: Urlaubsmodus beenden"
icon: mdi:airplane-landing
sequence:
- action: homematicip_cloud.deactivate_vacation
data: {}
mode: single
===== Reolink Clip aufnehmen (10 s) =====
alias: Reolink Clip aufnehmen (10 s)
description: >-
Nimmt 10 Sekunden in Hochauflösung nach /media/reolink auf und speichert zusätzlich ein
Vorschaubild in Standardauflösung mit gleichem Dateinamen.
icon: mdi:record-rec
variables:
stamm: "/media/reolink/wohnzimmer_{{ now().strftime('%Y-%m-%d_%H-%M-%S') }}"
sequence:
- action: camera.snapshot
continue_on_error: true
target:
entity_id: camera.ko_wohnzimmer_standardauflosung
data:
filename: "{{ stamm }}.jpg"
- action: camera.record
target:
entity_id: camera.ko_wohnzimmer_hochauflosung
data:
duration: 10
filename: "{{ stamm }}.mp4"
lookback: 0
mode: single
max_exceeded: silent
===== Reolink PTZ Schritt =====
alias: Reolink PTZ Schritt
description: >-
Bewegt die Reolink (ko-Wohnzimmer) um die Anzahl Schritte aus input_number.reolink_ptz_schritte.
Ein Schritt = kurzer Bewegungsimpuls + Stopp.
icon: mdi:arrow-all
fields:
richtung:
name: Richtung
required: true
selector:
select:
options:
- links
- rechts
- hoch
- runter
variables:
button: "{{ {'links': 'button.ko_wohnzimmer_ptz_links', 'rechts': 'button.ko_wohnzimmer_ptz_rechts', 'hoch': 'button.ko_wohnzimmer_ptz_aufwarts', 'runter': 'button.ko_wohnzimmer_ptz_abwarts'}[richtung] }}"
schritte: "{{ states('input_number.reolink_ptz_schritte') | int(1) }}"
sequence:
- repeat:
count: "{{ schritte }}"
sequence:
- action: button.press
target:
entity_id: "{{ button }}"
- delay:
milliseconds: 40
- action: button.press
target:
entity_id: button.ko_wohnzimmer_ptz_stopp
- delay:
milliseconds: 150
mode: single
max_exceeded: silent
===== Telegram Universal-Versand =====
alias: Telegram Universal-Versand
description: Zentrales Skript zum Senden von Text, Bildern und Videos via Telegram. Empfänger stehen zentral
in input_text.telegram_chat_ids_alle (kommagetrennt, derzeit Norbert 851603710 und Ute 965268974). Neuen
Empfänger dort ergänzen. Ist der Helfer leer/nicht verfügbar, wird an Norbert und Ute gesendet.
fields:
message:
description: Der Text der Nachricht (optional bei Medien)
required: false
selector:
text: null
photo:
description: URL oder lokaler Pfad zu einem Bild
required: false
selector:
text: null
video:
description: URL oder lokaler Pfad zu einem Video
required: false
selector:
text: null
max: 10
mode: queued
sequence:
- variables:
chat_ids: '{% set raw = states(''input_text.telegram_chat_ids_alle'') %}{% if raw in ['''', ''unknown'',
''unavailable''] %}{{ [851603710, 965268974] }}{% else %}{{ raw.split('','') | map(''trim'') | select(''ne'',
'''') | map(''int'') | list }}{% endif %}'
- choose:
- conditions:
- condition: template
value_template: '{{ photo is defined and photo | length > 0 }}'
sequence:
- action: telegram_bot.send_photo
data:
caption: '{{ message | default('''', true) }}'
parse_mode: markdown
url: '{{ photo }}'
chat_id: '{{ chat_ids }}'
- conditions:
- condition: template
value_template: '{{ video is defined and video | length > 0 }}'
sequence:
- action: telegram_bot.send_video
data:
caption: '{{ message | default('''', true) }}'
parse_mode: markdown
url: '{{ video }}'
chat_id: '{{ chat_ids }}'
- conditions:
- condition: template
value_template: '{{ message is defined and message | length > 0 }}'
sequence:
- action: telegram_bot.send_message
data:
message: '{{ message }}'
parse_mode: markdown
chat_id: '{{ chat_ids }}'
===== Push an alle Handys =====
alias: Push an alle Handys
description: 'Versendet Push-Benachrichtigungen an alle iPhones (Norbert + Ute) mit individuellem Sound.
Wird produktiv für Fehlermeldungen genutzt (früher: ''Test: Push-Nachricht an alle Handys'').'
icon: mdi:bell-ring
fields:
title:
name: Titel
description: Titel der Benachrichtigung
default: Testalarm
example: Alarmanlage Test
message:
name: Nachricht
description: Der Text der Nachricht
default: Das Push-Skript funktioniert einwandfrei!
example: Dies ist ein Test.
sound:
name: Sound-Datei
description: Name des Sounds auf dem iPhone (z.B. default oder ein eigener Name)
default: default
example: alarm.wav
critical:
name: Critical Alert (Stummmodus durchbrechen)
description: 0 = Normal, 1 = Durchbricht den Stummmodus
default: 0
example: 1
mode: queued
max: 10
sequence:
- action: notify.mobile_app_iphone_von_norbert
continue_on_error: true
data:
title: '{{ title }}'
message: '{{ message }}'
data:
push:
sound:
name: '{{ sound | default(''default'') }}'
critical: '{{ critical | int(0) }}'
volume: 1
- action: notify.mobile_app_iphone_13_ute
continue_on_error: true
data:
title: '{{ title }}'
message: '{{ message }}'
data:
push:
sound:
name: '{{ sound | default(''default'') }}'
critical: '{{ critical | int(0) }}'
volume: 1
====== Funktionsbeschreibungen und Aufruf-Beispiele ======
===== Modus der Skripte =====
^ Skript ^ Modus ^
| Alarm: Schalten | restart |
| Alarm: Video per Telegram senden | parallel (max. 20) |
| Telegram Universal-Versand | queued (max. 10) |
| Reolink PTZ Schritt, Reolink Clip, Heizung (beide), Test-Push | single |
===== Alarm: Schalten – Ablauf =====
Zentrales Skript für **alle** Schaltvorgänge der Alarmanlage aus HA. Parameter ''ziel'': ''Scharf'', ''Hüllenschutz'' oder ''Unscharf''.
- Ist der Zielzustand schon erreicht → Flag aus, Fehler leeren, Ende.
- ''input_boolean.alarm_vorgang_laeuft'' an, ''input_text.alarm_letzter_fehler'' leeren.
- Befehl an Homematic: Scharf → ''alarm_arm_away'', Hüllenschutz → ''alarm_arm_home'', Unscharf → ''alarm_disarm''.
- Bis zu **45 s** warten, bis das Panel einen Endzustand meldet.
- Flag aus, erreichten Zustand in ''input_select.alarmstatus'' schreiben.
- Wurde das Ziel **nicht** erreicht (z. B. Fenster offen): Fehlertext in ''input_text.alarm_letzter_fehler'' und eine persistente Meldung in HA. Die Automation „Alarmstatus via Telegram und iOS senden“ meldet den Fehler dann an beide.
action: script.alarm_schalten_scharf_hulle_unscharf
data:
ziel: Hüllenschutz
===== Alarm: Video per Telegram senden =====
Parameter: ''datei'', ''laenge'', ''nummer''. Wartet Videolänge + 3 s (die Aufnahme läuft im Hintergrund) und sendet dann das Video mit der Beschriftung „ALARM – Video n“ und dem Button **„✅ Alarm bestätigen“** (Callback ''/alarm_ack'') an Norbert und Ute.
===== Telegram Universal-Versand =====
Parameter (alle optional): ''message'', ''photo'', ''video''. Sendet ein Foto, Video **oder** eine Textnachricht (Markdown) an alle Chat-IDs aus ''input_text.telegram_chat_ids_alle'' (derzeit **851603710** Norbert und **965268974** Ute). Ist der Helfer leer, gehen die Nachrichten an diese beiden IDs.
action: script.telegram_universal_versand
data:
message: "🔒 *Test* – das ist eine Testnachricht"
===== Reolink PTZ Schritt =====
Parameter ''richtung'': links, rechts, hoch, runter. Wiederholt ''input_number.reolink_ptz_schritte''-mal: Bewegungs-Button drücken → 40 ms → Stopp → 150 ms. So bewegt sich die Kamera in kleinen, gut steuerbaren Schritten.
===== Reolink Clip aufnehmen =====
Speichert ein Vorschaubild (Standardauflösung) und 10 s Video (Hochauflösung) unter ''/media/reolink/wohnzimmer_JJJJ-MM-TT_HH-MM-SS.jpg/.mp4''. Die Clips erscheinen in der Galerie im Dashboard.
===== Heizung: Urlaubsmodus =====
* **Aktivieren:** prüft, dass ''input_datetime.heizung_urlaub_ende'' in der Zukunft liegt, und ruft ''homematicip_cloud.activate_vacation'' mit Ende und ''input_number.heizung_urlaub_temperatur'' auf. Gilt für **alle** Heizgruppen (Homematic-Urlaubsmodus).
* **Beenden:** ''homematicip_cloud.deactivate_vacation''.
===== Push an alle Handys =====
Parameter: ''title'', ''message'', ''sound'', ''critical'' (0/1). Sendet an beide iPhones. Wird auch für Alarm-Fehlermeldungen (critical = 1) genutzt (bis 26.09.2026 hieß das Skript „Test: Push-Nachricht an alle Handys“).