BME680-Sensor auf ESP32 mit esphomelib konfigurieren
tl;dr
Mit esphomelib lässt sich schnell und einfach ein BME680-Sensor an einem ESP32-Board konfigurieren.
Das Projekt
Bei mir läuft seit längerer Zeit sehr zuverlässig Home Assistant für einfache Smart Home-Dinge. Unter anderem lasse ich mir
- Außentemperatur und relative Luftfeuchte
- Feinstaubwerte
- Systemdaten (CPU, RAM, Netzwerk)
anzeigen, steuere ein paar Lampen, und habe auch ein paar Automatisierungen eingerichtet. Beispielsweise wird ein Licht immer dann eingeschaltet, wenn die Sonne untergeht. Das ist nicht wirklich viel im Vergleich zu dem, was möglich wäre, wird aber hin und wieder von mir erweitert, und wäre vielleicht mal einen eigenen Blogpost wert.
Hier soll es um eine Erweiterung gehen, nämlich einen Temperatursensor (kombiniert mit anderen Sensoren, dazu gleich mehr) in einem Zimmer. Dafür habe ich mir den BME680-Sensor von Bosch ausgesucht, weil er neben der Temperatur, der relativen Luftfeuchte und dem atmosphärischen Druck auch einen Luftqualitäts-Sensor integriert.
Der BME680-Sensor auf dem ESP32-Board
Cooles Teil, wenn auch noch relativ neu und daher nicht so umfangreich unterstützt wie ältere Sensoren. Mein Breakout-Board mit diesem Sensor ist das von Watterot, es gibt aber noch eine Reihe anderer Hersteller. Das Board kann per I²C oder SPI angeschlossen werden an einen Arduino, ein NodeMCU/ESP8266, oder eben an dessen Nachfolger, ein Board mit einem ESP32-Microcontroller. So eins hatte ich schon eine Weile rumliegen, und nun sollte es endlich zum Einsatz kommen. Der ESP32 unterstützt I²C, vor allem aber auch WLAN. Da ich die Sensordaten per WLAN übertragen möchte, ist das ideal.
Verwirrt war ich zunächst einmal wegen der PIN-Belegung, weil im Internet verschiedene, darunter auch falsche Belegungen zu finden sind. Am Ende fand ich heraus, dass dieses PIN-Mapping korrekt ist. Zumindest, was die Pins GPIO21 (I²C SDA, Serial Data) und GPIO22 (I²C SCL, Serial Clock) angeht. Entsprechend sind die Drähte vom ESP32 zum Watterot-BME680 also zu ziehen:
- 3V3 -> VCC (positive Versorgungsspannung)
- GND -> GND (Masse)
- GPIO21 -> SDA
- GPIO22 -> SCL
Die Programmierung
Ich hatte zwar Lust, aber keinesfalls die Zeit, meinen Temperatursensor mit allen Features selbst zu programmieren. Mittels der Arduino IDE habe ich probeweise den BME680-Sketch von Adafruit geflasht, der auch auf Anhieb funktionierte, allerdings die Sensorwerte nur über die serielle Konsole ausspuckte.
Beim Suchen nach Anleitung für NodeMCU-Firmware (für den ESP8266) bin ich vor einer Weile auf die NodeMCU custom builds gestoßen, ein Webfrontend, mit dessen Hilfe man sich aus einer vielfältigen Auswahl von Modulen (u.a. auch für den BME680) eine maßgeschneiderte Firmware bauen lassen kann. Sieht ziemlich genial aus, aber leider wird der ESP32 dort (noch) nicht unterstützt.
Also ging die Suche weiter, und irgendwann bin ich auf esphomelib gestoßen, a comprehensive solution for using ESPs with Home Assistant. Im Prinzip ist das ein Tool, welches anhand einer übersichtlichen YAML-Konfiguration (siehe esphomeyaml) eine maßgeschneiderte Firmware für ESP8266- und ESP32-basierte Boards kompiliert und aus diesen Gründen einfach großartig ist:
- Vollständige und klare Dokumentation aller Funktionen und Optionen.
- Tutorials und Getting-Started-Guides, FAQs und Migrationsanleitungen.
- Großer Umfang an unterstützten Komponenten.
- Einfache Konfiguration über YAML-Dateien.
- Web-Oberfläche mit Zugriff auf lokale Boards über WLAN.
- Ausgefeilte Logging-Mechanismen.
- Open Source
Installiert und vorbereitet habe ich das so:
$ sudo apt install python-dev
$ pip install esphomeyaml tornado esptool
$ mkdir esphomelib && cd esphomelib
$ esphomeyaml meinsensor.yaml wizard # startet den Wizard
$ esphomeyaml meinsensor.yaml run # baut und flasht die Firmware
$ esphomeyaml ./ dashboard # startet die Weboberfläche
Der Wizard fragt einige Basisdaten ab und generiert daraus die Konfigurationsdatei meinsensor.yaml
, die später noch angepasst werden kann. Danach kann bereits die Firmware gebaut und geflasht werden. Das lief bei mir alles super simpel, schnell und ohne Probleme. Innerhalb von Minuten begann mein Sensor also, Daten an meinen MQTT-Server zu schicken. Da dieser bereits in meiner Home Assistant-Installation registriert war, wurden die Werte dort auch direkt angezeigt. Über die Weboberfläche von esphomeyaml
habe ich zusätzlich auch noch direkten Zugriff auf die Logs meines Sensors.
Kleinere Probleme
Auf dem ESP32 sind, anders als auf dem ESP8266 keine SSL-Verbindungen zum MQTT-Server möglich, weil die genutzte Bibliothek AsyncTCP noch kein SSL unterstützt. Zähneknirschend musste ich also den Port für unverschlüsselte Verbindungen auf meinem MQTT-Server öffnen.
Die Sensor-Werte des Barometers und für die Luftqualität sind erstmal nicht brauchbar. Der Luftdruck müsste korrigiert werden, und den Index for Air Quality (IAQ) kann bisher nur eine proprietäre Software von Bosch Sensortec berechnen.
Fazit
Abgesehen davon kann ich jedem/r, der/die schnell und einfach Sensoren an einem ESP2866- oder ESP32-Board auslesen möchte, empfehlen, sich zunächst einmal esphomelib
anzuschauen - viel besser wird es wahrscheinlich nicht mehr. Natürlich werden bei weitem nicht alle Sensoren unterstützt, aber viele gängige sind dabei.
Meine Konfigurationsdatei
esphomeyaml:
name: meinsensor
platform: ESP32
board: esp32dev
wifi:
ssid: 'foobar'
password: 'foobar'
mqtt:
broker: 'mqtt.foobar.de'
username: 'mattsches'
password: 'foobar'
# Enable logging
logger:
ota:
password: 'foobar'
i2c:
sda: 21
scl: 22
scan: False
sensor:
- platform: bme680
temperature:
name: "Temperatur"
oversampling: 16x
pressure:
name: "Barometer"
humidity:
name: "rel. Luftfeuchte"
gas_resistance:
name: "Luftqualität"
address: 0x76
update_interval: 15s
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt