Compare commits

...

3 Commits

Author SHA1 Message Date
7042453358 reduce temp syncs 2025-12-21 18:36:34 +01:00
d3beca60b6 limit temps 2025-12-21 18:28:21 +01:00
d68a173de6 refactoring and warning notification 2025-12-21 18:09:37 +01:00

View File

@@ -33,6 +33,28 @@ blueprint:
multiple: false multiple: false
filter: filter:
- domain: input_boolean - 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: window_section:
name: Fenster-/Türsensor Konfiguration name: Fenster-/Türsensor Konfiguration
description: Konfiguration für den Fenster-/Türsensor. description: Konfiguration für den Fenster-/Türsensor.
@@ -130,6 +152,8 @@ variables:
radiator_schedules: !input radiator_schedules radiator_schedules: !input radiator_schedules
active_scheduler_selector: !input active_scheduler_selector active_scheduler_selector: !input active_scheduler_selector
away_temperature: !input away_temperature away_temperature: !input away_temperature
min_temperature: !input min_temperature
max_temperature: !input max_temperature
alarm_control_panel: !input alarm_control_panel alarm_control_panel: !input alarm_control_panel
is_heating_period: > is_heating_period: >
{% if heating_period_switch is none or heating_period_switch == '' %} {% if heating_period_switch is none or heating_period_switch == '' %}
@@ -178,6 +202,55 @@ variables:
{% else %} {% else %}
{{ away_temperature }} {{ away_temperature }}
{% endif %} {% 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: triggers:
- platform: state - platform: state
@@ -257,13 +330,13 @@ actions:
- if: - if:
- condition: template - condition: template
value_template: > value_template: >
{{ target_temperature is not none and target_temperature | is_number }} {{ is_valid_temperature and is_temperature_change_needed }}
then: then:
- service: climate.set_temperature - service: climate.set_temperature
target: target:
entity_id: !input trv entity_id: !input trv
data: data:
temperature: "{{ target_temperature | float }}" temperature: "{{ safe_temperature | float }}"
alias: Heizperiode aktiviert - Setze Modus auf heat, synchronisiere Fensterstatus und Solltemperatur alias: Heizperiode aktiviert - Setze Modus auf heat, synchronisiere Fensterstatus und Solltemperatur
- conditions: - conditions:
- condition: trigger - condition: trigger
@@ -314,13 +387,13 @@ actions:
- if: - if:
- condition: template - condition: template
value_template: > value_template: >
{{ target_temperature is not none and target_temperature | is_number }} {{ is_valid_temperature and is_temperature_change_needed }}
then: then:
- service: climate.set_temperature - service: climate.set_temperature
target: target:
entity_id: !input trv entity_id: !input trv
data: data:
temperature: "{{ target_temperature | float }}" temperature: "{{ safe_temperature | float }}"
alias: Setze Fenster auf geschlossen und setze Solltemperatur auf Wert aus Zeitplan (wenn vorhanden) alias: Setze Fenster auf geschlossen und setze Solltemperatur auf Wert aus Zeitplan (wenn vorhanden)
alias: Fensterstatus Änderung alias: Fensterstatus Änderung
# temperature sensor sync # temperature sensor sync
@@ -332,6 +405,8 @@ actions:
- condition: template - condition: template
value_template: > value_template: >
{{ temperature_sensor is defined and states(temperature_sensor) | is_number }} {{ temperature_sensor is defined and states(temperature_sensor) | is_number }}
- condition: template
value_template: "{{ is_sensor_sync_needed }}"
sequence: sequence:
- service: number.set_value - service: number.set_value
data: data:
@@ -348,14 +423,14 @@ actions:
{{ temperature_sensor is defined and states(temperature_sensor) | is_number }} {{ temperature_sensor is defined and states(temperature_sensor) | is_number }}
- condition: template - condition: template
value_template: > value_template: >
{{ (now() - states[temperature_sensor].last_changed).total_seconds() > 1199 }} {{ (now() - states[temperature_sensor].last_changed).total_seconds() > 1499 }}
sequence: sequence:
- service: number.set_value - service: number.set_value
data: data:
value: "{{ states(temperature_sensor) | float }}" value: "{{ states(temperature_sensor) | float }}"
target: target:
entity_id: "{{ remote_temperature_entity }}" 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 alias: Temperatursynchronisation
# setze Solltemperatur bei Schedule und Alarm-Status-Änderungen # setze Solltemperatur bei Schedule und Alarm-Status-Änderungen
- choose: - choose:
@@ -378,13 +453,30 @@ actions:
- if: - if:
- condition: template - condition: template
value_template: > value_template: >
{{ target_temperature is not none and target_temperature | is_number }} {{ is_valid_temperature and is_temperature_change_needed }}
then: then:
- service: climate.set_temperature - service: climate.set_temperature
target: target:
entity_id: !input trv entity_id: !input trv
data: 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: Setze Solltemperatur
alias: Solltemperatur bei Änderungen alias: Solltemperatur bei Änderungen
alias: Aktionen während Heizperiode alias: Aktionen während Heizperiode