Bodenfeuchtesensor für Homematic IP bauen und nutzen (Teil 3, Software)

Nachdem nun die Hardware für den Bodenfeuchtesensor aufgebaut und in Betrieb genommen wurde betrachtet dieser letzte Artikel, wie die Daten an andere Systeme insbesondere eine CCU übermittlet werden.

Datenübertragung

Daten übertrage ich auf zwei unterschiedliche Wege, nämlich über MQTT (standardmäßig in Tasmota verfügbar) und durch Beschreiben einer Variabeln in der CCU.

MQTT Übertragung

Um die Kommunikation der Schaltung zu testen ist es am einfachsten, MQTT als Protokoll zu verwenden. Tasmota bietet diese Übertragung standardmäßig an. Hierzu benötigt man nur einen MQTT Server der die empfangenen Nachrichten verteilt.

Als Server verwende ich einen simplen Mosquito MQTT Server, den ich auf einer CCU3 installiert habe. Mir ging es vor allen Dingen um eine schnelle Konfiguration ohne lange Installation sowie einer Bündelung wichtiger Aufgaben auf einem Raspi. Die Software findet man unter GitHub. Nach der Installation auf der CCU ist es noch wichtig die beiden Ports 1883 und 1884 in den CCU Firewall Einstellungen frei zu geben. Wer keinen Benutzer und Passwort vergeben möchte ist jetzt schon fertig.

Um zu testen, ob die Ports tatsächlich offen sind (manchmal führt ein Semikolon dazu, dass Dinge nicht funktionieren) nutze ich z.B. den Advanced Port Scanner. Achtet darauf, dass Ihr beim Scannen auch die oberen Portadressen für den Scan angebt.

Nun muss nur noch in der Tasmota WEBUI unter "Configure MQTT" die Host IP-Adresse angegeben werden. Als Topic (Friendly Name) sollte ein aussagekräftiger Name verwendet werden, damit die Nachrichten später klar erkennbar.

Bei mir bekam der D1 mini zuerst keinen Connect, nachdem ich aber auf der CCU den MQTT Server neu gestartet hatte funktionierte alles einwandfrei. Wenn man keinen Friendly Name bzw. topic Namen eingebt, kann das auch ein Grund sein, warum man keinen Connect bekommt.

Zur Überprüfung der korrekten Funktionsweise kann ich das Tool MQTT-Explorer nur empfehlen. Hierin kann man sehen, ob und wie der Empfang und das Versenden von Nachrichten funktioniert. Auf der Tasmota Oberfläche kann man das korrekte Versenden in der Console beobachten.

CCU3 Systemvariablen direkt beschreiben

Da ich gerne die Daten des Sensors in einer CCU3 verwenden möchte, habe ich  die folgende Lösung implementiert.

Über den Port 8181 auf der CCU ist es recht einfach, Funktionen, die z.B. über den CuX Daemon zur Verfügung gestellt werden über eine Webadresse  aufzurufen. Hierzu gehört auch die beliebte Funktion dom.GetObject() zur Abfrage und Setzen von Objektinhalten wie z.B. Variablen in der CCU.

Wenn meine Variable in der CCU z.B. "Feuchtigkeit" heißt, dann kann ich diese über einen Webbrowser wie folgt beschreiben:

http://192.149.131.53:8181/cuxd.exe?ret=dom.GetObject(“Feuchtigkeit”).State(112)

Finale Rules auf Tasmota erstellen

Um die Möglichkeitd der Übertragung von Daten an die CCU realisieren zu können, müssen Tasmota noch die Befehle mitgeteilt werden, die bei jedem Aufwachen des D1 Mini auszuführen sind.

Diese Mini-Programme werden in Tasmota als Rules bezeichnet. Für die Erläuterungen hierzu verweise ich auf die Tasmota Dokumentation zu Rules. Jede Rule wird immer durch ein Ereignis ausgelöst, den Trigger.

Die erste Regel benötige ich für das Einschalten des Relays (GPIO D8), über den Sensor und AD-Wandler mit Strom versorgt werden. Dieser soll immer angeschaltet werden, sobald der D1 Mini angeschaltet wird. Der Befehl hierzu lautet:

Rule1 on Power1#Boot do Power ON endon

Man gibt die Rule in der Console ein und aktiviert diese über "Rule1 1". Ebenso kann man die Rule über den Consolenbefehl "Rule1 0" deaktivieren.

Die zweite Regel benötige ich, um die Sensorwerte abzufragen und in einer Variablen zwischenzuspeichern, denn ich kann beim Versenden von Nachrichten an die CCU3 nur Tasmota Variablen benutzen. Die Regel speichert automatisch einen Sensorwert, der am ersten Analogport liegt in der Variablen "var1", sobald ein neuer Wert vom Sensor geliefert wird.

