Robot lawn mowers from Husqvarna, Worx, Ecovacs, Mammotion, ZCS, Bosch, Gardena and Dreame: status, battery, actions, map.
Works on top of the integrations you already use (Husqvarna Automower, Landroid Cloud, Ecovacs, Mammotion, ZCS Mower, Bosch Indego, Gardena Smart System, Dreame Mower) and any other lawn_mower entity, with automatic discovery: a drawn mower in the brand's colours animated by what it does, battery, next start, settings, errors, actions, options, maintenance, statistics, live cameras and map.
Highlights
- Husqvarna, Worx (Landroid, Kress, Landxcape), Ecovacs GOAT, Mammotion, ZCS, Bosch Indego, Gardena and Dreame supported, plus any lawn_mower entity
- Entities of your choice for an integration the cards do not know or a sensor of your own
- Drawn mower picture in the brand's colours (Dreame with its LiDAR turret), animated while mowing, returning, charging, in error or under rain delay
- Battery, status, next start, progress, work area, cutting height and mower settings as tags
- Start / pause, stop and dock buttons following the entity's supported features
- Integration buttons as one-tap actions with a confirmation, switches as options
- Blade usage, charge cycles and collisions with reset buttons, and session statistics
- Live vision cameras (Mammotion) and garden map (Ecovacs GOAT, Bosch Indego) in collapsible sections
- Mini card with a detail button switching to the full card
Brands & integrations
Husqvarna
Worx Landroid
Ecovacs
Mammotion
ZCS
Bosch Indego
Gardena
Dreame
Cards
type: custom:mower-cardInstall
- 1Open the repository in the Marketplace with the Add to Marketplace button above, or add
github.com/juju35/ha-mower-cardas a custom repository (category Dashboard). - 2Download it from the Marketplace.
- 3Reload the browser and add the card from the dashboard editor.
Gallery 24
Documentation
From the README Features
Features
- Two cards: a full Mower Card (
custom:mower-card) and a compact Mower Mini Card (custom:mower-mini-card) - Any robot lawn mower exposed as a
lawn_mowerentity, several devices supported; the other devices of the same integrations (Ecovacs vacuums, Gardena valves…) are skipped - Drawn mower picture in the brand's colors, animated by what the mower is doing (mowing, returning to the station, charging, error, rain delay), or your own picture
- Header icon of the robot mower with the brand logo as a badge, opening the brand's site, and buttons in the brand's color, readable in the light and dark themes
- Battery (sensor, or the mower's
battery_levelattribute) with the charging bolt, status, next scheduled start or last completed session, progress, time left and area of the current session - Mower settings as tags: work area or zone, mode, cutting height, headlights, schedule on or off; why an Automower stays parked (week schedule, frost, daily limit…)
- Errors (error sensor, alert, stuck), rain detected and rain delay remaining
- Start / pause, stop (when the integration supports it) and dock buttons, following the entity's
supported_features - Actions: the buttons of the integration (edge cut, confirm error, relocate, continue last job…) as one-tap buttons with a confirmation
- Options: the switches of the integration (schedule, party mode, lock, stay-out zones, border cutting…) as toggles
- Maintenance: blade usage time or remaining life, battery charge cycles, collisions, with a reset button (with confirmation) when the integration provides one
- Statistics: last session, mowing, running, charging and searching time, distance, total area, number of sessions
- Live camera of the mower (Mammotion Luba / Yuka vision cameras, or any camera entity with
camera_entity), played by Home Assistant's own player in a section folded by default: the stream only runs while the section is unfolded and the card visible, one tab per camera - Map of the garden while the mower works (or always, or never), from the integration's image entity or picture-only camera (Ecovacs GOAT, Bosch Indego) or any entity of yours (
map_entity) - Collapsible sections (camera and statistics folded by default)
- Sections view: the full card takes 12 columns by default and at least 9, the mini card 6; narrow widths get their own layout (see Screenshots)
- Command buttons disabled while the mower is unavailable
- Detail button on the mini card (top right): it switches the mini card to the full card's content and back; a click anywhere outside the card brings the compact view back
- Click any value to open its Home Assistant history (more-info dialog)
- Visual editor in the dashboard UI for both cards (no YAML needed)
- Light and dark mode, English, French, German, Spanish, Serbian (Cyrillic and Latin), Italian, Dutch, European Portuguese, Polish, Romanian, Danish, Swedish, Bulgarian, Russian, Ukrainian, Hungarian, Slovak, Czech, Slovenian, Latvian and Greek
- Single file, no external dependency, the logos and pictures are embedded
Supported integrations
Supported integrations
| Integration | Brands | What the cards show |
|---|---|---|
| Husqvarna Automower | Status, battery and charging, next start, restricted reason, mode, work area and its progress, cutting height, headlights, errors, controls, confirm error, schedule and stay-out zone switches, blade usage time with reset, charge cycles, collisions, totals (mowing, running, charging, searching time, distance) | |
| Worx Landroid, Kress, Landxcape, Ferrex | Status (edge cut, zoning, rain delay…), battery and charging, next schedule, daily progress, zone, cutting height, errors, rain sensor and rain delay, controls, edge cut, schedule / party mode / lock switches, blade time and charge cycles with reset, running time and distance | |
| Ecovacs GOAT | Status, battery, errors, work mode, controls (stop included), relocate, border cutting switch, blade life in % with reset, last session, totals (area, mowing time, sessions), map | |
| Mammotion Luba, Yuka | Status, battery and charging, mode, work area, progress, time left, area, blade height, errors, rain, controls (stop included), actions (continue last job, cancel task…), switches, blade time, charge cycles, running time and distance, live vision cameras | |
| Ambrogio, Techline, Wiper | Status, battery, error, controls, actions (work now, charge now, border cut, wake up, trace position) | |
| Bosch Indego | Status, battery and charging, lawn mowed in % and m², last completed, next mow, mowing mode, alert and mower stuck, controls, SmartMowing switch, runtime, garden size, sessions, charge cycles, map (its camera entity) | |
| Gardena Sileno | Status, battery, error, controls, operating hours | |
| Dreame Mower (custom) | Dreame A1, A1 Pro, A2 | Status, battery, controls, progress, current task, blade and brush health, schedules and options (rain protection, edge mowing, anti-theft…) |
| Any other | — | Status, battery (sensor with the battery device class or battery_level attribute), charging and rain binary sensors by their device class, controls, buttons as actions, switches as options, streaming cameras in the camera section, image or picture-only camera as map |
Details in Integrations.
Prerequisites
Prerequisites
Home Assistant 2024.8 or later, with at least one integration providing a lawn_mower entity configured.
Configuration
Configuration
Card types#
| Card | Type |
|---|---|
| Mower Card | custom:mower-card |
| Mower Mini Card | custom:mower-mini-card |
Visual editor#
Both cards have a visual editor: add the card from the dashboard UI, pick the mower and the options. No YAML needed.
Minimal#
type: custom:mower-card
type: custom:mower-mini-card
Without device, the cards show the first lawn mower found.
Full options#
type: custom:mower-card
device: Automower 430X NERA # device name (as shown in Home Assistant) or device id
title: Garden mower # optional, defaults to the device name
image: auto # auto (drawn, brand colors) | none | URL of your own picture
show_controls: true
show_settings: true # work area, mode, cutting height, headlights, schedule tags
show_actions: true
show_options: true
show_maintenance: true
show_stats: true
show_camera: true # live camera section (Mammotion vision cameras…)
show_map: mowing # never | mowing | always
collapsed: # sections folded by default
- camera
- stats
map_entity: image.goat_g1_map # optional, a camera or image entity
camera_entity: camera.garden # optional, replaces the cameras of the device
language: en # optional, defaults to the Home Assistant language
type: custom:mower-mini-card
device: Automower 430X NERA
show_controls: true
zoom: true # detail button at the top right
Options reference#
| Option | Card | Default | Description |
|---|---|---|---|
device |
both | First lawn mower | Device to display: its name (as shown in Home Assistant) or its device id (set by the visual editor) |
title |
both | Device name | Card title |
show_title |
both | true |
Show the title in the header (e.g. false under a section heading of your own) |
show_subtitle |
both | true |
Show the subtitle under the title |
image |
both | auto |
Device picture: auto (drawn in the brand's colors, animated), none, or the URL of your own picture (e.g. /local/my-mower.png) |
show_controls |
both | true |
Start / pause, stop and dock buttons, action buttons, option toggles and maintenance reset buttons |
zoom |
mini | true |
Detail button at the top right of the mini card: it shows the full card's content (with the same options, so show_map, collapsed… can be set on the mini card too) and switches back to the compact view; a click outside the card also brings the compact view back. false removes the button |
show_settings |
full | true |
Mower settings tags: work area or zone, mode, cutting height, headlights, schedule on or off |
show_actions |
full | true |
Actions section: the integration's buttons (edge cut, confirm error, relocate, continue last job…) |
show_options |
full | true |
Options section: the integration's switches (schedule, party mode, lock, stay-out zones…) |
show_maintenance |
full | true |
Maintenance: blades, charge cycles, collisions |
show_stats |
full | true |
Statistics |
show_camera |
full | true |
Camera section: the live cameras of the mower, one tab per camera, played by Home Assistant's own player (WebRTC, HLS or MJPEG). Folded by default: the stream only runs while the section is unfolded and the card is visible on screen, and stops when it is folded (a click outside the card folds it), scrolled away or in a hidden tab — a mower on a cellular connection meters its streaming time. The button on the picture opens the camera's dialog |
show_map |
full | mowing |
Map of the garden: mowing (only while the mower works), always (or true) or never (or false) |
collapsed |
full | [camera, stats] |
Sections folded by default, among actions, options, maintenance, stats and camera ([] to unfold everything). Click a section title (or Tab to it and press Enter or Space) to fold or unfold it |
map_entity |
full | — | Camera or image entity to show as the map instead of the integration's (Ecovacs GOAT map image, Bosch Indego camera) |
camera_entity |
full | — | Camera entity for the camera section, instead of the streaming cameras of the device (a garden camera pointed at the lawn, say) |
entities |
both | — | Entities of your choice under the names the cards read, replacing the ones found: battery, progress, next_start, work_area, mode, error, rain, blade_life, brush_life, blade_time, charging_cycles, total_distance, cutting_height… For example entities: { blade_life: sensor.my_blade_health } |
language |
both | Auto | Force language: fr, en, de, es, sr, sr-Latn, it, nl, pt, pl, ro, da, sv, bg, ru, uk, hu, sk, cs, sl, lv or el (auto-detects from HA settings) |
How it works
How it works
Integrations#
The cards list every device that carries a lawn_mower entity, whatever the integration. The other entities of the device (sensors, binary sensors, buttons, switches, numbers, selects, images, cameras) are read by their translation_key, mapped per integration to a common set of names (battery, progress, next start, work area, blade time, charge cycles, total distance…). Integrations without translation keys (Bosch Indego, Gardena) are read by the end of their entity ids. entities sets any of them by hand. Where no key matches, the cards fall back to device classes: battery, battery_charging, moisture (rain), problem.
For an integration the cards do not know, they still show the status and the controls of the lawn_mower entity, the battery, every button of the device as an action and every switch as an option, and an image or camera entity as the map.
Controls#
The Start / pause, Stop and Dock buttons follow the supported_features attribute of the lawn_mower entity (START_MOWING, PAUSE, STOP, DOCK) and call the lawn_mower.start_mowing, lawn_mower.pause, lawn_mower.stop and lawn_mower.dock actions. Actions press the integration's button entities and options toggle its switch entities (the requested state is shown until the integration reports it, up to 45 s). Pressing a button asks for a confirmation in the card.
Camera and map#
A camera entity of the device that reports a stream type (frontend_stream_type: WebRTC or HLS — the Mammotion vision cameras) goes to the camera section, played by Home Assistant's ha-camera-stream element (loaded on demand, like the picture cards). A camera without a stream only renders a picture (the Bosch Indego garden map) and is shown as the map, like the image entities (Ecovacs GOAT). camera_entity and map_entity override both choices.
Brands#
The integration a device comes from gives the logo of the header badge, the colors of the drawn picture and the accent color of the buttons, lighter in the dark theme. Unknown integrations get the mower icon alone and a green accent.
States#
The lawn mower activities of Home Assistant (mowing, docked, paused, returning, error, idle) and the extra states of Landroid Cloud (starting, edgecut, zoning, searching_zone, escaped_digital_fence, rain_delayed) are translated by the cards; any other state falls back to Home Assistant's own translation of the integration.
Changelog
All 7 versions 1.4.1Nov 13, 2026Latest
Fixes
- Folding back on a tap elsewhere now works on iOS (Safari and the companion app): a tap on something that is not clickable sent no click to the page, so the unfolded sections, the confirmation popup and the detail view of the mini card stayed open. The press and the release are caught instead; a slider dragged out of the card and a scroll do not fold anything, and keyboard clicks still work.
- Leaving the card (another dashboard view, a conditional card hidden) brings it back in its default state, instead of coming back unfolded or with its popup open.
- Clicks no longer get lost under an update: Home Assistant updates the card several times a second, and a rewrite between the press and the release replaced the element pressed, so the click did nothing. The card is not rewritten while pressed; the pending update is drawn right after the click.
- No focus ring after a mouse click: the focus is put back on the clicked element after an update only for the keyboard.
1.4.0Nov 12, 2026
Features
show_titleandshow_subtitleoptions (also in the visual editor) hide the header's title and its subtitle, separately, for a card placed under a section heading of its own (asked in juju35/ha-vehicle-card#72).
1.3.0Nov 11, 2026
Features
- Dreame (#11): the Dreame Mower integration of the Marketplace gets its logo, its own drawing (with its LiDAR turret) and colors, and its progress, current task, blade and brush health (a Brush row in the maintenance section) and schedules mapped. It has no camera and no action buttons, so these sections stay hidden.
- Entities of your choice:
entitiessets the entities read under each name (battery,progress,blade_life,next_start,rain…), replacing the ones found, for an integration the cards do not know or a sensor of your own.
1.2.1Nov 9, 2026
Fixes
- Translations: the cards are defined once the page's language file has arrived (at most 1.5 s; Home Assistant builds a card when its element gets defined), so the first render is already translated instead of English then redrawn; until a language file is in, a missing text reads the English one wherever the card has no fallback of its own.
1.2.0Nov 9, 2026
Performance
- Translations load on demand: the bundle keeps English only (238 KB → 179 KB) and each other language is its own
mower-card.i18n.<lang>.jsfile next to it, fetched the first time a card needs it. Home Assistant loads every dashboard resource on every dashboard, so each page used to download and parse all 22 languages to use one. Until a language file has arrived (a few milliseconds), texts fall back to English, and the cards redraw once it is there.
Maintenance
- Build:
scripts/i18n-split.mjssplits the built bundle and rebuilds every table from the split files to check them (the build fails on any difference);src/keeps every language as before. - Release: every file of
dist/is attached. Manual installation copies the translation files too.
1.1.0Nov 8, 2026
Features
- Camera section: the live cameras of the mower (Mammotion Luba / Yuka vision cameras, or any camera with
camera_entity), one tab per camera, played by Home Assistant's own player. Folded by default (collapsednow[camera, stats]): the stream only runs while the section is unfolded and the card visible on screen, and stops when it is folded, scrolled away or in a hidden tab.show_camera: falseremoves it. - Cameras that only render a picture (the Bosch Indego garden map) are shown as the map, not as a live camera.