Ich hatte bisher wenig mit Makros probiert, sah auch hier im Forum kaum etwas, einmal ein Beispiel von @Osorkon. Heute las ich etwas Doku und stieß auf HA Update 2024.3.
Dort steht man kann Markos auch als Datei in /config/custom_templates/
ablegen, später laden und die darin enthaltenen Funktionen überall in jedem Jinja Code verwenden kann. Das geht in Richtung Helfer nur weiter. Ich übergebe einer zentral verfügbaren Funktion einen Wert, diese verarbeitet diese nach irgendeiner Logik und gibt mir den neuen Wert zurück. Will ich später die Logik anpassen, so muß ich das nur an einer Stelle (im Makro) tun.
Ich bin begeistert.
Hier ein Beispiel an einem Fenster inklusive Öffnungszeit in min, h oder Tagen.
- Unter
/config/custom_templates/
habe ich eine Datei mit dem Namenmacros.jinja
. Diese enthält folgenden Jinja Code.
{% macro macro_timediff_now_last_changed(entity_id) %}
{#
Ermittelt den Zeitunterschied des Sensors zu now() und gibt diesen in Minuten, Stunden oder Tagen zurück
#}
{%- set time_diff = (now() - states[entity_id].last_changed).total_seconds() %}
{% if time_diff < 3600 -%}
{% set time = (time_diff / 60) | round(0) ~ ' min' -%}
{% elif time_diff < 86400 -%}
{% set time = (time_diff / 3600) | round(0) ~ ' h' -%}
{% else -%}
{% set time = (time_diff / 86400) | round(0) ~ ' Tage' -%}
{% endif -%}
{{ time }}
{% endmacro %}
{% macro answer_question(entity_id) %}
{# Test aus Doku: Ist die Lampe an oder nicht?#}
Is the {{ state_attr(entity_id, 'friendly_name') }} on?
{{ (states(entity_id) == 'on') | iif('Yes', 'No') }}!
{% endmacro %}
Das Makro “answer_question” aus der Doku führe ich hier nur auf, um zu zeigen, daß mehrere Makros in einer Datei gespeichert (und später abgerufen) werden können.
- Jetzt kann ich in jedem Template Sensor, jeder Markdown Karte bzw. überall wo Jinja ausgeführt wird, auf dieses Makro zugreifen.
Beispiel Fenster Gästezimmer und eine Lampe:
Jede Entity, die ein last_changed anbietet, ist möglich.
{%- from 'macros.jinja' import macro_timediff_now_last_changed as macro_get_time -%}
Gästezimmer: {{ macro_get_time('binary_sensor.aqara_fenstersensor_mitte_gaeste_contact') | trim }}
Licht: {{ macro_get_time('light.sternlampe') | trim }}
Man kann das auch in einem Template Sensor aufrufen. Ich habe einen, der mir die Namen der offenen Fenster ermittelt und dahinter in Klammern die Zeit. Letzteres wird über obiges Makro ermittelt.
Viel Spaß beim Probieren
EDIT
Ein HA Neustart ist nötig nach jeder Makro Änderung.