129 lines
3.2 KiB
YAML
129 lines
3.2 KiB
YAML
blueprint:
|
|
name: Dynamic Radiator Valve
|
|
description: Automatically sets radiator valve closing/opening degree based on temperature difference and window status
|
|
domain: automation
|
|
|
|
input:
|
|
radiator_climate:
|
|
name: Radiator (climate)
|
|
selector:
|
|
entity:
|
|
domain: climate
|
|
|
|
temperature_sensor:
|
|
name: Temperature Sensor
|
|
selector:
|
|
entity:
|
|
domain: sensor
|
|
|
|
valve_closing_number:
|
|
name: Valve Closing Number
|
|
selector:
|
|
entity:
|
|
domain: number
|
|
|
|
valve_opening_number:
|
|
name: Valve Opening Number (optional)
|
|
default: null
|
|
selector:
|
|
entity:
|
|
domain: number
|
|
|
|
window_sensor:
|
|
name: Window Sensor / Input Boolean
|
|
selector:
|
|
entity:
|
|
domain:
|
|
- binary_sensor
|
|
- input_boolean
|
|
|
|
difference_text:
|
|
name: Temperature Difference (optional)
|
|
default: null
|
|
selector:
|
|
entity:
|
|
domain: input_text
|
|
|
|
triggers:
|
|
|
|
- platform: state
|
|
entity_id: !input radiator_climate
|
|
|
|
- platform: state
|
|
entity_id: !input temperature_sensor
|
|
|
|
- platform: state
|
|
entity_id: !input window_sensor
|
|
|
|
- platform: time_pattern
|
|
minutes: "/1"
|
|
|
|
#conditions:
|
|
# - condition: template
|
|
# value_template: >
|
|
# {{ states(climate_entity) not in ['unavailable', 'unknown'] }}
|
|
|
|
actions:
|
|
- variables:
|
|
climate_entity: !input radiator_climate
|
|
temp_entity: !input temperature_sensor
|
|
window_entity: !input window_sensor
|
|
closing_entity: !input valve_closing_number
|
|
opening_entity: !input valve_opening_number
|
|
diff_text_entity: !input difference_text
|
|
|
|
- variables:
|
|
window_closed: "{{ states(window_entity) in ['off', 'false', 'closed'] }}"
|
|
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ window_closed }}"
|
|
sequence:
|
|
- variables:
|
|
target: "{{ state_attr(climate_entity, 'temperature') | float(0) }}"
|
|
current: "{{ states(temp_entity) | float(0) }}"
|
|
diff: "{{ current - target }}"
|
|
closing_degree: >
|
|
{% if diff >= 1.0 %} 100
|
|
{% elif diff >= 0.5 %} 80
|
|
{% elif diff >= 0.0 %} 60
|
|
{% elif diff >= -1.0 %} 50
|
|
{% else %} 30
|
|
{% endif %}
|
|
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ not window_closed }}"
|
|
sequence:
|
|
- variables:
|
|
closing_degree: 0
|
|
|
|
- variables:
|
|
valve_entities: >
|
|
{% if opening_entity %}
|
|
{{ [closing_entity, opening_entity] }}
|
|
{% else %}
|
|
{{ [closing_entity] }}
|
|
{% endif %}
|
|
|
|
- service: number.set_value
|
|
target:
|
|
entity_id: "{{ valve_entities }}"
|
|
data:
|
|
value: "{{ closing_degree }}"
|
|
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ diff_text_entity != None }}"
|
|
sequence:
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: "{{ diff_text_entity }}"
|
|
data:
|
|
value: "{{ closing_degree }}"
|
|
|
|
mode: queued
|
|
max: 5
|