Irgendwann reichen feste Werte nicht mehr. Du willst nicht "Licht auf 60 Prozent", sondern "Licht abhängig von der Helligkeit draußen". Nicht "Benachrichtigung: Fenster offen", sondern "Benachrichtigung: Fenster im Bad seit 12 Minuten offen". Genau dafür gibt es Templates.
Templates sind kleine Code-Schnipsel in der Jinja-Syntax, die Home Assistant zur Laufzeit auswertet. Sie lesen Zustände aus, rechnen damit und liefern das Ergebnis dort ab, wo du es brauchst: in Automationen, Benachrichtigungen oder eigenen Sensoren. Im Video gehe ich die Syntax am Template-Editor durch, hier die wichtigsten Bausteine zum Nachschlagen. Übrigens: Wie man Jinja korrekt ausspricht, weiß ich bis heute nicht sicher. Dschindscha, Ginger, irgendwas dazwischen. Zum Glück ist das der Sprache egal.
Die Grundsyntax
Ein Template steht in doppelten geschweiften Klammern. Alles dazwischen wird ausgewertet, der Rest bleibt normaler Text. Die Funktionen, die du ständig brauchst:
| Ausdruck | Liefert | Beispiel |
|---|---|---|
states('sensor.x') | den Zustand als Text | states('sensor.innentemperatur') → "21.5" |
is_state('light.x', 'on') | wahr oder falsch | für Bedingungen |
state_attr('climate.x', 'temperature') | ein Attribut | die Zieltemperatur eines Thermostats |
now() | aktuelles Datum und Uhrzeit | für Zeitvergleiche |
Die häufigste Fehlerquelle ist dabei erstaunlich banal: eine vergessene Klammer. Ein Template beginnt mit zwei geschweiften Klammern und endet mit zwei geschweiften Klammern. Fehlt eine davon, ist die Syntax kaputt und es passiert gar nichts.
Die zweite Stolperfalle: states() liefert immer Text, auch bei Zahlen. Warum das wichtig ist, merkst du beim ersten Rechenversuch. Zwei Texte lassen sich nicht addieren, aus "10" plus "10" macht Jinja im Zweifel "1010", weil es die beiden Texte einfach aneinanderhängt. Bevor du rechnest, hängst du deshalb den Filter | float(0) an. Der wandelt den Text in eine Zahl um, die 0 ist der Notfallwert, falls der Sensor gerade nicht verfügbar ist.
Filter sind überhaupt das Jinja-Konzept, das du dir merken solltest: Mit dem senkrechten Strich reichst du einen Wert weiter, etwa | round(1) zum Runden oder | lower für Kleinschreibung. Filter lassen sich auch verketten. | float(0) | round(1) macht erst eine Zahl daraus und rundet sie dann auf eine Nachkommastelle.
Der Template-Editor: dein Spielplatz
Bevor du ein Template in eine Automation einbaust, teste es. Unter Entwicklerwerkzeuge → Template gibt es einen Editor, der links dein Template nimmt und rechts live das Ergebnis zeigt. Tippfehler, falsche Entity-Namen, Text statt Zahl: All das siehst du hier sofort, ohne dass irgendwo eine Automation kaputt geht.
Der Editor bringt sogar eigene Beispiele mit, wenn du den Tab zum ersten Mal öffnest. Und oben findest du Links zur offiziellen Template-Dokumentation. Dort steht jeder Filter und jede Funktion, die Home Assistant kennt. Das ist deutlich mehr, als du je brauchen wirst, aber gut zu wissen, wo es steht.
Mein Tipp für die Praxis: Öffne die Entwicklerwerkzeuge parallel in einem zweiten Browser-Tab und filtere unter Zustände nach deiner Entität. Dann siehst du Zustand und Attribute im Original und merkst sofort, wenn dein Template etwas anderes behauptet. Mein Standard-Workflow ist immer derselbe: Template im Editor bauen, mit echten Werten prüfen, dann erst per Copy-Paste in die Automation übernehmen.
An die Attribute kommst du auch ran
Eine Entität hat einen Zustand und meistens mehrere Attribute. Bei einem Temperatursensor steckt im Zustand die 21.5, in den Attributen die Einheit und der Anzeigename. Oft liegt der spannende Wert aber gar nicht im Zustand, sondern in einem Attribut. Dann nimmst du state_attr() statt states(): erst die Entität, dann durch Komma getrennt der Attributname.
Ein Beispiel aus dem Video, der Sonnenstand. Die Entität sun.sun hat als Zustand nur "über dem Horizont" oder "unter dem Horizont". Der Winkel, in dem die Sonne gerade steht, liegt im Attribut:
{{ state_attr('sun.sun', 'azimuth') | round(1) }}Auch hier funktionieren alle Filter wie gewohnt. Welche Attribute eine Entität hat, siehst du in den Entwicklerwerkzeugen unter Zustände.
Templates im Einsatz: der Template-Sensor
Der häufigste Einsatzort neben Benachrichtigungen ist der Template-Sensor: eine eigene Entity, deren Wert aus anderen Entities berechnet wird. Ein Beispiel aus der Praxis, die Differenz zwischen drinnen und draußen:
1template:
2 - sensor:
3 - name: "Temperaturdifferenz"
4 unit_of_measurement: "°C"
5 state: >
6 {{ (states('sensor.innentemperatur') | float(0)
7 - states('sensor.aussentemperatur') | float(0))
8 | round(1) }}Dieser Sensor taucht wie jeder andere im System auf. Du kannst ihn ins Dashboard legen, in Automationen als Auslöser nutzen oder seinen Verlauf anschauen. Die Berechnung lebt an einer Stelle statt in fünf Automationen. Wie du den Block in deine Konfiguration einbaust, erklärt der YAML-Guide, und ein komplettes Praxisbeispiel mit mehreren Template-Sensoren findest du im Snippet zu den Tintenfüllständen des Druckers.
Das > hinter state: ist übrigens reines YAML: Es leitet einen mehrzeiligen Wert ein, damit längere Templates lesbar bleiben.
Wenn-dann direkt im Template
Jinja kann auch verzweigen. Mit {% if %} prüfst du eine Bedingung und gibst je nach Ergebnis etwas anderes aus. Das brauchst du immer dann, wenn ein roher Zustand für Menschen nicht lesbar genug ist. Im Video habe ich das am Rasenmäher gezeigt, der im Winter naturgemäß wenig zu tun hat:
{% if is_state('lawn_mower.rasenmaeher', 'mowing') %}
Der Mäher ist unterwegs.
{% else %}
Der Mäher steht in der Station.
{% endif %}Beachte den Unterschied in den Klammern: Logik wie if, else und endif steht in geschweifter Klammer mit Prozentzeichen, die reine Ausgabe in doppelten geschweiften Klammern. Das {% endif %} am Ende wird gern vergessen, ohne läuft es nicht.
Variablen sparen Tipparbeit
Sobald du denselben Wert mehrfach brauchst, lohnt sich eine Variable. Mit {% set %} speicherst du ein Ergebnis zwischen und verwendest es danach unter einem kurzen Namen weiter. Auf meinem Dashboard begrüßt mich Home Assistant zum Beispiel passend zur Tageszeit:
1{% set stunde = now().hour %}
2{% if stunde < 12 %}
3 Guten Morgen, Daniel!
4{% elif stunde < 14 %}
5 Mahlzeit!
6{% elif stunde < 20 %}
7 Grüß dich!
8{% else %}
9 Guten Abend!
10{% endif %}Kleinigkeit, ich weiß. Aber genau solche Spielereien machen ein Dashboard persönlich. Und das Muster dahinter, Wert einmal holen, dann mehrfach vergleichen, brauchst du später ständig.
In Benachrichtigungen glänzen Templates
Der zweite Klassiker: dynamische Texte. Statt einer starren Nachricht baust du den aktuellen Wert direkt ein. Das Beispiel aus der Einleitung sieht als Automation so aus:
1automation:
2 - alias: "Fenster-Erinnerung Bad"
3 trigger:
4 - platform: state
5 entity_id: binary_sensor.fenster_bad
6 to: "on"
7 for: "00:12:00"
8 action:
9 - service: notify.mobile_app_daniel
10 data:
11 message: >
12 Das Fenster im Bad ist seit 12 Minuten offen.
13 Drinnen sind es noch {{ states('sensor.innentemperatur') }} Grad.Kleine Sache, macht Benachrichtigungen aber erst wirklich nützlich. Auch in Bedingungen von Automationen sind Templates erlaubt: Die Template-Bedingung prüft einen beliebigen Ausdruck und lässt die Automation nur weiterlaufen, wenn er wahr ist. Damit gehen Vergleiche, die der normale Bedingungs-Editor nicht abbildet, etwa "Innentemperatur ist höher als Außentemperatur".
Mein Rat für den Einstieg
Fang klein an. Die ersten Wochen kommst du mit states(), is_state() und zwei, drei Filtern komplett aus. Die if-Beispiele oben baust du nach, sobald ein konkretes Problem sie verlangt, und Schleifen brauchst du als Einsteiger so gut wie nie. Mit den Bausteinen aus diesem Artikel hast du geschätzt 80 Prozent dessen abgedeckt, was im Alltag vorkommt. Der Rest sind Sonderfälle, und für die gibt es die Dokumentation direkt im Editor.
Und wenn ein Template sich seltsam verhält: zurück in den Template-Editor. Fast jeder Fehler zeigt sich dort in Sekunden. Bleibt er hartnäckig, hilft der Troubleshooting-Guide weiter, und unbekannte Begriffe klärt das Glossar.
Häufige Fragen
Brauche ich Programmierkenntnisse für Jinja-Templates?
Nein. Wer schon mal programmiert hat, fühlt sich schneller zu Hause, aber Voraussetzung ist das nicht. Die Grundbausteine sind überschaubar: Werte auslesen, Filter anhängen, bei Bedarf eine Wenn-dann-Verzweigung. Mit dem Template-Editor als Spielwiese lernst du das in einem Nachmittag.
Warum liefert mein Template "unknown" oder einen falschen Wert?
Meistens stimmt der Entity-Name nicht, etwa nach dem Austausch eines Geräts. Prüfe in den Entwicklerwerkzeugen unter Zustände, ob die Entität existiert und welchen Wert sie gerade hat. Die zweite häufige Ursache: Du rechnest mit Text statt mit Zahlen, weil das | float(0) fehlt.
Was ist der Unterschied zwischen states() und state_attr()?
states() liefert den Hauptzustand einer Entität, also das, was auch im Dashboard angezeigt wird. state_attr() greift auf die Attribute zu, in denen Zusatzinfos wie Einheit, Zieltemperatur oder Sonnenwinkel stecken. Welche Attribute es gibt, zeigt dir die Zustandsansicht in den Entwicklerwerkzeugen.
Wo kann ich Templates testen, ohne etwas kaputt zu machen?
Im Template-Editor unter Entwicklerwerkzeuge → Template. Der wertet dein Template nur aus und zeigt das Ergebnis an, verändert aber nichts an deinem System. Erst wenn du das getestete Template in eine Automation oder einen Sensor kopierst, wird es wirksam.
