Bodenfeuchtemessung über weite Strecken mit LoRaWAN

Eine Bodenfeuchtemessung im Garten ist , wenn man Pflanzen oder Rasen rechtzeitig und ausreichend möchte. man einen größeren Garten oder z.B. einen Schrebergarten ist kein WLAN an allen Stellen . Als Alternative bietet sich Die Vorteile habe ich bereits in meinem Beitrag Sensordaten .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.
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
Der Feuchte- und Temperatursensor ist ebenfalls sofort , 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 an die Schnittstelle wie folgt angeschlossen werden:
- (braun) an +UB2
- (schwarz) an GND
- (blau) an SDA
- (weiß) an SCL
Weitere folgendem inELV-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
eine Application und gebe hier einen aussagekräftigen Namen „Loris-Bodenfeuchte1“ ein.
Anschließend ich ein neues Device auf „New Device“ .
„ device type“ kann man das direkt im Repository (Option 1 wählt man ELV aus und findet schon das LoRaWAN Interface 1. Als Frequency Plan wird SF9 gewählt und nach Eingabe der JoinEUI ( Interface als kleiner Aufkleber ) kann man auf Confirm tippen. noch die DevEUI AppKey . Die End-Device ID wird automatisch und kann „Register end device“ drücken.
Nach dem Einlegen der Batterien oder Akkus blinkt rot/ auf grün.
kann man unter „Live data“ beobachten wie das Gerät Kontakt und sendet. Zum Dekodieren der Daten benötigt man einen (ein kleiner Codeblock, der die vom Gerät ). das Gerät wie beschrieben aus dem Repository ausgewählt , Payload-Parser mitgeliefert. unter Device im Reiter "Payload Formatter" "Uplink". Hier sollte "Use device Repository formatters" stehen und darunter der von eQ3 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
Dies liegt daran, dass und Sensoren erst aktiviert werden muss. Das Interface hingegen ist so vorkonfiguriert, dass es alle 30 Minuten eine .
Grundlagen zur Sensorkonfiguration
Die Befehle und Grundlagen für die Konfiguration der Sensoren und des Interfaces findet man in folgenden Dokumenten:
- Excel-Tabelle auf zum Interface mit allen Details zu Befehlen, Parametern, etc.
- Bau- und Bedienungsanleitung des Interfaces
- ELV-Journal 2/2024 unter Bausätze
Grundsätzlich tauscht man Informationen mit und den Sensoren über Payload (eine Bytefolge von hexadezimalen Werten Befehle als Payload über einen Downlink-Kanal an ein Gerät , Daten über einen Uplink-Kanal . werden als "frame-type" bezeichnet. In einem "frame-type" werden Daten wie z.B. Kanal und Parameter .
Für die zu Codes (Bytes) Werte , zwischen , und . ELV empfiehlt hierfür den folgenden einfachen Konverter.
In den folgenden Kapiteln werden einzelne Werte durch das Setzen von Bits ermittelt. Dabei gilt die Bits in einem Byte von 0 bis 7 werden und rechts !
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
das Interface jede halbe Stunde eine und zusätzlich kann ich mir in einem eigenen Zeitintervall lassen. Ich möchte aber die Feuchte- und immer zusammen erhalten und am liebsten noch zusammen mit des Interfaces (also insgesamt nur eine Nachricht mit allen Informationen jede halbe Stunde).
Dies kann erreichen indem ich Statusgruppen verwende, in denen ich Statusinformationen und diese Statusinformationen Statusmeldung . In meinem Fall werden die 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. des und des Temperatursensors Statusgruppe 1 zugeordnet.
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 der Feuchtesensor keine Daten .
- 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:
- 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:
- 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
Als "FPort" muss nun "10" eingestellt werden. kann man die in den Kapiteln erstellten drei Bytefolgen (Payload) jeweils in das Payload-Feld eintragen ( ohne das führende 0x) und anschließend den Button "Schedule downlink" . wird beim nächsten Verbindungsaufbau Gerät ( kann die Zeit ).
Unter "Live data" kann man nun die der Befehle . Wenn dort die "decode downlink data message" Meldung „No decoder defined for codec elv-lw-int1-codec“ kann man ignorieren. gibt aktuell keinen Payload-Decoder, der Bytefolge wieder in Klartext .
Es kann dauern, bis die Einstellungen vorgenommen , 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.
eine Statusinformation gesendet , 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 |
Hinterlasse einen Kommentar