Die ultimative Bewässerungssteuerung mit ESPHome

Vor kurzem wurden „Sprinkler“ für ESPHome vorgestellt, also genau für die Bedürfnisse ausgerichtet, die man an eine moderne und vor allem smartes Bewässerungssystem hat. ESPHome 2022.8.0 - 17th August 2022 — ESPHome

Das Besondere daran ist, dass man alles über einen günstigen ESP32 Mikrocontroller betreibt.

Funktionsweise

Das ESPHome Bewässerungssystem hat die gleichen (wenn nicht sogar) noch mehr Funktionen wie die namhaften Hersteller. Es ist also eine gute Alternative zu Bewässerungscomputern von Rain Bird, Hunter und Gardena sowie Bewamat von BTW.

Hauptventil und Pumpen

Neben den normalen Wasser-Ventilen kann auch zusätzlich Pumpen integriert werden. So können Sie zum Beispiel auch das Wasser aus Ihrer Zisterne, dem Tiefenbrunnen sowie dem normalen Brunnen pumpen.

Pause und Wiederaufnahme

Auch das Pausieren eines aktiven Zyklus ist möglich, wenn zum Beispiel der Tiefenbrunnen sich erst mal wieder befüllen muss, nachdem er leergepumpt wurde.

Wiederholung von Bewässerung Zyklen

Ein Besserungszyklus kann öfter wiederholt werden. Ideal für heiße Tage, an dem der Garten etwas mehr Wasser benötigt.

Mehrere Bewässerungs-Zonen auf einem ESP

Es können mehrere Bewässerungs-Zonen über einen ESP Mikrocontroller realisiert werden. Man kann zum Beispiel eine Zone als Rasen definieren und eine andere als Blumenbeet. Diese beiden Zonen können dann individuell angesprochen werden.

Ventilsteuerung

Es kann eingestellt werden, ob und wie lange sich beim Einschalten des nächsten Ventils eine Überlappung oder eine Pause eingelegt werden soll.

Pausen-Dauer

So kann zum einen sichergestellt werden, dass das vorherige Ventil auch vollständig geschlossen wurde, bevor das nächste Ventil öffnet und auch genügend Druck zur Verfügung steht.

Überlappungs-Dauer

Diese soll Wasserschläge verhindern, die oft nach dem Ausschalten der Pumpe vorkommt.

Integration in Home Assistant

Natürlich ist die Integration in Home Assistant problemlos möglich, denn ESPHome gehört zu https://www.nabucasa.com/ (der kommerziellen Seite von Home Assistant)

Add-on

Das dazugehörige Add-on ist in wenigen Schritten installiert und danach sofort einsatzbereit. Hier ist eine ausführliche Anleitung zu finden. Getting Started with ESPHome and Home Assistant — ESPHome

Hier können Sie direkt ESPHome installieren:
Open your Home Assistant instance and show the dashboard of a Supervisor add-on.

Erstes ESP Board vorbereiten

Nachdem das Add-on installiert ist, können Sie sofort loslegen und Ihr erstes Board programmieren. Der Installer führt Sie durch die einzelnen Schritte.

Beispiel

Auf der Seite von ESPHome sind unterschiedliche Beispiele aufgeführt, die Sie einfach kopieren können.

Ich habe mir aus den unterschiedlichen Beispielen eine eigene Konfiguration zusammengebaut:
Zwei Pumpen, 5 Ventile, einstellbare Zeiten der einzelnen Ventile mit Überlappungs-Dauer sowie einigen API Services z.B. zur Steuerung von mehreren Zyklen.
Zudem noch die Möglichkeiten, zum nächsten oder vorherigem Ventil zu springen, die Bewässerung zu pausieren und wieder aufzunehmen sowie die Bewässerung „rückwärts“ ablaufen zu lassen:

Hier ist der Code für ESPHome

