Mit ESPHome einen Feinstaub- und Luftsensor für das Smarthome bauen

Beitrag unter Bearbeitung

Aktuell ist dieser Beitrag erstmal ein kleiner Platzhalter, der mit der Zeit wachsen wird. Wir wollen dir die Infos zu diesem Projekt jedoch schon jetzt bereitstellen.


Im Makerspace kann man an verschiedenen Stellen funkgesteuerte Steckdosen sehen. Diese sind Teil unseres Smart Homes auf Basis von Home Assistant – einem Open Source Projekt für Smarthomes.

Das sogenannte Dashboard, quasi eine Übersichtsseite für das gesamte System, kann man direkt vorne in der Ausstellung auf dem Monitor an der Säule sehen. Darüber hängt auch eine Raspberry Pi, der das gesamte System steuert und auf dem auch die Home Assistant Software läuft.

Die Steckdosen sind per Zigbee, einem Funkstandard, eingebunden. Mehr dazu in einem anderen Beitrag.

ESPHome für eigene Sensoren

Will man sich eine eigene Einbindung für Home Assistant bauen, gibt es ein großartiges Open Source Projekt: ESPHome

Mittels einem ESP32, einem Microcontroller mit Bluetooth und WLAN, für ca. 10 € kann man mit der ESPHome Software einfach einen eigenen Sensor oder Aktor für das eigene Smarthome bauen. Dafür muss man sich ein wenig in die Software und die Konfiguration einarbeiten. Wir werden dazu sicher auch bald Kurse anbieten. Aber bis dahin, sprecht gerne Nils an, er hat das System im Makerspace aufgesetzt.

Feinstaub- und Luftqualitätssensor mit ESPHome

Um die Luftqualität in der Werkstatt zu überwachen nutzen wir folgende Sensoren an einem ESP32:

  • SDS011: Feinstaubsensor zum Messen der Particulate Matter (PM)
    • PM10 – oft natürlichen Ursprungs wie z.B. Pollen
    • PM2,5 – meist Verbrennungsprodukte
    • beide Werte sind ungenau, da der Sensor nur ca. 20 € kostet
  • BOSCH BME680: Luftfeuchtigkeit, -qualität, Luftdruck & Temperatur
    • ein recht genauer Sensor
    • Luftqualität wird über eine Messung der VOC abgeleitet

Es gibt mehrere Möglichkeiten die Software passend auf den ESP32 zu schreiben. Einmal kann dafür ein Plugin in Home Assistant installiert werden, welches auch die Verwaltung übernimmt.

Wir haben uns für einen anderen Weg entschieden, da Plugins in unserer Installation von Home Assistant nicht so leicht einzubinden sind: Die Installation von esphome mittels Python.

Um diese Sensoren in ESPHome einzubinden waren damit folgende Schritte nötig:

Erst erstellt man mit einem geführten Prozess eine erste Konfigurationsdatei. Dafür wird folgender Befehl eingegeben:

esphome wizard config-datei.yml

Dann wird die Konfiguration um folgende Zeilen erweitert:

uart:
  rx_pin: GPIO16
  tx_pin: GPIO17
  baud_rate: 9600

i2c:
  sda: GPIO21
  scl: GPIO22
  scan: true
  id: bus_a

sensor:
  - platform: sds011
    pm_2_5:
      name: "Feinstaub <2.5µm"
    pm_10_0:
      name: "Feinstaub <10.0µm"
    update_interval: 5min

  - platform: bme680
    temperature:
      name: "BME680 Temperature"
      oversampling: 16x
    pressure:
      name: "BME680 Pressure"
    humidity:
      id: "humidity"
      name: "BME680 Humidity"
    gas_resistance:
      id: "gas_resistance"
      name: "BME680 Gas Resistance"
    address: 0x77
    update_interval: 60s
    
  - platform: template
    name: "BME680 Indoor Air Quality"
    id: iaq
    icon: "mdi:gauge"
    # calculation: comp_gas = log(R_gas[ohm]) + 0.04 log(Ohm)/%rh * hum[%rh]
    lambda: |-
      return log(id(gas_resistance).state) + 0.04 *  id(humidity).state;
    state_class: "measurement"

text_sensor:
  - platform: template
    name: "BME680 IAQ Classification"
    icon: "mdi:checkbox-marked-circle-outline"
    lambda: |-
      if (int(id(iaq).state) <= 50) {
        return {"Excellent"};
      }
      else if (int(id(iaq).state) <= 100) {
        return {"Good"};
      }
      else if (int(id(iaq).state) <= 150) {
        return {"Lightly polluted"};
      }
      else if (int(id(iaq).state) <= 200) {
        return {"Moderately polluted"};
      }
      else if (int(id(iaq).state) <= 250) {
        return {"Heavily polluted"};
      }
      else if (int(id(iaq).state) <= 350) {
        return {"Severely polluted"};
      }
      else if (int(id(iaq).state) <= 500) {
        return {"Extremely polluted"};
      }
      else {
        return {"unknown"};
      }

Und dann mittels folgendem Befehl auf den ESP32 geschrieben (diesen vorher per USB verbinden):

esphome run config-datei.yml