uptime · 1404 days · 23 posts published · last deploy 1 day, 10 hours ago build:passing rss
~ / home-automation / feinstaubsensor-pms5003t-mit-esp32-und-esphome.md
Home Automation · 17. Februar 2024 · ~5min · d2ae4c2

Feinstaubsensor PMS5003T mit ESP32 und ESPHome

Feinstaub, Temperatur und Luftfeuchtigkeit auf einem OLED – mit ESPHome und Home Assistant.

>
devmaker.net
author · d2ae4c2 · 2024-02-17
x
Air Quality Sensor ESP32 Header.jpg 1408×768
Air Quality Sensor ESP32 Header
Wer die Luftqualität in den eigenen Räumen überwachen will, braucht lokale Sensoren statt Cloud-Dienste. 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.

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
Pinbelegung PMS5003T

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:

PM_Sensor_Case_alpha.jpg 1486×1336
PM_Sensor_Case_alpha
PM-Sensor Gehäuse

FreeCAD Projekt Datei

Herunterladen (7,2 MB) FCSTD
Dateinanme: pmSensor_Case_bigLCD.FCStd

Was ich weggelassen habe

Ehrliche Abgrenzung

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.

// responses (0)
> echo "your thoughts" >> feinstaubsensor-pms5003t-mit-esp32-und-esphome.responses

Schreibe einen Kommentar

Wird für die Bestätigung benötigt