Lovelace Vacuum Map card

February 4, 2026 · View on GitHub

HACS Default GitHub Latest Release GitHub All Releases Community Forum Ko-Fi buycoffee.to PayPal.Me Revolut.Me

Lovelace Vacuum Map card

This card provides a user-friendly way to fully control map-based vacuums in Home Assistant. Supported brands include Xiaomi (Roborock/Viomi/Dreame/Roidmi/Valetudo/Valetudo RE), Neato, Wyze, Roomba, Ecovacs (and probably more).

https://user-images.githubusercontent.com/6118709/140251738-7fb06e81-34b0-4bf8-b7b1-2221d0062331.mp4

Table of contents

Features

Features include:

  • Map-based controls:
    • Zoned cleaning (manual and saved)
    • Going to target (manual and saved)
    • Room cleaning
    • Following path
    • Custom services
  • Icon controls:
    • Conditional visibility
    • Customizable service calls
  • Value tiles:
    • Customizable content
    • Conditional visibility
    • Customizable service calls
  • General:
    • Multiple vacuums support
    • Multiple maps (camera/image) support
    • Fully customizable styling

Installation

HACS

  • Open HACS
  • Go to "Frontend" section
  • Click button with "+" icon
  • Search for "Xiaomi Vacuum Map"
  • Install repository in HACS
  • Make sure you have added this card to Lovelace resources
    url: /hacsfiles/lovelace-xiaomi-vacuum-map-card/xiaomi-vacuum-map-card.js
    type: module
    
  • Refresh your browser

Manual

  • Download xiaomi-vacuum-map-card.js file from the latest release
  • Save downloaded file somewhere in <ha config>/www/ directory, e.g. /config/www/custom_lovelace/xiaomi-vacuum-map-card.js
  • Add saved file to Lovelace resources
    url: /local/custom_lovelace/xiaomi-vacuum-map-card.js
    type: module
    
  • Restart HA if you had to create www directory
  • Refresh your browser

Configuration

This card contains UI configuration editor, but it is limited to only basic set of features. Its full potential can be achieved by manual yaml adjustments.

:warning::warning::warning:

You can use this configuration as an example: demo config (configuration used in full_demo.mp4).

:warning::warning::warning:

Main options

Key Type Required Default Description
title string no empty Card's title
language string no autodetected Overrides autodetected language (supported languages)
action_handler_id string no - Enables action handling
additional_presets list no empty A list of additional presets (e.g. with different map/vacuum)
All values from preset options section

Preset options

KeyTypeRequiredDefaultDescription
preset_namestringyes1-Name of the preset
entitystringyes-Vacuum entity
map_sourcestringyes-Preset's map source
calibration_sourceobjectyes2-Preset's calibration source
vacuum_platformstringnodefaultPreset's vacuum platform
map_lockedbooleannofalseDefault state of pan/zoom
two_finger_panstringnofalseEnables two finger map panning
iconslistnoautogeneratedPreset's icons
append_iconsbooleannofalseEnables appending configured icons to autogenerated ones instead of replacing them
tileslistnoautogeneratedPreset's tiles
append_tilesbooleannofalseEnables appending configured tiles to autogenerated ones instead of replacing them
map_modeslistnoautogeneratedPreset's map modes
activateobjectno-Service call that should be executed after clicking preset name
activate_on_switchbooleannofalseEnables executing activate service call after switching map preset
conditionslistno-List of conditions that need to be (all of them) met for preset to be shown
clean_selection_on_startbooleannotrueAllows to disable cleaning selection on cleanup start
internal_variablesobjectno-Allows to specify default values for internal variables

1 If multiple presets are configured

2 Not mandatory when used with a platform that support a default calibration

Map source options

KeyTypeRequiredDefaultDescription
camerastringno1-Entity id of map camera
imagestringno1-URL of map image
cropobjectnono croppingImages cropping options

1 Exactly one of camera or image must be provided

Cropping options

KeyTypeRequiredDefaultDescription
topnumberno0Image cropping value from the top (in pixels)
bottomnumberno0Image cropping value from the bottom (in pixels)
leftnumberno0Image cropping value from the left (in pixels)
rightnumberno0Image cropping value from the right (in pixels)

Calibration source options

