Esphome - led RGB - Gestion de la couleur en fonction de la qualité d'air de la maison

Bonjour à tous !
J’essaie de mettre en place la gestion d’une led rgb sur mon esp32, en fonction du % de qualité de l’air intérieur.
Pour ce faire, j’ai un sensor qui calcule automatiquement la qualité de l’air intérieur exprimée en % (de la moins bonne 0% à la meilleure 100%)

Comme je suis une bille en automatisation, j’ai essayé une méthode un peu archaïque, qui fonctionne certe, mais j’aimerais améliorer, simplifier cela.

J’ai donc 4 automatisations qui vont changer la couleur (4 couleurs donc) de ma rgb, en fonction du %) :

alias: notif 81
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.moyenne_qualite_air
    above: 81
condition: []
action:
  - service: light.turn_on
    metadata: {}
    data:
      rgb_color:
        - 40
        - 180
        - 99
      brightness: 255
    target:
      entity_id:
        - light.led_notif_my_light
mode: single
alias: Led 61 81
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.moyenne_qualite_air
    below: 81
    above: 61
condition: []
action:
  - service: light.turn_on
    metadata: {}
    data:
      rgb_color:
        - 244
        - 208
        - 63
      brightness: 255
    target:
      entity_id:
        - light.led_notif_my_light
mode: single
alias: Led 22-61
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.moyenne_qualite_air
    below: 61
    above: 21
condition: []
action:
  - service: light.turn_on
    metadata: {}
    data:
      rgb_color:
        - 243
        - 68
        - 18
      brightness: 255
    target:
      entity_id:
        - light.led_notif_my_light
mode: single
alias: Led 21
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.moyenne_qualite_air
    below: 21
condition: []
action:
  - service: light.turn_on
    metadata: {}
    data:
      rgb_color:
        - 135
        - 19
        - 66
      brightness: 255
    target:
      entity_id:
        - light.led_notif_my_light
mode: single

Que pouvez-vous suggérer ? L’idéal serait avoir une seule automatisation, et si possible y intégrer un cycle de rafraichissement (5 min par exemple) et au lieu d’avoir seulement 4 couleurs, je sais pas si c’est possible d’avoir un dégradé plus précis.

Merci pour votre aide !!

Bonsoir.
En fait, tu peux mettre tous tes déclencheurs dans une seule et même automatisation.

Il suffit de leur rajouter un id : Automation Trigger - Home Assistant

Et du coup, dans tes actions, tu exécute l’action que tu souhaite en fonction de l’ID reçu.

Facile à mettre en place, et ça permet de regrouper les choses.

Pour le nombre de couleurs, c’est à toi de mettre autant de triggers (et d’id que souhaité)

En théorie, ça changera tout seul quand la valeur de ton sensor évoluera, pas besoin de minuterie en rabe :+1:

Et en lisant la doc, il y a même des variables que tu peux définir dans tes trigger. Il devrait donc être possible ta couleur dans la variable du trigger, et le l’utiliser telle quelle dans ton action en dessous :blush:

Allez, j’étais en forme…

ça te le fait avec 3 couleurs, à toi de gérer la suite :wink:

alias: AAAA sandbox
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - input_number.sandbox_number
    above: 75
    variables:
      color_red: 255
      color_green: 0
      color_blue: 0
  - platform: numeric_state
    entity_id:
      - input_number.sandbox_number
    below: 76
    above: 25
    variables:
      color_red: 0
      color_green: 255
      color_blue: 0
  - platform: numeric_state
    entity_id:
      - input_number.sandbox_number
    below: 26
    variables:
      color_red: 0
      color_green: 0
      color_blue: 255
condition: []
action:
  - service: light.turn_on
    metadata: {}
    data:
      rgb_color:
        - "{{ color_red }}"
        - "{{ color_green }}"
        - "{{ color_blue }}"
    target:
      entity_id: light.lit
mode: single

Hello !
Un énorme merci à toi pour ta contribution :slight_smile: Ca me permet de comprendre un peu mieux la mécanique ! J’avais déjà exploré les ID, sans que j’arrive à ce que je voulais faire…

Par contre, cela ne fonctionne pas. J’ai adapté ton code de la façon suivante :

alias: LED NOTIFICATION C02
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.moyenne_qualite_air
    above: 81
    variables:
      color_red: 40
      color_green: 180
      color_blue: 99
  - platform: numeric_state
    entity_id:
      - sensor.moyenne_qualite_air
    below: 81
    above: 61
    variables:
      color_red: 244
      color_green: 208
      color_blue: 63
  - platform: numeric_state
    entity_id:
      - sensor.moyenne_qualite_air
    below: 21
    variables:
      color_red: 135
      color_green: 19
      color_blue: 66
condition: []
action:
  - service: light.turn_on
    metadata: {}
    data:
      rgb_color:
        - "{{ color_red }}"
        - "{{ color_green }}"
        - "{{ color_blue }}"
    target:
      entity_id: light.led_notif_2_my_light
mode: single

Lorsque j’exécute l’automatisation, il ne se passe rien. et voici ce que j’ai dans les détails :

Exécuté : 6 février 2024 à 14:04:04
Résultat :
params:
  domain: light
  service: turn_on
  service_data:
    rgb_color:
      - ''
      - ''
      - ''
    entity_id:
      - light.led_notif_2_my_light
  target:
    entity_id:
      - light.led_notif_2_my_light
running_script: false

J’ai l’impression qu’il ne prend pas en compte la variable, et la led ne s’allume pas :confused:

Est-ce que tu ne serais pas dans un des cas que tu ne gère pas ?

Tu as 3 cas :

> 81
< 81 et > 61
< 21

Du coup, tu ne gères pas la valeur 81, et les valeurs entre 21 (inclus) et 61 (inclus)

Alors en soi non. Actuellement ma valeur est de 88 , donc supérieure à 81. Mais oui tu as raison, il faudrait préciser des inférieur ou égal à / supérieur ou égal à et il manque aussi une plage de 61 à 21 que j’ai rajouté

C’est vraiment étrange. Je rencontre également des problèmes de déclenchement avec ton code.
Par contre, si je modifie les above et below pour ne plus avoir de trous dans la raquette, tout fonctionne à merveille…

trigger:
  - platform: numeric_state
    entity_id:
      - input_number.sandbox_number
    above: 81
    variables:
      color_red: 40
      color_green: 180
      color_blue: 99
  - platform: numeric_state
    entity_id:
      - input_number.sandbox_number
    below: 82
    above: 61
    variables:
      color_red: 244
      color_green: 208
      color_blue: 63
  - platform: numeric_state
    entity_id:
      - input_number.sandbox_number
    below: 62
    variables:
      color_red: 135
      color_green: 19
      color_blue: 66

Oui c’est étrange :

alias: LED NOTIFICATION C02
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.moyenne_qualite_air
    above: 81
    variables:
      color_red: 40
      color_green: 180
      color_blue: 99
  - platform: numeric_state
    entity_id:
      - sensor.moyenne_qualite_air
    below: 82
    above: 61
    variables:
      color_red: 244
      color_green: 208
      color_blue: 63
  - platform: numeric_state
    entity_id:
      - sensor.moyenne_qualite_air
    below: 62
    above: 21
    variables:
      color_red: 243
      color_green: 68
      color_blue: 18
  - platform: numeric_state
    entity_id:
      - sensor.moyenne_qualite_air
    below: 22
    variables:
      color_red: 135
      color_green: 19
      color_blue: 66
condition: []
action:
  - service: light.turn_on
    metadata: {}
    data:
      rgb_color:
        - "{{ color_red }}"
        - "{{ color_green }}"
        - "{{ color_blue }}"
    target:
      entity_id: light.led_notif_2_my_light
mode: single

dans les logs j’ai ca :
Triggered manually at 6 février 2024 à 14:50:40

Lumière « Allumer » sur Led notif 2 My Light

Stopped because an error was encountered at 6 février 2024 à 14:50:40 (runtime: 0.00 seconds)

expected int for dictionary value @ data[‹ rgb_color ›]

Vraiment bizarre… Il te reste encore 3 petits trous ceci dit : 81, 61, et 21 qui ne sont pas gérés.

Sinon, essaie peut-être ça dans ton action :

action:
  - service: light.turn_on
    metadata: {}
    data:
      rgb_color: "[{{ color_red }}, {{ color_green }}, {{ color_blue }}]"

