Bodenfeuchtemessung über weite Strecken mit LoRaWAN

Eine Bodenfeuchtemessung im Garten ist hilfreich, wenn man Pflanzen oder Rasen rechtzeitig und ausreichend bewässern möchte. Wenn man einen größeren Garten oder z.B. einen Schrebergarten hat, ist oft kein WLAN an allen Stellen verfügbar. Als Alternative bietet sich dann das Versenden der Sensordaten über LoRaWAN an. Die Vorteile habe ich bereits in meinem Beitrag LoRaWAN mit eigenem Gateway einrichten genannt.

ELV hat hierzu ein interessantes Produkt für einen überschaubaren Preis im Programm. Dazu braucht man das  LoRaWAN-Interfaces ELV-LW-INT1 und den  universellen Bodenfeuchtesensor SoMo1, I²C. Beide zusammen sind bei ELV für ca. 75 Euro zu erhalten.

Ich mit diesen Komponenten in einem größeren Garten die Bodenfeuchte und -temperatur gleichzeitig messen und halbstündlich an einen MQTT-Server übertragen. Ich habe dazu in der Nähe ein LoRaWAN-Gateway im TTN-Netz verfügbar.

Vor der Inbetriebnahme muss das System konfiguriert werden. Da die Konfiguration viele Möglichkeiten anbietet und für den Laien nicht trivial erscheint beschreibe ich, wie man den Sensor für diesen Zweck in Betrieb nehmen kann.

Installation der Hardware

Auch wenn die Platine als „Bausatz“ angeboten wird, sind keine Bestückungs- oder Lötarbeiten erforderlich. Das Interface besitzt neben 2 Mignon-Batterieslots vom Typ LR6 (AA) auch 2 Sensoranschlüsse mit UART- oder I²C-Schnittstelle. Obwohl insgesamt nur eine Spannungsversorgung über die Batterien (Akkus) von 3V zur Verfügung steht, können trotzdem 3,3 bzw. 5V an die Sensoren ausgegeben werden (über Transistoren). Dies ist wichtig, da die meisten Sensoren die etwas höhere Spannung für eine korrekte Messung benötigen. Die Platine besitzt keine externe Spannungsversorgung und kann daher nur durch Bestückung mit den 2 Mignonzellen in Betrieb genommen werden. Zur Befestigung liegen noch 2 Schrauben und eine Stiftleiste bei, über die ein Firmware-Update über einen USB-UART-Konverter UM2102N durchgeführt werden kann. Die richtige Firmware ist bereits installiert.

Der Feuchte- und Temperatursensor ist ebenfalls sofort einsatzbereit, kann Bodenfeuchte und -temperatur messen, besitzt einen AD/DA-Wandler und ist wasserdicht vergossen. Nach dem Einbau in eine Dose kann das Kabel des Sensors über die gekennzeichneten 4 Drähte an die Schnittstelle wie folgt angeschlossen werden:

  • (braun) an +UB2
  • (schwarz) an GND
  • (blau) an SDA
  • (weiß) an SCL

Weitere Detailinformationen finden sich z.B. in folgendem ELV-Journalartikel.

Wer kein LoRaWAN-Gateway in der nähe hat findet im Artikel LoRaWAN mit eigenem Gateway einrichten weitere Hinweise zum TTN-Netzwerk oder der Gateway-Einrichtung.

Ich empfehle, die Batterien erst wie im nächsten Kapitel beschrieben einzulegen.

Device und Applikation in TTN Netzwerk ergänzen

Nach dem Einloggen in das TTN-Netzwerk geht man auf den Reiter „Applications“. Als erstes erstelle ich eine Application und gebe hier einen aussagekräftigen Namen „Loris-Bodenfeuchte1“ ein.

Anschließend erstelle ich ein neues Device, indem ich auf „New Device“ klicke.

BeiEnd device type“ kann man das Device direkt im Repository suchen (Option 1). Dazu wählt man ELV aus und findet dann schon das LoRaWAN Interface 1. Als Frequency Plan wird SF9 gewählt und nach Eingabe der JoinEUI (liegt dem Interface als kleiner Aufkleber bei) kann man auf Confirm tippen. Danach werden noch die DevEUI und der AppKey ergänzt. Die End-Device ID wird automatisch generiert und man kann nun „Register end device“ drücken.

Nach dem Einlegen der Batterien oder Akkus blinkt das Board kurz rot/gelb und wechselt dann auf grün.

