Icon-Frabe in „Custom-room-Card“ abhängig vom Entity-Zusatnd in unterschiedliche Farben ändern

Moin zusammen,

ich nutze als Übersicht die custom room card, und möchte ein Icon je nach Status einer Entität färben.

Konkret → “sensor.nachste_abholung” gibt folgenden Status aus: “Gelbe Tonne in 8 Tagen”; “Gelbe Tonne Morgen” etc.

Ich möchte aus dem String nur nach dem Wort “Gelb” / “Schwarz” / “Blau” suchen und entsprechend eine Farbe zuweisen.

Ich finde leider nirgends die korrekte Syntax. Weder per Google über Foren, noch per ChatGPT.

Hier Beispiele, was ich leider ohne Erfolg probiert habe:

- entity: sensor.nachste_abholung
        show_name: false
        show_state: true
        show_icon: true
        icon: mdi:trash-can
        style: |
          :host {
          --paper-item-icon-color: {% if 'Gelb' in states('sensor.nachste_abholung') %} red {% else %} grey {% endif %};
          }
if (entity.state.includes("on")) {

Ich finde massig Beispiele für Zahlenwerte < / >, für einen konkreten Status “off” / “on” etc., aber keine Beispiele für einen bestimmten String im Status.

Vielleicht hat jemand die korrekte Syntax parat.

Danke und viele Grüße

gibbet nicht mehr.

Ich kenne diese custom card nicht; üblich ist die Syntax:


card_mod:
  style: |
    :host {
      --card-mod-icon-color:

Wenn du ein bestimmtes Wortteil suchst, gehst du mit einer regex-Suche auf Nr. Sicher.


{% if states('sensor.xxxxxxxxxxxxxxxxxxxxxxx') |regex_findall('gelb', ignorecase=true) %}red{% else %}grey{% endif %};

Erstmal vielen Dank für den Support!

Leider ohne Erfolg, Icon ändert die Farbe nicht.
Hab ich irgendwo eine falsche Einrückung?

- entities:
      - entity: sensor.nachste_abholung
        show_name: false
        show_state: true
        show_icon: true
        icon: mdi:trash-can-outline
        card_mod:
          style: |
            :host {
            --card-mod-icon-color: {% if states('sensor.nachste_abholung') |regex_findall('gelb', ignorecase=true) %}red{% else %}grey{% endif %};
            }

wie gesagt, ich kenne diese Karte nicht. Was du versuchen kannst, ist, den card mod - Part komplett nach links einzurücken, so dass er mit type: … eine Linie bildet.

Es scheint tatsächlich mit der custom room card zu tun zu haben.
Hab mal testweise einfach ein vertical stack erstellt, und dort funktioniert es…

type: vertical-stack
cards:
  - type: entity
    entity: sensor.nachste_abholung
    icon: mdi:trash-can-outline
    card_mod:
      style: |
        :host {
        --card-mod-icon-color: {% if states('sensor.nachste_abholung') |regex_findall('1', ignorecase=true) %}red{% else %}grey{% endif %};
        }

Unbenannt

Falls es sich um die Karte von Marco Kreeft handeln sollte: Die hat ne super Dokumentation mit einem direkten Beispiel für die Icon-Farbe: Configuration · marcokreeft87/room-card Wiki · GitHub

Ja, korrekt. Die Karte ist das.

Die Doku hab ich gelesen, komme aber nicht ans Ziel :see_no_evil:

Problem ist, dass das Filtern nur mit Zahlen und mit einem konkreten Status funktioniert. Mein Sensor hat aber jeden Tag einen anderen Status weil er die Tage mit in den Sensor schreibt. Also heute “Gelbe Tonne in 8 Tagen” - morgen dann “Gelbe Tonne in 7 Tagen”. Deshalb will ich ja nur nach dem “Gelb” suchen.

Alle Beispiele beziehen sich nur auf Zahlen die verglichen werden oder auf Status “on” / “off” / “close” etc…

Das ist JavaScript. Probier das:

template:
  styles: |
    return entity?.state.match(/gelb/gi) !== null ? 'red' : 'grey';

match() durchsucht den Status nach der Zeichenkette „gelb“; mittels /gi sucht es unabhängig von Groß- und Kleinschreibung. Wenn match() nichts findet, gibt es null aus.

Das Fragezeichen in entity?.state ist ein sog. optional chaining (?.) operator, der verhindern soll, dass die Karte keine Fehlermeldung auswirft, wenn die Entität nicht verfügbar ist.

null ? 'red' : 'grey' ist ein ternary operator, der wenn - dann - sonst abfragt.

Guten Morgen,

vielen Dank für die ausführliche Erklärung.

Leider ohne Erfolg.
Wenn ich den Code 1:1 so formatiert eingebe, wird die Karte gar nicht mehr geladen:

wenn ich den Code wie folgt ändere, dann wird die Karte wieder angezeigt, aber das Icon ändert sich nicht

template:
        style: |
          return entity?.state.match(/gelbe/gi) !== null ? 'red' : 'grey';

Ich poste Dir mal den kompletten Code von der Karte. Vielleicht hilft das.

type: custom:room-card
title: 🌎
icon: mdi:home-assistant
content_alignment: center
tap_action:
  action: navigate
  navigation_path: "#lichtwohnzimmer"
  double_tap_action:
    action: toggle
info_entities:
  - entity: sensor.restzeit_battery
    hide_if:
      conditions:
        - condition: below
          value: 0
        - condition: equals
          entity: sensor.restzeit_battery
          value: unavailable
    format: precision1
    styles:
      template: |
        if (entity.state < 1) return 'color: #e9692c';
  - entity: sensor.tempsensor_ausenbereich_temperature
    format: precision1
    styles:
      template: >
        if (entity.state < 10) return 'color: lightblue'; if (entity.state >=
        25) return 'color: #f21917'; if (entity.state >= 22) return 'color:
        orange'; if (entity.state >= 18) return 'color: green';
  - entity: sensor.tempsensor_ausenbereich_humidity
    format: precision1
    styles:
      template: >
        if (entity.state < 40) return 'color: lightblue';  if (entity.state >=
        80)return 'color: #f21917';  if (entity.state >= 60) return 'color:
        orange'; if (entity.state >= 40) return 'color: green';
rows:
  - entities:
      - entity: switch.tv_wohnzimmer_steckdose_1
        name: " "
        show_icon: false
  - entities:
      - entity: switch.tv_wohnzimmer_steckdose_1
        name: " "
        show_icon: false
  - entities:
      - entity: sensor.nachste_abholung
        show_name: false
        show_state: true
        show_icon: true
        template:
        style: |
          return entity?.state.match(/gelbe/gi) !== null ? 'red' : 'grey';
      - entity: sensor.anzahl_lampen_an_aktuell
        icon:
          template:
            styles: >
              if (entity.state < 1) return 'color: #9acd32'; if (entity.state =
              1) return 'color: #e9692c'; if (entity.state > 1) return 'color:
              #cc0000';
        show_name: false
        show_state: true
        show_icon: true
        tap_action:
          action: fire-dom-event
          browser_mod:
            service: browser_mod.more_info
            data:
              entity: sensor.lampen_eingeschaltet_aktuell
      - entity: sensor.solcast_pv_forecast_prognose_heute
        icon:
          template:
            styles: >
              if (entity.state <= 14) return 'color: #cc0000'; if (entity.state
              > 14 & entity.state <= 19) return 'color: #e9692c'; if
              (entity.state >= 20) return 'color: #9acd32';
        show_name: false
        show_state: true
        show_icon: true
      - entity: sensor.solcast_pv_forecast_prognose_morgen
        icon:
          template:
            styles: >
              if (entity.state <= 14) return 'color: #cc0000'; if (entity.state
              > 14 & entity.state <= 19) return 'color: #e9692c'; if
              (entity.state >= 20) return 'color: #9acd32';
        show_name: false
        show_state: true
        show_icon: true

Vergleiche bitte nochmals das Beispiel auf Github. Dort steht:


  - entity: sensor.fordpass_fuel
    show_icon: true
    icon:
      template:
        styles: >
          if (entity.state >= 70) return 'color: green';  
          if (entity.state >= 20) return 'color: orange';  
          else return 'color: orangered';

Oh, das war mein Fehler. “icon:” fehlte.

Jetzt wird die Karte auch geladen. Danke!

Leider keine Farbänderung.

Da fehlt noch color:

`return entity?.state.match(/gelb/gi) !== null ? 'color: red' : 'color: grey';`

Das wars. Danke!!

Icon färbt sich korrekt gelb. Super.

Jetzt fehlt eigentlich nur noch, dass er auch auf Blau / Schwarz reagiert.
Weil jetzt kann er ja wegen dem Bedingungsoperator nur Gelb / Grau werden.

Hab mir die Seite die Du verlinkt hast mal angeschaut, aber ich bekomme aus dem Beispiel mit der Bedingungskette keine Syntax abgeleitet, die funktioniert :face_with_peeking_eye:

Könntest Du mir da bitte auch nochmal auf die Sprünge helfen?

Versuche dieses Beispiel:
return entity?.state.match(/gelb/gi) !== null ? 'color: yellow' : entity?.state.match(/red/gi) !== null ? 'color: red' : entity?.state.match(/blau/gi) !== null ? 'color: blue' : entity?.state.match(/schwarz/gi) !== null ? 'color: black' : 'color: grey' ;

Danke!

So einfach, wenn man weiß wie :rofl: :ok_hand:

Vielen Dank auch nochmal an @anon76678013!