Profile
Back to NewsBack
GitHub Trending 13 min
Reader Mode
Barma-lej/landroid-card: Landroid mower card for Home Assistant Lovelace UI

Barma-lej/landroid-card: Landroid mower card for Home Assistant Lovelace UI

20 hours ago

Landroid Card

[![HACS][hacs-image]][hacs-url] ![Latest release][latest-url] ![All releases][downloads] ![Latest release][downloads_latest] !GitHub License [![Community Forum][community-image]][community-url] [![Buy Me A Coffee][buymeacoffee-image]][buymeacoffee-url]

🌿 Landroid mower card for [Home Assistant][home-assistant] Lovelace UI

![Live preview of landroid-card][preview-gif]

Requirements

  • A Home Assistant integration providing a lawn_mower entity (see Compatible integrations below).
  • To view sensor values, you must enable them in the device settings — most are disabled by default.

Compatible integrations

Landroid Card works with any Home Assistant integration that exposes a lawn_mower entity. Auto-discovery of battery, info, and statistics sensors works best when the integration follows [Landroid Cloud][landroid-cloud] translation key conventions (see src/constants.js). For other integrations, a device_class-based fallback is used automatically.

| Integration | Vendor / Models | Notes | | :--- | :--- | :--- | | [Landroid Cloud][landroid-cloud] by MTrab | Worx, Kress, Landxcape | Full support, version 7+ required | | [Worx Landroid Vision PLUS][ha-landroid-vision] by ADNPolymerase | Worx Landroid Vision / Vision Cloud / RTK | Community integration, compatible |

Is your integration missing? Open a PR or issue!

Installation

HACS

Since this card is available in the HACS default store, you can install it directly:

  1. Open HACS in your Home Assistant.
  2. Go to Frontend.
  3. Search for Landroid Card and click on it.
  4. Click Download.
Or use this button for a quick install:

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.</a>

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:

  1. Download all js files from the [latest release][downloads_latest].
  2. Place them into your config/www folder.
  3. Add a reference to landroid-card.js in Lovelace. There are two ways to do this:
1. Using the UI: - Navigate to the Resources page by following the link below: [![Open your Home Assistant instance and show your resources.][dashboard-resources-img]][dashboard-resources]

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_.

2. Using YAML: Add the following code to the lovelace section:

resources:
        - url: /local/landroid-card.js
          type: module
  1. Add custom:landroid-card to Lovelace UI as you would with any other card (using either the editor or YAML configuration).

Migrating from Landroid Cloud 6

If you are upgrading from an older version of this card (v1.x / Landroid Cloud 6):

  1. Update [Landroid Cloud][landroid-cloud] integration to version 7+
  2. Change your main entity from vacuum.mower → lawn_mower.mower
  3. Rename settings: → settings_card: in your card config (old key still works)
  4. Update shortcuts and actions to the new action object format (see Shortcuts)
Entities in info_card, battery_card, statistics_card and settings_card are now auto-discovered
from the device — you can remove manual lists unless you want to override the order.

Usage

This card can be configured using the Lovelace UI editor.

  1. In Lovelace UI, click the three dots in the top left corner.
  2. Click _Configure UI_.
  3. Click the Plus button to add a new card.
  4. Find _Custom: Landroid Card_ in the list.
  5. Choose an entity.
  6. You should now see a preview of the card! 🎉
Note: actions, shortcuts, and stats are 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: sensor.mower_blades_total_on_time name: Total blade time template: '{{ as_timedelta((value | float(0) * 3600) | round(0) | string) }}' - entity: sensor.mower_total_worktime name: Work time template: '{{ as_timedelta((value | float(0) * 3600) | round(0) | string) }}' - entity: sensor.mower_distance_driven name: Distance unit: km template: '{{ (value | float(0) / 1000) | round(3) }}' mowing: - entity: sensor.mower_yaw name: Yaw unit: ° - entity: sensor.mower_roll name: Roll unit: ° - entity: sensor.mower_pitch name: Pitch unit: ° - entity: sensor.mower_roll name: Roll unit: ° states: - mowing - entity: sensor.mower_pitch name: Pitch unit: ° states: - mowing

