Vacuum Interactive Map Card

This is a correct sequence of actions.

Yes, they have to match IDs assigned to rooms by the vacuum. You can check them in attributes of vacuum entity

Have you removed debug from config? Commands are not sent it this flag is set

Perfect, thanks!

It looks that it is working. I am not sure if it was the complete reinstall, because now it does not matter if id is int or not.

But thanks for help!

thank you for the information.

Now I have set the correct IDs and now it works.

1 Like

@3_14 Hi, I have been trying to configure your amazing card with native Roborock Home Assistant integration (Roborock Q Revo) for several days, unfortunately still without any success. I havenā€™t been able to find any helpful information anywhere :frowning: . I would appreciate any helpful advice. (Greetings from Poland :slight_smile: )

I probably forgot the most important information:
I use the roborock app and the home assistant integration with roborock core, which does not have a camera entity and i constantly has a calibration error.

Hi Piotr! @3_14

First of all, I love the integration and the work youā€™ve put into creating this, itā€™s a pure work of art to have such control with a map in Home Assistant :slight_smile:

Iā€™ve been working on a 3D Floorplan of my home with Home Assistant and I would like to be able to have a floorplan with zones for my Roborock Q Revo where I can press 1, 2 or all 3 zones, hit ā€œGoā€ and have it clean the selected zones. I know this should be possible with Input Booleans and then sending the zone data for these, but I have no idea on how to get started on this. Iā€™m pretty sure someone else named PaQ has asked this same question to you a while ago but I was unable to find your comms with them in this forum post.

I am already able to send my Roborock to a specific zone with the 4 array data per zone, but not in the way I described above.

service: xiaomi_miio.vacuum_clean_zone
target:
  entity_id:
    - vacuum.roborock_q_revo
  device_id: []
  area_id: []
data:
  zone:
    - - 16754
      - 26836
      - 21975
      - 30618
  repeats: 1

Can you help me out here?

Ps I use the Xiaomi Miio integration in combination with yours which works perfectly. Iā€™ve been able to get your integration working with what I mentioned above, but I want to get it working on my own 3D Floorplan in HASS.

Unfortunately official Roborock integration is not supported yet.

Related feature request:

Check out this template:

{% set all_rooms = {
"input_boolean.kantoor_room1": [16754, 26836, 21975, 30618],
"input_boolean.kantoor_room2": [16754, 26836, 21975, 30618],
"input_boolean.kantoor_room3": [16754, 26836, 21975, 30618],
} %}
{% set selected_rooms = all_rooms.keys() | list | expand | selectattr("state", "==", "on") | map(attribute="entity_id") | sort| list %}
{% set ns = namespace(to_clean=[]) %}
{% for r in selected_rooms -%}
{% set ns.to_clean = ns.to_clean + [all_rooms[r]] %}
{%- endfor %}
{{ ns.to_clean }}

Because of reflections in mirror and open/closed doors, the map never has the same size. My vacuum also re-draws the map everytime I launch a new cleaning, and the map is sometimes vertical, sometimes horizontal.
The height of the box where the map is displayed changes dynamically to accomodate any size. However, I would like to fix the height of the card and let the map scale properly to use the defined space, so that my dashboard layout does not change all the time.
Is that possible ? The trimming options do not work for me.

1 Like

Unfortunately itā€™s not possible at this moment

I just got the map card all configured with my dashboard. I have a Samsung Galaxy Tab A7 flush mounted on my kitchen wall in landscape orientation (wider than it is taller).

The map of my vacuum shown in the card is rotated 180 degrees from that shown on my phone using the official Roborock app. This makes it a little awkward to view on the tablet.

But more importantly, the orientation is more of a portrait mode on my tablet, which doesnā€™t look good. I have to scroll downward to see the entire card. If it were rotated 90 degrees and in portrait mode, it would look perfect on my table.

I searched throughout this forum and saw you said that rotation was not possible in August of 2022. How about today/! Is there any way for me to rotate the mapā€¦even if I have to do things more manuall?

Thanks!

I rotate the Map in the Dreamhome-App and 1 sec later it was rotated in my Home Assistant.

Hi @3_14, I got the card working, I also have been able to make the Path work, but I dont know if itā€™s working correctly, when I select points for the vacuum to path to, it goes to each point (start going to the target point), reaches it (reached the target point), then it fully stops (including the vacuumā€™s motors), then after several seconds, it starts again by going to the next path point, and so on, is that how itā€™s supposed to work? I thought it should smoothly go from each point to another and finish at the last point.

I hope you can help me, thanks in advance :slight_smile:

Yes, this is how it works. ā€œPathā€ feature is just a bunch of ā€œgoing to pointā€ service calls connected. To make it smooth it would have to be implemented by the vacuum itself, not ā€œhacked aroundā€ in HA

