Es gibt zahlreiche Smart Home Apps, die für nahezu jedes Gerät eine eigene Steuerung bereitstellen. In den meisten dieser Apps lassen sich mittlerweile individuelle Szenen erstellen, mit denen du für eine Gruppe von Geräten einen bestimmten Zustand festlegen kannst, den sie bei Aktivierung automatisch einnehmen. Szenen sind für viele Menschen vermutlich unnötiger Ballast, weil sie damit nichts anfangen können oder wollen. Und dann gibt es da zum Beispiel mich, der sie insbesondere für die heimische Beleuchtung exzessiv einsetzt.
Wenn es um Licht geht, gibt es aus meiner Sicht keinen Weg an Philips Hue vorbei:
- Die Leuchtmittel sind hochwertig. Ich habe seit über 7 Jahren noch Glühbirnen aus der ersten Generation im Einsatz.
- Die Steuerung in Home Assistant1 funktioniert perfekt.
- Philips Hue funkt mit ZigBee.
- Kein Cloudzwang2, alles wird lokal gesteuert.
- Verwendet man die originale Hue Bridge vom Hersteller, kann man die Philips Hue App benutzen und hat hierüber Zugriff auf die Lichtszenen-Galerie. Diese Szenen sehen einfach nur klasse aus.
Home Assistant Szenen#
Wenn du zur Steuerung deines smarten Zuhauses Home Assistant einsetzt, ist dir sicher bereits aufgefallen, dass du hier ebenfalls Szenen kreieren kannst. Falls du das noch nicht entdeckt hast, kannst du über den folgenden Link direkt zu den Einstellungen gelangen 😎.
Das Tolle an Szenen ist, dass du dir beliebig viele Snapshots deiner Geräte erstellen und immer wieder aufrufen kannst. Der Nachteil von Szenen ist, dass sie stateless sind, also keinen eigenen Zustand besitzen. Es ist zum Beispiel nicht möglich zu überprüfen, welche Szene gerade in einem Moment ausgeführt wird, um beispielsweise in Abhängigkeit dessen in bestimmten Situationen anders reagieren zu können.
Es wird Zeit für ein praxisnahes Beispiel.
Ausflug ins Wohnzimmer#
In unserem Wohnzimmer wird zur Abenddämmerung das Licht automatisch eingeschaltet. In kalten Jahreszeiten nehmen die Lampen darüber hinaus warme Farbtöne an, um einen Ausgleich zum rauen Wetter zu schaffen. Lampen können so viel mehr als nur Licht erzeugen: sie nehmen positiv Einfluss auf unsere Stimmung.
Schalten wir nun unseren Fernseher ein, wird das Licht gedimmt, damit eine noch gemütlichere Atmosphäre entsteht. Für all diese Umstände habe ich unterschiedliche Szenen gebaut, welche darüber hinaus täglich wechseln. Das klingt bisher recht unkompliziert, oder?
Wer regelmäßig an Smart Home Automatisierungen bastelt, wird mir jedoch sofort zustimmen, wenn ich behaupte: alltägliche Abläufe sind alles andere als einfach. Sie können extrem komplex sein. Vor allem, wenn Automatisierungen den Bedürfnissen von mehreren Menschen gleichzeitig gerecht werden sollen (Stichwort: Women Acceptance Factor3. Du wirst dieses Wort in meinen Smart Home Beiträgen noch öfter lesen).
Essen wir beispielsweise zu Abend, soll das Wohnzimmer (welches auch unseren Esstisch beherbergt) hell erleuchtet werden, also die Szene Essen aktiviert werden. Und nun kann es vorkommen, dass der Fernseher eingeschaltet wird. Du hast ja bereits gelesen, was in unserem Fall dann passiert: das Licht wird gedimmt, und wir essen plötzlich im Dunkeln.
Es erfordert im weiteren Verlauf eine manuelle Kurskorrektur durch uns, und das kann nerven: vor allem meine Frau. Und dann dauert es nicht mehr lange, bis ich genervt bin; du verstehst sicher. Mein Anspruch an Heimautomatisierung ist, dass sie intelligent genug agiert, um manuelle Interventionen überflüssig zu machen. Das steigert außerdem den WAF enorm - happy wife, happy life 😄.
Automatisierungen zur Intelligenz verhelfen#
Smart Home Automatisierungen machen dein Zuhause smarter, aber es ist wichtig, realistisch zu bleiben: sie sind nicht wirklich intelligent. Sie lösen unter bestimmten Umständen einfach nur eine Aktion aus, und wenn es eben lediglich bedeutet, jeden Tag um 18 Uhr das Licht einzuschalten. Macht häufig gar keinen Sinn. Und während der Essenszeit das Licht zu dimmen, nur weil der Fernseher eingeschaltet wird, ist eben weder smart, noch intelligent. Das ist ehrlich gesagt ziemlich dumm.
Also müssen wir hier ein bisschen nachhelfen. Wie eingangs erwähnt, sind Szenen stateless: du weißt also weder, ob eine Szene gegenwärtig aktiv ist, noch um welche es sich dabei handelt. Für mich ist es auch keine Option, alle Lampen einzeln auf bestimmte Farben oder Helligkeit zu überprüfen und zu schauen, ob die Parameter zu irgendeiner Szene passen. Denn meine Szenen sind kunterbunt, verwenden alle möglichen Helligkeitsstufen und sind daher schlichtweg nicht, oder eben nur mit höllischem Aufwand, nachverfolgbar.
Wie schön wäre es, wenn Home Assistant eine Funktion mitbringen würde, die uns hier unterstützen könnte? Normalerweise leite ich mit so einem Satz nun die zündende Lösung ein, in diesem Fall gibt es aber wirklich nichts. Zumindest fast nichts. Es gibt Trigger-basierte Template Sensors4! Die lösen zwar das eigentliche Problem nicht, jedoch lässt sich mit ihnen etwas bauen, was grundsätzlich intelligentere Entscheidungen möglich machen kann.
Mein Lösungsweg#
Nachdem wir nun die Herausforderung erörtert haben, möchte ich meine Lösung vorstellen. Hast du ein ähnliches Problem selbst lösen wollen und einen anderen Weg eingeschlagen? Lass es mich wissen, ich freue mich von dir zu hören!
Beobachtungen#
Um eine Herausforderung lösen zu können, müssen wir zunächst beobachten, wie das System in bestimmten Situationen reagiert.
Fast alle Automatisierungen schalten bei mir keine Lampen direkt ein. Sie aktivieren Szenen, in denen die eigentlichen Beleuchtungseinstellungen definiert sind. Also musste ich herausfinden, was in Home Assistant passiert, wenn eine Szene aktiviert wird. Hierbei habe ich beobachtet, dass die Szenen-Entität selbst das Aktivierungs-Datum als Zustand einnimmt. Das ist hilfreich, denn mit Zustandsänderungen können wiederum Aktionen ausgelöst werden 😁.
Ich habe allerdings sehr viele Szenen gebaut und müsste jede davon als Trigger-Bedingung verwenden. Würdest du nach dem Erstellen jeder neuen Szene daran denken, deinen Trigger anzupassen? Sehr gut! Ich jedoch leider nicht, daher ist das für mich kein gangbarer Weg. Und auf sämtliche Zustandsänderungen zu triggern, nur um dann überprüfen zu können, ob es ich dabei um eine Szene handelt, ist für mich ebenso keine gescheite Lösung. Zu viel Overhead.
Statt aktiv auf die Aktivierung einer Szene zu warten, habe ich mir in der Folge angesehen, wie eine Szene denn eigentlich aktiviert wird: über die Aktion scene.turn_on
. Und genau hier habe ich angesetzt, indem ich sämtliche Aufrufe dieser Aktion mitverfolge.
Trigger-basierter Template Sensor#
Ausgestattet mit diesem Wissen habe ich einen Trigger implementiert, der je einen Scene-History5-Sensor im Arbeits- und Wohnzimmer updaten soll. Das passiert im Detail, wenn eine Szene aktiviert wird:
- Die Aktion
scene.turn_on
wird verwendet - Die Variable
history
wird deklariert - Für Arbeits- und Wohnzimmer werden alle Szenen…
- abgefragt
- nach Last-Changed-Datum absteigend sortiert
- Die jeweiligen Zustände der Sensoren auf den Namen der Szene gesetzt
- Die Attribute
current
undhistory
befüllt
- trigger:
- platform: homeassistant
event: start
- platform: event
event_type: call_service
event_data:
domain: scene
service: turn_on
action:
- variables:
history: >
{% set areas = [
"arbeitszimmer",
"wohnzimmer" ] %}
{% set data = namespace(scenes=[]) %}
{% for area in areas %}
{% set history = area_entities(area)
| select("search", "^scene.")
| expand
| sort(attribute="last_changed", reverse=true)
| map(attribute="entity_id")
| list %}
{% set data.scenes = data.scenes + [history] %}
{% endfor %}
{{ dict(zip(areas, data.scenes)) }}
sensor:
- name: scene_history_arbeitszimmer
unique_id: sensor_scene_history_arbeitszimmer
state: >
{{ state_attr(history.arbeitszimmer[0], "name") }}
attributes:
current: "{{ history.arbeitszimmer[0] }}"
history: "{{ history.arbeitszimmer[1:] }}"
- name: scene_history_wohnzimmer
unique_id: sensor_scene_history_wohnzimmer
state: >
{{ state_attr(history.wohnzimmer[0], "name") }}
attributes:
current: "{{ history.wohnzimmer[0] }}"
history: "{{ history.wohnzimmer[1:] }}"
Ist ganz schön viel Template-Code geworden. Der Vorteil hierbei ist jedoch, dass nun mit vergleichsweise wenigen Zeilen weitere Räume hinzugefügt werden können. Man muss sich einfach nur alles schönreden können 😁.
Erläuterungen#
Der Teil, der die history
Variable mit Daten füllt, ist vermutlich am schwierigsten zu verstehen. Falls du nicht so tief in den technischen Details steckst, keine Sorge: wir gehen das jetzt Zeile für Zeile noch einmal durch.
{% set areas = [
"arbeitszimmer",
"wohnzimmer" ] %}
{% set data = namespace(scenes=[]) %}
An dieser Stelle werden die Räume (Areas) definiert, für die ich die Szenen abrufen möchte. Danach wird noch ein Namespace für den darauffolgenden Code reserviert.
{% for area in areas %}
Für alle Räume wiederholen…
{% set scenes = area_entities(area)
| select("search", "^scene.")
| expand
| sort(attribute="last_changed", reverse=true)
| map(attribute="entity_id")
| list %}
In diesem Befehl liegt die eigentliche Magie. Die Funktion area_entities
gibt dir alle Entitäten zurück, die einem bestimmten Raum zugeordnet sind. Diese Liste kann sehr lang werden, weswegen wir mit select
nur nach Entitäten suchen, die eine Szene verkörpern. Mit Hilfe von expand
werden die Entitäten-Objekte quasi ausgepackt, wir erhalten dadurch Zugriff auf ihre einzelnen Attribute, um mit sort
absteigend nach den letzten Änderungen zu sortieren. Da ich mich dazu entschieden habe, in den Sensoren nur die Entitäten-IDs zu speichern, verwerfen wir alle anderen Attribute mit dem map
Befehl. Schlussendlich speichern wir mit list
alle Ergebnisse als Liste.
{% set data.scenes = data.scenes + [scenes] %}
Speichert die lokale scenes
Variable in unserem Namespace.
{% endfor %}
{{ dict(zip(areas, data.scenes)) }}
Die Schleife ist an dieser Stelle durchgelaufen, wir verpacken die Ergebnisse nun in einem Dictionary, welches zugleich den Inhalt der history
Variable bildet.
Ergebnis#
Hier ist ein Beispiel, wie die fertig modellierten Daten meines Sensors für das Wohnzimmer am Ende aussehen:
state: Essen
attributes:
current: scene.wohnzimmer_essen
history:
- scene.wohnzimmer_tv_2
- scene.wohnzimmer_abend_4
- scene.wohnzimmer_hell
- scene.wohnzimmer_abend_2
- scene.wohnzimmer_abend_3
- scene.wohnzimmer_gedimmt
- scene.wohnzimmer_tv_1
- scene.wohnzimmer_konzentrieren
- ...
Diese Umsetzung muss man erst einmal sacken lassen. Darum möchte ich dir zum Verschnaufen kurz den Hinweis geben, dass Home Assistant mit einem tollen Tool ausgeliefert wird: den Entwicklerwerkzeugen. Gerade beim Bauen von Templates empfiehlt es sich, diese Werkzeuge rege zu nutzen; hier kann alles ausprobiert werden. Auch mein obiger Code 😄. Natürlich musst du ihn an deine Bedingungen anpassen, wie Raumnamen.
Abschlussarbeiten#
Nachdem wir die Template-Entitäten in den Einstellungen neu geladen haben, stehen die beiden Scene-History-Sensoren direkt bereit und werden getriggert, sobald Szenen in den jeweiligen Räumen aktiviert werden. Prima!
Sobald der Fernseher im Wohnzimmer eingeschaltet wird, überprüft die für das Dimmen verantwortliche Automatisierung in Zukunft, ob die Scene-History auf Essen
steht. Und wenn ja, wird das Licht einfach nicht gedimmt 😎.
- condition: not
conditions:
- condition: state
entity_id: sensor.scene_history_wohnzimmer
state: Essen
Dann kann ja in Zukunft der Haussegen nicht mehr schief hängen! Oder? Doch was, wenn das Licht ausgeschaltet wird? Bleibt die Scene-History dann auf Essen
stehen und sorgt das nicht wiederum in der Folge für weiteren Ärger?
Im nächsten Part zeige ich dir, wie du deinen neuen Trigger-basierten Template Sensor dazu bringst, auch auf ausgeschaltete Lampen zu reagieren.
Feature-Foto von Bilal Mansuri auf Unsplash
Home Assistant ist eine Open-Source-Plattform zur zentralen Steuerung und Automatisierung von Smart Home-Geräten. Sie ermöglicht benutzerdefinierte Automatisierungen und unterstützt zahlreiche Geräte, ohne auf Cloud-Dienste angewiesen zu sein. ↩︎
Viele Hersteller von Smart Home Geräten setzen auf ihre eigenen Cloud Services. Man kann nur mutmaßen, warum eine Internetverbindung für ihren Betrieb benötigt wird; Fakt ist jedoch, dass einige Geräte ohne funktionierende Internetverbindung ihren Dienst verweigern (bspw. die Roborock Saugroboter von Xiaomi). Darum ist Cloudzwang keine gute Sache. ↩︎
Women Acceptance Factor (WAF) beschreibt scherzhaft den Grad, in dem technische Lösungen, insbesondere im Smart Home-Bereich, von Frauen akzeptiert werden. Er wird oft genutzt um auszudrücken, wie gut eine technische Implementierung im Alltag ankommt und ob sie praktisch, einfach und ästhetisch ansprechend genug ist. ↩︎
Schau doch einmal in die Home Assistant Dokumentation rein, das die Template Sensors werden hier sehr gut erklärt. ↩︎
Mir ist kein besserer Name als Scene-History-Sensor eingefallen. Schlimmer noch ist die deutsche Übersetzung im Home Assistant UI: Szenenhistorie 🤢. Wenn du wohlklingendere Ideen hast, freue ich mich über deinen Hinweis. ↩︎