des fois qu’il préfère… (pas super convaincu)

Hélas, j’ai la même erreur… :frowning: C’est fou
Stopped because an error was encountered at 6 février 2024 à 15:04:45 (runtime: 0.00 seconds)

expected int for dictionary value @ data[‹ rgb_color ›]

Et je viens de tester, avec le code que tu as mis à jour, sans le moindre problème…
Je vais devoir invoquer des puissances obscures, ou avouer mon impuissance, désolé :expressionless:

Si, tente une dernière chose (ce sont mes forces obscures à moi…) :

      rgb_color:
        - "{{ color_red | int }}"
        - "{{ color_green | int }}"
        - "{{ color_blue | int }}"

:rofl: :rofl: :rofl:
Alors j’ai une piste… j’ai remplacé le sensor par un input comme toi et effectivement ca fonctionne !
Mais pourquoi cela ne marche pas avec mon sensor…
Voici la capture de l’état du sensor :

Si dans outils de développement → modèle tu rentres ça :

{{ states('sensor.moyenne_qualite_air') }}

tu as quoi qui s’affiche à droite ? (surtout le « type de résultat »)

J’ai ca :

Pas de bol, c’est bien un number…

Pour le coup, je ne sais plus quoi te dire, tu devrais peut-être créer un nouveau sujet dédié à ce problème en particulier, d’autres plus compétents saurons peut-être t’aider…

Courage !

Ce qui est bizarre c’est que avec mes automatisation du départ, cela fonctionne bien, avec mon sensor…

Bon en tout cas, merci pour ton aide ! je vais patienter voir si il y a quelqu’un qui à une idée :slight_smile:

1 « J'aime »

Bon j’ai consulté mon amis chat gpt qui m’a trouvé une solution différente, et qui a l’air de fonctionner :slight_smile:
La couleur est gérée dynamiquement avec 3 contraintes de couleurs (rouge à 0%, jaune à 50% et vert à 100%

Voici le code :

alias: LED NOTIFICATION C02
description: Gère la couleur de la LED RGB en fonction de la qualité de l'air
trigger:
  - platform: state
    entity_id: sensor.moyenne_qualite_air
action:
  - service: light.turn_on
    data_template:
      entity_id: light.led_notif_2_my_light
      rgb_color:
        - >-
          {% set sensor_value = states('sensor.moyenne_qualite_air') | int %}
          {% if sensor_value == 0 %}
            135
          {% elif sensor_value <= 50 %}
            {{ ((sensor_value / 50) * (255 - 135) + 135) | round(0) }}
          {% else %}
            {{ ((sensor_value - 50) / 50) * (40 - 255) + 255 | round(0) }}
          {% endif %}
        - >-
          {% set sensor_value = states('sensor.moyenne_qualite_air') | int %}
          {% if sensor_value == 0 %}
            19
          {% elif sensor_value <= 50 %}
            {{ ((sensor_value / 50) * (205 - 19) + 19) | round(0) }}
          {% else %}
            {{ ((sensor_value - 50) / 50) * (180 - 205) + 205 | round(0) }}
          {% endif %}
        - >-
          {% set sensor_value = states('sensor.moyenne_qualite_air') | int %}
          {% if sensor_value == 0 %}
            66
          {% elif sensor_value <= 50 %}
            {{ ((sensor_value / 50) * (106 - 66) + 66) | round(0) }}
          {% else %}
            {{ ((sensor_value - 50) / 50) * (99 - 106) + 106 | round(0) }}
          {% endif %}
mode: single
1 « J'aime »

Le pire étant que j’ai bien essayé de me créer un sensor avec la même tête que le tien, et que ça fonctionne parfaitement…

sensor:
  - name: Moyenne qualité air
    unit_of_measurement: "%"
    state: "{{ states('input_number.sandbox_number') | float(default = 0) }}"
    state_class: measurement

=>

image

Va comprendre, en tout cas j’ai trouvé une solution qui me convient totalement et qui fonctionne :slight_smile: Et en prime au lieu d’avoir 3 couleurs, j’ai un calcul dynamique ! beaucoup plus jolie :slight_smile:

1 « J'aime »