I see, thanks,
then another problem I have is that room cleaning doesnt seem to work for me, it doesnā€™t give any errors, I think Iā€™ve also configured it correctly, but when I click on a room then to start cleaning, it gives off a message that it started, but the vacuum does absolutely nothing

I suspect that you have provided invalid room ids

The IDs were autogenerated/taken from the xiaomi cloud, I just went with the already existing IDs

Ok, can you show your config, vacuum model and integration that you use to control it?

Seems I may miss something really stupid, but Iā€™m stuck.

I have a Roborock S5 Max. I installed Roborock App (humbertogontijo) via HACS and Xiaomi Vacuum Map Card via HACS. I connected the account and I can see the map.

image

If I click on ā€œGenerate Rooms Configā€ nothing happens. Rooms are working without issues in the app. Is there anything more I have to do? Thanks for help in advance.

type: custom:xiaomi-vacuum-map-card
map_source:
  camera: camera.roborock_s5_max_map
calibration_source:
  camera: true
entity: vacuum.roborock_s5_max
vacuum_platform: send_command
map_modes:
  - template: vacuum_clean_zone
  - template: vacuum_goto
  - template: vacuum_clean_segment
    predefined_selections: []
map_locked: true

The card config:

type: custom:xiaomi-vacuum-map-card
map_source:
  camera: camera.xiaomi_cloud_map_extractor
entity: vacuum.robot_vacuum
vacuum_platform: default
title: Vacuum Map Control
calibration_source:
  camera: true
map_locked: true
two_finger_pan: true
map_modes:
  - name: Path
    template: vacuum_follow_path
  - name: Zone cleanup
    icon: mdi:select-drag
    run_immediately: false
    coordinates_rounding: true
    coordinates_to_meters_divider: 1000
    selection_type: MANUAL_RECTANGLE
    max_selections: 5
    repeats_type: EXTERNAL
    max_repeats: 3
    service_call_schema:
      service: xiaomi_miio.vacuum_clean_zone
      service_data:
        zone: '[[selection]]'
        repeats: '[[repeats]]'
        entity_id: '[[entity_id]]'
    predefined_selections: []
    variables: {}
  - name: Pin & Go
    icon: mdi:map-marker-plus
    run_immediately: false
    coordinates_rounding: true
    coordinates_to_meters_divider: 1000
    selection_type: MANUAL_POINT
    max_selections: 999
    repeats_type: NONE
    max_repeats: 1
    service_call_schema:
      service: xiaomi_miio.vacuum_goto
      service_data:
        x_coord: '[[point_x]]'
        y_coord: '[[point_y]]'
        entity_id: '[[entity_id]]'
    predefined_selections: []
    variables: {}
  - name: Rooms
    icon: mdi:floor-plan
    run_immediately: false
    coordinates_rounding: true
    coordinates_to_meters_divider: 1000
    selection_type: ROOM
    id_type: number
    max_selections: 999
    repeats_type: EXTERNAL
    max_repeats: 3
    service_call_schema:
      service: vacuum.send_command
      service_data:
        command: app_segment_clean
        entity_id: '[[entity_id]]'
        params:
          - segments: '[[selection]]'
            repeat: '[[repeats]]'
    predefined_selections:
      - id: '1'
        icon:
          name: mdi:bed-king
          x: 23125
          'y': 25425
        label:
          text: Bedroom
          x: 23125
          'y': 25425
          offset_y: 35
        outline:
          - - 22037
            - 23743
          - - 24246
            - 23743
          - - 24246
            - 26832
          - - 22037
            - 26832
      - id: '2'
        icon:
          name: mdi:television
          x: 26575
          'y': 25400
        label:
          text: Living Room
          x: 26575
          'y': 25400
          offset_y: 35
        outline:
          - - 24377
            - 23399
          - - 28877
            - 23399
          - - 28877
            - 27389
          - - 24377
            - 27389
      - id: '17'
        icon:
          name: mdi:shower-head
          x: 27950
          'y': 28625
        label:
          text: Bathroom
          x: 27950
          'y': 28625
          offset_y: 35
        outline:
          - - 27032
            - 28096
          - - 28887
            - 28096
          - - 28887
            - 29247
          - - 27032
            - 29247
      - id: '18'
        icon:
          name: mdi:silverware-fork-knife
          x: 25400
          'y': 32350
        label:
          text: Kitchen
          x: 25400
          'y': 32350
          offset_y: 35
        outline:
          - - 24902
            - 29944
          - - 25996
            - 29944
          - - 25996
            - 34655
          - - 24902
            - 34655
      - id: '19'
        icon:
          name: mdi:desktop-tower
          x: 27325
          'y': 32525
        label:
          text: Small Room
          x: 27325
          'y': 32525
          offset_y: 35
        outline:
          - - 26017
            - 30993
          - - 28649
            - 30993
          - - 28649
            - 34662
          - - 26017
            - 34662
      - id: '20'
        icon:
          name: mdi:floor-plan
          x: 25775
          'y': 29250
        label:
          text: Hall
          x: 25775
          'y': 29250
          offset_y: 35
        outline:
          - - 24346
            - 27488
          - - 26994
            - 27487
          - - 26994
            - 29995
          - - 27203
            - 29995
          - - 27203
            - 30981
          - - 26019
            - 30981
          - - 26019
            - 29403
          - - 24347
            - 29403
    variables: {}
