Home Assistant Template Sensoren

 

Durch die Hilfe von Home-Assistant Templates können die Daten von verschiedenen Sensoren umgewandelt, kombiniert oder mit eigenen Formeln versehen werden. Templates ermöglichen das Erstellen von Logikblöcken für den Einsatz in eigenen Sensoren, Bedingungen oder für das Anpassen bestimmter Werte in Lovelance Cards. Als Syntax wird Jinja2 verwendet, eine voll funktionsfähigen Template-Engine für Python.

Wo können Templates verwendet werden?

Templates können in den folgenden Home-Assistant-Komponenten eingesetzt werden:

Entwicklerwerkzeuge

Neue Templates lassen sich am einfachsten unter Entwicklerwerkzeuge > TEMPLATE testen.

Wer gleichzeitig mehrere Template-Entwürfe erstellen möchte, kann dazu auch eine Markdown-Card verwenden:

Markdown-Card

Alternativ können Template-Entwürfe auch als Markdown Card in einem Lovelance-Dashboard gespeichert werden:

Wer einen neuen Sensor auf Basis eines Templates erstellen will, kann dies in den Einstellungen unter "Geräte & Diense", "HELFER ERSTELLEN" und "Template": 

Template-Sensor: Helfer

Ursprünglich wurden Template-Sensoren in der configuration.yaml-Datei hinterlegt. In aktuellen Home Assistant Versionen können die Templates komfortabel als Helfer in der Home Assistant Oberfläche angelegt werden. Die Helfer zeigen beim Erstellen bereits die berechneten Werte oder eventuelle Syntaxfehler.

Menüpunkt: Einstellungen, Helfer erstellen -> Template: 

Zur Auswahl stehen mehrere Optionen. Ich verwende meist entweder einen binären Sensor, also "Ein" und "Aus", oder für bestimmte Werte ein Template für einen Sensor:

Zur Erstellung, siehe auf dieser Seite: Template Beispiele

Automatisierungen

Die angelegten Template-Sensoren könnten in einer Automatisierung verwendet werden, oder alternativ bieten diese die Möglichkeit direkt einen Template-Block in den Auslösern oder Bedingungen zu hinterlegen:

Innerhalb der Automatisierungen können Templates als Auslöser, Bedingung und in den Bedingungen von Aktionen verwendet werden:

siehe auch: Home Assistant Automatisierung - Möglichkeiten & Basics

Template Beispiele

