Bewässerung im Garten: Vom starren System zur intelligenten Lösung

Die Bewässerung des eigenen Gartens klingt im ersten Moment nach einer simplen Aufgabe – bis man merkt, wie unterschiedlich die Anforderungen tatsächlich sind. Genau das war bei mir der Fall: Zwei getrennte Rasenflächen, mehrere Pflanzbereiche und überall andere Bedingungen.

Ein im Rasen versenkter Sprinkler bewässert eine Grünfläche mit einem flachen Wasserfächer
Automatisierte Rasenbewässerung mit einem Versenkregner

Mit der Zeit wurde klar: Eine einfache, zentrale Steuerung reicht hier nicht aus. Also habe ich angefangen, mein System Schritt für Schritt zu hinterfragen – und letztlich komplett neu aufzubauen.

Warum klassische Bewässerungssysteme schnell an ihre Grenzen kommen

Viele klassische Bewässerungssysteme arbeiten nach einem einfachen Prinzip: feste Zeitpläne. Einmal eingestellt, laufen sie zuverlässig – egal ob es geregnet hat oder die Temperaturen plötzlich sinken.

Genau hier liegt aber das Problem. In der Praxis führt das oft dazu, dass entweder zu viel oder zu wenig bewässert wird. Nach einem regnerischen Tag läuft die Anlage trotzdem weiter, während an heißen Tagen die voreingestellte Laufzeit nicht ausreicht.

Mein Garten: Anforderungen und Herausforderungen

Mein Garten ist alles andere als homogen. Die beiden Rasenflächen sind nicht nur räumlich getrennt, sondern unterscheiden sich auch deutlich in ihrer Lage. Während ein Bereich den Großteil des Tages in der Sonne liegt, bekommt der andere nur zeitweise direkte Einstrahlung ab.

Entsprechend unterschiedlich ist auch der Wasserbedarf. Der sonnige Bereich trocknet deutlich schneller aus, während der schattigere Teil länger Feuchtigkeit hält. Hinzu kommen mehrere Pflanzbereiche mit ganz eigenen Anforderungen – von durstigen Beeten bis hin zu Pflanzen, die mit deutlich weniger Wasser auskommen.

Schnell wurde klar: Eine einheitliche Bewässerungslösung würde hier zwangsläufig zu Kompromissen führen.

Transparenz-Check Damit ich diesen Blog werbefrei halten kann, verwende ich Affiliate-Links (mit * markiert). Wenn du darüber etwas kaufst, erhalte ich eine kleine Provision von Amazon – für dich ändert sich am Preis rein gar nichts. Danke für deinen Support meiner Projekte!

Warum ich mich von meinem bisherigen System verabschiedet habe

Zu Beginn habe ich auf ein klassisches Bewässerungssystem gesetzt und dabei Komponenten von Gardena verwendet – konkret den Gardena smart Water Control* (Werbung) in Kombination mit dem Gardena Wasserverteiler* (Werbung). Die Einrichtung war unkompliziert und das System lief grundsätzlich zuverlässig. Gerade für einfache Gärten ist das sicherlich eine solide Lösung.

In meinem Fall haben sich jedoch schnell die Grenzen gezeigt. Der eingesetzte Wasserverteiler bietet maximal sechs Ausgänge – für meinen Garten mit mehreren Rasen- und Pflanzbereichen war das von Anfang an knapp bemessen.

Zusätzlich kam ein Gardena Bodenfeuchtesensor* (Werbung) zum Einsatz. Dieser konnte allerdings nur einen einzelnen Bereich abdecken, wodurch die gemessenen Werte nicht wirklich repräsentativ für den gesamten Garten waren. Das führte dazu, dass ich trotz vorhandener Sensorik keine wirklich bedarfsgerechte Steuerung umsetzen konnte. Während ein Bereich möglicherweise noch ausreichend feucht war, konnte ein anderer bereits deutlich zu trocken sein.

In meiner damaligen Konfiguration arbeitete die Bewässerung überwiegend mit festen Zeitplänen. Kurzfristige Wetteränderungen wurden dabei nicht ausreichend berücksichtigt. Deshalb musste ich Laufzeiten regelmäßig manuell anpassen oder die Bewässerung vorübergehend deaktivieren.

Für meinen Garten war daher eine flexiblere Lösung sinnvoll, die sich besser an die Bedingungen der einzelnen Bereiche anpassen lässt.

Die neue Lösung: Smarte Gartenbewässerung mit Home Assistant

Der entscheidende Schritt war die Umstellung auf ein modulares, smartes System. Statt einer zentralen Steuerung, die alles gleich behandelt, wird die Bewässerung jetzt in einzelne, unabhängig steuerbare Kreisläufe aufgeteilt.

Gesteuert wird das Ganze über Home Assistant, das als zentrale Plattform alle Komponenten miteinander verbindet.

Konkret setze ich dabei auf den SONOFF Bewässerungscomputer SWV-BSP* (Werbung) , eine ECOWITT Wetterstation GW1101* (Werbung) sowie den ECOWITT Bodenfeuchtigkeitssensor WH51* (Werbung).

Diese Kombination ermöglicht es mir, die Bewässerung zentral zu steuern und anhand lokaler Messwerte automatisiert freizugeben oder auszusetzen.

Sonoff Bewässerungscomputer

Drei Sonoff Bewässerungscomputer für drei Individuelle Bewässerungs-Kreisläufe

Update: Die neue Modell-Generation (Hydro ONE)

In meinem Setup verwende ich noch das bewährte Modell SONOFF SWV-BSP. Mittlerweile hat der Hersteller mit dem SONOFF Hydro ONE (Modell: SWV-ZFE)* (Werbung) eine überarbeitete Nachfolgegeneration auf den Markt gebracht.

Für die smarte Logik in Home Assistant macht das neue Modell keinen Unterschied, da die Sensoren und Automatisierungen die Steuerung übernehmen. Allerdings bringt die neue Version zwei spürbare Hardware-Verbesserungen mit: Sie besitzt einen robusten Wasseranschluss aus Messing statt Kunststoff und verfügt über einen Bluetooth-Notmodus. Sollte das Zigbee-Signal im Garten einmal ausfallen, lässt sich das Ventil so im Nahbereich trotzdem noch per Smartphone bedienen.

Bei einer Neuanschaffung kann die neuere ZFE-Version wegen des Messinganschlusses und der zusätzlichen Bluetooth-Bedienung interessant sein. Achte auf die passende Ausführung: Die US-Version ZFU ist nicht für die üblichen europäischen Anschlüsse vorgesehen.

Praxis: Durchfluss und Druck beim Sonoff Ventil

In der Praxis spielt beim Einsatz des SONOFF Bewässerungscomputer SWV-BSP* (Werbung) nicht nur die Steuerung eine Rolle, sondern auch der tatsächliche Wasserdurchfluss.

Für viele typische Anwendungen kann der Durchfluss ausreichen. Bei Rasensprengern hängt das jedoch von Wasserdruck, Leitungslänge, Anschlüssen und dem Wasserbedarf der verwendeten Regner ab. Bei einer Tropfbewässerung ist meist weniger Durchfluss erforderlich als bei Rasensprengern. Ein zum jeweiligen System passendes Basisgerät beziehungsweise ein Druckminderer* (Werbung) reduziert den Eingangsdruck und unterstützt eine gleichmäßige Wasserabgabe.

Laut Hersteller liegt der maximale Durchfluss bei etwa 28 Litern pro Minute – allerdings unter optimalen Bedingungen mit einem Wasserdruck von rund 5 bar. Im Alltag sieht das meist etwas anders aus. Je nach Hausanschluss liegt der Druck häufig eher bei 2 bis 3 bar, wodurch sich der tatsächliche Durchfluss entsprechend reduziert.

Zusätzlich beeinflussen auch Faktoren wie Schlauchlänge oder verwendete Anschlüsse die Leistung. Ein längerer Gartenschlauch oder der Einsatz von Adaptern kann den Durchfluss etwas verringern.

In der Praxis bedeutet das: Statt zu viele Verbraucher gleichzeitig zu betreiben, lohnt es sich, die Bewässerung sinnvoll aufzuteilen. Genau das war auch einer der Gründe für mein Setup mit mehreren Kreisläufen.

Ein praktischer Hinweis zum Schluss: Im Winter sollte das Ventil unbedingt abgebaut werden. Restwasser im Inneren kann bei Frost zu Schäden am Gehäuse führen.

Aufteilung in 7 Bewässerungskreisläufe

Insgesamt habe ich meinen Garten in sieben Kreisläufe unterteilt: drei für den Rasen und vier für unterschiedliche Pflanzbereiche.

Diese Aufteilung war der Schlüssel, um die unterschiedlichen Anforderungen überhaupt sinnvoll abbilden zu können.

Rasenflächen: Warum 3 Zonen sinnvoll sind

Die Aufteilung des Rasens in drei separate Zonen ergibt sich nicht nur aus der räumlichen Trennung, sondern vor allem aus den unterschiedlichen Bedingungen vor Ort.

Für die Bewässerung setze ich hier auf Versenkregner, konkret beispielsweise den Gardena Versenkregner SD80* (Werbung) oder Gardena Versenkregner SD30* (Werbung). Diese eignen sich besonders gut für Rasenflächen, da sie gleichmäßig große Bereiche abdecken und sich bei Nichtbenutzung vollständig im Boden versenken.

Durch die getrennte Steuerung kann jeder Bereich genau so bewässert werden, wie es notwendig ist – abhängig von Sonneneinstrahlung und Feuchtigkeitsbedarf.

Versenkregner

Pflanzenbereiche: Unterschiedliche Bedürfnisse berücksichtigen

Noch deutlicher werden die Unterschiede bei den Pflanzen. Einige Bereiche benötigen regelmäßig Wasser, andere kommen mit deutlich weniger aus.

Hier setze ich auf Tropfbewässerung, beispielsweise mit dem Gardena Micro-Drip-System* (Werbung) . Dieses gibt das Wasser gezielt und langsam direkt an die Pflanzen ab.

Der große Vorteil: Es geht deutlich weniger Wasser durch Verdunstung verloren und die Pflanzen werden gleichmäßiger versorgt.

Durch die Aufteilung in eigene Kreisläufe kann ich diese Unterschiede gezielt berücksichtigen und Über- oder Unterversorgung vermeiden.

Wetterdaten einbeziehen