esphome:
  name: bewaesserung

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "6zeG5VCmbWhPbYATSekLlTWG4qSR79dXoBTz0vnM4Ck="
  services:
    - service: set_multiplier
      variables:
        multiplier: float
      then:
        - sprinkler.set_multiplier:
            id: lawn_sprinkler_ctrlr
            multiplier: !lambda 'return multiplier;'
    - service: start_full_cycle
      then:
        - sprinkler.start_full_cycle: lawn_sprinkler_ctrlr
    - service: start_single_valve
      variables:
        valve: int
      then:
        - sprinkler.start_single_valve:
            id: lawn_sprinkler_ctrlr
            valve_number: !lambda 'return valve;'
    - service: next_valve
      then:
        - sprinkler.next_valve: lawn_sprinkler_ctrlr
    - service: previous_valve
      then:
        - sprinkler.previous_valve: lawn_sprinkler_ctrlr
    - service: shutdown
      then:
        - sprinkler.shutdown: lawn_sprinkler_ctrlr
    - service: pause
      then:
        - sprinkler.pause: lawn_sprinkler_ctrlr
    - service: resume
      then:
        - sprinkler.resume: lawn_sprinkler_ctrlr
    - service: resume_or_full_cycle
      then:
        - sprinkler.resume_or_start_full_cycle: lawn_sprinkler_ctrlr
    - service: repeat_2
      then:
        - sprinkler.set_repeat:
            id: lawn_sprinkler_ctrlr
            repeat: 2  # would run three cycles
    - service: repeat_3
      then:
        - sprinkler.set_repeat:
            id: lawn_sprinkler_ctrlr
            repeat: 3  # would run three cycles
        
ota:
  password: "f5cf82418b6ce5a6d35c7224ff844fba"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Bewaesserung Fallback Hotspot"
    password: "SmartLiving.Rocks"

captive_portal:

sprinkler:
  - id: lawn_sprinkler_ctrlr
    main_switch: "Lawn Sprinklers"
    auto_advance_switch: "Lawn Sprinklers Auto Advance"
    reverse_switch: "Lawn Sprinklers Reverse"
    valve_overlap: 1s
    valves:
      - valve_switch: "Front Lawn"
        enable_switch: "Enable Front Lawn"
        pump_switch_id: sprinkler_pump_sw0
        run_duration: 3s
        valve_switch_id: lawn_sprinkler_valve_sw0
      - valve_switch: "Side Lawn"
        enable_switch: "Enable Side Lawn"
        pump_switch_id: sprinkler_pump_sw0
        run_duration: 3s
        valve_switch_id: lawn_sprinkler_valve_sw1
      - valve_switch: "Back Lawn"
        enable_switch: "Enable Back Lawn"
        pump_switch_id: sprinkler_pump_sw1
        run_duration: 3s
        valve_switch_id: lawn_sprinkler_valve_sw2
      - valve_switch: "Front Garden"
        enable_switch: "Enable Front Garden"
        pump_switch_id: sprinkler_pump_sw0
        run_duration: 9s
        valve_switch_id: garden_sprinkler_valve_sw0
      - valve_switch: "Back Garden"
        enable_switch: "Enable Back Garden"
        pump_switch_id: sprinkler_pump_sw1
        run_duration: 9s
        valve_switch_id: garden_sprinkler_valve_sw1

switch:
  - platform: gpio
    id: sprinkler_pump_sw0
    pin: 12
  - platform: gpio
    id: sprinkler_pump_sw1
    pin: 13
  - platform: gpio
    id: lawn_sprinkler_valve_sw0
    pin: 0
  - platform: gpio
    id: lawn_sprinkler_valve_sw1
    pin: 2
  - platform: gpio
    id: lawn_sprinkler_valve_sw2
    pin: 4
  - platform: gpio
    id: garden_sprinkler_valve_sw0
    pin: 14
  - platform: gpio
    id: garden_sprinkler_valve_sw1
    pin: 15
    
# Example configuration to set multiplier via number
number:
  - platform: template
    id: sprinkler_ctrlr_multiplier
    name: "Sprinkler Controller Multiplier"
    min_value: 0.1
    max_value: 10.0
    step: 0.1
    lambda: "return id(lawn_sprinkler_ctrlr).multiplier();"
    set_action:
      - sprinkler.set_multiplier:
          id: lawn_sprinkler_ctrlr
          multiplier: !lambda 'return x;'
          

  - platform: template
    id: sprinkler_ctrlr_duration
    name: "Sprinkler Controller Duration"
    min_value: 1
    max_value: 500
    step: 1
    lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(0);"
#    lambda: "return id(lawn_sprinkler_ctrlr).duration(0);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: lawn_sprinkler_ctrlr
          valve_number: 0
          run_duration: !lambda 'return x;'

  - platform: template
    id: sprinkler_ctrlr_duration_v_1
    name: "Sprinkler Controller Duration of Valve 1"
    min_value: 1
    max_value: 300
    step: 1
    lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(0);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: lawn_sprinkler_ctrlr
          valve_number: 0
          run_duration: !lambda 'return x;'
  - platform: template
    id: sprinkler_ctrlr_duration_v_2
    name: "Sprinkler Controller Duration of Valve 2"
    min_value: 1
    max_value: 300
    step: 1
    lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(1);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: lawn_sprinkler_ctrlr
          valve_number: 1
          run_duration: !lambda 'return x;'
  - platform: template
    id: sprinkler_ctrlr_duration_v_3
    name: "Sprinkler Controller Duration of Valve 3"
    min_value: 1
    max_value: 300
    step: 1
    lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(2);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: lawn_sprinkler_ctrlr
          valve_number: 2
          run_duration: !lambda 'return x;'
  - platform: template
    id: sprinkler_ctrlr_duration_v_4
    name: "Sprinkler Controller Duration of Valve 4"
    min_value: 1
    max_value: 300
    step: 1
    lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(3);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: lawn_sprinkler_ctrlr
          valve_number: 3
          run_duration: !lambda 'return x;'
  - platform: template
    id: sprinkler_ctrlr_duration_v_5
    name: "Sprinkler Controller Duration of Valve 5"
    min_value: 1
    max_value: 300
    step: 1
    lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(4);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: lawn_sprinkler_ctrlr
          valve_number: 4
          run_duration: !lambda 'return x;'
  - platform: template
    id: sprinkler_ctrlr_repeat_cycles
    name: "Sprinkler Repeat Cycles"
    min_value: 0
    max_value: 300
    step: 1
    mode: box
    lambda: "return id(lawn_sprinkler_ctrlr).repeat();"
    set_action:
      - sprinkler.set_repeat:
          id: lawn_sprinkler_ctrlr
          repeat: !lambda 'return x;'

Hier ist der Code für das Home Assistant Dashboard

