🌿 Landroid mower card for Home Assistant Lovelace UI
- Landroid Cloud integration version 7 or above.
- To view sensor values, you must enable them in the device settings — most are disabled by default.
First, you need to install the Landroid Cloud integration.
Install using HACS or follow this guide.
Just click this button to add the repository to HACS:
Or you can manually add this repository to your HACS installation. Here is the manual process.
Manual
Do not use this method if you have already installed the card via HACS!
If you prefer not to use HACS, you can manually install the card:
-
Download all
jsfiles from the latest release. -
Place them into your
config/wwwfolder. -
Add a reference to
landroid-card.jsin Lovelace. There are two ways to do this:-
Using the UI:
-
Navigate to the Resources page by following the link below:
Or go to Settings → Dashboards → click the three dots in the top right corner and choose Resources.
-
Click the Plus button.
-
Set URL to
/local/landroid-card.js. -
Set Resource type to
JavaScript Module.
Note: If you do not see the Resources tab, you need to enable Advanced Mode in your User Profile.
-
-
Using YAML: Add the following code to the
lovelacesection:resources: - url: /local/landroid-card.js type: module
-
-
Add
custom:landroid-cardto Lovelace UI as you would with any other card (using either the editor or YAML configuration).
If you are upgrading from an older version of this card (v1.x / Landroid Cloud 6):
- Update Landroid Cloud integration to version 7+
- Change your main entity from
vacuum.mower→lawn_mower.mower - Rename
settings:→settings_card:in your card config (old key still works) - Update shortcuts and actions to the new
actionobject format (see Shortcuts)
Entities in
info_card,battery_card,statistics_cardandsettings_cardare now auto-discovered from the device — you can remove manual lists unless you want to override the order.
This card can be configured using the Lovelace UI editor.
- In Lovelace UI, click the three dots in the top left corner.
- Click Configure UI.
- Click the Plus button to add a new card.
- Find Custom: Landroid Card in the list.
- Choose an
entity. - You should now see a preview of the card! 🎉
Note:
actions,shortcuts, andstatsare not yet supported in the visual editor — use the YAML/Code editor for these options.
The visual editor is organized into tabs: General, Battery 🔋, Info ℹ️, Statistics 📊, and Settings ⚙️. Entity order within each tab can be changed by drag & drop.
A typical example of using this card in YAML configuration:
type: custom:landroid-card
entity: lawn_mower.mower
# camera: camera.mower_camera # optional
# camera_view: live # optional: 'auto' | 'live'
# camera_controls: false # optional
# camera_muted: true # optional
image: default
image_size: '4'
show_animation: true
show_edgecut: true
show_status: true
show_toolbar: true
shortcuts:
- name: Notification
icon: mdi:bell
action:
action: perform-action
perform_action: automation.toggle
target:
entity_id: automation.mower_notify_status
stats:
default:
- entity_id: sensor.mower_blades_total_on_time
subtitle: Total blade time
value_template: '{{ as_timedelta((value | float(0) * 3600) | round(0) | string) }}'
- entity_id: sensor.mower_blades_current_on_time
subtitle: Current blade time
value_template: '{{ as_timedelta((value | float(0) * 3600) | round(0) | string) }}'
- entity_id: sensor.mower_total_worktime
subtitle: Work time
value_template: '{{ as_timedelta((value | float(0) * 3600) | round(0) | string) }}'
- entity_id: sensor.mower_distance_driven
value_template: '{{ (value | float(0) / 1000) | round(3) }}'
unit: km
subtitle: Distance
mowing:
- entity_id: sensor.mower_yaw
subtitle: Yaw
unit: °
- entity_id: sensor.mower_roll
subtitle: Roll
unit: °
- entity_id: sensor.mower_pitch
subtitle: Pitch
unit: °Here is an explanation of each option:
| Name | Type | Default | Description |
|---|---|---|---|
type |
string |
custom:landroid-card |
Type of the card — must be custom:landroid-card |
entity |
string |
Required | An entity_id within the lawn_mower domain |
camera |
string |
Optional | An entity_id within the camera domain, for displaying the live camera stream |
camera_view |
string |
auto |
Camera stream mode: auto (let HA decide) or live (force live stream) |
camera_controls |
boolean |
false |
Show video playback controls on the camera stream |
camera_muted |
boolean |
true |
Mute audio in the camera stream |
image |
string |
default |
Path to an image of your mower. Use png or svg formats for best results |
image_size |
integer |
4 |
Image size — an integer from 1 to 8, where each unit equals 50 px (e.g., 2 → 100 px) |
image_left |
boolean |
false |
Show the image on the left side |
show_animation |
boolean |
true |
Show image animation while mowing or returning |
show_edgecut |
boolean |
true |
Show the edgecut button on the toolbar |
show_name |
boolean |
false |
Show the friendly name of the mower |
show_status |
boolean |
true |
Show the current status of the mower |
show_toolbar |
boolean |
true |
Show the toolbar with action buttons |
compact_view |
boolean |
false |
Use a compact view without an image |
settings_card |
object |
Optional | List of configuration entities shown when the ⚙️ button is clicked. Leave empty for auto-discovery from the device's config category. Replaces deprecated settings. |
battery_card |
object |
Optional | List of entities shown when the 🔋 button is clicked at the top right corner of the card. Leave empty to use defaults |
info_card |
object |
Optional | List of entities shown when the 🛜 button is clicked at the top left corner of the card. Leave empty to use defaults |
statistics_card |
object |
Optional | List of entities shown when the ⌚ button is clicked at the top middle of the card. Leave empty to use defaults |
stats |
object |
Optional | Custom per-state stats displayed below the mower image |
actions |
object |
Optional | Override default toolbar button actions with custom service calls |
shortcuts |
object |
Optional | List of custom shortcut buttons shown at the bottom right of the card |
Defines which configuration entities are shown when the ⚙️ button is clicked at the bottom of the card. You can find available entities in your device's Configuration section.
Note: If
settings_cardis not specified, entities withconfigcategory are discovered automatically. The oldsettingskey still works as a fallback.
settings_card:
- switch.mower_party_mode
- switch.mower_locked
- number.mower_raindelay
- number.mower_time_extension
- number.mower_torque
- select.mower_current_zone
- button.mower_start_cutting_edge
- button.mower_restart_baseboardDefines which entities are shown when the tip buttons are clicked at the top of the card.
Note: These lists are optional. If not specified, the card automatically detects the relevant entities from your device using
translation_key. Specify them only if you want to override the defaults or change the order.
To remove an entity from a card in the visual editor, simply clear its field — the card will revert to automatic detection.
battery_card:
- sensor.mower_battery
- sensor.mower_battery_temperature
- sensor.mower_battery_voltage
- sensor.mower_battery_charge_cycles
info_card:
- sensor.mower_rssi
- sensor.mower_serial_number
- update.mower_firmware
statistics_card:
- sensor.mower_total_worktime
- sensor.mower_blades_total_on_time
- sensor.mower_blades_current_on_time
- sensor.mower_distance_drivenYou can use any mower attribute or any entity by entity_id to display in the stats section:
| Name | Type | Description |
|---|---|---|
entity_id |
string |
An entity_id with a state, e.g., sensor.mower |
attribute |
string |
The attribute name to display, e.g., total_blade_time |
value_template |
string |
Jinja2 template returning a value. See Home Assistant Templating. The value variable represents the state of entity_id or attribute, e.g., "{{ as_timedelta((value | float(0) * 60) | string) }}" |
unit |
string |
Unit of measure, e.g., hours |
subtitle |
string |
Friendly label for the stat, e.g., Blade time |
stats:
default:
- entity_id: sensor.mower_blades_total_on_time
subtitle: Total blade time
value_template: '{{ as_timedelta((value | float(0) * 3600) | string) }}'
- entity_id: sensor.mower_blades_current_on_time
subtitle: Current blade time
value_template: '{{ as_timedelta((value | float(0) * 3600) | string) }}'
- entity_id: sensor.mower_total_worktime
subtitle: Work time
value_template: '{{ as_timedelta((value | float(0) * 3600) | string) }}'
- entity_id: sensor.mower_distance_driven
value_template: '{{ (value | float(0) / 1000) | round(3) }}'
unit: km
subtitle: Distance
mowing:
- entity_id: sensor.mower_yaw
subtitle: Yaw
unit: °
- entity_id: sensor.mower_roll
subtitle: Roll
unit: °
- entity_id: sensor.mower_pitch
subtitle: Pitch
unit: °Override the default behavior of toolbar buttons. Available keys: start_mowing, edgecut, pause, dock.
| Name | Type | Description |
|---|---|---|
perform_action |
string |
An action to call, e.g., script.mowing_zone_2 |
target |
object |
Target for the action call |
data |
object |
Optional data payload |
actions:
start_mowing:
action: perform-action
perform_action: script.mowing_zone_2
edgecut:
action: perform-action
perform_action: landroid_cloud.setzone
target:
entity_id: lawn_mower.mower
data:
zone: '1'Add custom shortcut buttons to the toolbar using any Home Assistant action.
| Name | Type | Description |
|---|---|---|
name |
string |
Friendly name of the shortcut, e.g., Mow zone 2 |
icon |
string |
Any MDI icon, e.g., mdi:bell |
action |
object |
A Home Assistant action object (see examples below) |
shortcuts:
# perform-action (recommended)
- name: Notification
icon: mdi:bell
action:
action: perform-action
perform_action: automation.toggle
target:
entity_id: automation.mower_notify_status
# navigate to a dashboard view
- name: Garden
icon: mdi:flower
action:
action: navigate
navigation_path: /lovelace/garden
# open a URL
- name: Manual
icon: mdi:book-open
action:
action: url
url_path: https://worx.com/manual.pdf
# open more-info dialog
- name: Mower info
icon: mdi:information
action:
action: more-info
entity: lawn_mower.mowerNote: The old
service/service_dataformat is still accepted for backward compatibility but will be removed in a future release.
This card can be styled by changing the values of these CSS variables (globally or per-card via card-mod):
| Variable | Default value | Description |
|---|---|---|
--lc-background |
var(--ha-card-background, var(--card-background-color, white)) |
Background of the card |
--lc-primary-text-color |
var(--primary-text-color) |
Mower name, stats values, etc. |
--lc-secondary-text-color |
var(--secondary-text-color) |
Status, stats units and titles, etc. |
--lc-icon-color |
var(--secondary-text-color) |
Color of icons |
--lc-toolbar-background |
var(--lc-background) |
Background of the toolbar |
--lc-toolbar-text-color |
var(--secondary-text-color) |
Color of toolbar text |
--lc-toolbar-icon-color |
var(--secondary-text-color) |
Color of toolbar icons |
--lc-divider-color |
var(--entities-divider-color, var(--divider-color)) |
Color of dividers |
--lc-spacing |
10px |
Padding and margin inside the card |
Read more in the Frontend documentation.
my-custom-theme:
lc-background: '#17A8F4'
lc-spacing: 5pxtype: 'custom:landroid-card'
style: |
ha-card {
--lc-background: #17A8F4;
--lc-spacing: 5px;
}Animations are applied only to the image property. Here's how they look:
| Mowing | Docking |
|---|---|
![]() |
![]() |
This card supports translations. Please help add more translations and improve existing ones. Here's a list of supported languages:
-
Čeština (Czech)
-
Dansk (Danish)
-
Deutsch (German)
-
English
-
Español (Spanish)
-
Eesti (Estonian)
-
Français (French)
-
Italiano (Italian)
-
Magyar (Hungarian)
-
Nederlands (Dutch)
-
Polski (Polish)
-
Русский (Russian)
-
Slovenščina (Slovenian)
-
Svenska (Swedish)
This card relies on standard Landroid services such as pause, start, stop, and return_to_base. It should work with all Landroid lawnmowers; however, it has only been physically tested with a Worx Landroid M500 WR141E.
If this card works with your lawnmower, please open a PR and add your model to the list.
| Vendor | Model | Name | Max. Rain Delay |
|---|---|---|---|
| Worx | WR130E | Landroid S300 | 23 hr 30 min |
| Worx | WR100SI | Landroid S390 | |
| Worx | WR141E | Landroid M500 | 12 hr 30 min |
| Worx | WR142E | Landroid M700 | |
| Worx | WR143E | Landroid M1000 | |
| Worx | WR147E | Landroid L1000 | |
| Worx | WR155E | Landroid L2000 | 23 hr 30 min |
| Worx | WR165E | Landroid M500 Plus | 23 hr 30 min |
| Worx | WR167E | Landroid M700 Plus | 23 hr 30 min |
| Worx | WR105SI | Landroid S500 | |
| Worx | WR206E | Landroid M600 | |
| Kress | Mission | KR112 | 12 hr 00 min |
| Your mower? |
If services and the app have stopped working:
- Go to My Landroids.
- Unlink your Landroid.
- Open the app on a mobile device.
- Add your Landroid again.
Want to contribute to the project?
First of all, thanks! 🙏 Check the contributing guidelines for more information.
This project is heavily inspired by:
- Malene Trab — Landroid Cloud Integration
- Denys Dovhan — Vacuum card
Huge thanks for their ideas and efforts 👍
Please see the list of contributors who participated in this project.
💡 Tip: If you like this project, buy me a cup of ☕️ or 🥤:



