
Luftqualitätssensoren mit MQTT Kommunikation
Ich wollte eine modulare Station bauen, die Feinstaub (PM2.5, PM10), Gase (VOC, eCO2) und Klimadaten zentral erfasst. Die Daten werden per MQTT an mein Smart Home übertragen, um dort darauf reagieren zu können (z. B. Lüftungsempfehlungen).
Der Hardware-Stack
Der Aufbau besteht aus einem 3D-gedruckten Frame und einer Lochraster-Platine. Da fast alle Sensoren über I2C kommunizieren und es teils Adresskonflikte gibt, habe ich einen TCA9548A Multiplexer dazwischengeschaltet. Das trennt die Kommunikation sauber und macht das System stabiler.
Die Sensoren:
- SDS011: Misst Feinstaub via Laser-Streulicht. (PM2.5, PM10)
- SGP30: Liefert TVOC und eCO2.
- AHT20/BMP280: Für Temperatur, Feuchtigkeit und Luftdruck.

Aufbau & Lötarbeiten
Vom Breadboard ging es direkt auf eine Lochrasterplatine. Das ist stabil genug für den Dauereinsatz, bleibt aber flexibel für Änderungen.
I2C-Verkabelung & Löt-Details
Da beim Multiplexer viele Leitungen zusammenlaufen, habe ich die Bauteile so platziert, dass die SDA/SCL-Wege kurz bleiben.
- Lötbrücken: Statt einem Kabelsalat aus Jumper-Wires habe ich für die Stromversorgung 3.3V und GND direkte Lötbrücken als Leiterbahnen gezogen.
- Modularität: Weder die Sensoren noch der ESP32 sind direkt verlötet. Ich nutze überall Buchsenleisten. Wenn ein Sensor stirbt oder ich den ESP32 für etwas anderes brauche, kann ich die Teile einfach austauschen.
Das Ergebnis ist eine kompakte Einheit, die ohne Wackelkontakte ins Gehäuse passt.

Gehäuse-Design (Fusion 360)
Das Gehäuse musste vor allem den sperrigen SDS011 und seinen Lüfter unterbringen. Ich habe in Fusion 360 ein zweiteiliges Rack entworfen: eine Basisplatte für die Montage und eine Haube zum Drüberstecken.
- Airflow: Die Haube hat Schlitze, damit sich keine Hitze staut und die Sensoren echte Umgebungswerte messen, statt nur die Eigenwärme des ESP32.
- Material: Gedruckt wurde in PETG. PLA wird im Sommer am Fenster zu schnell weich; PETG hält die Temperaturen locker aus.
- Mounting: Die Teile werden per Snap-Fit oder Schrauben fixiert. Man kommt also jederzeit schnell an die Hardware ran.

Software und Logik
Die Firmware läuft in C++. Ein SensorManager kümmert sich um die Abfrage der Schnittstellen (I2C, Serial) und den MQTT-Versand.
Wichtige Logik-Punkte im Code:
- Drift-Korrektur: Der SGP30 bekommt zur Laufzeit die aktuellen Temperatur- und Feuchtigkeitswerte des AHT20 geliefert, um die Gasmessung intern zu kompensieren.
- OTA-Config: Messintervalle oder der Modus des SDS011 lassen sich per MQTT-Payload (JSON) ändern. Ich muss den ESP32 also nicht jedes Mal an den PC hängen, wenn ich etwas anpassen will.
- Baselines: Der SGP30 verliert seine Kalibrierung beim Reboot. Deshalb schickt der Code die Baselines regelmäßig per MQTT raus und stellt sie beim Starten automatisch wieder her.
Einblick in den SensorManager
Die Header-Datei zeigt die modulare Struktur, die eine einfache Erweiterung um weitere Sensoren ermöglicht:
#pragma once#include "sensors/I2CMultiplexer.h"#include "sensors/AhtBmpSensor.h"#include "sensors/Sgp30Sensor.h"#include "sensors/Sds011Sensor.h"#include "home-mqtt.h"class SensorManager {public:SensorManager();void begin(); // Initialisiert I2C, Serial und Sensorenvoid loop(); // Periodisches Auslesen und MQTT-Publishingprivate:void publishAhtBmpData(const AhtBmpData& data);void publishSgp30Data(const Sgp30Data& data);void publishSds011Data(const Sds011Data& data);void publishSgp30Baseline(const Sgp30Baseline& baseline);void setConfigSDS011(const String& payload);void setConfigAhtBmp(const String& payload);void setConfigSgp30(const String& payload);I2CMultiplexer i2cMultiplexer;AhtBmpSensor ahtBmp;Sgp30Sensor sgp30;HardwareSerial sdsSerial;Sds011Sensor sds011;HomeMqtt mqtt;};
Daten-Output & Home Assistant
Die Station ballert strukturierte JSON-Objekte an den Broker. Das ist übersichtlich und in Home Assistant leicht zu parsen.
Beispiel-Payload:
{"temperature": 14.8,"humidity": 52.27,"pressure": 1013.96,"pm25": 1.5,"tvoc": 161,"co2": 739}
Integration in Home Assistant
In Home Assistant binde ich das Ganze über die mqtt Plattform ein. Über die unique_id lassen sich die Sensoren bequem in der UI verwalten:
mqtt:sensor:- name: "AHT BMP Temperatur"unique_id: "air_quality_station_aht_bmp_temperatur_sensor"state_topic: "home/air-quality-station/aht_bmp"unit_of_measurement: "°C"value_template: "{{ value_json.temperature }}"device_class: temperature- name: "AHT BMP Luftfeuchtigkeit"unique_id: "air_quality_station_aht_bmp_humidity_sensor"state_topic: "home/air-quality-station/aht_bmp"unit_of_measurement: "%"value_template: "{{ value_json.humidity }}"device_class: humidity...
Sensor Daten in Home Assistant

Fazit
Die Station läuft jetzt seit mehreren Monaten ohne Aussetzer. Es war eine gute Übung, um Fusion 360, C++ und sauberes Platinen-Layout mal in einem praktischen Projekt zu kombinieren. Wer ein lokales Air-Quality-Monitoring ohne Cloud-Zwang sucht, fährt mit so einem Eigenbau definitiv am besten.
