die-eggerts@SmartHome – Teil 18: Selbstbau-Thermometer mit NodeMCU und DHT22

Ich habe gebastelt: Die Idee ist, einige Räume zu überwachen – nichts Aufwendiges, nur Temperatur und Luftfeuchtigkeit. Für die Zimmer mit Publikumsverkehr sind Shelly H&T-Sensoren unterwegs, über die ich sicherlich auch noch etwas schreiben werde (wenn ich sie denn habe). In den Bereichen, in denen es nicht zwingend was fürs Auge sein muss (also Dachboden und Carport), kommen selbstgebastelte Thermometer zum Einsatz.

Die Materialliste ist recht überschaubar. Pro Thermometer brauche ich

  • Ein NodeMCU-Board. Das ist ein Board mit einem ESP8266-Mikrochip (der kommt nebenbei mit WLAN, GPIO-Pins, SPI, I²C und anderen Nettigkeiten daher).
  • Ein DHT22 Luftfeuchte- und Temperatursensor. Ein kleiner Sensor, der (der Name lässt es erahnen) Temperatur und Luftfeuchtigkeit misst.
  • Eine Abzweigdose (der Kram muss irgendwo rein) – eine kleine reicht völlig.
  • Etwas Draht / Litze
  • Schrumpfschlauch (nicht erforderlich, aber hilfreich)
  • Lötkolben und Lötzinn
  • Ein Mikro-USB-Kabel

Board und Sensor gibt es jeweils im Dreierpack bei diversen Versandhändlern für mehr oder weniger Geld, die Abzweigdosen im Baumarkt; der Kleinkram findet sich immer irgendwo in der Krawusel-Kiste.

Über die Pinbelegung will ich hier nicht viele Worte verlieren – Google kann da helfen. Ein Hinweis nur: Die Benennung der Pins und die GPIO-Nummern sind nicht deckungsgleich – der Pin D4 heißt intern „GPIO2“ und D2 heißt „GPIO4“. Das hat mich bei den ersten Tests dazu verleitet zu glauben, dass meine defekt waren. Aber ein Blick in die Spezifikation hat dann geholfen.

Sind die Tests erfolgreich verlaufen, wird das Ganze verlötet:

18-01_thermometer

Sicher nicht hübsch, aber für den Dachboden mehr als ausreichend. Die Dose einfach nur auf den Dachboden zu legen, bringt nicht wirklich viel, sie soll die ermittelten Werte natürlich auch in irgendeiner Weise im Netzwerk zur Verfügung stellen – was nützt ein Thermometer, wenn man es nicht ablesen kann?

Im Internet gibt es viele Beispiele, die so ziemlich jedes Bedürfnis befriedigen. Ich habe mich dafür entschieden, Tasmota auf das Board zu flashen – es ist ein ESP8266-Chip, für den Tasmota gemacht wurde. Das Gute ist, dass das komplett ohne Löten abläuft – das NodeMCU-Board hat einen Mikro-USB-Anschluss. Alles, was ich brauche, ist die Arduino-IDE. Die gibt es in verschiedenen Varianten zum Download oder als App im Windows Store. Ist sie gestartet, geht’s zuerst in die Einstellungen:

18-02_ide-settings

Wichtig ist die Angabe bei „Zusätzliche Boardverwalter-URLs“:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Die tragen wir ein und klicken auf OK. Im Menü Sketch gibt es einen Eintrag „Bibliothek einbinden“ mit einem Punkt „Bibliotheken verwalten…“. Den klicken wir an und suchen nach „ESP8266“. In der Liste markieren wir die ESP8266-Library von Adafruit und klicken auf Installieren.

Weiter geht’s mit Tasmota (auch hier ist etwas Handarbeit gefragt). Zuerst laden wir uns das ZIP-File von Github herunter und entpacken es (oder klonen das Repository). Innerhalb des Tasmota-Ordners gibt es ein Verzeichnis „lib“. Dessen Inhalt kopieren wir in das Verzeichnis, in dem die Arduino-Libraries liegen (<Installationsverzeichnis der Arduino-IDE>\lib).

Das Verzeichnis Tasmota kopieren wir aus dem Repository in den Ordner, in dem unsere Arduino-Programme (die heißen Sketches) liegen (welcher Ordner das ist, steht in den Einstellungen unter „Sketchbook-Speicherort“). Dann starten wir die Arduino-IDE und öffnen die Datei tasmota.ino. Die IDE öffnet daraufhin alle weiteren benötigten Dateien in zusätzlichen Tabs. Für uns ist die Datei my_user_config.h relevant. Hier müssen wir ein paar Kleinigkeiten anpassen:

18-03_config1

In den Zeilen 65 und 66 tragen wir die SSID unseres WLANs sowie das Passwort ein. Wer DHCP nutzt, ist hier fertig; alle anderen können zusätzliche Netzwerkeinstellungen festlegen.

Zusätzlich dazu bietet es sich an, die Sprache auf Deutsch „umzustellen“. Dafür wird einfach der Kommentar in Zeile 318 entfernt:

