Auto-entities mit Labels füllen

Hallo Leute,
heute möchte ich mit euch teilen, was mir gerade gelungen ist und was evtl. jemanden von euch interessieren könnte.
In meinem Dashboard habe ich viele Karten, auf denen alles Mögliche eingestellt werden kann - so wie jeder von euch.
Oft gibt es aber auch Geräte und/oder Entitäten, die nirgendwo explizit bedienbar sind. Bei mir sind das z.B. Steckdosen, an denen mehrere Lampen hängen die nur per “Ambient Licht Wohnzimmer” geschaltet werden. Oder es gibt Entitäten, die nicht geschaltet werden sollen, wie z.B. Zwischensteckdosen an Waschmaschine etc. , die nur der Leistungsmessung dienen.
Ich habe mir überlegt, auf einer Seite per Dropdown auswählbar, solche “zusammengehörigen” Geräte in einer auto-entities-card anzuzeigen.
Dazu habe ich allen Geräten (Steckdosen, Schalter etc.) beschreibende Labels gegeben, die bestimmte Tokens enthalten. Alle Geräte, die bei mir Lichter schalten können erhalten ein Label, in dem entweder “licht” oder “lampe” vorkommt.
Labels
Labels 1

Meine auto-entities sieht dann so aus:

type: custom:auto-entities
card:
  type: entities
  title: Lichter schalten
filter:
  template: >-
    {% set tokens = ['licht', 'lampe'] %}
    {% set matching_labels = labels() | select('search', tokens | join('|')) | list %}
    {% set devices = matching_labels | map('label_devices') | sum(start=[]) | list %}
    {% set entities = devices | map('device_entities') | sum(start=[]) | list %}
    {% set filtered_entities = entities | select('match', '^switch\.(?!.*_vch[0-9]+).*') | list %}

    [{% for entity in filtered_entities %}
    {"entity": "{{ entity }}", "name": "{{ label_name(labels(device_id(entity))[0]) }}"}{% if not loop.last %}, {% endif %}   
    {% endfor %}]

Labels 2
Wie ihr seht, sind alle Entitäten, mit denen man ein Licht schalten kann, aufgeführt und haben die Beschreibung, die ich dem Gerät als Label hinzugefügt hatte.
Es widerstrebte mir, die Steckdosen mit “Lichterkette xyz” zu benennen, insbesondere, weil ich sie auch gerne mal wo anders einsetzen möchte, ohne die ganze UI neu schreiben zu müssen.
Im Moment sind die Tokens noch fest vorgegeben. Es ist meine Absicht, das so zu erweitern, dass ich in einem Select “Lichter”, “Rollläden”, “…” auswählen kann und mir ein Sensor die Liste der dazugehörigen Tokens liefert.
Das sollte hinreichend flexibel für eine große Zahl von Anwendungsfällen sein.
Leider ist es mir noch nicht gelungen, die den Labels zugeordneten Icons zu extrahieren. Sonst könnten Lichterketten, Stehlampen etc. auch die richtigen Icons anzeigen.
Bin mal gespannt, wie ihr das evtl. für eigene Zwecke nutzen könnt. Würde mich über Feedback freuen.

1 „Gefällt mir“

Ein schöner Beitrag, danke. Interessant das Pferd einmal anders aufzuzäumen also sprich über Labels.

Ein schönes Rätsel zum Abend.
Die Icons aus den Labeln zu holen habe ich auch nicht geschafft aber folgender Workaround wäre möglich.

  1. Man defieniert die einem wichtigen Icons zu Stichworten, die im Label Namen enthalten sind
  2. Als Makro abspeichern
  3. Das Macro fragt man dynamisch ab in jeder template fähigen Karte

grafik

Zusammenfassung
{% macro get_icon(label) %}
  {% set icon_map = {
    'button': 'mdi:button-cursor',
    'lampe': 'mdi:lamp',
    'lichterkette': 'mdi:string-lights',
    'stehlampe': 'mdi:floor-lamp'
  } %}

  {% set matching_icon = icon_map | dictsort(false) | selectattr(0, 'in', label | lower) | map(attribute=1) | list | first %}
  
  {{ matching_icon if matching_icon else 'mdi:meinstandard_icon' }}
{% endmacro %}

Und dann die Abfrage
grafik

{%- from 'test.jinja' import get_icon -%}
{% set label = 'Mein Button' | lower %}
{{get_icon(label)}}

EDIT:
Guten Morgen. Ich bin noch den Beweis schuldig mit der Auto-Entities Karte, hatte aber gestern keine Lust mehr.

Zu meiner Überraschung liest der Template Teil der Auto-Entities Karte keine Makros ein. Das hätte ich nicht vermutet.

Na gut, dann die Icon Maps ohne Makro direkt im Template Teil der Karte

Zusammenfassung
type: custom:auto-entities
card:
  type: entities
  title: Lichter schalten
filter:
  template: >-
    {% set tokens = ['govee', 'lampe'] %}
    {% set matching_labels = labels() | select('search', tokens | join('|')) | list %}
    {% set devices = matching_labels | map('label_devices') | sum(start=[]) | list %}
    {% set entities = devices | map('device_entities') | sum(start=[]) | list %}
    {% set filtered_entities = entities | select('match', '^switch\.(?!.*_vch[0-9]+).*') | list %}

    {% set icon_map = {
      'govee': 'mdi:lamp',
      'licht': 'mdi:lightbulb',
      'button': 'mdi:toggle-switch'
    } %}

    [{% for entity in filtered_entities %}
    {
      "entity": "{{ entity }}",
      "name": "{{ label_name(labels(device_id(entity))[0]) }}",
      "icon": "{{ icon_map.get(label_name(labels(device_id(entity))[0]) | lower, 'mdi:toggle-switch') }}"
    }{% if not loop.last %}, {% endif %}
    {% endfor %}]

Wie Du siehst, das funktioniert. Ich habe 2 Govee Lampen mit dem Label “Govee”.

Nachteilig ist, daß Du diese Icon Map in jeder Karte dezentral speichern mußt. Ich bin mir ziemlich sicher, diese Map kann auch als Sensor in der configuration.yaml anlegen und dann den Wert hier in der Auto-Entities Karte abfragen. Dann wäre diese wieder zentral.
Bei Interesse trete ich den Beweis noch die Tage an.

@Bacardi
Hallo Olaf,
danke für das Feedback und die Idee, wie ich trotzdem an schöne Icons kommen kann :slight_smile: .
Allerdings ist mir die Sache nicht so dringend, dass ich da extra Sensoren/Makros etc. aufsetze. Da es die Funktion label_name() gibt wird es sicher auch demnächst label_icon() geben. Bis dahin habe ich Zeit.
Mein Ausgangspunkt war übrigens, dass ich denke, wir “Entwickler” denken viel zu sehr in unserer Blase. Um mich in den Geräten und Entitäten gut zurechtzufinden habe ich mir die Systematik gewählt, die Geräte mit “Bereich_Funktion …” zu benennen - also z.B. Büro_OG_Rollladen_Türe.
Das erinnert mich stark an die Systematik der BW - Wagen-Last-Kraft … :frowning:
Und wenn meine Frau diesen Rollladen schließen will, schaut sie mich zweifelnd ob meiner Ausdrucksweise an. Ich finde, da bieten die Labels eine richtig gute Möglichkeit.
Für weitere Ideen bin ich natürlich jederzeit dankbar.

Alles gut. Ich sah Deinen Fall eher als Rätsel, das über einen Workaround gelöst werden könnte. Und geh schön auf Deine Frau ein, lohnt sich mehr als jede ausgeklügelte Logik :wink: