mode: single blueprint: name: Bosch BTH-RA Radiator Control homeassistant: min_version: "2024.6.0" description: > Eine Automation zur automatischen Steuerung eines Bosch TRV Heizkörperthermostats. domain: automation author: Me input: trv: name: Thermostat description: Thermostat muss ein Bosch BTH-RA sein selector: entity: multiple: false filter: - domain: climate temperature_sensor: name: Temperatursensor selector: entity: multiple: false filter: - domain: sensor device_class: temperature heating_period_switch: name: Heizperiode Switch description: Optional - Input Boolean der angibt ob Heizperiode aktiv ist. Wenn nicht gesetzt, ist die Heizperiode immer aktiv. selector: entity: multiple: false filter: - domain: input_boolean window_section: name: Fenster-/Türsensor Konfiguration description: Konfiguration für den Fenster-/Türsensor. collapsed: false input: window_sensor: name: Fenster-/Türsensor (oder Gruppe) selector: entity: multiple: false filter: - domain: binary_sensor window_delay_open: name: Fenster-/Türsensor Verzögerung description: Zeit die das Fenster offen bleiben muss, um die den Radiator in den "Fenster offen"-Modus zu versetzen (Default = 30s) default: 30 selector: number: mode: box min: 0.0 max: 3600.0 unit_of_measurement: seconds step: 1.0 window_delay_close: name: Fenster-/Türsensor Verzögerung description: Zeit die das Fenster geschlossen bleiben muss, um die den Radiator in den "Fenster geschlossen"-Modus zu versetzen (Default = 5s) default: 5 selector: number: mode: box min: 0.0 max: 3600.0 unit_of_measurement: seconds step: 1.0 schedule_section: name: Heizplan Konfiguration description: Konfiguration der Heizpläne die für den Radiator berücksichtigt werden sollen collapsed: false input: radiator_schedules: name: Heizpläne description: Alle Heizpläne die für den Radiator berücksichtigt werden sollen. Sind mehrere Schedules aktiv, wird der erste mit einer gültigen Temperatur verwendet. default: [] selector: entity: multiple: true filter: - domain: schedule active_scheduler_selector: name: Aktiver Scheduler Selector description: > Input Select der den aktuell aktiven Scheduler enthält (per Friendly Name). Wird verwendet um zu bestimmen welcher Schedule für die Temperatur verwendet werden soll. **WICHTIG**: Die Options müssen die Friendly Names der Scheduler aus der Scheduler-Liste enthalten. Beispiel: Wird typischerweise vom "Heizplan Selector" Blueprint gesteuert. selector: entity: filter: - domain: input_select away_section: name: Konfiguration für Abwesenheitsmodus description: Konfiguration für das Absenken der Heizung im Abwesenheitsmodus eines Alarmsystems collapsed: false input: alarm_control_panel: name: Alarm Control Panel description: Optional - Alarm Control Panel um Heizung abzusenken, wenn Alarm im Abwesendmodus ist selector: entity: multiple: false filter: - domain: alarm_control_panel away_temperature: name: Abwesenheitstemperatur description: Temperatur die eingestellt wird, wenn der Alarm im Abwesendmodus ist (Default = 18°C) default: 18 selector: number: mode: box min: 15.0 max: 25.0 unit_of_measurement: "°C" step: 0.5 variables: trv: !input trv temperature_sensor: !input temperature_sensor heating_period_switch: !input heating_period_switch radiator_schedules: !input radiator_schedules active_scheduler_selector: !input active_scheduler_selector away_temperature: !input away_temperature alarm_control_panel: !input alarm_control_panel is_heating_period: > {% if heating_period_switch is none or heating_period_switch == '' %} true {% else %} {{ is_state(heating_period_switch, 'on') }} {% endif %} 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 }} 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 }} scheduled_temperature: > {% set ns = 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 %} {% break %} {% endif %} {% endif %} {% endfor %} {% 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 %} triggers: - platform: state entity_id: - !input window_sensor from: "off" to: "on" for: !input window_delay_open id: FENSTER_OPEN - platform: state entity_id: - !input window_sensor from: "on" to: "off" for: !input window_delay_close id: FENSTER_CLOSED - platform: time_pattern # Synce Temperatur alle 5 Minuten (Teiler von 60) minutes: "/5" id: SYNC_TEMPERATURE - platform: state entity_id: !input temperature_sensor id: TEMP_CHANGED - platform: state entity_id: !input alarm_control_panel to: "armed_away" id: ALARM_ARMED_AWAY - platform: state entity_id: !input alarm_control_panel from: "armed_away" to: "disarmed" id: ALARM_DISARMED_AWAY - platform: state entity_id: !input heating_period_switch to: "on" id: HEATING_PERIOD_ON - platform: state entity_id: !input heating_period_switch to: "off" id: HEATING_PERIOD_OFF actions: - choose: # Heizperiode Switch Aktionen - conditions: - condition: trigger id: - HEATING_PERIOD_ON - HEATING_PERIOD_OFF sequence: - choose: - conditions: - condition: trigger id: - HEATING_PERIOD_ON sequence: - service: climate.set_hvac_mode target: entity_id: !input trv data: hvac_mode: "heat" - if: - condition: state entity_id: !input window_sensor state: "on" then: - service: switch.turn_on target: entity_id: "{{ window_detection_entity }}" - if: - condition: template value_template: > {{ target_temperature is not none and target_temperature | is_number }} then: - service: climate.set_temperature target: entity_id: !input trv data: temperature: "{{ target_temperature | float }}" alias: Heizperiode aktiviert - Setze Modus auf heat, synchronisiere Fensterstatus und Solltemperatur - conditions: - condition: trigger id: - HEATING_PERIOD_OFF sequence: - service: switch.turn_off target: entity_id: "{{ window_detection_entity }}" - service: climate.set_hvac_mode target: entity_id: !input trv data: hvac_mode: "off" alias: Heizperiode deaktiviert - Setze Fenster geschlossen und Modus auf off alias: Heizperiode Switch Änderung alias: Heizperiode Switch Aktionen # Alle bestehenden Aktionen nur ausführen wenn Heizperiode aktiv ist - conditions: - condition: template value_template: "{{ is_heating_period }}" sequence: # setze Fenster auf offen/geschlossen - choose: - conditions: - condition: trigger id: - FENSTER_OPEN - condition: template value_template: > {{ is_state(window_detection_entity, 'off') }} sequence: - service: switch.turn_on target: entity_id: "{{ window_detection_entity }}" alias: Setze Fenster auf offen - conditions: - condition: trigger id: - FENSTER_CLOSED - condition: template value_template: > {{ is_state(window_detection_entity, 'on') }} sequence: - service: switch.turn_off target: entity_id: "{{ window_detection_entity }}" - if: - condition: template value_template: > {{ target_temperature is not none and target_temperature | is_number }} then: - service: climate.set_temperature target: entity_id: !input trv data: temperature: "{{ target_temperature | float }}" alias: Setze Fenster auf geschlossen und setze Solltemperatur auf Wert aus Zeitplan (wenn vorhanden) alias: Fensterstatus Änderung # temperature sensor sync - choose: - conditions: - condition: trigger id: - TEMP_CHANGED - condition: template value_template: > {{ temperature_sensor is defined and states(temperature_sensor) | is_number }} sequence: - service: number.set_value data: value: "{{ states(temperature_sensor) | float }}" target: entity_id: "{{ remote_temperature_entity }}" alias: Synchronisiere Temperatur am TRV (bei Änderung) - conditions: - condition: trigger id: - SYNC_TEMPERATURE - condition: template value_template: > {{ temperature_sensor is defined and states(temperature_sensor) | is_number }} - condition: template value_template: > {{ (now() - states[temperature_sensor].last_changed).total_seconds() > 1199 }} 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: Temperatursynchronisation # setze Solltemperatur basierend auf Alarm-Status - choose: - conditions: - condition: trigger id: - ALARM_ARMED_AWAY - ALARM_DISARMED_AWAY sequence: - if: - condition: template value_template: > {{ target_temperature is not none and target_temperature | is_number }} then: - service: climate.set_temperature target: entity_id: !input trv data: temperature: "{{ target_temperature | float }}" alias: Setze Solltemperatur basierend auf Alarm-Status alias: Solltemperatur setzen alias: Aktionen während Heizperiode alias: Hauptsteuerung