Da der Markt aktuell leider keinen (kabegebundenen!) Luftqualitätsmonitor mit hochwertigen Sensoren zur Integration in Homeassistant und Apple Home bietet, musste etwas eigenes her ;) Diese Eigenlösung basiert auf einem ESP32 Board mit PoE und verschiedenen Sensoren zur Messung von Temperatur, Luftfeuchtigkeit, Luftdruck, Kohlendioxid, Feinstaubpartikeln und flüchtigen organischen Verbindungen. Die hierbei verwendeten (und etwas teureren) Adafruit Sensoren sind bereits auf Platinen montiert und verfügen über einen STEMMA Anschluss, so dass keine Lötarbeiten erforderlich sind. Ausgelesen werden die Sensoren über den I2C Bus. Das Gehäuse besteht aus zugeschnittenen Plexiglas Platten, in welche mithilfe einer angefertigten Bohrschablone die für die Montage erforderlichen Löcher gebohrt wurden. In die Hausautomation (Homeassistant bzw. Apple Home) eingebunden wird der Luftqualitätsmonitor über ESPHome.

Bild

Verwendete Komponenten

Inspiriert durch den AIR-1 (Apolloautomation) sowie den AIR-Q (Corant GmbH) fiel die Wahl nach etwas Recherche auf nachfolgende Komponenten. Da die im SCD30 enthaltenen Sensoren für Temperatur und Luftfeuchtigkeit nur zur internen Unterstützung des Kohlendioxid Sensors dienen und sie aufgrund der Abwärme keine autark sinnvoll verwendbaren Werte liefern, kommt ein zusätzlicher BME280 für die Messung von Temperatur, Luftfeuchtigkeit und Luftdruck zum Einatz. Hinsichtlich der flüchtigen organischen Verbindungen werden die vom SGP30 in der Maßeinheit "ppb" bereit gestellten Werte mithilfe eines zusätzlichen virtuellen Sensors für die Nutzung in Apple Home in die Maßeinheit "ug/m3" umgerechnet. Für die Kalibierierung des SCD30 Sensors auf 420 ppm (Freiluft) wird ein virtueller Schalter bereit gestellt.

  • Olimex ESP32-POE-ISO Board
  • Olimex UEXT to STEMMA Adapter
  • Olimex UEXT Kabel
  • Olimex STEMMA Kabel
  • Adafruit SCD30 Sensor (Kohlendioxid)
  • Adafruit SGP30 Sensor (Flüchtige Organische Verbindungen)
  • Adafruit BME280 Sensor (Temperatur, Luftfeuchtigkeit und Luftdruck)
  • Adafruit PMSA003I Sensor (Feinstaubpartikel PM1.0, PM2.5, PM10.0)
  • Plexiglas Zuschnitte (125mm x 105mm x 3mm)
  • Messing Abstandshalter (M2, M2.5, M3)
  • Schrauben (M2, M2.5, M3)
  • Bohrschablone

ESPHome Konfiguration

substitutions:
  name: espair
  friendly_name: "EspAir"
  encryption_key: "***"
  ota_password: "***"

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  name_add_mac_suffix: false

esp32:
  board: esp32dev
  framework:
    type: arduino

i2c:
  sda: GPIO13
  scl: GPIO16
  scan: True

logger:
  level: NONE

api:
  encryption:
    key: ${encryption_key}

ota:
  - platform: esphome
    password: ${ota_password}

ethernet:
  type: LAN8720
  mdc_pin: GPIO23
  mdio_pin: GPIO18
  clk_mode: GPIO17_OUT
  phy_addr: 0
  power_pin: GPIO12   

sensor:
  # SGP30
  - platform: sgp30
    address: 0x58
    update_interval: 10s  
    store_baseline: yes
    eco2:
      name: "SGP30 eCO2"
      id: sgp30_eco2
      accuracy_decimals: 0
      internal: true
    tvoc:
      name: "SGP30 TVOC (ppb)"
      id: sgp30_tvoc_ppb
      accuracy_decimals: 0

  # SGP30 virtual
  - platform: template
    update_interval: 10s
    name: "SGP30 TVOC (ug)"
    id: sgp30_tvoc_ug
    icon: "mdi:radiator"
    lambda: return (id(sgp30_tvoc_ppb).state * 4.5);
    device_class: volatile_organic_compounds
    unit_of_measurement: "μg/m³"
    accuracy_decimals: 0

  # SCD30
  - platform: scd30
    address: 0x61
    update_interval: 10s  
    automatic_self_calibration: false
    #temperature_offset: 1.5 °C
    co2:
      name: "SCD30 CO2"
      id: scd30_co2
      accuracy_decimals: 0
    temperature:
      name: "SCD30 Temperature"
      id: scd30_temperature
      accuracy_decimals: 1
      internal: true
    humidity:
      name: "SCD30 Humidity"
      id: scd30_humidity
      accuracy_decimals: 0
      internal: true

  # BME280
  - platform: bme280_i2c
    address:  0x77
    update_interval: 10s  
    temperature:
      name: "BME280 Temperature"
      id: bme280_temperature
      accuracy_decimals: 1
    pressure:
      name: "BME280 Pressure"
      id: bme280_pressure
      accuracy_decimals: 0
    humidity:
      name: "BME280 Humidity"
      id: bme280_humidity
      accuracy_decimals: 0

  # PMSA003I
  - platform: pmsa003i
    address:  0x12
    update_interval: 10s  
    pm_1_0:
      name: "PMSA003I PM1.0"
      id: pmsa003i_pm1_0
      accuracy_decimals: 0
    pm_2_5:
      name: "PMSA003I PM2.5"
      id: pmsa003i_pm2_5
      accuracy_decimals: 0
    pm_10_0:
      name: "PMSA003I PM10.0"
      id: pmsa003i_pm10_0
      accuracy_decimals: 0
    pmc_0_3:
      name: "PMSA003I PMC >0.3µm"
      id: pmsa003i_pmc0_3
      accuracy_decimals: 0
      internal: true
    pmc_0_5:
      name: "PMSA003I PMC >0.5µm"
      id: pmsa003i_pmc0_5
      accuracy_decimals: 0
      internal: true
    pmc_1_0:
      name: "PMSA003I PMC >1µm"
      id: pmsa003i_pmc1_0
      accuracy_decimals: 0
      internal: true
    pmc_2_5:
      name: "PMSA003I PMC >2.5µm"
      id: pmsa003i_pmc2_5
      accuracy_decimals: 0
      internal: true
    pmc_5_0:
      name: "PMSA003I PMC >5µm"
      id: pmsa003i_pmc5_0
      accuracy_decimals: 0
      internal: true
    pmc_10_0:
      name: "PMSA003I PMC >10µm"
      id: pmsa003i_pmc10_0
      accuracy_decimals: 0
      internal: true

button:
  - platform: restart
    name: "ESP reboot"
    icon: mdi:power-cycle

  - platform: template
    name: "SCD30 CO2 calibrate (420)"
    icon: "mdi:molecule-co2"
    entity_category: "config"
    on_press:
      then:
        - scd30.force_recalibration_with_reference:
            value: 420.0
Bilder
Bilder
Bilder