Changer l'icône d'une entité à partir de son état

Bonsoir, je m’adresse à vous ce soir car je n’arrive pas à changer l’icône de mon entité en fonction de la valeur du sensor qui est un pourcentage, j’utilise cette icône pour m’indiquer l’espace qui me reste sur mon volume de NAS dans le menu déroulant.
J’ai essayé avec la condition IF dans le fichier customize.yaml mais cela ne m’affiche pas l’icone.

Voici le code que j’ai essayé :

sensor.sga4nrb9d_volume_1_volume_utilise:
  show_last_changed: true
  templates:
    icon : >-
      {% if (state <= '100') %} 
        'mdi:circle-slice-8'
      {% if (state <= '87,5') %}
        'mdi:circle-slice-7'
      {% if (state <= '75') %}
        'mdi:circle-slice-6'
      {% if (state <= '62,5') %}
        'mdi:circle-slice-5'
      {% if (state <= '50') %}
        'mdi:circle-slice-4'
      {% if (state <= '37,5') %}
        'mdi:circle-slice-3'
      {% if (state <= '25') %}
        'mdi:circle-slice-2'
      {% if (state <= '12,5') %}
        'mdi:circle-slice-1'
      {% if (state == '0') %}
        'mdi:circle-outline'
      {% endif; %} 
    icon_color: >-
      {% if (state <= '50') %}
        '#43ec55'
      {% if (state <= '62,5') %}
        '#a9f718'
      {% if (state <= '75') %}
        '#f0f718'
      {% if (state <= '87,5') %}
        '#df5d28'
      {% if (state <= '100') %}
        '#df2828'
      {% endif; %}

Je vous remercie d’avance pour l’aide, j’espère que je ne fais pas un doublon de post, j’ai déjà regardé le forum je n’ai pas trouvé mon bonheur,
Bonne soirée à vous

Ma configuration


version core-2023.12.4
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.11.6
os_name Linux
os_version 6.1.63-haos
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 4285
Installed Version 1.33.0
Stage running
Available Repositories 1433
Downloaded Repositories 22
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 11.2
update_channel stable
supervisor_version supervisor-2023.12.0
agent_version 1.6.0
docker_version 24.0.7
disk_total 30.8 GB
disk_used 6.9 GB
healthy true
supported true
board ova
supervisor_api ok
version_api ok
installed_addons Matter Server (5.0.2), AdGuard Home (5.0.1), Terminal & SSH (9.8.1), AirCast (4.0.1), Network UPS Tools (0.12.2), Studio Code Server (5.14.2), RPC Shutdown (2.4), Spotify Connect (0.12.6), Glances (0.20.0), Samba share (12.2.0), Mosquitto broker (6.4.0)
Dashboards
dashboards 2
resources 19
views 7
mode storage
Recorder
oldest_recorder_run 25 décembre 2023 à 12:57
current_recorder_run 4 janvier 2024 à 23:07
estimated_db_size 281.79 MiB
database_engine sqlite
database_version 3.41.2
Spotify
api_endpoint_reachable ok
___

Salut @J4y2s

Il va te falloir « custom-ui » à installer depuis HACS.

image

Et ensuite te baser sur la doc :

Bref la template devrait ressembler à ça :

      templates: # state is a string
        icon: >
          if (state === '0.0') return 'mdi:volume-off';
          if (state <= '0.3') return 'mdi:volume-low';
          if (state <= '0.6') return 'mdi:volume-medium';
          return 'mdi:volume-high';

Merci de votre réponse rapide, j’ai déjà installé cette intégration, j’ai essayé le modèle de code que propose la doc mais il ne prend en compte que mes deux premières conditions pas les suivantes.

