Maak je eigen CO₂ monitor met SenseAir S8 en ESP32

De SenseAir S8 CO₂-sensor bovenaan verbonden met de ESP32-ontwikkelingskit onderaan. De software die op de microcontroller wordt geflasht, leest de CO₂-sensorwaarden uit en stuurt deze via Wi-Fi naar een Home Assistant-server.

De SenseAir S8 CO₂-sensor bovenaan verbonden met de ESP32-ontwikkelingskit onderaan. De software die op de microcontroller wordt geflasht, leest de CO₂-sensorwaarden uit en stuurt deze via Wi-Fi naar een Home Assistant-server.

CO₂-monitoren kunnen behoorlijk duur zijn en staan zelden toe dat je de waarden er rechtstreeks van afleest om ze te integreren in je eigen opstelling, maar dwingen je in plaats daarvan om een gesloten oplossing te gebruiken waarbij de gegevens je lokale netwerk kunnen verlaten en er privacy- en beveiligingsproblemen ontstaan. De kwaliteit tussen CO₂-sensoren kan enorm zijn en bij veel CO₂-monitoren weet je niet welke sensor de verkoper geselecteerd heeft.

In dit artikel leg ik uit hoe je je eigen CO₂-monitor kunt maken en integreren met Home Assistant.1. Laten we beginnen met de onderdelen die je nodig hebt:

  • SenseAir S8 LP: Twee populaire en goedkope CO₂-sensoren zijn de MH-Z19 (of de nieuwere MH-Z19B2), geproduceerd door Winsen Lt. uit China, en de S8 van SenseAir3, een Zweedse fabrikant.

    Ik besloot voor de S8 te gaan, omdat deze uit Europa komt, een langere verwachte levensduur heeft (15 jaar versus 5 jaar) en, het allerbelangrijkste, een beter zelfkalibratiealgoritme heeft, waar ik het later over zal hebben. Ik heb de S8 LP (low-power, productnummer 004-0-0053) gekocht, maar je kunt ook de S8 Residential kopen. Kijk op de website van SenseAir voor de varianten.

  • ESP32 DevKit: Met alleen een sensor kom je niet ver. Je hebt ook een module nodig die de sensorwaarden kan lezen en deze via Wi-Fi naar een centrale server kan sturen.

    In dit artikel ik gekozen voor een ESP32-ontwikkelbord. Deze bevatten een 32-bits microcontroller, pinnen die we gaan gebruiken (5V, aarde, TX en RX), een Wi-Fi-controller en een USB-poort voor het flashen van de firmware. Ik raad de Espressif ESP32-DevKitC4 aan, die de ESP32-WROOM-32D microcontroller gebruikt, maar er zijn vele andere die je kunt kopen.

  • 4x jump wires (M/M): Deze draden worden gebruikt voor het verbinden van de 5V, aarde, TX en RX pinnen. Je hebt in totaal vier male-to-male jump wires nodig, idealiter 10-20 cm lang.

  • 5V micro-USB-voeding: De SenseAir S8-sensor heeft 5V nodig om te werken. Wees voorzichtig met over- of onderspanning, want dit kan de sensor beschadigen. Je kunt zowel de ESP32 DevKit als de S8-sensor van stroom voorzien met deze voeding.

  • Breadboard (optioneel): Het is geen strikte vereiste, maar een breadboard maakt het gemakkelijker om het ontwikkelbord met de sensor te verbinden. Ik heb twee breadboards gebruikt, omdat een enkele niet breed genoeg is voor de ESP32 DevKit.

Zodra je alle componenten hebt, is het tijd om ze met elkaar te verbinden. Je kunt het onderstaande schema daarvoor gebruiken. Wees wel voorzichtig, want de locatie van de pinnen kan verschillen tussen ESP32-borden en je wilt de oriëntatie van de S8-sensor goed hebben. Gebruik de 5V en aarde pinnen niet door elkaar!

Schematisch overzicht van de bedrading tussen de S8-sensor (boven) en het ESP32-ontwikkelbord (onder). Let op de oriëntatie voor de bedrading.

Schematisch overzicht van de bedrading tussen de S8-sensor (boven) en het ESP32-ontwikkelbord (onder). Let op de oriëntatie voor de bedrading.

We moeten de ESP32 microcontroller flashen met software die de sensorwaarden uitleest en deze via Wi-Fi naar een server stuurt. Je zou zelf iets kunnen programmeren, maar een veel eenvoudigere methode is het installeren van ESPHome op de server, dat goed integreert met de S8 sensor5 en Home Assistant. ESPHome genereert de benodigde ESP32-code voor je (op basis van een configuratie die je aanlevert), compileert het, flasht het op de microcontroller via USB en dient zelfs als eindpunt voor het ontvangen van de sensorwaarden via Wi-Fi. Het onderstaande schema toont de verschillende componenten in onze opstelling.

De verschillende onderdelen op de server (linkerkant) en op de CO₂-monitor (rechterkant). Dit artikel richt zich alleen op de geel gekleurde onderdelen.

De verschillende onderdelen op de server (linkerkant) en op de CO₂-monitor (rechterkant). Dit artikel richt zich alleen op de geel gekleurde onderdelen.

Als je een supervised Home Assistant gebruikt, kun je ESPHome installeren via de add-on store6. Als alternatief kun je ESPHome installeren als Python package of Docker image op je server7. Vanuit een supervised Home Assistant druk je op Open Web UI om het ESPHome dashboard te openen. Anders open je een browser en navigeer je naar poort 6052 van je server.

Druk in het dashboard op het groene “+”-teken in de rechterbenedenhoek om een nieuwe node te maken. Geef het een naam, selecteer Espressif ESP32 Dev Module als apparaattype, voer de Wi-Fi gegevens in (en optioneel de Over-The-Air gegevens) en druk op Finish. Druk op Edit op het knooppunt dat je zojuist hebt gemaakt en voeg de uart en sensor secties toe zoals weergegeven in de yaml configuratie hieronder. Druk op Save om de aanpassingen op te slaan.

esphome:
  name: bedroom_johan_co2
  platform: ESP32
  board: esp32dev

wifi:
  ssid: "..."
  password: "..."

uart:
  rx_pin: RX
  tx_pin: TX
  baud_rate: 9600

sensor:
  - platform: senseair
    co2:
      name: "SenseAir CO2 Value"
    update_interval: 60s

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: "..."

ota:
  password: "..."

Sluit de ESP32 DevKit via USB aan op je server terwijl je de BOOT-knop op het bord ingedrukt houdt. Selecteer het USB-apparaat in de rechterbovenhoek van het dashboard en druk op Upload. Het compileren en flashen van de code kan even duren. Nadat het proces is voltooid, kun je de DevKit loskoppelen en op de gewenste locatie in je huis plaatsen. Voed het met de micro-USB-voeding. Na een tijdje zou de node groen moeten oplichten in het dashboard. Druk op Logs om te controleren of de CO₂-metingen correct worden uitgelezen.

INFO Reading configuration /config/bedroom_johan_co2.yaml...
INFO Starting log output from bedroom_johan_co2.local using esphome API
INFO Connecting to bedroom_johan_co2.local:6053 (192.168.178.4)
INFO Successfully connected to bedroom_johan_co2.local
[16:46:23][I][app:105]: ESPHome version 1.16.2 compiled on Mar 13 2021, 11:10:37
[16:46:23][C][wifi:443]: WiFi:
...
[16:46:25][C][senseair:085]: SenseAir:
[16:46:25][C][senseair:086]:   CO2 'SenseAir CO2 Value'
[16:46:25][C][senseair:086]:     Unit of Measurement: 'ppm'
[16:46:25][C][senseair:086]:     Accuracy Decimals: 0
[16:46:25][C][senseair:086]:     Icon: 'mdi:molecule-co2'
...
[16:46:56][D][senseair:050]: SenseAir Received CO₂=851ppm Status=0x00
[16:46:56][D][sensor:092]: 'SenseAir CO2 Value': Sending state 851.00000 ppm with 0 decimals of accuracy
[16:47:56][D][senseair:050]: SenseAir Received CO₂=854ppm Status=0x00
[16:47:56][D][sensor:092]: 'SenseAir CO2 Value': Sending state 854.00000 ppm with 0 decimals of accuracy

Mochten er problemen zijn, controleer dan of je de juiste Wi-Fi-gegevens hebt ingevuld en dat de S8-sensor op de juiste manier is aangesloten. Mijn sensor gaf in het begin veel te lage waarden, tot zelfs 0 ppm, terwijl 415 ppm tegenwoordig ongeveer het minimum aan CO₂ in onze atmosfeer is8. Hoewel de sensoren in de fabriek worden gekalibreerd, kan transport via een vliegtuig de beginwaarden beïnvloeden. Maar maak je geen zorgen, SenseAir heeft het ABC-algoritme9 ontwikkeld dat deze fouten na ongeveer acht dagen automatisch corrigeert.

Ik woon in een appartement in Berlijn met ramen zonder ventilatieroosters, wat helaas de standaard is in Duitsland. Ik was benieuwd hoe het sluiten of gedeeltelijk openen van het raam gedurende de nacht het CO₂-niveau in mijn slaapkamer van 18 vierkante meter zou beïnvloeden. De resultaten zijn te zien in de grafiek hieronder.

Verschil in CO₂-niveaus gedurende de nacht met het raam dicht (oranje lijn) en het raam iets open (blauwe lijn). In beide gevallen heb ik het raam 's ochtends volledig geopend.

Verschil in CO₂-niveaus gedurende de nacht met het raam dicht (oranje lijn) en het raam iets open (blauwe lijn). In beide gevallen heb ik het raam ’s ochtends volledig geopend.

Het verschil is erg groot! Het CO₂-niveau kwam boven de 2500 ppm met het raam dicht, wat leidt tot stilstaande en benauwde lucht en kan daarmee hoofdpijn, een verhoogde hartslag en lichte misselijkheid veroorzaken. Door het raam een klein beetje open te zetten daalde de maximale waarde tot ongeveer 900 ppm, wat een stuk gezonder is en wat je normaal gesproken aantreft in bewoonde ruimtes met een goede luchtdoorstroming10.

← Vorige in Artikelen
Oh My Zsh shell op macOS configureren