From 1f0cc41a585e660c3f3ecbb4d971e872ad0c067e Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Fri, 2 Jan 2026 10:30:39 +0100 Subject: [PATCH 01/31] align target temp increase change --- Climate/bosch_bth-ra_control.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 2f2dcdd..20d687f 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -217,9 +217,7 @@ variables: {% 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.4 %} + {% if diff | abs >= 0.4 %} true {% else %} false -- 2.49.1 From 9e9dbf8e5f308a69f70b2eefde2c81e1df109d96 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Fri, 2 Jan 2026 10:37:34 +0100 Subject: [PATCH 02/31] make sync threshold temp adjustable --- Climate/bosch_bth-ra_control.yaml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 20d687f..d4f11e0 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -25,6 +25,17 @@ blueprint: filter: - domain: sensor device_class: temperature + sensor_sync_threshold: + name: Sensor-Synchronisations-Schwellenwert + description: Minimale Temperaturdifferenz in °C, um eine Sensor-Synchronisation auszulösen (Default = 0.5°C). Temperatur wird weiterhin spätestens nach 25 Minuten synchronisiert. + default: 0.5 + selector: + number: + mode: box + min: 0.1 + max: 1.0 + unit_of_measurement: "°C" + step: 0.1 heating_period_switch: name: Heizperiode Switch description: Optional - Input Boolean der angibt ob Heizperiode aktiv ist. Wenn nicht gesetzt, ist die Heizperiode immer aktiv. @@ -148,6 +159,7 @@ blueprint: variables: trv: !input trv temperature_sensor: !input temperature_sensor + sensor_sync_threshold: !input sensor_sync_threshold heating_period_switch: !input heating_period_switch radiator_schedules: !input radiator_schedules active_scheduler_selector: !input active_scheduler_selector @@ -227,7 +239,7 @@ variables: {% set new_sensor_temp = states(temperature_sensor) | float(0) %} {% set target_temp = state_attr(trv, 'temperature') | float(0) %} {% set diff = (new_sensor_temp - current_remote_temp) | abs %} - {% if diff >= 0.5 %} + {% if diff >= sensor_sync_threshold %} true {% elif new_sensor_temp < target_temp and current_remote_temp >= target_temp %} true -- 2.49.1 From f719294bcfe58bc162a5af6787443612b10c37dd Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Sun, 4 Jan 2026 18:50:40 +0100 Subject: [PATCH 03/31] add optional override section for automatic reset, some refactoring --- Climate/bosch_bth-ra_control.yaml | 87 +++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index d4f11e0..371358b 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -155,6 +155,30 @@ blueprint: max: 25.0 unit_of_measurement: "°C" step: 0.5 + override_section: + name: Override Reset Konfiguration + description: Automatisches Zurücksetzen der Solltemperatur nach manueller Änderung am Thermostat + collapsed: true + input: + override_reset_duration: + name: Override Reset Zeitraum + description: > + Zeit nach der eine manuelle Temperaturänderung automatisch auf den Heizplan zurückgesetzt wird. + + **Feature deaktiviert wenn auf 00:00:00 gesetzt** (Default = 02:00:00) + + **Verhalten:** + - Nur manuelle Änderungen am Thermostat werden zurückgesetzt (nicht über Home Assistant) + - Timer startet neu bei jeder weiteren manuellen Änderung + - Reset erfolgt nur wenn Solltemperatur vom Heizplan abweicht + - Wenn kein Schedule aktiv ist, wird auf Abwesenheitstemperatur zurückgesetzt + - Alarm-Modus hat Priorität: Bei aktivem Alarm erfolgt kein Reset (Abwesenheitstemperatur gilt) + + Beispiel: Nach 2 Stunden wird die Temperatur wieder auf den aktiven Heizplan-Wert gesetzt. + default: "02:00:00" + selector: + duration: + enable_day: false variables: trv: !input trv @@ -167,6 +191,7 @@ variables: min_temperature: !input min_temperature max_temperature: !input max_temperature alarm_control_panel: !input alarm_control_panel + override_reset_duration: !input override_reset_duration is_heating_period: > {% if heating_period_switch is none or heating_period_switch == '' %} true @@ -191,6 +216,15 @@ variables: {% endif %} {% endfor %} {{ window_detection_entity_id.id }} + setpoint_change_source_entity: > + {% set entities = device_entities(device_id(trv)) %} + {% set setpoint_change_source_entity_id = namespace(id='') %} + {% for entity in entities %} + {% if 'setpoint_change_source' in entity %} + {% set setpoint_change_source_entity_id.id = entity %} + {% endif %} + {% endfor %} + {{ setpoint_change_source_entity_id.id }} scheduled_temperature: > {% set ns = namespace(current_temperature = none) %} {% set selected_friendly_name = states(active_scheduler_selector) %} @@ -261,6 +295,28 @@ variables: {% else %} false {% endif %} + is_manual_override: > + {% set current_temp = state_attr(trv, 'temperature') | float(0) %} + {% set target_temp = safe_temperature | float(0) %} + {% set diff = (current_temp - target_temp) | abs %} + {{ diff >= 0.4 }} + override_duration_exceeded: > + {% if setpoint_change_source_entity and override_reset_duration %} + {% set duration_seconds = override_reset_duration.total_seconds() if override_reset_duration is mapping else 0 %} + {% if duration_seconds > 0 and setpoint_change_source_entity in states %} + {% if states(setpoint_change_source_entity) == 'manual' %} + {% set last_update = states[setpoint_change_source_entity].last_updated %} + {% set elapsed = (now() - last_update).total_seconds() %} + {{ elapsed > duration_seconds }} + {% else %} + false + {% endif %} + {% else %} + false + {% endif %} + {% else %} + false + {% endif %} triggers: - platform: state @@ -278,9 +334,9 @@ triggers: for: !input window_delay_close id: FENSTER_CLOSED - platform: time_pattern - # Synce Temperatur alle 5 Minuten (Teiler von 60) + # Periodische Überprüfung alle 5 Minuten (Temperatursynchronisation, Override-Check) minutes: "/5" - id: SYNC_TEMPERATURE + id: PERIODIC_CHECK - platform: state entity_id: !input temperature_sensor id: TEMP_CHANGED @@ -427,10 +483,13 @@ actions: - conditions: - condition: trigger id: - - SYNC_TEMPERATURE + - PERIODIC_CHECK - condition: template value_template: > {{ temperature_sensor is defined and states(temperature_sensor) | is_number }} + - condition: template + value_template: > + {{ remote_temperature_entity and remote_temperature_entity in states }} - condition: template value_template: > {{ (now() - states[remote_temperature_entity].last_changed).total_seconds() > 1499 }} @@ -442,6 +501,28 @@ actions: entity_id: "{{ remote_temperature_entity }}" alias: Synchronisiere Temperatur am TRV (zeitbasiert, wenn länger als 25min unverändert) alias: Temperatursynchronisation + # override reset + - choose: + - conditions: + - condition: trigger + id: + - PERIODIC_CHECK + - condition: template + value_template: > + {% set duration_seconds = override_reset_duration.total_seconds() if override_reset_duration is mapping else 0 %} + {{ duration_seconds > 0 }} + - condition: template + value_template: "{{ is_manual_override }}" + - condition: template + value_template: "{{ override_duration_exceeded }}" + sequence: + - service: climate.set_temperature + target: + entity_id: !input trv + data: + temperature: "{{ safe_temperature | float }}" + alias: Setze Solltemperatur zurück nach manuellem Override + alias: Override Reset # setze Solltemperatur bei Schedule und Alarm-Status-Änderungen - choose: - conditions: -- 2.49.1 From 6ccbe1839b06b9d97bfe0bed448e15ec2796d7fe Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Sun, 4 Jan 2026 18:52:46 +0100 Subject: [PATCH 04/31] collapse sections --- Climate/bosch_bth-ra_control.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 371358b..502445f 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -69,7 +69,7 @@ blueprint: window_section: name: Fenster-/Türsensor Konfiguration description: Konfiguration für den Fenster-/Türsensor. - collapsed: false + collapsed: true input: window_sensor: name: Fenster-/Türsensor (oder Gruppe) @@ -103,7 +103,7 @@ blueprint: schedule_section: name: Heizplan Konfiguration description: Konfiguration der Heizpläne die für den Radiator berücksichtigt werden sollen - collapsed: false + collapsed: true input: radiator_schedules: name: Heizpläne @@ -134,7 +134,7 @@ blueprint: away_section: name: Konfiguration für Abwesenheitsmodus description: Konfiguration für das Absenken der Heizung im Abwesenheitsmodus eines Alarmsystems - collapsed: false + collapsed: true input: alarm_control_panel: name: Alarm Control Panel -- 2.49.1 From 1759929d9f262775895e72031dd2a3566f0a207b Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Sun, 4 Jan 2026 18:55:27 +0100 Subject: [PATCH 05/31] fix default and set to 0 --- Climate/bosch_bth-ra_control.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 502445f..3c26d7a 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -165,7 +165,7 @@ blueprint: description: > Zeit nach der eine manuelle Temperaturänderung automatisch auf den Heizplan zurückgesetzt wird. - **Feature deaktiviert wenn auf 00:00:00 gesetzt** (Default = 02:00:00) + **Feature deaktiviert wenn auf 00:00:00 gesetzt** (Default = 00:00:00) **Verhalten:** - Nur manuelle Änderungen am Thermostat werden zurückgesetzt (nicht über Home Assistant) @@ -175,7 +175,10 @@ blueprint: - Alarm-Modus hat Priorität: Bei aktivem Alarm erfolgt kein Reset (Abwesenheitstemperatur gilt) Beispiel: Nach 2 Stunden wird die Temperatur wieder auf den aktiven Heizplan-Wert gesetzt. - default: "02:00:00" + default: + hours: 0 + minutes: 0 + seconds: 0 selector: duration: enable_day: false -- 2.49.1 From 59edb3265c83f5de67413cd378332cee8f6375c2 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Mon, 5 Jan 2026 19:25:47 +0100 Subject: [PATCH 06/31] fix dict error --- Climate/bosch_bth-ra_control.yaml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 3c26d7a..7ab8500 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -305,7 +305,11 @@ variables: {{ diff >= 0.4 }} override_duration_exceeded: > {% if setpoint_change_source_entity and override_reset_duration %} - {% set duration_seconds = override_reset_duration.total_seconds() if override_reset_duration is mapping else 0 %} + {% if override_reset_duration is mapping %} + {% set duration_seconds = (override_reset_duration.hours | default(0) | int) * 3600 + (override_reset_duration.minutes | default(0) | int) * 60 + (override_reset_duration.seconds | default(0) | int) %} + {% else %} + {% set duration_seconds = 0 %} + {% endif %} {% if duration_seconds > 0 and setpoint_change_source_entity in states %} {% if states(setpoint_change_source_entity) == 'manual' %} {% set last_update = states[setpoint_change_source_entity].last_updated %} @@ -512,7 +516,11 @@ actions: - PERIODIC_CHECK - condition: template value_template: > - {% set duration_seconds = override_reset_duration.total_seconds() if override_reset_duration is mapping else 0 %} + {% if override_reset_duration is mapping %} + {% set duration_seconds = (override_reset_duration.hours | default(0) | int) * 3600 + (override_reset_duration.minutes | default(0) | int) * 60 + (override_reset_duration.seconds | default(0) | int) %} + {% else %} + {% set duration_seconds = 0 %} + {% endif %} {{ duration_seconds > 0 }} - condition: template value_template: "{{ is_manual_override }}" -- 2.49.1 From 336f8e2e74e5a8359207fca38894ad5aecee94c4 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Tue, 6 Jan 2026 18:52:15 +0100 Subject: [PATCH 07/31] split override reset variables for better debugging --- Climate/bosch_bth-ra_control.yaml | 40 +++++++++++++------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 7ab8500..3a9eb71 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -303,24 +303,22 @@ variables: {% set target_temp = safe_temperature | float(0) %} {% set diff = (current_temp - target_temp) | abs %} {{ diff >= 0.4 }} + override_reset_duration_seconds: > + {% if override_reset_duration is mapping %} + {{ (override_reset_duration.hours | default(0) | int) * 3600 + (override_reset_duration.minutes | default(0) | int) * 60 + (override_reset_duration.seconds | default(0) | int) }} + {% else %} + 0 + {% endif %} + override_last_change: > + {% if setpoint_change_source_entity and setpoint_change_source_entity in states %} + {{ states[setpoint_change_source_entity].last_updated }} + {% else %} + {{ none }} + {% endif %} override_duration_exceeded: > - {% if setpoint_change_source_entity and override_reset_duration %} - {% if override_reset_duration is mapping %} - {% set duration_seconds = (override_reset_duration.hours | default(0) | int) * 3600 + (override_reset_duration.minutes | default(0) | int) * 60 + (override_reset_duration.seconds | default(0) | int) %} - {% else %} - {% set duration_seconds = 0 %} - {% endif %} - {% if duration_seconds > 0 and setpoint_change_source_entity in states %} - {% if states(setpoint_change_source_entity) == 'manual' %} - {% set last_update = states[setpoint_change_source_entity].last_updated %} - {% set elapsed = (now() - last_update).total_seconds() %} - {{ elapsed > duration_seconds }} - {% else %} - false - {% endif %} - {% else %} - false - {% endif %} + {% if override_last_change and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} + {% set elapsed = (now() - override_last_change).total_seconds() %} + {{ elapsed > override_reset_duration_seconds }} {% else %} false {% endif %} @@ -515,13 +513,7 @@ actions: id: - PERIODIC_CHECK - condition: template - value_template: > - {% if override_reset_duration is mapping %} - {% set duration_seconds = (override_reset_duration.hours | default(0) | int) * 3600 + (override_reset_duration.minutes | default(0) | int) * 60 + (override_reset_duration.seconds | default(0) | int) %} - {% else %} - {% set duration_seconds = 0 %} - {% endif %} - {{ duration_seconds > 0 }} + value_template: "{{ override_reset_duration_seconds > 0 }}" - condition: template value_template: "{{ is_manual_override }}" - condition: template -- 2.49.1 From a170d7d0e2bd386022a877061cc2b80bd9932b8c Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Tue, 6 Jan 2026 18:57:47 +0100 Subject: [PATCH 08/31] extract remote_temperature_last_change --- Climate/bosch_bth-ra_control.yaml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 3a9eb71..2536d43 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -315,6 +315,12 @@ variables: {% else %} {{ none }} {% endif %} + remote_temperature_last_change: > + {% if remote_temperature_entity and remote_temperature_entity in states %} + {{ states[remote_temperature_entity].last_changed }} + {% else %} + {{ none }} + {% endif %} override_duration_exceeded: > {% if override_last_change and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} {% set elapsed = (now() - override_last_change).total_seconds() %} @@ -494,10 +500,10 @@ actions: {{ temperature_sensor is defined and states(temperature_sensor) | is_number }} - condition: template value_template: > - {{ remote_temperature_entity and remote_temperature_entity in states }} + {{ remote_temperature_last_change != none }} - condition: template value_template: > - {{ (now() - states[remote_temperature_entity].last_changed).total_seconds() > 1499 }} + {{ (now() - remote_temperature_last_change).total_seconds() > 1499 }} sequence: - service: number.set_value data: -- 2.49.1 From 413eea13e08cc325600953aa778c76f0c68aabbd Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Tue, 6 Jan 2026 19:00:42 +0100 Subject: [PATCH 09/31] extract current_remote_temperature --- Climate/bosch_bth-ra_control.yaml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 2536d43..232efb1 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -210,6 +210,12 @@ variables: {% endif %} {% endfor %} {{ remote_temperature_entity_id.id }} + current_remote_temperature: > + {% if remote_temperature_entity and remote_temperature_entity in states %} + {{ states(remote_temperature_entity) | float(0) }} + {% else %} + {{ 0 }} + {% endif %} window_detection_entity: > {% set entities = device_entities(device_id(trv)) %} {% set window_detection_entity_id = namespace(id='') %} @@ -272,15 +278,14 @@ variables: false {% endif %} is_sensor_sync_needed: > - {% set current_remote_temp = states(remote_temperature_entity) | float(0) %} {% set new_sensor_temp = states(temperature_sensor) | float(0) %} {% set target_temp = state_attr(trv, 'temperature') | float(0) %} - {% set diff = (new_sensor_temp - current_remote_temp) | abs %} + {% set diff = (new_sensor_temp - current_remote_temperature) | abs %} {% if diff >= sensor_sync_threshold %} true - {% elif new_sensor_temp < target_temp and current_remote_temp >= target_temp %} + {% elif new_sensor_temp < target_temp and current_remote_temperature >= target_temp %} true - {% elif new_sensor_temp > target_temp and current_remote_temp <= target_temp %} + {% elif new_sensor_temp > target_temp and current_remote_temperature <= target_temp %} true {% else %} false -- 2.49.1 From 1d0b0ff241fc321eff0aed934fc66ae39db43a3c Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Tue, 6 Jan 2026 19:17:44 +0100 Subject: [PATCH 10/31] fix state check --- Climate/bosch_bth-ra_control.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 232efb1..1178f3b 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -211,11 +211,17 @@ variables: {% endfor %} {{ remote_temperature_entity_id.id }} current_remote_temperature: > - {% if remote_temperature_entity and remote_temperature_entity in states %} + {% if remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none]%} {{ states(remote_temperature_entity) | float(0) }} {% else %} {{ 0 }} {% endif %} + remote_temperature_last_change: > + {% if remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none] %} + {{ states[remote_temperature_entity].last_changed }} + {% else %} + {{ none }} + {% endif %} window_detection_entity: > {% set entities = device_entities(device_id(trv)) %} {% set window_detection_entity_id = namespace(id='') %} @@ -315,17 +321,11 @@ variables: 0 {% endif %} override_last_change: > - {% if setpoint_change_source_entity and setpoint_change_source_entity in states %} + {% if setpoint_change_source_entity and states(setpoint_change_source_entity) not in ['unknown', 'unavailable', none] %} {{ states[setpoint_change_source_entity].last_updated }} {% else %} {{ none }} {% endif %} - remote_temperature_last_change: > - {% if remote_temperature_entity and remote_temperature_entity in states %} - {{ states[remote_temperature_entity].last_changed }} - {% else %} - {{ none }} - {% endif %} override_duration_exceeded: > {% if override_last_change and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} {% set elapsed = (now() - override_last_change).total_seconds() %} -- 2.49.1 From d58ea02aeb8197419d336550fe57980d6d320fa7 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Tue, 6 Jan 2026 19:22:36 +0100 Subject: [PATCH 11/31] fix datetime usage --- Climate/bosch_bth-ra_control.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 1178f3b..b0d72c3 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -218,7 +218,7 @@ variables: {% endif %} remote_temperature_last_change: > {% if remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none] %} - {{ states[remote_temperature_entity].last_changed }} + {{ as_datetime(states[remote_temperature_entity].last_changed) }} {% else %} {{ none }} {% endif %} @@ -322,12 +322,12 @@ variables: {% endif %} override_last_change: > {% if setpoint_change_source_entity and states(setpoint_change_source_entity) not in ['unknown', 'unavailable', none] %} - {{ states[setpoint_change_source_entity].last_updated }} + {{ as_datetime(states[setpoint_change_source_entity].last_updated) }} {% else %} {{ none }} {% endif %} override_duration_exceeded: > - {% if override_last_change and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} + {% if override_last_change != none and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} {% set elapsed = (now() - override_last_change).total_seconds() %} {{ elapsed > override_reset_duration_seconds }} {% else %} -- 2.49.1 From 2fdf78ac7584bdcfd9e0b2807dbc2df335a2aa33 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Tue, 6 Jan 2026 19:30:53 +0100 Subject: [PATCH 12/31] try to fix error --- Climate/bosch_bth-ra_control.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index b0d72c3..84fe7ec 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -327,8 +327,9 @@ variables: {{ none }} {% endif %} override_duration_exceeded: > - {% if override_last_change != none and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} - {% set elapsed = (now() - override_last_change).total_seconds() %} + {% set last_change = override_last_change %} + {% if last_change != none and last_change is not string and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} + {% set elapsed = (now() - last_change).total_seconds() %} {{ elapsed > override_reset_duration_seconds }} {% else %} false @@ -505,7 +506,7 @@ actions: {{ temperature_sensor is defined and states(temperature_sensor) | is_number }} - condition: template value_template: > - {{ remote_temperature_last_change != none }} + {{ remote_temperature_last_change != none and remote_temperature_last_change is not string }} - condition: template value_template: > {{ (now() - remote_temperature_last_change).total_seconds() > 1499 }} -- 2.49.1 From aee08c12cc6b9858efebb9e4e6d77dcbfb5dd915 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 18:18:52 +0100 Subject: [PATCH 13/31] refactoring --- Climate/bosch_bth-ra_control.yaml | 43 ++++++++----------------------- 1 file changed, 11 insertions(+), 32 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 84fe7ec..a0edd26 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -211,17 +211,11 @@ variables: {% endfor %} {{ remote_temperature_entity_id.id }} current_remote_temperature: > - {% if remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none]%} - {{ states(remote_temperature_entity) | float(0) }} - {% else %} - {{ 0 }} - {% endif %} + {{ states(remote_temperature_entity) | float(0) if remote_temperature_entity and + states(remote_temperature_entity) not in ['unknown', 'unavailable', none] else 0 }} remote_temperature_last_change: > - {% if remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none] %} - {{ as_datetime(states[remote_temperature_entity].last_changed) }} - {% else %} - {{ none }} - {% endif %} + {{ as_datetime(states[remote_temperature_entity].last_changed) if remote_temperature_entity and + states(remote_temperature_entity) not in ['unknown', 'unavailable', none] else none }} window_detection_entity: > {% set entities = device_entities(device_id(trv)) %} {% set window_detection_entity_id = namespace(id='') %} @@ -275,14 +269,7 @@ variables: 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 diff | abs >= 0.4 %} - true - {% else %} - false - {% endif %} + {{ (safe_temperature | float(0) - state_attr(trv, 'temperature') | float(0)) | abs >= 0.4 }} is_sensor_sync_needed: > {% set new_sensor_temp = states(temperature_sensor) | float(0) %} {% set target_temp = state_attr(trv, 'temperature') | float(0) %} @@ -310,22 +297,14 @@ variables: false {% endif %} is_manual_override: > - {% set current_temp = state_attr(trv, 'temperature') | float(0) %} - {% set target_temp = safe_temperature | float(0) %} - {% set diff = (current_temp - target_temp) | abs %} - {{ diff >= 0.4 }} + {{ (state_attr(trv, 'temperature') | float(0) - safe_temperature | float(0)) | abs >= 0.4 }} override_reset_duration_seconds: > - {% if override_reset_duration is mapping %} - {{ (override_reset_duration.hours | default(0) | int) * 3600 + (override_reset_duration.minutes | default(0) | int) * 60 + (override_reset_duration.seconds | default(0) | int) }} - {% else %} - 0 - {% endif %} + {{ (override_reset_duration.hours | default(0) | int) * 3600 + + (override_reset_duration.minutes | default(0) | int) * 60 + + (override_reset_duration.seconds | default(0) | int) if override_reset_duration is mapping else 0 }} override_last_change: > - {% if setpoint_change_source_entity and states(setpoint_change_source_entity) not in ['unknown', 'unavailable', none] %} - {{ as_datetime(states[setpoint_change_source_entity].last_updated) }} - {% else %} - {{ none }} - {% endif %} + {{ as_datetime(states[setpoint_change_source_entity].last_updated) if setpoint_change_source_entity and + states(setpoint_change_source_entity) not in ['unknown', 'unavailable', none] else none }} override_duration_exceeded: > {% set last_change = override_last_change %} {% if last_change != none and last_change is not string and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} -- 2.49.1 From 5895c7c9dcac1ff84044d863ff410e5e51747503 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 18:35:26 +0100 Subject: [PATCH 14/31] try to fix reset of temp --- Climate/bosch_bth-ra_control.yaml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index a0edd26..8f0f9a6 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -303,13 +303,17 @@ variables: (override_reset_duration.minutes | default(0) | int) * 60 + (override_reset_duration.seconds | default(0) | int) if override_reset_duration is mapping else 0 }} override_last_change: > - {{ as_datetime(states[setpoint_change_source_entity].last_updated) if setpoint_change_source_entity and + {{ states[setpoint_change_source_entity].last_updated if setpoint_change_source_entity and states(setpoint_change_source_entity) not in ['unknown', 'unavailable', none] else none }} override_duration_exceeded: > - {% set last_change = override_last_change %} - {% if last_change != none and last_change is not string and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} - {% set elapsed = (now() - last_change).total_seconds() %} - {{ elapsed > override_reset_duration_seconds }} + {% if override_last_change != none and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} + {% set last_change = as_datetime(override_last_change) %} + {% if last_change != none %} + {% set elapsed = (now() - last_change).total_seconds() %} + {{ elapsed > override_reset_duration_seconds }} + {% else %} + false + {% endif %} {% else %} false {% endif %} -- 2.49.1 From 3ff5db1cbf4a13a88a32d068aac356d1e31e9bb4 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 19:23:53 +0100 Subject: [PATCH 15/31] refactoring --- Climate/bosch_bth-ra_control.yaml | 62 +++++-------------------------- 1 file changed, 9 insertions(+), 53 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 8f0f9a6..a24ad8b 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -196,20 +196,9 @@ variables: alarm_control_panel: !input alarm_control_panel override_reset_duration: !input override_reset_duration is_heating_period: > - {% if heating_period_switch is none or heating_period_switch == '' %} - true - {% else %} - {{ is_state(heating_period_switch, 'on') }} - {% endif %} + {{ heating_period_switch in [none, ''] or is_state(heating_period_switch, 'on') }} remote_temperature_entity: > - {% set entities = device_entities(device_id(trv)) %} - {% set remote_temperature_entity_id = namespace(id='') %} - {% for entity in entities %} - {% if 'remote_temperature' in entity %} - {% set remote_temperature_entity_id.id = entity %} - {% endif %} - {% endfor %} - {{ remote_temperature_entity_id.id }} + {{ device_entities(device_id(trv)) | select('search', 'remote_temperature') | list | first | default('') }} current_remote_temperature: > {{ states(remote_temperature_entity) | float(0) if remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none] else 0 }} @@ -217,23 +206,9 @@ variables: {{ as_datetime(states[remote_temperature_entity].last_changed) if remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none] else none }} window_detection_entity: > - {% set entities = device_entities(device_id(trv)) %} - {% set window_detection_entity_id = namespace(id='') %} - {% for entity in entities %} - {% if 'window_detection' in entity %} - {% set window_detection_entity_id.id = entity %} - {% endif %} - {% endfor %} - {{ window_detection_entity_id.id }} + {{ device_entities(device_id(trv)) | select('search', 'window_detection') | list | first | default('') }} setpoint_change_source_entity: > - {% set entities = device_entities(device_id(trv)) %} - {% set setpoint_change_source_entity_id = namespace(id='') %} - {% for entity in entities %} - {% if 'setpoint_change_source' in entity %} - {% set setpoint_change_source_entity_id.id = entity %} - {% endif %} - {% endfor %} - {{ setpoint_change_source_entity_id.id }} + {{ device_entities(device_id(trv)) | select('search', 'setpoint_change_source') | list | first | default('') }} scheduled_temperature: > {% set ns = namespace(current_temperature = none) %} {% set selected_friendly_name = states(active_scheduler_selector) %} @@ -250,22 +225,9 @@ variables: {% endif %} {{ ns.current_temperature }} target_temperature: > - {% if alarm_control_panel and is_state(alarm_control_panel, 'armed_away') %} - {{ away_temperature }} - {% elif scheduled_temperature is not none %} - {{ scheduled_temperature }} - {% else %} - {{ away_temperature }} - {% endif %} + {{ scheduled_temperature if scheduled_temperature != none and not (alarm_control_panel and is_state(alarm_control_panel, 'armed_away')) else away_temperature }} safe_temperature: > - {% set temp = target_temperature | float(18) %} - {% if temp < min_temperature %} - {{ min_temperature }} - {% elif temp > max_temperature %} - {{ max_temperature }} - {% else %} - {{ temp }} - {% endif %} + {{ [min_temperature, [max_temperature, target_temperature | float(18)] | min] | max }} is_valid_temperature: > {{ safe_temperature is not none and safe_temperature | is_number }} is_temperature_change_needed: > @@ -284,15 +246,9 @@ variables: 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 }} + {% set selected = states(active_scheduler_selector) %} + {{ selected not in ['unknown', '', none] and + selected not in radiator_schedules | map(attribute='attributes.friendly_name') | list }} {% else %} false {% endif %} -- 2.49.1 From 0bb4ced2993c8efb6464516c9592470cecc5acef Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 19:25:07 +0100 Subject: [PATCH 16/31] fix after refactoring --- Climate/bosch_bth-ra_control.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index a24ad8b..c74ed84 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -249,9 +249,6 @@ variables: {% set selected = states(active_scheduler_selector) %} {{ selected not in ['unknown', '', none] and selected not in radiator_schedules | map(attribute='attributes.friendly_name') | list }} - {% else %} - false - {% endif %} is_manual_override: > {{ (state_attr(trv, 'temperature') | float(0) - safe_temperature | float(0)) | abs >= 0.4 }} override_reset_duration_seconds: > -- 2.49.1 From e72365df0a32a4d443fe66018cfcf99c5c5e29e4 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 19:32:08 +0100 Subject: [PATCH 17/31] fix again --- Climate/bosch_bth-ra_control.yaml | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index c74ed84..f34d583 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -203,7 +203,7 @@ variables: {{ states(remote_temperature_entity) | float(0) if remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none] else 0 }} remote_temperature_last_change: > - {{ as_datetime(states[remote_temperature_entity].last_changed) if remote_temperature_entity and + {{ states[remote_temperature_entity].last_changed if remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none] else none }} window_detection_entity: > {{ device_entities(device_id(trv)) | select('search', 'window_detection') | list | first | default('') }} @@ -247,8 +247,17 @@ variables: {% endif %} scheduler_mismatch: > {% set selected = states(active_scheduler_selector) %} - {{ selected not in ['unknown', '', none] and - selected not in radiator_schedules | map(attribute='attributes.friendly_name') | list }} + {% if selected not in ['unknown', '', none] %} + {% set found = namespace(value=false) %} + {% for schedule in radiator_schedules %} + {% if state_attr(schedule, 'friendly_name') == selected %} + {% set found.value = true %} + {% endif %} + {% endfor %} + {{ not found.value }} + {% else %} + false + {% endif %} is_manual_override: > {{ (state_attr(trv, 'temperature') | float(0) - safe_temperature | float(0)) | abs >= 0.4 }} override_reset_duration_seconds: > @@ -442,10 +451,12 @@ actions: {{ temperature_sensor is defined and states(temperature_sensor) | is_number }} - condition: template value_template: > - {{ remote_temperature_last_change != none and remote_temperature_last_change is not string }} - - condition: template - value_template: > - {{ (now() - remote_temperature_last_change).total_seconds() > 1499 }} + {% if remote_temperature_last_change != none %} + {% set last_change = as_datetime(remote_temperature_last_change) %} + {{ last_change != none and (now() - last_change).total_seconds() > 1499 }} + {% else %} + false + {% endif %} sequence: - service: number.set_value data: -- 2.49.1 From a797acf3ab04930a82ee503ee9696be2d6a98a8d Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 20:26:29 +0100 Subject: [PATCH 18/31] extract magic numbers --- Climate/bosch_bth-ra_control.yaml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index f34d583..8783484 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -195,6 +195,9 @@ variables: max_temperature: !input max_temperature alarm_control_panel: !input alarm_control_panel override_reset_duration: !input override_reset_duration + # Konstanten + temperature_change_tolerance: 0.4 # °C - Minimale Differenz für Temperaturänderung + sensor_sync_max_age: 1499 # Sekunden (25 Minuten - 1 Sekunde) is_heating_period: > {{ heating_period_switch in [none, ''] or is_state(heating_period_switch, 'on') }} remote_temperature_entity: > @@ -231,7 +234,7 @@ variables: is_valid_temperature: > {{ safe_temperature is not none and safe_temperature | is_number }} is_temperature_change_needed: > - {{ (safe_temperature | float(0) - state_attr(trv, 'temperature') | float(0)) | abs >= 0.4 }} + {{ (safe_temperature | float(0) - state_attr(trv, 'temperature') | float(0)) | abs >= temperature_change_tolerance }} is_sensor_sync_needed: > {% set new_sensor_temp = states(temperature_sensor) | float(0) %} {% set target_temp = state_attr(trv, 'temperature') | float(0) %} @@ -259,7 +262,7 @@ variables: false {% endif %} is_manual_override: > - {{ (state_attr(trv, 'temperature') | float(0) - safe_temperature | float(0)) | abs >= 0.4 }} + {{ (state_attr(trv, 'temperature') | float(0) - safe_temperature | float(0)) | abs >= temperature_change_tolerance }} override_reset_duration_seconds: > {{ (override_reset_duration.hours | default(0) | int) * 3600 + (override_reset_duration.minutes | default(0) | int) * 60 + @@ -453,7 +456,7 @@ actions: value_template: > {% if remote_temperature_last_change != none %} {% set last_change = as_datetime(remote_temperature_last_change) %} - {{ last_change != none and (now() - last_change).total_seconds() > 1499 }} + {{ last_change != none and (now() - last_change).total_seconds() > sensor_sync_max_age }} {% else %} false {% endif %} -- 2.49.1 From 5dd43bbd89b1aab0b7605b6e20fe1c2315763ebe Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 20:30:10 +0100 Subject: [PATCH 19/31] reduce duplications --- Climate/bosch_bth-ra_control.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 8783484..32e7d7a 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -195,19 +195,20 @@ variables: max_temperature: !input max_temperature alarm_control_panel: !input alarm_control_panel override_reset_duration: !input override_reset_duration - # Konstanten - temperature_change_tolerance: 0.4 # °C - Minimale Differenz für Temperaturänderung + temperature_change_tolerance: 0.4 # °C sensor_sync_max_age: 1499 # Sekunden (25 Minuten - 1 Sekunde) is_heating_period: > {{ heating_period_switch in [none, ''] or is_state(heating_period_switch, 'on') }} remote_temperature_entity: > {{ device_entities(device_id(trv)) | select('search', 'remote_temperature') | list | first | default('') }} + remote_temperature_entity_valid: > + {{ remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none] }} + setpoint_change_source_entity_valid: > + {{ setpoint_change_source_entity and states(setpoint_change_source_entity) not in ['unknown', 'unavailable', none] }} current_remote_temperature: > - {{ states(remote_temperature_entity) | float(0) if remote_temperature_entity and - states(remote_temperature_entity) not in ['unknown', 'unavailable', none] else 0 }} + {{ states(remote_temperature_entity) | float(0) if remote_temperature_entity_valid else 0 }} remote_temperature_last_change: > - {{ states[remote_temperature_entity].last_changed if remote_temperature_entity and - states(remote_temperature_entity) not in ['unknown', 'unavailable', none] else none }} + {{ states[remote_temperature_entity].last_changed if remote_temperature_entity_valid else none }} window_detection_entity: > {{ device_entities(device_id(trv)) | select('search', 'window_detection') | list | first | default('') }} setpoint_change_source_entity: > @@ -268,8 +269,7 @@ variables: (override_reset_duration.minutes | default(0) | int) * 60 + (override_reset_duration.seconds | default(0) | int) if override_reset_duration is mapping else 0 }} override_last_change: > - {{ states[setpoint_change_source_entity].last_updated if setpoint_change_source_entity and - states(setpoint_change_source_entity) not in ['unknown', 'unavailable', none] else none }} + {{ states[setpoint_change_source_entity].last_updated if setpoint_change_source_entity_valid else none }} override_duration_exceeded: > {% if override_last_change != none and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} {% set last_change = as_datetime(override_last_change) %} -- 2.49.1 From a2343237c3372582314f17b0dd7e7e7a69874a18 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 20:35:46 +0100 Subject: [PATCH 20/31] fail fast for complext calculation --- Climate/bosch_bth-ra_control.yaml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 32e7d7a..514c902 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -271,16 +271,13 @@ variables: override_last_change: > {{ states[setpoint_change_source_entity].last_updated if setpoint_change_source_entity_valid else none }} override_duration_exceeded: > - {% if override_last_change != none and override_reset_duration_seconds > 0 and setpoint_change_source_entity and states(setpoint_change_source_entity) == 'manual' %} - {% set last_change = as_datetime(override_last_change) %} - {% if last_change != none %} - {% set elapsed = (now() - last_change).total_seconds() %} - {{ elapsed > override_reset_duration_seconds }} - {% else %} - false - {% endif %} - {% else %} + {% if override_last_change == none or override_reset_duration_seconds == 0 %} false + {% elif not setpoint_change_source_entity_valid or states(setpoint_change_source_entity) != 'manual' %} + false + {% else %} + {% set last_change = as_datetime(override_last_change) %} + {{ last_change != none and (now() - last_change).total_seconds() > override_reset_duration_seconds }} {% endif %} triggers: -- 2.49.1 From 69c65c844f8c3d5ca51699d22b91004a0ac46775 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 20:39:30 +0100 Subject: [PATCH 21/31] refactor if-style --- Climate/bosch_bth-ra_control.yaml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 514c902..53bd48c 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -229,7 +229,13 @@ variables: {% endif %} {{ ns.current_temperature }} target_temperature: > - {{ scheduled_temperature if scheduled_temperature != none and not (alarm_control_panel and is_state(alarm_control_panel, 'armed_away')) else away_temperature }} + {% if alarm_control_panel and is_state(alarm_control_panel, 'armed_away') %} + {{ away_temperature }} + {% elif scheduled_temperature != none %} + {{ scheduled_temperature }} + {% else %} + {{ away_temperature }} + {% endif %} safe_temperature: > {{ [min_temperature, [max_temperature, target_temperature | float(18)] | min] | max }} is_valid_temperature: > @@ -240,15 +246,9 @@ variables: {% set new_sensor_temp = states(temperature_sensor) | float(0) %} {% set target_temp = state_attr(trv, 'temperature') | float(0) %} {% set diff = (new_sensor_temp - current_remote_temperature) | abs %} - {% if diff >= sensor_sync_threshold %} - true - {% elif new_sensor_temp < target_temp and current_remote_temperature >= target_temp %} - true - {% elif new_sensor_temp > target_temp and current_remote_temperature <= target_temp %} - true - {% else %} - false - {% endif %} + {{ diff >= sensor_sync_threshold or + (new_sensor_temp < target_temp and current_remote_temperature >= target_temp) or + (new_sensor_temp > target_temp and current_remote_temperature <= target_temp) }} scheduler_mismatch: > {% set selected = states(active_scheduler_selector) %} {% if selected not in ['unknown', '', none] %} -- 2.49.1 From 2e6fcefca4ac6c0e6a87bfe7f3ec6a7309d0586a Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 20:42:46 +0100 Subject: [PATCH 22/31] secure access to entities --- Climate/bosch_bth-ra_control.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 53bd48c..af3e2ff 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -205,6 +205,8 @@ variables: {{ remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none] }} setpoint_change_source_entity_valid: > {{ setpoint_change_source_entity and states(setpoint_change_source_entity) not in ['unknown', 'unavailable', none] }} + window_detection_entity_valid: > + {{ window_detection_entity and window_detection_entity | length > 0 }} current_remote_temperature: > {{ states(remote_temperature_entity) | float(0) if remote_temperature_entity_valid else 0 }} remote_temperature_last_change: > @@ -270,10 +272,12 @@ variables: (override_reset_duration.seconds | default(0) | int) if override_reset_duration is mapping else 0 }} override_last_change: > {{ states[setpoint_change_source_entity].last_updated if setpoint_change_source_entity_valid else none }} + is_setpoint_manual: > + {{ setpoint_change_source_entity_valid and states(setpoint_change_source_entity) == 'manual' }} override_duration_exceeded: > {% if override_last_change == none or override_reset_duration_seconds == 0 %} false - {% elif not setpoint_change_source_entity_valid or states(setpoint_change_source_entity) != 'manual' %} + {% elif not is_setpoint_manual %} false {% else %} {% set last_change = as_datetime(override_last_change) %} -- 2.49.1 From 90f895dbe54e5fefd003a70d0b50e5474987a9bb Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 20:45:18 +0100 Subject: [PATCH 23/31] add comment --- Climate/bosch_bth-ra_control.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index af3e2ff..f5338ce 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -331,6 +331,12 @@ triggers: entity_id: !input active_scheduler_selector id: SCHEDULER_CHANGED +# Hinweis zur Wartbarkeit: climate.set_temperature wird an 4 Stellen verwendet: +# 1. Heizperiode aktiviert - Setzt Temperatur beim Einschalten der Heizung +# 2. Fenster geschlossen - Setzt Temperatur nach Fensterschließung +# 3. Override Reset - Setzt Temperatur zurück nach manuellem Override +# 4. Schedule/Alarm-Änderungen - Setzt Temperatur bei Zeitplan- oder Alarmänderungen +# Standardformat: service: climate.set_temperature | target: !input trv | data: safe_temperature actions: - choose: # Heizperiode Switch Aktionen -- 2.49.1 From e99c3aa96738b61e2a4841295a04305c2c55536d Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 20:46:41 +0100 Subject: [PATCH 24/31] refactoring - naming --- Climate/bosch_bth-ra_control.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index f5338ce..b98766a 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -216,20 +216,20 @@ variables: setpoint_change_source_entity: > {{ device_entities(device_id(trv)) | select('search', 'setpoint_change_source') | list | first | default('') }} scheduled_temperature: > - {% set ns = namespace(current_temperature = none) %} + {% set schedule_finder = namespace(current_temperature = none) %} {% set selected_friendly_name = states(active_scheduler_selector) %} {% if selected_friendly_name is not none and selected_friendly_name != 'unknown' %} {% for schedule in radiator_schedules %} {% if state_attr(schedule, 'friendly_name') == selected_friendly_name and states(schedule) == 'on' %} {% set temp = state_attr(schedule, 'temp') %} {% if temp is not none and temp | is_number %} - {% set ns.current_temperature = temp %} + {% set schedule_finder.current_temperature = temp %} {% break %} {% endif %} {% endif %} {% endfor %} {% endif %} - {{ ns.current_temperature }} + {{ schedule_finder.current_temperature }} target_temperature: > {% if alarm_control_panel and is_state(alarm_control_panel, 'armed_away') %} {{ away_temperature }} @@ -254,13 +254,13 @@ variables: scheduler_mismatch: > {% set selected = states(active_scheduler_selector) %} {% if selected not in ['unknown', '', none] %} - {% set found = namespace(value=false) %} + {% set schedule_found = namespace(value=false) %} {% for schedule in radiator_schedules %} {% if state_attr(schedule, 'friendly_name') == selected %} - {% set found.value = true %} + {% set schedule_found.value = true %} {% endif %} {% endfor %} - {{ not found.value }} + {{ not schedule_found.value }} {% else %} false {% endif %} -- 2.49.1 From 106d6215b156708feeed855a6ea82ef0ac151097 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 20:52:15 +0100 Subject: [PATCH 25/31] restructure variables --- Climate/bosch_bth-ra_control.yaml | 43 +++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index b98766a..c263e99 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -184,6 +184,7 @@ blueprint: enable_day: false variables: + # Input-Variablen trv: !input trv temperature_sensor: !input temperature_sensor sensor_sync_threshold: !input sensor_sync_threshold @@ -195,26 +196,34 @@ variables: max_temperature: !input max_temperature alarm_control_panel: !input alarm_control_panel override_reset_duration: !input override_reset_duration - temperature_change_tolerance: 0.4 # °C - sensor_sync_max_age: 1499 # Sekunden (25 Minuten - 1 Sekunde) - is_heating_period: > - {{ heating_period_switch in [none, ''] or is_state(heating_period_switch, 'on') }} + + # Konstanten + temperature_change_tolerance: 0.4 # °C - Minimale Differenz für Temperaturänderung + sensor_sync_max_age: 1499 # Sekunden (25 Minuten - 1 Sekunde) - Max Alter für Sensor-Sync + + # Entity-Discovery remote_temperature_entity: > {{ device_entities(device_id(trv)) | select('search', 'remote_temperature') | list | first | default('') }} - remote_temperature_entity_valid: > - {{ remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none] }} - setpoint_change_source_entity_valid: > - {{ setpoint_change_source_entity and states(setpoint_change_source_entity) not in ['unknown', 'unavailable', none] }} - window_detection_entity_valid: > - {{ window_detection_entity and window_detection_entity | length > 0 }} - current_remote_temperature: > - {{ states(remote_temperature_entity) | float(0) if remote_temperature_entity_valid else 0 }} - remote_temperature_last_change: > - {{ states[remote_temperature_entity].last_changed if remote_temperature_entity_valid else none }} window_detection_entity: > {{ device_entities(device_id(trv)) | select('search', 'window_detection') | list | first | default('') }} setpoint_change_source_entity: > {{ device_entities(device_id(trv)) | select('search', 'setpoint_change_source') | list | first | default('') }} + + # Entity-Validierung + remote_temperature_entity_valid: > + {{ remote_temperature_entity and states(remote_temperature_entity) not in ['unknown', 'unavailable', none] }} + window_detection_entity_valid: > + {{ window_detection_entity and window_detection_entity | length > 0 }} + setpoint_change_source_entity_valid: > + {{ setpoint_change_source_entity and states(setpoint_change_source_entity) not in ['unknown', 'unavailable', none] }} + + # Basis-Berechnungen + is_heating_period: > + {{ heating_period_switch in [none, ''] or is_state(heating_period_switch, 'on') }} + current_remote_temperature: > + {{ states(remote_temperature_entity) | float(0) if remote_temperature_entity_valid else 0 }} + remote_temperature_last_change: > + {{ states[remote_temperature_entity].last_changed if remote_temperature_entity_valid else none }} scheduled_temperature: > {% set schedule_finder = namespace(current_temperature = none) %} {% set selected_friendly_name = states(active_scheduler_selector) %} @@ -230,6 +239,8 @@ variables: {% endfor %} {% endif %} {{ schedule_finder.current_temperature }} + + # Temperatur-Berechnungen target_temperature: > {% if alarm_control_panel and is_state(alarm_control_panel, 'armed_away') %} {{ away_temperature }} @@ -240,6 +251,8 @@ variables: {% endif %} safe_temperature: > {{ [min_temperature, [max_temperature, target_temperature | float(18)] | min] | max }} + + # Status-Prüfungen is_valid_temperature: > {{ safe_temperature is not none and safe_temperature | is_number }} is_temperature_change_needed: > @@ -266,6 +279,8 @@ variables: {% endif %} is_manual_override: > {{ (state_attr(trv, 'temperature') | float(0) - safe_temperature | float(0)) | abs >= temperature_change_tolerance }} + + # Override Reset Berechnungen override_reset_duration_seconds: > {{ (override_reset_duration.hours | default(0) | int) * 3600 + (override_reset_duration.minutes | default(0) | int) * 60 + -- 2.49.1 From 1bac8c5e4c40c75860c470112a408c751659cf34 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Wed, 7 Jan 2026 20:59:43 +0100 Subject: [PATCH 26/31] rename trigger ids --- Climate/bosch_bth-ra_control.yaml | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index c263e99..cd72369 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -306,21 +306,21 @@ triggers: from: "off" to: "on" for: !input window_delay_open - id: FENSTER_OPEN + id: WINDOW_OPENED - platform: state entity_id: - !input window_sensor from: "on" to: "off" for: !input window_delay_close - id: FENSTER_CLOSED + id: WINDOW_CLOSED - platform: time_pattern # Periodische Überprüfung alle 5 Minuten (Temperatursynchronisation, Override-Check) minutes: "/5" id: PERIODIC_CHECK - platform: state entity_id: !input temperature_sensor - id: TEMP_CHANGED + id: SENSOR_TEMPERATURE_CHANGED - platform: state entity_id: !input alarm_control_panel to: "armed_away" @@ -329,22 +329,22 @@ triggers: entity_id: !input alarm_control_panel from: "armed_away" to: "disarmed" - id: ALARM_DISARMED_AWAY + id: ALARM_DISARMED - platform: state entity_id: !input heating_period_switch to: "on" - id: HEATING_PERIOD_ON + id: HEATING_PERIOD_STARTED - platform: state entity_id: !input heating_period_switch to: "off" - id: HEATING_PERIOD_OFF + id: HEATING_PERIOD_ENDED - platform: state entity_id: !input radiator_schedules attribute: temp - id: SCHEDULE_TEMP_CHANGED + id: SCHEDULE_TEMPERATURE_CHANGED - platform: state entity_id: !input active_scheduler_selector - id: SCHEDULER_CHANGED + id: SCHEDULE_SELECTOR_CHANGED # Hinweis zur Wartbarkeit: climate.set_temperature wird an 4 Stellen verwendet: # 1. Heizperiode aktiviert - Setzt Temperatur beim Einschalten der Heizung @@ -358,14 +358,14 @@ actions: - conditions: - condition: trigger id: - - HEATING_PERIOD_ON - - HEATING_PERIOD_OFF + - HEATING_PERIOD_STARTED + - HEATING_PERIOD_ENDED sequence: - choose: - conditions: - condition: trigger id: - - HEATING_PERIOD_ON + - HEATING_PERIOD_STARTED sequence: - service: climate.set_hvac_mode target: @@ -394,7 +394,7 @@ actions: - conditions: - condition: trigger id: - - HEATING_PERIOD_OFF + - HEATING_PERIOD_ENDED sequence: - service: switch.turn_off target: @@ -417,7 +417,7 @@ actions: - conditions: - condition: trigger id: - - FENSTER_OPEN + - WINDOW_OPENED - condition: template value_template: > {{ is_state(window_detection_entity, 'off') }} @@ -429,7 +429,7 @@ actions: - conditions: - condition: trigger id: - - FENSTER_CLOSED + - WINDOW_CLOSED - condition: template value_template: > {{ is_state(window_detection_entity, 'on') }} @@ -454,7 +454,7 @@ actions: - conditions: - condition: trigger id: - - TEMP_CHANGED + - SENSOR_TEMPERATURE_CHANGED - condition: template value_template: > {{ temperature_sensor is defined and states(temperature_sensor) | is_number }} @@ -516,12 +516,12 @@ actions: - condition: trigger id: - ALARM_ARMED_AWAY - - ALARM_DISARMED_AWAY - - SCHEDULE_TEMP_CHANGED - - SCHEDULER_CHANGED + - ALARM_DISARMED + - SCHEDULE_TEMPERATURE_CHANGED + - SCHEDULE_SELECTOR_CHANGED - condition: template value_template: > - {% if trigger.id == 'SCHEDULE_TEMP_CHANGED' %} + {% if trigger.id == 'SCHEDULE_TEMPERATURE_CHANGED' %} {% set selected_friendly_name = states(active_scheduler_selector) %} {{ state_attr(trigger.entity_id, 'friendly_name') == selected_friendly_name }} {% else %} -- 2.49.1 From 7dd83511a3192d563444935123969cfa19aeb74f Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Thu, 8 Jan 2026 19:08:38 +0100 Subject: [PATCH 27/31] simplify scheduled_temperature --- Climate/bosch_bth-ra_control.yaml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index cd72369..82267fc 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -225,20 +225,16 @@ variables: remote_temperature_last_change: > {{ states[remote_temperature_entity].last_changed if remote_temperature_entity_valid else none }} scheduled_temperature: > - {% set schedule_finder = namespace(current_temperature = none) %} - {% set selected_friendly_name = states(active_scheduler_selector) %} - {% if selected_friendly_name is not none and selected_friendly_name != 'unknown' %} - {% for schedule in radiator_schedules %} - {% if state_attr(schedule, 'friendly_name') == selected_friendly_name and states(schedule) == 'on' %} - {% set temp = state_attr(schedule, 'temp') %} - {% if temp is not none and temp | is_number %} - {% set schedule_finder.current_temperature = temp %} - {% break %} - {% endif %} + {% set selected = states(active_scheduler_selector) %} + {% if selected not in [none, 'unknown', ''] %} + {% for schedule in radiator_schedules if state_attr(schedule, 'friendly_name') == selected and is_state(schedule, 'on') %} + {% set temp = state_attr(schedule, 'temp') %} + {% if temp is not none and temp | is_number %} + {{ temp }} + {% break %} {% endif %} {% endfor %} {% endif %} - {{ schedule_finder.current_temperature }} # Temperatur-Berechnungen target_temperature: > -- 2.49.1 From 2c838a85a185e028f4c49a883cfa1630474b492d Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Thu, 8 Jan 2026 19:14:07 +0100 Subject: [PATCH 28/31] add comments --- Climate/bosch_bth-ra_control.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 82267fc..3295de2 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -237,6 +237,7 @@ variables: {% endif %} # Temperatur-Berechnungen + # Priorität: 1. Alarm armed_away → away_temperature, 2. Aktiver Zeitplan → scheduled_temperature, 3. Fallback → away_temperature target_temperature: > {% if alarm_control_panel and is_state(alarm_control_panel, 'armed_away') %} {{ away_temperature }} @@ -245,6 +246,7 @@ variables: {% else %} {{ away_temperature }} {% endif %} + # Begrenzt target_temperature auf den Bereich [min_temperature, max_temperature] (Clamping) safe_temperature: > {{ [min_temperature, [max_temperature, target_temperature | float(18)] | min] | max }} @@ -253,6 +255,7 @@ variables: {{ safe_temperature is not none and safe_temperature | is_number }} is_temperature_change_needed: > {{ (safe_temperature | float(0) - state_attr(trv, 'temperature') | float(0)) | abs >= temperature_change_tolerance }} + # Synchronisation nötig wenn: 1) Differenz > Schwelle, 2) Sensor kreuzt Soll-Temp von unten, 3) Sensor kreuzt Soll-Temp von oben is_sensor_sync_needed: > {% set new_sensor_temp = states(temperature_sensor) | float(0) %} {% set target_temp = state_attr(trv, 'temperature') | float(0) %} @@ -277,6 +280,7 @@ variables: {{ (state_attr(trv, 'temperature') | float(0) - safe_temperature | float(0)) | abs >= temperature_change_tolerance }} # Override Reset Berechnungen + # Konvertiert duration-Dictionary {hours, minutes, seconds} in Gesamtsekunden override_reset_duration_seconds: > {{ (override_reset_duration.hours | default(0) | int) * 3600 + (override_reset_duration.minutes | default(0) | int) * 60 + @@ -285,6 +289,7 @@ variables: {{ states[setpoint_change_source_entity].last_updated if setpoint_change_source_entity_valid else none }} is_setpoint_manual: > {{ setpoint_change_source_entity_valid and states(setpoint_change_source_entity) == 'manual' }} + # Early exits: 1) Keine Änderung/Timeout=0 → false, 2) Nicht manuell → false, 3) Berechne Zeitdifferenz override_duration_exceeded: > {% if override_last_change == none or override_reset_duration_seconds == 0 %} false -- 2.49.1 From 2eba16f2e7eaf5abbc380162060526b109f9faba Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Thu, 8 Jan 2026 19:19:32 +0100 Subject: [PATCH 29/31] Add description to inputs --- Climate/bosch_bth-ra_control.yaml | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 3295de2..47fc492 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -6,6 +6,11 @@ blueprint: min_version: "2024.6.0" description: > Eine Automation zur automatischen Steuerung eines Bosch TRV Heizkörperthermostats. + + **Temperatur-Prioritätslogik:** + 1. Alarm armed_away → Abwesenheitstemperatur + 2. Aktiver Zeitplan → Temperatur aus Schedule + 3. Fallback → Abwesenheitstemperatur domain: automation author: Me input: @@ -27,7 +32,14 @@ blueprint: device_class: temperature sensor_sync_threshold: name: Sensor-Synchronisations-Schwellenwert - description: Minimale Temperaturdifferenz in °C, um eine Sensor-Synchronisation auszulösen (Default = 0.5°C). Temperatur wird weiterhin spätestens nach 25 Minuten synchronisiert. + description: > + Minimale Temperaturdifferenz in °C, um eine Sensor-Synchronisation auszulösen (Default = 0.5°C). + + **Synchronisation erfolgt bei:** + 1. Differenz zwischen Sensor und TRV ≥ Schwellenwert + 2. Sensor kreuzt Solltemperatur von unten (verhindert zu spätes Aufheizen) + 3. Sensor kreuzt Solltemperatur von oben (verhindert Überhitzung) + 4. Spätestens nach 25 Minuten ohne Änderung default: 0.5 selector: number: @@ -46,7 +58,9 @@ blueprint: - domain: input_boolean min_temperature: name: Minimale Temperatur - description: Minimale erlaubte Solltemperatur als Sicherheitsgrenze (Default = 15°C) + description: > + Minimale erlaubte Solltemperatur als Sicherheitsgrenze (Default = 15°C). + Alle berechneten Temperaturen werden auf diesen Minimalwert begrenzt (Clamping). default: 15 selector: number: @@ -57,7 +71,9 @@ blueprint: step: 0.5 max_temperature: name: Maximale Temperatur - description: Maximale erlaubte Solltemperatur als Sicherheitsgrenze (Default = 28°C) + description: > + Maximale erlaubte Solltemperatur als Sicherheitsgrenze (Default = 23°C). + Alle berechneten Temperaturen werden auf diesen Maximalwert begrenzt (Clamping). default: 23 selector: number: @@ -146,7 +162,12 @@ blueprint: - domain: alarm_control_panel away_temperature: name: Abwesenheitstemperatur - description: Temperatur die eingestellt wird, wenn der Alarm im Abwesendmodus ist (Default = 18°C) + description: > + Temperatur die verwendet wird, wenn der Alarm im Abwesendmodus ist oder kein Zeitplan aktiv ist (Default = 18°C). + + **Verwendung:** + - Primär: Alarm Control Panel im Modus 'armed_away' (höchste Priorität) + - Fallback: Wenn kein aktiver Zeitplan eine Temperatur liefert default: 18 selector: number: -- 2.49.1 From b8839bac3ac151edc0243e93eb40f9acb3306810 Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Thu, 15 Jan 2026 14:16:36 +0100 Subject: [PATCH 30/31] wait between two signals to same trv --- Climate/bosch_bth-ra_control.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 47fc492..9e3757c 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -459,6 +459,8 @@ actions: - service: switch.turn_off target: entity_id: "{{ window_detection_entity }}" + - delay: + minutes: 1 - if: - condition: template value_template: > -- 2.49.1 From c6301b9f76b81a684bfa148c42d3ae2d90fe92ce Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Thu, 15 Jan 2026 14:21:03 +0100 Subject: [PATCH 31/31] do not set target temp when windows is open --- Climate/bosch_bth-ra_control.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Climate/bosch_bth-ra_control.yaml b/Climate/bosch_bth-ra_control.yaml index 9e3757c..0a31687 100644 --- a/Climate/bosch_bth-ra_control.yaml +++ b/Climate/bosch_bth-ra_control.yaml @@ -405,7 +405,7 @@ actions: - if: - condition: template value_template: > - {{ is_valid_temperature and is_temperature_change_needed }} + {{ is_valid_temperature and is_temperature_change_needed and is_state(window_detection_entity, 'off') }} then: - service: climate.set_temperature target: @@ -555,7 +555,7 @@ actions: - if: - condition: template value_template: > - {{ is_valid_temperature and is_temperature_change_needed }} + {{ is_valid_temperature and is_temperature_change_needed and is_state(window_detection_entity, 'off') }} then: - service: climate.set_temperature target: -- 2.49.1