Here is an explanation of each option:

| Name | Type | Default | Description | | ----------------- | :-------: | ------- | --------------------------------------------------------------------------------- | | type | string | custom:landroid-card | Type of the card — must be | | 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 | ha | What to display as the robot picture. 'ha' — the standard animated Home Assistant status image for the entity domain (ha-state-control-vacuum-status / ha-state-control-lawn_mower-status, requires HA 2026.5+, falls back to the bundled artwork automatically); 'default' — the bundled Landroid artwork; any other value is treated as an image URL or a media-source:// link. A configured camera always takes precedence over the image. | | 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 |

Standard Home Assistant image

By default the card renders Home Assistant's own animated status image — the same artwork you see in the robot's more-info dialog. It animates with the entity state (cleaning/mowing, returning, docked, paused, error), follows your theme colors, and is preloaded by the card automatically — you never need to open the more-info dialog for it to appear.

type: custom:landroid-card
entity: vacuum.roborock_s7

image: 'ha' is the default — the standard animated HA image

show_animation: true # false pauses the animations (works for the HA image too) image_size: 4 # height in 50px steps; 4 = 200px = native HA size

Requirements and fallbacks:

  • HA 2026.5+ — the version that introduced the status image elements. On older versions (or during the first milliseconds while HA's lazy chunk loads) the card shows the bundled image and upgrades automatically.
  • image: 'default' brings back the classic Landroid artwork.
  • image: '/local/my_robot.png' or image: 'media-source://...' — your own picture, as before.
  • camera: camera.xxx always wins over image.

settings_card object

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_card is not specified, entities with config category are discovered automatically.
The old settings key 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_baseboard

battery_card, info_card, statistics_card objects

Defines 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_driven

stats object

Custom status-dependent or general statistics displayed below the robot image. Groups are defined by robot state (default, mowing, docking, cleaning, etc.). Supports Jinja2 templates rendered natively via Home Assistant's WebSocket API.

| Name | Type | Description | | ----------- | :------: | ----------------------------------------------------------------------------------------------------------------------------------- | | entity | string | An entity ID with state (e.g. sensor.mower_total_worktime). Legacy entity_id is supported. Will be removed in a future release. | | attribute | string | Optional attribute name to extract from the entity. | | name | string | Friendly label shown below the stat value. Legacy subtitle is supported. Will be removed in a future release. | | unit | string | Unit of measure, e.g. km, °, h. | | template | string | Jinja2 template returning a formatted value. The value variable represents the state or attribute. Legacy value_template is supported. Will be removed in a future release. |

stats:
  default:
    - entity: sensor.mower_blades_total_on_time
      name: Total blade time
      template: '{{ as_timedelta((value | float(0) * 3600) | round(0) | string) }}'
    - entity: sensor.mower_total_worktime
      name: Work time
      template: '{{ as_timedelta((value | float(0) * 3600) | round(0) | string) }}'
    - entity: sensor.mower_distance_driven
      name: Distance
      unit: km
      template: '{{ (value | float(0) / 1000) | round(3) }}'
  mowing:
    - entity: sensor.mower_yaw
      name: Yaw
      unit: °
    - entity: sensor.mower_roll
      name: Roll
      unit: °
    - entity: sensor.mower_pitch
      name: Pitch
      unit: °

actions object

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'

shortcuts object

Add custom shortcut buttons to the toolbar using any [Home Assistant action][ha-actions].

| 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.mower

Note: The old service / service_data format is still accepted for backward compatibility but will be removed in a future release.

Theming 🎨

This card can be styled by changing the values of these CSS variables (globally or per-card via [card-mod][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 |

Styling via a theme

Read more in the Frontend documentation.

my-custom-theme:
  lc-background: '#17A8F4'
  lc-spacing: 5px

Styling via card-mod

type: 'custom:landroid-card'
style: |
  ha-card {
    --lc-background: #17A8F4;
    --lc-spacing: 5px;
  }

Animations 🎬

Animations are applied only to the image property. Here's how they look:

| Mowing | Docking | | :-----------------------------: | :-----------------------------------: | | ![Mowing animation][mowing-gif] | ![Returning animation][returning-gif] |

Supported languages 🌍

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)
  • [_Your language?_][add-translation]

If your lawnmower has been banned 🚫

If services and the app have stopped working:

  • Go to [My Landroids][my-landroids].
  • Unlink your Landroid.
  • Open the app on a mobile device.
  • Add your Landroid again.

Development 🛠️

Want to contribute to the project?

First of all, thanks! 🙏 Check the contributing guidelines for more information.

Inspiration

This project is heavily inspired by:

  • [Malene Trab][landroid-cloud] — Landroid Cloud Integration
  • [Denys Dovhan][vacuum-card] — Vacuum card
Huge thanks for their ideas and efforts 👍

Thanks to all contributors 🤝

Please see the list of contributors who participated in this project.

License

MIT License

💡 Tip: If you like this project, buy me a cup of ☕️ or 🥤:

[![Buy Me A Coffee][buymeacoffee-img]][buymeacoffee-url]

[hacs-url]: https://github.com/hacs/default [hacs-image]: https://img.shields.io/badge/HACS-Default-41BDF5.svg?style=flat-square [latest-url]: https://img.shields.io/github/v/release/Barma-lej/landroid-card [downloads]: https://img.shields.io/github/downloads/Barma-lej/landroid-card/total [downloads_latest]: https://img.shields.io/github/downloads/Barma-lej/landroid-card/latest/total [community-image]: https://img.shields.io/badge/Community-Forum-41BDF5.svg?logo=home-assistant [community-url]: https://community.home-assistant.io/t/lovelace-landroid-card/445867 [buymeacoffee-image]: https://img.shields.io/badge/Buy_Me_A_Coffee-FFDD00?style=flat-square&logo=buy-me-a-coffee&logoColor=000000 [buymeacoffee-url]: https://www.buymeacoffee.com/barma

[add-translation]: https://github.com/Barma-lej/landroid-card/blob/master/CONTRIBUTING.md#how-to-add-translation [buymeacoffee-img]: https://www.buymeacoffee.com/assets/img/custom_images/white_img.png [card-mod]: https://github.com/thomasloven/lovelace-card-mod [dashboard-resources]: https://my.home-assistant.io/redirect/lovelace_resources/ [dashboard-resources-img]: https://my.home-assistant.io/badges/lovelace_resources.svg [edit-readme]: https://github.com/Barma-lej/landroid-card/edit/master/README.md [ha-scripts]: https://www.home-assistant.io/docs/scripts/ [ha-templating]: https://www.home-assistant.io/docs/configuration/templating/ [hacs]: https://hacs.xyz [home-assistant]: https://www.home-assistant.io/ [landroid-cloud]: https://github.com/MTrab/landroid_cloud [ha-landroid-vision]: https://github.com/ADNPolymerase/ha-landroid-vision [mowing-gif]: https://github.com/Barma-lej/landroid-card/raw/master/media/landroid-mowing.gif [my-landroids]: https://account.worxlandroid.com/product-items [preview-gif]: https://github.com/Barma-lej/landroid-card/raw/master/media/landroid-card.gif [release032]: https://github.com/Barma-lej/landroid-card/releases/tag/0.3.2 [returning-gif]: https://github.com/Barma-lej/landroid-card/raw/master/media/landroid-returning.gif [vacuum-card]: https://github.com/denysdovhan/vacuum-card/ [ha-actions]: https://www.home-assistant.io/dashboards/actions/

Chat with me