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.


:wrench: 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

:backhand_index_pointing_right: Problem:

  • Zeitplan aktiv → :white_check_mark: gutes Ladeverhalten, :cross_mark: automatisches Starten
  • Zeitplan deaktiviert → :white_check_mark: keine Eigenstarts, :cross_mark: Ladeverhalten teilweise suboptimal

Zusätzlich:

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

:bullseye: Ziele meiner Automatisierung

  • :white_check_mark: Mähen nur in festgelegten Zeitfenstern
  • :cloud_with_rain: Kein Mähen bei Regen
  • :battery: Automatisches Fortsetzen des Mähens nach dem Aufladen
  • :high_voltage: Manuelles, spontanes Mähen für eine selbstgewählte Dauer unabhängig von Zeitfenstern
  • :stop_sign: Verhindern unerlaubter Starts außerhalb erlaubter Zeitfenster ohne expliziten Home Assistant-Trigger
  • :bar_chart: Übersichtliche Bedienelemente und Statusanzeigen in Home Assistant
  • :backhand_index_pointing_right: Home Assistant soll die einzige Steuerinstanz sein – ohne unkontrolliertes Eigenverhalten des Roboters

:puzzle_piece: Architektur meines Systems

Das gesamte System basiert auf drei zentralen Bausteinen:

  • Automatikbetrieb (Zeit + Wetter + Akku)
  • Spontanbetrieb (manuell über UI)
  • Schutz-Mechanismus gegen Fremdstarts

:puzzle_piece: Wichtigste Hilfsmittel: Helper (Input-Entitäten)

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

:radio_button: 1. Steuer-Flags

  • :play_button: input_boolean.mahroboter_spontan_akti
    Steuert den manuellen, spontanen Mähmodus. Wird dieser aktiviert, läuft der Mäher unabhängig vom Zeitfenster.
  • :pushpin: 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.

:stopwatch: 2. Zeitsteuerung

  • :three_o_clock: 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.

:hourglass_not_done: 3. Spontanmodus Parameter

  • :stopwatch: input_number.mahroboter_spontan_dauer
    Einstellbarer Timer, wie lange das spontane Mähen laufen soll.
  • :date: input_datetime.mahroboter_spontan_ende
    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.


:sun_behind_rain_cloud: Wetterlogik (Binary Sensor)

Ein wichtiger Bestandteil ist ein eigener Sensor:

:backhand_index_pointing_right: „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 %}

:backhand_index_pointing_right: Vorteil:

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


:gear: Die drei finalen Automatisierungen im Detail

1. :seedling: 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:

  • :alarm_clock: Startzeit erreicht (input_datetime.mahroboter_startzeit)
  • :chequered_flag: Endzeit erreicht (input_datetime.mahroboter_endzeit)
  • :cloud_with_rain: Regen beginnt
  • :sun: Regen ist mindestens 2 Stunden vorbei
  • :battery: Akku voll (>95%)

Bedingungen & Ablauf:

  • :right_arrow: Start bei passenden Bedingungen innerhalb Zeitfenster
  • :prohibited: Kein Start bei Regen
  • :counterclockwise_arrows_button: Fortsetzung nach dem Laden
  • :stop_sign: 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.

:brain: Besonderheit:
Die Automation nutzt gezielt Trigger-IDs (zeit_start, regen_vorbei, akku_voll) und Zustandslogik (mahroboter_hat_gemaeht), um Chaoszustände zu vermeiden.

:backhand_index_pointing_right: Dadurch entsteht eine sehr präzise Steuerung ohne Chaoszustände

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


2. :high_voltage: 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:

  • :play_button: Spontanmodus wird aktiviert
  • :battery: Akku ist voll

Ablauf:

  • :rocket: Start aus dem Dock
  • :date: Berechnung der Endzeit
  • :stopwatch: Lauf für definierte Dauer
  • :house: Rückkehr ins Dock
  • :repeat_button: Neustart nach Laden wenn nötig

:brain: Besonderheit:
Diese Automation funktioniert unabhängig vom Zeitfenster — daher war eine zusätzliche Schutzlogik notwendig.

alias: "Mähroboter: Spontan mähen für Dauer"
description: ""
triggers:
  - trigger: state
    entity_id: input_boolean.mahroboter_spontan_akti
    to: "on"
    id: start
  - trigger: numeric_state
    entity_id: sensor.green_cruiser_battery_level_2
    above: 95
    id: akku_voll
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_spontan_ende
            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
      - conditions:
          - condition: trigger
            id: akku_voll
          - 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
        sequence:
          - action: button.press
            target:
              entity_id: button.green_cruiser_start_mowing_now
mode: restart


3. :shield: Unerlaubten Start blockieren

Manche Mäher starten auch mal spontan oder ungewollt. Diese Automatisierung verhindert genau das.

Das Problem:
Der Gardena Zeitplan darf weiterhin aktiv bleiben (für Ladeverhalten), startet aber gelegentlich eigenständig.

Trigger:

  • :high_voltage: Zustand wechselt auf „mowing“

Bedingungen:

  • :prohibited: Spontanmodus aus
  • :alarm_clock: außerhalb Zeitfenster

Ablauf:

  • :hourglass_not_done: kurze Wartezeit
  • :repeat_button: erneute Prüfung
  • :house: Rückfahrt zum Dock

:brain: Ergebnis:

  • Der Zeitplan bleibt aktiv
  • Das Ladeverhalten bleibt optimal
  • Aber jede unerwünschte Bewegung wird sofort gestoppt
alias: "Mähroboter: Unerlaubten Start blockieren"
description: Stoppt den Mäher, wenn er außerhalb erlaubter Zeiten ohne HA-Trigger startet
triggers:
  - entity_id: lawn_mower.green_cruiser_lawn_mower
    to: mowing
    trigger: state
conditions:
  - condition: state
    entity_id: input_boolean.mahroboter_spontan_akti
    state: "off"
  - condition: or
    conditions:
      - condition: time
        before: input_datetime.mahroboter_startzeit
      - condition: time
        after: input_datetime.mahroboter_endzeit
actions:
  - delay: "00:00:05"
  - condition: state
    entity_id: lawn_mower.green_cruiser_lawn_mower
    state: mowing
  - delay: "00:00:03"
  - target:
      entity_id: button.green_cruiser_return_to_dock_2
    action: button.press
mode: restart

:bar_chart: Die Steuerungsoberfläche (UI) für den Mähroboter

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

Diese umfasst:

  • :three_o_clock: Zeit-Fenster Steuerung (Start & Endzeit)
  • :sun_behind_rain_cloud: Wetterfreigabe (Farbige Anzeige basierend auf binary_sensor.maehroboter_regen_ok)
  • :gear: Automationsstatus
  • :play_button: Manueller Start / Spontanmodus mit Dauer-Einstellung und Anzeige Ende
  • :bar_chart: Status des Mähers und Batteriestand
  • :video_game: Direkte Steuerung (Start / Zurück zum Dock)

Der Aufbau nutzt custom:button-card, um Karten farblich und interaktiv attraktiv zu 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

:white_check_mark: 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!


:warning: 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.

:backhand_index_pointing_right: Es entsteht also ein klassischer Zielkonflikt:

  • :white_check_mark: Zeitplan aktiv → stabiles Laden, aber ungewollte Starts
  • :cross_mark: 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:

  • :white_check_mark: Der Zeitplan bleibt aktiv (für optimales Ladeverhalten)
  • :white_check_mark: Home Assistant übernimmt die eigentliche Steuerung
  • :shield: 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.

1 „Gefällt mir“