Zum Inhalt

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

>> Go to the English version of this post

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 7 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;

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.

TL - 136 Flüssigkeitsstandsender Wasser Ölstandsensor Detektor 24VDC 420mA Signalausgang(0-2m), SenderTL – 136 Flüssigkeitsstandsender Wasser Ölstandsensor Detektor 24VDC 420mA Signalausgang(0-2m), Sender

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.

Update 2023 – zuverlässiger und genauer messen

Wie letztes Jahr angekündigt, habe ich den Wasserstandsensor optimiert. Das Problem beim ursprünglichen Projekt war der schlechte ADC des ESP8266, der sehr stark rauscht. Zudem war die Schaltung mit dem einfachen Messwiderstand nicht besonders sicher, was auch hier in den Kommentaren richtigerweise angemerkt wurde. Wegen der Wintersaison und anderen Projekten, hat es mit dem Update etwas länger gedauert, als geplant.

Wie bereits beschrieben, habe ich nun einen ADS1115 4-fach ADC im Einsatz. Man benötigt nur einen der 4 Kanäle des ADS1115, hat also noch 3 ADC für andere Aufgaben übrig.

Nach einigen Tests habe ich mich auch für den günstigen Stromwandler / Messwertumformer entschieden. Dieses kleine Modul hat nicht nur den Vorteil, dass der Eingang des ADS1115 nie mehr als 3,3 Volt sieht. Dazu entfernt man alle Jumper auf dem Modul. Außerdem kann man den Nullpunkt (Sensor nicht eingetaucht) und die maximale Ausgangsspannung einstellen. So lässt sich der Messbereich maximieren, auch wenn man etwa bei einem 0-1 Meter Sensor nur bis maximal 70 cm messen muss. Ich habe die Klemmen ausgelötet, damit ich das Modul auf meine Streifenrasterplatine löten kann.

Vereinfachter Schaltplan der neuen Version mit ADS1115 (zum Vergrößern anklicken!)

Nach einem Hinweis in den Kommentaren musste ich mein Wissen über 4-20 mA Stromschleifen wieder auffrischen (das ist dann doch schon knapp 30 Jahre her und ich hatte das nicht mehr parat): Diese Stromschleifen sind sehr robust gegen Störungen und können 100 m und mehr lang sein. So kann man den TL136 Sensor bis ins Haus verlängern, wo die zugehörige Elektronik im Warmen und Trockenen montiert ist

Die Beschaltung ist denkbar einfach. Der ADS1115 wird per I2C-Bus an den Wemos angebunden, der Ausgang des Messwertumformers kommt an einen Eingang (bei mir ADC0) des ADS1115.

TL136 Wasserstandssensor

Erste Tests und Messreihe mit der neuen Elektronik

Mit dem im Schaltplan “Zero” bezeichneten Trimmer, stellt man die Ausgangsspannung des Moduls (grünes Kabel im Plan) auf nahe 0 Volt ein, wenn der Sensor nicht eingetaucht ist. Nun taucht man den TL136-Sensor bis zur maximalen Tiefe bei maximalem Füllstand ein und stellt mit dem “Span” Trimmer die Spannung am Ausgang (grünes Kabel im Plan) auf knapp 3,3 Volt ein. Damit hat man den möglichen Messbereich optimal ausgenutzt und erhält somit die maximale Auflösung.

Ich habe wieder eine Messreihe mit 10 cm Schritten gemacht und die entsprechenden Spannungen notiert. Daraus wird, wie vorher auch, erst die Füllhöhe in Zentimetern errechnet und von dieser wieder die Füllmenge nach dem vorliegenden Fülldiagramm des Herstellers.

Dank des Messwertumformers und des ADS1115 wird man mit einer sehr präzisen (wenngleich für die Anwendung schon übertriebenen Genauigkeit) und rauschfreien Messung belohnt. Das Restrauschen beträgt maximal 0,1 % und entspricht damit der Toleranz des TL136 Sensors.

Hier ein Vergleich der alten Methode mit der neuen, was wohl für sich spricht:

Stark hineingezoomt sieht man, dass die Abweichung nun nur noch +- 1mm beträgt:

Die übrigen ADC-Kanäle des ADS1115 kann man z. B. für einfache Bodenfeuchtesensoren etc. nutzen.

Da ohnehin noch GPIOs am Wemos frei waren, habe ich auch noch einen Eingang für 1-Wire-Sensoren vorgesehen. Mit den günstigen DS18B20 Temperatursensoren kann man z. B. die Bodentemperatur, Termperatur im Gerätehaus oder die Wassertemperatur der Zisterne erfassen. Mehrere dieser 1-Wire-Sensoren lassen sich parallel an einem Eingang betreiben.

Stückliste:

Der neue Code mit ADS1115 und 1-Wire (die 1-Wire-Beschaltung ist aber im Schaltplan nicht enthalten – das schafft ihr selbst, wenn ihr es benötigt 😉 !) sieht bei mir so aus:

esphome:
  name: zisterne
  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
  use_address: zisterne.local


  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Waterking Fallback Hotspot"
    password: !secret fallback_password

captive_portal:

# i2c Bus auf D1 und D2 konfigurieren
i2c:
  id: bus_a
  sda: D2
  scl: D1
  scan: True

# 1-Wire-Sensoren am Pin D4
dallas:
  - pin: D4

# ADC einrichten, ADDR-Pin ist auf VCC gelegt, daher Adresse 0x49
ads1115:
  - address: 0x49
    id: ads1115_49

# ADC Kanal A0 zur Messwerterfassung
sensor:
  - platform: ads1115
    multiplexer: 'A0_GND'
    gain: 4.096
    name: "Wasserstand Zisterne cm"
    id: levelraw
    update_interval: 2s
    unit_of_measurement: cm
    accuracy_decimals: 1
    icon: "mdi:car-coolant-level"
# Messwerte glätten:
    filters:
      - sliding_window_moving_average:
          window_size: 20
          send_every: 20
# Spannungen nach Messreihe in Füllhöhe umrechnen
      - calibrate_linear:
          - 0.0 -> 0.0
          - 0.3 -> 10
          - 0.69 -> 20
          - 1.0 -> 30
          - 1.35 -> 40
          - 1.75 -> 50
          - 2.03 -> 60
          - 2.42 -> 70
          - 2.7 -> 80
          - 3.1 -> 90

# Füllmenge nach Füllstandskurve berechnen

  - 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.5 -> 4980

    unit_of_measurement: l
    accuracy_decimals: 0

# 1-Wire Temperatursensor

  - platform: dallas
    address: 0xef0516905a21ff28
    name: "Zisterne Sens1"
    unit_of_measurement: °C
    accuracy_decimals: 1

Wer will, kann über den I2C-Bus oder die Wemos SPI-Bus Pins D5, D6 und D7 auch noch ein Display zur Anzeige des Wasserstands, der Temperatur etc. anbinden. Hier bieten sich ein LC-Display vom Typ 1602/HD44780 oder ein MAX7219 7-Segment-Display an. Letzteres habe ich auch in meiner Bewässerungssteuerung “Waterking” im Einsatz, die auch bereits den Wasserstand der Zisterne anzeigt.