
Profi · Kapitel 13 von 14
Jinja2 Templates in Home Assistant
Templates sind der Schlüssel zu dynamischen Automatisierungen: Werte berechnen, Strings verketten, Bedingungen prüfen – alles direkt in Home Assistant, ohne externe Skripte.
Affiliate-Links: Als Amazon-Partner verdiene ich an qualifizierten Verkäufen – für dich bleibt der Preis gleich.
Das Wichtigste in Kürze
3 Kernaussagen für Schnellleser
Jinja2 ist die eingebaute Template-Sprache in Home Assistant – keine Installation nötig, sofort nutzbar. Mit drei Template-Typen (Sensor, Binary Sensor, Trigger) und über 120 Filtern wandelst du rohe Sensorwerte in berechnete Größen, erkennst komplexe Zustände und baust Automationen, die auf Berechnungen statt auf einzelne Sensorwerte reagieren. Wer vorausschauende Automationen bauen will, kommt an Jinja2 nicht vorbei.
- Jinja2-Templates sind in Home Assistant fest eingebaut und erfordern keine zusätzliche Installation.
- Es gibt drei Haupt-Template-Typen: Template-Sensoren, Binary-Sensoren und Trigger-basierte Templates.
- Über 120 Filter stehen bereit, um rohe Sensordaten live in berechnete Werte umzuwandeln.
KI-generiertWas ist Jinja2 und warum braucht man es im Smart Home?
Jinja2 ist eine Template-Engine, die ursprünglich für das Python-Webframework Flask entwickelt wurde. Home Assistant nutzt sie als eingebettete Sprache, um dynamische Werte zu berechnen. Statt einen Sensor nur abzufragen, kannst du mit Jinja2 seinen Wert umrechnen, mit anderen Werten kombinieren oder als Bedingung in Automatisierungen verwenden. Ohne Jinja2 wärst du auf die rohen Sensorwerte beschränkt – mit Jinja2 werden diese Werte zu flexiblen Bausteinen.
Template-Sensoren: Werte berechnen
Ein Template-Sensor nimmt den Wert eines oder mehrerer anderer Sensoren und berechnet daraus einen neuen Wert. Das geht von einfachen Umrechnungen (Fahrenheit zu Celsius) bis zu komplexen Formeln, die mehrere Datenquellen kombinieren.
Grundstruktur
Ein Template-Sensor benötigt mindestens zwei Attribute: den state-Wert (das Jinja2-Template, das den Sensorwert berechnet) und optional unit_of_measurement für die Einheit. Das Template wird in doppelten geschweiften Klammern geschrieben: {{ }}. Du kannst auf jeden Zustand im System zugreifen, indem du states('sensor.aussentemperatur') verwendest.
Praktisches Beispiel: Taupunkt nach Magnus-Formel
Der Taupunkt ist die Temperatur, bei der Luftfeuchtigkeit kondensiert – wichtig für Schimmelprävention. Die Magnus-Formel lautet:
γ(T, RH) = (a × T) / (b + T) + ln(RH / 100)
Taupunkt Td = (b × γ) / (a − γ)
Konstanten: a = 17,625 · b = 243,04 °C
Als YAML-Template-Sensor:
template:
- sensor:
- name: "Taupunkt Badezimmer"
unit_of_measurement: "°C"
state: >
{% set T = states('sensor.badezimmer_temperatur') | float(0) %}
{% set RH = states('sensor.badezimmer_feuchtigkeit') | float(0) %}
{% set a = 17.625 %}
{% set b = 243.04 %}
{% set gamma = (a * T) / (b + T) + (RH / 100 | log) %}
{{ (b * gamma / (a - gamma)) | round(1) }}
Praktisches Beispiel: Stromkosten berechnen
Wenn du einen Stromzähler-Sensor hast und deinen aktuellen Strompreis kennst (z.B. 32 ct/kWh Festpreis oder dynamisch je nach Tageszeit), erstellst du einen Template-Sensor, der die laufenden Kosten in Euro berechnet:
template:
- sensor:
- name: "Aktuelle Stromkosten"
unit_of_measurement: "€"
state: >
{% set kwh = states('sensor.strom_zaehlerstand') | float(0) %}
{% set preis = 0.32 %}
{{ (kwh * preis) | round(2) }}
Pro-Tipp
Teste deine Templates immer im Entwicklerwerkzeug unter "Template", bevor du sie in die Konfiguration schreibst. Dort kannst du Templates in Echtzeit ausprobieren und sofort sehen, ob das Ergebnis stimmt – ohne Home Assistant neu zu starten.
KI-generiertDas Wesentliche in Kürze
Die wichtigsten Filter: float, int, round und mehr
Filter sind das Werkzeug, um Werte zu transformieren. Sie werden mit dem Pipe-Symbol (|) angewendet und können verkettet werden. Hier sind die Filter, die du am häufigsten brauchst:
float und int – Sichere Typumwandlung
Home Assistant speichert alle Zustände als Strings. Wenn du mit einem Sensorwert rechnest, musst du ihn zuerst in eine Zahl umwandeln. | float wandelt in eine Kommazahl um, | int in eine Ganzzahl. Der Clou: Du kannst einen Fallback-Wert übergeben – | float(0) liefert 0, wenn der Sensorwert nicht umgewandelt werden kann (z.B. weil der Sensor "unavailable" meldet). Ohne Fallback würde das Template fehlschlagen und die gesamte Automatisierung stoppen.
round – Dezimalstellen kontrollieren
Sensoren liefern oft mehr Nachkommastellen als nötig. | round(1) rundet auf eine Nachkommastelle, | round(0) auf eine ganze Zahl. Das ist sinnvoll, wenn der Wert im Dashboard angezeigt wird oder als Trigger-Schwelle dient – niemand braucht 21.437291 Grad als Sollwert.
Weitere nützliche Filter
-
default('Wert'): Liefert einen Standardwert, wenn der Ausdruck undefined oder none ist. Ideal als Sicherheitsnetz. -
string: Wandelt einen Zahlenwert explizit in einen String um. -
trim: Entfernt führende und abschließende Leerzeichen. -
replace('alt', 'neu'): Ersetzt Zeichenfolgen innerhalb eines Strings. -
regex_replace: Ersetzt mit regulären Ausdrücken – mächtig, aber komplexer. -
multiply(X): Multipliziert den Wert mit X – praktisch für Einheitenumrechnungen.Wusstest du schon?
Du kannst Filter verketten:
{{ states('sensor.temp') | float(0) | round(1) }}wandelt zuerst sicher in eine Zahl (mit Fallback 0) und rundet dann auf eine Nachkommastelle. Die Reihenfolge ist entscheidend – immer zuerst float, dann round, nie umgekehrt.
Template Binary Sensors: Komplexe Zustände erkennen
Ein Template Binary Sensor hat nur zwei Zustände: on oder off. Er eignet sich für Ja-Nein-Entscheidungen, die von mehreren Bedingungen abhängen. Im Gegensatz zu einem normalen Sensor definierst du nicht den Wert, sondern die Bedingung, unter der der Sensor "on" wird.
Beispiel: Schimmelgefahr erkannt
Schimmelrisiko steigt bei relativer Luftfeuchtigkeit dauerhaft über 65–80 % (materialabhängig) und wenn die Raumtemperatur nahe am Taupunkt liegt. Mit dem Taupunkt-Sensor aus dem Abschnitt oben baust du einen Binary Sensor, der "on" wird, wenn beide Bedingungen gleichzeitig erfüllt sind:
template:
- binary_sensor:
- name: "Schimmelgefahr Badezimmer"
device_class: moisture
state: >
{% set rh = states('sensor.badezimmer_feuchtigkeit') | float(0) %}
{% set temp = states('sensor.badezimmer_temperatur') | float(0) %}
{% set taupunkt = states('sensor.taupunkt_badezimmer') | float(0) %}
{{ rh > 65 and temp < taupunkt + 3 }}
Dieser Sensor kann dann eine Benachrichtigung auslösen ("Lüften!") oder automatisch die Lüftungsanlage aktivieren.
Beispiel: Jemand ist nachts unterwegs
Du kombinierst einen Bewegungsmelder, die Uhrzeit und den Anwesenheitsstatus: Wenn der Bewegungsmelder aktiv ist UND es zwischen 23:00 und 06:00 Uhr ist UND jemand zu Hause ist, dann ist jemand nachts unterwegs. Das kann genutzt werden, um automatisch ein Nachtlicht mit Dimmstufe zu aktivieren oder eine Benachrichtigung zu senden, wenn niemand zu Hause sein sollte (mögliche Einbruch-Situation).
Pro-Tipp
Gib deinem Template Binary Sensor immer ein aussagekräftiges device_class-Attribut – zum Beispiel
moisturefür Feuchtigkeitssensoren oderoccupancyfür Anwesenheitssensoren. Das sorgt für die richtigen Icons und Farbcodierungen im Dashboard.
Template-Triggers: Automatisierungen auf berechneten Werten
Template-Triggers erweitern die Trigger-Möglichkeiten von Automatisierungen erheblich. Während normale State-Trigger auf einen einzelnen Sensorwert reagieren, kann ein Template-Trigger eine beliebige Jinja2-Bedingung als Trigger verwenden. Das Template wird bei jeder Zustandsänderung ausgewertet – wenn sich das Ergebnis von false auf true ändert, wird die Automatisierung ausgelöst.
Beispiel: Energiepreis unter Schwellenwert
Du hast einen dynamischen Energiepreis-Sensor und willst die Waschmaschine starten, wenn der Preis unter 0,25 Euro/kWh fällt:
automation:
- alias: "Waschmaschine bei günstigem Strompreis starten"
trigger:
- platform: template
value_template: >
{{ states('sensor.strompreis_aktuell') | float(99) < 0.25 }}
action:
- service: switch.turn_on
target:
entity_id: switch.waschmaschine
So nutzt du günstige Strompreisspitzen automatisch – ohne manuell den Preis zu beobachten.
Beispiel: Komfort-Schwelle überschritten
Du berechnest einen Komfort-Index aus Temperatur, Luftfeuchtigkeit und CO2-Gehalt. Wenn der Index einen bestimmten Wert unterschreitet, wird ein Template-Trigger aktiv und startet automatisch die Lüftung. Der Clou: Die Automatisierung reagiert auf einen berechneten Wert, nicht auf einzelne Sensoren – die Logik steckt im Template, nicht in der Automation.
Wusstest du schon?
Template-Triggers werden bei jeder Zustandsänderung aller referenzierten Entitäten neu ausgewertet. Wenn dein Template drei Sensoren referenziert, wird es ausgewertet, sobald sich einer der drei ändert. Das bedeutet: Du musst keinen bestimmten Trigger-Sensor angeben – das System ermittelt die Abhängigkeiten automatisch.
Nützliche Template-Snippets
Hier sind einige bewährte Snippets, die du direkt in deine Konfiguration übernehmen kannst:
Sonnenstand-basierte Beschattung
Verwende den Sun-Sensor, um zu berechnen, ob die Sonne durch ein bestimmtes Fenster scheint. Du kombinierst die Elevation (Höhenwinkel) mit dem Azimuth (Seitwinkel) und der Fensterorientierung deines Hauses. Wenn die Elevation über 20 Grad und der Azimut im Bereich des Südfensters liegt, wird die Jalousie automatisch heruntergefahren. So vermeidest du unnötige Aufheizung im Sommer.
Batterieladezustand überwachen
Ein Template-Sensor, der alle Batteriesensoren durchläuft und die Anzahl der Geräte mit unter 20 % Ladung zählt:
template:
- sensor:
- name: "Geräte mit schwacher Batterie"
unit_of_measurement: "Geräte"
state: >
{{ states.sensor
| selectattr('attributes.device_class', 'eq', 'battery')
| map(attribute='state')
| map('float', 100)
| select('lt', 20)
| list
| count }}
Zeitdifferenz berechnen
Wie lange ist das Fenster schon offen? Mit state_attr und dem Attribut "last_changed" berechnest du die Zeitdifferenz zum aktuellen Zeitpunkt. Das Template liefert die Dauer in Minuten, die du in einer Automatisierung verwendest: "Wenn Fenster länger als 30 Minuten offen, sende Erinnerung."
Pro-Tipp
Komplexe Templates auslagern: Wenn ein Template mehr als 5-6 Zeilen hat, definiere es als Template-Sensor und referenziere den Sensor in der Automatisierung. Das macht die YAML-Dateien lesbarer und den Template-Sensor im Dashboard sichtbar – was das Debugging deutlich erleichtert.
Hardware-Empfehlung: Mit dieser Kombination startest du
Jinja2 ist eingebaut – du brauchst keine extra Hardware dafür. Aber für die Beispiele in diesem Artikel brauchst du eine laufende Home Assistant Instanz. Wenn du kompakt starten willst: Der Home Assistant Green(öffnet in neuem Tab) (~120 €, fertig eingerichtet, einfach anstecken). Wenn du Zigbee-Sensoren (z.B. Temperatur- und Feuchtigkeitssensoren für den Taupunkt-Sensor) einbinden willst, brauchst du zusätzlich einen Zigbee-Stick. Mit dieser Kombination kannst du alle Beispiele aus diesem Artikel direkt umsetzen.
Fazit: Jinja2 ist die Grundlage für smarte Logik
Jinja2 ist keine optionale Erweiterung – es ist die Grundlage für jedes nicht-triviale Smart-Home-Setup. Über 120 Filter, drei Template-Typen, keine Installation. Der Einstieg gelingt mit Template-Sensoren (Werte umrechnen, z.B. Taupunkt nach Magnus-Formel) und Binary-Sensoren (Zustände erkennen, z.B. Schimmelgefahr). Wer komplexe Logik braucht, nutzt Template-Triggers – Automationen, die auf berechneten Werten statt auf einzelnen Sensoren reagieren.
Häufig gestellte Fragen
Wie teste ich ein Jinja2-Template, bevor ich es in die Konfiguration schreibe?
Was ist der Unterschied zwischen Template-Sensor und Template-Binary-Sensor?
Brauche ich für Jinja2 eine zusätzliche Integration?
Kann ich komplexe Templates auslagern?
Wie gehe ich mit 'unavailable'-Sensorwerten um?
Passende Tools