Jetzt kann man unter „Live data“ beobachten, wie das Gerät Kontakt zum Netzwerk aufnimmt und Nutzdaten sendet. Zum Dekodieren der Daten benötigt man einen Payload Parser (ein kleiner Codeblock, der die vom Gerät empfangenen hexadezimalen Bytewerte übersetzt). Wenn man das Gerät wie beschrieben aus dem Repository ausgewählt hat, wird der Payload-Parser automatisch mitgeliefert. Dieser befindet sich unter dem Device im Reiter "Payload Formatter" "Uplink". Hier sollte "Use device Repository formatters" stehen und darunter der von eQ3 bereitgestellte Code sichtbar sein.

Alternativ kann man diesen Code auch auf der ELV-Seite unter Downloads unter dem Link „ELV-LW-INT1 Payload-Parser“ herunterladen.

Sensor konfigurieren

Wer die Installation bis hierhin erfolgreich durchgeführt hat, wird feststellen, dass nur Statusdaten der Schnittstelle gesendet werden, aber keine Sensorwerte für Bodenfeuchte und Temperatur. Dies liegt daran, dass die Messung und Übertragung der Werte von den Sensoren erst aktiviert werden muss. Das Interface hingegen ist so vorkonfiguriert, dass es alle 30 Minuten eine Statusmeldung sendet.

Grundlagen zur Sensorkonfiguration

Die Befehle und Grundlagen für die Konfiguration der Sensoren und des Interfaces findet man in folgenden Dokumenten:

Grundsätzlich tauscht man Informationen mit dem Interface und den Sensoren über eine Payload (eine Bytefolge von hexadezimalen Werten) aus. Befehle werden als Payload über einen Downlink-Kanal an ein Gerät gesendet, Daten werden über einen Uplink-Kanal empfangen. Kommandos werden als "frame-type" bezeichnet. In einem "frame-type" werden Daten wie z.B. Kanal und Parameter übertragen.

Für die zu übertragenden Codes (Bytes) müssen Werte berechnet werden, wobei teilweise zwischen dezimalen, hexadezimalen und binären Zahlenformaten gewechselt wird. ELV empfiehlt hierfür den folgenden einfachen Konverter.

In den folgenden Kapiteln werden einzelne Werte auch durch das Setzen von Bits ermittelt. Dabei gilt, dass die Bits in einem Byte von 0 bis 7 gezählt werden und rechts begonnen wird!

Sensoren über Kanäle ansprechen

Um die Sensoren und das Interface eindeutig anzusprechen benötigt man die Angabe einer Kanalnummer. Das Interface besitzt eine eigene Kanalnummer und neben dem gemeinsam verbauten Bodenfeuchte- und Temperatursensor wird auch ein Ultraschall-Disstanzsensor DUS1 unterstützt.

Folgende Kanalnummern stehen zur Verfügung:

Gerätename Kanal (Hex-Wert) Erläuterung
Interface (device) 0x00 Dies ist das ELV-LW-INT1 Device
DUS1 0x01 Dies ist der ELV-Ultraschall Distanzsensor DUS1 (wenn er angeschlossen sein sollte)
SoMo1-H 0x02 Das ist der Feuchtessensor des SoMo1, I²C
SoMo1-T 0x03 Das ist der Temperatursensor des SoMo1, I²C

Anzeige von Statusdaten

Theoretisch kann jeder Sensor eigene Statusdaten senden. Standardmäßig sendet das Interface jede halbe Stunde eine Statusnachricht und zusätzlich kann ich mir die Statusinformation des Feuchtesensors und des Temperatursensors jeweils in einem eigenen Zeitintervall senden lassen. Ich möchte aber insbesondere die Feuchte- und Temperaturinformationen immer zusammen erhalten und am liebsten noch zusammen mit den Statusinformationen des Interfaces (also insgesamt nur eine Nachricht mit allen Informationen jede halbe Stunde).

Dies kann ich erreichen, indem ich Statusgruppen verwende, in denen ich die Statusinformationen zusammenfasse und diese zusammengefassten Statusinformationen dann in eine Statusmeldung einfüge. In meinem Fall werden die Statusinformationen des Feuchtesensors und des Temperatursensors der Statusgruppe 1 zugeordnet. Ich werde für diese Sensoren nicht separat das Übermitteln von Statusinformationen aktivieren sondern werden das Interface so konfigurieren, dass es bei seiner halbstündlichen Statusinformation einfach die Gruppe 1 inkludieren soll. Damit wird die Statusmeldung auch die Informationen der Sensoren beinhalten.

Befehl zur Konfiguration der Sensoren

