Helfer / Blaupause für zwei zu kombinierende Sensoren

template:
  - binary_sensor:
      - name: Sun Up
        state: >
          {{ is_state("sun.sun", "above_horizon") }}
        icon: >
          {% if is_state("binary_sensor.sun_up", "on") %}
            mdi:weather-sunset-up
          {% else %}
            mdi:weather-sunset-down
          {% endif %}
Stammt von hier:
https://www.home-assistant.io/integrations/template/
1 „Gefällt mir“

Prima, Dank! Die Eindeutigkeit wurde moniert, sodass ich die unique_id eingefügt habe.
Jetzt habe ich eine Entität (binary_sensor.fenster_wc), welche mir per Icon den Status anzeigt. Wie bringe ich diese jetzt mit der Entität (sensor.wc_fensterstatus) zusammen? Aktuell sagt der neue Sensor " Nicht verfügbar "

YAML lovelace

        - type: tile
          entity: sensor.wc_fensterstatus
          name: Fenster
          icon_tap_action:
            action: navigate
            navigation_path: /lovelace/wc

Das Template

template:
  - binary_sensor:
      - name: Fenster WC
        unique_id: fenster_wc_id
        state: >
          {{ is_state("Geschlossen", "Angelehnt", "Sabotage", "Gekippt", "Offen") }}
        icon: >
          {% if is_state("sensor.wc_fensterstatus", "Geschlossen") %}
            phu:lift-in-window-closed
          {% elif is_state('sensor.wc_fensterstatus', 'Angelehnt') %}
            phu:lift-in-window-closed
          {% elif is_state('sensor.wc_fensterstatus', 'Sabotage') %}
            mdi:alert
          {% elif is_state('sensor.wc_fensterstatus', 'Gekippt') %}
            phu:lift-in-window-open1
          {% elif is_state('sensor.wc_fensterstatus', 'Offen') %}
            phu:lift-in-window-open2
          {% else %}
            mdi:alert-box
          {% endif %}

Das mit dem Binary Sensor war nur das Beispiel.
Ich meinte eigentlich, dass du den gesamten Sensor in der configuration.yaml definieren solltest.
Ein zweiter Sensor sollte nicht notwendig sein.
Im Beispiel verweist der Sensor auf seinen eigenen State.

Ich bekomme es leider nicht hin. Ich kann das Template nicht mit dem vorhandenen Fensterstatus Sensor verknüpfen. Hier ist die Lösung, wie die Sensoren erstellt werden. Jetzt brauche ich eine Lösung, um den erstellten Sensoren für Ihre jeweiligen Zustände ein entsprechendes Icon und eine entsprechende Farbe zuzuweisen.

Ich habe es jetzt mal nachgebaut, daher sind hier meine Sensoren und irgendwelche Icons drin. Musst du dann wieder durch deine ersetzen:

Da du mehrere Sensoren per Makro erstellst, habe ich auch für das Icon ein Makro erstellt.

Zweites Makro für das Icon:

#window_icon
{% macro window_icon_entity(window_sensor_icon) %}
{% if states(window_sensor_icon) == "Geschlossen" %}
mdi:window-closed
{% elif states(window_sensor_icon) == "Angelehnt" %}
mdi:window-closed-variant
{% elif states(window_sensor_icon) == "Sabotage" %}
mdi:window-shutter-alert
{% elif states(window_sensor_icon) == "Gekippt" %}
mdi:window-shutter
{% elif states(window_sensor_icon) == "open" %}
mdi:blinds-horizontal
{% else %}
mdi:alert-box
{% endif %}
{% endmacro %}

Sensor:

  - sensor:
      - name: "window_test"
        unique_id: "window_test"
        state: >-
          {% from 'window.jinja' import window_entity %}
          {{ window_entity('input_select.dummy_window_handle', 'input_boolean.dummy_window_binary') }}
        icon: >-
          {% from 'window.jinja' import window_icon_entity %}
          {{ window_icon_entity('sensor.window_test') }}

Hier mal dann die Ausgabe in einer Entitätenkarte:
image
image
image

Das Icon wechselt wie gewünscht bei Änderung des Zustands des Sensors.

Das ganze lässt sich dann mit einem weiteren Makro noch auf die Farben erweitern. Allerdings muss man die dann in der Dashboard Karte ändern lassen, da man es nicht an den Sensor selbst hängen kann.
Makro für Farbe:

#window_icon_color
{% macro window_icon_color_entity(window_sensor_icon_color) %}
{% if states(window_sensor_icon_color) == "Geschlossen" %}
disabled
{% elif states(window_sensor_icon_color) == "Angelehnt" %}
orange
{% elif states(window_sensor_icon_color) == "Sabotage" %}
red
{% elif states(window_sensor_icon_color) == "Gekippt" %}
purple
{% elif states(window_sensor_icon_color) == "open" %}
pink
{% else %}
blue
{% endif %}
{% endmacro %}

Den Aufruf habe ich dann in der gezeigten Entitätenkarte so gemacht:

type: entities
entities:
  - entity: input_select.dummy_window_handle
  - entity: input_boolean.dummy_window_binary
  - entity: sensor.window_test
    type: custom:template-entity-row
    color: >-
      {% from 'window.jinja' import window_icon_color_entity %} {{
      window_icon_color_entity('sensor.window_test') }}

Das Ergebnis ist dann:
image
image

Edit:
Kleiner Hinweis:
Das color disabled funktioniert nicht so wie du es möchtest. Wenn der Sensor von irgendeinem Status auf geschlossen geht, behält das Icon die letzte Farbe bei. Erst ein reload des Dashboard macht das Icon dann farblos.
Du solltest also auch für den “Geschlossen” status eine Farbe definieren.

1 „Gefällt mir“

Prima, vielen lieben Dank!
Der Wechsel des Icons funktioniert soweit perfekt.

Nur mit der Farbe hab ich noch Probleme. Das Icon bekommt zwar die gewünschte Farbe, aber die Hintergrundfarbe des Icons ist weiterhin falsch.

Richtig müsste es so aussehen. Jetzt habe ich auch schon versucht bei color: eine Bedingung einzubauen, die wird aber jedes Mal ignoriert.

Über ein Macro funktioniert dies natürlich genauso

Hast noch eine Idee für mich, wie ich die Hintergrundfarbe des Icons entsprechend der Zustände anpassen kann?

Wenn du sowohl das icon als auch den Hintergrund mit der gleichen Farbe haben willst, dann so:

type: tile
entity: sensor.window_test
card_mod:
  style: |
    ha-tile-icon {
      --tile-color: blue;
    }

image

Wenn sie verschieden sein sollen, dann so:

type: tile
entity: sensor.window_test
card_mod:
  style: |
    ha-tile-icon {
      --tile-color: green;
    }
    ha-card {
      --card-mod-icon-color: red;
    }

image

Auf die Makros habe ich das jetzt nicht mehr erweitert.

1 „Gefällt mir“

Perfekt, so funktioniert es zu 90 % richtig.

Hier einmal die aktuelle Lösung:
Makro entities.jinja

#window_entity
{% macro window_entity(window_handle, contact_sensor) %}
{% if states(window_handle) == "closed" and states(contact_sensor) == "off" %}
Geschlossen
{% elif states(window_handle) == "tilted" and states(contact_sensor) == "off" %}
Angelehnt
{% elif states(window_handle) == "open" and states(contact_sensor) == "off" %}
Angelehnt
{% elif states(window_handle) == "closed" and states(contact_sensor) == "on" %}
Sabotage
{% elif states(window_handle) == "tilted" and states(contact_sensor) == "on" %}
Gekippt
{% elif states(window_handle) == "open" and states(contact_sensor) == "on" %}
Offen
{% else %}
Unbekannt
{% endif %}
{% endmacro %}

#window_icon
{% macro window_icon(window_sensor_icon) %}
{% if states(window_sensor_icon) == "Geschlossen" %}
phu:lift-in-window-closed
{% elif states(window_sensor_icon) == "Angelehnt" %}
phu:lift-in-window-closed
{% elif states(window_sensor_icon) == "Sabotage" %}
mdi:alert
{% elif states(window_sensor_icon) == "Gekippt" %}
phu:lift-in-window-open1
{% elif states(window_sensor_icon) == "Offen" %}
phu:lift-in-window-open2
{% else %}
mdi:alert-box
{% endif %}
{% endmacro %}

#window_icon_color
{% macro window_icon_color(window_sensor_icon_color) %}
{% if states(window_sensor_icon_color) == "Geschlossen" %}
--tile-color: grey
{% elif states(window_sensor_icon_color) == "Angelehnt" %}
--tile-color: orange
{% elif states(window_sensor_icon_color) == "Sabotage" %}
--tile-color: red
{% elif states(window_sensor_icon_color) == "Gekippt" %}
--tile-color: blue
{% elif states(window_sensor_icon_color) == "Offen" %}
--tile-color: indigo
{% else %}
--tile-color: pink
{% endif %}
{% endmacro %}

Template

template:
  - sensor:
      - name: "WC Fensterstatus"
        unique_id: "wc_fensterstatus"
        state: >-
          {% from 'entities.jinja' import window_entity %}
          {{ window_entity('sensor.wc_fenstergriff', 'binary_sensor.wc_fenster') }}
        icon: >-
          {% from 'entities.jinja' import window_icon %}
          {{ window_icon('sensor.wc_fensterstatus') }}

Dashboard YAML

type: tile
entity: sensor.wc_fensterstatus
name: Fenster
icon_tap_action:
  action: navigate
  navigation_path: /lovelace/wc
card_mod:
  style: |
    ha-tile-icon {
      {% from 'entities.jinja' import window_icon_color %}
      {{window_icon_color('sensor.wc_fensterstatus') }}
    }

Zwei Fragen habe ich noch :grinning:

  • Wenn ich --tile-color: orange verwende, ist alles okay. Ich möchte aber --tile-color: deep-orange verwenden, was jedoch ignoriert wird. Ich vermute, der Bindestrich stört. Wie muss ich das im Makro formatieren?

  • Wenn man die Standardkarte mit der Maus anfährt, wird diese ganz leicht in der Farbe des Icons eingefärbt. Beim mir wird immer die Defaultfarbe des Sensors (blau) verwendet. Da gibt es doch bestimmt auch ein ha-???

Nachtrag:
Der over Effekt, den ich in der zweiten Frage meine, sieht original so aus:
Bildschirmfoto 2024-08-23 um 16.29.57
Die ganze Karte wird dann in einem Hauch von grün eingetaucht.

Bei der selbst erstellten sieht es dann so aus:
Bildschirmfoto 2024-08-23 um 16.33.04
Es ist immer ein Hauch von blau. Und das Interessante, diese Farbe beeinflusst auch die Hintergrundfarbe des Icons, es ist nicht mehr das grün, sondern ein etwas dunkleres.

Wenn die ganze Karte farblich “aufleuchten” soll, bei Maus hoovern, dann musst du ha-card modden

type: tile
entity: sensor.window_test
card_mod:
  style: |
    ha-card {
      --tile-color: orange !important;
    }
    ha-tile-icon {
      --tile-color: orange;
    } 

image
image

Wie du deep-orange verwenden kannst, kann ich dir leider auch nicht sagen.

Ich habe von den ganzen css Selektoren auch überhaupt keine Ahnung. Ich versuche mich da durch Google Suche und “Element untersuchen” im Browser durchzuhangeln.

1 „Gefällt mir“

Vielen lieben Dank :smiling_face_with_three_hearts:

Das hat funktioniert. Die Farben via card-mod sind leider immer einen Tick dunkler als beim Original.

Beim Makro habe ich einfach !important; angehängt.

#window_icon_color
{% macro window_icon_color(window_sensor_icon_color) %}
{% if states(window_sensor_icon_color) == "Geschlossen" %}
--tile-color: grey !important;
{% elif states(window_sensor_icon_color) == "Angelehnt" %}
--tile-color: orange !important;
{% elif states(window_sensor_icon_color) == "Sabotage" %}
--tile-color: red !important;
{% elif states(window_sensor_icon_color) == "Gekippt" %}
--tile-color: green !important;
{% elif states(window_sensor_icon_color) == "Offen" %}
--tile-color: indigo !important;
{% else %}
--tile-color: pink !important;
{% endif %}
{% endmacro %}

Und Dashboard YAML so angepasst:

          card_mod:
            style: |
              ha-card {
                {% from 'entities.jinja' import window_icon_color %}
                {{window_icon_color('sensor.bad_fensterstatus_links') }}
              }
              ha-tile-icon {
                {% from 'entities.jinja' import window_icon_color %}
                {{window_icon_color('sensor.bad_fensterstatus_links') }}
              }

