Maak je eigen luchtkwaliteitsmonitor

Door: koen-vervloesem | 29 juli 2021 06:01

How To

De luchtkwaliteit in huis is belangrijk voor onze gezondheid. Daarom zou iedereen eigenlijk een of meer luchtkwaliteitsmonitors in huis moeten hebben. In deze uitgebreide masterclass maken we die zelf, configureren we ze met ESPHome en koppelen ze aan Home Assistant. Zo kun je op afstand de luchtkwaliteit in verschillende ruimtes in één grafiek tonen en kan je domoticasysteem je waarschuwen bij te hoge CO₂-waardes of zelfs automatisch de ventilatie verhogen.

In dit artikel maken we voor circa 80 euro (de prijs hangt af van de mate van afwerking) een luchtkwaliteitsmonitor met een ESP8266- of ESP32-microcontroller en enkele sensoren die de temperatuur, luchtvochtigheid, luchtdruk, CO₂-concentratie en concentratie van fijnstof (deeltjes kleiner dan 2,5 en 10 micrometer) meten. Deze soorten fijnstof worden ook aangeduid met PM2,5 en PM10. Al deze parameters bepalen de kwaliteit van de lucht in huis.

01 Plan van aanpak

Wat gaan we doen? Als eerste kiezen we de sensoren en het microcontrollerbordje, sluiten we alle componenten aan op een breadboard (inclusief een led om te waarschuwen voor slechte luchtkwaliteit) om er eenvoudig mee te kunnen experimenteren.

Daarna komt de software aan de beurt. Dat doen we met ESPHome, dat nauw samenwerkt met Home Assistant. We zorgen dus ook dat alle sensormetingen van onze luchtkwaliteitsmonitor in Home Assistant terechtkomen. Uiteindelijk monteren we onze componenten definitief op een universeel printplaatje en steken deze in een universele behuizing. Daar moeten we wat voor solderen en boren.

01 ESPHome biedt de perfecte basis om je eigen sensorbordjes te maken.

02 Sensoren

Als je met ESPHome wilt werken, moeten die sensoren ook ondersteund zijn in dit project. Bekijk dus zeker de lijst met ondersteunde sensoren. Wij zijn al jaren fan van de BME280 van Bosch om de temperatuur, luchtvochtigheid en luchtdruk te meten. Je vindt allerlei break-outbordjes met deze sensor, bijvoorbeeld van Adafruit of CJMCU (die laatste vind je voor rond de 5 euro). Let wel op dat je de versie koopt die op 3,3 V werkt.

Voor een goede CO₂-sensor moet je op zoek naar een niet-dispersieve infraroodsensor (NDIR-sensor). Een populaire is de Winsen MH-Z19B, die rond de 20 euro kost. Kies voor de versie die tot 5000 ppm CO₂ detecteert. Voor een fijnstofsensor kies je het best voor een laserstofsensor. De Nova Fitness SDS011, die iets meer dan 20 euro kost, is een goede keuze.

02 ESPHome ondersteunt talloze sensoren.

03 Opbouw op het breadboard

Als microcontrollerbordje kiezen we een NodeMCU v1 met ESP8266. Heb je een ander ESP8266- of ESP32-bordje, gebruik die dan gerust. Je zult alleen enkele draadjes anders moeten aansluiten. Neem nu een breadboard en sluit alle componenten daarop aan.

Bij een ESP8266 is het belangrijk dat je een elektrolytische condensator van 1000 μF tussen de power-rails (3,3 V en GND) aansluit (met de positieve kant aan 3,3 V en de negatieve aan GND) om fluctuaties in de spanning op te vangen. Sluit ook een keramische condensator van 0,1 μF (aangeduid met 104) aan tussen de pinnen 3V3 en GND, zo dicht mogelijk bij de ESP8266.

Van de sensoren is de BME280 het gemakkelijkste. Dit is een I²C-sensor. Vin sluit je op 3V3 van de NodeMCU aan, GND op GND, SCL (soms ook als SCK aangeduid) op D1 en SDA (soms ook als SDI aangeduid) op D2.

03 De spanning van de ESP8266 stabiliseer je het best met twee condensatoren.

04 Sensoren aansluiten

De MH-Z19B past net niet op het breadboard. Sluit daarom rechtstreeks de jumperdraadjes op de pinnen aan. De sensor werkt op een voedingsspanning van 5 V, dus sluit Vin van de sensor op Vin van de ESP8266 aan (daarop staat de spanning van de usb-aansluiting) en GND op GND. TX van de sensor sluit je aan op D4 van de ESP8266 en RX op D5.

Dan de SDS011. Dat is een groot sensorbord van 7 bij 7 cm en er wordt een JST-XH-kabel bijgeleverd met aan de ene kant zeven en de andere kant vijf gaten. Van die met de vijf gaten sluit je de vier linkse aan op de ESP8266. Controleer op de connector en op het sensorbordje de benamingen. TX gaat naar D3, RX naar D6, GND naar GND en 5V naar Vin.

Code downloaden

De ESPHome-configuratie van dit project is vrij omvangrijk. In dit artikel hebben we de belangrijkste code opgenomen en uitgelegd, maar niet alles. De volledige code kun je downloaden via GitHub waar een speciale pagina is met alle code. Klik hier op de groene knop Code en dan op Download ZIP om de nieuwste versie van de code te downloaden. Een versie die volledig overeenkomt met wat er in deze masterclass wordt beschreven, vind je als je rechts op Releases klikt en dan bij versie 1.0.0 op Source code (zip) klikt. Door de code te downloaden, hoef je ook niet alles uit dit artikel over te typen. De YAML-syntaxis is namelijk heel gevoelig voor een spatie te veel of te weinig.

05 RGB-led

Tot slot sluiten we ook nog een RGB-led aan waarmee we kunnen waarschuwen als de luchtkwaliteit te slecht is. Het voordeel van een RGB-led is dat we met één led allerlei kleuren kunnen tonen. Populaire RGB-leds zijn de NeoPixels: een WS2812-driverchip met led. Maar wij kiezen hier voor de ‘ouderwetse’ RGB-leds met afzonderlijke pinnetjes voor de kleurcomponenten.

We kiezen voor een RGB-led met gemeenschappelijke kathode. Dat betekent dat het langere pinnetje, het tweede van links gezien, GND is. Sluit dit op GND van je ESP8266 aan. De drie andere pinnetjes zijn van links naar rechts rood, groen en blauw, en deze sluit je respectievelijk aan op D7, D8 en TX, met telkens een weerstand ertussen. Bij de rode led gebruiken we een weerstand van 220 Ω (ohm), bij de groene en blauwe van 47 Ω, omdat die een hogere doorlaatspanning heeft.

05 De RGB-led is via drie voorschakelweerstanden op het ESP-bordje aangesloten.

06 Aansluitingen controleren

Controleer nu nog eens of je alles correct aangesloten hebt. Kijk zeker de voedingskabels na: de BME280 heeft 3,3 volt nodig en de MH-Z19B en de SDS011 5 volt. Alle GND-connectoren van de sensoren moeten aangesloten zijn. En controleer daarna voor de signaalkabels de onderstaande tabel. Hierin hebben we ook aangeduid hoe je alle componenten aansluit als je de ESP32-DevKitC V4 gebruikt.

Als alles correct aangesloten is, zijn we klaar met de hardware. Nu moeten we deze nog aansturen en dat doen we door een configuratie voor ESPHome te schrijven.

06 In dit Fritzing-schema zie je precies hoe de aansluitingen moeten lopen.

07 ESPHome installeren

ESPHome kun je op diverse manieren installeren. Heb je Home Assistant OS geïnstalleerd (het door de ontwikkelaars aangeraden installatietype voor Home Assistant), dan bereik je de beste integratie met je domoticasysteem door in deze omgeving de ESPHome-add-on te installeren.

Maar ESPHome is een Python-programma, dus als je Python geïnstalleerd hebt, kun je ook ESPHome op je computer installeren als Python-pakket met de pakketbeheerder pip met het commando:

pip3 install esphome

Je maakt dan het best een directory aan waarin je al je ESPHome-projecten opslaat. Met de opdracht esphome -h krijg je te zien hoe je ESPHome op de opdrachtregel gebruikt.

08 Wizard

Start dan de wizard die je helpt om een configuratie aan te maken. Dat gaat dat als volgt:

esphome bureau.yaml wizard

Het eerste argument dat je aan de esphome-opdracht doorgeeft, is de naam van het bestand waarin je de configuratie voor het apparaat wilt opslaan. De wizard loodst je in enkele stappen door de configuratie van je apparaat. Je geeft je apparaat een naam (opgelet: alleen kleine letters, cijfers en een underscore zijn toegestaan), kiest een platform (ESP32 of ESP8266) en dan het juiste microcontrollerbordje.

Dat laatste is soms wat zoeken. De wizard verwijst naar een url op de website van PlatformIO voor de juiste omschrijving. Voor het AI-Thinker NodeMCU-bordje met ESP8266 dat we in deze test gebruikten, is dat bijvoorbeeld nodemcuv2.

Vul dan het SSID en wachtwoord van je wifi-netwerk in waarmee je het bordje wilt laten verbinden. Tot slot vraagt de wizard of je een wachtwoord op de functionaliteit voor OTA (over-the-air-updates) wilt zetten. Wij raden dat aan, want anders kan iedereen op je wifi-netwerk je apparaat updaten.

09 Firmware flashen

De wizard heeft nu een configuratie aangemaakt in het bestand bureau.yaml. Het is een YAML-bestand (meer informatie op www.yaml.org) met een basisconfiguratie. Hiermee kan het bordje eenvoudigweg met je wifi-netwerk verbinden en zal het te zien zijn in Home Assistant.

Dan is het nu tijd om je firmware te flashen. Gebruik je een ontwikkelbordje zoals een NodeMCU (met ESP8266) of ESP32-Pico-Kit (met ESP32), dan wordt die doorgaans geleverd met een micro-usb- of usb-c-aansluiting met ingebouwde seriële poort.

Sluit dus je bordje op je computer aan via usb en voer dan op je computer de volgende opdracht uit:

esphome bureau.yaml compile

Dat leest de configuratie in bureau.yaml in, valideert die en creëert op basis daarvan de broncode van je firmware en compileert die. Als alles goed gaat, krijg je op het einde INFO Successfully compiled program te zien.

Daarna flash je de gecompileerde firmware naar je aangesloten bordje:

esphome bureau.yaml upload

Kies de seriële usb-aansluiting als interface om de firmware te uploaden.

Je kunt ook het compileren én uploaden met één opdracht doen:

esphome bureau.yaml run

Als alles goed gaat, krijg je geen foutmelding te zien en draait er nu ESPHome op je apparaat. Druk op Ctrl+C als je de loguitvoer niet meer wilt zien. ESPHome blijft gewoon verder draaien op je ESP8266. Je kunt de usb-kabel nu ook verwijderen en het bordje met een voedingsadapter in het stopcontact steken.

09 ESPHome zet je configuratie om in C++-code en compileert die tot firmware.

10 Met Home Assistant koppelen

Open nu de webinterface van Home Assistant. Normaal gesproken zul je onderaan links al een notificatie gekregen hebben, omdat Home Assistant je ESPHome-apparaat heeft ontdekt. Klik erop en dan op Check it out. Er staat een nieuw apparaat: ESPHome: bureau. Klik op Configureer en bevestig dat je het apparaat wilt toevoegen.

Indien Home Assistant je apparaat niet heeft ontdekt, ga dan naar Instellingen / Integraties en stel met het plusteken onderaan een nieuwe integratie in. Kies ESPHome en vul dan bij de host het ip-adres of de mDNS-naam (in ons voorbeeld bureau.local) in.

Je krijgt nu de vraag om een wachtwoord in te voeren. Dat is het OTA-wachtwoord dat je in stap 8 hebt ingesteld. Dat wordt immers standaard ook gebruikt voor de API waarmee Home Assistant toegang tot je apparaatje krijgt. Nadat Home Assistant succesvol toegang tot je ESPHome-apparaat heeft gekregen, kun je het nog aan een gebied toekennen, zoals je woonkamer. Klik tot slot op Voltooien, waarna het apparaat in Home Assistant bekend is.

10 Koppel je ESPHome-apparaat aan Home Assistant.

11 Geheim bestand

De configuratie die we voor onze luchtkwaliteitsmonitor willen maken, is vrij lang en complex. In plaats van alles in één groot YAML-bestand te zetten, waardoor je geen overzicht hebt, gaan we onze configuratie modulair maken. Elke sensor definiëren we in een afzonderlijk bestand, de basisconfiguratie voor wifi en dergelijke ook, en alle wachtwoorden en andere gevoelige gegevens zetten we in een afzonderlijk bestand.

Laten we met dat laatste beginnen. Maak een bestand secrets.yaml aan. ESPHome behandelt dit bestand op een speciale manier. Het is de bedoeling dat je hierin alle gevoelige gegevens zet, zoals wachtwoorden. Dat kan als volgt:

wifi_ssid: MYSSID

wifi_password: SECRET

wifi_ap_password: VERY_SECRET

api_password: REALLY_SECRET

ota_password: ALSO_SECRET

Vul hierin na de dubbele punt je eigen wachtwoorden en andere geheimen in. Je vindt die in bureau.yaml. We gaan ervan uit dat je dezelfde wachtwoorden gebruikt voor meerdere ESPHome-apparaten. Wil je elk apparaat een eigen API- en OTA-wachtwoord geven, voeg dan extra regels voor die wachtwoorden toe aan het bestand secrets.yaml.

Home Assistant

In dit artikel koppelen we onze luchtkwaliteitssensor aan Home Assistant, de veelzijdige software die de basis vormt van je domoticasysteem. Je kunt allerlei apparaten koppelen waardoor je alle informatie op één plek terugvindt, en van alles kunt automatiseren en koppelen. Je kunt het pakket op allerlei apparaten installeren, vaak wordt hiervoor een Raspberry Pi gebruikt. Op onze website vind je meer informatie over de installatie van Home Assistant via www.tiny.cc/autoalles.

We schreven al dat Home Assistant veelzijdig is, dat geldt ook voor het pakket zelf. Zo kun je bijvoorbeeld zelf een dashboard ontwerpen met daarop alle gegevens die jij in één oogopslag wilt zien. Je leest hier meer over op www.tiny.cc/hadash.

Je kunt zelf een dashboard voor Home Assistent ontwerpen.

12 Geheimen verbergen

In het bestand dat de wizard heeft aangemaakt, verwijder je nu al die geheimen. En op de plaats waar het geheim stond, zet je !secret gevolgd door de naam van het geheim. Dat ziet er dan als volgt uit:

esphome:

name: bureau

platform: ESP8266

board: nodemcuv2

wifi:

ssid: !secret wifi_ssid

password: !secret wifi_password

# Enable fallback hotspot (captive portal) in case wifi connection fails

ap:

ssid: "Luchtkwaliteit Bureau"

password: !secret wifi_ap_password

captive_portal:

# Enable logging

logger:

# Enable Home Assistant API

api:

password: !secret api_password

ota:

password: !secret ota_password

We verwijzen hier telkens met !secret naar de waarde van de variabele die we in het bestand secrets.yaml hebben gedefinieerd.

13 Gemeenschappelijke configuratie

Als je bovenstaande configuratie doorleest, zie je dat dit bijna allemaal algemene instellingen zijn, die hetzelfde zijn voor elk ander ESPHome-apparaat dat je hebt. Alleen de naam, het fallback-accesspoint, en eventueel het platform en bord verschillen per apparaat.

Maak daarom een map common aan en plaats daarin een bestand base.yaml met de volgende inhoud:

esphome:

name: ${node_name}

platform: ${node_platform}

board: ${node_board}

build_path: ./build/${node_name}

wifi:

ssid: !secret wifi_ssid

password: !secret wifi_password

# Enable fallback hotspot (captive portal) in case wifi connection fails

ap:

ssid: "AP ${node_name}"

password: !secret wifi_ap_password

captive_portal:

# Enable logging

logger:

# Enable Home Assistant API

api:

password: !secret api_password

ota:

password: !secret ota_password

Iets nieuws zijn zaken zoals ${node_name}. Dat zijn substituties, die we in het apparaatspecifieke configuratiebestand definiëren. Laten we daar nu eens naar kijken.

14 Uitgeklede configuratie

Doordat we alle gemeenschappelijke configuratie in een afzonderlijk bestand hebben gezet, worden de configuratiebestanden van onze ESPHome-apparaten heel wat korter. Het voorbeeld dat de wizard heeft gemaakt, kunnen we nu uitkleden tot:

substitutions:

node_name: bureau

node_platform: ESP8266

node_board: nodemcuv2

packages:

base: !include common/base.yaml

Je ziet hier dat we eerst enkele substituties definiëren, die specifiek zijn voor dit ESPHome-apparaat. Dat zijn hier de naam, het platform en het bord. Daarna definiëren we een pakket, dat verwijst naar het YAML-bestand waarin we de gemeenschappelijke configuratie hebben gezet.

ESPHome combineert nu het YAML-bestand base.yaml met dit YAML-bestand. Elke keer dat ESPHome ${node_name} tegenkomt, wordt dit vervangen door de waarde die je voor node_name hebt ingevuld onder substitutions. In dit geval bureau.

