add first version of schedule selector
This commit is contained in:
199
Climate/schedule_selector.yaml
Normal file
199
Climate/schedule_selector.yaml
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
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. Optionen sollten die Entity-IDs der Scheduler enthalten.
|
||||||
|
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: []
|
||||||
|
|
||||||
Reference in New Issue
Block a user