smarthome-tricks.de

ESP32 Luftqualitätsmesser mit ESPHome bauen: CO₂, Feinstaub und VOC in Home Assistant

Wie gut ist eigentlich die Luft im Arbeitszimmer? Wann sollte im Schlafzimmer gelüftet werden und was passiert mit der Feinstaubbelastung, wenn gekocht wird oder draußen schlechte Luft herrscht?

Mit einem ESP32 und ESPHome lässt sich dafür ein ziemlich umfangreicher Luftqualitätssensor selbst bauen. In diesem Projekt messen wir CO₂, Feinstaub, VOC, Temperatur und Luftfeuchtigkeit und übertragen alle Werte direkt an Home Assistant.

Das Projekt ist etwas aufwendiger als ein einfacher Temperatursensor, bleibt aber gut überschaubar. Wir benötigen keine eigene Software und müssen auch keine komplizierten Protokolle programmieren. ESPHome unterstützt die verwendeten Sensoren bereits direkt.

Falls du mit ESPHome gerade erst anfängst, würde ich vorher kurz meine Anleitung Was ist ESPHome? Einführung für Einsteiger ansehen. Die grundsätzliche Einrichtung eines ESP32 erkläre ich außerdem im Artikel ESPHome mit Home Assistant verbinden.

Was soll unser Luftqualitätssensor messen?

Ich wollte für dieses Projekt nicht einfach irgendeinen sogenannten Luftqualitätssensor verwenden. Viele günstige Module liefern lediglich einen grob geschätzten eCO₂-Wert oder fassen mehrere Gase zu einer wenig aussagekräftigen Zahl zusammen.

Deshalb teilen wir die Aufgabe auf drei unterschiedliche Sensoren auf:

Der ESP32 liest alle drei Sensoren aus und sendet die Werte über WLAN an Home Assistant.

Warum der SCD41 für CO₂?

Bei CO₂ würde ich nicht auf einen errechneten eCO₂-Wert setzen. Der Sensirion SCD41 ist ein echter CO₂-Sensor und lässt sich direkt über I²C mit ESPHome verwenden.

Praktisch ist außerdem, dass wir über denselben Sensor auch Temperatur und relative Luftfeuchtigkeit bekommen. Diese Werte können später sogar zur Kompensation des VOC-Sensors verwendet werden.

Affiliate-Link: SCD41 CO₂-Sensor bei Amazon ansehen*

PMS5003 für PM1, PM2.5 und PM10

Für die Feinstaubmessung verwende ich einen Plantower PMS5003. Im Gegensatz zu den beiden kleinen Sensirion-Modulen besitzt dieser Sensor einen eigenen Lüfter. Die Luft wird aktiv durch eine Messkammer gezogen und dort optisch untersucht.

ESPHome unterstützt die PMSX003-Familie direkt. Aus dem PMS5003 bekommen wir unter anderem:

Für den Alltag finde ich vor allem PM2.5 interessant. In Home Assistant lässt sich damit sehr schön beobachten, wie sich Kochen, Lüften oder auch die Außenluft auf die Werte im Raum auswirken.

Affiliate-Link: PMS5003 Feinstaubsensor bei Amazon ansehen*

VOC mit dem SGP40 messen

Als dritten Sensor verwenden wir einen SGP40 von Sensirion. Er reagiert auf flüchtige organische Verbindungen, also VOC.

Solche Stoffe können beispielsweise beim Kochen, durch Reinigungsmittel, Lacke, Möbel, Klebstoffe oder andere Materialien in die Raumluft gelangen.

Wichtig ist allerdings die Interpretation: Der SGP40 liefert keine konkrete VOC-Konzentration in ppm. ESPHome berechnet daraus einen VOC-Index. Er eignet sich deshalb besonders gut, um Veränderungen der Raumluft und ungewöhnliche Ausschläge zu erkennen.

Wer zusätzlich NOx erfassen möchte, kann statt des SGP40 auch den SGP41 verwenden.