Um die Werte bestimmter Sensoren oder Variablen zu interpretieren, können diese in Jinja2 innerhalb von {{ und }} geschrieben werden. Das Setzen von Variablen kann mit folgender Syntax erfolgen:  {% set variable = 1 %}. Auch "if", "else", oder "else if" -Anweisungen können innerhalb von {% und %} interpretiert werden. Das Hinzufügen von Kommentaren ist innerhalb von {# und #} möglich.

Als konkretes Beispiel für einen Template-Sensor könnte aus dem Datum und der Uhrzeit für den nächsten Sonnenaufgang, die Uhrzeit als eigene Entität zur Verfügung gestellt werden. Der integrierte Sensor für den Sonnenaufgang steht in folgendem Format zur Verfügung:  2023-09-12T07:40:21.796007+00:00. Für das Extrahieren der Uhrzeit kann folgendes Template eingesetzt werden:

{{
as_timestamp(states.sun.sun.attributes.next_rising) | 
timestamp_custom('%H:%M')
}}

"as_timestamp" wandelt dabei den Wert ("states.") des Sensors "sun.sun.attributes.next_rising" in einen Unix-Timestamp um. Ein Pipe "|" an die Funktion "timestamp_custom" wandelt den Timestamp zurück in "Stunden":"Minuten": '%H:%M'. Wie bereits erwähnt kann das Template in den Entwicklerwerkzeugen getestet werden:

Eingesetzt als Template-Sensor, zeigt auch dieser eine Vorschau des Ergebnisses:

Beim Speichern des Template-Sensors wird ein neuer Sensor mit der ID: sensor.Name, hier "sensor.sonnenaufgang" angelegt und steht als eigene Entität in Home Assistant zur Verfügung. 

Template - Cheat Sheet

Hier ein paar Beispiel-Templates:

was Template
Sonnenaufgang als Text Stunden:Minuten
{{ as_timestamp(states.sun.sun.attributes.next_rising) | timestamp_custom(' %H:%M') | replace(" 0", "") }}
Sonnenuntergang als Text Stunden:Minuten
{{ as_timestamp(states.sun.sun.attributes.next_setting) | timestamp_custom(' %H:%M') | replace(" 0", "") }}
Sonne: Sonnenaufgang - Sonnenuntergang als Text
{{ as_timestamp(states.sun.sun.attributes.next_rising) | timestamp_custom(' %H:%M') | replace(" 0", "") }} - 
{{ as_timestamp(states.sun.sun.attributes.next_setting) | timestamp_custom(' %H:%M') | replace(" 0", "") }}
Tageslicht in Stunden pro Tag
{%set sr = (as_timestamp(states.sun.sun.attributes.next_rising) | timestamp_custom('%H:%M')).split(":") %}  
{%set ss = (as_timestamp(states.sun.sun.attributes.next_setting) | timestamp_custom('%H:%M')).split(":") %} 
{{ ((ss[0] | int * 60 + ss[1] | int - sr[0] | int * 60 + sr[1] | int) / 60) | round(2) }}
Test ob nach Sonnenaufgang
{{ as_timestamp(now()) | timestamp_custom('%H%M') | float  > (states.sun.sun.attributes.next_rising |as_timestamp) | timestamp_custom("%H%M", True) | float }}
Test ob 180 Minuten nach Sonnenaufgang
{{ as_timestamp(now() - timedelta(minutes=180))  | timestamp_custom('%H%M') | float  > (states.sun.sun.attributes.next_rising |as_timestamp) | timestamp_custom("%H%M", True) | float}}
Test ob nach Sonnenuntergang
{{ as_timestamp(now()) | timestamp_custom('%H%M') | float  > (states.sun.sun.attributes.next_setting |as_timestamp) | timestamp_custom("%H%M", True) | float }}
verbleibendes Tageslicht in Stunden
{% set now = (as_timestamp(now()) | timestamp_custom('%H:%M')) %}
{% set sr = (as_timestamp(states.sun.sun.attributes.next_rising) | timestamp_custom('%H:%M')) %}  
{% set ss = (as_timestamp(states.sun.sun.attributes.next_setting) | timestamp_custom('%H:%M')) %} 
{% set start = now if now > sr else sr %}
{% if now < ss %}
{{ (((ss.split(":")[0] | int * 60 + ss.split(":")[1] | int) - (start.split(":")[0] | int * 60 + start.split(":")[1] | int)) / 60) | round(2) }}
{% else %}
0
{% endif %}
Leistung (Watt) aus Strom (I) und Spannung (U)
{% set V = states('sensor.meter01_voltage_l1') | float %}
{% set A = states('sensor.meter01_current_l1') | float %}
{{ ( 0.9 * A * V) | round(0)}}
Über den Stromverbrauch der Heizungssteuerung -  gemessen mit einer Zigbee Steckdose - kann ich feststellen, welche Aktion die Heizung gerade durchführt.

Der folgende Sensor ändert den Status anhand des Stromverbrauchs der Heizungssteuerung und kann damit z.B. in einer Lovelance-Card als Information eingeblendet werden:

{% set value = states('sensor.heating_active_power') | float %}
          {{ "aus" if value < 10 else 
          "Pumpen" if value < 58 else 
          "Warmwasser" if value < 70 else 
          "Pumpen" if value < 125 else 
          "Heizen" }}
Zeit seit der letzten Statusänderung in Minuten länger als x Minuten (im Beispiel 30 Minuten)

 

Um festzustellen, wann der Status eines Sensors zuletzt geändert wurde, setze ich für meine Heizung folgendes Template ein.

{{
(((as_timestamp(now()) - 
as_timestamp(states.switch.relay_heizung_puffer_kalt.last_changed)) / 60) | int) 
  > 30
}} 

Das Template prüft, ob die letzte Statusänderung vor mehr als 30 Minuten ("> 30") stattgefunden hat. Ich verwende das Template in den Automatisierungen damit meine Heizung nicht kurz nach dem Einschalten durch eine bestimmte Statusänderung wieder deaktiviert wird.

 

"Nicht Verfügbar"- Wert vorgeben: 0

Um die Zahl 0 anstelle von "nicht verfügbar" für eine Entität zu verwenden, kann ein Standardwert, hier "0" für float verwendet werden. Die Variable verwendet den Standardwert, wenn die Umwandlung in float nicht erfolgreich war. 

{% set pumpen = states('sensor.heizung_pumpe_eg_active_power') | float(0)   %}
{{ pumpen  }}
Slow-Down-Changes
{% set previousvalue = states("sensor.pv_panels_energy_today_remaining") | float(remaining) %}
{% set maxchange = (((remaining - previousvalue) | abs) * 0.0020) + 0.001 %} {# 0.003 ~ max 10,8kW Änderung pro Stunde 
0.000277778 ~ 1kWh Änderung / h  geht immer ... #}
{% if states("sensor.weather_cloud_coverage_remaining_daylight_today_avg") | is_number %}
{% set sekSinceLastChange = as_timestamp(now()) | int -  as_timestamp(states.sensor.pv_panels_energy_today_remaining.last_changed) | int %}
{% set maxchange = maxchange * sekSinceLastChange %}
{% if sekSinceLastChange < 1 %}
{{ previousvalue }}
{% elif (previousvalue + maxchange ) < remaining %} 
{{ previousvalue + maxchange  }}
{% elif (previousvalue - maxchange) > remaining %}
{{ previousvalue - maxchange  }} 
{% else %}
{{ remaining  }}
{% endif %}
{% endif %}

Vorherigen Wert im Template-Sensor verwenden

Mithilfe des folgenden Templates kann ein Template-Sensor (hier sensor.lastavailablestate) den letzten Wert zurückgeben, der nicht "unavailable" war: 

{% if states('sensor.sometimes_unavailable')  != 'unavailable'%}
    {{ sensor.sometimes_unavailable }}
{% else %}
    {{ states('sensor.lastavailablestate') }}
{% endif %}

 

Preview Home Assistant Schnee-Erkennung PV-Anlage

Home Assistant Schnee-Erkennung PV-Anlage

erstellt: 22.01.2024 von Bernhard

Bei einer PV-Anlage steigt die Spannung mit der Anzahl der PV-Modulen, auch bei schlechten Lichtverhältnissen. Anders, wenn bestimmte Module teilweise oder komplett von Schnee bedeckt sind. Diese Tatsache habe ich mir zunutze gemacht und in Home Assistant eine Schnee-Erkennung zusammengestellt. Warum? Um die PV-Vorhersage für den nächsten Tag zu korrigieren, und die Steuerung für die Heizung entsprechend anzupassen. ... weiterlesen

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare


Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details