Add automated Roth floor heating control: comfort temps, night/away/vacation setbacks, seasonal valve guidance
This commit is contained in:
@@ -1,12 +1,2 @@
|
||||
### Set temperature to 24 in heat mode
|
||||
- alias: "Tænd varme i kontor"
|
||||
trigger:
|
||||
platform: time
|
||||
at: "19:30:00"
|
||||
action:
|
||||
- service: climate.set_temperature
|
||||
target:
|
||||
entity_id: climate.kontor
|
||||
data:
|
||||
temperature: 24
|
||||
hvac_mode: heat
|
||||
### Kontor-varme styres nu af script.varme_recalculate (include/scripts/varme_styring.yaml)
|
||||
### Denne fil er beholdt tom for fremtidige manuelle overrides
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
##################################################
|
||||
# Varme: Triggers der kalder script.varme_recalculate
|
||||
# Scenarierne der kræver genberegning:
|
||||
# - Morgen (06:30) - nat slut → komforttemp
|
||||
# - Aften (22:00) - nat start → natsænkning
|
||||
# - Tilstedeværelse - hjemme/væk skifter
|
||||
# - Ferietilstand - ferie til/fra
|
||||
# - HA genstart - genopret korrekt temp
|
||||
##################################################
|
||||
|
||||
- alias: "Varme - Genberegn: Morgen"
|
||||
id: varme_recalc_morgen
|
||||
description: "Slutter natsænkning kl. 06:30 - sætter komforttemperaturer"
|
||||
trigger:
|
||||
- platform: time
|
||||
at: "06:30:00"
|
||||
action:
|
||||
- service: script.varme_recalculate
|
||||
|
||||
- alias: "Varme - Genberegn: Nat"
|
||||
id: varme_recalc_nat
|
||||
description: "Starter natsænkning kl. 22:00"
|
||||
trigger:
|
||||
- platform: time
|
||||
at: "22:00:00"
|
||||
action:
|
||||
- service: script.varme_recalculate
|
||||
|
||||
- alias: "Varme - Genberegn: Tilstedeværelse"
|
||||
id: varme_recalc_presence
|
||||
description: "Justerer temperaturer når family_presence ændres (hjemme/væk)"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: binary_sensor.family_presence
|
||||
action:
|
||||
# Kort forsinkelse så person-sensorer er stabile
|
||||
- delay: "00:01:00"
|
||||
- service: script.varme_recalculate
|
||||
|
||||
- alias: "Varme - Genberegn: Ferie"
|
||||
id: varme_recalc_vacation
|
||||
description: "Skifter til ferie-/frosttemperatur når vacation_mode ændres"
|
||||
trigger:
|
||||
- platform: state
|
||||
entity_id: input_boolean.vacation_mode
|
||||
action:
|
||||
- service: script.varme_recalculate
|
||||
|
||||
- alias: "Varme - Genberegn: HA genstart"
|
||||
id: varme_recalc_ha_start
|
||||
description: "Genopret korrekte temperaturer efter HA genstart"
|
||||
trigger:
|
||||
- platform: homeassistant
|
||||
event: start
|
||||
action:
|
||||
# Vent til integrationer er loaded
|
||||
- delay: "00:01:00"
|
||||
- service: script.varme_recalculate
|
||||
@@ -27,12 +27,6 @@
|
||||
binary_sensor.lille_bad_vindue: climate.lille_bad
|
||||
climate_entity: "{{ room_map[trigger.entity_id] }}"
|
||||
window_entity: "{{ trigger.entity_id }}"
|
||||
scene_name: "vindue_varme_{{ trigger.entity_id.split('.')[1] }}"
|
||||
- service: scene.create
|
||||
data:
|
||||
scene_id: "{{ scene_name }}"
|
||||
snapshot_entities:
|
||||
- "{{ climate_entity }}"
|
||||
- service: climate.set_hvac_mode
|
||||
target:
|
||||
entity_id: "{{ climate_entity }}"
|
||||
@@ -41,9 +35,8 @@
|
||||
- wait_template: "{{ is_state(window_entity, 'off') }}"
|
||||
timeout: "04:00:00"
|
||||
continue_on_timeout: true
|
||||
- service: scene.turn_on
|
||||
target:
|
||||
entity_id: "scene.{{ scene_name }}"
|
||||
# Genberegn korrekt temperatur (nat/væk/komfort) efter vindue lukkes
|
||||
- service: script.varme_recalculate
|
||||
|
||||
### Notifikation: Vindue åbner og ingen er hjemme
|
||||
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
# Komforttemperaturer per rum (Roth gulvvarme)
|
||||
varme_komfort_andreas:
|
||||
name: Komfort - Andreas
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 20
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_daniel:
|
||||
name: Komfort - Daniel
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 20
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_sovevaerelse:
|
||||
name: Komfort - Soveværelse
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 18
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_kontor:
|
||||
name: Komfort - Kontor
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 21
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_gang:
|
||||
name: Komfort - Gang
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 18
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_forgang:
|
||||
name: Komfort - Forgang
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 17
|
||||
icon: mdi:thermometer
|
||||
|
||||
varme_komfort_lille_bad:
|
||||
name: Komfort - Lille bad
|
||||
min: 15
|
||||
max: 28
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 22
|
||||
icon: mdi:thermometer
|
||||
|
||||
# Globale sænkninger
|
||||
varme_nat_saenkning:
|
||||
name: Natsænkning
|
||||
min: 0
|
||||
max: 8
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 3
|
||||
icon: mdi:weather-night
|
||||
|
||||
varme_vaek_saenkning:
|
||||
name: Sænkning - ingen hjemme
|
||||
min: 0
|
||||
max: 8
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 3
|
||||
icon: mdi:home-export-outline
|
||||
|
||||
varme_ferie_temp:
|
||||
name: Ferietemperatur (frostbeskyttelse)
|
||||
min: 10
|
||||
max: 18
|
||||
step: 0.5
|
||||
unit_of_measurement: "°C"
|
||||
initial: 15
|
||||
icon: mdi:beach
|
||||
@@ -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 (22–06: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 %}
|
||||
@@ -0,0 +1,34 @@
|
||||
##################################################
|
||||
# Varme: Anbefalet ventilposition (sæsonbaseret)
|
||||
# Bruges til manuelt at justere:
|
||||
# 1. Hoofdhanen i sauna (Roth-fordeling)
|
||||
# 2. Haupthanen i bryggers (fjernvarme indgang)
|
||||
#
|
||||
# Formel: lineær skalering 0-100%
|
||||
# Udetemperatur >= 15°C → 0% (lukket)
|
||||
# Udetemperatur <= -5°C → 100% (fuldt åben)
|
||||
# Lineær imellem: (15 - T) / 20 * 100
|
||||
##################################################
|
||||
|
||||
- sensor:
|
||||
- name: "Fjernvarme ventil anbefalet"
|
||||
unique_id: fjernvarme_ventil_anbefalet
|
||||
unit_of_measurement: "%"
|
||||
icon: mdi:valve
|
||||
state: >
|
||||
{% set t = state_attr('weather.norgardsvej', 'temperature') | float(10) %}
|
||||
{% set raw = (15 - t) / 20 * 100 %}
|
||||
{{ [[raw, 0] | max, 100] | min | round(0) | int }}
|
||||
attributes:
|
||||
anbefaling: >
|
||||
{% set t = state_attr('weather.norgardsvej', 'temperature') | float(10) %}
|
||||
{% set raw = (15 - t) / 20 * 100 %}
|
||||
{% set pos = [[raw, 0] | max, 100] | min | round(0) | int %}
|
||||
{% if pos == 0 %}Lukket - varmt vejr (over 15°C)
|
||||
{% elif pos <= 25 %}Let åben ca. ¼ - mildt vejr
|
||||
{% elif pos <= 50 %}Halvt åben - køligt vejr
|
||||
{% elif pos <= 75 %}Mest åben ca. ¾ - koldt vejr
|
||||
{% else %}Fuldt åben - frostgrader
|
||||
{% endif %}
|
||||
udetemperatur: >
|
||||
{{ state_attr('weather.norgardsvej', 'temperature') | float(10) }}
|
||||
Reference in New Issue
Block a user