Automation PH/EC für Hydroponisches System über ESPHome

Hallo liebe Community,

ich bin leider mit meinem Latein am Ende und drehe mich zur Zeit im Kreis.

Für meine NFT-Anlage (Hydroponischer Pflanzenanbau), möchte ich eine automatische Steuerung für Ph-Wert und EC-Wert basteln.

Meine Komponenten:

Hersteller: Atlas Scientific

Boards:

  • Whitebox T1 MkII
  • ESP32 ESP-WROOM-32
  • EZO-RTD
  • EZO-PH
  • EZO-EC

Sensoren (passend zu EZO Boards):

  • Temperatur
  • Ph-Wert
  • EC-Wert
  • Wasserstandsensor

Pumpen:
2 x EZO-PMP ( Peristaltic Pump) 1x für Ph-Down und 1x für Düngekonzentrat

Aufbau:

EZO-RTD port 1
EZO-PH port 2
EZO-EC port 3
EZO-PMP (Ph-Down) port 6
EZO-PMP (Dünger) port 7

Wasserstandsensor habe ich noch nicht integriert, da ich leider noch nicht weiß wie (gerne Hilfe hierbei).

ESP32 Board ist über SCL, SDA, 3,3V und GND am T1 Board verbunden.

Strom kommt über 5 V Netzteil über Micro USB an das T1 Board
Strom kommt über USB C an ESP 32
Strom kommt über 12 V Netzteil direkt an beide Pumpen (Pumpen haben einen separaten Strom Anschluss, da 12 V.

Leider schaffe ich es nicht die Yaml-Datei so zu schreiben, dass er nicht meckert und ich finde den Fehler einfach nicht.

esphome:
  name: esphome-nft
  friendly_name: ESPHome_NFT

# ESP32 Konfiguration
esp32:
  board: esp32dev
  framework:
    type: arduino

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  ap:
    ssid: "Esphome-Nft Fallback"
    password: "fallbackpass"

captive_portal:

# Logging aktivieren
logger:

# Home Assistant API aktivieren
api:
  encryption:
    key: 

# OTA Konfiguration
ota:
  platform: esphome
  password:   # Dein OTA-Passwort

# I2C Konfiguration für Kommunikation mit Whitebox T1
i2c:
  id: bus_a
  sda: GPIO21
  scl: GPIO22
  scan: true

# Sensoren (pH, EC und Temperatur)
sensor:
  - platform: ezo
    address: 99
    name: "pH Wert"
    id: ph_wert
    update_interval: 60s

  - platform: ezo
    address: 100
    name: "EC Wert"
    id: ec_wert
    update_interval: 60s

  - platform: ezo
    address: 102
    name: "Wassertemperatur"
    id: wassertemp
    update_interval: 60s

# Steuerung der Pumpen (PH-Down und Dünger)
switch:
  - platform: ezo_pmp
    id: ph_down_pump
    name: "PH Down Pumpe"
    address: 111
    i2c_id: bus_a

  - platform: ezo_pmp
    id: duenger_pumpe
    name: "Dünger Pumpe"
    address: 112
    i2c_id: bus_a

# Automatische pH-Korrektur mit 30 Minuten Wartezeit
interval:
  - interval: 5min
    then:
      - lambda: |-
          static bool wartezeit = false;
          static unsigned long letzter_eingriff = 0;

          float ph = id(ph_wert).state;
          unsigned long jetzt = millis();

          if (!wartezeit && ph > 6.5) {
            ESP_LOGI("pH-Regelung", "pH ist %.2f – PH-Down wird aktiviert.", ph);
            id(ph_down_pump).turn_on();
            delay(1000);  // 1 Sekunde Pumpenlaufzeit (anpassbar)
            id(ph_down_pump).turn_off();
            letzter_eingriff = jetzt;
            wartezeit = true;
          }

          if (wartezeit && (jetzt - letzter_eingriff > 1800000)) { // 30 Minuten
            ESP_LOGI("pH-Regelung", "30 Minuten vergangen – Wartezeit beendet.");
            wartezeit = false;
          } else if (wartezeit) {
            ESP_LOGI("pH-Regelung", "Wartezeit aktiv. Noch %.0f Minuten.", (1800000 - (jetzt - letzter_eingriff)) / 60000.0);
          }

Kann mir jemand helfen?
Entweder er frisst die ezo_pmp platform nicht oder er will die platform esphome beim ota nicht.

Hier die Fehlermeldung:

INFO ESPHome 2025.4.1
INFO Reading configuration /config/esphome/esphome-nft.yaml...
INFO Unable to import component ezo_pmp.switch: No module named 'esphome.components.ezo_pmp.switch'
INFO Unable to import component ezo_pmp.switch: No module named 'esphome.components.ezo_pmp.switch'
Failed config

switch.ezo_pmp: [source /config/esphome/esphome-nft.yaml:63]
  
  Platform not found: 'switch.ezo_pmp'.
  platform: ezo_pmp
  id: ph_down_pump
  name: PH Down Pumpe
  address: 111
  i2c_id: bus_a
switch.ezo_pmp: [source /config/esphome/esphome-nft.yaml:69]
  
  Platform not found: 'switch.ezo_pmp'.
  platform: ezo_pmp
  id: duenger_pumpe
  name: Dünger Pumpe
  address: 112
  i2c_id: bus_a

Ich verstehe das nicht, es wird eigentlich alles von ESPHome unterstützt, selbst die Pumpen: Atlas Scientific Peristaltic Pump — ESPHome

Benötige dringend Hilfe.
Dankeschön
Gruß
Oli

Hi,

ich habs nur kurz überflogen aber die Fehlermeldung zeigen ja auf Zeile 63 und 69 in deinem YAML und dort eben auf “Platform not found: ‘switch.ezo_pmp’.”

Die hast du nicht definiert.
Sowas wie in der Doku vermisse ich

ezo_pmp:
  id: ezo_pmp

Hallo Tuxtom,

vielen Dank für die Antwort. Wenn ich jedoch

ezo_pmp:
  id: ezo_pmp

davor setzte, ändert sich auch nichts. Ich bin leider überhaupt kein Programmierer und verstehe daher relativ wenig was den Aufbau der Datei betrifft.

Ich glaube die Lösung steht auf der von dir verlinkten Seite weiter oben, die muss vermuttlich die Pumpe mit ihrer I2C Andresse anders definieren, wie ganz auf der Seite im Beispiel.

Ist aber nur ne Vermutung

Kannst du mich hier unterstützen? Ich habe wirklich keine Plan von dem ganzen. Für mich ist die Verlinkte seite unverständlich :frowning:

Schwer, weil ich kenn die Pumpen nicht und ohne das zu testen fast unmöglich.
Der Demo-Code vom Hersteller ist nicht verfügabr, die ganzen Links laufen ins leere - das wäre ne gute Quelle gewesen.

Ansonsten fragte im engl HomeAssistant Forum, da gibt es eine ESPHome Untergruppe und schon ein paar Artikel mit dem Pumpen bei Aquarien

Schau mal hier, vielleicht hilft das, hat mir die KI gerade rausgeworfen:

esphome:
  name: ezo_i2c_steuerung
  platform: ESP32
  board: esp32dev

wifi:
  ssid: "DEIN_WIFI"
  password: "DEIN_PASSWORT"

captive_portal:
logger:
api:
ota:

i2c:
  sda: GPIO21
  scl: GPIO22
  scan: true
  id: bus_a

# === SENSOR-KOMPONENTEN ===
sensor:
  - platform: ezo
    name: "pH-Wert"
    address: 0x63
    update_interval: 15s

  - platform: ezo
    name: "Leitfähigkeit"
    address: 0x64
    update_interval: 15s

  - platform: ezo
    name: "Wassertemperatur"
    address: 0x66
    update_interval: 15s

# === EZO-PMP PUMPEN (I2C) ===
# Pumpe 1: I2C-Adresse 0x6A
# Pumpe 2: I2C-Adresse 0x6B
# Beispielbefehl: "D,5" -> dosiere 5 ml

switch:
  - platform: template
    name: "Pumpe 1 (5ml)"
    turn_on_action:
      - lambda: |-
          const uint8_t addr = 0x6A;
          const char *cmd = "D,5";
          id(bus_a).write(addr, (const uint8_t *)cmd, strlen(cmd));
    turn_off_action:
      - logger.log: "Pumpe 1 Befehl gesendet"

  - platform: template
    name: "Pumpe 2 (3ml)"
    turn_on_action:
      - lambda: |-
          const uint8_t addr = 0x6B;
          const char *cmd = "D,3";
          id(bus_a).write(addr, (const uint8_t *)cmd, strlen(cmd));
    turn_off_action:
      - logger.log: "Pumpe 2 Befehl gesendet"

Wobei ich aber ehr glaube, das dies aus der ESPHome Doku die Lösung ist, da masst dann eben zwei von mit unterschiedlichen Namen / I2C Adressen

ezo_pmp:
  id: ezo_pmp
  address: 103  # Default Address for the EZO-PMP.
  update_interval: 60s

Habe jetzt nach langem herumprobieren das System zum laufen gebracht, jetzt muss ich die Sensoren noch kalibrieren, das kann ich jedoch erst nächstes Wochenende durchführen. Ich werde anschließend den Code und die Config posten. Rein über den ESPHome habe ich es jedoch nicht zum laufen bekommen, somit liest jetzt ein Arduino die Sensoren und der ESPHome greift auf die Daten des Arduino zu und leitet diese an Homeassistant weiter. Ich werde nächstes Wochenende auch testen ob die Befehlsweitergabe klappt (z.B. pumpe 1 kurz anschalten über Homeassistant).
Trotzdem danke für die Hilfe. Eventuell benötige ich nächste Woche weitere Hilfe mal schauen :slight_smile: