From f719294bcfe58bc162a5af6787443612b10c37dd Mon Sep 17 00:00:00 2001 From: Pierre Eisenbrandt Date: Sun, 4 Jan 2026 18:50:40 +0100 Subject: [PATCH] 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: