Compare commits

...

23 Commits

Author SHA1 Message Date
88ce76ea0e move dev to prod script 2025-12-07 18:06:39 +01:00
ba6f37abab wording 2025-12-07 18:06:39 +01:00
8ab15228fe set default for schedules 2025-12-07 18:06:39 +01:00
10f7e76d20 adjust wording 2025-12-07 18:06:39 +01:00
c3daab46cb only set scheduled temperatur if available 2025-12-07 18:06:39 +01:00
bdefd74801 use value template instead of state 2025-12-07 18:06:39 +01:00
2ce92eb995 set scheduled temp when closing window 2025-12-07 18:06:39 +01:00
5e15b77f75 do net sync temp when ope/closing window 2025-12-07 18:06:39 +01:00
0cb33f18a3 fix type 2025-12-07 18:06:39 +01:00
51f038dc22 re-introduce sections and use entity instead of device 2025-12-07 18:06:39 +01:00
8a9e355d74 remove sections 2025-12-07 18:06:39 +01:00
888ab99b3e remove falsy key 2025-12-07 18:06:39 +01:00
cf027bc4fd another fix 2025-12-07 18:06:39 +01:00
5da0623b72 move section variables above triggers 2025-12-07 18:06:39 +01:00
d9738bec8f another fix 2025-12-07 18:06:39 +01:00
423771ed25 move homeassistant to blueprint section 2025-12-07 18:06:39 +01:00
df2ae53616 fix min_version 2025-12-07 18:06:39 +01:00
1dfcb7ba57 some renaming 2025-12-07 18:06:39 +01:00
d3691a5e4b try to fix error 2025-12-07 18:06:39 +01:00
10d3cb0bda try to fix errors 2025-12-07 18:06:39 +01:00
95a42a8f5f change name of dev blueprint 2025-12-07 18:06:39 +01:00
f0eb9a8c25 refactoring: use sections and use choose instead of if 2025-12-07 18:06:39 +01:00
dfa2d15b27 add schedule component 2025-12-07 18:06:39 +01:00
2 changed files with 296 additions and 190 deletions

View File

@@ -1,12 +1,14 @@
mode: single mode: single
blueprint: blueprint:
name: Bosch BTH-RA Radiator Control name: Bosch BTH-RA Radiator Control - DEV
homeassistant:
min_version: "2024.6.0"
description: > description: >
An automation to set Bosch TRV radiator valve to a desired temperature. Eine Automation zur automatischen Steuerung eines Bosch TRV Heizkörperthermostats.
domain: automation domain: automation
author: Me author: Me
input: input:
radiator_entity: trv:
name: Thermostat name: Thermostat
description: Thermostat muss ein Bosch BTH-RA sein description: Thermostat muss ein Bosch BTH-RA sein
selector: selector:
@@ -14,43 +16,101 @@ blueprint:
multiple: false multiple: false
filter: filter:
- domain: climate - domain: climate
window_sensor: window_section:
name: Fenster-/Türsensor (oder Gruppe) name: Fenster-/Türsensor Konfiguration
selector: description: Konfiguration für den Fenster-/Türsensor.
entity: collapsed: false
multiple: false input:
filter: window_sensor:
- domain: binary_sensor name: Fenster-/Türsensor (oder Gruppe)
window_delay_open: selector:
name: Fenster-/Türsensor Verzögerung entity:
description: Zeit die das Fenster offen bleiben muss, um die den Radiator in den "Fenster offen"-Modus zu versetzen (Default = 30s) multiple: false
default: 30 filter:
selector: - domain: binary_sensor
number: window_delay_open:
mode: box name: Fenster-/Türsensor Verzögerung
min: 0.0 description: Zeit die das Fenster offen bleiben muss, um die den Radiator in den "Fenster offen"-Modus zu versetzen (Default = 30s)
max: 3600.0 default: 30
unit_of_measurement: seconds selector:
step: 1.0 number:
window_delay_close: mode: box
name: Fenster-/Türsensor Verzögerung min: 0.0
description: Zeit die das Fenster geschlossen bleiben muss, um die den Radiator in den "Fenster geschlossen"-Modus zu versetzen (Default = 5s) max: 3600.0
default: 5 unit_of_measurement: seconds
selector: step: 1.0
number: window_delay_close:
mode: box name: Fenster-/Türsensor Verzögerung
min: 0.0 description: Zeit die das Fenster geschlossen bleiben muss, um die den Radiator in den "Fenster geschlossen"-Modus zu versetzen (Default = 5s)
max: 3600.0 default: 5
unit_of_measurement: seconds selector:
step: 1.0 number:
temperature_sensor: mode: box
name: Temperatursensor min: 0.0
selector: max: 3600.0
entity: unit_of_measurement: seconds
multiple: false step: 1.0
filter: remaining_section:
- domain: sensor name: Weitere Konfiguration
device_class: temperature description: Sonstige Konfigurationen für die Automation
collapsed: false
input:
temperature_sensor:
name: Temperatursensor
selector:
entity:
multiple: false
filter:
- domain: sensor
device_class: temperature
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 einem gültigen Slot verwendet.
default: []
selector:
entity:
multiple: true
filter:
- domain: switch
variables:
trv: !input trv
radiator_schedules: !input radiator_schedules
temperature_sensor: !input temperature_sensor
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) %}
{% for schedule in radiator_schedules %}
{% if states(schedule) == 'on' and state_attr(schedule, 'current_slot') is not none %}
{% set current_slot = state_attr(schedule, 'current_slot') %}
{% set actions = state_attr(schedule, 'actions') %}
{% if actions is not none and actions | length > current_slot %}
{% set action = actions[current_slot] %}
{% if action.data.temperature is defined %}
{% set ns.current_temperature = action.data.temperature %}
{% break %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{{ ns.current_temperature }}
triggers: triggers:
- trigger: state - trigger: state
@@ -75,60 +135,53 @@ triggers:
entity_id: !input temperature_sensor entity_id: !input temperature_sensor
id: TEMP_CHANGED id: TEMP_CHANGED
variables:
trv: !input radiator_entity
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 }}
current_temperature: !input temperature_sensor
actions: actions:
- if: - choose:
- condition: trigger - conditions:
id: - condition: trigger
- FENSTER_OPEN id:
then: - FENSTER_OPEN
- service: switch.turn_on - condition: template
target: value_template: >
entity_id: "{{ window_detection_entity }}" {{ is_state(window_detection_entity, 'off') }}
alias: Setze Fenster auf offen sequence:
- if: - service: switch.turn_on
- condition: trigger target:
id: entity_id: "{{ window_detection_entity }}"
- FENSTER_CLOSED alias: Setze Fenster auf offen
then: - conditions:
- service: switch.turn_off - condition: trigger
target: id:
entity_id: "{{ window_detection_entity }}" - FENSTER_CLOSED
alias: Setze Fenster auf geschlossen - 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: >
{{ scheduled_temperature is not none }}
then:
- action: climate.set_temperature
target:
entity_id: !input trv
data:
temperature: "{{ scheduled_temperature | float }}"
alias: Setze Fenster auf geschlossen und setze Solltemperatur auf Wert aus Zeitplan (wenn vorhanden)
# temperature sensor sync # temperature sensor sync
- if: - choose:
- condition: trigger - conditions:
id: - condition: trigger
- FENSTER_OPEN id:
- FENSTER_CLOSED - SYNC_TEMPERATURE
- SYNC_TEMPERATURE - TEMP_CHANGED
- TEMP_CHANGED sequence:
then: - service: number.set_value
- service: number.set_value data:
data: value: "{{ states(temperature_sensor) | float }}"
value: "{{ states(current_temperature) | float }}" target:
target: entity_id: "{{ remote_temperature_entity }}"
entity_id: "{{ remote_temperature_entity }}" alias: Synchronisiere Temperatur am TRV
alias: Sync remote temperature sensor
alias: Synce Temperatur zum TRV

View File

@@ -1,12 +1,14 @@
mode: single mode: single
blueprint: blueprint:
name: Bosch BTH-RA Radiator Control name: Bosch BTH-RA Radiator Control - DEV
homeassistant:
min_version: "2024.6.0"
description: > description: >
An automation to set Bosch TRV radiator valve to a desired temperature. Eine Automation zur automatischen Steuerung eines Bosch TRV Heizkörperthermostats.
domain: automation domain: automation
author: Me author: Me
input: input:
radiator_entity: trv:
name: Thermostat name: Thermostat
description: Thermostat muss ein Bosch BTH-RA sein description: Thermostat muss ein Bosch BTH-RA sein
selector: selector:
@@ -14,43 +16,101 @@ blueprint:
multiple: false multiple: false
filter: filter:
- domain: climate - domain: climate
window_sensor: window_section:
name: Fenster-/Türsensor (oder Gruppe) name: Fenster-/Türsensor Konfiguration
selector: description: Konfiguration für den Fenster-/Türsensor.
entity: collapsed: false
multiple: false input:
filter: window_sensor:
- domain: binary_sensor name: Fenster-/Türsensor (oder Gruppe)
window_delay_open: selector:
name: Fenster-/Türsensor Verzögerung entity:
description: Zeit die das Fenster offen bleiben muss, um die den Radiator in den "Fenster offen"-Modus zu versetzen (Default = 30s) multiple: false
default: 30 filter:
selector: - domain: binary_sensor
number: window_delay_open:
mode: box name: Fenster-/Türsensor Verzögerung
min: 0.0 description: Zeit die das Fenster offen bleiben muss, um die den Radiator in den "Fenster offen"-Modus zu versetzen (Default = 30s)
max: 3600.0 default: 30
unit_of_measurement: seconds selector:
step: 1.0 number:
window_delay_close: mode: box
name: Fenster-/Türsensor Verzögerung min: 0.0
description: Zeit die das Fenster geschlossen bleiben muss, um die den Radiator in den "Fenster geschlossen"-Modus zu versetzen (Default = 5s) max: 3600.0
default: 5 unit_of_measurement: seconds
selector: step: 1.0
number: window_delay_close:
mode: box name: Fenster-/Türsensor Verzögerung
min: 0.0 description: Zeit die das Fenster geschlossen bleiben muss, um die den Radiator in den "Fenster geschlossen"-Modus zu versetzen (Default = 5s)
max: 3600.0 default: 5
unit_of_measurement: seconds selector:
step: 1.0 number:
temperature_sensor: mode: box
name: Temperatursensor min: 0.0
selector: max: 3600.0
entity: unit_of_measurement: seconds
multiple: false step: 1.0
filter: remaining_section:
- domain: sensor name: Weitere Konfiguration
device_class: temperature description: Sonstige Konfigurationen für die Automation
collapsed: false
input:
temperature_sensor:
name: Temperatursensor
selector:
entity:
multiple: false
filter:
- domain: sensor
device_class: temperature
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 einem gültigen Slot verwendet.
default: []
selector:
entity:
multiple: true
filter:
- domain: switch
variables:
trv: !input trv
radiator_schedules: !input radiator_schedules
temperature_sensor: !input temperature_sensor
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) %}
{% for schedule in radiator_schedules %}
{% if states(schedule) == 'on' and state_attr(schedule, 'current_slot') is not none %}
{% set current_slot = state_attr(schedule, 'current_slot') %}
{% set actions = state_attr(schedule, 'actions') %}
{% if actions is not none and actions | length > current_slot %}
{% set action = actions[current_slot] %}
{% if action.data.temperature is defined %}
{% set ns.current_temperature = action.data.temperature %}
{% break %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{{ ns.current_temperature }}
triggers: triggers:
- trigger: state - trigger: state
@@ -75,60 +135,53 @@ triggers:
entity_id: !input temperature_sensor entity_id: !input temperature_sensor
id: TEMP_CHANGED id: TEMP_CHANGED
variables:
trv: !input radiator_entity
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 }}
current_temperature: !input temperature_sensor
actions: actions:
- if: - choose:
- condition: trigger - conditions:
id: - condition: trigger
- FENSTER_OPEN id:
then: - FENSTER_OPEN
- service: switch.turn_on - condition: template
target: value_template: >
entity_id: "{{ window_detection_entity }}" {{ is_state(window_detection_entity, 'off') }}
alias: Setze Fenster auf offen sequence:
- if: - service: switch.turn_on
- condition: trigger target:
id: entity_id: "{{ window_detection_entity }}"
- FENSTER_CLOSED alias: Setze Fenster auf offen
then: - conditions:
- service: switch.turn_off - condition: trigger
target: id:
entity_id: "{{ window_detection_entity }}" - FENSTER_CLOSED
alias: Setze Fenster auf geschlossen - 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: >
{{ scheduled_temperature is not none }}
then:
- action: climate.set_temperature
target:
entity_id: !input trv
data:
temperature: "{{ scheduled_temperature | float }}"
alias: Setze Fenster auf geschlossen und setze Solltemperatur auf Wert aus Zeitplan (wenn vorhanden)
# temperature sensor sync # temperature sensor sync
- if: - choose:
- condition: trigger - conditions:
id: - condition: trigger
- FENSTER_OPEN id:
- FENSTER_CLOSED - SYNC_TEMPERATURE
- SYNC_TEMPERATURE - TEMP_CHANGED
- TEMP_CHANGED sequence:
then: - service: number.set_value
- service: number.set_value data:
data: value: "{{ states(temperature_sensor) | float }}"
value: "{{ states(current_temperature) | float }}" target:
target: entity_id: "{{ remote_temperature_entity }}"
entity_id: "{{ remote_temperature_entity }}" alias: Synchronisiere Temperatur am TRV
alias: Sync remote temperature sensor
alias: Synce Temperatur zum TRV