Add automated Roth floor heating control: comfort temps, night/away/vacation setbacks, seasonal valve guidance

This commit is contained in:
2026-04-22 21:43:49 +02:00
parent 5bbf0a5082
commit fa79ffc0e6
6 changed files with 327 additions and 21 deletions
+140
View File
@@ -0,0 +1,140 @@
##################################################
# Varme: Central genberegning af alle Roth-rum
# Kaldes af automations/varme_styring.yaml ved:
# - Morgen (06:30), Nat (22:00)
# - Tilstedeværelse ændret
# - Ferietilstand ændret
# - HA genstart
# Logik pr. rum:
# - Vindue åbent → skip (håndteres af vinduer.yaml)
# - Ferie → varme_ferie_temp (frostbeskyttelse)
# - Nat (2206:30) → komfort - varme_nat_saenkning
# - Ingen hjemme → komfort - varme_vaek_saenkning
# - Ellers → rum-komforttemperatur
##################################################
varme_recalculate:
alias: "Varme: Genberegn alle rum"
mode: restart
sequence:
- variables:
vacation: "{{ is_state('input_boolean.vacation_mode', 'on') }}"
night: "{{ now().hour >= 22 or now().hour < 7 }}"
home: "{{ is_state('binary_sensor.family_presence', 'on') }}"
nat_sænk: "{{ states('input_number.varme_nat_saenkning') | float(3) }}"
vaek_sænk: "{{ states('input_number.varme_vaek_saenkning') | float(3) }}"
ferie_temp: "{{ states('input_number.varme_ferie_temp') | float(15) }}"
# ---- Andreas (vindue: binary_sensor.andreas_vindue) ----
- if:
- condition: template
value_template: "{{ not is_state('binary_sensor.andreas_vindue', 'on') }}"
then:
- service: climate.set_temperature
target:
entity_id: climate.andreas
data:
hvac_mode: heat
temperature: >
{% set k = states('input_number.varme_komfort_andreas') | float(20) %}
{% if vacation %} {{ ferie_temp }}
{% elif night %} {{ [k - nat_sænk, 15] | max }}
{% elif not home %} {{ [k - vaek_sænk, 15] | max }}
{% else %} {{ k }}
{% endif %}
# ---- Daniel (vindue: binary_sensor.daniel_vindue) ----
- if:
- condition: template
value_template: "{{ not is_state('binary_sensor.daniel_vindue', 'on') }}"
then:
- service: climate.set_temperature
target:
entity_id: climate.daniel
data:
hvac_mode: heat
temperature: >
{% set k = states('input_number.varme_komfort_daniel') | float(20) %}
{% if vacation %} {{ ferie_temp }}
{% elif night %} {{ [k - nat_sænk, 15] | max }}
{% elif not home %} {{ [k - vaek_sænk, 15] | max }}
{% else %} {{ k }}
{% endif %}
# ---- Soveværelse (vindue: binary_sensor.sovevaerelse_vindue) ----
- if:
- condition: template
value_template: "{{ not is_state('binary_sensor.sovevaerelse_vindue', 'on') }}"
then:
- service: climate.set_temperature
target:
entity_id: climate.sovev_prelse
data:
hvac_mode: heat
temperature: >
{% set k = states('input_number.varme_komfort_sovevaerelse') | float(18) %}
{% if vacation %} {{ ferie_temp }}
{% elif night %} {{ [k - nat_sænk, 15] | max }}
{% elif not home %} {{ [k - vaek_sænk, 15] | max }}
{% else %} {{ k }}
{% endif %}
# ---- Kontor (ingen vinduesensor) ----
- service: climate.set_temperature
target:
entity_id: climate.kontor
data:
hvac_mode: heat
temperature: >
{% set k = states('input_number.varme_komfort_kontor') | float(21) %}
{% if vacation %} {{ ferie_temp }}
{% elif night %} {{ [k - nat_sænk, 15] | max }}
{% elif not home %} {{ [k - vaek_sænk, 15] | max }}
{% else %} {{ k }}
{% endif %}
# ---- Gang / Fordelingsgang (ingen vinduesensor) ----
- service: climate.set_temperature
target:
entity_id: climate.fordelingsgang
data:
hvac_mode: heat
temperature: >
{% set k = states('input_number.varme_komfort_gang') | float(18) %}
{% if vacation %} {{ ferie_temp }}
{% elif night %} {{ [k - nat_sænk, 15] | max }}
{% elif not home %} {{ [k - vaek_sænk, 15] | max }}
{% else %} {{ k }}
{% endif %}
# ---- Forgang (ingen vinduesensor) ----
- service: climate.set_temperature
target:
entity_id: climate.forgang
data:
hvac_mode: heat
temperature: >
{% set k = states('input_number.varme_komfort_forgang') | float(17) %}
{% if vacation %} {{ ferie_temp }}
{% elif night %} {{ [k - nat_sænk, 15] | max }}
{% elif not home %} {{ [k - vaek_sænk, 15] | max }}
{% else %} {{ k }}
{% endif %}
# ---- Lille bad (vindue: binary_sensor.lille_bad_vindue) ----
- if:
- condition: template
value_template: "{{ not is_state('binary_sensor.lille_bad_vindue', 'on') }}"
then:
- service: climate.set_temperature
target:
entity_id: climate.lille_bad
data:
hvac_mode: heat
temperature: >
{% set k = states('input_number.varme_komfort_lille_bad') | float(22) %}
{% if vacation %} {{ ferie_temp }}
{% elif night %} {{ [k - nat_sænk, 15] | max }}
{% elif not home %} {{ [k - vaek_sænk, 15] | max }}
{% else %} {{ k }}
{% endif %}