Poolpumpe smart steuern mit Home Assistant – DIY-Lösung statt teurem Hersteller-Modul

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:

CP2102 Konverter ESP32 Relaisboard
GND GND
TX RX
RX TX

Zusätzlich muss natürlich das externe 5V-Netzteil mit dem Board verbunden sein.

Flashmodus (auf dem ESP32-Board) aktivieren

  • IO0 gedrückt halten
  • Dann kurz EN drücken
  • EN loslassen
  • IO0 noch 1 Sekunde halten
  • IO0 loslassen

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

Funktion GPIO Status-LED
Eco GPIO32 🟢 Grün
Normal GPIO33 🟡 Gelb
Boost GPIO25 🔵 Blau
Stop / Aus GPIO26 🔴 Rot
Home Assistant Status GPIO27 ⚪ Weiß

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:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert