Contents
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.
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.
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.