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?
Raspberry Pi Pico W (unter 10 Euro)
Ultraschallsensor HC-SR04 (ab 1,49 Euro)
2 Widerstände 1,1 kΩ und 2,2 kΩ
MQTT Paket umqtt.simple (Freeware)
Gehäuse für Pico und Ultraschallsensor (3D Drucker)
MQTT-Broker für Windows: Eclipse Mosquitto (Freeware)
openHAB 5 Installation
Grundlagen zum Raspberry Pi Pico W sind hier beschrieben.
Der Ultraschallsensor HC-SR04:
Platine 45,5 x 20,5 mm
Lochabstand 42 x 17,5 mm
Höhe Platine bis Sensor: 12mm
4 Anschlüsse: VCC, Trig, Echo, Gnd
Spannungsversorgung 5 V, andere Quellen geben die Spannung ab 3,3 V an
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:
Meine finale Lösung in einem mit dem 3D Drucker gedruckten Gehäuse:
Zuerst benötigt der Pico W eine Laufzeitumgebung.
microUSB Kabel am Pico einstecken, aber noch nicht am Computer
Taste BOOTSEL auf dem Pico drücken und gedrückt halten
micro USB Kabel mit dem Computer verbinden.
Taster loslassen.
Der Pico wird jetzt als externer Massenspeicher erkannt und eingebunden
Den Datei Explorer starten (abhängig von der Computer Konfiguration startet dieser eventuell auch automatisch)
Im Explorer erscheint der Pico jetzt unter dem Namen RPI-RP2
Sollte der Pico nicht angezeigt werden, nutzen Sie voraussichtlich ein USB Kabel, das nur für die Stromversorgung genutzt werden kann und die Datenleitungen nicht verbunden sind.
Leider sieht man das dem USB Kabel nicht an!
Der zugewiesene Laufwerksbuchstaben (hier E:) hängt vom Computer und der angeschlossenen Hardware ab
Mit Drag and Drop die heruntergeladene UF2 Datei (Version 1.29 vom 24.08.2026) auf den Pico ziehen (hier auf Laufwerk E:)
Der Pico Bootloader erkennt die UF2 Datei, meldet den Pico als externen Massenspeicher ab und installiert den MicroPython Interpreter auf dem Pico
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:
Bei Bedarf die Ports anpassen. Trigger ist bei mir mit dem Pin 32 = GP27 verbunden. Wie bereits erwähnt wird im Code der GPIO Port angegeben, nicht die physikalische Pin Nummer - auch wenn der Name irreführend ist.
Die Messung wird durch einen kurzen (10 µs) Impuls am Eingang Trigger ausgelöst.
Die Messung beginnt, wenn der Ausgang Echo auf high (1) geht und endet, wenn dieser wieder auf low (0) geht.
Die Länge des Impulses wird gemessen und in der Variablen dauer gespeichert.
Die Entfernung entfernung berechnet sich durch Multiplikation mit der Schallgeschwindigkeit (343 Meter/s).
Der errechnete Wert muss noch halbiert wird, da das Signal ausgesendet und wieder empfangen wird.
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.
Die Installation bestätigen und anschließend mit Close das Fenster schließen:
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!
Am Windows PC die alte Systemsteuerung aufrufen
Windows Defender Firewall auswählen
Eine App oder Feature durch die Windows Defender Firewall zulassen
Einstellungen ändern
Andere App zulassen
Nach C:\Program Files\Mosquitto\mosquitto.exe suchen und hinzufügen
Der Zugriff aus dem privaten Netzwerk ist ausreichend
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():
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.