KeyTypeRequiredDefaultDescription
camerabooleanno1-Enables retrieving calibration from camera defined in map_source (Xiaomi Cloud Map Extractor)
entitystringno1-Entity with calibration returned as a state
attributestringno-Enables usage of a configured attribute instead of state of given entity
calibration_pointslistno1-List of 3 or 4 calibration points
identitybooleanno1-Enables using image coordinates on map (e.g. when map is used just for rooms)
platformstringno1-Enables using a default calibration from a chosen platform (provided that it supports it)

1 Exactly one of camera, entity, calibration_points, identity or platform must be provided

Calibration points options

Each of calibration points must have a following structure:

vacuum: # coordinates of a point in a vacuum coordinate system
  x: 25500
  y: 25500
map: # coordinates of a point in a map coordinate system (can be read using e.g. Paint or Gimp)
  x: 466
  y: 1889

Manual calibration guide

Supported vacuum platforms

Following vacuum platforms are supported out of the box at this moment:

Create a request for a new built-in platform

Adding a new platform

Icon list entry options

icons image

KeyTypeRequiredDefaultDescription
iconstringyes-An icon to be displayed (mdi)
icon_idstringno-Icon ID that can be used to override the configuration
tap_actionactionnomore-infoAction that will be triggered when an icon is tapped.
Warning: use service_data instead of data
hold_actionactionno-Action that will be triggered when an icon is held and released.
Warning: use service_data instead of data
double_tap_actionactionno-Action that will be triggered when an icon is double-tapped.
Warning: use service_data instead of data
conditionslistno-List of conditions that need to be (all of them) met for an icon to be shown
tooltipstringno-Tooltip to be displayed on hoover
ordernumberno-Used to sort the icons
replace_configbooleannofalseMarks that this icon should override the config of an already existing icon with the same icon_id
menu_idstringno-Adds this icon to the menu with given ID
labelstringno-Label that should be displayed in the menu
variablesobjectno-Variables that should be passed to to service calls
removebooleannofalseAllows to remove specific pre-defined icon (when combined with icon_id and replace_config: true
KeyTypeRequiredDefaultDescription
typestringyes-Has to be set to menu
menu_idstringyes-A menu ID
entitystringyes-Entity that should be used to generate the menu
current_value_attributestringno-Changes the source of the selected value to given attribute
available_values_attributestringyes-Configures an attribute that contains all available values for the menu
icon_mappingobjectno-A mapping of possible entity value -> icon that should be used for the value
value_translation_keysobjectno-A mapping of possible entity value -> label that should be used for the value
tap_actionobjectno-Action that should enable a specific value

Examples:

  • Menu based on the select entity
    type: "menu",
    menu_id: "water_box_mode",
    icon_id: "water_box_mode",
    entity: "select.water_box_mode"
    available_values_attribute: "options"
    icon: "mdi:water",
    icon_mapping:
        off: "mdi:water-remove"
        mild: "mdi:water-minus"
        moderate: "mdi:water"
        intense: "mdi:water-plus"
        custom: "mdi:water-sync"
    tap_action:
        action: "call-service"
        service: "select.select_option"
        service_data:
            option: "[[value]]"
            entity_id: "[[entity_id]]"
    

Tile list entry options

tiles image

KeyTypeRequiredDefaultDescription
labelstringno-Label of a tile
entitystringno-Entity which should be shown on a tile
internal_variablestringno-Internal variable which should be shown on a tile
iconstringno-An icon to be displayed (mdi)
icon_sourcestringno-Source of an icon, e.g: vacuum.xiaomi.attributes.battery_icon
attributestringno-Attribute that should be shown on a tile
multipliernumberno-Multiplier that should be used to calculate value shown on a tile
precisionnumberno-Precision that should be used to present value on a tile
unitstringno-Unit to be used
tap_actionactionnomore-infoAction that will be triggered when a tile is tapped.
Warning: use service_data instead of data
hold_actionactionno-Action that will be triggered when a tile is held and released.
Warning: use service_data instead of data
double_tap_actionactionno-Action that will be triggered when a tile is double-tapped.
Warning: use service_data instead of data
conditionslistno-List of conditions that need to be (all of them) met for a tile to be shown
tooltipstringno-Tooltip to be displayed on hoover
translationsmapno-Translations that should be applied to tile's value
tile_idstringno-ID of an autogenerated tile that should be replaced with this one
ordernumberno-Used to sort the tiles
replace_configbooleannofalseMarks that this tile should override the config of an already existing tile with the same tile_id
variablesobjectno-Variables that should be passed to to service calls
removebooleannofalseAllows to remove specific pre-defined tile (when combined with icon_id and replace_config: true

Condition options

KeyTypeRequiredDefaultDescription
entitystringno-Entity ID
attributestringno-Attribute to use instead of entity state
internal_variablestringno-Name of internal variable to use instead of entity state
valuestringno1-Entity state/attribute has to be equal to this value
value_notstringno1-Entity state/attribute has to be unequal to this value

1 Exactly one of them has to be provided

Map modes options

map modes image

KeyTypeRequiredDefaultDescription
templatestringno1-Map mode template to be used (supported templates)
namestringyes2-Name of map mode
iconstringyes2-Icon of map mode (mdi)
selection_typestringyes2-Type of selection, one of supported ones
service_call_schemaobjectyes2-Service call schema that should be used in this mode
run_immediatelybooleannofalseEnables calling service immediately after choosing a selection
coordinates_roundingbooleannotrueEnables coordinates rounding
max_selectionsintegerno1Maximal number of selections
repeats_typestringnoNONEType of repeats inclusion, one of supported ones
max_repeatsintegerno1Maximal value of repeats
variablesobjectno-Variables that should be passed to service_call_schema
predefined_selectionslistno3-

You can override any value from built-in template by providing it in your configuration

1 Not required if all parameters with (2) are provided

2 Required if template is not provided

3 Required if template is not provided and selection_type is one of: PREDEFINED_RECTANGLE, PREDEFINED_POINT, ROOM

Supported templates

List of supported templates depends on selected vacuum_platform

Supported selection types

Following selection types are supported at this moment:

Service call schema options

KeyTypeRequiredDefaultDescription
servicestringyes-Service that should be called in a given mode
service_dataobjectno-Data that should be passed to service call
targetobjectno-Target that should be passed to service call
evaluate_data_as_templatebooleannofalseEnables support for jinja templates in service calls

It is possible to use several built-in placeholders in service_data section. They will be replaced by:

  • [[entity_id]]: entity_id defined in preset's config
  • [[selection]]: selection made on the map (zone, point or path)
  • [[selection_size]]: number of selections made on the map
  • [[selection_unwrapped]]: the same as [[selection]], but passed as string unwrapped from brackets
  • [[repeats]]: selected number of repeats
  • [[point_x]]: x coordinate of selected point (for MANUAL_POINT and PREDEFINED_POINT selection types)
  • [[point_y]]: y coordinate of selected point (for MANUAL_POINT and PREDEFINED_POINT selection types)
  • [[variables]]: a list of variables for all selections

It is possible to use any value from variables section (wrapped with double rectangular brackets):

variables:
  test_variable: 123
service_call_schema:
  service: fake.service
  service_data:
    var: "[[test_variable]]"

It is possible to use following modifiers in service_data section:

  • |[[jsonify]]: if value ends with this modifier it will be decoded as a JSON and attached to service call in unwrapped form
  • |[[jsonify_jinja]]: behaves in the same way as |[[jsonify]], but is executed after jinja templating

Supported repeats types

Following repeats types are supported at this moment:

  • NONE: No repeats
  • INTERNAL: Repeats number included in coordinates array ([25500, 25000, 26500, 26500, 2])
  • EXTERNAL: Repeats number used as a separate attribute in service_call_schema
  • REPEAT: Repeats selection (repeats: 2, selection: [5,6] => [5,6,5,6])

Predefined selection options

Format of data depends on selected selection_type:

  • PREDEFINED_RECTANGLE

    KeyTypeRequiredDefaultDescription
    zoneslistyes-List of lists containing zone's coordinates in [x,y,width,height] format (e.g. [[25500, 25000, 26500, 26500]])
    iconobjectno-Icon definition
    labelobjectno-Label definition
    variablesobjectno-Variables that should be passed to service_call_schema
    default_stateselected/unselectednounselectedDefault state of selection
    state_entityentity idno-Entity that should be used to store the state of selection

    See this page to check how to easily retrieve zone coordinates.

  • PREDEFINED_POINT

    KeyTypeRequiredDefaultDescription
    positionlistyes-Point's coordinates in [x,y] format (e.g. [25500, 25000])
    iconobjectno-Icon definition
    labelobjectno-Label definition
    variablesobjectno-Variables that should be passed to service_call_schema
    default_stateselected/unselectednounselectedDefault state of selection
    state_entityentity idno-Entity that should be used to store the state of selection

    See this page to check how to easily retrieve point coordinates.

  • ROOM

KeyTypeRequiredDefaultDescription
idstring or numberyes-Room's identifier
outlinelistno-List of points forming an outline of a room (e.g. [[25500,25500],[26500,25500],[25500,26500]]
iconobjectno-Icon definition
labelobjectno-Label definition
variablesobjectno-Variables that should be passed to service_call_schema
default_stateselected/unselectednounselectedDefault state of selection
state_entityentity idno-Entity that should be used to store the state of selection (e.g. switch.bathroom)

See this page to check how to easily create outline.

Icon options

KeyTypeRequiredDefaultDescription
namestringyes-An icon to be displayed (mdi)
xnumberyes-X coordinate of an icon (in vacuum's coordinate system)
ynumberyes-Y coordinate of an icon (in vacuum's coordinate system)

Label options

KeyTypeRequiredDefaultDescription
textstringyes-Text to be displayed
xnumberyes-X coordinate of a label (in vacuum's coordinate system)
ynumberyes-Y coordinate of a label (in vacuum's coordinate system)
offset_xnumberno-Offset that should be applied to label in X direction (in pixels)
offset_ynumberno-Offset that should be applied to label in Y direction (in pixels)

Action handling

To enable handling actions you have to configure action_handler_id in Main options. This card handles following actions:

  • Starts cleaning

      tap_action:
        action: fire-dom-event
        xiaomi_vacuum_map_card:
          action_handler_id: xiaomi_vacuum_map_card_id_1
          action: cleaning.start
    
  • Set a value of internal variable

      tap_action:
        action: fire-dom-event
        xiaomi_vacuum_map_card:
          action_handler_id: xiaomi_vacuum_map_card_id_1
          action: internal_variable.set
          data:
            variable: variable_1
            value: "some value"
    
  • Selects next map mode

      tap_action:
        action: fire-dom-event
        xiaomi_vacuum_map_card:
          action_handler_id: xiaomi_vacuum_map_card_id_1
          action: map_mode.next
    
  • Selects previous map mode

      tap_action:
        action: fire-dom-event
        xiaomi_vacuum_map_card:
          action_handler_id: xiaomi_vacuum_map_card_id_1
          action: map_mode.previous
    
  • Selects a specific map mode

      tap_action:
        action: fire-dom-event
        xiaomi_vacuum_map_card:
          action_handler_id: xiaomi_vacuum_map_card_id_1
          action: map_mode.set
          data:
            index: 2 
    
  • Decrements a number of repeats

      tap_action:
        action: fire-dom-event
        xiaomi_vacuum_map_card:
          action_handler_id: xiaomi_vacuum_map_card_id_1
          action: repeats.decrement
    
  • Increments a number of repeats

      tap_action:
        action: fire-dom-event
        xiaomi_vacuum_map_card:
          action_handler_id: xiaomi_vacuum_map_card_id_1
          action: repeats.increment
    
  • Set a number of repeats

      tap_action:
        action: fire-dom-event
        xiaomi_vacuum_map_card:
          action_handler_id: xiaomi_vacuum_map_card_id_1
          action: repeats.set
          data:
            value: 2
    
  • Clears current selection

      tap_action:
        action: fire-dom-event
        xiaomi_vacuum_map_card:
          action_handler_id: xiaomi_vacuum_map_card_id_1
          action: selection.clear
    

FAQ

  • Make sure to check out FAQ section in Discussions, it contains a lot of useful information

  • Does this card require rooted device?

    No, it only utilizes features of Home Assistant.

  • How to create a map?

    The easiest way is to use Xiaomi Cloud Map Extractor, but you can use any image (e.g., a screenshot from Mi Home/FloleVac).

  • Can I use image that has a perspective distortion?

    Yes, you just have to provide 4 calibration points.

Migrating from v1.x.x

Configuration with map_image
Old config (v1.x.x)New config (v2.x.x)
type: custom:xiaomi-vacuum-map-card
entity: vacuum.xiaomi_vacuum
map_image: '/local/custom_lovelace/xiaomi_vacuum_map_card/map.png'
calibration_points:
  - vacuum:
      x: 25500
      y: 25500
    map:
      x: 466
      y: 1889
  - vacuum:
      x: 26500
      y: 26500
    map:
      x: 730
      y: 1625
  - vacuum:
      x: 25500
      y: 26500
    map:
      x: 466
      y: 1625
zones:
  - [[25500, 25500, 26500, 26500]]
  - [[24245, 25190, 27495, 27940], [27492, 26789, 28942, 27889]]
type: custom:xiaomi-vacuum-map-card
entity: vacuum.xiaomi_vacuum
map_source:
  image: '/local/custom_lovelace/xiaomi_vacuum_map_card/map.png'
calibration_source:
  calibration_points:
    - vacuum:
        x: 25500
        y: 25500
      map:
        x: 466
        y: 1889
    - vacuum:
        x: 26500
        y: 26500
      map:
        x: 730
        y: 1625
    - vacuum:
        x: 25500
        y: 26500
      map:
        x: 466
        y: 1625
map_modes:
  - template: vacuum_clean_zone
  - template: vacuum_goto
  - template: vacuum_clean_zone_predefined
    predefined_selections:
      - zones: [[25500, 25500, 26500, 26500]]
      - zones: [[24245, 25190, 27495, 27940], [27492, 26789, 28942, 27889]]

Configuration with map_camera
Old config (v1.x.x)New config (v2.x.x)
type: custom:xiaomi-vacuum-map-card
entity: vacuum.xiaomi_vacuum
map_camera: camera.xiaomi_cloud_map_extractor
camera_calibration: true
zones:
  - [[25500, 25500, 26500, 26500]]
  - [[24245, 25190, 27495, 27940], [27492, 26789, 28942, 27889]]
type: custom:xiaomi-vacuum-map-card
entity: vacuum.xiaomi_vacuum
map_source:
  camera: camera.xiaomi_cloud_map_extractor
calibration_source:
  camera: true
map_modes:
  - template: vacuum_clean_zone
  - template: vacuum_goto
  - template: vacuum_clean_zone_predefined
    predefined_selections:
      - zones: [[25500, 25500, 26500, 26500]]
      - zones: [[24245, 25190, 27495, 27940], [27492, 26789, 28942, 27889]]

Translations

Currently, this card contains translations for following languages:

  • bg - Bulgarian (Български)
  • ca - Catalan (Català)
  • cs - Czech (Čeština)
  • da - Danish (Dansk)
  • de - German (Deutsch)
  • el - Greek (Ελληνικά)
  • en - English
  • es - Spanish (Español)
  • fi - Finnish (Suomi)
  • fr - French (Français)
  • he - Hebrew (עברית)
  • hu - Hungarian (Magyar)
  • is - Icelandic (Íslenska)
  • it - Italian (Italiano)
  • lv - Latvian (Latviešu)
  • nb-NO - Norwegian Bokmål (Norsk bokmål)
  • nl - Dutch (Nederlands)
  • pl - Polish (Polski)
  • pt - Portuguese (Português)
  • pt-BR - Brazilian Portuguese (Português Brasileiro)
  • ro - Romanian (Română)
  • ru - Russian (Русский)
  • sk - Slovak (Slovenčina)
  • sv - Swedish (Svenska)
  • tr - Turkish (Türkçe)
  • uk - Ukrainian (Українська)
  • zh - Chinese (中文)
  • zh-Hant - Traditional Chinese (正體中文)

Adding a new language

Special thanks

I'd like to give special thanks to people who helped me with card's design and development:

Support

If you want to support my work with a donation you can use one of the following platforms:

Platform Payment methods Link Comment
Ko-fi
  • PayPal
  • Credit card
  • Buy Me a Coffee at ko-fi.com
  • No fees
  • Single or monthly payment
  • buycoffee.to
  • BLIK
  • Bank transfer
  • Postaw mi kawę na buycoffee.to
    PayPal
  • PayPal
  • PayPal Logo
  • No fees
  • Revolut
  • Revolut
  • Credit Card
  • Revolut
  • No fees
  • Powered by

    PyCharm logo.