icons:
  - icon: mdi:play
    conditions:
      - entity: vacuum.robot_vacuum
        value_not: cleaning
      - entity: vacuum.robot_vacuum
        value_not: error
      - entity: vacuum.robot_vacuum
        value_not: returning
    tooltip: Start
    tap_action:
      action: call-service
      service: vacuum.start
      service_data:
        entity_id: vacuum.robot_vacuum
  - icon: mdi:pause
    conditions:
      - entity: vacuum.robot_vacuum
        value_not: docked
      - entity: vacuum.robot_vacuum
        value_not: idle
      - entity: vacuum.robot_vacuum
        value_not: error
      - entity: vacuum.robot_vacuum
        value_not: paused
    tooltip: Pause
    tap_action:
      action: call-service
      service: vacuum.pause
      service_data:
        entity_id: vacuum.robot_vacuum
  - icon: mdi:stop
    conditions:
      - entity: vacuum.robot_vacuum
        value_not: docked
      - entity: vacuum.robot_vacuum
        value_not: idle
      - entity: vacuum.robot_vacuum
        value_not: error
      - entity: vacuum.robot_vacuum
        value_not: paused
    tooltip: Stop
    tap_action:
      action: call-service
      service: vacuum.stop
      service_data:
        entity_id: vacuum.robot_vacuum
  - icon: mdi:home-map-marker
    conditions:
      - entity: vacuum.robot_vacuum
        value_not: docked
      - entity: vacuum.robot_vacuum
        value_not: returning
    tooltip: Return to base
    tap_action:
      action: call-service
      service: vacuum.return_to_base
      service_data:
        entity_id: vacuum.robot_vacuum
  - icon: mdi:target-variant
    conditions:
      - entity: vacuum.robot_vacuum
        value_not: docked
      - entity: vacuum.robot_vacuum
        value_not: error
      - entity: vacuum.robot_vacuum
        value_not: cleaning
      - entity: vacuum.robot_vacuum
        value_not: returning
    tooltip: Clean spot
    tap_action:
      action: call-service
      service: vacuum.clean_spot
      service_data:
        entity_id: vacuum.robot_vacuum
  - icon: mdi:map-marker
    tooltip: Locate
    tap_action:
      action: call-service
      service: vacuum.locate
      service_data:
        entity_id: vacuum.robot_vacuum
  - menu_id: fan_speed
    icon: mdi:fan-remove
    label: Silent
    conditions:
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value: Silent
    tooltip: Change fan speed
    tap_action:
      action: call-service
      service: vacuum.set_fan_speed
      service_data:
        entity_id: vacuum.robot_vacuum
        fan_speed: Silent
  - menu_id: fan_speed
    icon: mdi:fan-speed-1
    label: Standard
    conditions:
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value: Standard
    tooltip: Change fan speed
    tap_action:
      action: call-service
      service: vacuum.set_fan_speed
      service_data:
        entity_id: vacuum.robot_vacuum
        fan_speed: Standard
  - menu_id: fan_speed
    icon: mdi:fan-speed-2
    label: Medium
    conditions:
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value: Medium
    tooltip: Change fan speed
    tap_action:
      action: call-service
      service: vacuum.set_fan_speed
      service_data:
        entity_id: vacuum.robot_vacuum
        fan_speed: Medium
  - menu_id: fan_speed
    icon: mdi:fan-speed-3
    label: Turbo
    conditions:
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value: Turbo
    tooltip: Change fan speed
    tap_action:
      action: call-service
      service: vacuum.set_fan_speed
      service_data:
        entity_id: vacuum.robot_vacuum
        fan_speed: Turbo
  - menu_id: fan_speed
    icon: mdi:waves
    label: Gentle
    conditions:
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value: Gentle
    tooltip: Change fan speed
    tap_action:
      action: call-service
      service: vacuum.set_fan_speed
      service_data:
        entity_id: vacuum.robot_vacuum
        fan_speed: Gentle
  - menu_id: fan_speed
    icon: mdi:fan-auto
    label: Auto
    conditions:
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value: Auto
    tooltip: Change fan speed
    tap_action:
      action: call-service
      service: vacuum.set_fan_speed
      service_data:
        entity_id: vacuum.robot_vacuum
        fan_speed: Auto
  - icon: mdi:fan-alert
    conditions:
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value_not: Silent
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value_not: Standard
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value_not: Medium
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value_not: Turbo
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value_not: Gentle
      - entity: vacuum.robot_vacuum
        attribute: fan_speed
        value_not: Auto
    tooltip: Change fan speed
    tap_action:
      action: call-service
      service: vacuum.set_fan_speed
      service_data:
        entity_id: vacuum.robot_vacuum
        fan_speed: Silent
tiles:
  - tile_id: status
    entity: vacuum.robot_vacuum
    label: Status
    attribute: status
    icon: mdi:robot-vacuum
    translations:
      starting: Starting
      charger disconnected: Charger disconnected
      idle: Idle
      remote control active: Remote control active
      cleaning: Cleaning
      returning home: Returning home
      manual mode: Manual mode
      charging: Charging
      charging problem: Charging problem
      paused: Paused
      spot cleaning: Spot cleaning
      error: Error
      shutting down: Shutting down
      updating: Updating
      docking: Docking
      going to target: Going to target
      zoned cleaning: Zoned cleaning
      segment cleaning: Segment cleaning
      emptying the bin: Emptying the bin
      charging complete: Charging complete
      device offline: Device offline
  - tile_id: battery_level
    entity: vacuum.robot_vacuum
    label: Battery
    attribute: battery_level
    icon_source: vacuum.robot_vacuum.attributes.battery_icon
    unit: '%'
  - tile_id: fan_speed
    entity: vacuum.robot_vacuum
    label: Fan speed
    attribute: fan_speed
    icon: mdi:fan
    translations:
      silent: Silent
      standard: Standard
      medium: Medium
      turbo: Turbo
      auto: Auto
      gentle: Gentle
  - tile_id: sensor_dirty_left
    label: Sensors left
    unit: h
    multiplier: 0.0002777777777777778
    hold_action:
      action: call-service
      service: vacuum.send_command
      confirmation: {}
      service_data:
        command: reset_consumable
        params: sensor_dirty_time
        entity_id: vacuum.robot_vacuum
    entity: sensor.robot_vacuum_sensor_dirty_left
    icon: mdi:eye-outline
    precision: 0
    translations: {}
  - tile_id: filter_left
    label: Filter left
    unit: h
    multiplier: 0.0002777777777777778
    hold_action:
      action: call-service
      service: vacuum.send_command
      confirmation: {}
      service_data:
        command: reset_consumable
        params: filter_work_time
        entity_id: vacuum.robot_vacuum
    entity: sensor.robot_vacuum_filter_left
    icon: mdi:air-filter
    precision: 0
    translations: {}
  - tile_id: main_brush_left
    label: Main brush left
    unit: h
    multiplier: 0.0002777777777777778
    hold_action:
      action: call-service
      service: vacuum.send_command
      confirmation: {}
      service_data:
        command: reset_consumable
        params: main_brush_work_time
        entity_id: vacuum.robot_vacuum
    entity: sensor.robot_vacuum_main_brush_left
    icon: mdi:brush
    precision: 0
    translations: {}
  - tile_id: side_brush_left
    label: Side brush left
    unit: h
    multiplier: 0.0002777777777777778
    hold_action:
      action: call-service
      service: vacuum.send_command
      confirmation: {}
      service_data:
        command: reset_consumable
        params: side_brush_work_time
        entity_id: vacuum.robot_vacuum
    entity: sensor.robot_vacuum_side_brush_left
    icon: mdi:brush
    precision: 0
    translations: {}
  - tile_id: cleaning_count
    label: Cleaning count
    entity: sensor.robot_vacuum_total_clean_count
    icon: mdi:counter
    precision: 0
    translations: {}
additional_presets: []

configuration.yaml:


camera:
  - platform: xiaomi_cloud_map_extractor
    host: !secret xiaomi_vacuum_host
    token: !secret xiaomi_vacuum_token
    username: !secret xiaomi_cloud_username
    password: !secret xiaomi_cloud_password
    country: "cn"
    draw: ["all"]
    attributes:
      - calibration_points
    map_transformation:
      trim:
        top: 25
        bottom: 5
        left: 25
        right: 23
    scan_interval:
      seconds: 10

The model of the vacuum: roborock.vacuum.m1s

Also, when I was just checking the configs i noticed that the map stopped working just nowā€¦ sooā€¦

Im sure this config is was held by glue and duct tape, so any help would be appreciated, Iā€™m extremely new to all of this, so sorry for that :confused: