Zum Hauptinhalt springen

Aktivierung von Home Assistant Szenen verfolgen - Part 1

·1935 Wörter·10 min
Smart Home Guide Home Assistant Licht Sensor Szenen Template
Tobias Schulz
Autor
Tobias Schulz
고생 끝에 낙이 온다 · immer, weiter
Inhaltsverzeichnis

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:

  1. Die Leuchtmittel sind hochwertig. Ich habe seit über 7 Jahren noch Glühbirnen aus der ersten Generation im Einsatz.
  2. Die Steuerung in Home Assistant1 funktioniert perfekt.
  3. Philips Hue funkt mit ZigBee.
  4. Kein Cloudzwang2, alles wird lokal gesteuert.
  5. 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.
Philips Hue erfüllt sämtliche Voraussetzungen für ein Markenprodukt, neben dem guten Namen haben die Leuchtmittel nämlich auch einen stolzen Preis. Im Ausgleich hierfür machen sie jedoch verglichen zu anderen Herstellern sehr viel richtig.

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 😎.

Home Assistant Szenen

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!

Die folgenden Passagen setzen voraus, dass du dich zumindest etwas mit Home Assistant Automatisierungen und Templates auskennst. Ohne Basiswissen werden sie nur schwer zu greifen sein. Ich versuche natürlich trotzdem, alles etwas zu veranschaulichen und die Thematik verständlicher zu gestalten. Dennoch ist das eine komplexe Sache.

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:

  1. Die Aktion scene.turn_on wird verwendet
  2. Die Variable history wird deklariert
  3. Für Arbeits- und Wohnzimmer werden alle Szenen…
    1. abgefragt
    2. nach Last-Changed-Datum absteigend sortiert
  4. Die jeweiligen Zustände der Sensoren auf den Namen der Szene gesetzt
  5. Die Attribute current und history 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.

Home Assistant Entwicklerwerkzeuge

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


  1. 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. ↩︎

  2. 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. ↩︎

  3. 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. ↩︎

  4. Schau doch einmal in die Home Assistant Dokumentation rein, das die Template Sensors werden hier sehr gut erklärt. ↩︎

  5. 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. ↩︎

Verwandte Artikel

Aktivierung von Home Assistant Szenen verfolgen - Part 2
·1262 Wörter·6 min
Smart Home Guide Automatisierung Home Assistant Licht Sensor Szenen Trigger
Aktivieren und Deaktivieren von Szenen laufend mit einem Sensor verfolgen.
Eigener Strom mit Balkonkraftwerk
·906 Wörter·5 min
Smart Home Balkonkraftwerk Energie Home Assistant Strom
Selbst Strom erzeugen und dabei Geld sparen? Ein kleiner Einblick.
Paperless Guide: Customization
·815 Wörter·4 min
Paperless Automatisierung Guide Paperless Python Workflow
Das papierlose Büro mit Scripting monitoren und verbessern.