sensor.sga4nrb9d_volume_1_volume_utilise:
  show_last_changed: true
  templates:
    icon: >
      if (state <= '100') return 'mdi:circle-slice-8';
      if (state <= '87,5') return 'mdi:circle-slice-7';
      if (state <= '75') return 'mdi:circle-slice-6';
      if (state <= '62,5') return 'mdi:circle-slice-5';
      if (state <= '50') return 'mdi:circle-slice-4';
      if (state <= '37,5') return 'mdi:circle-slice-3';
      if (state <= '25') return 'mdi:circle-slice-2';
      if (state <= '7,5') return 'mdi:circle-slice-1';
      return 'mdi:circle-outline';
    icon_color: >
      if (state <= '100') return '#df2828';
      if (state <= '87,5') return '#df5d28';
      if (state <= '75') return '#f0f718';
      if (state <= '62,5') return '#a9f718';
      return '#43ec55';

Excusez-moi de vous dérangez avec ça, je pense que ce n’est pas grand chose qui fausse le code mais je ne comprends pas mon erreur qui ne me permet pas de faire marcher ce petit bout de code

J’essaierai la version suivante pour voir :

  templates:
    icon: >
      if (state === '0') return 'mdi:circle-outline';
      if (state <= '7,5') return 'mdi:circle-slice-1';
      if (state <= '25') return 'mdi:circle-slice-2';
      if (state <= '37,5') return 'mdi:circle-slice-3';
      if (state <= '50') return 'mdi:circle-slice-4';
      if (state <= '62,5') return 'mdi:circle-slice-5';
      if (state <= '75') return 'mdi:circle-slice-6';
      if (state <= '87,5') return 'mdi:circle-slice-7';
      return 'mdi:circle-slice-8';                                    
    icon_color: >
      if (state <= '50') return '#43ec55';
      if (state <= '62,5') return '#a9f718';      
      if (state <= '75') return '#f0f718';            
      if (state <= '87,5') return '#df5d28';      
      return '#df2828';   

Et éventuellement remplacer les virgules par des points.

Je viens d’essayer le code que vous m’avez proposé, cela ne prend toujours en compte que les deux premières conditions.

J’ai également essayé de remplacer les virgules par des points, j’ai essayé aussi sans valeurs décimales.

Entre deux, j’ai essayé de remanié le code par rapport à la doc, j’ai réussi à faire fonctionner le code comme je le voulais mais seulement en mettant le signe en supérieur et non en inférieur ou égal, je ne comprends pas pourquoi, cela marche que dans ce sens-là.

Si quelqu’un a une explication, je suis preneurs

sensor.sga4nrb9d_volume_1_volume_utilise:
  show_last_changed: true
  templates:
    icon: >
      if (state > 99) return 'mdi:circle-slice-8';
      if (state > 84) return 'mdi:circle-slice-7';
      if (state > 74) return 'mdi:circle-slice-6';
      if (state > 62) return 'mdi:circle-slice-5';
      if (state > 50) return 'mdi:circle-slice-4';
      if (state > 34) return 'mdi:circle-slice-3';
      if (state > 24) return 'mdi:circle-slice-2';
      if (state > 12) return 'mdi:circle-slice-1';
      return 'mdi:circle-outline';
    icon_color: >
      if (state > 88) return 'red';
      if (state > 75) return 'orange';
      if (state > 63) return 'yellow';
      return 'green';



De ce que je vois :

  • si les valeurs comparées sont décroissantes on utilise l’opérateur > ou >=
  • si les valeurs sont croissantes on utilise l’opérateur < ou <=

Et visiblement les simple « quote » sont pas trop appréciés.

Ave ce code :

input_number.test:
  templates:
    icon: >
      if (state == 0) return 'mdi:circle-outline';
      if (state <= 7.5) return 'mdi:circle-slice-1';
      if (state <= 25) return 'mdi:circle-slice-2';
      if (state <= 37.5) return 'mdi:circle-slice-3';
      if (state <= 50) return 'mdi:circle-slice-4';
      if (state <= 62.5) return 'mdi:circle-slice-5';
      if (state <= 75) return 'mdi:circle-slice-6';
      if (state <= 87.5) return 'mdi:circle-slice-7';
      return 'mdi:circle-slice-8';
    icon_color: >
      if (state <= 50) return '#43ec55';
      if (state <= 62.5) return '#a9f718';
      if (state <= 75) return '#f0f718';
      if (state <= 87.5) return '#df5d28';
      return '#df2828';

