Capteur CO² + affichage led adressable

Bonjour,

Je cherche toujours à améliorer mon capteur CO² + température + hygrométrie + pression.
la partie précision est atteinte avec l'intégration d'un écran I2C de 0.96" 128 x 64 qui permet un affichage rapide et complet des 4 variables.
Mais à plus d'un mètre, c'est pas lisible.
J'ai donc rajouté une LED PL9823. C'est une led unique, transparente mais c'est une LED adressable qui se comporte comme un ruban LED WS2812, avec une alim en 5V et data in et data out.

sensor:
  - platform: mhz19
    co2:
      name: "Valeur CO² $long_devicename"
      id: mhz19_co2
      on_value_range:

#        - above: 400
        - below: 899
          then:
          - light.addressable_set:
              id: status_light # Green
              red: 0%
              green: 100%
              blue: 0%

        - above: 900
          below: 1499
          then:
          - light.addressable_set:
              id: status_light # Yellow
              red: 100%
              green: 100%
              blue: 0%

        - above: 1500
          below: 2199
          then:
          - light.addressable_set:
              id: status_light # Orange
              red: 100%
              green: 50%
              blue: 0%

        - above: 2200
          then:
          - light.addressable_set:
              id: status_light # Red
              red: 100%
              green: 0%
              blue: 0% 

light:
  - platform: neopixelbus
    name: "Status Light $long_devicename"
    pin: GPIO12   # pin d6
    variant: WS2812
    id: status_light
    num_leds: 1
    type: rgb

Mais la led ne fonctionne pas bien.
au boot elle reste éteinte, je dois aller l'allumer par l'intermédiaire du serveur web intégré ou depuis HA.
ensuite, une fois allumée, elle changera de couleur en fonction de l'état de la valeur du CO².

en attendant, j'ai créé une automatisation, mais ce que je souhaite c'est que ca marche même offline.

alias: Gestion de la LED d'affichage du niveau de Dioxyde de Carbone.
description: ""
trigger:
  - platform: time_pattern
    seconds: "15"
condition: []
action:
  - choose:
      - conditions:
          - type: is_carbon_dioxide
            condition: device
            device_id: 2e2cfeecc66e62b05054472e9e8c1a38
            entity_id: sensor.valeur_co2_capteur
            domain: sensor
            below: 900
        sequence:
          - service: light.turn_on
            data:
              brightness: 127
              rgb_color:
                - 0
                - 249
                - 0
            target:
              device_id: 2e2cfeecc66e62b05054472e9e8c1a38
              entity_id: light.status_light_capteur
      - conditions:
          - type: is_carbon_dioxide
            condition: device
            device_id: 2e2cfeecc66e62b05054472e9e8c1a38
            entity_id: sensor.valeur_co2_capteur
            domain: sensor
            above: 900
            below: 1500
        sequence:
          - service: light.turn_on
            data:
              rgb_color:
                - 255
                - 255
                - 65
              brightness: 126
            target:
              device_id: 2e2cfeecc66e62b05054472e9e8c1a38
              entity_id: light.status_light_capteur
      - conditions:
          - type: is_carbon_dioxide
            condition: device
            device_id: 2e2cfeecc66e62b05054472e9e8c1a38
            entity_id: sensor.valeur_co2_capteur
            domain: sensor
            above: 1500
            below: 2200
        sequence:
          - service: light.turn_on
            data:
              rgb_color:
                - 255
                - 149
                - 0
              brightness: 126
            target:
              device_id: 2e2cfeecc66e62b05054472e9e8c1a38
              entity_id: light.status_light_capteur
      - conditions:
          - type: is_carbon_dioxide
            condition: device
            device_id: 2e2cfeecc66e62b05054472e9e8c1a38
            entity_id: sensor.valeur_co2_capteur
            domain: sensor
            above: 2200
            below: 8000
        sequence:
          - service: light.turn_on
            data:
              rgb_color:
                - 255
                - 0
                - 0
              brightness: 126
            target:
              device_id: 2e2cfeecc66e62b05054472e9e8c1a38
              entity_id: light.status_light_capteur
    default: []
mode: single

Depuis que j'ai mis le restore_mode: ALWAYS_ON la Led s'allume toujours au boot, mais elle reste en blanc.
il faut que le taux de CO² passe au dessus de 900 pour qu'elle passe au jaune, ensuite elle repasse au vert et continue à fonctionner normalement.
comment allumer correctement cette led ??? mystère...

Si vous avez des idées, je sèche depuis un bon mois là-dessus. :hot_face:

Je voulais mettre un bleu clair pendant le boot ou si la valeur du CO² était trop basse, mais le plancher de mesure de ce capteur est de 400 ppm, et en ce moment dans Paname, le taux est inférieur à 400 ppm, ce qui fait que le capteur reste scotché à 400 et il faut que je lui crache ma respiration en pleine face pour qu'il trouve quelque chose.

Voici une petite photo du breadboard, en attendant la finalisation complète de l'engin.

Salut,

Je dirais, enlève l’automatisation.
Et allume la led dans espHome.
Là on dirait que tu ne fais que changer la couleur suivant la valeur de ton capteur, mais nulle part tu l’allumes. Dans les YAML du de espHome, au niveau du « light » tu devrais pouvoir ajouter quelque chose pour qu’elle soit allumée par défaut, non.?
ou alors ajouter un « light.turn_on » dans tes « on_value_range »

J’ai essayé pour mettre le light.turn_on, mais au niveau des on_value_range, je vois pas trop ou le mettre pour qu’il soit pris sans mettre la grouille…

alors, j’ai rusé:

time:
  - platform: homeassistant
    id: homeassistant_time
    #essai allumage led
    on_time_sync:
      then:
        - light.turn_off:
            id: status_light # Eteint
        - light.turn_on:
            id: status_light # Blue
            red: 0%
            green: 0%
            blue: 100%
            color_brightness: 20%

comme la synchro de l’heure doit se faire assez vite au boot, ca marche comme ca.
comme c’est allumé en bleu, ca me dit bien dans quelle boucle je suis.
je crois que je vais carrément remplacer mes light.addressable_set par des light.turn_on

@bentou
j’ai plusieurs capteurs sous esphome qui doivent donner une indication locale avec une led comme tu le fait. Pour que la led s’allume au démarrage je la parametre comme ça :

esphome:
  # ...
  on_boot:
    # ...
    then:
    on_turn_on:
        - light.addressable_set:
           id: status_light
           red: 50%
           green 0%
           blue: 50%
        - light.turn_on:
            id: status_light

light:
  - platform: neopixelbus
    name: "Status  $devicename"
    pin: GPIO0  # D3
    variant: WS2812
    id: status_light
    num_leds: 1
    type: rgb

ensuite le capteur commute la couleur qui vas bien lors de sa mise a jour

Merci, j’ai essayé tes modifs, mais:

le on_turn_on me fais des misères:

INFO Reading configuration /config/esphome/esp8266mod-12f.yaml...
INFO Detected timezone 'Europe/Paris'
Failed config

esphome: None
  name: esp8266mod-12f
  comment: Detecteur CO² Salon
  on_boot: 
    then: 
    
    [on_turn_on] is an invalid option for [on_boot]. Please check the indentation.

alors je l’ai commenté:

esphome:
  name: $devicename
  platform: ESP8266
  board: nodemcuv2
  comment: $long_devicename
  on_boot:
    # Allumage de la led
    then:
#    on_turn_on:
      - light.addressable_set:
          id: status_light
          red: 50%
          green: 0%
          blue: 50%
          color_brightness: 40%
      - light.turn_on:
          id: status_light
            
wifi:
  ssid: !secret wifi_ssid

ca s’allume bien au boot, mais la couleur met pas mal de temps pour passer au vert… certaines fois, plus d’une heure…
je ne vois plus qu’un souci de capteur…

et pour cause ! une erreur de copier coller manifestement :confused:
il faut bien l’enlever.

bizarre quand même cette histoire de capteur qui met du temps a répondre, je ne sais plus si on peu forcer l’actualisation des capteurs avec esp_home.
j’attends un mhz19 pour bientôt, je verrai si il me fait la même chose que toi.

Je suis en train de monter un second module avec les mêmes capteurs (ath10 bme280 mh-z19) mais sur une plaque perforée.
celui sur le breadboard me permettra de tester avec un autre ESP (ESP32 ?) ou avec un capteur différent…
pour l’instant, j’ai un AZ-Delivery ESP8266MOD 12-F

J’ai testé un second montage.
Le fichier de configuration est le même (sauf pour le nom et les mots de passe api et oth).
Les composants sont les mêmes.
L’erreur est exactement la même.
Il est impératif que le on_value_range change de range pour afficher correctement la couleur.

Alors, j’ai rajouté un changement de range, avec la même couleur, histoire de provoquer plus de changements, donc plus de réactualisation.
ca a l’air de mieux marcher, même si ce n’est pas parfait dans toutes les situations. pour l’instant, l’air extérieur est près de la limite basse de 400ppm, donc on change facilement de range. durant l’année, le taux de base doit changer surtout à Paname… :melting_face:
en plus, lors de reboot, il arrive que le capteur se mette à 500ppm, je pense qu’il s’agit d’une auto-calibration qui peur arriver toute les 24h d’après ce que j’ai compris.

sensor:
  - platform: uptime
    id: uptime_sec
  - platform: mhz19
    co2:
      name: "Valeur CO² $long_devicename"
      id: mhz19_co2
      on_value_range:

        - below: 401
          then:
          - light.addressable_set:
              id: voyant_led
              red: 0%
              green: 100%
              blue: 0%

        - above: 401
          below: 899
          then:
          - light.addressable_set:
              id: voyant_led
              red: 0%
              green: 100%
              blue: 0%

        - above: 900
          below: 1499
          then:
          - light.addressable_set:
              id: voyant_led # Yellow
              red: 100%
              green: 100%
              blue: 0%

        - above: 1500
          below: 2199
          then:
          - light.addressable_set:
              id: voyant_led # Orange
              red: 100%
              green: 50%
              blue: 0%

        - above: 2200
          then:
          - light.addressable_set:
              id: voyant_led # Red
              red: 100%
              green: 0%
              blue: 0% 

    temperature:
      name: "Temperature MH-Z19 $long_devicename"
    automatic_baseline_calibration: false
    uart_id: uart_mhz19
    id: mhz19_calibration
    update_interval: 60s
    

Il n’empêche que je ne suis pas loin de penser que c’est un bug…

C’est possible que les valuers ne changent âs si rapidement que ça.
Mais si c’est le cas, tu peux rajouter toujours dans le on_boot, simplement une logique qui va explicitement lire la valeur et appliquer la bonne couleur.

Ben, pour moi, le ninja2 c’est du chinois…

je recopie des exemples et si ca passe à la compilation, ca doit marcher…

dans la config yaml, je ne vois que des modules, il n’y a pas l’air d’y avoir réellement d’ordre d’exécution. alors je suis un peu paumé…
il faut que je déplace tout la selection on_value_range dans le on_boot ?

Ca tombe ben dans ESPhome y’a pas de jinja2 :wink:
Les lambda c’est du C.

Le Yaml ce n’est effectivement pas un script procédural, mais une définition de capteurs et de modules. Et c’est justement avec les trigger « on_… » que tu ajoutes la logique.

Un moyen de faire ça, c’est de définir un « script » (voir doc) qui s’occupe de lire la valeur du capter et met à jour la couleur. Et du coup tu appelles ce script à chaque fois que tu veux.
Ca change pas mal ton Yaml mais c’est pas mal.

Bon ensuite là ton souci c’est au démarrage de l’esp que tu dois attendre en peu. Je suppose que ton tu comptes le laisser tourner H24… donc ça ne devrait pas être un gros souci d’avoir une couleur de led par défaut pendant quelques minutes, si ensuite tu ne l’éteints pas pendant des jours ou semaines.

Bonjour,

Je déterre ce post car j’ai le même problème.

Il semble que le " on_value_range:" ne s’actualise que quand le capteur passe d’une « range » à une autre. donc si on allume le montage et que la valeur ne sort jamais de sa range de départ, rien ne s’allume et ça peut durer longtemps. la position semble sauvegarder ensuite pour les démarrages suivants mais pour les premières connections ce n’est pas top.

D’autant que j’essaie d’utiliser une bandes de 10 leds adressables pour faire une jauge qui change de couleur (du vert au rouge) au fur et à mesure qu’elle monte.

Là elle est tout bonnement éteinte …

En plus j’ai 5 capteurs sur mon montage et certains sont carrément pas facile à tromper (TVOC et formaldéhyde par exemple) donc pas facile de voir s’allumer les leds pour la première fois. Du coup je ne sais pas si ça fonctionne ou pas …

Donc ma question c’est comment initialiser ce programme pour qu’à l’allumage il y se passe quelque chose…

Merci par avance.

Philippe

A+

Bonjour,

Plutôt qu’ouvrir un nouveau post je continue ici.

Voici mon code:

substitutions:
  device_name: co2-temp
  time_timezone: "Europe/Paris"
  friendly_name: co2
esphome:
  name: ${device_name}


esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "dC5e8iZGcjBOnqNESrzmBDPVbYde3g36op3sUlGfrXc="

ota:
  - platform: esphome
    password: "01f0d019d6f0eacc1a6e88ddaa595092"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  manual_ip:
    static_ip: 192.168.1.234
    gateway: 192.168.1.1
    subnet: 255.255.255.0
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Co2 Fallback Hotspot"
    password: "URtgpx24B9jE"

captive_portal:

uart:
  tx_pin: GPIO12
  rx_pin: GPIO13
  baud_rate: 9600

time:
  - platform: homeassistant
    id: ha_time

binary_sensor:
  - platform: status
    name: "${friendly_name} Status"

switch:    
  - platform: restart
    name: "${friendly_name} Restart"

sensor:
  - platform: mhz19
    co2: 
      name: "${friendly_name} valeur"
      id: co2_valeur
      filters:
        - sliding_window_moving_average:
            window_size: 30
            send_every: 30      
    automatic_baseline_calibration: false
    
    temperature: 
      name: "${friendly_name} temp"
      id: co2_temp
    update_interval: 60s

  - platform: wifi_signal
    name: "${friendly_name} WiFi Signal"
    update_interval: 60s

  - platform: template
    name: "{$friendly_name} average"
    id: co2_average
    unit_of_measurement: ppm
    lambda: |-
      return id(co2_valeur).state;
    update_interval: 60s
    filters:
      - sliding_window_moving_average:
          window_size: 120
          send_every: 1      
    on_value: 
      then:
        - script.execute: update_co2

text_sensor:
  - platform: template
    name: "CO2 index"
    id: co2_index

script:
  - id: update_co2
    mode: restart
    then:
      - if:
          condition:
            or:
              - sensor.in_range:
                  id: co2_average
                  above: 1200
          then:
            - text_sensor.template.publish:
                id: co2_index
                state: Mauvais
            - script.execute: show_tr_bad
          else:
            - if:
                condition:
                  or:
                    - sensor.in_range:
                        id: co2_average
                        above: 800
                then:
                  - text_sensor.template.publish:
                      id: co2_index
                      state: Mediocre
                  - script.execute: show_bad
                else:
                  - if:
                      condition:
                        or:
                          - sensor.in_range:
                              id: co2_average
                              above: 400
                      then:
                        - text_sensor.template.publish:
                            id: co2_index
                            state: Acceptable
                        - script.execute: show_acceptable
                      else:
                        - text_sensor.template.publish:
                            id: co2_index
                            state: Bon
                        - script.execute: show_good

    # Configuration for showing AQI status with the RGB LED
  - id: show_tr_bad
    then:
      - if:
          condition:
            - lambda: 'return id(ha_time).now().hour < 23 && id(ha_time).now().hour > 7 ;'
          then:
            - light.turn_on:
                id: rgb_led
                brightness: 30%
                red: 80%
                green: 0%
                blue: 20%
          else:
            - light.turn_off:
                id: rgb_led

  - id: show_bad
    then:
      - if:
          condition:
            - lambda: 'return id(ha_time).now().hour < 23 && id(ha_time).now().hour > 7 ;'
          then:      
            - light.turn_on:
                id: rgb_led
                brightness: 30%
                red: 100%
                green: 60%
                blue: 20%
          else:
            - light.turn_off:
                id: rgb_led
  - id: show_acceptable
    then:
      - if:
          condition:
            - lambda: 'return id(ha_time).now().hour < 23 && id(ha_time).now().hour > 7 ;'
          then:       
            - light.turn_on:
                id: rgb_led
                brightness: 30%
                red: 100%
                green: 87%
                blue: 20%    
          else:
            - light.turn_off:
                id: rgb_led      
  - id: show_good
    then:
      - if:
          condition:
            - lambda: 'return id(ha_time).now().hour < 23 && id(ha_time).now().hour > 7 ;'
          then:            
            - light.turn_on:
                id: rgb_led
                brightness: 30%
                red: 0%
                green: 60%
                blue: 40%
          else:
            - light.turn_off:
                id: rgb_led
light:
  - platform: neopixelbus
    type: GRB
    variant: WS2812x
    pin: GPIO4
    num_leds: 4
    name: "${friendly_name} leds"
    id: rgb_led

mon souci est que les leds passent au bleu ou vert pendant 3,4 secondes tous les minutes.

J’ai un montage similaire avec un PMS5003 et il fonctionne correctement ici

Des idées?