Smarte Bewässerung mit Home Assistant

Smarte Bewässerung mit Home Assistant

Im Sommer möchte jeder Gartenbesitzer gerne dafür sorgen, dass alles schön grün ist. Das betrifft nicht nur die Blumen und Pflanzen, sondern auch den Rasen. Gleichzeitig soll aber auch nicht zuviel Wasser verschwendet werden. Wie ich die Bewässerung mit Home Assistant gelöst habe, zeige ich in diesem Artikel.

Die Hardware

  • eine funktionsfähige Home Assistant-Instanz
  • ein Bewässerungscomputer, der mit Home Assistant gesteuert werden (bspw. der Linktap G1S oder Sonoff Bewässerungssystem mit Zigbee)
  • ein Regenmesser oder Regensensor, der in Home Assistant integriert werden kann

Die Software

Nachdem die Hardware-Frage soweit geklärt ist, muss eine sinnvolle Programmierung für Home Assistant her. Ich hatte mich zuerst für die HACS-Integration Smart Irrigation entschieden. Grundsätzlich war ich damit auch einige Monate glücklich. Allerdings ist die Integration durchaus komplex und etwas fehleranfällig. Wer viele Einstellungsmöglichkeiten schätzt, wird aber sicher glücklich damit.

Es musste dann doch irgendwie was Eigenes her. Es sollte eine einfache Automation sein, die auch mit dem Wasser sparsam umgeht. Folgende Parameter sollten überwacht werden:

  • Ist an dem Tag Regen über X mm vorhergesagt?
  • Hat es an dem Tag schon über X mm geregnet?
  • Sind an dem Tag Höchst-Temperaturen über X Grad vorhergesagt?
  • War der letzte Regenguss oder Bewässerung mind. X Tage her?

Als kleines Zusatz-Feature sollte je nach Höchst-Temperatur auch die Beregnungsdauer geändert werden.

Die Vorbereitung

Zuerst benötigt man eine Wetter-Integration in Home Assistant. Standardmäßig ist die Meteorologisk Institutt (Met.no)-Integration installiert. Die Daten kommen vom norwegischen Wetterdienst und sind durchaus gut. Sollte diese Integration noch nicht vorhanden sein, einfach installieren: Unter „Einstellungen“->“Geräte & Dienste“ einfach unten rechts auf „Integration hinzufügen“ klicken und nach „Met“ suchen und installieren.

Um jetzt eine Wetter-Vorhersage für die nächsten Tage als Sensor zu erhalten, muss der folgenden Code in die configuration.yaml einfügt werden:

  - trigger:
      - platform: time_pattern
        hours: /1
    action:
      - service: weather.get_forecasts
        target:
          entity_id:
            - weather.DEINE_WETTER_ENTITY
        data:
            type: daily
        response_variable: tagesvorhersage
    sensor:
      - name: Tägliche Wettervorhersage
        unique_id: weather_entity_forecast
        state: "{{ now().isoformat() }}"
        icon: mdi:hours-24
        attributes:
          forecast: "{{ tagesvorhersage['weather.DEINE_WETTER_ENTITY'].forecast }}"

Unter „weather.DEINE_WETTER_ENTITY“ sollte die entsprechende Wetter-Entität eingetragen werden – also die von der jeweiligen Wetter-Integration. Nach einem Neustart von Home Assistant ist nun der neue Sensor „Tägliche Wettervorhersage“ vorhanden.

Die Helfer

Nun legen wir uns noch die Helfer an, die in der Automation benötigt werden. Diese werden unter „Einstellungen“ -> „Geräte & Dienste“ -> „Helfer“ erstellt. Unten rechts auf „Helfer erstellen“ klicken und entsprechenden Typ auswählen.

sensor.vorhersage_regen_heute
Vorhergesagte Regenmenge des heutigen Tages
Helfer-Typ: Template (Sensor)

{{ states.sensor.tagliche_wettervorhersage.attributes.forecast[0].precipitation }}

sensor.vorhersage_temperatur_heute
Vorhergesagte Höchsttemperatur des heutigen Tages
Helfer-Typ: Template (Sensor)

{{ states.sensor.tagliche_wettervorhersage.attributes.forecast[0].temperature }}

input_number.bewasserung_dauer
Bewässerungs-Dauer
Helfer-Typ: Zahlenwert-Eingabe

input_number.bewasserung_intervall
Pause zwischen der Bewässerung (in Tagen)
Helfer-Typ: Zahlenwert-Eingabe

binary_sensor.bewasserung_regenmenge
Schwellenwert für zu wenig Regen
Helfer-Typ: Schwellenwertsensor
– „Unterer Grenzwert“ auf 3 stellen

binary_sensor.bewasserung_temperatur
Schwellenwert für optimale Temperaturen
Helfer-Typ: Schwellenwertsensor
– „Oberer Grenzwert“ auf 20 stellen

binary_sensor.bewasserung_zeit
Sensor zur Überprüfung des Intervalls
Helfer-Typ: Template

