Fensterautomation

Fenster steuert Heizkörper

Wie ich schon in meinem Artikel über mein Smarthomesetup geschrieben habe, sind die Automationen das, was ein Smarthome erst smart macht. Hier beschreibe ich, wie ich den Heizkörper herunterregle, wenn das Fenster geöffnet wird und wieder zurückstelle, wenn das Fenster geschlossen wird.

Update vom 13.01.2021: Mittlerweile lasse ich die Automation nicht mehr über Node-Red laufen, sondern nutze dafür die in Home Assistant eingebauten Automationen.

Beteiligte Komponenten

Das Fenster wird mit einem Xiaomi Aqara Tür-/Fensterkontakt überwacht. Der sendet den Status per Zigbee an den Conbee Stick. Der Conbee ist per Deconz in Home Assistant eingebunden.

Xiaomi Aqara Tür-/Fensterkontakt

Am Heizkörper ist ein Homematic Heizkörperthermostat montiert. Als Homematiczentrale läuft bei mir ein Raspberry Pi mit Raspberrymatic. Die Thermostate stehen immer auf manuell, weil sie ausschließlich über Home Assistant gesteuert werden.

Homematic Thermostat

Die Absenktemperatur wird über eine input_number Entity eingestellt.

input_number

Automation in Home Assistant

Ich habe für jedes Fenster eine Automation erstellt. Die Automation läuft im Modus Neu Starten, weil ich eine Warten-Aktion verwende und gegebenenfalls noch laufende Instanzen der Automation so abgebrochen werden.

Automation erstellen

Der Auslöser ist ganz einfach: Wenn der Fensterkontakt den Zustand zu on wechselt, ist das Fenster geöffnet und die Automation soll starten.

Auslöser einstellen

Ich habe hier noch eine Bedingung eingefügt, dass meine Heizungsanlage laufen muss. Wenn im Sommer die Heizung ausgeschaltet ist, soll die Automation nicht am Heizkörper rumdrehen.

optionale Bedingung

Nun folgen die Aktionen, die ausgeführt werden sollen. Als erstes wird eine temporäre Szene erstellt, in der der Zustand des Thermostaten gespeichert wird. Dafür wird der Dienst scene.create aufgerufen und eine scene_id sowie die Entities übergeben.

Als nächstes wird der Dienst climate.set_temperature aufgerufen. Die Temperatur ist nicht fest eingetragen, sondern wird mit Hilfe eines Templates aus dem input_number-Helfer ausgelesen.

Aktionen Teil 1

Danach wird eine Auf Auslöser warten Aktion gestartet, die die Automation pausiert bis der Fensterkontakt wieder geschlossen meldet. Es ist kein Timeout eingetragen, so dass die Automation theoretisch ewig aktiv bleibt.

Wenn das Fenster wieder geschlossen ist, folgt als letzte Aktion das Aktivieren der vorher gespeicherten Szene.

Aktionen Teil 2

Hier noch die Automation als YAML zum Importieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
alias: Fenster Büro
description: ''
trigger:
  - platform: state
    entity_id: binary_sensor.fenster_buero
    to: 'on'
condition:
  - condition: state
    entity_id: binary_sensor.vicare_heizkreisaktiv
    state: 'on'
action:
  - service: scene.create
    data:
      scene_id: buero_snapshot
      snapshot_entities:
        - climate.00201a49a039a4
  - service: climate.set_temperature
    data:
      temperature: '{{ states(''input_number.temperatur_niedrig'') }}'
    entity_id: climate.00201a49a039a4
  - wait_for_trigger:
      - platform: state
        entity_id: binary_sensor.fenster_buero
        to: 'off'
  - scene: scene.buero_snapshot
mode: restart

NodeRed (nicht mehr genutzt)

Die Automation ist in NodeRed umgesetzt und besteht aus sechs Nodes.

Kompletter Flow

Die state node „Fenster“ reagiert auf einen Zustandswechsel des Fensterkontakts.

Fensterzustand

Die switch node verzweigt je nach Zustand in den oberen oder unteren Weg. Der Binäre Sensor des Fensterkontakts hat den Zustand on, wenn das Fenster geöffnet ist, und off, wenn das Fenster geschlossen ist.

Verzweigung nach Zustand

Wenn das Fenster geöffnet wurde, wird als erstes der aktuelle Zustand des Thermostat mit der call service node in einer temporären Szene gespeichert. Im Data Feld muss der Name der Szene und eine Liste der zu speichernden Entities übergeben werden.

1
2
3
4
5
6
{
	"scene_id": "thomas_snapshot",
	"snapshot_entities": [
		"climate.0012999395e750"
	]
}

Zustand abspeichern

Als nächstes wird der Wert der input_number Entity mit einer current state node ausgelesen.

input_number lesen

Zuletzt wird der Thermostat mit einer call service node auf den ausgelesenen Wert gesetzt. Dafür wird im Data Feld {{payload}} als Template verwendet.

1
2
3
{
	"temperature": {{payload}}
}

Thermostat setzen

Beim Schließen des Fensters wird die vorher gespeicherte Szene mit einer weiteren call service node aktiviert. Hier muss nur der Name der Szene im Data Feld übergeben werden.

