Hier nun Teil zwei auf meinem Weg zur smarten Heizungssteuerung.
Zunächst habe ich mal einige Helper angelegt:
- HZ_Nachttemperatur ist als Helper für die Nachtabsenkung.
- HZ_Tagtemperatur ist als Helper für die Tagestemperatur.
- HZ_Solltemperatur Wohnzimmer ist als Helper für die Solltemperatur für die Heizkörper im Wohnzimmer.
- HZ_Solltemperatur Bad ist als Helper für die Solltemperatur für die Heizkörper im Bad.
- HZ_Steuerung_An_Aus hebt die Automatisierung auf.
- HeizungSzenen sind meine unterschiedlichen Anforderungen an die Heizungssteuerung:
- – Di % Do in Köln, meine standard Tage im Büro
- – Nachtabsenkung -> Nachtabsenkung z.B. wg. Urlaub
- – Zuhause -> alles auf Tagtemperatur
- – in Köln außergewöhnlicher Tag im Büro
Die Auswahl der Szene steuert dann den Ablauf der Heizungssteuerung.
Z.B. Di & Do in Köln, dann geht morgens um 6:00Uhr alles auf Tagtemperatur, Di & Do schaltet die Heizung aber in der BüroZeit (7:00-17:00Uhr) auf Nachttemperatur.
Eine Automatisierung reagiert auf die Auswahl im DropDown der Szenen und dann hat jede Szene eine Automatisierung, die je nach Auswahl an- oder ausgeschaltet wird. Zum Teil wird die Automatisierung dann auch gestartet, um die gewollten Temperaturwerte einzustellen.
Yaml Code Heizungssteuerung
alias: Heizungssteuerung
description: „“
trigger:
- platform: state entity_id:
- input_select.dropd
condition: []
action:
- input_select.dropd
- choose:
- conditions:
- condition: state
entity_id: input_select.dropd
state: Nachtabsenkung
sequence: - service: automation.turn_on
data: {}
target:
entity_id: automation.heizung_17_grad - service: automation.turn_off
data:
stop_actions: true
target:
entity_id:
– automation.heizung_zuhause
– automation.heizung_koeln
– automation.di_do_neu
– automation.heizung_di_do_koeln - service: automation.trigger
data:
skip_condition: true
target:
entity_id: automation.heizung_17_grad
- condition: state
- conditions:
- condition: state
entity_id: input_select.dropd
state: Zuhause
sequence: - service: automation.turn_on
data: {}
target:
entity_id: automation.heizung_zuhause - service: automation.turn_off
data:
stop_actions: true
target:
entity_id:
– automation.heizung_17_grad
– automation.heizung_koeln
– automation.heizung_di_do_koeln - service: automation.trigger
data:
skip_condition: true
target:
entity_id: automation.heizung_zuhause
- condition: state
- conditions:
- condition: state
entity_id: input_select.dropd
state: in Köln
sequence: - service: automation.turn_on
data: {}
target:
entity_id: automation.heizung_koeln - service: automation.turn_off
data:
stop_actions: true
target:
entity_id:
– automation.heizung_17_grad
– automation.heizung_zuhause
– automation.heizung_di_do_koeln
- condition: state
- conditions:
- condition: state
entity_id: input_select.dropd
state: Di % Do in Köln
sequence: - service: automation.turn_on
data: {}
target:
entity_id: automation.heizung_di_do_koeln - service: automation.turn_off
data:
stop_actions: true
target:
entity_id:
– automation.heizung_17_grad
– automation.heizung_koeln
– automation.heizung_zuhause
default: []
- condition: state
- conditions:
- service: input_boolean.turn_on
data: {}
target:
entity_id: input_boolean.hz_steuerung_an_aus
mode: single
Wie oben erwähnt kommt dann je Szene eine Automatisierung, hier die „Di & Do in Köln“.
Jede der Automatisierung für eine Szene beginnt mit Triggern, die meine standard Zeiten abdecken.
Ich bin dienstags und donnerstags im Büro, dann muss ich „nur“ ins Bad und komme dann im Nachmittag zurück. An den Tagen lasse ich das Bad hochfahren morgens und zum Feierabend mache ich alle Heizungen wieder an. In der Zwischenzeit steht alles auf Nachtabsenkung.
An den anderen Tagen bin ich im HomeOffice, da muss auch der Wohnraum angeheizt werden. Am Wochenende stehen wir später auf, da beginnt das Heizen erst um 8:00Uhr. Gegen 23:00Uhr gehen wir normal schlafen, also fährt die Heizung um 22:00Uhr runter.
Diese Trigger sind in allen Automatisierungen für die Heizungsszenen gleich, die Aktionen unterschieden sich.
Trigger können IDs haben, die dann wieder von den Aktionen ausgewertet werden, so kann die Aktion je nach Uhrzeit angesteuert werden und über eine Bedingung noch nach Wochentag(en) unterschieden werden.
Das ist das Grundgerüst, jetzt müssen „nur“ noch je nach Bedingung die TemperaturSoll-Werte für alle Thermostate gesetzt werden.
Damit ich die Steuerung ausschalten und „per Hand“ alles steuern kann, gibt es den Helper HZ_Steuerung_An_Aus, den die Automatisierung prüft. Ist HZ_Steuerung AN, werden die Automatisierungen und damit die Zeitsteuerungen ausgeführt, wenn HZ_Steuerung aus ist, kann über die Helper HZ_SollTempertur & HZ_Nachttemperatur die Steuerung manuell erfolgen.
Yaml Code Di & Do in Köln
alias: Heizung_di_do_koeln
description: „“
trigger:
- platform: time
at: „06:00:00“
id: „6“ - platform: time
at: „07:00:00“
id: „7“ - platform: time
at: „08:00:00“
id: „8“ - platform: time
at: „17:00:00“
id: „17“ - platform: time
at: „22:00:00“
id: „22“
condition: []
action: - choose:
- conditions:
- condition: trigger id:
- „6“
- condition: time weekday:
- tue
- thu
sequence:
- service: climate.set_temperature
data:
temperature: „{{ states(‚input_number.hz_tagtemperatur‘) }}“
target:
entity_id:
– climate.bad_1_og
– climate.bad_1_og_fenster - service: climate.set_temperature
data:
temperature: 24
target:
device_id: 65bf2234146f1a77c1c0cf629f8fa3c8 - service: input_number.set_value
data:
value: „{{states(‚input_number.hz_tagtemperatur‘)}}“
target:
entity_id:
– input_number.hz_solltemperatur_bad1og
- condition: trigger id:
- conditions:
- condition: trigger id:
- „7“
- condition: time weekday:
- tue
- thu
sequence:
- service: climate.set_temperature
data:
temperature: „{{ states(‚input_number.hz_nachttemperatur‘) }}“
target:
entity_id:
– climate.bad_1_og
– climate.bad_1_og_fenster
– climate.esszimmer
– climate.kuche
– climate.wohnzimmer_fenster - service: climate.set_temperature
data:
temperature: „{{ states(‚input_number.hz_nachttemperatur‘) }}“
target:
device_id: 65bf2234146f1a77c1c0cf629f8fa3c8 - service: input_number.set_value
data:
value: „{{states(‚input_number.hz_nachttemperatur‘)}}“
target:
entity_id:
– input_number.hz_solltemperatur_wohnesszimmer
– input_number.hz_solltemperatur_bad1og
- condition: trigger id:
- conditions:
- condition: trigger id:
- „7“
- condition: time weekday:
- mon
- wed
- fri
sequence:
- service: climate.set_temperature
data:
temperature: „{{ states(‚input_number.hz_tagtemperatur‘) }}“
target:
entity_id:
– climate.bad_1_og
– climate.bad_1_og_fenster
– climate.esszimmer
– climate.kuche
– climate.wohnzimmer_fenster - service: climate.set_temperature
data:
temperature: 24
target:
device_id: 65bf2234146f1a77c1c0cf629f8fa3c8 - service: input_number.set_value
data:
value: „{{states(‚input_number.hz_tagtemperatur‘)}}“
target:
entity_id:
– input_number.hz_solltemperatur_wohnesszimmer
– input_number.hz_solltemperatur_bad1og
- condition: trigger id:
- conditions:
- condition: trigger id:
- „8“
- condition: time weekday:
- sun
- mon
- wed
- fri
- sat
sequence:
- service: climate.set_temperature
data:
temperature: „{{ states(‚input_number.hz_tagtemperatur‘) }}“
target:
entity_id:
– climate.bad_1_og
– climate.bad_1_og_fenster
– climate.esszimmer
– climate.kuche
– climate.wohnzimmer_fenster - service: climate.set_temperature
data:
temperature: 24
target:
device_id: 65bf2234146f1a77c1c0cf629f8fa3c8 - service: input_number.set_value
data:
value: „{{states(‚input_number.hz_tagtemperatur‘)}}“
target:
entity_id:
– input_number.hz_solltemperatur_wohnesszimmer
– input_number.hz_solltemperatur_bad1og
- condition: trigger id:
- conditions:
- condition: trigger id:
- „17“
- condition: time weekday:
- tue
- thu
sequence:
- service: climate.set_temperature
data:
temperature: „{{ states(‚input_number.hz_tagtemperatur‘) }}“
target:
entity_id:
– climate.bad_1_og
– climate.bad_1_og_fenster
– climate.esszimmer
– climate.kuche
– climate.wohnzimmer_fenster - service: climate.set_temperature
data:
temperature: 24
target:
device_id: 65bf2234146f1a77c1c0cf629f8fa3c8 - service: input_number.set_value
data:
value: „{{states(‚input_number.hz_tagtemperatur‘)}}“
target:
entity_id:
– input_number.hz_solltemperatur_wohnesszimmer
– input_number.hz_solltemperatur_bad1og
- condition: trigger id:
- conditions:
- condition: trigger id:
- „22“
sequence:
- „22“
- service: climate.set_temperature
data:
temperature: „{{ states(‚input_number.hz_nachttemperatur‘) }}“
target:
entity_id:
– climate.bad_1_og
– climate.bad_1_og_fenster
– climate.esszimmer
– climate.kuche
– climate.wohnzimmer_fenster - service: climate.set_temperature
data:
temperature: „{{ states(‚input_number.hz_nachttemperatur‘) }}“
target:
device_id: 65bf2234146f1a77c1c0cf629f8fa3c8 - service: input_number.set_value
data:
value: „{{states(‚input_number.hz_nachttemperatur‘)}}“
target:
entity_id:
– input_number.hz_solltemperatur_wohnesszimmer
– input_number.hz_solltemperatur_bad1og
default: []
mode: single
- condition: trigger id:
- conditions:
Jetzt kommt das Offset noch einmal ins Spiel, wenn die Solltemperatur für den Raum nicht gleich der gemessenen Temperatur im Raum ist, müssen alle Thermostate an den Heizkörpern höher eingestellt werden.
Den Offset pro Raum berechne ich über einen Template Sensor, der in der configuration.yaml definiert ist.
YAML Code OffSet Sensor
template:
- sensor:
- name: „Bad1OGZimmerOffset“
state: >
{{ (states.input_number.HZ_Solltemperatur_Bad1OG.state | float) – (states.sensor.bad_1og.state | float ) }} - name: „WohnZimmerOffset“
state: >
{{ (states.input_number.hz_solltemperatur_wohnesszimmer.state | float) – (states.sensor.wohnzimmer.state | float ) }}
- name: „Bad1OGZimmerOffset“
Das Thermostat, welches die Heizung an sich steuert, hängt im Wohnzimmer. Die Zieltemperatur dieses Thermostates muss >= der Solltemperatur des Wohnzimmers sein, damit die Heizung überhaupt anspringt. Daher schaue ich in der IF-Schleife, ob einer der OffSet-Werte > 0,1 ist, also Wärme angefodert wird. Dann setzte ich die Solltemperatur für das Heizungsthermostat auf WohnzimmerSoll +2. Wird keine Wärme angefordert (alle OffsetWerte < 0,1) setzt ich das Heizungsthermostat auf die WohnzimmerSollTemoeratur. So erreiche ich, dass die GasHeizung nur dann anspringt, wenn auch Wärme angefordert wird.
YAML Code Offset Automatisiserung
alias: Heizung_Offset_5min
description: „“
trigger:
- platform: time_pattern
minutes: /5
condition: []
action: - service: climate.set_temperature
data:
temperature: >-
{{ states(‚input_number.hz_solltemperatur_bad1og‘) | float(0) +
states(’sensor.Bad1OGZimmerOffset‘) | float(0) }}
target:
entity_id:
– climate.bad_1_og
– climate.bad_1_og_fenster - service: climate.set_temperature
data:
temperature: >-
{{ states(‚input_number.hz_solltemperatur_wohnesszimmer‘) | float(0) +
states(’sensor.wohnzimmeroffset‘) | float(0) }}
target:
entity_id:
– climate.esszimmer
– climate.wohnzimmer_fenster
– climate.kuche
enabled: true - if:
- condition: numeric_state
entity_id: sensor.wohnzimmeroffset
above: 0.1 - condition: or conditions:
- condition: numeric_state
entity_id: sensor.bad1ogzimmeroffset
above: 0.1
then:
- condition: numeric_state
- service: climate.set_temperature
data:
temperature: >-
{{ states(‚input_number.hz_solltemperatur_wohnesszimmer‘) | float(0)
+ 2 }}
target:
entity_id: climate.hmip_bwth_000c9f298af21b
else: - service: climate.set_temperature
data:
temperature: „{{ states(‚input_number.hz_solltemperatur_wohnesszimmer‘) }}“
target:
entity_id: climate.hmip_bwth_000c9f298af21b
mode: single
- condition: numeric_state