Home Assistant mit ESPHome: eigene Schaltungen bauen, visualisieren und alles aus einer Hand bedienen
Es gibt Projekte, bei denen Technik plötzlich greifbar wird. Eine Zisternensteuerung mit Home Assistant und ESPHome gehört für mich genau dazu: Ein kleiner Mikrocontroller misst den Füllstand, schaltet eine Pumpe, zeigt den Wasserstand auf einem winzigen Display direkt an der Zisterne an und meldet alles an die Home Assistant App auf dem Smartphone. Eigene Elektronik, eine lokale Anzeige, ein übersichtliches Dashboard und clevere Automationen greifen dabei ineinander, und alles lässt sich aus einer Hand bedienen. In diesem Beitrag zeige ich, wie so ein Aufbau grundsätzlich aussehen kann.
Warum Home Assistant und ESPHome so gut zusammenpassen
Home Assistant ist eine Open-Source-Plattform für die Hausautomation, die lokal läuft, zum Beispiel auf einem Raspberry Pi, einem kleinen Mini-PC oder einer virtuellen Maschine. ESPHome ist ein Framework, mit dem man Mikrocontroller wie den ESP32 oder ESP8266 über einfache YAML-Konfigurationsdateien programmiert. Man schreibt also keinen C++-Code von Hand, sondern beschreibt, welche Sensoren, Schalter und Displays angeschlossen sind. ESPHome erzeugt daraus die Firmware.
Das Faszinierende daran: Ein Gerät, das mit ESPHome gebaut wurde, taucht über die native API automatisch in Home Assistant auf. Sensorwerte, Schalter und Taster stehen sofort als Entitäten zur Verfügung, ohne Cloud, ohne zusätzliche Bridge und ohne proprietäre App. Updates lassen sich anschließend bequem per WLAN einspielen (OTA). So wird aus ein paar Euro Hardware ein vollwertiges Smart-Home-Gerät, das genau das tut, was man braucht.
Das Beispiel: eine Zisternensteuerung
Eine Regenwasserzisterne ist ein schönes Beispiel, weil sie mehrere typische Aufgaben vereint: messen, schalten, anzeigen, automatisieren und benachrichtigen. In meinem Beispiel soll die Steuerung folgende Dinge können:
- den Füllstand der Zisterne kontinuierlich messen und in Prozent bzw. Litern umrechnen,
- eine Gartenpumpe oder ein Magnetventil über ein Relais schalten,
- den aktuellen Füllstand auf einem kleinen OLED- oder TFT-Display direkt am Gerät anzeigen,
- alle Werte und Schalter im Dashboard der Home Assistant App bereitstellen,
- die Pumpe vor Trockenlauf schützen und bei Bedarf Nachspeisung aus dem Trinkwassernetz auslösen,
- Benachrichtigungen aufs Smartphone schicken, wenn etwas Auffälliges passiert.
Die Hardware: was man für den Aufbau braucht
Das Herzstück ist ein ESP32-Board. Es bringt WLAN mit, hat genügend GPIO-Pins und ist breit verfügbar. Für die Füllstandsmessung gibt es verschiedene Möglichkeiten:
- Ultraschallsensor, zum Beispiel ein wasserdichter JSN-SR04T, der von oben die Entfernung zur Wasseroberfläche misst. Aus der bekannten Höhe der Zisterne lässt sich so der Füllstand berechnen.
- Drucksensor (hydrostatische Sonde), der am Boden der Zisterne liegt und über den Wasserdruck die Wassersäule ermittelt. Häufig liefert so ein Sensor ein 4–20-mA-Signal, das man über einen passenden Wandler am ESP32 einliest.
Für das Schalten sorgt ein Relaismodul, das die Pumpe oder ein Ventil ansteuert. Wichtig: Sobald Netzspannung im Spiel ist, gehört die Installation in fachkundige Hände und in ein geeignetes Gehäuse. Für die lokale Anzeige eignet sich ein kleines SSD1306-OLED mit 128×64 Pixeln, das per I²C angeschlossen wird, oder ein kleines TFT, wenn es etwas farbiger sein soll.
Die ESPHome-Konfiguration
Wie einfach das in ESPHome aussieht, zeigt der folgende, bewusst knapp gehaltene Ausschnitt. Er misst die Entfernung mit einem Ultraschallsensor, rechnet sie in einen Füllstand um, stellt ein Relais als Schalter bereit und zeichnet einen Füllstandsbalken auf das OLED:
esphome:
name: zisterne
esp32:
board: esp32dev
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
api:
ota:
- platform: esphome
i2c:
sda: GPIO21
scl: GPIO22
sensor:
- platform: ultrasonic
trigger_pin: GPIO5
echo_pin: GPIO18
name: "Zisterne Abstand"
id: abstand
update_interval: 30s
- platform: template
name: "Zisterne Füllstand"
id: fuellstand
unit_of_measurement: "%"
update_interval: 30s
lambda: |-
// Beispiel: 2,0 m Zisternenhöhe, Sensor 0,2 m über max. Wasserstand
float pegel = 2.0 - (id(abstand).state - 0.2);
return max(0.0f, min(100.0f, pegel / 2.0f * 100.0f));
switch:
- platform: gpio
pin: GPIO26
name: "Zisterne Pumpe"
id: pumpe
font:
- file: "gfonts://Roboto"
id: schrift
size: 14
display:
- platform: ssd1306_i2c
model: "SSD1306 128x64"
address: 0x3C
lambda: |-
it.printf(0, 0, id(schrift), "Zisterne %.0f %%", id(fuellstand).state);
it.rectangle(0, 30, 128, 20);
it.filled_rectangle(0, 30, (int)(id(fuellstand).state * 1.28), 20);
Die Werte für Höhe und Abstand sind natürlich nur Platzhalter und müssen an die eigene Zisterne angepasst werden. Wer möchte, ergänzt Filter wie einen gleitenden Median, um Ausreißer der Ultraschallmessung zu glätten.
Visualisierung: lokal am Display und im Dashboard
Ich finde es besonders reizvoll, dass dieselben Daten an zwei Orten sichtbar werden. Das kleine Display direkt am Gerät zeigt den Füllstand auch dann, wenn gerade kein Smartphone zur Hand ist, etwa im Keller oder Technikraum. Gleichzeitig stehen die Entitäten in Home Assistant zur Verfügung.
Dort kann man ein Dashboard gestalten, zum Beispiel mit einer Tachoanzeige (Gauge-Karte) für den Füllstand, einem Verlaufsdiagramm über die letzten Tage und einem Schalter für die Pumpe. In der Home Assistant App auf dem Smartphone ist das alles sofort verfügbar, auf Wunsch auch von unterwegs über einen sicheren Fernzugriff.
Automationen: Trockenlaufschutz und Nachspeisung
Richtig spannend wird es, wenn die Steuerung mitdenkt. Ein paar Beispiele, die man in Home Assistant oder teilweise direkt in ESPHome umsetzen kann:
- Trockenlaufschutz: Fällt der Füllstand unter einen festgelegten Schwellwert, wird die Pumpe automatisch abgeschaltet und lässt sich erst wieder einschalten, wenn genug Wasser vorhanden ist. Diese Logik direkt im ESP32 abzubilden hat den Vorteil, dass sie auch funktioniert, wenn Home Assistant oder das WLAN einmal nicht erreichbar sind.
- Nachspeisung: Sinkt der Pegel zu weit, kann ein Magnetventil Trinkwasser nachspeisen, bis ein Mindeststand erreicht ist. Dabei sind die geltenden Vorschriften zur Trennung von Trink- und Regenwasser zu beachten, etwa über einen freien Auslauf.
- Bewässerung: Die Gartenbewässerung kann zeitgesteuert laufen und nur dann starten, wenn die Zisterne ausreichend gefüllt ist.
Benachrichtigungen aufs Smartphone
Über die Home Assistant App lassen sich Push-Benachrichtigungen verschicken. So kann man sich informieren lassen, wenn die Zisterne fast leer ist, wenn der Trockenlaufschutz ausgelöst hat, wenn die Pumpe ungewöhnlich lange läuft oder wenn das ESPHome-Gerät nicht mehr erreichbar ist. Gerade die letzte Meldung ist praktisch, denn sie zeigt frühzeitig, wenn etwa die Stromversorgung oder das WLAN ein Problem hat.
Alles aus einer Hand bedienen
Am Ende steht ein System, das Messung, Steuerung, Anzeige und Bedienung vereint: Das Display vor Ort, das Dashboard in der App und die Automationen im Hintergrund arbeiten mit denselben Daten. Und weil ESPHome so flexibel ist, lässt sich das Prinzip auf viele andere Ideen übertragen, vom Temperaturfühler im Gewächshaus über den Briefkastensensor bis zur Steuerung einer Heizungspumpe. Genau diese Freiheit, eigene Schaltungen zu bauen und sie nahtlos ins Smart Home zu integrieren, macht für mich den Reiz von Home Assistant aus.
Ihr eigenes Projekt
Sie haben eine Idee für Ihre eigene Zisternensteuerung oder ein anderes Projekt mit Home Assistant und ESPHome? Ich unterstütze Sie gern bei Planung, Hardwareauswahl, Konfiguration und Integration. Melden Sie sich einfach über www.itsolon.com, ich freue mich auf Ihre Anfrage.