HA-Mesure de la qualité de l’air CO2 et PM2.5

Intro

Soucieux de la qualité de l’air que nous respirons au quotidien et de mon environnement, je me suis construit une petite centrale de mesure équipée de deux capteurs, l’un mesurant le CO2 et l’autre la concentration en particules PM2.5.

Bien évidemment, cette centrale doit communiquer avec HA. Je me suis tourné naturellement vers ESP HOME et j’ai sélectionné deux capteurs dans la catégorie Air Quality pour leur faible coup et la facilité de mise en oeuvre plus un Wemos d1-mini amplement suffisant pour interfacer le tout.

Capteurs de mesure

CO2: MH-Z19B

Le capteur Co2 est un MH-Z19B, il mesure la teneur de CO2 sur une échelle de 0 à 10000 ppm et communique en UART.

  • Sur le MH-Z19:
    • MH-Z19 <–> Wemos
    • TX <–> RX
    • RX <–> TX
    • GND <–> GND
    • VCC (+5v) <–> VCC

Particules Pm2.5: pm1006

Le capteur Pm2.5 est un pm1006, il mesure la concentration de particules de taille inférieure à 2,5 µm en µg/m3.

  • Sur le pm1006
    • carte PCB <–> Wemos
    • GND <–> GND
    • VCC (+5v) <–> VCC
    • REST <–> D2

Le pm1006 communique en UART dans une plage de mesure de 0 à 1000 µg/m3.

Intégration

Boitier Ikea

Le pm1006 équipe le boitier de mesure de qualité de l’air Vindriktning commercialisé par IKEA. Pour moins de 10€ vous avez un joli petit boitier, alimenté par un connecteur USB-C (cable et chargeur non fournis), avec en face avant un jeu de led vous indiquant le taux de concentration:

  • Vert: PM2.5 inférieur à 35 µg/m3 = bonne qualité de l’air.
  • Orange: PM2.5 entre 36 et 85 µg/m3 = moyenne qualité de l’air.
  • Rouge: PM2.5 supérieur à 85 µg/m3 = mauvaise qualité de l’air.
  • Led clignotantes, démarrage en cours.

Mise en oeuvre

Les deux capteurs sont connectés au Wemos D1 mini et le tout intégré dans le boitier. La connection est simple, il faut sortir le fer à souder et relier directement sur le circuit imprimé du Vindriktning, le Wemos et les capteurs suivant le mapping écrit au chapitre « Capteurs de mesure ». Utiliser du fil fin si possible et un fer 30w.

Le boitier est petit, l’intégration se fait au chausse pied:

Le capteur de co2 et le wemos sont fixés avec du double face. Il faut faire attention à perturber le moins possible le flux d’air.

Schéma interne

Vous trouverez ci après un schéma créé par un membre de https://community.home-assistant.io/t/ikea-vindriktning-air-quality-sensor/324599/130.

Vous trouverez également dans ce post de nombreuses informations qui m’ont aidé à réaliser cette intégration.

Réduction du bruit du ventilateur

Le pm1006 est équipé d’un mini ventilateur qui se déclenche lors de la lecture des informations, il est peu bruyant, cependant vous pouvez réduire sa vitesse et son émission sonore

Dans le schéma ci-dessus, vous vous apercevez que le ventilateur est piloté par la polarité 0V via un transistor, il suffit pour réduire sa vitesse de le sous-alimenter en raccordant son fil rouge sur le 3.3 v du wemos. Il continuera de démarrer et s’arrêter au rythme des lectures mais sera moins bruyant. D’après les essais réalisés par d’autres, cette modification n’affecte pas son efficacité, difficile de le vérifier je n’ai pas constaté d’aberration dans les mesures.

Programme ESP

https://esphome.io/components/sensor/pm1006.html

Tres simple, la particularité est qu’il faut déclarer deux UART, uart_a et uart_b dans mon cas et les assigner aux sensors.

Comme nous ne maîtrisons pas intervalle de lecture du pm1006 (environ une dizaine de secondes), je filtre sa lecture afin de lisser ses relevés, je moyenne sur 50 relevés et expulse la valeur tous les 10 relevés, la première valeur est expulsée à la dixième mesure.

  • window_size ( Facultatif , entier): Le nombre de valeurs sur lesquelles sera effectuée une moyenne lors de la diffusion d’une valeur.
  • send_every ( Facultatif , entier) : à quelle fréquence une valeur de capteur doit être expulsée. 
  • send_first_at ( Facultatif , entier) : par défaut, la toute première valeur brute au démarrage est immédiatement publiée. Avec ce paramètre, vous pouvez spécifier quand la toute première valeur doit être envoyée. La valeur par défaut est 1.

La valeur de CO2 est lue toutes les deux minutes.


substitutions:
  device_name: esp145-qualite-air-ikea
  adress_ip: "192.168.0.145"
  friendly_name: esp145
  time_timezone: "Europe/Paris"
  
esphome:
  name: ${device_name}
  platform: ESP8266
  board: d1_mini
  project:
    name: "rem81.qualite-air-ikea"
    version: "1.0.0"

