Comment changer dynamiquement une icone sur un bouton

Bonjour la communauté,

Je souhaiterais changer dynamiquement l’icone et la couleur de fond d’un bouton en fonction de l’état d’une entité.
J’ai tenté de le faire à partir de card-mod, cela a bien fonctionné pour la couleur de fond mais pas pour l’icone…
Voici ce que j’ai programmé:

    type: button
    icon: mdi:window-shutter
    tap_action:
      action: navigate
      navigation_path: /lovelace/volets
    name: Volets
    card_mod:
      style: |
        ha-card {
          background: {% if is_state('cover.all_shutter', 'open') %} rgb(186, 224, 241) {% endif %};
          background: {% if is_state('cover.all_shutter', 'closed') %} #C8C5C4  {% endif %};
          
          icon: {% if is_state('cover.all_shutter', 'open') %} mdi:window-shutter-open ; {% endif %};
          icon: {% if is_state('cover.all_shutter', 'closed') %} mdi:window-shutter; {% endif %};  
          font-weight: bold;          

Si quelqu’un à une idée , … Merci.
Cordialement, Norbert

Bonjour,
ca devrais ressembler plutôt a ça:
Par contre l’icone ne fonctionne pas, que le background. C’est plus pousser pour modifier l’icone avec c’est carte.

    type: button
    icon: mdi:window-shutter
    tap_action:
      action: navigate
      navigation_path: /lovelace/volets
    name: Volets
    card_mod:
      style: |
        ha-card {
          font-weight: bold; 
          {% if is_state('cover.all_shutter', 'open') %}
            background: rgb(186, 224, 241);
          {% else %}
            background: #C8C5C4;
          {% endif %} 
          {% if is_state('cover.all_shutter', 'open') %}
            icon: mdi:window-shutter-open;
          {% else %}
            icon: mdi:window-shutter;
          {% endif %} 
        }              

Après tu peut utiliser button-card qui permet de le faire nativement, sans utiliser card_mod.

Pour l’icone, tu peu modifier l’icone de l’entité directement, sans passer par une carte.
avec customize et custom-ui: Changer Icon en fonction de l'état - #3 par WarC0zes

2 « J'aime »

Tu as aussi mushroom qui est une collection de cartes 100% configurables a travers de l’interface graphique.
Parmi les cartes mushroom, il y a:

  • la mushroom template qui permet de définir l’icone, sa couleur, les affichages en fonction de templates jinja2
  • la mushroom chip en version template qui permet de faire un bouton plus petit le cas échéant.

Exemple d’une carte mushroom template dédiée aux volets où l’icone change de forme (volet ouvert ou fermé) et de couleur en fonction des volets (vert fermé, bleu ouvert), où le texte change pour indiquer le nombre de volets ouverts et fermés, et où une mini icone indique le nombre de volets ouverts:
image

le code

Bien sur il faut installer les cartes Mushroom, qui sont disponibles dans HACS

type: custom:mushroom-template-card
primary: Volets
secondary: |
  {% set all = expand(entity)| list -%}
  {% set ND1 = all | selectattr('state','eq','open')|list|count%}
  {% set D1 = all | selectattr('state','eq','closed')|list|count%}
  Ouverts : {{ND1}} 
  Fermés : {{D1}}
icon: |
  {% if is_state(entity, 'open') %} 
    mdi:window-shutter-open
  {% else %}
    mdi:window-shutter
  {% endif %}
icon_color: |
  {% if is_state(entity,'open') %}
    light-blue
  {% else %}
    green
  {% endif %}
badge_icon: |-
  {% set all = expand(entity)| list -%} 
  {% set open1 = all | selectattr('state','eq','open')|list|count%}
  {% if open1 <= 9 %}
    mdi:numeric-{{open1}}
  {% elif open1 >= 10 %}
    mdi:numeric-9-plus
  {% else %}
    none
  {% endif %}
badge_color: |
  {% set all = expand(entity)| list -%} 
  {% set open1 = all | selectattr('state','eq','open')|list|count%}
  {% if open1 == 0 %}
    green
  {% else %}
    orange
  {% endif %}
entity: cover.tous_les_volets
layout: horizontal
hold_action:
  action: navigate
  navigation_path: /lovelace-smartphone/volets
double_tap_action:
  action: more-info
multiline_secondary: true
tap_action:
  action: navigate
  navigation_path: /lovelace-smartphone/volets

mais sans aller jusqu’aux templates, tu as les cartes mushroom entity, et les cartes tuiles (tiles) basique de home assistant pour les volets ou l’icone sera dynamique si tu as défini le bon type. éventuellement modifiable avec customize.
Et enfin les tuiles et les cartes mushroom cover qui font bien le job avec la possibilité d’afficher les boutons de contrôle:
image

Merci @WarC0zes. Je vais regarder le lovelace button-card et voir aussi avec la solution de customization.
Bonne journée.

Merci @BBE . Très intéressant tout ça. Je vais m’y pencher.
Bonne journée.

Encore une fois merci @WarC0zes et @BBE .
Je me suis inspiré de vous conseils.
J’ai réussi à changer dynamiquement la forme d’une icone de volet en fonction de son état (à la fois avec less interfaces card-mod et button_card.

  - show_name: true
    show_icon: true
    type: button
    icon: mdi:window-shutter
    tap_action:
      action: navigate
      navigation_path: /lovelace/volets
    name: Volets
    card_mod:
      style: |

        ha-card {
          font-weight: bold; 
          {% if is_state('cover.all_shutter', 'open') %}
            background: rgb(186, 224, 241);
          {% else %}
            background: #2C3E50;
            color: #F1FFFA;
           {% endif %} 
           
          {% if is_state('cover.all_shutter', 'open') %}
            --card-mod-icon: mdi:window-shutter-open;
          {% else %}
            --card-mod-icon: mdi:window-shutter;
          {% endif %} 
        }              

Avec la mushrom card j’ai pu reproduire l’exemple proposé par @BBE.
:+1:
Bonne soirée.

1 « J'aime »

Je n’arrive pas à changer l’état et le Name en parallèle… Possible ?
Serait-il possible en parallèle de faire clignoter l’état en fonction de son state.
Possible de mettre un fond coloré sur la carte ?
Pas simple card-mod même avec les tutos

Bonjour Loic69

Que veut-tu faire concrètement ?
Je ne comprends pas bien ce que tu veux faire.

'… faire clignoter l’état en fonction de son state '. !?
‹ Possible de mettre un fond coloré sur la carte ? › !?

As-tu déjà un bout de code ?

Cdt, Norbert

En gros j’ai 4 boutons card dans un panel horizontal pour mon portail (partiel, total, Stop, Fermeture).
Je gère la fermeture avec un timer. Et dans l’état affiché je voudrais rajouter (concatener) le temps restant en secondes avant la fermeture.
Ca c’est la demande initiale. Si en plus j’arrive à faire clignoter en rouge l’état ou le nom c’est top.
Je voudrais aussi au click, que le backgournd change de couleur pour bien voir qu’on a appuyer dessus. il reviendrait à son état initial à la fin de l’action demandée.
Concernant les états du portail j’ai open, closed, unknown (qui veut dire que l portail est soit en mouvement soit arreté dans un état non ouvert ou non fermé).
Merci

Bonjour
Peux-tu copier le code déjà écrit pour avancer sur ton besoin.
Cdt

1 « J'aime »

Je n’ai pas de code spécifique pour l’instant si ce n’et pas button-card.
J’ai essayé le card-mod, je n’arrive qu’à changer la couleur du fond et la couleur du nom.
Je ne suis même pas sur que ça soit optimisé…

show_name: true
show_icon: true
type: button
name: Total
show_state: true
hold_action:
  action: none
entity: cover.portail
tap_action:
  action: call-service
  service: script.open_total_gate
  target: {}
icon: mdi:gate-open
card_mod:
  style: |
    :host {
      
        --card-mod-icon-color: rgba(70,113,148,255);
        --card-mod-icon: mdi:garage-lock;
      
    }

    ha-card {
      font-weight: bold; 
      {% if is_state('cover.portail', 'closed') %}
        background: rgb(186, 224, 241);
      {% else %}
        background: #2C3E50;
        color: #F1FFFA;
        title: "kjlj";
       {% endif %} 
       
      {% if is_state('cover.portail', 'closed') %}
        --card-mod-icon: mdi:window-shutter-open;
        --card-text: "lkj";
      {% else %}
        --card-mod-icon: mdi:light-flood-down;
      {% endif %} 
      span {
        color: orange;
        title: "lkjlkj";
        text: "dfdfd";
      }
    }