Als je dit nu wilt compileren, krijg je een foutmelding omdat ESPHome het bestand secrets.yaml niet kan vinden. We hebben immers het bestand base.yaml in de directory common geplaatst, dus zoekt ESPHome als het in dat bestand een geheim tegenkomt naar het bestand secrets.yaml in dezelfde directory. Verplaats daarom secrets.yaml ook naar de directory common.

15 Temperatuursensor configureren

Tot nu toe doet je ESPHome-apparaat nog niets, zelfs al hebben we er allerlei sensoren op aangesloten. De software weet immers niet welke sensoren waar zijn aangesloten. Daar gaan we nu verandering in brengen door aan te geven welken sensoren waar zijn aangesloten. We beginnen met de temperatuursensor. Maak een bestand bme280.yaml aan in de map common met onderstaande inhoud. Zoals eerder in het artikel vermeld, kun je alle YAML-bestanden in plaats van overtikken ook downloaden (en waar nodig zelf aanpassen). Zie hiervoor het kader ‘ESPHome-configuratie downloaden’ eerder in deze masterclass.

i2c:

sda: ${i2c_pin_sda}

scl: ${i2c_pin_scl}

sensor:

- platform: bme280

temperature:

id: t_value

name: "${node_name} temperature"

humidity:

id: h_value

name: "${node_name} humidity"

pressure:

id: p_value

name: "${node_name} pressure"

address: ${bme280_i2c_address}

update_interval: ${bme280_update_interval}

We definiëren eerst een I²C-bus, omdat de BME280-sensor die nodig heeft. Daarna definiëren we een sensor van het platform bme280 met een configuratie voor de temperatuur, luchtvochtigheid en luchtdruk. Die hebben elk een ID en een naam: het eerste gebruiken we in de rest van de ESPHome-configuratie, de tweede is de naam waaronder deze waardes in Home Assistant te zien zullen zijn. We stellen ook het I²C-adres en het update-interval in.

16 Temperatuursensor testen

Al deze variabelen voeg je nu toe aan de substituties in bureau.yaml:

i2c_pin_scl: D1

i2c_pin_sda: D2

bme280_i2c_address: "0x76"

bme280_update_interval: 60s

Dit zijn de pinnen waarop de I²C-bus aangesloten is en het I²C-adres van de sensor. Voor ons sensorbordje van CJMCU is het adres 0x76, maar als je een bordje van Adafruit hebt, vul je hier 0x77 in. Je krijgt in de logs van ESPHome sowieso het juiste adres te zien bij de initialisatie van de I²C-bus: ESPHome ontdekt dan het gebruikte adres. Als update-interval kiezen we elke minuut (60s).

Bij de packages voeg je nu het volgende toe:

bme280: !include common/bme280.yaml

Compileer en upload deze code nu. Het uploaden hoeft niet via usb. Als je het OTA-wachtwoord niet hebt veranderd sinds de eerste keer, zal ESPHome je apparaat via mDNS vinden en de nieuwe firmware via het netwerk uploaden.

Als je daarna in Home Assistant klikt op Instellingen / Integraties en bij ESPHome op 1 apparaat, krijg je je ESPHome-apparaat te zien. Als je daarop klikt, zie je ook de entiteiten die bij het apparaat horen, namelijk de temperatuur, luchtvochtigheid en luchtdruk. Deze waardes kun je nu ook op allerlei manieren in het dashboard van Home Assistant tonen.

16 ESPHome stuurt de metingen van de temperatuursensor naar Home Assistant.

17 CO₂-sensor configureren

De CO₂-sensor configureer je op een vergelijkbare manier waarbij je de juiste gegevens voor deze sensor gebruikt. Maak een bestand mh-z19b.yaml aan in de map common en definieer daarin eerst een UART-component:

uart:

- id: uart_mhz19b

rx_pin: ${mhz19b_pin_tx}

tx_pin: ${mhz19b_pin_rx}

baud_rate: 9600

De MH-Z19B gebruikt immers geen I²C, maar een seriële UART-verbinding. We definiëren hier de pinnen voor RX (ontvangen) en TX (verzenden). Let op: aan de RX-pin van de UART-verbinding kennen we de TX-pin van de sensor toe en andersom. De ESP8266 ontvangt immers wat de sensor zendt en de sensor ontvangt wat de ESP8266 zendt. Voeg dan de sensor zelf toe:

sensor:

- platform: mhz19

id: co2_sensor

uart_id: uart_mhz19b

co2:

name: "${node_name} CO₂"

id: co2_value

update_interval: ${mhz19b_update_interval}

automatic_baseline_calibration: false

Zoals je ziet, verwijzen we naar de UART die we hiervoor hebben aangemaakt.

18 CO₂-sensor kalibreren

We schakelen ook de automatische kalibratie uit. Standaard kalibreert de sensor zichzelf immers elke 24 uur, te beginnen vanaf het moment dat je ze inschakelt. Maar de kalibratie werkt pas correct als de sensor zich twintig minuten in de buitenlucht bevindt. Als je op het moment van de kalibratie juist geen raam open hebt en er misschien zelfs meerdere personen zich in de ruimte bevinden, zal de sensor zich verkeerd afstellen.

Daarom is het beter om de kalibratie zelf te starten, op een moment waarvan je weet dat de lucht zuiver is. We maken eerst een binaire sensor aan die bijhoudt of de sensor al is gekalibreerd sinds de ESP8266 opstartte:

binary_sensor:

- platform: template

name: "${node_name} CO₂ sensor calibrated"

id: co2_calibrated

En we zetten de waarde van die sensor op OFF na het opstarten:

esphome:

on_boot:

priority: 500

then:

- binary_sensor.template.publish:

id: co2_calibrated

state: OFF

