Präzise und preiswert mit piezoelektrischen Drucksensoren

Wasserstand in Zisternen mit HomeAssistant, ESPHome und TL-136 Drucksensor messen

Wie erfasst man den Füllstand einer Zisterne oder eines Tanks mit wenig Aufwand und guter Genauigkeit? Ich habe eine Lösung mit ESPHome und einem TL-136 Drucksensor im Einsatz.

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.

5.000 Liter Regenwasserzisterne von Rewatec

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.

Tests mit kapazitiver Wasserstandsmessung

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.

TL-136 Sensor

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.

Schaltplan mit einem ESP8266 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.

Testaufbau mit einem wassergefüllten HT-Rohr und Multimeter

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.

Eintauchtiefe und Messwerte ermitteln

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.

[Update 2] Der A/D-Wandler des ESP8266 ist nicht für solche Messungen geeignet und arbeitet auch nicht linear. Das sagen auch die Datenblätter von Espressif. Darum habe ich jetzt einen ADS1115 AD-Wandler im Einsatz und damit ist das Rauschen weg. Allerdings muss ich die Werte neu erfassen und die Zisterne ist gerade voll. Ein Update dazu kommt demnächst.

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.

Wasserstandsensor Home Assistant
Die Schaltung auf Perfboard in einer Verteilerdose

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.

Füllstandskurve der Zisterne

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.

Füllstandsverlauf über 10 Tage mit Bewässerung und wenig Niederschlag

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.

Füllstand Zisterne Home Assistant
Füllstandsanstieg bei Regen

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.

Die zwei eingelassenen Regentonnen werden auch noch mit einem TL-136 versehen

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.

Füllstandsanzeige in Home Assistant

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.

7 Kommentare

  1. Vielen Dank für den Super Beitrag hier. Ich möchte das Projekt auch angehen hätte allerdings noch ein paar Fragen:

    1) Der Sensor arbeitet ja mit Druck der Wassersäule sprich er sollte am Grund der Zisterne befestigt werden.
    Doch was wenn sich am Grund nach 5 Jahren Schlamm dreck, Steine etc absetzen? Denkt ihr nicht dass dadurch das Messergebnis verfälscht wird (wenn kleine Steine drauf liegen?
    Oder habt ihr den Sensor nicht ganz am Grund befestigt?

    2) Wisst ihr wie lange das Kabel ist bei dem: TL-136 Drucksensor? Habe dazu nichts auf amazon gefunden. Oder ist das bei dem Sensor gar nicht mit dabei? Möchte nähmlich die Technik im Haus neben meiner Saugpumpe aufbauen von dort sind es ca. 7m zum Boden der Zisterne. Daher meine Frage reicht da das Spannungssignal oder brauch ich nochmal was dazwischen zur Verstärkung etc.? Wie habt ihr das gemacht – Wo ist eure Steuerung?

    3) Ich habe in der Vergangenheit oft den pi zero wh verwendet (u.a. aufgrund geringen stromverbrauchs) und möchte diesen hier einsetzen. Meint ihr das geht auch oder seht ihr hier größere Schwierigkeiten?

    Grüße und vielen Dank,
    Markus

    • Hallo Markus 🙂

      Noch ist unsere Zisterne ziemlich sauber. Steinchen etc. würden da nichts ausmachen, da der Wasserdruck deutlich überwiegt. Auch im flüssigen Schlamm wäre der Druck gleich (den Dichteunterschied kann man hier getrost vernachlässigen).

      Das Kabel ist 5 Meter lang und nicht nur ein Kabel! Darin befindet sich ein Röhrchen, das für den Differenzdruck zum Umgebungs-Luftdruck da ist. Das Leitungsende darf auch nicht verschlossen oder verstopft werden. So lange das aber über Wasser ist, kann man die eigentlichen Leitungen auch noch etwas verlängern. Hier sollte man aber auch nicht übertreiben, da ja nur mit geringen Strömen (< 20 mA) gearbeitet wird. Meine Steuerung ist in der Ventilbox für die Gartenbewässerung und diese befindet sich unmittelbar neben dem Zisternenschacht. Der Pi Zero sollte kein Problem darstellen. Die A/D-Wandler des Pi Zero sind ja auch deutlich besser als die des ESP. Die erzeugen bei mir das Rauschen auf dem Signal. Ich habe jetzt einen externen A/D-Wandler (ADS1115) im Testeinsatz und damit ist das Signal glatt. Außerdem teste ich noch den Transkonduktanzverstärker https://amzn.to/3sbT6LI

      Wenn du es nicht so ganz eilig hast, gibt es demnächst noch ein paar neue Erkenntnisse dazu zu lesen. Momentan ist aber ein andere Projekt wichtiger und die Saison ist ja auch vorbei – im Winter ist die Zisterne immer voll 😉

  2. Hi,

    erstmal vielen Dank für das Teilen deines Projektes. Hatte den Sensor auf Amazon gefunden und dachte mir schau ich mal ob den schon jemand in Home Assistant integriert hat. Gesucht gefunden.
    Alle Teile bestellt und die Tage das Ganze nachgebaut und seit heute im Einsatz. Ich bin gespannt wie es sich bewährt.
    Ich hatte vorher eine Variante mit Ultraschallsensoren am Arduino im Einsatz die sind aber schnell korrodiert und waren für den Einsatz nicht zu gebrauchen.

    Viele Grüße
    Sharlynsland

    • Das Rauschen bei den Messwerten kommt übrigens vom ESP8266 selbst. Die ADCs haben fürchterliche Eigenschaften und sind für Messungen nicht wirklich geeignet. Wenn du gleich bessere Messwerte möchtest, kannst du einen ADS1115 einsetzen https://amzn.to/3Bq0PLA
      Damit ist das Rauschen weg und es wird millimetergenau.

      Alternativ kann man auch einen Arduino Mini etc. als Schnittstellenerweiterung nehmen, denn selbst dessen ADC ist besser als der der ESPs, allerdings löst er nur mit 10 Bit und damit 1024 Stufen auf.

      Dazu gibt es bald auch ein Beitragsupdate.

  3. 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 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

WordPress Cookie Plugin von Real Cookie Banner