
Wasserstand in Zisternen mit HomeAssistant, ESPHome und TL-136 Drucksensor messen
Regenwasser ist mittlerweile ein kostbares Gut. Im letzten Jahr haben wir eine 5.000 Liter Regenwasserzisterne von Rewatec bekommen. So etwas extra und nachträglich nur wegen des Regenwassers einbauen zu lassen, dürfte sich eher selten lohnen, da Aufwand und Kosten beträchtlich sind.
Beim Umbau unserer Terrasse stellten wir jedoch fest, dass die Ableitungen unserer Regenrinnen marode waren und der Bagger war ohnehin schon da, sodass die Zisterne mit geringem Aufwand umsetzbar war. In sie fließen nun die Niederschläge, die auf die 75 qm Südseite des Dachs fallen – sofern es überhaupt regnet …
Aus der Zisterne speisen wir unsere Gardena Sprinkler, die durch eine Renkforce Tauchpumpe (welche schon seit 5 Jahren ihren Dienst verrichtet) versorgt werden. Man will natürlich wissen, wie viel Wasser in der Zisterne ist, um danach die Bewässerung steuern zu können. Zudem benötigt die Tauchpumpe mindestens 8 cm Füllstand, damit sie nicht trocken läuft.
DIY-Lösungen meist unzuverlässig
Für die Wasserstandsmessung gibt es einige DIY-Ansätze, die aber oft eher schlecht als recht funktionieren. Ultraschallsensoren, die auf die Wasseroberfläche gerichtet sind, leiden nicht nur unter der feuchten Umgebung und fallen dann aus, sondern messen durch Reflexionen oft nicht korrekt. Gleiches gilt für optische TOF (Time of Flight) Sensoren. Kapazitive Fühler messen eher ungenau, da Verunreinigungen die Dielektrizitätskonstante des Wassers verändern. Ich habe damit auch experimentiert, bin aber schnell wieder davon abgekommen.

Kaskaden mit Reed-Relais und Widerständen und einem Schwimmer mit Magnet funktionieren gut und sind robust, lösen aber nur sehr grob auf. Für eine Zisterne, die ein Maximallevel von 1,05 Metern erreichen kann, ist das eher unbefriedigend.
Schwimmer mit Umlenkrollen und Seil an einem Potenziometer sind zu abenteuerlich.
Sehr genau sind hingegen Drucksensoren. Kleine Drucksensoren, wie sie in Blutdruckmessgeräten eingebaut sind, wären für die Anwendung ausreichend und sind recht preiswert. Allerdings berücksichtigt man damit nicht den veränderlichen Luftdruck, der auf die Wassersäule wirkt und man erhält keine genauen Messwerte, zudem verstopft der Schlauch zum Sensor gerne.
TL-136 Drucksensor als Lösung
Nicht ganz so preiswert, dafür aber robust und genau, sind piezoelektrische Drucksensoren, den TL-136 Flüssigkeitsstand-Messumformer. Diese haben in der Zuleitung auch ein kleines Rohr, das den Außendruck in die Messung in die Messung einfließen lässt. Diese Sensoren sind für verschiedene Füllhöhen für ungefähr 50 Euro erhältlich. Dafür erhält man ein massives Edelstahlgehäuse samt recht einfacher Ansteuerung. Der Sensor wird einfach auf den Grund der Zisterne oder des Tanks gelegt. Ich habe das 0-1 Meter Modell gewählt, da bei meiner Zisterne der Überlauf bereits bei 105 cm ist. Auch für die beliebten IBC-Container dürfte das 0-1 Meter Modell geeignet sein, lässt man diese ja nicht bis auf den letzten Zentimeter volllaufen.
Der Sensor wird mit 24 Volt versorgt und wandelt den Druck im Bereich 0-20 mA um. Daher muss man den Strom messen, um daraus Füllhöhe und später die Füllmenge zu berechnen. Es gibt günstige kleine Module, mit Transkonduktanzwandler, also der Umwandlung eines Stroms in eine Spannung. Man kann aber auch einfach einen Widerstand nehmen, an dem die abgefallene Spannung abgreift.
Mit einem 150 Ohm Widerstand kann man den Bereich bis 100 cm so abgreifen, dass daraus eine Spannung mit maximal 3,2 Volt wird – ideal für den ADC eines ESP8266 oder ESP32. Mit einem 27 kOhm Widerstand in Reihe zum Analogeingang des ESP, hat man einen zusätzlichen Schutz, da dieser maximal 3,3 Volt verträgt. Ich nutze noch immer sehr gerne die praktischen und preiswerten WeMos D1 Mini.

Für die 24 Volt des Sensors muss man auch nicht ein zusätzliches Netzteil bemühen. Ein Stepup-Konverter tut es hier auch und kann die 24 V aus dem 5 Volt Pin des ESP erzeugen. Den Step-Up-Konverter stellt man VOR dem Einbau auf die erforderlichen 24 V Ausgangsspannung ein.
Um herauszufinden, welche Spannung bei welchem Füllstand ausgegeben wird, habe ich ein 100 mm HT-Rohr mit einem Stopfen verstehen, mit Wasser befüllt, den Sensor unterschiedlich tief eingetaucht und die Spannung gemessen. Der hydrostatische Druck ist in einem solchen Rohr in gleicher Tiefe ebenso groß, wie in einer 5.000 Liter Zisterne.

Der ESPHome Code für die Wasserstandsmessung
Der Code für den ESPHome Sensor ist ziemlich selbsterklärend. Es wird der A0 Pin, also der Analog-Digital-Wandler ausgelesen. Beim ESP8266 wird hier übrigens nicht 0 – 3,3 Volt ausgegeben, sondern 0 – 1 V. Darum habe ich einen Filter mit – multiply: 3.3 eingebaut. Die id: levelraw ermöglicht, dass ich später auf den Füllstand in Zentimetern noch einmal in einer anderen Funktion zugreifen kann.
esphome:
name: waterking
platform: ESP8266
board: d1_mini
# Enable logging
logger:
baud_rate: 0
# Enable Home Assistant API
api:
ota:
password: !secret ota password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Waterking Fallback Hotspot"
password: !secret fallback password
captive_portal:
sensor:
- platform: adc
pin: A0
name: "Wasserstandcm"
id: levelraw
update_interval: 2s
filters:
- multiply: 3.3
- sliding_window_moving_average:
window_size: 30
send_every: 30
- calibrate_linear:
- 0.61 -> 0.0
- 0.76 -> 0.075
- 0.8 -> 0.09
- 0.81 -> 0.1
- 0.8411 -> 0.12
- 0.99 -> 0.172
- 1.04 -> 0.22
- 1.2 -> 0.25
- 1.8 -> 0.5
- 2.4 -> 0.75
- 2.66 -> 0.9
- 2.983 -> 1.0
- 3.2 -> 1.19
- multiply: 100
accuracy_decimals: 1
unit_of_measurement: cm
icon: "mdi:car-coolant-level"
- platform: adc
pin: A0
name: "Zisterne Volt"
update_interval: 5s
filters:
- multiply: 3.3
- median:
window_size: 7
send_every: 4
send_first_at: 3
- platform: template
name: "Zisterne Liter"
lambda: |-
return id(levelraw).state;
filters:
- calibrate_linear:
- 4 -> 80
- 10 -> 200
- 12.5 -> 300
- 15 -> 400
- 17.5 -> 500
- 20 -> 600
- 25 -> 850
- 27.5 -> 1000
- 40 -> 1700
- 45 -> 2000
- 60 -> 3000
- 70 -> 3600
- 80 -> 4000
- 85 -> 4400
- 90 -> 4700
- 95 -> 4900
- 100 -> 5100
unit_of_measurement: l
accuracy_decimals: 0
- platform: template
name: "Idraw"
lambda: |-
return id(levelraw).state;
Code-Sprache: YAML (yaml)
Der Median glättet die Werte, da das Signal etwas rauscht. Warum habe ich noch nicht herausgefunden. Die Spannungsversorung des Step-Up-Wandlers ist stabil. Allerdings bewegt sich das Rauschen im Bereich von 0,5 cm Füllhöhe, was vernachlässigbar ist. Die Genauigkeit des Sensors selbst ist mit 0,2 – 0,5 % FS angegeben. Bei einer Füllhöhe von 0 – 1 Meter sind die 0,5 cm Rauschen genau 0,5 % …
[Update] Ein 1 uF Kondensator zwischen Masse und A0 schafft etwas Abhillfe gegen das Rauschen und ist im Schaltplan berücksichtigt.
Der calibrate_linear Filter wandelt die Spannung in die tatsächliche Füllhöhe um, denn der Sensor arbeitet nicht völlig linear. Ich habe die ersten Werte mit meinem Testaufbau ermittelt und korrigiere nun nach und nach mit den Werten aus der Zisterne. Der – multiply: 100 Filter sorgt dafür, dass die Ausgabe in Zentimetern erfolgt.
Ich frage den ADC dann ein weiteres Mal ab, um eine Ausgabe in Volt zu erhalten, mit der ich nach und nach den Linear-Filter mit den echten Füllständen korrigieren kann.
Die zweite Funktion startet mit – platform: template
Hier hole ich mir mit return id(levelraw).state; den Wert in Zentimetern, um ihn dann mit einem weiteren – calibrate_linear Filter auf den Füllstand in Litern umzurechnen.
Füllhöhe mit Füllstandskurve in Volumen umrechnen
Meine Rewatec-Zisterne hat ja eine recht komplexe Form, sodass die Füllstände in Litern über die Füllhöhe nicht linear sind. Rewatec schickte mir auf Anfrage eine Füllstandskurve. Damit lässt sich der Füllstand in Abhängigkeit der Füllhöhe umrechnen. Wie zuvor erwähnt: Bei 5.000 Litern ist es egal, ob da 20 Liter mehr oder weniger angezeigt werden. Der Rest ist nur eine Hilfsfunktion, die man weglassen kann.

