Compare commits
3 Commits
ab94183c65
...
7042453358
| Author | SHA1 | Date | |
|---|---|---|---|
| 7042453358 | |||
| d3beca60b6 | |||
| d68a173de6 |
@@ -33,6 +33,28 @@ blueprint:
|
||||
multiple: false
|
||||
filter:
|
||||
- domain: input_boolean
|
||||
min_temperature:
|
||||
name: Minimale Temperatur
|
||||
description: Minimale erlaubte Solltemperatur als Sicherheitsgrenze (Default = 15°C)
|
||||
default: 15
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
min: 10.0
|
||||
max: 20.0
|
||||
unit_of_measurement: "°C"
|
||||
step: 0.5
|
||||
max_temperature:
|
||||
name: Maximale Temperatur
|
||||
description: Maximale erlaubte Solltemperatur als Sicherheitsgrenze (Default = 28°C)
|
||||
default: 23
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
min: 20.0
|
||||
max: 25.0
|
||||
unit_of_measurement: "°C"
|
||||
step: 0.5
|
||||
window_section:
|
||||
name: Fenster-/Türsensor Konfiguration
|
||||
description: Konfiguration für den Fenster-/Türsensor.
|
||||
@@ -130,6 +152,8 @@ variables:
|
||||
radiator_schedules: !input radiator_schedules
|
||||
active_scheduler_selector: !input active_scheduler_selector
|
||||
away_temperature: !input away_temperature
|
||||
min_temperature: !input min_temperature
|
||||
max_temperature: !input max_temperature
|
||||
alarm_control_panel: !input alarm_control_panel
|
||||
is_heating_period: >
|
||||
{% if heating_period_switch is none or heating_period_switch == '' %}
|
||||
@@ -178,6 +202,55 @@ variables:
|
||||
{% else %}
|
||||
{{ away_temperature }}
|
||||
{% endif %}
|
||||
safe_temperature: >
|
||||
{% set temp = target_temperature | float(18) %}
|
||||
{% if temp < min_temperature %}
|
||||
{{ min_temperature }}
|
||||
{% elif temp > max_temperature %}
|
||||
{{ max_temperature }}
|
||||
{% else %}
|
||||
{{ temp }}
|
||||
{% endif %}
|
||||
is_valid_temperature: >
|
||||
{{ safe_temperature is not none and safe_temperature | is_number }}
|
||||
is_temperature_change_needed: >
|
||||
{% set current = state_attr(trv, 'temperature') | float(0) %}
|
||||
{% set new = safe_temperature | float(0) %}
|
||||
{% set diff = new - current %}
|
||||
{% if new > current %}
|
||||
true
|
||||
{% elif diff | abs >= 0.5 %}
|
||||
true
|
||||
{% else %}
|
||||
false
|
||||
{% endif %}
|
||||
is_sensor_sync_needed: >
|
||||
{% set current_remote = state_attr(trv, device_class ~ '_temperature') | default(state_attr(remote_temperature_entity, 'state'), none) | float(0) %}
|
||||
{% set new_sensor = states(temperature_sensor) | float(0) %}
|
||||
{% set target = safe_temperature | float(0) %}
|
||||
{% set diff = (new_sensor - current_remote) | abs %}
|
||||
{% if diff >= 0.5 %}
|
||||
true
|
||||
{% elif new_sensor < target and current_remote >= target %}
|
||||
true
|
||||
{% elif new_sensor > target and current_remote <= target %}
|
||||
true
|
||||
{% else %}
|
||||
false
|
||||
{% endif %}
|
||||
scheduler_mismatch: >
|
||||
{% set selected_friendly_name = states(active_scheduler_selector) %}
|
||||
{% if selected_friendly_name not in ['unknown', '', none] %}
|
||||
{% set found = namespace(value=false) %}
|
||||
{% for schedule in radiator_schedules %}
|
||||
{% if state_attr(schedule, 'friendly_name') == selected_friendly_name %}
|
||||
{% set found.value = true %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{{ not found.value }}
|
||||
{% else %}
|
||||
false
|
||||
{% endif %}
|
||||
|
||||
triggers:
|
||||
- platform: state
|
||||
@@ -257,13 +330,13 @@ actions:
|
||||
- if:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ target_temperature is not none and target_temperature | is_number }}
|
||||
{{ is_valid_temperature and is_temperature_change_needed }}
|
||||
then:
|
||||
- service: climate.set_temperature
|
||||
target:
|
||||
entity_id: !input trv
|
||||
data:
|
||||
temperature: "{{ target_temperature | float }}"
|
||||
temperature: "{{ safe_temperature | float }}"
|
||||
alias: Heizperiode aktiviert - Setze Modus auf heat, synchronisiere Fensterstatus und Solltemperatur
|
||||
- conditions:
|
||||
- condition: trigger
|
||||
@@ -314,13 +387,13 @@ actions:
|
||||
- if:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ target_temperature is not none and target_temperature | is_number }}
|
||||
{{ is_valid_temperature and is_temperature_change_needed }}
|
||||
then:
|
||||
- service: climate.set_temperature
|
||||
target:
|
||||
entity_id: !input trv
|
||||
data:
|
||||
temperature: "{{ target_temperature | float }}"
|
||||
temperature: "{{ safe_temperature | float }}"
|
||||
alias: Setze Fenster auf geschlossen und setze Solltemperatur auf Wert aus Zeitplan (wenn vorhanden)
|
||||
alias: Fensterstatus Änderung
|
||||
# temperature sensor sync
|
||||
@@ -332,6 +405,8 @@ actions:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ temperature_sensor is defined and states(temperature_sensor) | is_number }}
|
||||
- condition: template
|
||||
value_template: "{{ is_sensor_sync_needed }}"
|
||||
sequence:
|
||||
- service: number.set_value
|
||||
data:
|
||||
@@ -348,14 +423,14 @@ actions:
|
||||
{{ temperature_sensor is defined and states(temperature_sensor) | is_number }}
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ (now() - states[temperature_sensor].last_changed).total_seconds() > 1199 }}
|
||||
{{ (now() - states[temperature_sensor].last_changed).total_seconds() > 1499 }}
|
||||
sequence:
|
||||
- service: number.set_value
|
||||
data:
|
||||
value: "{{ states(temperature_sensor) | float }}"
|
||||
target:
|
||||
entity_id: "{{ remote_temperature_entity }}"
|
||||
alias: Synchronisiere Temperatur am TRV (zeitbasiert, wenn länger als 20min unverändert)
|
||||
alias: Synchronisiere Temperatur am TRV (zeitbasiert, wenn länger als 25min unverändert)
|
||||
alias: Temperatursynchronisation
|
||||
# setze Solltemperatur bei Schedule und Alarm-Status-Änderungen
|
||||
- choose:
|
||||
@@ -378,13 +453,30 @@ actions:
|
||||
- if:
|
||||
- condition: template
|
||||
value_template: >
|
||||
{{ target_temperature is not none and target_temperature | is_number }}
|
||||
{{ is_valid_temperature and is_temperature_change_needed }}
|
||||
then:
|
||||
- service: climate.set_temperature
|
||||
target:
|
||||
entity_id: !input trv
|
||||
data:
|
||||
temperature: "{{ target_temperature | float }}"
|
||||
temperature: "{{ safe_temperature | float }}"
|
||||
# Notification bei Scheduler-Mismatch
|
||||
- if:
|
||||
- condition: template
|
||||
value_template: "{{ scheduler_mismatch and trigger.id == 'SCHEDULER_CHANGED' }}"
|
||||
then:
|
||||
- service: persistent_notification.create
|
||||
data:
|
||||
title: "⚠️ Radiator Control - Scheduler nicht gefunden"
|
||||
message: >
|
||||
Der ausgewählte Scheduler '{{ states(active_scheduler_selector) }}' wurde nicht in der
|
||||
Scheduler-Liste gefunden.
|
||||
|
||||
TRV '{{ state_attr(trv, 'friendly_name') }}' nutzt Fallback-Temperatur: {{ safe_temperature }}°C
|
||||
(Original: {{ target_temperature }}°C, Limits: {{ min_temperature }}-{{ max_temperature }}°C)
|
||||
|
||||
Bitte Konfiguration überprüfen.
|
||||
notification_id: "radiator_control_scheduler_mismatch_{{ trv }}"
|
||||
alias: Setze Solltemperatur
|
||||
alias: Solltemperatur bei Änderungen
|
||||
alias: Aktionen während Heizperiode
|
||||
|
||||
Reference in New Issue
Block a user