Rule2 on ADS1115#A0!=%var1% do var1 %value% endon

Auch diese Regel wird nun durch Eingabe in der Console sowie dem Befehl "Rule2 1" aktiviert. Man sieht dann sofort das Ergebnis der Ausführung, wenn permanent neue Werte in die Variablen geschrieben werden.

Und zuletzt wird noch eine Rule verwendet, um den Webbefehl zum Beschreiben der Variable in der CCU abzusetzen. Dies mache ich allerdings erst nach einer Minute, da ich warten möchte, bis die Werte stabil verfügbar sind. Ich übermittle an die Variable "Feuchtigkeit" den Wert der Variablen var1, die ich mit der vorigen Rule gefüllt habe.

Rule3 on Time#Minute do WebSend [192.149.131.53:8181]/cuxd.exe?ret=dom.GetObject("Feuchtigkeit").State(%var1%) endon

Insgesamt können diese Rules natürlich zusammengefasst und weiter optimiert werden, aber ich wollte das Ganze mal nachvollziehbar zeigen. In diesem Beispiel habe ich ebenfalls nur einen Sensorwert verwendet, für den zweiten Sensorwert müssen einfach nur Rule2 und Rule3 kopiert und modifiziert werden.

Die dritte Regel setzt voraus, dass der D1 mini mindestens 1 Minuten an bleibt, bevor der DeepSlepp-Modus aktiviert wird. Daher habe ich die "Telemetry Period" auf 70 Sekunden gesetzt.

Nun kann durch den Tasmota Befehl "DeepSleepTime 3600" die automatische Messung beginnen. Jede Stunde wachte der Sensor jetzt auf und übermittelt per MQTT und durch Beschreiben der CCU-Variable den aktuellen Wert.

Berechnen der Feuchtigkeit

Wenn man sich die Werte anschaut, die der Sensor liefert, dann sind diese nicht wirklich lesbar. Besser wären Prozentwerte, wie feucht der Boden tatsächlich ist. Die Berechnungen sollten in der CCU oder in anderen Systemen erfolgen. Tasmota kann die Werte nicht berechnen.

Berechnung der prozentualen Feuchtigkeit beim SMT50

Da der SMT50 am AD-Wandler angeschlossen ist, liefert die Messung digitale Werte (z.B. 12467). Diese müssen zuerst in eine Spannung umgerechnet werden. Per default entspricht 1 Bit einem Wert von 0,1875 mV (default). Somit erhält man durch die Formel

Spannung (Sensor) = Messert * 0,1875mV / 1000

Mit der für den SMT50 angegebenen Formel für die Bodenfeuchte ergebit sich nun

Prozentwert (Bodenfeuchte) = (Spannung (Sensor)*50) / 3

Truebner gibt übrigens an, dass die maximale Feuchtigkeit 50% entspricht, d.h. wenn man den Sensor ins volle Wasserglas steckt, dann wird eine 50% Feuchtigkeit angezeigt. Da die Spannung in Abhängigkeit von der Feuchtigkeit linear verläuft kann man das Ganze durch den Faktor 2 auch auf 100% normieren.

Für die Berechnung der Bodentemperatur gilt die Formel

Prozentwert (Bodentemeperatur) = (Spannung (Sensor)-0.5)*100

Berechnung der Bodenfeuchte bei einem China-Sensor

Für einen einfache Feuchtesensor aus China (mit hoher Schwankungsbreite) verwende ich folgende Formel (dazu die Sensorwerte manuell messen):

A=Wert des Sensors, wenn er trocken ist

B=Wert des Sensors, wenn er nass ist (im Glas Wasser)

C=aktueller Sensorwert

Prozentwert (Feuchtigkeit)=(1-(C-B)/(A-B))*100

Man kann diesen Wert z.B. durch ein einfaches Programm in der CCU berechnen und speichern.

Fazit

Auch wenn der Rechercheaufwand groß war, hat die Umsetzung großen Spass gemacht und war nach dem Verstehen der Grundthemen tatsächlich einfach. Mittlerweile läuft der erste Sensor erfolgreich und seit vielen Wochen wartungsfrei und liefert zuverlässig interessante Ergebnisse. Ich habe den Sensor wie vom Hersteller empfohlen ca. 10 Zentimeter tief unter dem Rasen eingegraben, um die Werte nah an den Wurzeln zu messen. Ich protokolliere hierzu Temperatur und Feuchtigkeit ebenso wie gefallene Regenmenge mit InfluxDB und visualisiere mit Grafana. Dabei ist es interessant zu sehen, wie lange es dauert, bis eine bestimmte Regenmenge in den Boden eindringt. Bevor ich im nächsten Sommer hierüber die Bewässerung steuere, werde ich noch eine Menge Daten auswerten und Rückschlüsse auf den Wasserbedarf ziehen.