Vom einfachen Schalter zum Smart-Home-Projekt
Wer schon einmal versucht hat, eine einfache Pumpe „mal eben schnell“ smart zu machen, kennt das Phänomen: Aus einer vermeintlich simplen Idee wird plötzlich ein ausgewachsenes Projekt – inklusive Lötarbeiten, Gehäusebau, etwas Elektronik und natürlich Software.
Genau so begann auch mein aktuelles Projekt. Das Ziel war zunächst recht überschaubar: Eine Poolpumpe sollte verschiedene Betriebsmodi zuverlässig unterstützen und bequem über Home Assistant steuerbar sein. Später sollten zusätzlich Zeitsteuerungen automatisch zwischen den Modi wechseln können.
Am Ende entstand jedoch deutlich mehr als nur ein smarter Schalter. Mit einem ESP32-Relaisboard, mehreren Status-LEDs, etwas Lötarbeit und einem individuell gestalteten Home Assistant Dashboard entstand eine Lösung, die nicht nur zuverlässig funktioniert, sondern auch IMHO optisch überzeugt.
Warum keine Herstellerlösung?
Bevor ich selbst zum Lötkolben gegriffen habe, habe ich selbstverständlich geprüft, welche Lösungen der Hersteller (Speck bzw. Badu) bereits anbietet. Eine fertige Lösung kostet vielleicht ja nur ein paar Euro mehr und bietet alle Funktionen, die ich mir wünsche. Sehen wir mal…
Für meine Speck-Pumpe existiert mit dem Badu NetLink-Modul bereits eine fertige WLAN- und App-Lösung. Darüber lassen sich unter anderem die Drehzahl der Pumpe, die Laufzeiten und die Verbrauchsdaten per Smartphone-App verwalten. Die Installation erfolgt über die vorhandenen potentialfreie Kontakte oder eine RS485-Schnittstelle. Also eigentlich genau das, was man sich als Smart-Home-Fan wünscht – allerdings zeigten sich für meinen Anwendungsfall zwei entscheidende Nachteile:
- Der UVP liegt bei rund 269 € – ein stolzer Preis für die (aus meiner Sicht) geringe Leistung.
- Eine Integration in Home Assistant ist nicht vorhanden und auch zukünftig nicht vorgesehen.
Weder existiert eine offizielle API noch konnte ich eine Community-Integration über HACS finden. Ich habe sogar direkt beim Hersteller Speck angefragt und angeboten, selbst eine kostenlose Home-Assistant-Integration zu entwickeln und der Community kostenlos zur Verfügung zu stellen. Leider bestand daran vom Hersteller kein Interesse. IMHO hätte das im Idealfall sogar zu höheren Verkaufszahlen für das Badu NetLink geführt. Naja, wieder eine Chance nicht genutzt – schade!
Damit blieb letztendlich nur eine Lösung: Selber bauen!
Die Hardware
Nach einiger Recherche fiel meine Wahl auf die folgenden Komponenten:
- ESP32-WROOM-32E 4-Kanal-Relaisboard mit WLAN und Bluetooth

