209 lines
6.7 KiB
YAML
209 lines
6.7 KiB
YAML
blueprint:
|
|
name: Heizplan Selector basierend auf Kalenderereignissen
|
|
description: >
|
|
Wählt automatisch einen Heizplan basierend auf Kalenderereignissen aus.
|
|
|
|
Der Blueprint überwacht einen Kalender und wechselt zwischen verschiedenen
|
|
Schedule-Helfern basierend auf Keywords im Event-Titel oder der Beschreibung.
|
|
|
|
**WICHTIG**: Die Anzahl der Scheduler und Keywordlisten muss übereinstimmen!
|
|
Jede Zeile in den Keywordlisten entspricht einem Scheduler an der gleichen Position.
|
|
|
|
Bei Event-Ende wird zum Standard-Scheduler zurückgekehrt, außer ein anderes
|
|
Event ist bereits aktiv.
|
|
|
|
Required = *
|
|
domain: automation
|
|
homeassistant:
|
|
min_version: "2024.6.0"
|
|
author: Me
|
|
input:
|
|
calendar_section:
|
|
name: Kalender-Einstellungen
|
|
description: Kalender und zeitlicher Offset für Events
|
|
collapsed: false
|
|
input:
|
|
calendar_entity:
|
|
name: Kalender *
|
|
description: Der Kalender, der für Event-Erkennung überwacht wird
|
|
selector:
|
|
entity:
|
|
filter:
|
|
- domain: calendar
|
|
|
|
event_offset:
|
|
name: Zeitlicher Offset
|
|
description: >
|
|
Optional: Zeitlicher Versatz für Event-Start und -Ende.
|
|
Beispiel: "-00:15:00" startet 15 Minuten vor dem Event.
|
|
default: "00:00:00"
|
|
selector:
|
|
duration:
|
|
enable_day: false
|
|
|
|
scheduler_section:
|
|
name: Scheduler-Konfiguration
|
|
description: Schedule-Helfer und zugeordnete Keywords
|
|
collapsed: false
|
|
input:
|
|
scheduler_list:
|
|
name: Scheduler-Liste *
|
|
description: >
|
|
Liste der Schedule-Helfer (schedule entities).
|
|
Die Reihenfolge muss mit den Keywordlisten übereinstimmen!
|
|
selector:
|
|
entity:
|
|
multiple: true
|
|
filter:
|
|
- domain: schedule
|
|
|
|
keyword_lists:
|
|
name: Keywordlisten *
|
|
description: >
|
|
Eine Keywordliste pro Zeile (komma-separiert).
|
|
Beispiel:
|
|
urlaub,vacation,holiday
|
|
homeoffice,wfh,remote
|
|
normal,standard
|
|
|
|
**Position in der Liste = Position im Scheduler!**
|
|
Zeile 1 → Scheduler 1, Zeile 2 → Scheduler 2, etc.
|
|
selector:
|
|
text:
|
|
multiline: true
|
|
type: text
|
|
|
|
default_scheduler:
|
|
name: Standard-Scheduler *
|
|
description: >
|
|
Dieser Scheduler wird aktiviert, wenn kein Keyword matched
|
|
oder ein Event endet (und kein anderes aktiv ist).
|
|
selector:
|
|
entity:
|
|
filter:
|
|
- domain: schedule
|
|
|
|
helper_section:
|
|
name: Helper-Entity
|
|
description: Entity zum Speichern des aktiven Schedulers
|
|
collapsed: false
|
|
input:
|
|
helper_entity:
|
|
name: Input Select Helper *
|
|
description: >
|
|
Die input_select Helper-Entity, in die der aktive Scheduler geschrieben wird.
|
|
|
|
**WICHTIG**: Die Options der input_select müssen vorbereitet werden!
|
|
Sie müssen folgende Entity-IDs enthalten:
|
|
- Alle Scheduler aus der Scheduler-Liste
|
|
- Den Standard-Scheduler
|
|
|
|
Beispiel Options:
|
|
["schedule.urlaub_heizplan", "schedule.homeoffice_heizplan", "schedule.normal_heizplan", "schedule.standard_heizplan"]
|
|
|
|
Die Blueprint schreibt die Entity-ID (nicht den Friendly Name) in die Helper-Entity.
|
|
selector:
|
|
entity:
|
|
filter:
|
|
- domain: input_select
|
|
|
|
mode: single
|
|
max_exceeded: silent
|
|
|
|
triggers:
|
|
- platform: calendar
|
|
event: start
|
|
entity_id: !input calendar_entity
|
|
offset: !input event_offset
|
|
id: CALENDAR_START
|
|
|
|
- platform: calendar
|
|
event: end
|
|
entity_id: !input calendar_entity
|
|
offset: !input event_offset
|
|
id: CALENDAR_END
|
|
|
|
variables:
|
|
schedulers: !input scheduler_list
|
|
keywords_raw: !input keyword_lists
|
|
default_scheduler: !input default_scheduler
|
|
helper: !input helper_entity
|
|
calendar: !input calendar_entity
|
|
|
|
# Keywords in Liste umwandeln (eine pro Zeile)
|
|
keyword_lists: >
|
|
{{ keywords_raw.split('\n') | select() | list }}
|
|
|
|
# Bei Event-Start: Keywords matchen
|
|
matched_scheduler: >
|
|
{% set ns = namespace(scheduler = none) %}
|
|
{% if trigger.id == 'CALENDAR_START' %}
|
|
{% set event_text = (trigger.calendar_event.summary | lower) ~ ' ' ~ (trigger.calendar_event.description | default('') | lower) %}
|
|
{% for i in range(keyword_lists | length) %}
|
|
{% set keywords = keyword_lists[i].split(',') | map('trim') | map('lower') | list %}
|
|
{% set matched = namespace(found = false) %}
|
|
{% for keyword in keywords %}
|
|
{% if keyword in event_text %}
|
|
{% set matched.found = true %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
{% if matched.found and i < (schedulers | length) %}
|
|
{% set ns.scheduler = schedulers[i] %}
|
|
{% break %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
{% endif %}
|
|
{{ ns.scheduler }}
|
|
|
|
# Bei Event-Ende: Prüfen ob ein anderes Event aktiv ist
|
|
other_event_active: >
|
|
{% if trigger.id == 'CALENDAR_END' %}
|
|
{% set start = state_attr(calendar, 'start_time') %}
|
|
{% set end = state_attr(calendar, 'end_time') %}
|
|
{% if start and end %}
|
|
{% set now_ts = now().timestamp() %}
|
|
{% set start_ts = as_timestamp(start) %}
|
|
{% set end_ts = as_timestamp(end) %}
|
|
{{ start_ts <= now_ts and now_ts <= end_ts }}
|
|
{% else %}
|
|
false
|
|
{% endif %}
|
|
{% else %}
|
|
false
|
|
{% endif %}
|
|
|
|
conditions: []
|
|
|
|
actions:
|
|
- choose:
|
|
# Event-Start: Scheduler aktivieren wenn Keyword matched
|
|
- conditions:
|
|
- condition: trigger
|
|
id: CALENDAR_START
|
|
- condition: template
|
|
value_template: "{{ matched_scheduler is not none and matched_scheduler != '' }}"
|
|
sequence:
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: !input helper_entity
|
|
data:
|
|
option: "{{ matched_scheduler }}"
|
|
alias: Event-Start - Scheduler aktivieren
|
|
|
|
# Event-Ende: Zu Standard zurückkehren (nur wenn kein anderes Event aktiv)
|
|
- conditions:
|
|
- condition: trigger
|
|
id: CALENDAR_END
|
|
- condition: template
|
|
value_template: "{{ not other_event_active }}"
|
|
sequence:
|
|
- service: input_select.select_option
|
|
target:
|
|
entity_id: !input helper_entity
|
|
data:
|
|
option: "{{ default_scheduler }}"
|
|
alias: Event-Ende - Standard-Scheduler aktivieren
|
|
|
|
default: []
|
|
|