Affiliate-Link: SGP40 VOC-Sensor bei Amazon ansehen*

Diese Bauteile brauchen wir

Falls du noch keine Bastelkiste mit ESP32, Kabeln und Breadboards hast, lohnt eventuell ein Starterset. Dazu habe ich bereits eine eigene ESP32-Starterset-Kaufberatung erstellt.

Affiliate-Link: ESP32 Startersets bei Amazon ansehen*

*Bei einem Kauf über einen mit * gekennzeichneten Affiliate-Link erhalte ich eine Provision. Für dich ändert sich der Preis nicht.

So werden die Sensoren verbunden

SCD41 und SGP40 arbeiten über I²C. Das ist praktisch, weil beide Sensoren dieselben Datenleitungen verwenden können. Der PMS5003 kommuniziert dagegen über UART.

Für einen klassischen ESP32 DevKit kann der Aufbau beispielsweise so aussehen:

SensorAnschlussESP32
SCD41SDAGPIO21
SCD41SCLGPIO22
SGP40SDAGPIO21
SGP40SCLGPIO22
PMS5003TXGPIO16 / RX
PMS5003RXGPIO17 / TX
alle SensorenGNDGND

Bei der Spannungsversorgung musst du auf das jeweils verwendete Breakout-Modul achten. Der PMS5003 wird üblicherweise mit 5 Volt versorgt. Bei SCD41- und SGP40-Platinen hängt die mögliche Versorgung davon ab, ob das Modul einen eigenen Spannungsregler besitzt.

Schau deshalb vor dem Anschluss unbedingt auf die Beschriftung und die Dokumentation des konkreten Boards. Nur weil auf zwei Platinen derselbe Sensor sitzt, müssen die Anschlüsse nicht identisch sein.

Warum SCD41 und SGP40 denselben I²C-Bus verwenden können

I²C ist für solche Projekte sehr angenehm. Mehrere Sensoren können parallel an SDA und SCL hängen, solange sie unterschiedliche I²C-Adressen verwenden.

Wir benötigen für unsere beiden Sensirion-Module deshalb nur zwei GPIOs am ESP32.

ESPHome kann beim Start außerdem einen Scan des Busses durchführen. Damit sieht man im Log schnell, ob die angeschlossenen Geräte grundsätzlich gefunden werden.

ESPHome-Konfiguration für den Luftqualitätssensor

Lege zunächst im ESPHome Device Builder ein neues ESP32-Gerät an. Den grundlegenden Teil mit WLAN, API, OTA und Verschlüsselung erzeugt ESPHome dabei bereits automatisch.

In die Konfiguration ergänzen wir anschließend I²C, UART und unsere drei Sensoren.

i2c:
  sda: GPIO21
  scl: GPIO22
  scan: true

uart:
  id: uart_pms
  rx_pin: GPIO16
  tx_pin: GPIO17
  baud_rate: 9600

sensor:
  - platform: scd4x
    id: scd41_sensor

    co2:
      name: "Luftqualität CO2"
      id: luft_co2

    temperature:
      name: "Luftqualität Temperatur"
      id: luft_temperatur

    humidity:
      name: "Luftqualität Luftfeuchtigkeit"
      id: luft_feuchtigkeit

  - platform: sgp4x
    voc_index:
      name: "Luftqualität VOC Index"
      id: luft_voc

    compensation:
      temperature_source: luft_temperatur
      humidity_source: luft_feuchtigkeit

  - platform: pmsx003
    type: PMSX003
    uart_id: uart_pms

    pm_1_0:
      name: "Luftqualität PM1"

    pm_2_5:
      name: "Luftqualität PM2.5"

    pm_10_0:
      name: "Luftqualität PM10"

Damit haben wir bereits die wichtigste Konfiguration erledigt.

Warum die Temperatur- und Feuchtekompensation sinnvoll ist

Beim SGP40 habe ich bewusst die beiden Messwerte des SCD41 als Kompensationsquelle hinterlegt.

compensation:
  temperature_source: luft_temperatur
  humidity_source: luft_feuchtigkeit

Temperatur und Luftfeuchtigkeit beeinflussen Gassensoren. ESPHome kann diese Werte bei der Berechnung des VOC-Index berücksichtigen.

Da wir beide Werte durch den SCD41 sowieso schon zur Verfügung haben, können wir sie direkt verwenden.

ESP32 flashen und Sensoren prüfen

Beim ersten Flashen würde ich den ESP32 noch direkt per USB mit dem Rechner beziehungsweise Home-Assistant-System verbinden.

Danach kannst du zukünftige Änderungen bequem per OTA über WLAN übertragen.

Nach dem Start solltest du zunächst das ESPHome-Log öffnen. Dort lässt sich prüfen, ob alle Komponenten erkannt wurden.

Falls du ESPHome bislang noch nicht mit Home Assistant verbunden hast, findest du die einzelnen Schritte in meiner Anleitung ESPHome mit Home Assistant verbinden.

Die Messwerte erscheinen automatisch in Home Assistant

Ist der ESP32 über die ESPHome-Integration mit Home Assistant verbunden, erscheinen die einzelnen Sensorwerte als normale Entitäten.

Damit kannst du sie auf dem Dashboard anzeigen, in Diagrammen speichern oder für Automationen verwenden.

Wer die Messwerte zusätzlich direkt am Gerät sehen möchte, kann ein kleines OLED- oder TFT-Display ergänzen. Welche Varianten sich für ESPHome eignen, habe ich im Artikel ESP32 Display mit ESPHome: OLED, TFT und E-Paper im Vergleich zusammengestellt.

Was sagen die CO₂-Werte aus?

CO₂ ist für ein Smart Home besonders praktisch, weil sich damit sehr gut erkennen lässt, wann ein Raum gelüftet werden sollte.

Statt sich starr an einzelne Grenzwerte zu klammern, finde ich vor allem den Verlauf interessant. In einem belegten Schlafzimmer sieht man beispielsweise sehr deutlich, wie der Wert während der Nacht steigt und nach dem Lüften wieder fällt.

Home Assistant eignet sich perfekt dafür, solche Entwicklungen über mehrere Stunden oder Tage darzustellen.

Was bedeutet PM2.5?

PM steht für Particulate Matter, also Schwebstaub beziehungsweise Feinstaub.

Die Zahl beschreibt vereinfacht die Größe der betrachteten Partikel:

Beim Kochen sieht man beim PMS5003 oft sehr schnell Veränderungen. Auch geöffnete Fenster können abhängig von der Außenluft deutliche Auswirkungen haben.

Den VOC-Index richtig verstehen

Beim VOC-Sensor sollte man nicht versuchen, den angezeigten Wert wie eine direkte Konzentration zu lesen.

Der SGP40 beziehungsweise ESPHome arbeitet mit einem Gas-Index. Der Sensor lernt dabei seine typische Umgebung kennen. Ein deutlich erhöhter Index zeigt an, dass sich die Zusammensetzung der Luft im Vergleich zum normalen Zustand verändert hat.

Das macht ihn für Home Assistant trotzdem sehr interessant. Man erkennt beispielsweise gut, wenn:

Nach dem Einschalten sollte man dem Sensor außerdem etwas Zeit geben. Der VOC-Algorithmus benötigt eine Lernphase, bevor man die Werte zu ernst nimmt.

Automatisch ans Lüften erinnern

Jetzt kommt der Teil, für den sich die Einbindung in Home Assistant wirklich lohnt.

Steigt CO₂ beispielsweise über einen von dir gewählten Wert und bleibt dort einige Minuten, kann Home Assistant eine Push-Nachricht verschicken.

alias: Wohnzimmer Lüftungshinweis

triggers:
  - trigger: numeric_state
    entity_id:
      - sensor.luftqualitat_co2
    above: 1200
    for:
      minutes: 5

actions:
  - action: notify.mobile_app_mein_handy
    data:
      title: "Luftqualität"
      message: "Der CO₂-Wert im Wohnzimmer ist erhöht. Lüften wäre eine gute Idee."

mode: single

Wie Push-Nachrichten grundsätzlich eingerichtet werden, findest du in meinem Artikel Home Assistant Benachrichtigung aufs Handy: Push-Nachrichten richtig einrichten.

Ampel für die Luftqualität bauen

Eine weitere schöne Erweiterung wäre eine kleine LED-Ampel direkt am ESP32.

Zum Beispiel:

Dafür reicht eine RGB-LED oder ein kleiner WS2812-Ring. ESPHome kann die Farbe direkt abhängig von den Messwerten steuern.

Oder gleich ein Display einbauen

Für einen richtigen Luftqualitätsmesser würde ich wahrscheinlich noch ein kleines Display ergänzen.

Darauf könnten beispielsweise gleichzeitig stehen:

Ein kleines OLED ist dafür günstig und einfach. Für eine schönere Anzeige würde ich eher zu einem kleinen Farbdisplay greifen.

Mehr dazu findest du in meinem Vergleich von OLED, TFT und E-Paper für ESPHome.

Der PMS5003 sollte nicht dauerhaft Vollgas laufen

Der PMS5003 enthält einen Lüfter und einen Laser. Anders als SCD41 und SGP40 handelt es sich deshalb um ein mechanisch beziehungsweise optisch stärker beanspruchtes Bauteil.

ESPHome unterstützt beim PMSX003 auch längere Messintervalle und Schlafphasen. Laut ESPHome-Dokumentation kann ein Messintervall ab etwa 120 Sekunden dabei helfen, die Lebensdauer des Sensors zu verlängern.

Für einen Raumluftsensor muss schließlich niemand jede Sekunde einen neuen Feinstaubwert bekommen.

Dazu muss allerdings auch die RX-Leitung des PMS5003 mit dem TX-Pin des ESP32 verbunden sein, damit ESPHome Befehle an den Sensor schicken kann.

Wo sollte der Sensor stehen?

Der Standort hat auf die Messwerte einen überraschend großen Einfluss.

Ich würde den Luftqualitätssensor nicht direkt auf einen Heizkörper, an ein geöffnetes Fenster oder direkt neben den Herd stellen.

Auch der ESP32 selbst produziert etwas Wärme. Besonders für die Temperaturmessung des SCD41 ist deshalb etwas Abstand zum ESP32 sinnvoll.

Für ein späteres Gehäuse sollte außerdem genügend Luftzirkulation vorhanden sein. Ein komplett geschlossenes Kunststoffgehäuse wäre für dieses Projekt keine gute Wahl.

Beim Gehäuse auf den Luftstrom achten

Gerade beim PMS5003 ist die Belüftung wichtig. Der Sensor besitzt einen Ein- und Auslass für die Luft. Diese Öffnungen dürfen im Gehäuse nicht verdeckt werden.

Ich würde deshalb ein Gehäuse mit Lüftungsschlitzen verwenden oder später ein eigenes Gehäuse drucken.

Der SCD41 sollte ebenfalls frei von Raumluft umströmt werden. Außerdem darf die kleine weiße Membran des Sensors nicht entfernt oder beschädigt werden.

Was kostet der komplette Luftqualitätssensor?

Das Projekt gehört nicht zu den billigsten ESP32-Basteleien. Vor allem ein guter echter CO₂-Sensor ist deutlich teurer als ein einfacher Temperaturfühler.

Dafür bekommt man einen Luftqualitätssensor, bei dem man genau weiß, welche Sensoren verbaut sind und wie die Daten verarbeitet werden.

Außerdem bleibt das Gerät flexibel. Ein Display, eine Status-LED oder weitere Sensoren lassen sich später jederzeit ergänzen.

Wer erst einmal günstiger einsteigen möchte, kann das Projekt auch stufenweise aufbauen. Ich würde mit ESP32 und SCD41 anfangen und Feinstaub sowie VOC später ergänzen.