Eine Nahaufnahme einer an einem Metallmast montierten Ecowitt Wetterstation vor klarem blauen Himmel.
Die Ecowitt-Wetterstation liefert lokale Wetterdaten an Home Assistant

Über meine ECOWITT Wetterstation GW1101* (Werbung) werden aktuelle Wetterdaten wie Niederschlag, Temperatur und Luftfeuchtigkeit direkt in das System eingebunden.

Zusätzlich nutze ich auch Wettervorhersagen (OpenWheatherMap Integration) als Grundlage für die Steuerung. Diese geben zwar einen guten Überblick über die kommenden Stunden und Tage, sind jedoch nicht immer zuverlässig.

In der Praxis zeigen sich jedoch immer wieder Abweichungen zwischen Vorhersage und tatsächlichem Wetter. Angekündigter Regen bleibt aus oder tritt zu anderen Zeiten als erwartet auf. Wird die Bewässerung ausschließlich auf Basis solcher Prognosen gesteuert, kann das zu ungenauen oder ineffizienten Ergebnissen führen.

Deshalb kombiniere ich beide Ansätze: Die Wettervorhersage dient als zusätzliche Orientierung, während die lokalen Messwerte der Wetterstation die verlässliche Entscheidungsgrundlage bilden. Wenn beispielsweise Regen angekündigt ist, die Wetterstation aber keinen tatsächlichen Niederschlag registriert, wird die Bewässerung entsprechend nicht vorschnell deaktiviert. So entsteht eine deutlich robustere Steuerung, die nicht nur auf Prognosen vertraut, sondern reale Bedingungen mit einbezieht.

Bodenfeuchte als Entscheidungsbasis

Für jede Zone nutze ich einen ECOWITT Bodenfeuchtigkeitssensor WH51* (Werbung), der direkt im jeweiligen Bereich platziert ist.

Im Gegensatz zu meiner früheren Lösung erhalte ich damit für jede Zone einen eigenen Messwert. Dieser bildet die lokalen Bedingungen besser ab als ein einzelner Sensor für den gesamten Garten. Die Bewässerung wird dadurch nicht mehr pauschal, sondern anhand des Messwerts der jeweiligen Zone gesteuert.

Hinweis: Es wird eine Ecowitt Wetterstation benötigt.

ECOWITT Bodenfeuchtigkeitssensor WH51
Zigbee Bodenfeuchtigkeitssensor

Alternativ gibt es auch den deutlich günstigeren Zigbee-Bodenfeuchtesensor* (Werbung), der sich problemlos in viele Smart-Home-Systeme integrieren lässt und für einzelne Zonen eine einfache Lösung darstellen kann.

In meinem Setup lieferte der Ecowitt-Sensor konsistentere Messwerte als die getestete Zigbee-Alternative. Für meine Automatisierung war dieses gleichmäßigere Verhalten wichtiger als der günstigere Preis.

Individuelle Zeitfenster und Bedingungen pro Zone

Für jeden Kreislauf lassen sich eigene Start- und Endzeiten festlegen. Ob die Bewässerung innerhalb eines solchen Zeitfensters startet, hängt zusätzlich von Bodenfeuchte, gemessener Regenmenge und Vorhersage ab.

Dadurch können die Zeitfenster und Grenzwerte an die Anforderungen der einzelnen Bereiche angepasst werden.

Vorteile im Alltag

Im Alltag läuft die Bewässerung weitgehend automatisch. Vor jedem Start prüft Home Assistant die hinterlegten Grenzwerte für Bodenfeuchte, Niederschlag und Wettervorhersage.

Dadurch muss ich nur noch selten eingreifen und habe gleichzeitig den Eindruck, dass der Garten insgesamt gleichmäßiger und stabiler versorgt wird.

  • Bedarfsgerechte Bewässerung statt starrer Zeitpläne
  • Potenziell geringerer Wasserverbrauch durch das Aussetzen unnötiger Bewässerung
  • Deutlich weniger manueller Aufwand im Alltag

Fazit: Lohnt sich der Umbau?

Für meinen Garten hat sich der Umbau auf eine zonenbasierte Steuerung mit Home Assistant bewährt.

Besonders bei Gärten mit unterschiedlichen Zonen und Anforderungen spielt dieser Ansatz seine Stärken aus, da jede Fläche individuell versorgt werden kann, ohne dass ständig manuell nachjustiert werden muss.

Für mich bietet das System vor allem mehr Flexibilität und weniger manuellen Aufwand. Dem stehen allerdings zusätzliche Hardware, Einrichtung und Wartung gegenüber.

So habe ich die Bewässerung in Home Assistant umgesetzt

Die eigentliche Logik hinter der Bewässerung läuft in Home Assistant. Dabei kombiniere ich Bodenfeuchte, gemessene Regenmenge und Vorhersagen, um zu entscheiden, ob die Bewässerung zum festgelegten Zeitpunkt starten soll. Die Dauer ergibt sich aus der konfigurierten Start- und Endzeit.

Hinweis aus der Praxis Die Zeitfenster meiner Kreisläufe sind so geplant, dass sie sich nicht überschneiden. Dadurch läuft normalerweise nur ein Kreislauf gleichzeitig.

Steuerung über das Home Assistant Dashboard

Vergleich der Home Assistant Oberflächen: Links Status-Dashboard, rechts Admin-Einstellungen
Links: Statuswerte für das Dashboard | Rechts: Admin-Bereich zur Konfiguration der Bewässerungskreisläufe

Neben der eigentlichen Automatisierung spielt auch die Benutzeroberfläche eine wichtige Rolle in meinem Setup.

Ich habe sie bewusst in zwei Bereiche aufgeteilt: ein Dashboard für den täglichen Überblick und einen separaten Admin-Bereich für detaillierte Einstellungen.

Das Dashboard läuft auf meinem Tablet und zeigt die wichtigsten Informationen auf einen Blick. Es ist auf schnelle Bedienung und Übersicht ausgelegt. Im Admin-Bereich auf einer Unterseite werden Bewässerungszeiten sowie Grenzwerte für Bodenfeuchte, gemessenen Niederschlag und die Regenvorhersage konfiguriert.

So bleibt die Oberfläche im Alltag schlank, während Anpassungen bei Bedarf gezielt vorgenommen werden können – ganz ohne Änderungen im YAML.

Hinweis zur Code-Darstellung

Die YAML-Beispiele in diesem Artikel sind bewusst so dargestellt, dass sie möglichst gut nachvollziehbar und einfach anpassbar bleiben. Daher habe ich die Formatierung und Struktur im Code weitgehend beibehalten.

Außerdem wurde der Code absichtlich nicht zu stark zusammengefasst oder abstrahiert. So lassen sich die einzelnen Schritte und Logiken besser verstehen und bei Bedarf leichter auf das eigene Setup übertragen oder anpassen. Ziel ist es, den Einstieg in die Umsetzung zu erleichtern und nicht eine möglichst kompakte, aber schwer verständliche Darstellung zu erzeugen.

Für die Umsetzung des Dashboard-Layouts können zusätzlich weitere Home-Assistant-Integrationen bzw. über HACS installierbare Custom Cards erforderlich sein.

Admin-Bereich: Bewässerungszeiten und Limits definieren

In meinem Home-Assistant-Dashboard können für jeden Bewässerungskreislauf zwei Bewässerungszeiten festgelegt werden. So lässt sich flexibel auf unterschiedliche Wetterbedingungen oder längere Trockenperioden reagieren, ohne die Automatisierung grundlegend ändern zu müssen. Zusätzlich können für jeden Kreislauf individuelle Grenzwerte für Bodenfeuchte und Regenmenge definiert werden.

Die zugrunde liegende Logik bleibt dabei stets gleich. Zur besseren Veranschaulichung zeige ich im Folgenden beispielhaft nur einen Kreislauf.

Smarte Gartenbewässerung mit Home Assistant. Admin-Bereich

Für weitere Kreisläufe muss dieser Code nur dupliziert werden und "k1" durch "k2", "k3" usw. ersetzt werden.

YAML-Konfiguration anzeigen: Admin-Bereich
type: vertical-stack
cards:
  - type: custom:bubble-card
    card_type: separator
    name: Kreislauf 1 - Blumen
    icon: mdi:flower
  - type: vertical-stack
    cards:
      - type: horizontal-stack
        cards:
          - type: custom:button-card
            show_icon: false
            show_state: false
            name: An/Aus
            styles:
              card:
                - width: 80px
                - border: none
                - background: none
                - box-shadow: none
                - margin-right: "-20px"
                - margin-bottom: "-10px"
              name:
                - font-size: 12px
                - font-weight: bold
                - text-align: center
          - type: custom:button-card
            show_icon: false
            show_state: false
            name: Start
            styles:
              card:
                - border: none
                - background: none
                - box-shadow: none
                - margin-bottom: "-10px"
              name:
                - font-size: 12px
                - font-weight: bold
                - text-align: center
          - type: custom:button-card
            show_icon: false
            show_state: false
            name: Ende
            styles:
              card:
                - border: none
                - background: none
                - box-shadow: none
                - margin-bottom: "-10px"
              name:
                - font-size: 12px
                - font-weight: bold
                - text-align: center
        card_mod:
          style: |
            #root > * {
              margin: 0 2px !important;
            }
  - type: custom:vertical-stack-in-card
    card_mod:
      style: |
        ha-card {
          border-radius: 100px;
          padding-top: 3px;
          height: 45px;
        }
    cards:
      - type: horizontal-stack
        cards:
          - type: custom:button-card
            entity: input_boolean.bewaesserung_k1_t1_aktiv
            icon: mdi:toggle-switch
            show_name: false
            state:
              - value: "on"
                icon: mdi:toggle-switch
                styles:
                  icon:
                    - color: green
              - value: "off"
                icon: mdi:toggle-switch-off
                styles:
                  icon:
                    - color: grey
            styles:
              card:
                - width: 80px
                - height: 40px
                - border: none
                - margin-right: "-20px"
          - type: custom:numberbox-card
            border: false
            entity: input_number.bewaesserung_k1_t1_start
            unit: time
            speed: 0
            delay: 0
            icon: false
            name: false
            step: 1
            card_mod:
              style: |
                .cur-num { font-size: 14px !important; }
                .cur-box ha-icon { transform: scale(0.7); }
          - type: custom:numberbox-card
            border: false
            entity: input_number.bewaesserung_k1_t1_ende
            unit: time
            speed: 0
            delay: 0
            icon: false
            name: false
            step: 1
            card_mod:
              style: |
                .cur-num { font-size: 14px !important; }
                .cur-box ha-icon { transform: scale(0.7); }
  - type: custom:vertical-stack-in-card
    card_mod:
      style: |
        ha-card {
          border-radius: 100px;
          padding-top: 3px;
          height: 45px;
        }
    cards:
      - type: horizontal-stack
        cards:
          - type: custom:button-card
            entity: input_boolean.bewaesserung_k1_t2_aktiv
            icon: mdi:toggle-switch
            show_name: false
            state:
              - value: "on"
                icon: mdi:toggle-switch
                styles:
                  icon:
                    - color: green
              - value: "off"
                icon: mdi:toggle-switch-off
                styles:
                  icon:
                    - color: grey
            styles:
              card:
                - width: 80px
                - height: 40px
                - border: none
                - margin-right: "-20px"
          - type: custom:numberbox-card
            border: false
            entity: input_number.bewaesserung_k1_t2_start
            unit: time
            speed: 0
            delay: 0
            icon: false
            name: false
            step: 1
            card_mod:
              style: |
                .cur-num { font-size: 14px !important; }
                .cur-box ha-icon { transform: scale(0.7); }
          - type: custom:numberbox-card
            border: false
            entity: input_number.bewaesserung_k1_t2_ende
            unit: time
            speed: 0
            delay: 0
            icon: false
            name: false
            step: 1
            card_mod:
              style: |
                .cur-num { font-size: 14px !important; }
                .cur-box ha-icon { transform: scale(0.7); }
  - type: custom:bubble-card
    card_type: button
    entity: input_number.bewaesserung_k1_limit_moisture
    show_last_changed: false
    show_attribute: false
    tap_action:
      action: none
    name: "Bodenfeuchte: Keine Bewässerung über"
    show_state: true
    force_icon: false
    scrolling_effect: false
    show_icon: true
    show_name: true
    styles: |-
      .bubble-icon {
        color: var(--background-color) !important;
      } .bubble-range-fill {
        background-color:#49423e !important;
      }
    sub_button: []
    icon: mdi:water-percent-alert
    button_type: slider
    hold_action:
      action: none
    double_tap_action:
      action: none
    slider_live_update: true
  - type: custom:bubble-card
    card_type: button
    entity: input_number.bewaesserung_k1_limit_rain_today
    show_last_changed: false
    show_attribute: false
    tap_action:
      action: none
    name: "Regen bisher: Keine Bewässerung über"
    show_state: true
    force_icon: false
    scrolling_effect: false
    show_icon: true
    show_name: true
    styles: |-
      .bubble-icon {
        color: var(--background-color) !important;
      } .bubble-range-fill {
        background-color:#49423e !important;
      }
    sub_button: []
    icon: mdi:arrow-collapse-right
    button_type: slider
    hold_action:
      action: none
    double_tap_action:
      action: none
    slider_live_update: true
  - type: custom:bubble-card
    card_type: button
    entity: input_number.bewaesserung_k1_limit_rain_forecast
    show_last_changed: false
    show_attribute: false
    tap_action:
      action: none
    name: "Regen Vorschau: Keine Bewässerung über"
    show_state: true
    force_icon: false
    scrolling_effect: false
    show_icon: true
    show_name: true
    styles: |-
      .bubble-icon {
        color: var(--background-color) !important;
      } .bubble-range-fill {
        background-color:#49423e !important;
      }
    sub_button: []
    icon: mdi:weather-pouring
    button_type: slider
    hold_action:
      action: none
    double_tap_action:
      action: none
    slider_live_update: true

Dashboard: Ausgabe Status Bewässerung

Im oberen Bereich wird die bisherige Regenmenge des heutigen Tages sowie die aktuelle Regenvorhersage angezeigt. Die Anzeige färbt sich blau, sobald bereits Niederschlag gefallen ist oder für den weiteren Tagesverlauf Regen erwartet wird.

Smarte Gartenbewässerung mit Home Assistant: Status Bereich

Darunter folgt eine übersichtliche Darstellung aller Bewässerungskreisläufe. Für jeden Kreislauf werden die aktuelle Bodenfeuchte und der Zustand der Freigabelogik angezeigt: freigegeben, aufgrund der Grenzwerte gesperrt oder über beide Zeitfenster deaktiviert.

Ganz oben rechts kann die Automatisierung zusätzlich global ein- oder ausgeschaltet werden.

Smarte Gartenbewässerung mit Home Assistant: Status Bereich
YAML-Konfiguration anzeigen: Dashboard
type: vertical-stack
cards:
  - type: custom:bubble-card
    card_type: separator
    name: Garten Bewässerung
    icon: mdi:sprinkler-variant
    sub_button:
      - entity: automation.garten_bewasserung_2
        show_state: false
        show_name: false
        tap_action:
          action: toggle
    styles: |-
      .bubble-sub-button-1 {
       /* Automation. Hintergrundfarbe: Grün wenn 'on', Grau wenn 'off' */
       background-color: ${(() => {
         const state = hass.states['automation.garten_bewasserung_2']?.state;
         return state === 'on' ? 'rgba(50, 205, 50, 0.6)' : 'rgba(150, 150, 150, 0.3)';
       })()} !important;

       /* Icon-Wechsel: Pumpe wenn 'on', Pumpe-Aus wenn 'off' */
       --card-mod-icon: ${(() => {
         const state = hass.states['automation.garten_bewasserung_2']?.state;
         return state === 'on' ? 'mdi:water-pump' : 'mdi:water-pump-off';
       })()};
       color: white !important;
       }
  - type: custom:bubble-card
    card_type: button
    button_type: state
    entity: sensor.gw1100a_outdoor_temperature_2
    name: Temperatur & Regenmenge
    show_name: true
    show_state: true
    show_icon: true
    icon: mdi:thermometer
    scrolling_effect: false
    sub_button:
      - entity: sensor.gw1100a_daily_rain_rate_2
        name: Bisher
        show_state: true
        icon: mdi:arrow-collapse-right
        show_name: false
      - entity: sensor.regenmenge_heute
        name: Heute
        show_state: true
        icon: mdi:weather-rainy
        show_name: false
    styles: >-
      /* Hintergrund wird blau, wenn es heute geregnet hat ODER es noch regnen soll */

      .bubble-button-card-container {
        background-color: ${(() => {
          const rain = parseFloat(hass.states['sensor.regenmenge_heute']?.state);
          const rate = parseFloat(hass.states['sensor.gw1100a_daily_rain_rate_2']?.state);
          
          return (rain > 0 || rate > 0) ? 'rgba(0, 120, 255, 0.2)' : 'rgba(100, 100, 100, 0.2)';
        })()} !important;
      }


      /* Sub-Button 1 (Regenrate) blau einfärben, wenn es heute Regen gab */

      .bubble-sub-button-1 {
        background-color: ${(() => {
          const rate = parseFloat(hass.states['sensor.gw1100a_daily_rain_rate_2']?.state);
          return rate > 0 ? 'rgba(0, 120, 255, 0.4)' : 'rgba(150, 150, 150, 0.1)';
        })()} !important;
      }


      /* Sub-Button 2 (Gesamtmenge) blau einfärben, wenn es heute noch regnen soll */

      .bubble-sub-button-2 {
        background-color: ${(() => {
          const rate = parseFloat(hass.states['sensor.regenmenge_heute']?.state);
          return rate > 0 ? 'rgba(0, 120, 255, 0.4)' : 'rgba(150, 150, 150, 0.1)';
        })()} !important;
      }
  - type: grid
    columns: 2
    square: false
    cards:

Den folgenden Bereich pro Kreislauf duplizieren und dann "k1" durch "k2", "k3" usw. sowie den Namen des Sensors für den Bodenfeuchtesensor (blau markiert) ersetzen:


      - type: custom:bubble-card
        card_type: button
        button_type: state
        entity: sensor.gw1100a_soil_moisture_1
        name: Blumen
        show_name: true
        show_state: true
        show_icon: true
        icon: mdi:flower
        scrolling_effect: false
        sub_button:
          - entity: sensor.bewaesserung_k1_logik
            show_state: false
        styles: |-
          /* Hintergrund der Hauptkarte (Bodenfeuchte) */
          .bubble-button-card-container {
            background-color: ${(() => {
              const l = parseFloat(hass.states['sensor.gw1100a_soil_moisture_1']?.state);
              if (l < 15) return 'rgba(255, 0, 0, 0.2)'; 
              if (l <= 20) return 'rgba(255, 215, 0, 0.2)'; 
              return 'rgba(0, 255, 0, 0.1)';
            })()} !important;
          }

          /* Sub-Button Logik: Farbe & Icon */
          .bubble-sub-button-1 {
            background-color: ${(() => {
              const s1 = hass.states['input_boolean.bewaesserung_k1_t1_aktiv'];
              const s2 = hass.states['input_boolean.bewaesserung_k1_t2_aktiv'];
              const sL = hass.states['sensor.bewaesserung_k1_logik'];
              if (!s1 || !s2 || !sL || (s1.state === 'off' && s2.state === 'off')) return 'rgba(128, 128, 128, 0.5)';
              return sL.state.toLowerCase() === 'aktiv' ? 'rgba(50, 205, 50, 0.5)' : 'rgba(255, 0, 0, 0.5)';
            })()} !important;

            --card-mod-icon: ${(() => {
              const s1 = hass.states['input_boolean.bewaesserung_k1_t1_aktiv'];
              const s2 = hass.states['input_boolean.bewaesserung_k1_t2_aktiv'];
              const sL = hass.states['sensor.bewaesserung_k1_logik'];
              if (!s1 || !s2 || !sL || (s1.state === 'off' && s2.state === 'off')) return 'mdi:water-remove-outline';
              return sL.state.toLowerCase() === 'aktiv' ? 'mdi:water-check' : 'mdi:water-off';
            })()};
          }

Ergänzungen in der configuration.yaml

Die komplette Logik ist in einem Package gekapselt. Hier werden alle benötigten Sensoren und Komponenten zentral erstellt und verwaltet.

Folgende Zeilen in die configuration.yaml hinzufügen:

homeassistant:
  packages: !include_dir_named packages

und folgende Ordnerstruktur anlegen:

/packages     # wenn noch nicht vorhanden
/packages/bewaesserung

Package

Den Inhalt nach

/packages/bewaesserung/k1.yaml

legen. Für weitere Kreisläufe die Datei k1.yaml kopieren und als k2.yaml, k3.yaml usw. im gleichen Ordner speichern.

Package für Kreislauf 1 (k1.yaml)
# Package für Bewässerungskreislauf 1
#####################################

# Bewässerungszeiten in hh:mm als Trigger für Automation
input_datetime:
  bewaesserung_k1_t1_start_trigger:
    name: "K1 T1 Start"
    has_date: false
    has_time: true
  bewaesserung_k1_t1_ende_trigger:
    name: "K1 T1 Ende"
    has_date: false
    has_time: true
  bewaesserung_k1_t2_start_trigger:
    name: "K1 T2 Start"
    has_date: false
    has_time: true
  bewaesserung_k1_t2_ende_trigger:
    name: "K1 T2 Ende"
    has_date: false
    has_time: true

# Zwei Laufzeiten pro Tag
input_boolean:
  bewaesserung_k1_t1_aktiv:
    name: "K1 Termin 1 Aktiv"
    icon: mdi:calendar-check
  bewaesserung_k1_t2_aktiv:
    name: "K1 Termin 2 Aktiv"
    icon: mdi:calendar-check

# Bewässerungszeiten in Minuten
# Initiale Einstellung am Besten über die Entwicklerwerkzeuge
# Bsp:
#  420 = 07:00 Uhr
# 1140 = 19:00 Uhr
input_number:
  bewaesserung_k1_t1_start:
    name: "Startzeit T1 (Min)"
    min: 0
    max: 1439
  bewaesserung_k1_t1_ende:
    name: "Endzeit T1 (Min)"
    min: 0
    max: 1439
  bewaesserung_k1_t2_start:
    name: "Startzeit T2 (Min)"
    min: 0
    max: 1439
  bewaesserung_k1_t2_ende:
    name: "Endzeit T2 (Min)"
    min: 0
    max: 1439

  # Limits für Bewässerung deaktivieren
  bewaesserung_k1_limit_moisture:
    name: "Grenzwert Bodenfeuchte"
    min: 0
    max: 99
    unit_of_measurement: "%"
  bewaesserung_k1_limit_rain_today:
    name: "Limit Regen Heute"
    min: 0
    max: 50
    unit_of_measurement: "mm"
  bewaesserung_k1_limit_rain_forecast:
    name: "Limit Regen Forecast"
    min: 0
    max: 50
    unit_of_measurement: "mm"

