ESP01 Fühler

Der Anlass war wieder mal trivial: Zwei Kaninchen sollen im Außenstall den Winter überstehen. Natürlich ist der Stall etwas isoliert und vor allem gegen Zugluft geschützt. Aber mich hat dennoch interessiert, wie warm es da drin wird. Schon war die Idee geboren, einen kleinen ESP8266 mit einem Sensoren und Batterien im Stall zu montieren und die Daten an meine PRTG-Instanz melden zu lassen.

Ursprünglich wollte ich den Code mit C komplett selbst schreiben. Aktuell nutze ich aber Tasmota und sende die Daten an PRTG und Tasmota.

Beachten Sie auch die Seite ESP8266 Relay mit weiteren Einblicken zur besonderen Funktion von GPIO 0,1,2 und 3.

Dazu muss ich eben einmal einen ESP8266 mit energiesparenden Betrieb bauen und irgendwie eine Meldung an PRTG absetzen können. Zuerst war ich wieder drauf uns dran, alles per Arduino und C-Code selbst zu schreiben. In der Zwischenzeit habe ich aber auch Tasmota (Siehe ESP8266/ESP32 3rd Party Firmware) kennen gelernt und den Weg als viel flexibler angesehen.

Der ESP01 ist so ziemlich das günstigste Board mit einem ESP8266 und kostet meist nicht mal 2€. Das ist natürlich mit Einschränkungen verbunden, z.B. externer Programmieradapter, nur zwei GPIO-Ports, kein Spannungsregler. Wenn Energiebedarf keine kritischer Punkt ist, würde ich immer größere Boards nutzen, die auch nur 1-2€ mehr kosten.

ESP01 Basis

Zum Aufbau der Hardware gibt es unzählige Webseiten und Beispiele im Internet, die quasi schon fast "fertig" sind. Ich beschränke mich dabei auf die wesentlichen Dinge und ergänzenden Links. Die Plattform des ESP8266 habe ich auf ESP8266 schon umfangreich beschrieben. Es gibt zwar die Boards von WeMOS IoT-Device, NodeMCU / LUA u.a. die einfach per USB am PC angeschlossen werden. Diese werden vom PC aber mit 5V versorgt und arbeiten intern mit 3,3V. Der Spannungsregler ist natürlich nicht sonderlich effektiv und 5V per Batterie zu liefern ist auch kniffliger als 3 Volt. Daher habe ich zur Entwicklung des Codes erst mal mit einem WeMOS IoT-Device (D1 Mini) entwickelt und am Ende mit einem USB-Programmer auf den ESP8266 gebrannt.

Um so ein Gerät per Batterie zu versorgen, muss man sparsam mit der Energie umgehen und nicht nur den ESP in einen energiesparenden "DeepSleep"-Mode bringen, sondern auch "drum herum" möglichst Bauteile vermeiden. Ein USB2Seriel-Chip, den ich nur zum programmieren und debuggen brauche, ist im Regelbetrieb zu energiehungrig. Auch eine LED-Anzeige sollte man vermeiden und erst recht ineffektive Spannungsregler. 2x AA-Batterien liefern eigentlich recht gut auch ohne weitere Regelung die 3,0-3,3V, die ein ESP12 braucht. Oder man nutzt wirklich einen "Low Drop" Regler. Siehe auch ESP Energiebedarf.


Angepasst von https://tasmota.github.io/docs/DS18x20/#multiple-sensors

Daher sieht mein Setup recht genau wie das Beispiel von Tasmota aus.

Erweiterung DeepSleep

Allerdings habe ich den CH_PD auch noch an 3.3V angeschlossen und in violett eine dünne Leitung von GPIO16 direkt am Chip auf RESET gelegt. Gelötet sieht das dann so aus:

Am besten löten Sie das kabel erst am RST-Pin an und verzinnen das andere Ende. Dann biegen Sie es vorsichtig bis direkt auf den Pin und halten kurz den spitzen Lötkolben an das Kabel. Das Lötzinn schmilzt und sollte direkte GPIO16 verbinden. Wer ein etwas größeres ESP12 Boards als Basis nutzt, kommt noch einfacher an den Chip. Es gibt mittlerweile spezielle und etwas teurere Komplettboards, die effektive Spannungswandler und abschaltbare Nebenkomponenten haben. Allerdings müssen Sie schon genau schauen, denn viele Boards geben nur die nackten Microampere des ESP01 ohne äußere Beschaltung an.

In dem Zuge auch nochmal ein Blick auf die beiden LEDs

  • Rote Umrandung: Rote LED = Power
    Leuchtet dauerhaft bei Spannungsversorgung. Die sollte man später dann "abklemmen". Angeblich brauch sie ca. 0,5mA (Quelle http://stefanfrings.de/esp8266/). Nicht jeder Board hat diese LED
  • Blaue Umrandung: blaue LED = TX
    Die blinkt nur, wenn der ESP01 auch Daten sendet. Unkritisch, wenn Sie nicht dauerhaft serielle Diagnoseausgaben nutzen.

Die Verbindung von GPIO16 zu RESET ist wichtig, da der energiesparende Zeitgeber im ESP8266 über diesen Ping ein Signal ausgeben kann und per RESET der ESP dann aufwacht. So sollte der Chip die meiste Zeit komplett schlafen und nur zyklisch aufwachen, messen, senden und wieder schlafen. Wenn Sie aber noch über andere Schalter einen RESET auslösen wollen, dann sollten Sie einen 330 - 1K Ohm-Widerstand nutzen, denn GPIO16 ist als Ausgang per Default auf "HIGH" gesetzt. Das Kurzschließen mit einem anderen Schalter auf Masse könnte sonst den Chip beschädigen. Während des Programmierens muss die Verbindung aber getrennt sein.

Im Arduino-Code könnte ich einfach so den DeepSleep starten.

Serial.println("ESP8266 in sleep mode");
ESP.deepSleep(sleepTimeS * 1000000);

Zwischen Aufwachen, in WIFI einbuchen, Daten senden und wieder schlafen vergeht mit einer statischen IP weniger als eine Sekunde. Wer DHCP nutzt, braucht entsprechend länger. Wer mag kann ja auch eine NiCd/LiPo-Akku samt Solarzelle und Spannungsregler verwenden. Die diversen LED-Leuchten aus dem Baumarkt sind schon fast einsatzbereit.

Zwischenstand mit DS18S20

Das Bild ist leider etwas unscharf aber ich denke man kann schon erkennen, dass links der DS18S20 mit dem oberen Bein an GND angeschlossen ist.

Das untere Bein ist durch den 4,7kOhm-Widerstand verdeckt aber mit Vcc verbunden. Das mittlere Bein mit der Datenleitung wird mit GPIO0-verbunden und durch den 4,7kOhm Widerstand (Pullup) gegen Vcc auf High gehalten. Es kann aber sowohl vom DS18S20 als auch dem ESP8266 jederzeit auf GND gezogen werden. Die grüne Leitung ist wieder die Verbindung von GPIO16 zu Reset, um den ESP8266 aus dem Schlafmode zu holen.


Quelle: https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf

Achtung: Sie sehen hier noch die rote "Betriebsspannungs-LED". Für den Batteriebetrieb muss diese LED natürlich entfernt werden. Sie leuchtet ansonsten kontinuierlich durch, d.h. leider auch wenn der ESP01 im Tiefschlaf verharrt.

Der ESP8266 hat zwar einen Analogeingang, (0-1V,10 Bitauflösung), mit dem ich den Spannungspegel der Batterie messen könnte. Allerdings ist auf dem ESP01-Board der ADC-Anschluss nicht heraus geführt und einen zweiten Draht zwischen den Pins anzulöten ist mir das Risiko nicht wert.

Tasmota PRTG und DeepSleep

Aber anstatt nun ormIO oder Arduino-IDE anzuwerfen, habe ich mich meiner Vorarbeit von PRTG und Tasmota bedient. Tasmota kann eigentlich schon alles:

  • 1-Wire Temperatursensoren auslesen
  • DeepSleep nutzen
  • Einfache Konfiguration
  • DiagnoseFunktion
  • PRTG-support über WebSend
  • Optional Syslog und MQTT-Support
  • Ausgereifte Software

Die Tasmota-Firmware habe ich schnell über dem WebInstaller auf den ESP01 gebracht. Allerdings gibt es für den ESP01 kein Template und damit ich mich bei der Einrichtung nicht verklicke, habe ich mir schnell ein Template gebaut.

{"NAME":"ESP01","GPIO":[1,0,1,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}

Nach dem Import kann ich nur noch die beiden GPIO-Pins konfigurieren.

Ich könnte im Template sogar noch die Belegung der beiden GPIO-Pins festzurren. Das habe ich mir aber erst mal gespart um das Template auch für andere Projekte einsetzen zu können und konfiguriere den ESP01 wie folgt:

Bei der Auswahl der Belegung gibt es eine "DeepSleep"-Option. Die darf ich hier nur dann nutzen, wenn ich den GOIP-Pin per Schalter dann auf GND ziehen kann um den Wechsel zum DeepSleep zu unterbrechen. Für das "Aufwecken" ist GPIO16 fest verdrahtet.

Dann muss ich nun nur noch "DeepSleep" konfigurieren. Das geht allerdings noch nicht per Browser sondern nur per Kommandozeile auf der Konsole oder per MQTT-Befehl. Wenn ich den ESP8266 jede Minute aufwecken will dann geben ich einfach per Kommandozeile folgendes ein:

DeepSleepTime 60

Der Wert muss zwischen 60 Sekunden und 86400 Sekunden ( =1 Tag) liegen, wobei der ESP8266 intern maximal 71 Minuten unterstützt. Um den Rest kümmert sich aber Tasmota, d.h. vor Ablauf wacht der ESP8266 kurz auf um sich den Wecker neu für die nächsten 71 Minuten zu stellen.

Normalerweise sendet Tasmota alle 300 Sekunden die Telemetriedaten und Messwerte, wenn ich nicht mit Regeln arbeite. Dieses Intervall kann ich mit dem Befehl "TelePeriod" anpassen. Wenn ich alle 60 aufwache aber nur alle 300 Sekunden eine Meldung sende, dann, könnte ich mir die zwischenzeitlichen Wakups sparen.

TelePeriod:10

Per MQTT kann ich den Wert aus der Ferne setzen und damit auch einfach den DeepSleep-Mode wieder abschalten.

cmnd/<myDeviceTopic>/DeepsleepTime <wert>

Das geht per Kommandozeile oder auch MQTT-Explorer o.ä. Wenn das Gerät im Tiefschlaf ist, müssen Sie den Wert mit "Retained" kennzeichnen, damit der MQTT-Server den Wert bis zur nächsten Verbindung vorhält. Hier am Beispiel des MQTT-Explorer (http://mqtt-explorer.com/)

Hinweis: Wenn Sie den Wert als "retain" setzen, dann bleibt er im MQTT-Server stehen und Tasmota liest ihn bei jedem Start wieder ein. Sie müssen den Wert daher aktiv entfernen, wenn Sie über die Konsole den Wert anpassen wollen.

Nach dem Anschluss des DS18x20 an den GPIO0 mit einem Pullup-Widerstand konnte ich auf dem Webportal und in der Konsole schon die Messwerte sehen.

Die Verbindung zum Temperatursensor ist damit verifiziert und auch im Console-Log sehe ich den Start, das Auslesen und die Aktivierung des Schlafmode:

In dem Bild ist gut zu sehen, dass nach dem Aufwachen die Uhrzeit bei 00:00:00 startet und nach der WLAN-Verbindung die Uhrzeit geholt wird. Das bedeutet aber, dass ohne WLAN die Funktion von DeepSleep nicht gewährleistet ist.

Ich nutze die in Tasmota eingebaute Funktion eines regelmäßigen Schlafmode nach einer einmaligen Abarbeitung der Abfragen.

Tasmota liest bei jedem Aufwachen den Sensor und sendet die Daten per MQTT. Ohne DeepSleep werden die Daten des DS18S20 einmal in 5 Minuten gelesen. Mit MQTT-Explorer kann der Wert sehr einfach in eine Grafik gepackt werden. Hier ist auch gut zu sehen, dass am Anfang mit DeepSleepTime 60 jede Minute ein Messwert gesendet wurde und ohne DeepSleep jede 5 Minuten

Es gibt auch die Möglichkeit, den ESP8266 anhand von Regeln schlafen zu legen. Das ist immer dann interessant, wenn der ESP8266 z.B. extern über einen Reset aufgeweckt wird und Sie anhand der Messwerte die Tiefschlafzeit anpassen wollen.

Tasmota und der DeepSleep (2020-06-15)
https://forum.iobroker.net/assets/uploads/files/1592418524705-tasmota-und-der-deepsleep-20200615.pdf

Keine Software

Ursprünglich wollte ich native mit Arduino und C mir den recht einfachen Code zusammenbauen. Wie so oft bin ich aber nicht dazu gekommen und erst als ich mehr und mehr mit Tasmota gearbeitet haben, ist das alte Projekt wieder zum Vorschein gekommen. Ich muss auch nicht mehr native XML-Dateien an PRTG senden, seit Tasmota zumindest die PRTG Simple REST-Sensoren unterstützt (Siehe PRTG und Tasmota).

Daher belasse ich es hier bei ein paar Links.

Weitere Links