1
2
3
{
	"entity_id": "scene.thomas_snapshot"
}

Thermostat wiederherstellen

Solch einen Flow gibt es für jedes Zimmer, in dem ein smarter Thermostat montiert ist. Der Vorteil dieser Methode mit temporärer Szene liegt in der Erweiterbarkeit. Wenn weitere Entities berücksichtigt werden sollen, müssen sie nur an einer Stelle hinzugefügt werden.

Hier noch der komplette Flow zum importieren:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
[
	{
		"id": "d302a18c.b4a5c",
		"type": "api-call-service",
		"z": "e0fe8a5c.1c4ed8",
		"name": "Temperatur speichern",
		"server": "db71ae1a.4969e",
		"version": 1,
		"debugenabled": false,
		"service_domain": "scene",
		"service": "create",
		"entityId": "",
		"data": "{\"scene_id\":\"thomas_snapshot\",\"snapshot_entities\":[\"climate.0012999395e750\"]}",
		"dataType": "json",
		"mergecontext": "",
		"output_location": "",
		"output_location_type": "none",
		"mustacheAltTags": false,
		"x": 620,
		"y": 1040,
		"wires": [
			[
				"2ba89685.0924aa"
			]
		]
	},
	{
		"id": "68ffd494.662f3c",
		"type": "server-state-changed",
		"z": "e0fe8a5c.1c4ed8",
		"name": "Fenster",
		"server": "db71ae1a.4969e",
		"version": 1,
		"exposeToHomeAssistant": false,
		"haConfig": [
			{
				"property": "name",
				"value": ""
			},
			{
				"property": "icon",
				"value": ""
			}
		],
		"entityidfilter": "binary_sensor.tur_thomas",
		"entityidfiltertype": "exact",
		"outputinitially": false,
		"state_type": "str",
		"haltifstate": "",
		"halt_if_type": "str",
		"halt_if_compare": "is",
		"outputs": 1,
		"output_only_on_state_change": true,
		"x": 100,
		"y": 1060,
		"wires": [
			[
				"8c0ea6fb.5a5d08"
			]
		]
	},
	{
		"id": "8c0ea6fb.5a5d08",
		"type": "switch",
		"z": "e0fe8a5c.1c4ed8",
		"name": "",
		"property": "payload",
		"propertyType": "msg",
		"rules": [
			{
				"t": "eq",
				"v": "on",
				"vt": "str"
			},
			{
				"t": "eq",
				"v": "off",
				"vt": "str"
			}
		],
		"checkall": "true",
		"repair": false,
		"outputs": 2,
		"x": 310,
		"y": 1060,
		"wires": [
			[
				"d302a18c.b4a5c"
			],
			[
				"e5f92e8f.b86af"
			]
		]
	},
	{
		"id": "4acbf5b0.7c7bbc",
		"type": "api-call-service",
		"z": "e0fe8a5c.1c4ed8",
		"name": "Temperatur setzen",
		"server": "db71ae1a.4969e",
		"version": 1,
		"debugenabled": false,
		"service_domain": "climate",
		"service": "set_temperature",
		"entityId": "climate.0012999395e750",
		"data": "{\"temperature\": {{payload}}}",
		"dataType": "json",
		"mergecontext": "",
		"output_location": "",
		"output_location_type": "none",
		"mustacheAltTags": false,
		"x": 1050,
		"y": 1040,
		"wires": [
			[]
		]
	},
	{
		"id": "e5f92e8f.b86af",
		"type": "api-call-service",
		"z": "e0fe8a5c.1c4ed8",
		"name": "Temperatur zurücksetzen",
		"server": "db71ae1a.4969e",
		"version": 1,
		"debugenabled": false,
		"service_domain": "scene",
		"service": "turn_on",
		"entityId": "scene.thomas_snapshot",
		"data": "{\"entity_id\":\"scene.thomas_snapshot\"}",
		"dataType": "json",
		"mergecontext": "",
		"output_location": "",
		"output_location_type": "none",
		"mustacheAltTags": false,
		"x": 630,
		"y": 1100,
		"wires": [
			[]
		]
	},
	{
		"id": "2ba89685.0924aa",
		"type": "api-current-state",
		"z": "e0fe8a5c.1c4ed8",
		"name": "temp_low",
		"server": "db71ae1a.4969e",
		"version": 1,
		"outputs": 1,
		"halt_if": "",
		"halt_if_type": "str",
		"halt_if_compare": "is",
		"override_topic": false,
		"entity_id": "input_number.temperatur_niedrig",
		"state_type": "num",
		"state_location": "payload",
		"override_payload": "msg",
		"entity_location": "data",
		"override_data": "msg",
		"blockInputOverrides": false,
		"x": 840,
		"y": 1040,
		"wires": [
			[
				"4acbf5b0.7c7bbc"
			]
		]
	},
	{
		"id": "db71ae1a.4969e",
		"type": "server",
		"z": "",
		"name": "Home Assistant",
		"legacy": false,
		"addon": true,
		"rejectUnauthorizedCerts": true,
		"ha_boolean": "y|yes|true|on|home|open",
		"connectionDelay": true,
		"cacheJson": true
	}
]
updatedupdated2021-01-132021-01-13