Noch einmal vielen lieben Dank, so kann es erst einmal bleiben.

Hier die Lösung für die etwas zu dunkle Farbe:

{% elif states(window_sensor_icon_color) == "Gekippt" %}
--tile-color: rgba(0, 137, 0, 0.8) !important;

Ich möchte mich bei folgenden Benutzern für Ihre tolle und hilfreiche Unterstützung bedanken. Mit Eurer Hilfe habe ich jetzt eine prima Lösung, um einen Fensterstatus komplett abzubilden - vielen lieben Dank :smiling_face_with_three_hearts:

Die Lösung sieht folgendermaßen aus:
Das Makro entities.jinja muss unter /config/custom_templates abgelegt werden. Hierbei ist wichtig, dass man die Farben als rgb-Wert übergibt, damit diese mit Home Assistent deckungsgleich sind. Würde man den Namen verwenden, wäre der Farbton immer eine Nuance dunkler. Die rgb-Codes findet man hier bei Home Assistant.

#window_entity
{% macro window_entity(window_handle, contact_sensor) %}
{% if states(window_handle) == "closed" and states(contact_sensor) == "off" %}
Geschlossen
{% elif states(window_handle) == "tilted" and states(contact_sensor) == "off" %}
Angelehnt
{% elif states(window_handle) == "open" and states(contact_sensor) == "off" %}
Angelehnt
{% elif states(window_handle) == "closed" and states(contact_sensor) == "on" %}
Sabotage
{% elif states(window_handle) == "tilted" and states(contact_sensor) == "on" %}
Gekippt
{% elif states(window_handle) == "open" and states(contact_sensor) == "on" %}
Offen
{% else %}
Unbekannt
{% endif %}
{% endmacro %}

#window_icon
{% macro window_icon(window_sensor_icon) %}
{% if states(window_sensor_icon) == "Geschlossen" %}
phu:lift-in-window-closed
{% elif states(window_sensor_icon) == "Angelehnt" %}
phu:lift-in-window-closed
{% elif states(window_sensor_icon) == "Sabotage" %}
mdi:alert
{% elif states(window_sensor_icon) == "Gekippt" %}
phu:lift-in-window-open1
{% elif states(window_sensor_icon) == "Offen" %}
phu:lift-in-window-open2
{% else %}
mdi:alert-box
{% endif %}
{% endmacro %}

#window_icon_color
{% macro window_icon_color(window_sensor_icon_color) %}
{% if states(window_sensor_icon_color) == "Geschlossen" %}
--tile-color: rgb(158, 158, 158) !important;
{% elif states(window_sensor_icon_color) == "Angelehnt" %}
--tile-color: rgb(255, 87, 34) !important;
{% elif states(window_sensor_icon_color) == "Sabotage" %}
--tile-color: rgb(244, 67, 54) !important;
{% elif states(window_sensor_icon_color) == "Gekippt" %}
--tile-color: rgb(33, 150, 243) !important;
{% elif states(window_sensor_icon_color) == "Offen" %}
--tile-color: rgb(0, 188, 212) !important;
{% else %}
--tile-color: rgb(233, 30, 99) !important;
{% endif %}
{% endmacro %}

Das Template kann entweder direkt in die configuration.yaml eingetragen, oder aber via /config/packages als eigene Datei (z. B. templates.yaml) ausgelagert werden. Für jeden Fenstersensor, jede Entität, muss ein eigener Eintrag erstellt werden.

template:
  - sensor:
      - name: "Bad Fensterstatus links"
        unique_id: "bad_fensterstatus_links"
        state: >-
          {% from 'entities.jinja' import window_entity %}
          {{ window_entity('sensor.bad_fenstergriff_links', 'binary_sensor.bad_fenster_links') }}
        icon: >-
          {% from 'entities.jinja' import window_icon %}
          {{ window_icon('sensor.bad_fensterstatus_links') }}

In der lovelace yaml wird der Fenstersensor, die Entität, dann wie folgt abgebildet.

type: tile
entity: sensor.bad_fensterstatus_links
name: Fenster
card_mod:
  style: |
    ha-tile-icon {
      {% from 'entities.jinja' import window_icon_color %}
      {{window_icon_color('sensor.bad_fensterstatus_links') }}
    }