đŸ€– Intelligente Steuerung fĂŒr den MĂ€hroboter mit Home Assistant

Als Besitzer eines automatischen MÀhroboters steht man vor der Herausforderung, ihn möglichst effizient, wetterabhÀngig und zeitschonend zu steuern.

In meinem Smart Home nutze ich Home Assistant, um meinen Green Cruiser MĂ€hroboter (Gardena smart SILENO city, 500 mÂČ) perfekt in meinen Alltag zu integrieren.

Heute möchte ich dir meine finale Automatisierungslösung vorstellen, die ich ĂŒber mehrere Wochen optimiert habe. Ich erklĂ€re dir genau, wie die Steuerung funktioniert, welche Automatisierungen ich dafĂŒr eingesetzt habe, welche Helfer-EntitĂ€ten dabei eine wichtige Rolle spielen und wie die BenutzeroberflĂ€che zur Steuerung aufgebaut ist.


🔧 Ausgangsproblem

Der Gardena MĂ€hroboter bringt von Haus aus ein eigenes Scheduling-System mit.

Dieses steuert:

  • wann der Roboter fĂ€hrt
  • wann er lĂ€dt
  • wann er pausiert

👉 Problem:

  • Zeitplan aktiv → ✅ gutes Ladeverhalten, ❌ automatisches Starten
  • Zeitplan deaktiviert → ✅ keine Eigenstarts, ❌ Ladeverhalten teilweise suboptimal

ZusÀtzlich:

  • der Zeitplan lĂ€sst sich nur „pausieren“
  • wird aber im Hintergrund teilweise wieder automatisch aktiviert

🎯 Ziele meiner Automatisierung

  • ✅ MĂ€hen nur in festgelegten Zeitfenstern
  • đŸŒ§ïž Kein MĂ€hen bei Regen
  • 🔋 Automatisches Fortsetzen des MĂ€hens nach dem Aufladen
  • ⚡ Manuelles, spontanes MĂ€hen fĂŒr eine selbstgewĂ€hlte Dauer unabhĂ€ngig von Zeitfenstern
  • 🛑 Verhindern unerlaubter Starts außerhalb erlaubter Zeitfenster ohne expliziten Home Assistant-Trigger
  • 📊 Übersichtliche Bedienelemente und Statusanzeigen in Home Assistant
  • 👉 Home Assistant soll die einzige Steuerinstanz sein – ohne unkontrolliertes Eigenverhalten des Roboters

đŸ§© Architektur meines Systems

Das gesamte System basiert auf fĂŒnf zentralen Bausteinen:

  • Automatikbetrieb (Zeit + Wetter + Akku)
  • Spontanbetrieb (manuell ĂŒber UI)
  • Neustart im Spontanbetrieb nach Akkuladung
  • Schutz-Mechanismus gegen Fremdstarts
  • Sicherheitsnetz gegen hĂ€ngendes Spontan-Flag

đŸ§© Wichtigste Hilfsmittel: Helper (Input-EntitĂ€ten)

Damit die Automatisierungen flexibel und nutzerfreundlich sind, verwende ich verschiedene Helper in Home Assistant:

🔘 1. Steuer-Flags

  • ▶ input_boolean.mahroboter_spontan_akti
    Steuert den manuellen, spontanen MÀhmodus. Wird dieser aktiviert, lÀuft der MÀher unabhÀngig vom Zeitfenster.
  • 📌 input_boolean.mahroboter_hat_gemaeht
    Merkt sich, ob der MĂ€her bereits gemĂ€ht hat – wichtig, um nach vollstĂ€ndigem Akku-Laden richtig zu entscheiden.

⏱ 2. Zeitsteuerung

  • 🕒 input_datetime.mahroboter_startzeit und input_datetime.mahroboter_endzeit
    Dienen zur Definition der erlaubten MĂ€hzeitfenster. So kann man jederzeit bequem per UI Start- und Endzeit anpassen.

⏳ 3. Spontanmodus Parameter

  • ⏱ input_number.mahroboter_spontan_dauer
    Einstellbarer Timer, wie lange das spontane MĂ€hen laufen soll.
  • 📅 input_datetime.mahroboter_ende_spontan
    Speichert das Ende des spontanen MĂ€hvorgangs zeitlich ab, damit es in der UI angezeigt werden kann.

Diese Helper sind essentiell, um dynamisch und intelligent auf Zeit, Regen und Batterielevel reagieren zu können.


🌩 Wetterlogik (Binary Sensor)

Ein wichtiger Bestandteil ist ein eigener Sensor:

👉 „MĂ€hroboter Regen OK“

Funktion

  • wertet die Regenrate aus
  • entscheidet, ob MĂ€hen aktuell erlaubt ist

Logik (vereinfacht)

  • Regenrate < 0.1 → OK
  • Regenrate >= 0.1 → gesperrt

YAML – Code

