ESP32 und Schwimmschalter: Wasserstand in Home Assistant überwachen
Für die Umsetzung dieses Setups wird ein funktionsfähiges Home-Assistant-System mit installiertem ESPHome-Add-on benötigt. Die Schritte zur Ersteinrichtung des Mikrocontrollers sind im Beitrag ESP32 NodeMCU mit ESPHome in Home Assistant einrichten detailliert beschrieben.
Die Überwachung von Wasserständen ist ein klassischer Anwendungsfall im Smart Home, beispielsweise für Zisternen, Aquarien oder als Überlaufschutz. In diesem Beitrag erfährst du, wie du mechanische Schwimmschalter (Pegelschalter) an einen ESP32 anschließt. Wir starten mit einem einfachen Sensor und erweitern das Setup anschließend um einen zweiten Schalter, um einen minimalen und maximalen Füllstand zu erfassen.
Die Kernkomponenten für den Aufbau
Für dieses Projekt benötigen wir neben dem Mikrocontroller die eigentlichen Sensoren und eine Lösung, um deren lose Kabelenden sauber anzuschließen.
ESP32 NodeMCU Development Board
Dieses ESP32 NodeMCU Development Board* (Werbung) bildet die Basis des Projekts. Es verarbeitet die Signale der Schalter und sendet die Zustandsänderungen per WLAN an Home Assistant.
Für diesen Beitrag wird die weit verbreitete 30-Pin-Variante mit ESP32-Chip verwendet. Die Programmierung und Stromversorgung erfolgt unkompliziert über die integrierte USB-C-Schnittstelle.
Schwimmschalter (Pegelschalter)
Ein Schwimmschalter* (Werbung) ist ein mechanischer Schalter. Im Inneren des beweglichen Schwimmers befindet sich ein Magnet, der bei steigendem oder fallendem Wasserstand einen Reed-Kontakt im Schaft schließt oder öffnet.
Da es sich um einen reinen Kontakt handelt, spielt die Polarität der beiden Anschlusskabel keine Rolle. Die Sensoren werden meist mit losen Kabelenden (Litzen) ausgeliefert.
ESP32 Breakout Board (Expansion Board)
Um die losen Kabelenden des Schwimmschalters sicher mit dem ESP32 zu verbinden, ohne direkt zum Lötkolben greifen zu müssen, bietet sich ein ESP32 Breakout-Board mit Schraubklemmen* (Werbung) an.
Der ESP32 wird auf das Board gesteckt. Die GPIO-Pins werden dadurch nach außen auf Schraubklemmen geführt, in die sich Litzen direkt und sicher einklemmen lassen.
Basis-Setup: Einen einzelnen Schwimmschalter anschließen
Der Anschluss eines mechanischen Schalters an den ESP32 ist unkompliziert. Wir benötigen keine externen Bauteile wie Widerstände, da wir den internen Pull-Up-Widerstand des ESP32 per Software aktivieren.
Verbinde die beiden Adern des Schwimmschalters wie folgt mit den Schraubklemmen des Breakout Boards. Die Reihenfolge der beiden Kabel des Schalters ist irrelevant. Auf dem Breakout-Board entspricht die Beschriftung D4 dem Pin GPIO 04 des ESP32.
| Schwimmschalter (Kabel) | ESP32 Pin | Funktion |
|---|---|---|
| Kabel 1 | GND | Masseverbindung |
| Kabel 2 | GPIO 04 (D4) | Signaleingang (digital) |
ESPHome Code-Konfiguration für einen Sensor
Damit der ESP32 den Zustand des Pins korrekt ausliest, nutzen wir in ESPHome die Komponente binary_sensor.
Ein wichtiges Detail bei der Überwachung von Flüssigkeiten ist die Unruhe der Wasseroberfläche. Würden wir den Sensor ungefiltert auslesen, würde jede kleine Welle oder Erschütterung (z. B. beim Einlaufen von Wasser) ein schnelles Hin- und Herschalten auslösen. Das führt zu unruhigen Daten und unnötigen Automatisierungs-Triggern in Home Assistant.
Neben dem rein elektrischen Entprellen nutzen wir daher in der Praxis eine großzügige Verzögerung von 5 Sekunden. Erst wenn der Schalter für diese Zeitspanne ununterbrochen geschlossen oder geöffnet bleibt, wird die Änderung an Home Assistant übertragen.
name: esp32-schwimmschalter
# ... (WLAN und API Einstellungen bleiben unberührt)
binary_sensor:
- platform: gpio
pin:
number: GPIO04
# Aktiviert den internen Pull-Up-Widerstand des ESP32
mode:
input: true
pullup: true
name: "Wasserstand Zisterne"
# Die Device-Class legt fest, wie Home Assistant den Sensor darstellt (feucht/trocken)
device_class: moisture
filters:
# Wellenfilter & Entprellen: Der Zustand muss für 5 Sekunden stabil sein
- delayed_on: 5s
- delayed_off: 5s
100ms herunter. Sobald das System an seinem Bestimmungsort verbaut wird, solltest du aber wieder auf 5s oder mehr wechseln.
Klicke auf 'INSTALL' und lasse das Log-Fenster nach dem Flashen geöffnet. ESPHome scannt nun den Pin 4 und zeigt den gefundenen Sensor im Log an:
[13:30:40.816][C][gpio.binary_sensor:016]: GPIO Binary Sensor 'Wasserstand Zisterne'
[13:30:40.820][C][gpio.binary_sensor:232]: Device Class: 'moisture'
[13:30:40.820][C][gpio.binary_sensor:152]: Pin: GPIO4
[13:30:40.821][C][gpio.binary_sensor:061]: Mode: interrupt
[13:30:40.824][C][gpio.binary_sensor:063]: Interrupt Type: ANY_EDGE
Zustandsänderungen des Sensors werden (nach Ablauf der 5-sekündigen Filterzeit) ebenfalls im Log ausgegeben:
[13:31:25.000][S][binary_sensor]: 'Wasserstand Zisterne' >> ON
[13:31:50.000][S][binary_sensor]: 'Wasserstand Zisterne' >> OFF
Erweiterter Aufbau: Zwei Schwimmschalter für Min/Max-Füllstand
In vielen Szenarien reicht ein einzelner Sensor nicht aus. Möchtest du beispielsweise eine Pumpe steuern, brauchst du oft einen Schalter für den minimalen Füllstand (Pumpe aus, Trockenlaufschutz) und einen für den maximalen Füllstand (Pumpe an, Behälter leeren).
Der ESP32 verfügt über ausreichend GPIO-Pins und GND-Anschlüsse, um problemlos mehrere Schalter parallel zu betreiben. Für den zweiten Schalter nutzen wir einfach einen weiteren digitalen Eingang, in diesem Beispiel GPIO 05.
| Sensor | Schwimmschalter (Kabel 1) | Schwimmschalter (Kabel 2) |
|---|---|---|
| Schalter 1 (Minimum) | GND | GPIO 04 |
| Schalter 2 (Maximum) | GND (kann ein zweiter GND-Pin sein) | GPIO 05 |
ESPHome Code-Konfiguration für mehrere Sensoren
Die Konfiguration in ESPHome wird einfach um einen weiteren Eintrag unter binary_sensor ergänzt. Beide Sensoren erhalten eigene Namen und nutzen den praxisnahen 5-Sekunden-Filter.
name: esp32-schwimmschalter
# ... (WLAN und API Einstellungen bleiben unberührt)
binary_sensor:
# Erster Sensor: Minimaler Füllstand
- platform: gpio
pin:
number: GPIO04
mode:
input: true
pullup: true
name: "Füllstand Minimum"
device_class: moisture
filters:
- delayed_on: 5s
- delayed_off: 5s
# Zweiter Sensor: Maximaler Füllstand
- platform: gpio
pin:
number: GPIO05
mode:
input: true
pullup: true
name: "Füllstand Maximum"
device_class: moisture
filters:
- delayed_on: 5s
- delayed_off: 5s
Klicke erneut auf 'INSTALL' und lasse das Log-Fenster nach dem Flashen geöffnet. ESPHome scannt nun den Pin 4 und Pin 5 und zeigt die gefundenen Sensoren im Log an:
[13:43:14.050][C][gpio.binary_sensor:016]: GPIO Binary Sensor 'Füllstand Minimum'
[13:43:14.053][C][gpio.binary_sensor:232]: Device Class: 'moisture'
[13:43:14.053][C][gpio.binary_sensor:152]: Pin: GPIO4
[13:43:14.053][C][gpio.binary_sensor:061]: Mode: interrupt
[13:43:14.065][C][gpio.binary_sensor:063]: Interrupt Type: ANY_EDGE
[13:43:14.088][C][gpio.binary_sensor:016]: GPIO Binary Sensor 'Füllstand Maximum'
[13:43:14.088][C][gpio.binary_sensor:232]: Device Class: 'moisture'
[13:43:14.088][C][gpio.binary_sensor:152]: Pin: GPIO5
[13:43:14.089][C][gpio.binary_sensor:061]: Mode: interrupt
[13:43:14.089][C][gpio.binary_sensor:063]: Interrupt Type: ANY_EDGE
Und die Zustandsänderungen im laufenden Betrieb:
[13:43:32.710][S][binary_sensor]: 'Füllstand Minimum' >> ON
[13:43:34.993][S][binary_sensor]: 'Füllstand Maximum' >> ON
[13:43:38.380][S][binary_sensor]: 'Füllstand Maximum' >> OFF
[13:43:41.499][S][binary_sensor]: 'Füllstand Minimum' >> OFF
Nachdem du diese Konfiguration über ESPHome auf den Mikrocontroller geladen hast, stehen dir in Home Assistant zwei separate Entitäten zur Verfügung. Mit diesen beiden Werten lassen sich nun zuverlässige Automatisierungen für Pumpensteuerungen oder Benachrichtigungen beim Erreichen kritischer Füllstände realisieren.
Verwendete Hardware-Komponenten
Folgende Komponenten kamen in diesem Projekt zum Einsatz:
- ESP32 NodeMCU Development Board* (Werbung) – Die kompakte Zentrale mit WLAN für die Datenverarbeitung.
- Schwimmschalter* (Werbung) – Beweglicher Schwimmer, der bei steigendem oder fallendem Wasserstand mechanisch aktiviert wird.
- ESP32 Breakout-Board mit Schraubklemmen* (Werbung) – Erleichtert den Testaufbau massiv, da die losen Kabelenden sicher verschraubt werden können.
Weitere Praxisprojekte
Aufbauend auf der ESP32 Ersteinrichtung können verschiedene Hardware-Komponenten und Sensoren an den Mikrocontroller angebunden werden. Bisher dokumentierte Projekte:
Schritt-für-Schritt-Anleitung zum Anschluss mehrerer RGB-LED-Module mittels G-V-S Expansion Board und der Erstellung individueller Lichteffekte in ESPHome.
Schritt-für-Schritt-Anleitung zum physischen Anschluss des wasserdichten Sensors DS18B20 und der effizienten Auslesung mehrerer Fühler über den 1-Wire-Bus in ESPHome.