Momentan ist es auch bei uns sehr trocken, sodass sich der Wasserstand in der Zisterne auf einem sehr niedrigen Level von 10 – 25 Zentimetern und damit 150 – 1000 Litern bewegt.
Man sieht jedoch wunderbar Zu- und Abflüsse und kann damit auch feststellen, wie viel Liter etwa 5 Minuten Rasenbewässerung sind. In unserem Fall kommen wir auf etwa 150 Liter pro Bewässerung. Ebenso erkennt man Regenfälle und damit den recht schnellen Anstieg des Levels ausgezeichnet.

Da wir auch noch zwei eingelassene und verbundene Regentonnen mit jeweils 1.500 Litern haben, werde ich hier demnächst auch noch einen Sensor einbauen.
Insgesamt ist die Lösung mit den TL-136 Flüssigkeitsstand-Messumformer eine einfache und hinreichend genaue Lösung für die Messung von Füllständen. Die Sensoren sind robust und einfach anzusteuern. Mit den Linear-Filtern der ESPHome-Plattform lassen sie sich einfach korrigieren, sodass eine Genauigkeit im Bereich von 1 % möglich ist. Für die Anwendung in Regenwassertonnen und Zisternen ist das mehr als ausreichend.

Mit den gewonnenen Werten kann man die Bewässerungsdauer dynamisch steuern, also etwa die Bewässerungszeit verkürzen, wenn nur noch wenig Wasser in der Zisterne ist.
Die mit Sternchen (*) gekennzeichneten Verweise sind sogenannte Provision-Links. Wenn du auf so einen Verweislink klickst und über diesen Link einkaufst, bekomme ich von deinem Einkauf eine Provision. Für dich verändert sich der Preis nicht und du unterstützt damit meine Arbeit. Preisänderungen und Irrtümer vorbehalten.
Hallo.
Nachdem ich mit den gleichen Herausforderungen und Enttäuschungen zu kämpfen hatte, bin ich am Ende auf die gleiche Lösung (allerdings mit ESPEasy am Wemos) wie du gelangt. Ich kann nur bestätigen, dass der Drucksensor nicht nur genauer arbeitet, sondern auch viel langlebiger ist, als alles andere das ich davor probiert habe (so wie du).
Mein Drucksensor liefert jetzt schon seit April letzten Jahres zuverlässig seine Daten. Und: sie stimmen auch ;-). Bei den vorherigen Versuchen war das nicht immer so sicher.
Ich verwende die Messung für den Wasserstand in meinem Brunnen. Der Brunnen ist 4 Meter tief und ich habe den Drucksensor für 5 Meter in Verwendung. Eingelernt habe ich die Werte auf 2 Meter in einem Rohr, und bis auf kleine Abweichungen stimmt das Ergebnis auch, wenn der Brunnen annähernd voll ist.
Fazit: Perfekte Lösung, kann ich nur empfehlen. Auch wenn der Drucksensor einmal mehr kostet, gleicht das die Zufriedenheit mit dem Projekt absolut aus 🙂
So isses! Basteln ist zwar schön, am Ende soll es aber auch zuverlässig funktionieren.
Freut mich, dass du die gleichen guten Erfahrungen damit machen konntest!