Projekt: Füllstand Regenwassertank in openHAB anzeigen

Seit Anfang der 90er Jahre nutze ich einen Regenwassertank mit 3.500 Litern Fassungsvermögen für die Gartenbewässerung. Der sehr trockene Sommer 2026 zeigt, dass auch dieses kostbare Nass nicht unbegrenzt zur Verfügung steht. An den Regenwassertank ist ein Hauswasserwerk angeschlossen. Ist der Tank leer, besteht die Gefahr, dass die Pumpe leer läuft. In diesem Projekt soll ein Raspberry Pi Pico W mit einem Ultraschallsensor genutzt werden, um den Füllungsgrad des Regenwassertanks zu bestimmen. Der Wert soll regelmäßig über MQTT übermittelt und in openHAB eingebunden werden

Was wird benötigt?


Grundlagen zum Raspberry Pi Pico W sind hier beschrieben.

Der Ultraschallsensor HC-SR04:

Ultraschallsensor HC-SR04


Verdrahtung


Pico W und Ultraschallsensor HC-SR04 Verdrahtung

Der Ultraschallsensor benötigt eine 5 Volt Spannungsversorgung, die über den USB Anschluss bereitgestellt wird. VCC wird mit Pin 40 am Pico W verbunden, die Masse GND mit Pin 23. Alternativ sind auch die Pins 28, 33 oder 36 möglich. Die GPIO Ports können beliebig gewählt werden. Der Trigger Eingang des Ultraschallsensors wird mit Pin 32 (GP27) verbunden und der Echo Ausgang über einen 1,1 kOhm Widerstand an Pin 31 (GP26). Um am GPIO Eingangsport GP26 ein eindeutiges Signal zu erhalten wird zusätzlich ein 2,2 kOhm Widerstand mit Masse verbunden.

Für den ersten Test empfiehlt es sich alle Teile auf einem Breadboard zusammenzustecken und anschließen den Code zu testen. Mein Versuchsaufbau sah folgendermaßen aus:

Pico W und Ultraschallsensor HC-SR04 Versuchsaufbau

Meine finale Lösung in einem mit dem 3D Drucker gedruckten Gehäuse:

Pico W und Ultraschallsensor HC-SR04 im Gehäuse

Pico W und Ultraschallsensor HC-SR04 im Gehäuse - von vorne gesehen

Zuerst benötigt der Pico W eine Laufzeitumgebung.


Damit ist der Pico W einsatzbereit. Für den Zugriff eignet sich die kostenlose Software Thonny (Details siehe Grundlagen. Nach dem Start von Thonny sollte sich dir Pico W mit MicroPython v1.29.0 on 2026-08-24; Raspberry Pi Pico W with RP2040 melden.

Der microPython Code für den Pico W


from machine import Pin
import utime

trigger = Pin(27, Pin.OUT)
echo = Pin(26, Pin.IN)

def messung():
trigger.low()
utime.sleep_us(2)
trigger.high()
utime.sleep_us(10)
trigger.low()
while echo.value() == 0:
start = utime.ticks_us()
while echo.value() == 1:
end = utime.ticks_us()
dauer = utime.ticks_diff(end, start)
entfernung = (dauer * 0.0343) / 2
return entfernung

while True:
dist = messung()
print(f"Entfernung: {dist:.1f} cm")
utime.sleep(1)

Anmerkungen zum Programmcode:


MQTT


Mit dem obigen Porgrammcode wird die Entfernung jede Sekunde gemessen und in Thonny ausgegeben. Für meinen Einsatzzweck reicht das nicht aus, da der Entfernungsmesser im Regenwassertank eingesetzt und das Ergebnis an meine Hausautomatisierung basierend auf openHAB gesendet werden soll. Die Übertragung soll über MQTT - ein sehr schlankes Netzwerkprotokoll zur Übertragung von Telemetriedaten - erfolgen.

MQTT wird von MicroPython nicht nativ unterstützt, kann aber über Thonny am Pico W schnell eingebunden werden. Weit verbreitet ist umqtt.simple. In Thonny (aktive Verbindung zum Pico W vorausgesetzt) im Menü Tools - Manage Packages... aufrufen, nach microphyton-umqtt.simple suchen und in der Ergebnisliste microphyton-umqtt.simple auswählen.

über Thonny auf dem Pico W MQTT auswählen

Die Installation bestätigen und anschließend mit Close das Fenster schließen:

über Thonny auf dem Pico W MQTT installieren

Zum Programmcode komme ich später. Zuerst braucht man einen "Empfänger" für die Daten, die der Pico W über MQTT schicken soll - einen sogenannten MQTT Broker. Meine openHAB Hausautomatisierung läuft unter Windows und ein gängiger MQTT Broker ist der quelloffene Eclipse Mosquitto Broker (Download). Die Installation ist schnell erledigt.

Der Mosquitto MQTT Broker läuft unter Windows als Service. Die Konfiguration erfolgt in der mosquitto.conf Datei, die sich in der Standardinstallation unter C:\Program Files\mosquitto\ befindet. Diese Textdatei mit über 1.100 Zeilen besteht großteils aus Kommentaren, die alle Konfigurationsparameter beschreiben. Sinnvoll ist es, eine Kopie dieser Datei zu erstellen und mit einer leeren Datei zu beginnen. Erforderliche Parameter:

allow_anonymous true
listener 1883 0.0.0.0

Für die ersten Tests sollten anonyme Zugriffe auf den Broker erlaubt sein. In einer produktiven Umgebung wird allerdings der Zugriff mit Benutzer und Passwort aus Sicherheitsgründen empfohlen. Standard Port für MQTT ist 1883. Es ist auch möglich eine IP Adresse anzugeben, die akzeptiert wird.

log_dest file C:\Program Files\mosquitto\log\mosquitto.log
log_type all

Das Logging aller Informationen sollte aktiviert werden, um mögliche Fehler schneller zu erkennen. Das Unterverzeichnis log muss manuell angelegt werden. Vorsicht: nach dem Neustart des Mosquitto Brokers ist der Zugriff auf die Logdatei gesperrt. Um die Inhalte zu sehen, müssen Berechtigungen für diese Datei hinzugefügt werden!

Ein weiteres Problem hat mich viel Zeit gekostet. Der MQTT Broker läuft auf einem Windows PC. An einem zweiten Windows PC versuche ich erfolglos mit dem MQTT Explorer eine Verbindung zum Broker herzustellen. Auch der MicroPython Code auf dem Pico W bricht mit Fehlermeldung ab. Die Lösung habe ich in einem YouTube Video von Lukas Dörr gefunden: die Windows Firewall blockiert den Zugriff aus dem lokalen Netzwerk!


MQTT Explorer und MicroPython Code haben anschließend sofort funktioniert.

Pico W mit Ultraschallsensor als MQTT Publisher


Der microPython Code muss jetzt noch erweitert werden. Einerseits benötigt der Pico W eine Verbindung zum lokalen WLAN und andererseits soll die Entfernung nicht mehr in Thonny angezeigt, sondern an den MQTT Broker geschickt werden.

from machine import Pin
import network
import time
from umqtt.simple import MQTTClient

trigger = Pin(27, Pin.OUT)
echo = Pin(26, Pin.IN)

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
wlan.connect('SSID', 'Password')
while not wlan.isconnected():
time.sleep(1)

def messung():
trigger.low()
time.sleep_us(2)
trigger.high()
time.sleep_us(10)
trigger.low()
while echo.value() == 0:
start = time.ticks_us()
while echo.value() == 1:
end = time.ticks_us()
dauer = time.ticks_diff(end, start)
entfernung = (dauer * 0.0343) / 2
return entfernung

while True:
dist = messung()
try:
client = MQTTClient('picoW', '192.168.0.xxx', keepalive=60)
client.connect()
client.publish('pico/entfernung', str(dist))
print(dist)
client.disconnect()
except OSError:
print('Fehler: Keine MQTT-Verbindung')
time.sleep(60)

SSID mit Password sowie lokale IP Adresse des MQTT Brokers müssen entsprechend angepasst werden. Die Endlosschleife while True: führt die Messung alle 60 Sekunden durch und übermittelt den Wert an den MQTT Broker. Das Zeitintervall kann natürlich entsprechend angepasst werden. Alternativ kann der Code so angepasst werden, dass der Wert erst unter einem bestimmten Wert übermittelt wird.

openHAB 5 Integration


openHAB Administration öffnen.


Gehäuse


Für meinen 3D Drucker (Bambu Lab A1) habe ich ein Gehäuse mit Deckel entworfen:

Gehäuse
Deckel

Dieses Gehäuse besitzt folgende Abmessungen (B x T x H): 90 x 55 x 15 mm.

Links