wifi:
  networks:
    - ssid: !secret wifi_mi4
      password: !secret mdpwifi_mi4
      priority: 2   

    - ssid: !secret wifi_esp
      password: !secret mdpwifi_esp
      priority: 1
      
    - ssid: !secret wifi
      password: !secret mdpwifi
      priority: 0
  reboot_timeout: 5min

  manual_ip:
    static_ip: ${adress_ip}
    gateway: 192.168.0.254
    subnet: 255.255.255.0

# Enable logging
logger:
  baud_rate: 0

# Enable Home Assistant API
api:

ota:

web_server:
  port: 80

uart:
- id: uart_a
  rx_pin: D2
  baud_rate: 9600
  
- id: uart_b
  rx_pin: GPIO3
  tx_pin: GPIO1
  baud_rate: 9600


#Etat de la connection
binary_sensor:
  - platform: status
    name: "${friendly_name} Status"

switch:    

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

  - platform: pm1006
    uart_id: uart_a
    pm_2_5:
      name: "${friendly_name} Conc.Particules 2.5µm"
      accuracy_decimals: 2
      filters:
        - sliding_window_moving_average:
            window_size: 50
            send_every: 10 
            send_first_at: 10
            
  - platform: mhz19
    uart_id: uart_b
    co2:
      name: "${friendly_name} MH-Z19 CO2 Value"
    temperature:
      name: "${friendly_name} MH-Z19 Temperature"
    update_interval: 120s
    automatic_baseline_calibration: false              
  
            
  - platform: wifi_signal
    name: "${friendly_name} WiFi Signal Sensor"
    update_interval: 60s

  - platform: uptime
    name: "${friendly_name} Uptime Sensor"
    update_interval: 60s

text_sensor:
  # IP address #
  - platform: wifi_info
    ip_address:
      name: "${friendly_name} IP address"
      icon: "mdi:network-outline"
    ssid:
      name: "${friendly_name} Connected SSID"
    bssid:
      name: "${friendly_name} Connected BSSID"

Affichage

Je visualise sous forme de courbes avec mini-graph-card (j’aime bien), un jeu de couleurs surligne les différents seuils.

type: custom:mini-graph-card
color_thresholds:
  - color: '#00FF00'
    value: 0
  - color: '#FF9900'
    value: 20
  - color: '#EA9999'
    value: 30
  - color: '#CC0000'
    value: 100
color_thresholds_transition: hard
line_width: 2
icon: mdi:molecule
show:
  extrema: true
  fill: true
  icon: true
  labels: false
  name: true
  state: true
hour24: true
points_per_hour: 4
hours_to_show: 24
group: false
entities:
  - entity: sensor.concentration_particules_2_5um
    name: µg/m3
name: Concentration PM2.5
type: custom:mini-graph-card
color_thresholds:
  - color: '#00FF00'
    value: 0
  - color: '#FF9900'
    value: 400
  - color: '#EA9999'
    value: 800
  - color: '#CC0000'
    value: 1000
color_thresholds_transition: hard
line_width: 2
icon: mdi:molecule-co2
show:
  extrema: true
  fill: true
  icon: true
  labels: false
  name: true
  state: true
hour24: true
points_per_hour: 4
hours_to_show: 24
group: false
entities:
  - entity: sensor.mh_z19_co2_value
    name: CO2
name: Qualité de l'air

Mais aussi sous forme de gauges, c’est à votre convenance.

  - type: horizontal-stack
    cards:
      - type: gauge
        entity: sensor.mh_z19_co2_value
        min: 0
        max: 5000
        name: CO2
        severity:
          green: 0
          yellow: 400
          red: 800
        needle: true
        unit: ppm
      - type: gauge
        entity: sensor.concentration_particules_2_5um
        min: 0
        max: 120
        needle: true
        severity:
          green: 0
          yellow: 30
          red: 100
        name: Conc. Parti PM2.5
      - type: gauge
        entity: sensor.mh_z19_temperature
        min: 0
        max: 40
        needle: true
        severity:
          green: 0
          yellow: 23
          red: 30

Conclusion

Deux capteurs de qualité de l’air pour quelques dizaines d’euro, avec une mise en oeuvre accessible par tous, faut quand même maitriser un minimum la soudure à l’étain.

Je laisse vivre quelques temps, et j’envisage d’asservir la VMC de mon habitation au capteur de CO2.

2 Comments on “HA-Mesure de la qualité de l’air CO2 et PM2.5”

  1. Merci pour cette article. Accessoire ludique. J’ai utilisé un esp32 mini, ca passe bien entre le ventilateur et l’alimentation de Vindriktning. Petit probleme de commande avec notre vendeur chinoi préféré… J’ai pris un MHZ19 C au lieu du B la mesure demarre a 400ppm mais je n’ai pas l’impression que ca pourrais descendre plus bas dans une maison.

    1. Merci pour le retour. Chez moi aussi le MHZ19B ne descend pas en dessous de 400, problème de référencement chinois? mais comme tu dis 400ppm c’est déjà un bon indicateur.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *