Feinstaubsensor PMS5003T mit ESP32 und ESPHome
Feinstaub, Temperatur und Luftfeuchtigkeit auf einem OLED – mit ESPHome und Home Assistant.
Warum Feinstaubmessung im eigenen Netzwerk?
Feinstaub-Messstationen gibt es im Internet zuhauf – aber wer die Luftqualität in den eigenen Räumen überwachen will, braucht lokale Sensoren. Der PMS5003T von Plantower misst Feinstaub (PM1.0, PM2.5, PM10) plus Temperatur und Luftfeuchtigkeit in einem kompakten Modul. Am ESP32 angeschlossen, per ESPHome konfiguriert und in Home Assistant eingebunden, hat man in einer Stunde eine vollständige Luftqualitätsstation – mit OLED-Display für den schnellen Blick und 3D-gedrucktem Gehäuse.
Hardware
- PMS5003T Feinstaubsensor (misst PM1.0, PM2.5, PM10 + Temperatur + Luftfeuchtigkeit)
- ESP32 Mikrocontroller (z.B. ESP32-DevKit)
- SSD1306 OLED-Display (128x32 oder 128x64, I²C)
- Kabel, Steckboard oder Lötkolben
- (Optional) 3D-gedrucktes Gehäuse – STL weiter unten
Der PMS5003T hat 8 Pins. Relevant sind: Pin 1 (VCC, 5V), Pin 2 (GND), Pin 4 (RX) und Pin 5 (TX). Der Sensor läuft mit 5V, die UART-Kommunikation ist aber 3.3V-kompatibel – direkt an den ESP32 anschließbar.
ESPHome-Konfiguration
Die komplette ESPHome-YAML für den Sensor, das OLED-Display und die WiFi-Anbindung. Die Pin-Belegung des PMS5003T ist als ASCII-Art im Kommentar – hilft beim Verdrahten:
# PM Sensor port
# -----------------
# | ----- |
# | 8 | o | |
# | 7 | o | |
# | 6 | o | |
# | 5 | o | | 5 - TX
# | 4 | o | | 4 - RX
# | 3 | o | |
# | 2 | o | | 2 - GND
# | 1 | o | | 1 - VCC
# | ----- |
# -----------------
esphome:
name: esp32-pm-sensor-01
friendly_name: esp32-PM-Sensor-01
esp32:
board: esp32dev
framework:
type: arduino
logger:
api:
encryption:
key: "xxx"
ota:
password: "xxx"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Esp32-Pm-Sensor-02"
password: "ztsQxEKlkaUj"
captive_portal:
i2c:
sda: 19
scl: 18
display:
- platform: ssd1306_i2c
model: "SSD1306 128x32"
update_interval: 10s
lambda: |-
it.printf(0, 0, id(font_robo), "PM1.0 : %.0f", id(pms_pm_1).state),
it.printf(0, 11, id(font_robo), "PM2.5 : %.0f", id(pms_pm_25).state),
it.printf(0, 22, id(font_robo), "PM10.0 : %.0f", id(pms_pm_10).state),
it.line(64, 10, 128, 10),
it.line(64, 0, 64, 32),
it.printf(67, 11, id(font_robo), "T : %3.1f°C", id(pms_temperature).state),
it.printf(67, 22, id(font_robo), "H : %3.1f%%", id(pms_humidity).state),
it.printf(67, 0, id(font_robo_sm), "WiFi : %2.f dBm", id(wifi_signal_sensor).state);
font:
- file: "gfonts://Roboto"
id: font_robo_sm
size: 9
- file: "gfonts://Roboto"
id: font_robo
size: 10
uart:
rx_pin: GPIO17
tx_pin: GPIO16
baud_rate: 9600
sensor:
- platform: wifi_signal
name: WiFi Signal
id: wifi_signal_sensor
update_interval: 60s
- platform: pmsx003
type: PMS5003T
id: pm_sensor
pm_1_0:
id: pms_pm_1
name: "Particulate Matter <1.0µm Concentration"
accuracy_decimals: 1
pm_2_5:
id: pms_pm_25
name: "Particulate Matter <2.5µm Concentration"
accuracy_decimals: 1
pm_10_0:
id: pms_pm_10
name: "Particulate Matter <10.0µm Concentration"
accuracy_decimals: 1
temperature:
id: pms_temperature
name: "Environment temperature in °C"
humidity:
id: pms_humidity
name: "Environment humidity in %"
update_interval: 120s
Home Assistant-Integration
Sobald der ESP32 per ESPHome geflasht und im WLAN ist, wird er automatisch in Home Assistant als neues Gerät erkannt. Alle Sensoren – PM1.0, PM2.5, PM10, Temperatur, Luftfeuchtigkeit und WiFi-Signal – tauchen als Entitäten auf und können in Dashboards, Automationen und Langzeit-Statistiken genutzt werden.
Gehäuse: 3D-Druck mit FreeCAD
Damit der Sensor nicht lose auf dem Regal liegt, habe ich ein einfaches Gehäuse in FreeCAD konstruiert. Es nimmt den ESP32, das OLED-Display und den PMS5003T auf und lässt dabei die Lufteinlass-Öffnung des Sensors frei. Die FreeCAD-Projektdatei gibt es hier zum Download:
Was ich weggelassen habe
Ein paar Dinge, die hier bewusst nicht behandelt werden:
- Kalibrierung. Der PMS5003T ist ab Werk kalibriert, aber die Temperatur- und Feuchtigkeitswerte weichen erfahrungsgemäß um 1-3°C bzw. 5-10% ab. Wer genaue Werte braucht, sollte gegen ein Referenzgerät kalibrieren.
- Langzeit-Stabilität. Laser-basierte PM-Sensoren verlieren nach 2-3 Jahren an Genauigkeit. Ein Thema für einen Folgeartikel.
- Mehrere Sensoren an einem ESP32. Geht über die zweite UART – aber die Pin-Konflikte sind fummelig.
Fazit & Ausblick
Die Kombination aus PMS5003T, ESP32 und ESPHome ist der pragmatischste Weg zu einer lokalen Luftqualitätsstation. Kein Cloud-Account, keine App, keine Abo-Gebühren – die Daten bleiben im eigenen Netzwerk und landen direkt in Home Assistant. Dank des 3D-gedruckten Gehäuses sieht das Ganze auch nicht nach Bastelkeller aus.
Als nächsten Schritt plane ich, die PM-Daten mit einer Automation zu koppeln: Lüftung automatisch einschalten, wenn PM2.5 einen Schwellwert überschreitet. Dazu dann ein eigener Artikel.