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_aktiist ON - đ
hat_gemaehtist 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_aktiist 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

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.