type: vertical-stack
cards:
  - type: entities
    entities:
      - entity: number.sprinkler_controller_duration
        icon: mdi:sprinkler
      - entity: number.sprinkler_controller_duration_of_valve_1
        name: Valve 1
        icon: mdi:sprinkler
      - entity: number.sprinkler_controller_duration_of_valve_2
        name: Valve 2
        icon: mdi:sprinkler
      - entity: number.sprinkler_controller_duration_of_valve_3
        name: Valve 3
        icon: mdi:sprinkler
      - entity: number.sprinkler_controller_duration_of_valve_4
        name: Valve 4
        icon: mdi:sprinkler
      - entity: number.sprinkler_controller_duration_of_valve_5
        name: Valve 5
        icon: mdi:sprinkler
      - entity: number.sprinkler_repeat_cycles
        icon: mdi:sprinkler
    title: Bewässerungs Bereich Lawn
    show_header_toggle: false
  - type: horizontal-stack
    cards:
      - show_name: true
        show_icon: true
        type: button
        tap_action:
          action: toggle
        entity: switch.lawn_sprinklers
        name: Main Lawn
        icon: mdi:sprinkler
      - type: button
        tap_action:
          action: toggle
        entity: switch.front_lawn
        icon: mdi:sprinkler
      - type: button
        tap_action:
          action: toggle
        entity: switch.side_lawn
        icon: mdi:sprinkler
      - type: button
        tap_action:
          action: toggle
        entity: switch.back_lawn
        icon: mdi:sprinkler
      - type: button
        tap_action:
          action: toggle
        entity: switch.front_garden
        icon: mdi:sprinkler
      - type: button
        tap_action:
          action: toggle
        entity: switch.back_garden
        icon: mdi:sprinkler
  - type: horizontal-stack
    cards:
      - show_name: true
        show_icon: true
        type: button
        tap_action:
          action: call-service
          service: esphome.bewaesserung_start_full_cycle
          data: {}
          target: {}
        icon: mdi:play
        name: Start
      - show_name: true
        show_icon: true
        type: button
        tap_action:
          action: call-service
          service: esphome.bewaesserung_pause
          data: {}
          target: {}
        icon: mdi:pause-box-outline
        name: Pause
      - show_name: true
        show_icon: true
        type: button
        tap_action:
          action: call-service
          service: esphome.bewaesserung_previous_valve
          data: {}
          target: {}
        icon: mdi:skip-previous
        name: Previous
      - show_name: true
        show_icon: true
        type: button
        tap_action:
          action: call-service
          service: esphome.bewaesserung_next_valve
          data: {}
          target: {}
        entity: ''
        icon: mdi:skip-next
        name: Next
      - show_name: true
        show_icon: true
        type: button
        tap_action:
          action: call-service
          service: esphome.bewaesserung_shutdown
          data: {}
          target: {}
        icon: mdi:stop
        name: Stop
        show_state: true
      - show_name: true
        show_icon: true
        type: button
        name: Reverse
        tap_action:
          action: toggle
        entity: switch.lawn_sprinklers_reverse
        icon: mdi:keyboard-tab-reverse
  - type: horizontal-stack
    cards:
      - show_name: true
        show_icon: true
        type: button
        tap_action:
          action: call-service
          service: esphome.bewaesserung_start_full_cycle
          data: {}
          target: {}
        icon: mdi:refresh-auto
        name: Full Circle
      - show_name: true
        show_icon: true
        type: button
        tap_action:
          action: call-service
          service: esphome.bewaesserung_repeat_2
          data: {}
          target: {}
        entity: ''
        icon: mdi:numeric-2-circle-outline
        name: Repeat 2
      - show_name: true
        show_icon: true
        type: button
        tap_action:
          action: call-service
          service: esphome.bewaesserung_set_multiplier
          data: {}
          target: {}
        icon: mdi:numeric-3-box-outline
        name: Repeat 3
        show_state: true

Wie geht es weiter?

Ich bin so begeistert von dem System, dass ich als Nächstes mich an die Integration eines Displays kümmern werde. Hierüber kann man die Zeiten entsprechend anpassen und sehen, welcher Bereich und welches Ventil gerade aktiv sind.

Display

Pflanzen-Sensoren

Über spezielle Sensoren bekommt man auch Informationen wie der Zustand der Pflanzen ist. Auch hierfür gibt es aus dem Hause ESPHome entsprechende Lösung SMT100 Soil Moisture Sensor — ESPHome. Die Temperatur und die Feuchtigkeit des Bodens werden ermittelt - andere Sensoren können zudem auch noch die Sonneneinstrahlung und den Nährstoffgehalt ermitteln. (MiFlora Sensor)

Vollautomatische, sensorgesteuerte Bewässerung

Ist das System ausgestattet, mit den oben genannten Sensoren kann man das Bewässerungssystem bedarfsgerecht und individuelle für jede Pflanze steuern. Es können zum Beispiel die Zeit, wie lange das Ventil geöffnet bleiben soll, von dem Sensor angepasst werden. Auch die Wettervorhersage entweder aus dem Internet oder einer eigenen Wetterstation sind so möglich.

Spezielle Programme

Einpflanzen

Ähnlich wie bei der Waschmaschine kann man auch unterschiedliche „Programme“ definieren. Zum Beispiel benötigen Pflanzen, wenn sie frisch eingepflanzt wurden, öfter Wasser. So kann man entsprechend ein Programm Einpflanzen erstellen.

Nutzpflanzen

Auch Nutzpflanzen haben von der Saat bis zur Ernte unterschiedliche Phasen. Eine Pflanze durchläuft in der Vegetationsphase alljährlich verschiedene Entwicklungsstadien - sogenannte phänologische Phasen:

  • Knospenaustrieb

  • Blattentfaltung

  • Blüte

  • Reife Früchte

  • Farbige Blätter

  • Gefallene Blätter

In jeder dieser Phasen können auch Düngerzeiten definiert werden, um den Ertrag zu erhöhen. Auch hierfür können entsprechende Programme definiert werden.