- binary_sensor:
    - name: "MĂ€hroboter Regen OK"
      unique_id: maehroboter_regen_ok
      state: >
        {{ states('sensor.gw1100a_rain_rate') | float(0) < 0.1 }}
      icon: >
        {% if states('sensor.gw1100a_rain_rate') | float(0) < 0.1 %}
          mdi:weather-sunny
        {% else %}
          mdi:weather-rainy
        {% endif %}

👉 Vorteil:

✅ klare Freigabe / Sperre
✅ direkt im Dashboard sichtbar
✅ einfache Integration in Automationen


⚙ Die fĂŒnf finalen Automatisierungen im Detail

1. đŸŒ± Intelligente Regen-, Akku- und Zeitsteuerung

Diese Automatisierung sorgt dafĂŒr, dass der Green Cruiser nur im definierten Zeitfenster mĂ€ht, bei Regen sofort ins Dock zurĂŒckkehrt und nach vollem Akku-Aufladen sein MĂ€hen fortsetzt.

Trigger:

  • ⏰ Startzeit erreicht (input_datetime.mahroboter_startzeit)
  • 🏁 Endzeit erreicht (input_datetime.mahroboter_endzeit)
  • 🌧 Regen beginnt
  • ☀ Regen ist mindestens 2 Stunden vorbei
  • 🔋 Akku voll (>95%)

Bedingungen & Ablauf:

  • âžĄïž Start bei passenden Bedingungen innerhalb Zeitfenster
  • đŸš« Kein Start bei Regen
  • 🔄 Fortsetzung nach dem Laden
  • 🛑 RĂŒckkehr bei Regen oder Endzeit

Diese Logik sorgt fĂŒr maximale Effizienz: Kein MĂ€hen bei Regen, nur im definierten Fenster, und automatische Fortsetzung nach Laden.

alias: "MĂ€hroboter: Intelligente Regen-, Akku- und Zeitsteuerung"
description: >
  Green Cruiser fÀhrt nur im Zeitfenster, reagiert auf Regen und setzt nach
  Laden fort.
triggers:
  - trigger: time
    at: input_datetime.mahroboter_startzeit
    id: zeit_start
  - trigger: time
    at: input_datetime.mahroboter_endzeit
    id: zeit_ende
  - trigger: numeric_state
    entity_id: sensor.gw1100a_rain_rate
    above: 0
    id: regen_start
  - trigger: numeric_state
    entity_id: sensor.gw1100a_rain_rate
    below: 0.1
    for: "02:00:00"
    id: regen_vorbei
  - trigger: numeric_state
    entity_id: sensor.green_cruiser_battery_level_2
    above: 95
    id: akku_voll
actions:
  - choose:
      - conditions:
          - condition: state
            entity_id: input_boolean.mahroboter_spontan_akti
            state: "off"
          - condition: or
            conditions:
              - condition: trigger
                id: zeit_start
              - condition: trigger
                id: regen_vorbei
              - condition: trigger
                id: akku_voll
          - condition: time
            after: input_datetime.mahroboter_startzeit
            before: input_datetime.mahroboter_endzeit
          - condition: numeric_state
            entity_id: sensor.gw1100a_rain_rate
            below: 0.1
          - condition: state
            entity_id: lawn_mower.green_cruiser_lawn_mower
            state: docked
          - condition: or
            conditions:
              - condition: not
                conditions:
                  - condition: trigger
                    id: akku_voll
              - condition: state
                entity_id: input_boolean.mahroboter_hat_gemaeht
                state: "on"
        sequence:
          - action: button.press
            target:
              entity_id: button.green_cruiser_start_mowing_now
          - action: input_boolean.turn_on
            target:
              entity_id: input_boolean.mahroboter_hat_gemaeht
      - conditions:
          - condition: state
            entity_id: input_boolean.mahroboter_spontan_akti
            state: "off"
          - condition: or
            conditions:
              - condition: trigger
                id: zeit_ende
              - condition: trigger
                id: regen_start
        sequence:
          - action: button.press
            target:
              entity_id: button.green_cruiser_return_to_dock_2
          - condition: trigger
            id: zeit_ende
          - action: input_boolean.turn_off
            target:
              entity_id: input_boolean.mahroboter_hat_gemaeht
mode: restart

🧠 Besonderheit

Die Automation nutzt gezielt:

  • Trigger-ID (zeit_start, regen_vorbei, akku_voll)
  • Zustandslogik (mahroboter_hat_gemaeht)

👉 Dadurch entsteht eine sehr prĂ€zise Steuerung ohne ChaoszustĂ€nde

2. ⚡ Spontan mĂ€hen fĂŒr Dauer

Manchmal will man nicht auf Zeitfenster warten und den MĂ€her spontan starten lassen – z. B. an einem sonnigen Tag zwischendurch.

Trigger:

  • ▶ Spontanmodus wird aktiviert

Ablauf:

  • 🚀 Start aus dem Dock
  • 📅 Berechnung der Endzeit
  • ⏱ Lauf fĂŒr definierte Dauer
  • 🏠 RĂŒckkehr ins Dock
  • 💡 Der Neustart nach dem Laden ĂŒbernimmt Automation 3
alias: "MĂ€hroboter: Spontan mĂ€hen fĂŒr Dauer"
description: ""
triggers:
  - trigger: state
    entity_id: input_boolean.mahroboter_spontan_akti
    to: "on"
    id: start
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: start
          - condition: state
            entity_id: lawn_mower.green_cruiser_lawn_mower
            state: docked
        sequence:
          - action: button.press
            target:
              entity_id: button.green_cruiser_start_mowing_now
          - action: input_boolean.turn_on
            target:
              entity_id: input_boolean.mahroboter_hat_gemaeht
          - action: input_datetime.set_datetime
            target:
              entity_id: input_datetime.mahroboter_ende_spontan
            data:
              datetime: >
                {{ (now() +
                timedelta(minutes=states('input_number.mahroboter_spontan_dauer')
                | int)).strftime('%Y-%m-%d %H:%M:%S') }}
          - delay:
              minutes: "{{ states('input_number.mahroboter_spontan_dauer') | int }}"
          - action: button.press
            target:
              entity_id: button.green_cruiser_return_to_dock_2
          - action: input_boolean.turn_off
            target:
              entity_id: input_boolean.mahroboter_spontan_akti
    default:
      - condition: trigger
        id: start
      - action: input_boolean.turn_off
        target:
          entity_id: input_boolean.mahroboter_spontan_akti
mode: restart

🧠 Besonderheit

👉 Diese Automation funktioniert unabhĂ€ngig vom Zeitfenster

→ daher war eine zusĂ€tzliche Schutzlogik notwendig

3. 🔋 Spontan – Neustart nach Laden

WÀhrend einer aktiven Spontan-Session kann der Roboter zwischendurch laden. Damit er danach automatisch weitermÀht, gibt es diese eigenstÀndige Automation.

⚠ Warum eine eigene Automation?
FrĂŒher war der Akku-Trigger in „Spontan mĂ€hen fĂŒr Dauer“ integriert. Durch den mode: restart brach ein Akku-Trigger den laufenden Delay ab – der Code, der spontan_akti auf OFF setzt, wurde nie erreicht. Das Flag blieb dauerhaft ON und blockierte die gesamte Zeitsteuerung.

Trigger:

  • 🔋 Akku > 95 %

Bedingungen:

  • ▶ spontan_akti ist ON
  • 📌 hat_gemaeht ist ON
  • 🏠 Roboter ist docked
  • ⏱ Endzeit der Session noch nicht erreicht

Ablauf:

  • 🚀 Start-Button drĂŒcken

👉 Wichtig: mode: single verhindert parallele AusfĂŒhrungen und greift nicht in den laufenden Delay von Automation 2 ein.

alias: "MĂ€hroboter: Spontan – Neustart nach Laden"
description: Startet nach vollstÀndigem Laden neu wenn Spontan-Session noch aktiv ist
triggers:
  - trigger: numeric_state
    entity_id: sensor.green_cruiser_battery_level_2
    above: 95
conditions:
  - condition: state
    entity_id: input_boolean.mahroboter_spontan_akti
    state: "on"
  - condition: state
    entity_id: input_boolean.mahroboter_hat_gemaeht
    state: "on"
  - condition: state
    entity_id: lawn_mower.green_cruiser_lawn_mower
    state: docked
  - condition: template
    value_template: >
      {{ now() < states('input_datetime.mahroboter_ende_spontan') | as_datetime
      }}
actions:
  - action: button.press
    target:
      entity_id: button.green_cruiser_start_mowing_now
mode: single

4. 🛡 Unerlaubten Start blockieren

Manche MĂ€her starten auch mal spontan oder ungewollt. Diese Automatisierung verhindert genau das – auch unter realen Bedingungen mit verzögerten Zustandswechseln und Cloud-abhĂ€ngigem Verhalten.

Problem (genaue Beschreibung am Ende vom Beitrag):

Der Gardena Zeitplan darf:

  • aktiviert bleiben (fĂŒr Ladeverhalten)
  • startet aber trotzdem eigenstĂ€ndig

Trigger:

  • ⚡ Zustand wechselt auf „mowing“

Bedingungen:

  • đŸš« Spontanmodus aus
  • ⏰ außerhalb Zeitfenster

Ablauf:

  • ⏳ kurze Wartezeit, bis der MĂ€her in einem stabilen Zustand ist
  • 🔁 Stop-Befehl wird gezielt und mehrfach gesende
  • 🧠 robuste Logik, die nicht von einem einzelnen Zustand abhĂ€ngig ist
  • 🏠 RĂŒckfahrt zum Dock wird aktiv erzwungen

Im praktischen Einsatz hat sich gezeigt, dass der MĂ€hroboter nach dem Start nicht sofort auf Steuerbefehle reagiert und intern verschiedene ZwischenzustĂ€nde durchlĂ€uft (z. B. Start, Bewegung, Positionierung).

Daher wurde die Automatisierung bewusst so aufgebaut, dass:

  • ⏱ genĂŒgend Zeit fĂŒr stabile Zustandswechsel eingeplant wird
  • 🔁 Stop-Befehle wiederholt gesendet werden (Retry-Mechanismus)
  • 📡 auch Cloud- oder Integrationsverzögerungen berĂŒcksichtigt werden
  • 🔍 Debug-Informationen zur Analyse ausgegeben werde

👉 Dadurch wird sichergestellt, dass der MĂ€hroboter auch bei Änderungen durch Firmware- oder Integrations-Updates zuverlĂ€ssig gestoppt wird.

alias: "MĂ€hroboter: Unerlaubten Start blockieren mit Notifications"
description: ""
triggers:
  - trigger: state
    entity_id: lawn_mower.green_cruiser_lawn_mower
    to: mowing
conditions:
  - condition: state
    entity_id: input_boolean.mahroboter_spontan_akti
    state: "off"
  - condition: template
    value_template: >
      {% set now_time = now().time() %}
      {% set start = strptime(states('input_datetime.mahroboter_startzeit'), '%H:%M:%S').time() %}
      {% set end = strptime(states('input_datetime.mahroboter_endzeit'), '%H:%M:%S').time() %}
      {% if start <= end %}{{ now_time < start or now_time > end }}
      {% else %}{{ now_time > end and now_time < start }}{% endif %}
actions:
  - data:
      level: warning
      message: >
        MC: Fremdstart erkannt → adaptive PrĂŒfung startet State={{
        states('lawn_mower.green_cruiser_lawn_mower') }}, Time={{ now() }}
    action: system_log.write
  - data:
      title: Achtung - MĂ€hroboter unerlaubter Start
      message: >
        Der MĂ€hroboter hat außerhalb der erlaubten Zeit gestartet ({{
        now().strftime('%H:%M') }} Uhr).
      target: [email protected]
    action: notify.kottlowski_gmail_com
  - repeat:
      while:
        - condition: template
          value_template: >
            {{ states('lawn_mower.green_cruiser_lawn_mower') not in ['docked',
            'charging', 'returning'] }}
        - condition: template
          value_template: |
            {{ repeat.index <= 6 }}
      sequence:
        - target:
            entity_id: button.green_cruiser_return_to_dock_2
          action: button.press
        - data:
            level: warning
            message: >
              MC: STOP Versuch {{ repeat.index }} State={{
              states('lawn_mower.green_cruiser_lawn_mower') }}, Time={{ now() }}
          action: system_log.write
        - wait_template: >
            {{ states('lawn_mower.green_cruiser_lawn_mower') in ['docked',
            'charging', 'returning'] }}
          timeout: "00:00:15"
  - wait_template: >
      {{ states('lawn_mower.green_cruiser_lawn_mower') in ['docked', 'charging']
      }}
    timeout: "00:05:00"
    continue_on_timeout: true
  - choose:
      - conditions:
          - condition: template
            value_template: >
              {{ states('lawn_mower.green_cruiser_lawn_mower') in ['docked',
              'charging'] }}
        sequence:
          - data:
              level: info
              message: |
                MC: Roboter erfolgreich zurĂŒck zur Basis Time={{ now() }}
            action: system_log.write
    default:
      - data:
          level: error
          message: |
            MC: FEHLER – Roboter konnte nicht gestoppt werden Time={{ now() }}
        action: system_log.write
      - data:
          title: Achtung - MĂ€hroboter konnte nicht gestoppt werden!
          message: >
            Der MĂ€hroboter mĂ€ht weiterhin außerhalb der erlaubten Zeit und
            konnte nicht automatisch gestoppt werden!
          target: [email protected]
        action: notify.kottlowski_gmail_com
mode: restart

🧠 Ergebnis

👉 Der Zeitplan bleibt aktiv
👉 das Ladeverhalten bleibt optimal
👉 aber jede unerwĂŒnschte Bewegung wird sofort gestoppt

5. 🔄 Spontan-Flag zurĂŒcksetzen

Nach der praktischen Nutzung stellte sich heraus, dass input_boolean.mahroboter_spontan_akti in bestimmten Situationen nicht automatisch zurĂŒckgesetzt wird – zum Beispiel wenn der MĂ€hroboter beim Aktivieren des Spontanmodus nicht docked war, oder wenn Home Assistant wĂ€hrend einer laufenden Session neu gestartet wurde.

Das Flag bleibt dann dauerhaft ON und blockiert die automatische Zeitsteuerung, weil diese spontan_akti = off als erste Bedingung prĂŒft.

Trigger:

  • 🏠 Roboter wechselt zu „docked“ oder „charging“

Bedingungen:

  • ▶ spontan_akti ist ON
  • ⏱ Die geplante Endzeit (mahroboter_spontan_ende) ist bereits verstrichen

Ablauf:

  • ⏳ 30 Sekunden warten (State stabilisieren)
  • 🔮 spontan_akti = OFF setzen

👉 Wichtig: Diese Automation greift nicht wĂ€hrend einer aktiven laufenden Session (solange die Zeit noch nicht abgelaufen ist) – der automatische Neustart nach dem Laden funktioniert dadurch weiterhin korrekt.

alias: "MĂ€hroboter: Spontan-Flag zurĂŒcksetzen"
description: >-
  Setzt spontan_akti zurĂŒck wenn Roboter andockt und die geplante Zeit
  abgelaufen ist, oder wenn die Zeit ablÀuft und der Roboter bereits docked ist
triggers:
  - trigger: state
    entity_id: lawn_mower.green_cruiser_lawn_mower
    to:
      - docked
      - charging
  - trigger: template
    value_template: >
      {{ states('input_boolean.mahroboter_spontan_akti') == 'on'
         and now() >= states('input_datetime.mahroboter_ende_spontan') | as_datetime }}
conditions:
  - condition: state
    entity_id: input_boolean.mahroboter_spontan_akti
    state: "on"
  - condition: template
    value_template: >
      {{ now() >= states('input_datetime.mahroboter_ende_spontan') | as_datetime
      }}
actions:
  - delay: "00:00:30"
  - action: input_boolean.turn_off
    target:
      entity_id: input_boolean.mahroboter_spontan_akti
mode: restart

🧠 Besonderheit

Dieses Sicherheitsnetz verhindert, dass ein hĂ€ngendes Flag die gesamte automatische Steuerung dauerhaft blockiert – unabhĂ€ngig davon, warum die Hauptautomation die RĂŒcksetzung verpasst hat (HA-Neustart, mode:restart-Unterbrechung, unterbrochene Sequenz).


📊 Die SteuerungsoberflĂ€che (UI) fĂŒr den MĂ€hroboter

MĂ€hroboters

Um die Steuerung einfach und intuitiv zu halten, habe ich in Home Assistant eine ĂŒbersichtliche View aufgebaut.

  • 🕒 Zeit-Fenster Steuerung
  • 🌩 Wetterfreigabe
  • ⚙ Automationsstatus
  • ▶ Manueller Start
  • 📊 Status & Batterie
  • 🎼 Direkte Steuerung

Der Aufbau nutzt Custom Button Cards, die das UI optisch ansprechend und ĂŒbersichtlich gestalten.


      - type: grid
        cards:
          - type: heading
            heading: RasenmÀher Start - & Endzeiten
            heading_style: title
            icon: mdi:robot-mower
          - square: false
            type: grid
            columns: 2
            grid_options:
              rows: 1
            cards:
              - type: custom:button-card
                entity: input_datetime.mahroboter_startzeit
                icon: mdi:clock-start
                show_name: false
                show_state: true
                show_icon: true
                tap_action:
                  action: more-info
                layout: vertical
                aspect_ratio: 3/1
                size: 22px
                styles:
                  card:
                    - height: 60px
                    - padding: 4px
                    - border-radius: 10px
                    - border: '1px solid #555'
                    - background: var(--card-background-color)
                  grid:
                    - grid-template-areas: '"i" "s"'
                    - grid-template-rows: 1fr auto
                    - justify-items: center
                  icon:
                    - width: 24px
                    - height: 24px
                  state:
                    - font-size: 14px
                    - font-weight: bold
              - type: custom:button-card
                entity: input_datetime.mahroboter_endzeit
                icon: mdi:clock-end
                show_name: false
                show_state: true
                show_icon: true
                tap_action:
                  action: more-info
                layout: vertical
                aspect_ratio: 3/1
                size: 22px
                styles:
                  card:
                    - height: 60px
                    - padding: 4px
                    - border-radius: 10px
                    - border: '1px solid #555'
                    - background: var(--card-background-color)
                  grid:
                    - grid-template-areas: '"i" "s"'
                    - grid-template-rows: 1fr auto
                    - justify-items: center
                  icon:
                    - width: 24px
                    - height: 24px
                  state:
                    - font-size: 14px
                    - font-weight: bold
          - type: heading
            heading_style: title
            icon: ''
          - type: heading
            heading: RasenmÀher aktivieren
            heading_style: title
            icon: mdi:robot-mower
          - square: false
            type: grid
            cards:
              - type: custom:button-card
                entity: binary_sensor.maehroboter_regen_ok
                aspect_ratio: 3/1
                size: 22px
                name: Wetterfreigabe
                show_name: true
                show_state: false
                icon: |
                  [[[
                    const s = states['binary_sensor.mahroboter_regen_ok']?.state;
                    return s === 'on'
                      ? 'mdi:weather-sunny'
                      : 'mdi:weather-rainy';
                  ]]]
                tap_action:
                  action: none
                hold_action:
                  action: none
                double_tap_action:
                  action: none
                styles:
                  card:
                    - height: 60px
                    - padding: 6px 10px
                    - border-radius: 10px
                    - border: 1px solid
                    - background: |
                        [[[
                          const s = states['binary_sensor.mahroboter_regen_ok']?.state;
                          if (s === 'on') return '#2e7d32';   // grĂŒn → Freigabe erteilt
                          return '#c62828';                  // rot → gesperrt (Regen)
                        ]]]
                  name:
                    - font-size: 14px
                    - color: '#ffffff'
                  icon:
                    - width: 22px
                    - height: 22px
                    - color: '#ffffff'
              - type: custom:button-card
                entity: >-
                  automation.mahroboter_intelligente_regen_akku_und_zeitsteuerung
                icon: mdi:robot-mower-outline
                show_name: false
                show_state: true
                layout: vertical
                aspect_ratio: 3/1
                size: 22px
                styles:
                  card:
                    - height: 60px
                    - padding: 6px 10px
                    - border-radius: 10px
                    - border: '1px solid #555'
                  grid:
                    - grid-template-areas: '"i" "s"'
                    - grid-template-rows: 1fr auto
                    - justify-items: center
                  icon:
                    - width: 24px
                    - height: 24px
                  state:
                    - font-size: 14px
                    - font-weight: bold
                state:
                  - value: 'on'
                    styles:
                      card:
                        - background: '#2e7d32'
                        - border: '1px solid #ffffff'
                      icon:
                        - color: '#a5d6a7'
                      state:
                        - color: '#e8f5e9'
                  - value: 'off'
                    styles:
                      card:
                        - background: '#c62828'
                        - border: '1px solid #ffffff'
                      icon:
                        - color: '#ffcdd2'
                      state:
                        - color: '#ffebee'
            columns: 2
            grid_options:
              columns: 12
              rows: 1
          - type: heading
            heading_style: title
            icon: ''
          - type: heading
            heading: RasenmÀher manueller Start
            heading_style: title
            icon: mdi:robot-mower
          - square: false
            type: grid
            cards:
              - type: custom:button-card
                entity: input_boolean.mahroboter_spontan_akti
                aspect_ratio: 3/1
                size: 22px
                name: Start jetzt
                icon: mdi:play-circle-outline
                tap_action:
                  action: toggle
                styles:
                  card:
                    - height: 60px
                    - padding: 6px 10px
                    - border-radius: 10px
                    - cursor: default
                  name:
                    - font-size: 14px
                    - font-weight: 600
                  icon:
                    - width: 22px
                    - height: 22px
              - type: custom:button-card
                name: Dauer
                icon: mdi:timer
                show_name: false
                entity: input_number.mahroboter_spontan_dauer
                tap_action:
                  action: call-service
                  service: input_number.increment
                  target:
                    entity_id: input_number.mahroboter_spontan_dauer
                hold_action:
                  action: call-service
                  service: input_number.decrement
                  target:
                    entity_id: input_number.mahroboter_spontan_dauer
                double_tap_action:
                  action: more-info
                show_state: true
                state_display: |
                  [[[
                    const v = Number(entity.state);
                    return `${v} min`;
                  ]]]
                aspect_ratio: 3/1
                size: 22px
                styles:
                  card:
                    - height: 60px
                    - padding: 6px 10px
                    - border-radius: 10px
                    - border: 1px solid
                    - background: |
                        [[[
                          const v = Number(entity.state);
                          if (v === 0) return '#424242';       // aus / deaktiviert
                          if (v <= 120) return '#2e7d32';        // grĂŒn (kurz, sicher)
                          if (v <= 240) return '#f9a825';       // gelb (normal)
                          return '#c62828';                    // rot (lang)
                        ]]]
                  name:
                    - font-size: 14px
                    - font-weight: 600
                    - color: '#cccccc'
                  icon:
                    - width: 22px
                    - height: 22px
                    - color: '#bdbdbd'
                  state:
                    - font-size: 14px
                    - font-weight: bold
                    - color: '#ffffff'
              - type: custom:button-card
                name: LĂ€uft bis
                icon: mdi:clock-end
                show_state: true
                show_icon: false
                state_display: |
                  [[[
                    const e = states['input_datetime.mahroboter_spontan_ende'];
                    if (!e || !e.state) return "-";

                    const d = new Date(e.state);
                    if (isNaN(d)) return "-";

                    return d.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});
                  ]]]
                styles:
                  card:
                    - height: 60px
                    - border-radius: 10px
                    - border: |
                        [[[
                          const e = states['input_datetime.mahroboter_spontan_ende'];
                          if (!e || !e.state) return 'none';

                          const end = new Date(e.state);
                          const now = new Date();

                          return (end > now) ? '1px solid white' : 'none';
                        ]]]
                    - background: |
                        [[[
                          const e = states['input_datetime.mahroboter_spontan_ende'];
                          if (!e || !e.state) return '#424242';

                          const end = new Date(e.state);
                          const now = new Date();

                          return (end > now) ? '#2e7d32' : '#424242';
                        ]]]
                  name:
                    - font-size: 14px
                    - font-weight: 600
                    - color: |
                        [[[
                          const e = states['input_datetime.mahroboter_spontan_ende'];
                          if (!e || !e.state) return '#cccccc';

                          const end = new Date(e.state);
                          const now = new Date();

                          return (end > now) ? 'white' : '#cccccc';
                        ]]]
                  icon:
                    - width: 22px
                    - height: 22px
                    - color: |
                        [[[
                          const e = states['input_datetime.mahroboter_spontan_ende'];
                          if (!e || !e.state) return '#bdbdbd';

                          const end = new Date(e.state);
                          const now = new Date();

                          return (end > now) ? 'white' : '#bdbdbd';
                        ]]]
                  state:
                    - font-size: 16px
                    - font-weight: bold
                    - color: white
              - type: custom:button-card
                show_name: false
                show_icon: false
                show_state: false
                styles:
                  card:
                    - height: 60px
                    - background: none
                    - box-shadow: none
                    - border: none
            columns: 3
            grid_options:
              rows: 1
          - type: heading
            heading_style: title
            icon: ''
          - type: heading
            heading: RasenmÀher Status
            heading_style: title
            icon: mdi:robot-mower
          - square: false
            type: grid
            cards:
              - type: custom:button-card
                entity: lawn_mower.green_cruiser_lawn_mower
                name: Übersicht
                icon: mdi:robot-mower
                show_state: true
                aspect_ratio: 3/1
                size: 22px
                tap_action:
                  action: more-info
                hold_action:
                  action: none
                double_tap_action:
                  action: none
                state:
                  - value: mowing
                    styles:
                      card:
                        - background: '#2e7d32'
                        - border: 2px solid "#2e7d32"
                      icon:
                        - color: '#ffffff'
                      name:
                        - color: '#ffffff'
                      state:
                        - color: '#e8f5e9'
                  - value: returning
                    styles:
                      card:
                        - background: '#ef6c00'
                        - border: 2px solid "#ef6c00"
                      icon:
                        - color: '#ffffff'
                      name:
                        - color: '#ffffff'
                      state:
                        - color: '#fff3e0'
                styles:
                  card:
                    - height: 60px
                    - padding: 6px 10px
                    - border-radius: 10px
                    - background: var(--ha-card-background)
                    - border: 1px solid var(--divider-color)
                    - cursor: pointer
                  grid:
                    - grid-template-areas: '"i n" "i s"'
                    - grid-template-columns: 32px auto
                    - grid-template-rows: auto auto
                    - align-items: center
                    - column-gap: 8px
                  icon:
                    - width: 22px
                    - height: 22px
                    - color: var(--secondary-text-color)
                  name:
                    - font-size: 14px
                    - font-weight: 600
                  state:
                    - font-size: 12px
                    - opacity: 0.8
              - type: custom:button-card
                entity: sensor.green_cruiser_battery_level_2
                name: Batterie
                icon: mdi:battery
                show_state: true
                aspect_ratio: 3/1
                size: 22px
                tap_action:
                  action: more-info
                hold_action:
                  action: none
                double_tap_action:
                  action: none
                styles:
                  card:
                    - height: 60px
                    - padding: 6px 10px
                    - border-radius: 10px
                    - background: var(--ha-card-background)
                    - border: 1px solid var(--divider-color)
                    - cursor: pointer
                  grid:
                    - grid-template-areas: '"i n" "i s"'
                    - grid-template-columns: 32px auto
                    - grid-template-rows: auto auto
                    - align-items: center
                    - column-gap: 8px
                  icon:
                    - width: 22px
                    - height: 22px
                  name:
                    - font-size: 14px
                    - font-weight: 600
                  state:
                    - font-size: 12px
                    - opacity: 0.75
            columns: 2
          - type: heading
            heading: RasenmÀher manuell steuern
            heading_style: title
            icon: mdi:robot-mower
          - square: false
            type: grid
            cards:
              - type: custom:button-card
                entity: button.green_cruiser_start_mowing_now
                name: Start Work
                icon: mdi:home-export-outline
                show_state: false
                aspect_ratio: 3/1
                size: 22px
                tap_action:
                  action: call-service
                  service: button.press
                  target:
                    entity_id: button.green_cruiser_start_mowing_now
                hold_action:
                  action: none
                double_tap_action:
                  action: none
                styles:
                  card:
                    - height: 60px
                    - padding: 6px 10px
                    - border-radius: 10px
                    - background: var(--ha-card-background)
                    - border: 1px solid var(--divider-color)
                    - cursor: pointer
                  grid:
                    - grid-template-areas: '"i n"'
                    - grid-template-columns: 32px auto
                    - align-items: center
                    - column-gap: 8px
                  icon:
                    - width: 22px
                    - height: 22px
                    - color: '#66bb6a'
                  name:
                    - font-size: 14px
                    - font-weight: 600
              - type: custom:button-card
                entity: button.green_cruiser_return_to_dock_2
                name: Back Home
                icon: mdi:home-import-outline
                show_state: false
                aspect_ratio: 3/1
                size: 22px
                tap_action:
                  action: call-service
                  service: button.press
                  target:
                    entity_id: button.green_cruiser_return_to_dock_2
                hold_action:
                  action: none
                double_tap_action:
                  action: none
                styles:
                  card:
                    - height: 60px
                    - padding: 6px 10px
                    - border-radius: 10px
                    - background: var(--ha-card-background)
                    - border: 1px solid var(--divider-color)
                    - cursor: pointer
                  grid:
                    - grid-template-areas: '"i n"'
                    - grid-template-columns: 32px auto
                    - align-items: center
                    - column-gap: 8px
                  icon:
                    - width: 22px
                    - height: 22px
                    - color: '#e57373'
                  name:
                    - font-size: 14px
                    - font-weight: 600
            columns: 2

