Zum Hauptinhalt springen

Last Motion Sensor

·629 Wörter·3 min·
Inhaltsverzeichnis
Dieser Beitrag enthält eine optimierte Methode zur Erstellung eines Last Motion Sensors, wie bereits im Post Room Based Presence mit Motion Sensoren erläutert. Dieser Sensor wurde auch im Beitrag Automatisch pausierender Media Player verwendet.

Home Assistant hat die Konfiguration für Template Sensoren überarbeitet und mich mit haufenweise Warnmeldungen überschüttet. Siehe: Deprecation of legacy template entities in 2025.12

Die Deprecation Warnings betrafen unter Anderem den Post Room Based Presence mit Motion Sensoren, was ich als Anlass genommen habe das Setup neu zu überdenken. Da ich vor kurzem arbeitsfrei geworden bin, ist die Zeit dafür vorhanden.

Ein Bild von Arno Dübel. Dem Schutzpatrin der Hedonisten und Hartzer.

Vorhaben

Befindet sich im trauten Eigenheim ein Bewegungssensor in jedem Raum, kann man über diese ermitteln, in welchem Raum zuletzt eine Bewegung erkannt wurde. In einem Single-Haushalt entspricht diese Information dem Raum, in dem man sich gerade aufhält. Diese Information kann zielführend genutzt werden, wie bereits im Post Room Based Presence mit Motion Sensoren erläutert wurde.

An meinem aktuellen Setup hat mir nie gefallen, dass ich auf eine zusätzliche Custom Component namens home-assistant-variables angewiesen war. Im Kern war dies immer eine Lösung, die zuverlässig funktioniert hat und mich vor der Auseinandersetzung mit Template Sensoren freigesprochen hat.

Template Sensoren nutzen eine sperrige Syntax aus der Hölle, die durch die Python Template Engine Jinja2 bereitgestellt wird. Im Home Assistant Forum gibt es herausstechende Planetenbürger wie Petro, die diese Syntax mit einer Leichtigkeit beherrschen, als würde man Pfannkuchen backen. Zu diesen Menschen zähle ich jedoch nicht. Nichtsdestotrotz habe ich noch einmal das Forum durchforstet und eine funktionierende Lösung in diesem Thread Quick sensor/template question - Last active motion sensor gefunden.

Aus einer vordefinierten Liste an Bewegungssensoren soll jener ermittelt werden, der als letztes den State on gemeldet hat. Die Bewegungssensoren sind naturgemäß als Binary Sensors in Home Assistant eingebunden, das sie lediglich die States on und off besitzen können. Bewegung wird detektiert oder eben nicht.

Als Beispiel eingesetzter Bewegungsmelder werden folgende Entities und Namen verwendet:

Entity Name Friendly Name
binary_sensor.hue_motion_kueche Hue Motion Küche
binary_sensor.hue_motion_schlafzimmer Hue Motion Schlafzimmmer
binary_sensor.hue_motion_wohnzimmer Hue Motion Wohnzimmer
binary_sensor.hue_motion_flur Hue Motion Flur

Last Motion Sensor

Der Code des Template Sensors macht folgendes:

  • Er definiert die Entity Names der Bewegungssensoren in einer Liste sensors.
  • Er ermittelt alle Entities in der Liste sensors, die den State on besitzen und speichert diese als eine Liste.
  • Wenn mehr als ein Bewegungssensor in dieser Liste den State on besitzt, wird der Name des zuletzt getriggerten Sensors zurückgegeben.
  • Für meinen persönlichen Fall habe ich noch einen regex_replace() gesetzt, der mir den Präfix Hue Motion aus dem Rückgabewert entfernt. Somit bleibt lediglich der Raumname über, bspw. Hue Motion Flur wird reduziert auf Flur.
  • Für jeden Raum wird ein Custom Icon definiert, das sich dynamisch anpasst, je nachdem wo zuletzt eine Bewegung registriert wurde.
template:
  - sensor:
      - name: last_motion
        state: >
          {%- set sensors = 'binary_sensor.hue_motion_flur', 'binary_sensor.hue_motion_kueche', 'binary_sensor.hue_motion_schlafzimmer', 'binary_sensor.hue_motion_wohnzimmer' %}
          {% set sensors_on = expand(sensors) | selectattr('state', 'eq', 'on') | map(attribute='name') | list %}
          {% if sensors_on | count > 0 %}
            {{ expand(sensors) | selectattr('state', 'eq', 'on') | sort(reverse=true, attribute="last_changed") | map(attribute='name') | list | first | default(none) | regex_replace(find='Hue Motion ', replace='') }}
          {% else %}
            {{ expand(sensors) | sort(reverse=true, attribute="last_changed") | map(attribute='name') | list | first | default(none) | regex_replace(find='Hue Motion ', replace='') }}
          {% endif %}
        icon: >
          {% if is_state('sensor.last_motion', 'Küche') %}
            mdi:food-variant
          {% elif is_state('sensor.last_motion', 'Wohnzimmer') %}
            mdi:sofa
          {% elif is_state('sensor.last_motion', 'Flur') %}
            mdi:cube-unfolded
          {% elif is_state('sensor.last_motion', 'Schlafzimmer') %}
            mdi:bed
          {% else %}
            mdi:account-question
          {% endif %}

Der Sensor ersetzt nahtlos das alte Setup, reduziert unnötige Komplexität und liefert identische Rückgabewerte, wie die alte Lösung mittels home-assistant-variables:

Resultat des Sensors in der HASS UI

Er kann für viele Automationen genutzt werden, bspw. wenn ein Media-Player bei aktiver Wiedergabe pausiert werden soll, wenn man den Raum verlässt oder aber, wenn das Licht in einem Raum nicht ausgeschaltet werden soll, wenn man sich darin aufhält.