Mein Raspberry Pi zur Gartensteuerung kümmert sich aktuell neben der Beleuchtung auch noch um die Erfassung der Daten von Akku, Solarversorgung und Temperatur/ Luftdruck etc. Das ist noch etwas ausbaubar, denn aktuell sind alle Sensoren mit dem Kabel angeschlossen und damit räumlich eng mit dem Raspberry Pi verbunden. Insbesondere die mobile Datenerfassung ist eine spannende und technisch herausfordernde Thematik.


Problemstellung

Der Sensor, beispielsweise ein Temperatursensor soll im Gewächshaus die Temperatur und Luftfeuchtigkeit überwachen. Dort ist aber leider keine 230V Versorgung. Er muss also per Batterie/ Akku betrieben die Daten über WLAN liefern. Die Daten werden so an den Raspberry Pi übergeben, dass dieser damit auch arbeiten kann. Das bedeutet die Werte von dem Sensor auswertet und darauf basierend eine Aktion ausführt (oder ausführen kann). Es muss also eine gemeinsame Schnittstelle geben.

Lösungsansatz

Ein ESP8266 Modul wird mit der Firmware Tasmota betankt und ein DHT11 Sensor erfasst die Daten. Der ESP8266 schreibt diese Daten per MQTT auf den Raspberry Pi über WLAN. Zum Batteriebetrieb reicht es, wenn der ESP8266 nur alle 5 Minuten (oder auch 15 Minuten) Online geht und die Daten aktualisiert. Danach legt er sich wieder schlafen. Die Idee ist dieses mit 2xAA Batterien umzusetzen. Der Datenaustausch erfolgt über MQTT.

ESP8266 auf dem Steckbrett im Testbetrieb

Umsetzung

Das aktuelle Image wird auf den ESP8266 kopiert. Der RST (RESET) Pin wird mit der Standardbeschaltung für „deepsleep“ verkabelt. RST und D0 verbunden, über einen 10k Widerstand an +3.3V gelegt. In meinem Fall habe ich noch den ADC eingebunden. Dieser wird mit einem 25k Trimmpotentiometer verbunden. Dieser könnte dann die Batteriespannung messen und den Batteriewechsel ankündigen.

Konfiguration | Geräte Einstellung
MQTT Config

Die Nutzdaten werden auf dem Boker in den Pfad „ESP3288/DUT“ geschrieben. Dort werden die Informationen vom Raspberry Pi ausgelesen und verarbeitet.

Für NodeRED ist kein spezieller Node benötigt. MQTT IN und MQTT OUT reichen erst einmal aus. Ein Beispiel für die Testumgebung ist nachfolgend dargestellt

Testaufbau in NodeRed

Beispiel Nodes des Testaufbaus

Code im JSON Format des Testaufbaus

[{"id":"51ead15ebd069295","type":"mqtt in","z":"42c93b5c2be89b09","name":"","topic":"ESP3288/DUT/SENSOR","qos":"2","datatype":"auto","broker":"e3166452.21c5d","nl":false,"rap":true,"rh":0,"inputs":0,"x":180,"y":300,"wires":[["fc07927d3047801a","c3281eb17986ea72"]]},{"id":"fc07927d3047801a","type":"json","z":"42c93b5c2be89b09","name":"","property":"payload","action":"obj","pretty":false,"x":390,"y":300,"wires":[["b92c014722d9db1b"]]},{"id":"b92c014722d9db1b","type":"change","z":"42c93b5c2be89b09","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.DHT11.Temperature","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":610,"y":300,"wires":[["4bb7be41c130c5aa"]]},{"id":"c3281eb17986ea72","type":"json","z":"42c93b5c2be89b09","name":"","property":"payload","action":"obj","pretty":false,"x":390,"y":380,"wires":[["d9c374d0bf9f19de"]]},{"id":"d9c374d0bf9f19de","type":"change","z":"42c93b5c2be89b09","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.ANALOG.A0","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":600,"y":380,"wires":[["2f11df36e8223461"]]},{"id":"4bb7be41c130c5aa","type":"mqtt out","z":"42c93b5c2be89b09","name":"","topic":"ESP3288/DUT/Temperatur","qos":"2","retain":"true","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"e3166452.21c5d","x":1140,"y":300,"wires":[]},{"id":"38ce10318596420f","type":"mqtt out","z":"42c93b5c2be89b09","name":"","topic":"ESP3288/DUT/AD0","qos":"2","retain":"true","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"e3166452.21c5d","x":1110,"y":380,"wires":[]},{"id":"2f11df36e8223461","type":"function","z":"42c93b5c2be89b09","name":"calculate voltage","func":"msg.payload = (3.3 /1024) * msg.payload\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":870,"y":380,"wires":[["38ce10318596420f"]]},{"id":"e3166452.21c5d","type":"mqtt-broker","name":"PI04","broker":"localhost","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}]

.

Ansicht im MQTT Broker

MQTT Daten im Broker

Temperatur und AD0 werden durch NodeRED aufbereitet aus den Sensordaten und in den Pfad geschrieben.

Energiesparmodus

Mit dem Parameter „deepsleeptime x“ wird der ESP8266 in den Tiefschlaf versetzt. x ist ein Wert in Sekunden, minimaler Wert ist 11 Sekunden. 5 Minuten sind demnach 300 Sekunden. Dieser Wert kann an der (Web)Konsole oder per MQTT über den CMND-Pfad übergeben werden. Beim nächsten Wake up wird der Wert angewendet. Um es einfacher zu machen, kann hierfür ein NodeRed Flow genutzt werden. Das ist u.a. sinnvoll, wenn am Sensor eine Wartung stattfinden soll.

Flow zur Umschaltung
[{"id":"49b3c4f54712c95b","type":"inject","z":"42c93b5c2be89b09","name":"deepsleep aus","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"num","x":180,"y":540,"wires":[["09b8317deb531a34"]]},{"id":"18c9b1419651ace6","type":"inject","z":"42c93b5c2be89b09","name":"deepsleep 30 Sek.","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"30","payloadType":"num","x":170,"y":600,"wires":[["09b8317deb531a34"]]},{"id":"09b8317deb531a34","type":"mqtt out","z":"42c93b5c2be89b09","name":"","topic":"ESP3288/DUT/cmnd/deepsleeptime","qos":"2","retain":"true","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"e3166452.21c5d","x":500,"y":540,"wires":[]},{"id":"e3166452.21c5d","type":"mqtt-broker","name":"PI04","broker":"localhost","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}]

Ergebnis

Der ESP8266 misst die Daten und liefert die Ergebnisse an den MQTT Broker. Dort werden die Daten abgegriffen und durch den Raspberry Pi verarbeitet. Nach Lieferung der Daten geht der ESP8266 in die Schlafphase. Der Stromverbrauch richtet sich in erster Linie nach der Einschaltzeit, bzw. die Länge der Pausen. Dieses ist neben Temperaturmessung auch eine Vorlage für ähnliche Fälle.