✅ Fazit und Ausblick

Mit diesen Automatisierungen steuere ich meinen MÀhroboter effizient, wetterabhÀngig und flexibel in Home Assistant.

Die Kombination aus Zeitsteuerung, Regenwettererkennung, Akkustatus und manueller Spontansteuerung sorgt fĂŒr maximale Automatisierung mit Benutzerkomfort.

Die Helper erlauben individuelle Anpassungen ohne CodeÀnderung und die UI macht die Bedienung kinderleicht.

Ich hoffe, dieser umfassende Einblick in meine MÀhroboter-Steuerung zeigt dir, wie smart und flexibel man selbst vermeintlich simple GerÀte in Home Assistant automatisieren kann!


⚠ Problem: Der Gardena Zeitplan als „unsichtbarer Gegenspieler“

Im Laufe der Umsetzung bin ich auf ein zentrales Problem gestoßen, das vermutlich viele Gardena-Nutzer kennen: Der in der App konfigurierte Zeitplan ĂŒbernimmt nicht nur die Steuerung des MĂ€hzeitraums, sondern beeinflusst auch das interne Verhalten des Roboters deutlich stĂ€rker als zunĂ€chst gedacht.

Wird der Zeitplan aktiv genutzt, sorgt er zwar fĂŒr ein stabiles Ladeverhalten, jedoch startet der MĂ€hroboter automatisch zu den im Plan definierten Zeiten – unabhĂ€ngig davon, ob Home Assistant gerade andere Bedingungen vorgibt.