18-04_config2

Jetzt noch unter Werkzeuge das passende Board auswählen, anschließen (der Treiber wird automatisch installiert) und die Firmware hochladen. Ein Blick in die Liste der WLAN-Clients in der FritzBox offenbart die IP-Adresse des Boards, die wir im Browser aufrufen können:

18-05_tasmota

Damit haben wir das meiste geschafft. Wir müssen Tasmota jetzt noch mitteilen, welches Board wir nutzen und welcher Chip an welchem GIPO-Pin hängt. Auf geht’s in die Einstellungen. Hier ändern wir den Gerätetyp auf „Generic (0)“. Wenn wir das speichern, startet das Gerät neu. Wieder in den Einstellungen, legen wir den GPIO-Pin fest, an dem unser DHT22-Sensor hängt (Achtung: Der firmiert in der Dropdown-Liste unter seinem „Zweitnamen“ AM2301).

18-06_dht22

Nach dem Speichern startet das Gerät wieder neu und präsentiert die ermittelten Werte bereits auf seiner Startseite:

18-07_fertig

Die Einbindung in Home Assistant erspare ich uns an dieser Stelle – wer das nochmal wissen will, ist herzlich eingeladen, sich den Artikel über TasmoAdmin und Mosquitto durchzulesen. Nach einer kleinen Anpassung der Entitätsnamen sieht die Integration in Home Assistant dann so aus:

18-08_homeassistant

Auf diese Weise werden alle anderen Selbstbau-Thermometer eingebunden. Interessant wir das bei den Shelly H&T-Sensoren: Die sollten auch Tasmota-fähig sein. Aber da die Firmware des Herstellers sowohl MQTT als auch REST-Aufrufe unterstützt, weiß ich noch nicht, ob ich die wirklich flashen will (das ist immer so eine Sache mit der Garantie).

Im nächsten Teil sehen wir uns die Oberfläche etwas genauer an – mit der Zeit wird sie (weil sie von Home Assistant verwaltet wird und der neue Geräte automatisch hinzufügt) unübersichtlich…

Nachtrag 13.06.2020:

Wie sich herausgestellt hat, funktionieren die DHT22-Sensoren relativ einfach. Es gibt nur ein Problem: Genau ist anders – bitte nicht falsch verstehen: Mir ist klar, dass man bei den Preisen keine Präzisionsgeräte erwarten kann, die die Temperatur bis auf die dritte Nachkommastelle genau messen. Um ehrlich zu sein, würde es mich auch überhaupt nicht stören, wenn das Messergebnis um 0,1 oder 0,2 Grad abweicht. Wenn ich aber nun die Temperatur, die unsere alte Wetterstation anzeigt, mit dem vergleiche, was der DHT22 auswirft, erhalte ich eine Differenz von 1,8°C – das ist mir viel zu viel!

Ich habe daher noch einen BMP180-Sensor genommen – der kann neben der Temperatur auch noch den Luftdruck messen. Und was soll ich sagen: Wetterstation und BMP180 stimmen überein (ein Zehntel hätte mich nicht gestört).

Die Einbindung in Tasmota war nicht „mal eben“ gemacht – bis ich gemerkt habe, woran es lag: Der DMP180 ist ein I²C-Chip. Tasmota kann mit diesem Bussystem grundsätzlich umgehen – wenn es denn weiß, dass es das auch soll. I²C ist in den Tasmota-Sourcen grundsätzlich aktiviert, allerdings muss die Unterstützung für den DMP180 explizit freigeschaltet werden. Dafür muss lediglich ein Kommentar in der my_user_config.h entfernt werden (in meiner Version in Zeile 467):

 #define USE_BMP // [I2cDriver10] Enable BMP085/BMP180/BMP280/BME280 sensors (I2C addresses 0x76 and 0x77) (+4k4 code)

Hier müssen die zwei Schrägstriche am Anfang der Zeile entfernt werden. Das ist alles. Wenn man dann das Projekt kompiliert und auf das NodeMCU-Board hochlädt, muss man Tasmota noch mitteilen, welche Sensor-Pins an welchen GPIO-Pins hängen:

18-09_tasmotabmp180

Hier habe ich sowohl einen BMP180 als auch einen DHT22 angeschlossen. Nach dem obligatorischen Neustart werden die Werte auf der Startseite des Geräts angezeigt:

18-10_tasmotaresults

Hier ist eindrucksvoll zu sehen, wie weit die Messergebnisse auseinander gehen (die Sensoren liegen auf meinem Breadboard ca. fünf Zentimeter auseinander – die Chance, dass die Differenz dermaßen groß ist, dürfte quasi nicht vorhanden sein. Wir merken uns also: Der DHT22 ist nur für Spielereien und zum Testen geeignet; beim BMP180 sieht das anders aus. Ich habe jetzt noch einen BME280 bestellt; der kann Temperatur, Luftfeuchtigkeit und -druck auslesen. Mal schaun, was der so anzeigt…

Copyright © 2020. Powered by WordPress & Romangie Theme.