template:
  - sensor:
      - name: "bewaesserung_bodenfeuchte_k1"
        unique_id: bewaesserung_bodenfeuchte_k1
        unit_of_measurement: "%"
        device_class: moisture

        # WICHTIG !!!
        # Hier den jeweiligen Bodenfeuchtesensor eintragen!
        state: "{{ states('sensor.gw1100a_soil_moisture_1') | float(0) }}"

      - name: "bewaesserung_k1_logik"
        unique_id: garten_bewaesserung_k1_logik
        state: >
          {# Überprüfung aller Parameter #}
          {% set moist = states('sensor.bewaesserung_bodenfeuchte_k1') | float(0) %}
          {% set lim_m = states('input_number.bewaesserung_k1_limit_moisture') | float(0) %}
          {% set rain = states('sensor.regen_heute') | float(0) %}
          {% set lim_r = states('input_number.bewaesserung_k1_limit_rain_today') | float(0) %}
          {% set fc = states('sensor.regen_forecast') | float(0) %}
          {% set lim_f = states('input_number.bewaesserung_k1_limit_rain_forecast') | float(0) %}

          {# Ergebis ist entweder aktiv (wird bewässert) oder inaktiv (pausieren) #}
          {% if moist < lim_m and rain < lim_r and fc < lim_f %}
            aktiv
          {% else %}
            inaktiv
          {% endif %}

  # Simpler binärer Sensor für Dashboard und Automation
  - binary_sensor:
      - name: "bewaesserung_k1_ready"
        unique_id: bewaesserung_k1_ready
        device_class: moisture
        state: "{{ is_state('sensor.bewaesserung_k1_logik', 'aktiv') }}"

Auch hier gilt für weitere Kreisläufe: "k1" durch "k2", "k3" usw. ersetzen sowie den Namen des Sensors für den Bodenfeuchtesensor (blau markiert) ersetzen.

Automatische Steuerung der Bewässerung

Die eigentliche Bewässerung wird über Automationen in Home Assistant gesteuert. Dabei wird für jeden Kreislauf definiert, wann die Bewässerung starten und wieder beendet werden soll.

Beim Erreichen des Startzeitpunkts wird zunächst geprüft, ob die Bewässerung für diesen Zeitraum aktiviert ist und ob die definierten Bedingungen erfüllt sind – beispielsweise in Bezug auf Bodenfeuchte oder Niederschlag. Erst wenn alle Bedingungen passen, wird der entsprechende Bewässerungskreislauf automatisch gestartet.

In meinem Setup sind die Sonoff-Ventile dabei fortlaufend als switch.garten_bewasserung_1 bis switch.garten_bewasserung_7 benannt, wodurch sich die jeweiligen Kreisläufe einfach über die entsprechende Nummer ansprechen lassen: switch.garten_bewasserung_{{ kreislauf }}.

Zum definierten Endzeitpunkt wird der Kreislauf wieder deaktiviert, sodass die Laufzeit klar begrenzt ist.

Automationen (2) anzeigen

Eigentliche Automation für die Bewässerung

alias: Garten Bewässerung
description: ""
triggers:
  - at:
      - input_datetime.bewaesserung_k1_t1_start_trigger
      - input_datetime.bewaesserung_k1_t2_start_trigger
      # - input_datetime.bewaesserung_k2_t1_start_trigger
      # - input_datetime.bewaesserung_k2_t2_start_trigger
      # Hier die Startzeiten für weiterer Kreisläufe ergänzen
    id: start
    trigger: time
  - at:
      - input_datetime.bewaesserung_k1_t1_ende_trigger
      - input_datetime.bewaesserung_k1_t2_ende_trigger
      # - input_datetime.bewaesserung_k2_t1_ende_trigger
      # - input_datetime.bewaesserung_k2_t2_ende_trigger
      # Hier die Endzeiten für weiterer Kreisläufe ergänzen
    id: stop
    trigger: time
actions:
  - variables:
      parts: "{{ trigger.entity_id.split('_') }}"
      kreis_id: "{{ parts[2] }}"
      termin_id: "{{ parts[3] }}"
      kreis_nr: "{{ kreis_id | replace('k', '') }}"
      valv_id: switch.garten_bewasserung_{{ kreis_nr }}
      ready_sensor: binary_sensor.bewaesserung_{{ kreis_id }}_ready
      active_switch: input_boolean.bewaesserung_{{ kreis_id }}_{{ termin_id }}_aktiv
      logik_text: "{{ states('sensor.bewaesserung_' ~ kreis_id ~ '_logik') }}"
  - choose:
      - conditions:
          - condition: trigger
            id: start
        sequence:
          - if:
              - condition: template
                value_template: >-
                  {{ is_state(active_switch, 'on') and is_state(ready_sensor,
                  'on') }}
            then:
              - target:
                  entity_id: "{{ valv_id }}"
                action: switch.turn_on
      - conditions:
          - condition: trigger
            id: stop
        sequence:
          - target:
              entity_id: "{{ valv_id }}"
            action: switch.turn_off
mode: parallel

Automation für die Konvertierung der Triggerzeiten für die Bewässerung von Minutenwerten in Uhrzeiten:

alias: Konvertiere Triggerzeit für Bewässerung
description: Konvertiert die Minutenwerte in Uhrzeiten
triggers:
  - trigger: state
    entity_id:
      - input_number.bewaesserung_k1_t1_start
      - input_number.bewaesserung_k1_t1_ende
      - input_number.bewaesserung_k1_t2_start
      - input_number.bewaesserung_k1_t2_ende
      #- input_number.bewaesserung_k2_t1_start
      #- input_number.bewaesserung_k2_t1_ende
      #- input_number.bewaesserung_k2_t2_start
      #- input_number.bewaesserung_k2_t2_ende
actions:
  - action: input_datetime.set_datetime
    target:
      entity_id: input_datetime.{{ trigger.entity_id.split('.')[1] }}_trigger
    data:
      time: >
        {% set minutes = states(trigger.entity_id) | int(0) %} {{
        '{:02d}:{:02d}:00'.format(minutes // 60, minutes % 60) }}


Mein Setup zum Nachbauen

Wenn du ein ähnliches System umsetzen möchtest, findest du hier die Komponenten, die ich aktuell verwende bzw. empfehlen kann.

Rasen und Pflanzenbewässerung

Für die eigentliche Bewässerung setze ich auf Komponenten von Gardena, da es hier ein sehr breites Sortiment für unterschiedlichste Anforderungen gibt. Je nach Gartenstruktur lohnt es sich, die einzelnen Bereiche individuell zu planen und die passenden Komponenten auszuwählen.

Gerade bei Rasensprengern sollte man auf die richtige Dimension achten: Zu große Regner benötigen entsprechend mehr Durchfluss, was in Kombination mit smarten SONOFF Bewässerungscomputer SWV-BSP* (Werbung) (bzw. der neuen Version SONOFF SWV-ZFE Hydro ONE* (Werbung)) schnell zum limitierenden Faktor werden kann. Kleinere, gut abgestimmte Regner pro Zone sind hier oft die bessere Wahl.

Ich habe u.a. folgende Komponenten im Einsatz:

  • Gardena Versenkregner SD30* (Werbung) - Für kleine Rasenflächen bis 30 m², Reichweite von 1.5-3 m, Anschluss über 25mm Installationsrohr
  • Gardena Versenkregner SD80* (Werbung) - für kleine Rasenflächen bis 80 m², Reichweite von 3-5 m, Anschluss über 25mm Installationsrohr
  • Gardena Kleinflächendüse* (Werbung) - Sprühdüse für Kleinflächen bis 40 cm Durchmesser, für 13 mm Verlegerohr
  • Gardena Reihentropfer* (Werbung) - Regulierbarer Reihentropfer für Pflanzen, 0 bis 15 l/h, für 4.6 mm Verteilerrohr

Steuerung & Sensoren

Zubehör & Infrastruktur

Zusätzlich sollte bei der Planung unbedingt auf das passende Zubehör geachtet werden – wie Rohrhalter, T-Stücke, L-Stücke oder Verschlussstopfen in den jeweils richtigen Rohrdurchmessern. Gerade diese Kleinteile entscheiden am Ende darüber, wie sauber und zuverlässig das gesamte System aufgebaut ist.