Alternative: Erst nur CO₂ messen

Für viele Räume ist CO₂ wahrscheinlich der Messwert mit dem unmittelbarsten Nutzen.

Ein ESP32 mit SCD41 reicht bereits aus, um:

Das macht das Projekt auch interessant, wenn du nicht sofort alle drei Sensoren kaufen möchtest.

Weitere Ideen für den Luftqualitätssensor

Wenn der grundlegende Aufbau läuft, lässt er sich leicht erweitern.

Gerade die Verbindung mit einem Fensterkontakt wäre interessant. Home Assistant könnte beispielsweise erkennen, dass die Luftqualität schlecht ist und gleichzeitig prüfen, ob bereits ein Fenster geöffnet wurde.

Passende Sensoren findest du in meinem Artikel Tür- und Fensterkontakte für Home Assistant: Die besten Sensoren 2026.

ESP32 zusätzlich als Bluetooth Proxy nutzen?

Theoretisch kann ein ESP32 mehrere Aufgaben übernehmen. Ich würde einen umfangreichen Luftqualitätssensor aber nicht unnötig mit weiteren Funktionen vollpacken.

Ein Bluetooth Proxy ist beispielsweise schnell eingerichtet, erhöht aber die zusätzliche Funk- und Prozessorlast.

Wenn du Bluetooth-Reichweite in Home Assistant verbessern möchtest, würde ich dafür eher einen separaten ESP32 verwenden. Die Einrichtung zeige ich unter ESP32 Bluetooth Proxy für Home Assistant einrichten.

Fehlersuche: SCD41 oder SGP40 wird nicht gefunden

Wenn einer der I²C-Sensoren nicht erkannt wird, würde ich zuerst das ESPHome-Log prüfen.

Bei einem Breadboard-Aufbau sind lose Jumper-Kabel erstaunlich oft die Ursache.

PMS5003 zeigt keine Werte

Beim PMS5003 würde ich als Erstes die UART-Verbindung kontrollieren.

Wichtig ist dabei die gekreuzte Verbindung:

Außerdem muss die Baudrate in unserem Aufbau auf 9600 stehen.

Meine Empfehlung für den Nachbau

Ich würde den Sensor zunächst komplett auf dem Breadboard aufbauen. Dabei kannst du jeden Sensor einzeln hinzufügen und testen.

Also zuerst den SCD41. Wenn CO₂, Temperatur und Luftfeuchtigkeit sauber in Home Assistant erscheinen, kommt der SGP40 dazu. Danach folgt der PMS5003.

Damit weißt du bei einem Problem sofort, welches neu hinzugekommene Bauteil dafür verantwortlich sein könnte.

Erst wenn alles ein paar Tage stabil läuft, würde ich mich um ein ordentliches Gehäuse und eventuell ein Display kümmern.

Fazit

Ein ESP32-Luftqualitätssensor ist eines der ESPHome-Projekte, bei denen Home Assistant seine Stärken wirklich ausspielen kann.

Mit SCD41, PMS5003 und SGP40 bekommen wir mehrere Messwerte aus einem einzigen Gerät und können sie anschließend gemeinsam auswerten. CO₂ zeigt sehr gut, wann gelüftet werden sollte. Der PMS5003 ergänzt echte Feinstaubwerte und der SGP40 erkennt Veränderungen durch flüchtige organische Verbindungen.

Das Ergebnis ist kein kleines Spielzeug mit einer einzelnen Zahl auf einem Display. Durch Home Assistant können wir Verläufe speichern, Benachrichtigungen senden und später sogar Lüftung, Luftreiniger oder andere Geräte abhängig von den Messwerten steuern.

Für den Einstieg würde ich trotzdem klein anfangen. ESP32 und SCD41 reichen für die erste Version vollkommen aus. Läuft diese Kombination zuverlässig, können VOC, Feinstaub, Display und Status-LED Stück für Stück dazukommen.

Weitere ESP32- und ESPHome-Projekte

Die mobile Version verlassen