SR04, Tasmota, ESP32, MQTT und IOBroker

Ja, ein wahrhaft kryptischer Titel. Will sagen: seit Sommer 2022 experimentiere ich damit, Sensordaten mit Hilfe von IOBroker auszuwerten. Der Grundlagen-Blogartikel dazu will und will nicht fertig werden, weil ich täglich etwas Neues lerne. Hier versuche ich mal ein Teilprojekt herauszugreifen: ein Abstandssensor, der seine Daten per MQTT-Protokoll an IOBroker schickt.

IOBroker ist wunderbar, um Mess- uns Sensordaten verschiedenster Art zusammenzutragen und auszuwerten. Wenn nicht alles, was man messen oder auslesen möchte, im Umkreis weniger Meter ist, braucht es abgesetzte Sensoren. Grundsätzlich kann man dafür weitere IOBroker-Instanzen auf weiteren Raspberry Pis aufsetzen und diese als Slave in die Hauptinstallation integrieren. Das ist aber unnötig teuer und unnötig aufwendig, wie ich kürzlich gelernt habe – Mikrocontroller wie der ESP32 können das viel einfacher und billiger.

Olimex ESP32 – ein Mikrocontroller mit Ethernet

Ich hatte das bisher nicht in Betracht gezogen, weil die meisten dieser Mikrocontroller nur via WLAN kommunizieren, was mir an manchen Stellen nicht taugt. Eine großartige Entdeckung war daher der Olimex ESP32-PoE – ein ESP32 mit Ethernet-Schnittstelle! Und sogar Stromversorgung per PoE, falls man mag. Es gibt verschiedenste Modelle – für die ersten Schritte habe ich mich für die einfachste Version entschieden. Wichtig ist bei den Varianten ohne -ISO im Namen lediglich, dass die Platine nie gleichzeitig Strom per USB und PoE erhalten darf.

Olimex ESP32-PoE

Tasmota

Als “Betriebssystem” ist Tasmota gut geeignet, das sich phänomenal einfach über einen Web-Installer aufspielen lässt. Dazu wird Olimex per Micro-USB-Kabel mit dem Notebook verbunden und meldet sich dort als USB-Seriell-Gerät. Anschließend ruft man https://tasmota.github.io/install/ auf und wählt “Connect”.

Beim ersten Versuch bekommt man das Gerät “USB Serial” nicht zu sehen, weil der Treiber fehlt. Beim Klick auf “Abbrechen” bekommt man den zum Glück angeboten, und wenn man sich dann nicht scheut, ein etwas windig aussehendes Treiberpaket zu installieren, kommt die Verbindung beim nächsten Versuch zustande.

Hier nur noch einmal auf “Install Tasmota” klicken und nach wenigen Minuten ist der Olimex einsatzbereit. Vorausgesetzt, man nutzt ein geeignetes USB-Kabel, da musste ich für einen erfolgreichen Flash-Vorgang erst mehrere ausprobieren. (Obacht: es gibt auch Kabel, die nur zum Laden geeignet sind, aber keine Daten übertragen)

Auch wenn ich WLAN nicht nutzen möchte, ist es für die ersten Schritte doch hilfreich, denn “ab Werk” funktioniert die Ethernet-Schnittstelle nicht. Also “Connect to Wi-Fi”, Zugangsdaten zum heimischen WLAN eingeben und schließlich “Visit device”

Darauf erscheint zum ersten Mal die schlichte Tasmota-Weboberfläche:

An diesem Punkt kann man die USB-Verbindung trennen und ein Netzwerkkabel mit PoE-Speisung einstecken. Oder man belässt die Stromversorgung via USB, darf dann aber keine PoE-Spannung anlegen! Wie auch immer – eine Ethernet-Verbindung kommt noch nicht zustande.

Ethernet und die GPIO-Hölle

Meine ersten Befürchtungen, dass Tasmota die Ethernet-Schnittstelle des Olimex nicht unterstützt, waren unbegründet. Es ist schlicht so, dass der Olimex wahnsinnig viel auf begrenzten GPIOs-Kontaktpins unterbringt. Daher sind viele doppelt, dreifach, fünffach belegt und man muss zunächst zuweisen, welcher Pin was tun soll. Hier eine Übersicht der Vielfachbelegung:

Klick zum Vergrößern. Quelle: https://www.olimex.com/Products/IoT/ESP32/ESP32-POE-ISO/resources/ESP32-POE-ISO-GPIO.png

Das hat zur Folge, dass man höllisch aufpassen muss, um nicht an einer Doppelbelegung zu straucheln. Das erneute Flashen per USB scheitert z.B., wenn man an einem der GPIOs zwischenzeitlich bereits einen Sensor angeschlossen hat – da überlappt offensichtlich etwas:

“Installation failed” – mögliche Ursache: GPIOs, die für die USB-Schnittstelle benötigt werden, sind anderweitig belegt.

Das Trennen der Datenleitungen zum Sensor schafft in diesem Fall Abhilfe, die GPIOs müssen nicht in der Konfiguration freigegeben werden.

Um den Ethernet-Port zu aktivieren, klicken wir auf “Configuration”, dann “Configure Module” und opfern dort drei GPIOs für Ethernet:

Nach dem Klick auf “Save” springen zwei weitere LEDs an, die eine erfolgreiche Ethernet-Verbindung signalisieren.

WLAN deaktivieren

Wer mag, kann an dieser Stelle WLAN deaktivieren. Dafür müssen wir uns zum ersten Mal auf die Niederungen der Textkonsole begeben: im Hauptmenü “Tools”, dann “Console” wählen. Zur Orientierung ist hier die Tasmota-Kommandoübersicht extrem hilfreich. Dort tippen wir “WiFi 0” in die “Enter Command”-Zeile und ernten eine Bestätigung:

Sensor anschließen

Jetzt können wir uns daran machen, einen ersten Sensor anzuschließen. In meinem Fall ein wasserdichter Ultraschall-Sensor AJ-SR04M / JSN-SR04T. 5V und GND finden sich anhand obiger Pin-Übersicht schnell, bei den Datenleitungen gilt es aufzupassen. Nicht jeder GPIO kann alles – manches sind Eingänge (RX), anderes Ausgänge (TX) und wieder andere können unter bestimmten Bedingungen beides (IO). Erfolg hat man mit dieser Kombination:

  • GPIO1: SR04 Tri/TX
  • GPIO3: SR04 Ech/RX

Beim Verkabeln ist zu beachten, dass die Leitungen gekreuzt werden müssen, die Sendeleitung des Olimex auf die Empfangsleitung des SR04 und umgekehrt:

Wenn alles glatt geht, erhalten wir nach dem nächsten Neustart erste Sensordaten auf der Startseite:

Web Admin Password

Bevor wir uns ans Übermitteln der Daten an IOBroker machen, ist es eine gute Idee, ein Passwort für die Weboberfläche zu vergeben. Dazu wählen wir im Hauptmenü “Configuration”, “Configure other” und tragen ein “Web Admin Password” ein. Ob das Häkchen hinter “Web Admin Password” dieses aktiviert oder nur die Klartextanzeige aktiviert, ist etwas rätselhaft. Im Zweifel anhaken!

Nach dem Neustart wird das Passwort wie erwartet abgefragt, bei darauffolgenden Neustarts aber nicht mehr. Da auch das Häkchen hinter “Web Admin Password” nicht mehr aktiv ist, könnte man meinen, dass die Konfiguration verlorengegangen ist. Dem ist nicht so, das Passwort ist lediglich im Browser gecached. Prüfen lässt sich das, indem man die Oberfläche in einem privaten Tab oder mit einem anderen Browser aufruft, dann erscheint die Anmeldeseite wieder wie erwartet:

Das Feld “Benutzername” bleibt bis Tasmota 13.3 leer, ab 13.4 ist der Benutzername “admin”.

MQTT-Verbindung zu IOBroker aufbauen

Das Protokoll, um Daten an IOBroker zu übermitteln, lautet MQTT. Naheliegend ist die Installation des Adapters “MQTT Broker/Client”. Damit hatte ich aber wenig Erfolg – Daten wurden immer nur ein mal nach dem Start des Olimex übertragen, danach nicht mehr. Besser klappt es mit dem Sonoff-Adapter – der ist im Grunde auch nur ein MQTT-Broker, also ein Adapter, der MQTT-Meldungen entgegennimmt.

Wer den Sonoff-Adapter zusätzlich zu “MQTT Broker/Client” installiert, muss aufpassen, dass beide einen eigenen Port bekommen, also etwa 1883 und 1884. Hier die Konfiguration des Sonoff-Adapters – Name und Passwort für die Anmeldung der Clients wollen noch manuell vergeben werden:

Anschließend wählen wir in Tasmota “Configuration”, “Configure MQTT” und tragen dort Host (die IP-Adresse des IOBroker), Benutzername und MQTT-Passwort und gegebenenfalls den abweichenden Port ein:

Der Olimex startet ein weiteres Mal, und wenn alles glatt lief, erscheint ein neuer Eintrag im IOBroker-Objektbaum:

Das schöne am Entgegennehmen per Sonoff-Adapter ist auch, dass alle Werte in eigenen Variablen herausgeführt werden, während man per MQTT-Broker nur einen JSON-String erhält, aus dem die gewünschten Werte erst herausgefriemelt werden wollen.

Als Letztes mag es noch sinnvoll sein, die Häufigkeit der Messungen zu konfigurieren. Den Füllstand eines Tanks, der sich über Monate füllt oder leert, muss ich nicht im zehn-Sekunden-Takt tracken, das generiert unnötig viele Daten.

Da MQTT die Daten zum Empfänger pusht, stelle ich die Sendehäufigkeit im Absender, hier also Tasmota ein. Das ist etwas kryptisch versteckt unter “Configure Logging” und dort unter “Telemetry Period”. In der Kommandoübersicht (siehe oben) lässt sich nachlesen, dass dieser Wert zwischen 10 und 3600 Sekunden liegen darf. Die Daten werden also mindestens stündlich übertragen. Mir hätte es glatt auch täglich gereicht, aber das ist zu verschmerzen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert