Wie nutze ich ein Dictionary aus einer Jinja Datei in einem Skript?

Ich versuche gerade einen strukturierten Zugang zu HA zu finden.

Nehmen wir mal an, ein Skript hätte die Aufgabe Lichter per Raumname statt der entity_id ein- und auszuschalten. Das Mapping soll in einer Jinja-Datei stehen

{% set licht_pro_raum = {
    "bad": "switch.bad",
    "flur": "switch.eingang"
} %}

Ich möchte nun das Skript raumbeleuchtung mit dem Parameter raumname aufrufen um den Status des Lichts umzudrehen. Geht das überhaupt? Ich habe mir das folgende Skript überlegt, aber in dieser Form kompiliert es nicht.

{% from 'lichtproraum.jinja' import licht_pro_raum %}
raumbeleuchtung:
  sequence:
    - variables:
        entname: "{{ licht_pro_raum[raumname] }}"
    - action: "switch.turn_{{ 'off' if is_state(entname, 'on') else 'on' }}"
      target:
        entity_id: "{{ entname }}"

Randbemerkung: Ich wollte als action kein switch.toggle verwenden um auch das Verhalten bei einem Status undefined sicherzustellen

Alle Lichter im Raum Wohnzimmer einschalten.

actions:
  - action: light.turn_on
    metadata: {}
    data: {}
    target:
      area_id: wohnzimmer

Verstehe Deinen Ansatz oben nicht wirklich.

Gruß Osorkon

Danke für die schnelle Antwort! Es geht mir weniger um das konkrete Beispiel und mehr um ein generelles Vorgehen.

Ziel ist für mich, Konfigurationen in Strukturen aufzubewahren und nicht in Automatisierungen. Das kann helfen wenn neue Objekte dazukommen oder sich Daten ändern. Bespiele wären, wenn zwei Räume die Funktion tauschen oder (gerade konkret passiert) zwei kleine Netzwerkswitche zu einem großen zusammengelegt werden und sich die per SNMP verwalteten Ports ändern. In solchen Fällen müssen dann nicht alle Automatisierungen angefasst werden sondern nur eine Jinja-Datei

Ich weiss nicht was Du mit Jinja meinst.

Meinst Du die Jinja Extensions, also macros?

Hier mal einpraktisches Bsp.

Wenn Du wiederkehrende Inhalte als Aktion verwenden tust.

Bieten sich Skripte an. In den Skripten kannst Du auch Variablen verwenden.

Gruß Osorkon

Mit der Jinja-Datei meinte ich die Datenstrukur licht_pro_raum, die das Mapping übernimmt.

Um es auf den Punkt zu bringen: Ich suche nach einer Variante des raumbeleuchtung Skriptes, die das macht, was in meinem Ansatz zu sehen ist: Eine Datenstruktur laden, aufgrund des übergebenen Parameters raumname eine Entität, die in der Datenstrukur zu finden ist, auswählen und auf Basis des Entitäts-Status eine Aktion ausführen.

Mein Skriptansatz kompiliert nicht einmal. Meine Frage ist daher, ob das prinzipiell / konkret funktionieren kann

Ich würde den Umweg über die macros gar nicht gehen.

Sondern die Zuordnung der Entität zum Raum direkt im Skript vornehmen.

sequence:
  - variables:
      entity: |
        {% if raum == "bad" %}
        switch.bad
        {% elif raum == "flur" %}
        switch.eingang
        {% endif %}
  - action: switch.turn_{{ iif(is_state(entity, 'on'), 'off', 'on') }}
    metadata: {}
    data: {}
    target:
      entity_id: "{{ entity }} "
fields:
  raum:
    selector:
      select:
        options:
          - bad
          - flur
          - keller
    default: bad
alias: Raum variable
description: ""

Gruß Osorkon

OK, aber das funktioniert nur für genau dieses Skript.

Wenn ich jetzt aber noch ein Notify-Skript habe, das bei einem Alarm die Lampe rot blinken lässt, eine Halloween-Automation, die die Farbe für eine zufällige Zeit auf grün schaltet, eine, die überwacht dass kein Licht 12 Stunden ununterbrochen durchläuft und eine, die den Stromverbrauch auswertet bin ich schon bei 5. Habe ich dann eine Änderung, muss ich 5 Dateien bearbeiten statt einer Daten-Jinja-Datei.

Nun kann man das bei Licht vielleicht noch über Areas erschlagen. Bei Netzwerkports geht das aber nicht mehr. Da fallen mir spontan Überwachung der Portgeschwindigkeit, Überwachung des Traffics, Überwachung von Verbindungsfehlern, Ein/Ausschalten von POE und Erfassung des POE-Stromverbrauchs ein. Jede Änderung in der Portbelegung wären dann auch wieder fünf zu bearbeitende Skripte/Sensoren/Automationen.

Die Raumzuordung über ein macro:

# lichtproraum.jinja
{% macro raumzuordnung(raum) %}
{% set licht_pro_raum = {
    "bad": "switch.bad",
    "flur": "switch.eingang"
} %}
{{ licht_pro_raum[raum] }}
{% endmacro %}

Das Template welches die Switch Entität für den Raum bad ermittelt.

{% from 'lichtproraum.jinja' import raumzuordnung %}
{{ raumzuordnung("bad") }}

EDIT:

Wenn Du mehrere Entitäten pro Raum zuweisen möchtest, dann:

{% macro raumzuordnung(raum) %}
{% set licht_pro_raum = {
  "bad": [
    "light.bad_spiegel",
    "light.bad_decke",
    "switch.bad_light"
  ],
  "flur": [
    "light.flur_decke",
    "switch.flur_ambiente"
  ]
} %}
{{ licht_pro_raum[raum] }}
{% endmacro %}

Gruß Osorkon

1 „Gefällt mir“

Ich habe mittlerweile herausgefunden wie der Import als Datenstruktur funktionieren kann

raumbeleuchtung:
  sequence:
    - variables:
        licht_pro_raum: "{% from 'lichtproraum.jinja' import licht_pro_raum %}{{ licht_pro_raum }}"
        entname: "{{ licht_pro_raum[raumname] }}"
    - action: "switch.turn_{{ 'off' if is_state(entname, 'on') else 'on' }}"
      target:
        entity_id: "{{ entname }}"

Danke an Osorkon für seine Tipps, die mir auf dem Weg geholfen haben!