- CP2102 USB-zu-TTL-Konverter für die Erstprogrammierung
- 5 Volt / 3 Ampere Stecker-Netzteil
- 5 x 8-mm-LED-Kontrollleuchten (Rot, Orange, Blau, Grün und Weiß)
- ABS-Kunststoff-Verteilerdose (150 × 110 × 70 mm)
- Schaltdraht, Aderendhülsen und weiteres Kleinmaterial
Der „erste Kontakt“
Die Erstprogrammierung des ESP32 erfolgte über den TTL-Konverter. Das von mir o.g. ESP32-WROOM Relaisboard verfügt nativ über keine eigene USB-Schnittstelle – aber eine TTL-Schnittstelle ist vorhanden. Da das Board ja nach dem Kauf noch keine Informationen zum lokalen Wifi-Netzwerk kennt, muss es ihm ja irgendwie beibringen. Dazu setzte ich den genannten TTL-Konverter ein. Danach konnte dann das Board wie gewohnt ganz bequem per WLAN über ESP Home aktualisiert werden und der TTL-Konverter war nicht weiter nötig.
CP2102 TTL Konverter anschließen
Den TTL Konverter bitte wie folgt mit dem ESP32 Relaisboard verkabeln/anschließen:
Zusätzlich muss natürlich das externe 5V-Netzteil mit dem Board verbunden sein.
Flashmodus (auf dem ESP32-Board) aktivieren
Home Assistant ESPHome
- „Connect“
- COM-Port auswählen
- „Install“
- Firmware auswählen
- Dann wird geflasht.
Die Software
Neben der Hardware war vor allem die Programmierung spannend. Dabei musste sichergestellt werden, dass niemals mehrere Relais gleichzeitig aktiviert werden. Andernfalls könnte die Pumpe in einen ungültigen Betriebszustand gelangen. Wichtig ist es, dass die verwendeten GPIOs des ESP32 korrekt in der ESPHome-Konfiguration übernommen wurden.
Nach etwas Recherche und Ausprobieren konnte ich verifizieren, dass GPIO32 Relais 1 steuert, GPIO33 das Relais 2, GPIO25 das Relais 3 und GPIO26 das Relais 4.
Den kompletten bereinigten YAML-Code findet ihr hier:
esphome:
name: poolpumpensteuerung
friendly_name: Poolpumpensteuerung
on_boot:
priority: -100
then:
- delay: 2s
- lambda: |-
id(pool_n1).turn_off();
id(pool_n2).turn_off();
id(pool_n3).turn_off();
id(pool_stop).turn_off();
- delay: 500ms
- if:
condition:
lambda: 'return id(pool_mode).current_option() == "Eco";'
then:
- switch.turn_on: pool_n1
- if:
condition:
lambda: 'return id(pool_mode).current_option() == "Normal";'
then:
- switch.turn_on: pool_n2
- if:
condition:
lambda: 'return id(pool_mode).current_option() == "Boost";'
then:
- switch.turn_on: pool_n3
- if:
condition:
lambda: 'return id(pool_mode).current_option() == "Aus";'
then:
- switch.turn_on: pool_stop
esp32:
board: esp32dev
framework:
type: esp-idf
logger:
api:
encryption:
key: !secret poolpumpensteuerung_api_key
ota:
- platform: esphome
password: !secret poolpumpensteuerung_ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
captive_portal:
binary_sensor:
- platform: status
name: "Poolpumpensteuerung ESP Status"
id: esp_status
output:
- platform: gpio
pin: GPIO27
id: led_status
light:
- platform: binary
id: status_led
name: "Poolpumpensteuerung Status LED"
output: led_status
internal: true
interval:
- interval: 5s
then:
- if:
condition:
api.connected
then:
- light.turn_on: status_led
else:
- light.turn_off: status_led
switch:
- platform: gpio
pin: GPIO32
id: pool_n1
internal: true
restore_mode: ALWAYS_OFF
interlock:
- pool_n1
- pool_n2
- pool_n3
- pool_stop
- platform: gpio
pin: GPIO33
id: pool_n2
internal: true
restore_mode: ALWAYS_OFF
interlock:
- pool_n1
- pool_n2
- pool_n3
- pool_stop
- platform: gpio
pin: GPIO25
id: pool_n3
internal: true
restore_mode: ALWAYS_OFF
interlock:
- pool_n1
- pool_n2
- pool_n3
- pool_stop
- platform: gpio
pin: GPIO26
id: pool_stop
internal: true
restore_mode: ALWAYS_OFF
interlock:
- pool_n1
- pool_n2
- pool_n3
- pool_stop
select:
- platform: template
name: "Poolpumpen Modus"
id: pool_mode
optimistic: true
restore_value: true
options:
- "Aus"
- "Eco"
- "Normal"
- "Boost"
initial_option: "Aus"
set_action:
- lambda: |-
id(pool_n1).turn_off();
id(pool_n2).turn_off();
id(pool_n3).turn_off();
id(pool_stop).turn_off();
- delay: 500ms
- if:
condition:
lambda: 'return x == "Eco";'
then:
- switch.turn_on: pool_n1
- if:
condition:
lambda: 'return x == "Normal";'
then:
- switch.turn_on: pool_n2
- if:
condition:
lambda: 'return x == "Boost";'
then:
- switch.turn_on: pool_n3
- if:
condition:
lambda: 'return x == "Aus";'
then:
- switch.turn_on: pool_stop
LED – olé
Da meine Poolpumpe vier verschiedene Betriebsmodi besitzt (Eco, Normal, Boost und Aus), habe ich jedem Modus eine eigene Status-LED spendiert. Zusätzlich signalisiert eine weiße LED, ob der ESP aktuell mit Home Assistant verbunden ist – finde ich persönlich sehr praktisch, speziell wenn mal eine Fehlersuche angesagt ist.
Anschlussschema für die LEDs an den jeweiligen GPIOs
Das Dashboard in Home Assistant
Natürlich sollte die Steuerung nicht nur funktionieren, sondern auch gut aussehen.
Für die Statusanzeige verwende ich eine Mushroom Template Card, die über HACS installiert werden kann. Je nach aktuellem Pumpenmodus wird automatisch die Farbe des Icons angepasst.
Anbei der zugehörige yaml Code der Mushroom Template Card:
type: custom:mushroom-template-card
primary: Poolpumpe
secondary: '{{ states(''select.poolpumpensteuerung_poolpumpen_modus'') }}'
icon: mdi:pump
icon_color: |
{% if is_state('select.poolpumpensteuerung_poolpumpen_modus', 'Eco') %}
green
{% elif is_state('select.poolpumpensteuerung_poolpumpen_modus', 'Normal') %}
yellow
{% elif is_state('select.poolpumpensteuerung_poolpumpen_modus', 'Boost') %}
blue
{% else %}
red
{% endif %}
tap_action:
action: more-info
entity: select.poolpumpensteuerung_poolpumpen_modus
grid_options:
columns: 12
rows: 1
Der untere Teil, die vier großen Buttons, habe ich mit einer sogenannten Querstapel-Karte (eine native Funktion von Home Assistant) realisiert. Anbei der zugehörige yaml-Code, der die Konfiguration der vier Buttons erzeugt:
type: horizontal-stack
cards:
- type: button
name: Eco
icon: mdi:leaf
tap_action:
action: call-service
service: select.select_option
target:
entity_id: select.poolpumpensteuerung_poolpumpen_modus
data:
option: Eco
- type: button
name: Normal
icon: mdi:pump
tap_action:
action: call-service
service: select.select_option
target:
entity_id: select.poolpumpensteuerung_poolpumpen_modus
data:
option: Normal
- type: button
name: Boost
icon: mdi:rocket-launch
tap_action:
action: call-service
service: select.select_option
target:
entity_id: select.poolpumpensteuerung_poolpumpen_modus
data:
option: Boost
- type: button
name: Aus
icon: mdi:power
tap_action:
action: call-service
service: select.select_option
target:
entity_id: select.poolpumpensteuerung_poolpumpen_modus
data:
option: Aus
Das Ergebnis ist IMHO eine übersichtliche Oberfläche, auf der jederzeit der aktuelle Zustand der Poolpumpe sichtbar ist und dieser auch direkt geändert werden kann.
Mein Fazit
Mit vergleichsweise günstiger Hardware konnte ich eine (bessere) Lösung realisieren, die exakt auf meine Anforderungen zugeschnitten ist und sich vollständig in Home Assistant integriert.
Schade finde ich lediglich, dass Speck derzeit kein Interesse an einer offiziellen Home-Assistant-Integration für das Badu NetLink-Modul zeigt. Gerade für Smart-Home-Nutzer wäre das eine echte Bereicherung gewesen.
Vielleicht dient dieses Projekt dem einen oder anderen als Inspiration für das eigene Smart Home oder andere IoT-Projekte. Falls ihr Fragen habt schreibt mir gerne einen Kommentar.
Hier nochmal ein Foto vom Gehäuseinneren – es fehlen auf der Abbildung lediglich die fünf Adern der Poolpumpe, die auf den Schraubklemmen links angeschlossen werden – natürlich mit Aderendhülsen.
Einkaufsliste:
Wenn ihr dieses Projekt nachbauen wollt dann empfehle ich euch die folgenden Artikel:
- ESP32-WROOM-32E 4-Kanal-Relaisboard mit WLAN und Bluetooth – ca. 16 €
- CP2102 USB zu TTL Konverter HW-598 für 3,3V und 5V – ca. 8 €
- 5 Volt / 3 Ampere Stecker-Netzteil – ca. 12 €
- 5x 8mm LED Metall Kontrollleuchte wasserdicht (Rot/Orange/Blau/Grün/Weiß) – ca. 8 €
- ABS-Kunststoff-Verteilerdose (150 × 110 × 70 mm), z.B. von LeMotech – ca. 8 €
- Schaltdraht – zwischen 1 und 10 €
- Aderendhülsen – zwischen 9 und 18 €
- Kleinmaterial (z.B. Schrauben, um Platine oder Gehäuse zu montieren)