J’ai sensiblement le même résultat :

custo

Mais il commence à se faire tard :smiley:

1 « J'aime »

Bonjour,

En programmation standard, c’est normalement plus simple de borner les valeurs hautes et basses avec « >= » et « < » (valeur comprise entre « x » et « y ») :

if (state == 0)
  return ...
else if (state > 0) && (state <= 7.5)
  return ...
else if (state > 7.5) && (state <= 25)
  return ...
else if (state > 25) && (state <= 37.5)
  return ...
...
1 « J'aime »

Effectivement votre code fonctionnement, j’ai du avoir un problème dans ma syntaxe pour que cela ne marche pas.
Je vous remercie de votre aide, cela m’as bien dépanné.

De rien :wink:

Thanks pour la bonne pratique :wink: !!!

Curieux d’en apprendre plus, d’après le code de @anon41081891 je vois qu’il met une plage de chiffre pour indiquer de quel nombre à quel nombre nous voulons le changement de couleur de l’état, cette méthode est-elle plus pertinente que celle que j’ai annoncé? Le fait d’utilise le state < x est-elle moins apprécié par HA que (state > x) && ( state < x)? Faut t’il mieux donner une plage de donnée?

Le code est lu de bas en haut

Sur ton premier post, le code s’arrêtera toujours sur la première ligne. Le fait de borner la plage attendue permet d’éviter à tous les coups ce type d’erreur.

2 « J'aime »

D’accord, merci de ta réponse :slightly_smiling_face:

Hello
Je regarde pour changer une icon avec custom-ui.
Le problème c’est que je n’ai pas de template pour mon sensor en question… Il est généré depuis node-red. Donc rien dans mon yaml.
Une solution ?

Salut,
ton sensor est une entité de HA ?

Custom-ui utilise le système de customisation d’une entité de HA, mais rajoute l’option de Template que ne gère pas HA pour le customize et ajoute le icon_color , que HA ne gère pas pour une entité.

Oui et non…
L’entité apparait bien dans HA mais elle est fournie et créée par node-red. C’est pas un template dans HA donc

Ok, ta bien une entité dans HA.
avec custom-ui tu va custom c’est entité.

un exemple dans le configuration.yaml

homeassistant:
  customize:
    Ton.entité:
      templates:
        icon: >
          if (state > 99) return 'mdi:circle-slice-8';
          if (state > 84) return 'mdi:circle-slice-7';
          if (state > 74) return 'mdi:circle-slice-6';
          if (state > 62) return 'mdi:circle-slice-5';
          if (state > 50) return 'mdi:circle-slice-4';
          if (state > 34) return 'mdi:circle-slice-3';
          if (state > 24) return 'mdi:circle-slice-2';
          if (state > 12) return 'mdi:circle-slice-1';
          return 'mdi:circle-outline';
1 « J'aime »

Oui merci c’est OK. je n’avais pas compris/lu ou il fallait mettre le template.

Du coup quelle est la solution la plus propre sur le long terme ?
Utiliser ce plugin ou custom-icon-color via l’ajoutde l’attribut icon_color ?
En gros soit tout est personnalisé dans le customize pour les entités non fournies par HA, soit dans les templates directement le cas échéant.
Sinon ça oblige dans chaque automatisation à modifier en plus l’attribut de couleur, ce qui me parait plus le bordel je pense à terme.
Ton avis ?

Depuis la dernière MAJ de custom-ui, il y a eu du changement.
Maintenant custom-ui n’a que l’option template et color_icon. L’option more-onfo est enlever.
Une nouvelle carte est faite que pour more-info maintenant, c’est custom-more-info.
Sinon ta une carte Custom-icon-color qui n’a pas l’option template et ne permet que l’option icon_color.

Dans un template sensor, tu ne peut pas utiliser icon_color je crois.

Moi, j’ai tout fait par custom-ui pour modifier les icones et les couleur d’icones avec template.

1 « J'aime »

Thx
Par contre sur android auto, l’icone ne change pas. La couleur elle est ok mais je la gère via card-mod.
Bug de l’appli android auto ?