Eine einfache Lösung wie das „Pausieren“ des Zeitplans fĂŒhrt dabei nicht zum Ziel, da dieser Zustand von der Cloud bzw. vom GerĂ€t selbst jederzeit wieder aufgehoben werden kann. In der Praxis bedeutet das: Der MĂ€hroboter kann plötzlich wieder eigenstĂ€ndig starten, z. B. frĂŒh am Morgen, obwohl dies im Smart Home so gar nicht vorgesehen ist.

Auf der anderen Seite fĂŒhrt ein vollstĂ€ndiges Deaktivieren oder Entfernen des Zeitplans hĂ€ufig dazu, dass der Roboter nicht mehr zuverlĂ€ssig vollstĂ€ndig lĂ€dt, da die interne Energiemanagement-Logik ebenfalls daran gekoppelt ist.

👉 Es entsteht also ein klassischer Zielkonflikt:

  • ✅ Zeitplan aktiv → stabiles Laden, aber ungewollte Starts
  • ❌ Zeitplan aus → volle Kontrolle ĂŒber Home Assistant, aber suboptimales Ladeverhalten

Die Lösung dieses Problems ist kein simples Umschalten, sondern eine gezielte Kombination aus beiden Welten:

  • ✅ Der Zeitplan bleibt aktiv (fĂŒr optimales Ladeverhalten)
  • ✅ Home Assistant ĂŒbernimmt die eigentliche Steuerung
  • 🛡 UnerwĂŒnschte Starts werden aktiv erkannt und sofort korrigiert

Genau aus diesem Grund ist die dritte Automatisierung „Unerlaubten Start blockieren“ ein essenzieller Bestandteil der Gesamtarchitektur. Sie fungiert als Schutzmechanismus, der sicherstellt, dass ausschließlich Home Assistant bestimmt, wann der Roboter tatsĂ€chlich mĂ€ht.

Schreibe einen Kommentar

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