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.
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.
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
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
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.
[{"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.
Moin, darf ich nochmal eine Frage stellen?
Ich habe ein ähnliches Projekt und bekomme die Verbindung von ESP 8266 nach MQTT nicht mehr hin.
Leider habe ich mir nicht notiert von wo der HOST herkommt , heißt wo finde ich die Adresse in meinem System?
Als Name auf MQTT habe ich das topic eingetragen.
Freundlichen Gruß
Bernd
Hallo Bernd,
der HOST ist die IP-Adresse oder auch der sogenannte FQDN des Gerätes,auf dem der MQTT-Service läuft. Ich gehe einmal davon aus, der MQTT-Server ist auf deinem Raspberry Pi installiert. Dann ist es die IP-Adresse des Raspberry Pi.
Viel Erfolg, Georg