Dan maken we een schakelaar aan in onze ESPHome-configuratie:

switch:

- platform: template

name: "${node_name} calibrate CO₂ sensor"

id: co2_calibrate

optimistic: true

on_turn_on:

then:

- mhz19.calibrate_zero: co2_sensor

- delay: 20min

- switch.turn_off: co2_calibrate

- binary_sensor.template.publish:

id: co2_calibrated

state: ON

Deze schakelaar voert vier acties uit: hij kalibreert de CO₂-sensor, wacht twintig minuten en schakelt zichzelf dan uit. Zo kun je aan de toestand van de schakelaar zien of de kalibratie nog aan de gang is. Tot slot zet hij de waarde van de binaire sensor die aangeeft of de sensor al is gekalibreerd op ON.

Andere leuke projecten

Door de geïntegreerde wifi is de door ons gebruikte NodeMCU niet alleen een goede basis voor projecten waarbij je gemeten data verwerkt, maar ook voor projecten waarbij juist externe data van bijvoorbeeld internet wordt verwerkt. Die data kun je dan met bijvoorbeeld leds of een schermpje vertalen naar de echte wereld. We hebben eerder bijvoorbeeld een pollenalarm gebouwd op basis van een NodeMCU. Dit project haalt juist data op bij bronnen op internet en geeft je vervolgens een waarschuwing als er teveel pollen in de lucht zitten.

Eerder gebruikten we de NodeMCU voor een pollenalarm dat je met een rood lichtje en mailtje laat weten of er pollen in de lucht zitten.

19 CO₂-sensor testen

Voeg de volgende substituties toe aan het bestand bureau.yaml:

mhz19b_pin_tx: D4

mhz19b_pin_rx: D5

mhz19b_update_interval: 60s

En voeg het volgende package toe met:

mhz19b: !include common/mh-z19b.yaml

Compileer en upload deze configuratie. Daarna krijg je in Home Assistant drie nieuwe entiteiten te zien: de CO₂-concentratie; of de sensor al is gekalibreerd of niet; en een schakelaar waarmee je de kalibratie start. Voor de kalibratie doe je het raam open, wacht je twintig minuten en schuif je de kalibratieknop naar rechts. Zodra de knop zichzelf uitschakelt, weet je dat de sensor is gekalibreerd.

De sensor duidt nu ook in Home Assistant aan wanneer je hem na een herstart dient te kalibreren. Volgens de datasheet moet je hem regelmatig kalibreren, minstens elke zes maanden. Voeg daarom aan het bestand mh-z19b.yaml de volgende code toe die periodiek de binaire sensor uitschakelt die aanduidt of de CO₂-sensor al is gekalibreerd:

interval:

- interval: ${mhz19b_calibration_interval}

then:

- binary_sensor.template.publish:

id: co2_calibrated

state: OFF

En aan de substituties in het bestand bureau.yaml voeg je een waarde voor het interval toe, bijvoorbeeld:

mhz19b_calibration_interval: 30d

Op die manier krijg je elke maand aan de toestand van de binaire sensor te zien dat je de CO₂-sensor het best weer kalibreert.

Als de logs tonen dat ESPHome geen data terugkrijgt van de sensor, is de timing mogelijk verstoord door de UART die voor de logs gebruikt wordt. Schakel dit dan uit:

logger:

baud_rate: 0

20 Fijnstofsensor configureren

Dan voegen we de configuratie voor de SDS011 toe, die de concentratie fijnstof meet. Die communiceert net zoals de MH-Z19B via UART. Maak dus een bestand sds011.yaml aan in de map common en definieer daarin eerst een UART-component:

uart:

- id: uart_sds011

rx_pin: ${sds011_pin_tx}

tx_pin: ${sds011_pin_rx}

baud_rate: 9600

Let ook hier op: aan de RX-pin van de UART-verbinding kennen we de TX-pin van de sensor toe en andersom.

Voeg dan de sensor zelf toe:

sensor:

- platform: sds011

uart_id: uart_sds011

pm_2_5:

id: pm2_5_value

name: "${node_name} PM2.5"

pm_10_0:

id: pm10_value

name: "${node_name} PM10"

update_interval: ${sds011_update_interval}

Deze verwijst naar de zojuist aangemaakte UART.

21 Fijnstofsensor testen

Voeg de volgende substituties toe aan het bestand bureau.yaml:

sds011_pin_tx: D3

sds011_pin_rx: D6

sds011_update_interval: 5min

Het update-interval is voor deze sensor belangrijk. Als je dit niet instelt, is de sensor continu actief. Volgens de datasheet heeft de laserdiode een levensduur van 8000 uur, of minder dan een jaar in continu gebruik. Daarom laten we de sensor maar elke vijf minuten zijn waarde updaten. ESPHome schakelt de sensor dan elke vijf minuten een halve minuut in en daarna weer uit. De sensor gaat dan zes keer langer mee, of meer dan vijf jaar. Omdat bronnen van fijnstof in een thuisomgeving vaak langdurig actief zin, is een interval van vijf minuten zeker voldoende.

Voeg dan het volgende package toe:

sds011: !include common/sds011.yaml

Compileer en upload deze configuratie. Daarna krijg je in Home Assistant twee nieuwe entiteiten te zien: de concentratie aan fijnstof kleiner dan 2,5 µm en 10 µm.

21 Home Assistant toont de metingen van alle sensoren.

22 RGB-led configureren

Dan voegen we nu de configuratie voor de RGB-led toe in het bestand rgb_led_esp8266.yaml in de map common. Dat ziet er als volgt uit:

output:

- platform: esp8266_pwm

id: led_red

pin: ${led_pin_red}

max_power: 1

- platform: esp8266_pwm

id: led_green

pin: ${led_pin_green}

max_power: 0.011

- platform: esp8266_pwm

id: ${led_pin_blue}