Zur Konfiguration verwende ich den "set single parameters" Befehl, dem ich beliebig viele Parameter übergeben kann. Mit diesem Befehl werden alle Parameteränderungen beginnen.

Bytewert Kommentar
0x00 frame type 00 ("set single parameters" = Einzelne Parameter setzen)
0x02 Channel 2 (z.B. Kanal 2 für Feuchtesensor)

Feuchtesensor konfigurieren

Hierfür gelten folgende Punkte:

  • Messungen müssen aktiviert werden, sonst kann der Feuchtesensor keine Daten senden.
  • Man kann gleichzeitig auch das Messen der Temperatur aktivieren, so dass beide Werte synchron ermittelt werden!
  • Der Bodenfeuchtesensor liefert immer sogenannte Rohwerte im Bereich von 3000 bis 4000 zurück. Diese kann man selber in Prozentwerte umrechnen oder vom Sensor direkt umrechnen lassen. Dazu ist das Ablesen der Sensorwerte im trockenen Zustand sowie in nassem Zustand erforderlich. Die beiden Rohwerte werden dann dem Sensor als Untegrenze für 0% und Obergrenze für 100% mitgeteilt.

Mit folgender Bytefolge konfiguriere ich den Feuchtesensor:

Bytewert Kommentar
0x00 frame type 00 ("set single parameters" = Einzelne Parameter setzen)
0x02 Kanal 2 (für den Feuchtesensor)
0x03 "measurment interval"-Parameter (zum Einstellen des zeitlichen Abstandes der Messungen)
0x94 20 Minuten (Um diesen Parameter auf Minuten einzustellen wird Bit 7 gesetzt. Mit den restlichen Bits werden die Minuten angegeben, in meinem Fall setze ich Bit 2 (Dezimalzahl 4) und Bit 4 (Dezimalzahl 16), was insgesamt 10010100 ergibt. Dies ergibt umgerechnet in Hexadezimal die Zahl 0x94.
0x02 "filter config"-Parameter (hierüber lässt sich die Temperaturmessung gleichzeitig mit der Feuchtemessung aktivieren, ohne den Temperatursensor separat konfigurieren zu müssen)
0xC0 Parameterwert:

Bit 7 wird gesetzt (Aktivieren der gleichzeitigen Temperaturmessung)

Bit 6 wird gesetzt (zur Kompensation eines möglichen Fehlers durch die Temperatur)

Dies ergibt die Binärzahl 11000000, die Hexadzeimalzahl 0xC0 ergibt.

0x01 "Statusmode"-Parameter (mit diesem werden festgelegt, ob der Status zyklisch übertragen wird und welche Statusgruppenanzeige und -zugehörigkeit für dieses Gerät gilt)
0x81 Parameterwert:

Bit 7 setzen ("cyclic interval" = fixes unabhängiges Intervall zur Statussendung (ich verwende hier immer die Voreinstellung))

Bit 0 setzen ("member group 1" = Statuswerte zur Statusgruppe 1 hinzufügen)

Dies ergibt die Binärzahl 10000001, was der Hexadzeimalzahl 0x81 entspricht.

0x0B "ref value %0"-Parameter (gibt an, welcher raw-Wert als 0% Bodenfeuchte angesehen wird).
0x0EC5 Parameterwert:

Gemessener Raw-Wert bei Trockenheit; Dieser wird hier in Form von 2 Bytes angegeben, da er i.d.R. zwischen 3500 und 4000 liegt. Es wird empfohlen, dieses vorab durch Tests zu messen, z.B.  in Becher mit staubtrockener Erde. In meinem Beispiel liegt der Wert bei 3781, was Hexadezimal 0x0D1B ergibt

0x0C "ref value %100"-Parameter (gibt an, welcher raw-Wert als 100% Bodenfeuchte angesehen wird).
0x0D1B Parameterwert:

Gemessener Raw-Wert bei totaler Feuchtigkeit; Dieser wird hier in Form von 2 Bytes angegeben, da er i.d.R. zwischen 3000 und 3500 liegt. Es wird empfohlen, dieses vorab durch Tests zu messen, z.B.  in Becher mit ganz nasser Erde. In meinem Beispiel liegt der Wert bei 3355, was Hexadezimal 0x0D1B ergibt

Temperaturmessung konfigurieren

Hierfür gelten folgende Punkte:

  • Die Temperaturmessung wurde bereits über die Bodenfeuchtemessung aktiviert, so dass die Messzyklen für die Feuchtemessung automatisch gelten. Weitere Einstellungen zur Messwerterfassung sind bei diesem Ansatz nicht erforderlich.

Mit folgender Bytefolge konfiguriere ich den Temperatursensor:

Bytewert Kommentar
0x00 frame type 00 ("set single parameters" = Einzelne Parameter setzen)
0x03 Kanal 3 (für den Temperatursensor)
0x01 "Statusmode"-Parameter (mit diesem werden festgelegt, ob der Status zyklisch übertragen wird und welche Statusgruppenanzeige und -zugehörigkeit für dieses Gerät gilt)
0x81 Parameterwert:

Bit 7 setzen ("cyclic interval" = fixes unabhängiges Intervall zur Statussendung (ich verwende hier immer die Voreinstellung))

Bit 0 setzen ("member group 1" = Statuswerte zur Statusgruppe 1 hinzufügen)

Dies ergibt die Binärzahl 10000001, die Hexadzeimalzahl 0x81 ergibt.

Interface konfigurieren

Hierfür gelten die folgenden Punkte:

  • Standardmäßig sendet das Interface alle 30 Minuten eine Statusmeldung, so dass dies nicht gesondert eingestellt werden muss.
  • Zusätzlich zu den eigenen Statusinformation sollen die Statusinformation des Feuchte- und Temperatursensors übermittelt werden.

Mit folgender Bytefolge konfiguriere ich das Interface:

Bytewert Kommentar
0x00 frame type 00 ("set single parameters" = Einzelne Parameter setzen)
0x00 Kanal 0 (für das Interface "SoMo-1 Device")
0x01 "Statusmode"-Parameter (mit diesem werden festgelegt, ob der Status zyklisch übertragen wird und welche Statusgruppenanzeige und -zugehörigkeit für dieses Gerät gilt)
0x88 Parameterwert:

Bit 7 setzen (fixes unabhängiges Intervall zur Statussendung);

Bit 3 setzen ("include group 1" = zeige Gruppe 1 zusätzlich zu den Statusinformationen des devices an)

Dies ergibt die Binärzahl 10001000, die Hexadzeimalzahl 0x88 ergibt.

Konfigurationsänderung an das Gerät schicken

Dazu geht man im TTN-Webinterface unter "End devices" auf das SoMo1-INT1 Gert, wählt den Reiter "Messaging" und dort den Reiter "Downlink". Als "FPort" muss nun "10" eingestellt werden. Danach kann man die in den vorherigen Kapiteln erstellten drei Bytefolgen (Payload) jeweils in das Payload-Feld eintragen (bitte  ohne das führende 0x) und anschließend den Button "Schedule downlink" drücken. Das Kommando wird beim nächsten Verbindungsaufbau zum Gerät gesendet (durch kurzes Drücken des Buttons an der Schnittstelle kann die Zeit verkürzt werden).

Unter "Live data" kann man nun die Übertragung der Befehle beobachten. Wenn dort die "decode downlink data message" Meldung „No decoder defined for codec elv-lw-int1-codec“ erscheint, kann man diese ignorieren. Es gibt aktuell keinen Payload-Decoder, der in der Lage ist, die gesendete Bytefolge wieder in Klartext umzuwandeln.

Es kann einige Zeit dauern, bis die Einstellungen vorgenommen sind, da normalerweise die eingestellten Sendeintervalle abgewartet werden müssen (in diesem Beispiel bis zu 1 Stunde).

Um die Daten an einen MQTT-Server zu schicken verweise ich auf die Erläuterungen in folgendem Beitrag Füllstandsmessung mit LoRaWAN.

Wenn dann eine Statusinformation gesendet wird, sollte das Ergebnis wie folgt aussehen:

Die Daten können dann z.B. in Node-Red weiterverarbeitet und zur Steuerung von Bewässerungssensoren verwendet werden.

HINWEIS: Die Bodentemperatur wird als Zeichenkette (String) geliefert und nicht wie der Feuchtewert als Zahl (float-Typ). Vor der Speicherung in einer Datenbank sollte der Wert daher vorher umgewandelt werden, damit man ihn grafisch darstellen kann.

Optionale weitere Befehle

In der folgenden Tabelle sind einige weitere Befehle zur Konfiguration der Sensoren aufgelistet:

Payload Erläuterung
00 02 00 00 Statusmeldungen des Bodenfeuchtesensors ausschalten
00 03 00 00 Statusmeldungen des Temperatursensors ausschalten
00 02 01 05 Statusmeldungen des Bodenfeuchtesensors alle 5 Minuten schicken
00 03 01 0F Statusmeldungen des Temperatursensors alle 15 Minuten schicken