{% set last_rain_str = states('input_datetime.letzte_bewasserung') %}
{% set interval_days = states('input_number.bewasserung_intervall') | int(1) %}

    {% if last_rain_str == 'unavailable' or last_rain_str == 'unknown' %}
      true # Annahme: Wenn kein Regen-Zeitstempel vorhanden, ist Bewässerung erlaubt
    {% else %}
      {% set last_rain_dt = as_datetime(last_rain_str) | as_local %}
      {% set now_dt = now() | as_local %}

      {# Der Zeitpunkt, ab dem Bewässerung erlaubt ist: Letzter Regen Zeitpunkt + angegebene Tage #}
      {% set irrigation_allowed_from = last_rain_dt + timedelta(days=interval_days) %}

      {# Prüfe, ob der aktuelle Zeitpunkt (now_dt) gleich oder nach dem erlaubten Zeitpunkt liegt #}
      {{ now_dt >= irrigation_allowed_from }}
    {% endif %}

Die Automation

Für die eigentliche Bewässerung mit Home Assistant habe ich folgende Automation verwendet:

alias: Garten - Bewässerung des Rasens
description: Programmierung zur regelmäßigen Bewässerung.
triggers:
  - at: "06:30:00"
    trigger: time
    id: start-bewaesserung
    alias: Starte Bewässerung
  - trigger: numeric_state
    entity_id:
      - sensor.regensensor_rain_today
    above: 2.9
    id: aktualisierung
    alias: Letzte Bewässerung aktualisieren
conditions: []
actions:
  - alias: Vorgang der Bewässerung
    if:
      - condition: and
        conditions:
          - condition: trigger
            id:
              - start-bewaesserung
          - condition: state
            entity_id: binary_sensor.bewasserung_regenmenge
            state: "on"
          - condition: state
            entity_id: binary_sensor.bewasserung_temperatur
            state: "on"
          - condition: state
            entity_id: binary_sensor.bewasserung_zeit
            state: "on"
    then:
      - action: input_datetime.set_datetime
        metadata: {}
        data:
          datetime: "{{ now().strftime('%Y-%m-%d %H:%M') }}"
        target:
          entity_id: input_datetime.letzte_bewasserung
        alias: Letzte Bewässerung aktualisieren
      - alias: Dauer festlegen
        choose:
          - conditions:
              - condition: numeric_state
                entity_id: sensor.vorhersage_temperatur_heute
                below: 25
            sequence:
              - alias: "Dauer festlegen: 5"
                action: input_number.set_value
                metadata: {}
                data:
                  value: 5
                target:
                  entity_id: input_number.bewasserung_dauer
          - conditions:
              - condition: numeric_state
                entity_id: sensor.vorhersage_temperatur_heute
                below: 28
                above: 25
            sequence:
              - alias: "Dauer festlegen: 8"
                action: input_number.set_value
                metadata: {}
                data:
                  value: 8
                target:
                  entity_id: input_number.bewasserung_dauer
          - conditions:
              - condition: numeric_state
                entity_id: sensor.vorhersage_temperatur_heute
                below: 30
                above: 28
            sequence:
              - alias: "Dauer festlegen: 10"
                action: input_number.set_value
                metadata: {}
                data:
                  value: 10
                target:
                  entity_id: input_number.bewasserung_dauer
          - conditions:
              - condition: numeric_state
                entity_id: sensor.vorhersage_temperatur_heute
                above: 30
            sequence:
              - alias: "Dauer festlegen: 13"
                action: input_number.set_value
                metadata: {}
                data:
                  value: 13
                target:
                  entity_id: input_number.bewasserung_dauer
      - metadata: {}
        data: {}
        target:
          entity_id: switch.water_switch
        alias: Bewässerung einschalten
        action: switch.turn_on
      - delay:
          minutes: "{{states(\"input_number.bewasserung_dauer\")}}"
        alias: Verzögerung mit Bewässerungsdauer
      - alias: Bewässerung ausschalten
        target:
          entity_id:
            - switch.water_switch
        data: {}
        action: switch.turn_off
      - metadata: {}
        data:
          title: Garten
          message: >-
            Bewässerung wurde für {{states('input_number.bewasserung_dauer')}}
            Minuten ausgelöst.
        action: persistent_notification.create
  - alias: Letzte Bewässerung aktualisieren
    if:
      - condition: trigger
        id:
          - aktualisierung
    then:
      - action: input_datetime.set_datetime
        metadata: {}
        data:
          datetime: "{{ now().strftime('%Y-%m-%d %H:%M') }}"
        target:
          entity_id: input_datetime.letzte_bewasserung
      - metadata: {}
        data:
          title: Garten
          message: >-
            Bewässerung wurde verschoben.
        action: persistent_notification.create
mode: single

Wenn man nun innerhalb der Automationen von der YAML-Ansicht auf den visuellen Editor umschaltet, sieht man die fertige Automation. Nur noch die Entitäten für den Regensensor und den Bewässerungscomputer müssen angepasst werden. Ansonsten sollte alles stimmen!

Neben den notwendigen Anpassungen, kann man übrigens hier auch die Uhrzeit einstellen, an der die Bewässerung ausgelöst werden soll.

Das Dashboard

Damit man immer sehen kann, welcher Zustand die Bewässerung hat, kann man mit Hilfe der Kacheln die folgende Ansicht basteln:

In meinem Fall habe ich die Felder so programmiert, dass nur zwei wirklich bedient werden können: „Automatik“ und „Intervall“. Die untere Reihe hat jeweils ein grünes Häkchen, wenn die Vorgabe erfüllt ist. Erst wenn alle erfüllt sind, läuft die Automation durch. Die Dauer der Bewässerung wird von der Automation automatisch gesetzt.

Das wars! Habt Ihr noch Fragen oder Anregungen zu meiner Bewässerung mit Home Assistant? Hinterlasst einfach einen Kommentar. Ansonsten freue ich mich natürlich immer über jedes Feedback.


Schreibe einen Kommentar

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