max_power: 0.722

light:

- platform: rgb

id: led_rgb

red: led_red

green: led_green

blue: led_blue

We definiëren eerst drie uitgangen van het platform esp8266_pwm. Hiermee kunnen we van een led op elk van die pinnen via pulsbreedtemodulatie de helderheid instellen. Omdat de helderheid van elke kleurcomponent verschilt (groen is veel helderder), passen we die met max_power aan. De juiste verhoudingen vind je in de datasheet van de RGB-led en we verheffen dit nog tot de macht 2,8, omdat ESPHome dit standaard als gammacorrectie doorvoert. Daarna maken we een licht aan van het platform rgb waaraan we de drie kleurcomponenten toekennen.

Omdat we met de led willen aanduiden wanneer de sensor nog niet gekalibreerd is, voegen we ook triggers toe aan de binaire sensor co2_calibrated van het bestand mh-z19B.yaml:

on_press:

then:

- light.turn_off:

id: led_rgb

on_release:

then:

- light.turn_on:

id: led_rgb

brightness: 100%

red: 0%

green: 0%

blue: 100%

En in de lijst met acties van de schakelaar om de CO₂-sensor te kalibreren, laten we de led vlak voor de delay paars schijnen:

- light.turn_on:

id: led_rgb

brightness: 100%

red: 100%

green: 0%

blue: 100%

23 RGB-led testen

De substituties in het bestand bureau.yaml zijn nu eenvoudig:

led_pin_red: D7

led_pin_green: D8

led_pin_blue: TX

Voeg dan het package toe waarin we de leds hebben gedefinieerd:

rgb: !include common/rgb_led_esp8266.yaml

Compileer en upload deze configuratie. Nadat je ESP8266 is opgestart, brandt de led blauw. En als je nu de sensorkalibratie start, wordt de led paars en gaat ze uit nadat de kalibratie voorbij is.

24 Luchtkwaliteitsindex

Dan willen we nu tonen of de luchtkwaliteit goed, aanvaardbaar of slecht is, en dat ook met de kleur van de RGB-led tonen. Maak een bestand aqi.yaml aan in de map common en definieer hierin eerst een text_sensor die de luchtkwaliteitsindex in tekstvorm toont:

text_sensor:

- platform: template

name: "${node_name} Air Quality Index"

id: aqi

icon: mdi:air-filter

De CO₂-waarde kunnen we rechtstreeks gebruiken voor de luchtkwaliteitsindex, maar voor de fijnstofwaarden raden de WHO-richtlijnen aan om naar het gemiddelde van 24 uur te kijken. Gelukkig kunnen we dit eenvoudig berekenen door in ESPHome een template-sensor aan te maken met een filter:

sensor:

- platform: template

name: "${node_name} PM2.5 24h average"

id: pm2_5_avg_24h

icon: mdi:chemical-weapon

unit_of_measurement: µg/m³

lambda: |-

return id(pm2_5_value).state;

update_interval: 60s

filters:

- sliding_window_moving_average:

window_size: 1440

send_every: 1

on_value:

then:

- script.execute: update_aqi

Het getal 1440 is het aantal minuten in een dag. Omdat deze sensor elke minuut een update krijgt, neemt deze de gemiddelde waarde over de afgelopen 24 uur aan van de sensor pm2_5_value. Bij elke wijziging van deze gemiddelde waarde voeren we een script uit. Maak een vergelijkbare sensor aan voor de PM10-waarde.

Voeg nu ook bij de CO₂-sensor in het bestand mh-z19b.yaml (vlak onder id: co2_value) het volgende toe om de luchtkwaliteitsindex bij elke update van de CO₂-sensor te updaten:

on_value:

then:

- script.execute: update_aqi

25 Drempelwaardes

Dan maken we het script update_aqi aan. De code hiervan vind je op de GitHub-pagina van dit project, want hij is vrij lang. Het script kijkt of minstens een van de sensoren een te hoge waarde heeft. De luchtkwaliteitsindex wordt dan op Slecht gezet en de led op rood. Als minstens een van de sensoren aanvaardbaar is, wordt de index op Aanvaardbaar gezet en de led op geel. En in het andere geval (alle sensoren hebben een goede waarde) krijgt de index de waarde Goed en wordt de led groen.

Dit script maakt voor de drempelwaardes en voor de tekstuele representaties van de index gebruik van substituties. Die definieer je het best in het bestand base.yaml in de map common, bijvoorbeeld:

substitutions:

aqi_co2_max_good: "800"

aqi_co2_max_acceptable: "1200"

aqi_pm2_5_avg_24h_max_good: "12"

aqi_pm2_5_avg_24h_max_acceptable: "25"

aqi_pm10_avg_24h_max_good: "25"

aqi_pm10_avg_24h_max_acceptable: "50"

aqi_message_bad: "Slecht"

aqi_message_acceptable: "Aanvaardbaar"

aqi_message_good: "Goed"

Voeg ook het pakket aqi toe in het YAML-bestand van je apparaat:

aqi: !include common/aqi.yaml

Welke drempelwaardes gebruiken?

Er is heel wat onderzoek gedaan naar de drempelwaardes voor aanvaardbare luchtkwaliteit. Overheden van verschillende landen hebben elk hun eigen normen en binnen één land zijn er vaak zelfs verschillende richtlijnen. In Nederland zijn er bijvoorbeeld richtlijnen rond het CO₂-gehalte door het Bouwbesluit, de Arbodienst, de GGD, de Gezondheidsraad, de PO- en VO-raad. En voor de concentraties fijnstof zijn er allerlei Europese en internationale richtlijnen (van het WHO). Maar die zijn er vooral voor de buitenlucht. Op aanraden van luchtkwaliteitsspecialist Dieter Pientka maken we in onze configuratie gebruik van de WHO-richtlijnen voor de buitenlucht van PM2,5 en PM10.

26 Op perfboard solderen

Onze huidige opstelling met een breadboard is niet echt gebruiksvriendelijk. Dit plaats je niet in je woonkamer, zeker niet met kinderen of huisdieren in de buurt. De draadjes raken snel los. Daarom soldeer je de componenten het best op een perfboard, dat we in een behuizing plaatsen. Wij kozen voor een perfboard van 7 bij 9 cm.

Een perfboard is een universeel printplaatje met allemaal gaatjes die aan één kant van een koperen ring voorzien zijn. De componenten plaats je aan de andere kant in de gaatjes en aan de koperkant kun je ze vastsolderen. Ten slotte soldeer je via draadjes of overschotten van pootjes van weerstanden de componenten aan elkaar.

26 Een perfboard is een universeel printplaatje waarop je componenten soldeert.

Leren solderen

Om de luchtkwaliteitsmeter in de praktijk te gebruiken, zul je de componenten op een perfboard moeten solderen. Eerder hebben we in Computer!Totaal aandacht besteedt aan het solderen zelf. Dit artikel vind je op onze website via www.tiny.cc/sold. Hier vind je praktische tips om je soldeerklussen succesvol uit te voeren. In het kort begint solderen bij de soldeerbout, specifiek de soldeerstift. Zorg dat deze goed rondom vertind is, door wat soldeer erop te laten smelten. Veeg de stift goed af aan een vochtig sponsje of andere soldeerpuntreiniger, zodat er geen druppels tin meer te zien zijn. Nu pas is de soldeerbout klaar voor gebruik. Leg nu de printplaat omgekeerd op het werkblad van je bureau (zorg voor een ondergrond die vies mag worden) en druk de soldeerstift zowel tegen het koperen eilandje op de printplaat als tegen het pootje van de te solderen component. Met je andere hand houd je het uiteinde van het soldeer op korte afstand van de soldeerstift tegen het koper. Meer tips lees je in het genoemde online-artikel. En mocht je nog geen soldeerbout en aanverwante accessoires in huis hebben, dan vind je daarin ook tips voor wat je nodig hebt.

27 Headers

We tonen je hoe je alles bevestigt met de ESP32-DevkitC V4. Omdat sensoren niet eeuwig meegaan, solderen we alle sensoren en het ESP32-bordje niet rechtstreeks op het perfboard, maar op vrouwelijke headers. Zo zijn defecte componenten later eenvoudiger te verwisselen.

Plaats de headers los op het printplaatje en probeer of alles in je behuizing past. Plaats de sensoren het best zo ver mogelijk van het ESP32-bordje om de impact van warmteontwikkeling te verminderen. De fijnstofsensor plaats je ondersteboven onder het printplaatje, met de ventilator aan de onderzijde. Zowel de ingang als de uitgang van de ventilator moeten vrij blijven. Later zullen we ventilatiegaten in de behuizing boren.

Plaats de headers op hun definitieve plaats en draai het bordje om, zodat de koperkant zichtbaar is. Soldeer een voor een alle headerpinnen.

27 De headers zijn op het perfboard gesoldeerd.

28 Montagegaten, led en verbindingsdraden

Dan is nu het beste moment om de montagegaten te boren om de SDS011 onderaan het perfboard te bevestigen. Er zitten drie montagegaten met een binnendiameter van 3,2 mm in de printplaat van de SDS011. Boor op dezelfde locatie in je perfboard gaten, zodat je beide printplaatjes met een afstandshouder op elkaar kunt monteren. Wacht echter met die montage, want je moet eerst de andere componenten en de verbindingsdraden nog solderen.

Soldeer eerst de RGB-led. Plaats die aan de zijkant van het bordje en positioneer die zo dat ze net uit de behuizing komt. De drie GPIO’s kun je via de lange pootjes van de weerstanden met de drie pootjes voor de kleuren verbinden. Voor de verbinding met GND gebruik je een 24AWG-draad waarvan je de uiteindes stript. Daarna soldeer je de headers via 24AWG-verbindingsdraden aan de juiste pinnen van de ESP32.

29 De behuizing klaarmaken

Dan dien je nu alles in een behuizing te stoppen en op de juiste plaatsen gaten te boren voor de led, de usb-kabel en ventilatiegaten voor de inlaat en uitlaat (de ventilator) van de fijnstofsensor. We kozen als behuizing voor een Bopla Euromas ET 212 van 10 × 10 × 5,7 cm.

Het is ook aan te raden om extra ventilatiegaten boven de ESP32-module en de temperatuursensor te boren. De ESP32 genereert immers zelf wat warmte en die voer je het best zo snel mogelijk af om te voorkomen dat de behuizing opwarmt en de temperatuursensor die verhoogde temperatuur meet. Daarna kun je je printplaatje in de behuizing plaatsen en die dicht doen.

29 Alle componenten zijn gemonteerd en de behuizing kan dicht.

30 Temperatuur aanpassen

Steek nu de stekker in het apparaat en kijk in Home Assistant welke waardes je te zien krijgt. Vergelijk de temperatuur met de temperatuur van een andere sensor in dezelfde ruimte. Waarschijnlijk ligt de temperatuur van jouw sensor hoger door de opwarming van de behuizing. Laat je opstelling zo even draaien tot de temperatuur is gestabiliseerd.

Bekijk dan het verschil in temperatuur. ESPHome laat eenvoudig toe om een verschilwaarde bij een sensor op te tellen. Open daarvoor het bestand bme280.yaml en voeg bij de temperatuursensor een filter toe:

- platform: bme280

temperature:

id: t_value

name: "${node_name} temperature"

filters:

- offset: ${bme280_offset_temperature}

In je hoofdconfiguratie voeg je dan een substitutie toe die aan bme280_offset_temperature de gemeten verschilwaarde toekent:

bme280_offset_temperature: "-3"

Je zou hetzelfde kunnen doen met de gemeten luchtvochtigheid: die is door de opwarming van de behuizing wellicht enkele procenten lager dan normaal.

31 Alternatieve temperatuurmeting

Een andere oplossing voor de opwarming van de behuizing is dat je de temperatuursensor buiten de behuizing monteert. Dat laten we als oefening voor de lezer over. Veel hangt ook af van welke behuizing je kiest. De BME280 is misschien wat te opvallend als je die buiten de behuizing monteert. Je zou daarom kunnen kiezen voor een NTC-thermistor. Dat is een temperatuursafhankelijke weerstand, die heel compact is en je eenvoudig als een klein speldenknopje door een gaatje in de behuizing kunt leiden. Een andere optie is de DS18B20, een 1-Wire-temperatuursensor in TO-92-behuizing (vaak gebruikt voor transistors). Beide meten overigens alleen de temperatuur, geen luchtvochtigheid of luchtdruk.

31 De DS18B20 is een andere temperatuursensor die je kunt gebruiken in ESPHome.

32 Afwerking

Een andere afwerking die je zou kunnen doen, is niet gebruikmaken van een universele behuizing waarin je gaten boort, maar een behuizing op maat ontwerpen en 3D-printen. Op die manier kun je misschien ook voor een betere warmteafvoer zorgen en de temperatuursensor in een eigen compartiment afscheiden van de ESP32-module.

En tot slot zou je het perfboard ook kunnen vervangen door een zelf ontworpen printplaat, die je door een bedrijf laat produceren. Je moet dan nog wel de headers, weerstanden en RGB-led solderen, maar je spaart het solderen van de bedrading uit. Het is ook iets betrouwbaarder dan een perfboard.

We zijn in dit artikel ook niet ingegaan op de verdere integratie met Home Assistant. Je kunt een visualisatie op maat van de gegevens maken in het Lovelace-dashboard van Home Assistant. Je zou ook extra’s kunnen toevoegen, bijvoorbeeld om de led ‘s nachts uit te schakelen of om de led uit te schakelen als de luchtkwaliteit goed is, of een geluidssignaal met een zoemer als de luchtkwaliteit verslechtert. We hopen dat je je door dit artikel hebt laten inspireren om zelf aan de slag te gaan en je eigen luchtkwaliteitsmonitor te maken.

32 De CO₂-concentratie blijkt vooral af te hangen van hoelang en met hoeveel personen je je in een ruimte bevindt.

Andere componenten?

De componenten die we in dit artikel gekozen hebben, zijn niet de enige goede. We hebben dit project zo modulair mogelijk opgebouwd, zodat je gerust componenten voor andere kunt inwisselen. Je kunt bijvoorbeeld een schermpje toevoegen of het ontwikkelbordje vervangen door een met ingebouwd scherm, zoals de LilyGO TTGO T-Display ESP32. Je moet dan de ESPHome-configuratie wel uitbreiden om de sensorgegevens op het schermpje te tonen. Een goede alternatieve CO₂-sensor is de SenseAir S8, maar die hebben we niet gekozen omdat ESPHome die op het moment van schrijven nog niet kon kalibreren. Een goed alternatief voor de fijnstofsensor is de PMSx003-familie van Plantower.

De LilyGO TTGO T-Display is een ESP32-bordje met ingebouwd oledscherm.

4 Reactie(s) op: Maak je eigen luchtkwaliteitsmonitor

  • Om te reageren moet je ingelogd zijn. Nog geen account? Registreer je dan en praat mee!
  • 29 juli 2021 13:40 cslekniws
    Hartelijk dank voor dit zeer interessante artikel! Mijn handen jeuken. Omdat ik toch wat onbekend ben met de componenten vroeg ik me af of een boodschappenlijstje toegevoegd kan worden met onderdelen. Dan weet je zeker dat je het juiste kiest om dit na te bouwen. Alleen aan het microcontroller boardje kom ik meerdere varianten van tegen en ik heb het idee dat alles exact moet kloppen om het na te kunnen bouwen..
    Wanneer je een reactie plaatst ga je akoord
    met onze voorwaarden voor reacties.
  • 29 juli 2021 16:05 koenvervloesem
    @cslekniws Het ontwerp is flexibel genoeg voor allerlei varianten. Op https://github.com/koenvervloesem/ESPHome-Air-Quality-Monitor#requirements vind je de verschillende componenten. Eigenlijk is er als je de uitwerking van in het artikel volgt alleen wat variatie bij het ESP8266/ESP32-bordje en de BME280. Voor de inbouw in de Bopla Euromas ET 212-behuizing koos ik als ESP32-bordje de ESP32-DevKitC V4, en voor de BME280 koos ik de CJMCU-280E 3.3 V-versie.
    Wanneer je een reactie plaatst ga je akoord
    met onze voorwaarden voor reacties.
  • 29 juli 2021 16:14 cslekniws
    Hartelijk dank Koen! Daar ga ik me eens op bezinnen. Mooi project!
    Wanneer je een reactie plaatst ga je akoord
    met onze voorwaarden voor reacties.
  • 26 augustus 2021 21:15 cslekniws
    @Koenvervloesem : ik ben aan de slag gegaan en heb de BME280 op de ESP32 aan de praat. Ook de CO2 gekocht (langzaam opbouwen ;-).
    Wat ik niet aan de MH-Z19B begrijp is het calibreren. Ik wil de sensor binnen gebruiken. Als ik hem dan eerst met de automatische calibratie 24 uur buiten laat draaien, dan de config op ABC = false zet en dan naar binnen verplaats: blijft hij dan de ijkwaarde van buiten houden (die zo zuiver mogelijk is)?
    Wanneer je een reactie plaatst ga je akoord
    met onze voorwaarden voor reacties.

Wanneer je een reactie plaatst ga je akoord
met onze voorwaarden voor reacties.