Xiaomi Cloud Vacuum Map Extractor

I have the same model and it works like a charm (you have to enable map saving in vacuum’s settings in Xiaomi Home app).

Yes, very nicely done :+1: I plan to add possibility to overlay map over any image in future releases of Map Extractor :slight_smile:

PS new (veeeeery big) release of the Map Card coming really soon :wink:

1 Like

Great, looking forward to it!
Very incredible work!

Here you have a little sneak peek of a new version of a Map Card :wink:

No I don’t everything was added through integrations in HACS. Looks like the manual configuration asks for the vacuum: entry?

No, it is not related to extractor. Does the map appear sometimes?

After starting a clean the map lost - all my tunings are lost…
The map seems to start rebuilding from a scratch.


In the robot I enabled the “Store the map” feature - I hoped that my map will be saved but it is not, is it normal?
“Rotate” angle was even changed.
Before I started zone cleaning - the map was the same (i.e.did not vanish) but the zone rectangle was displayed on the map even after finishing & HA reboot, could not remove it, was it normal?
The dock was not moved.

Then AGAIN spent some time for “tuning” the map, then started a zone clean (only one room) - and AGAIN the map shifted.


I am officially tired of this. Seems that the map cannot be used along with a floorplan since it gives an erratic angle & shifts…

No it only shows the blue screen with the “Failed to retrieve map from vacuum” text.

@Ildar_Gabdullin
I have “map storing” turned on since day 1 and my map hasn’t moved in 2 years

@homebot
Map has to be uploaded to the cloud by the vacuum and your vacuum seems to be unhappy with a command that tells it do do that

May be there is some small nuance I have not got yet…

What I did ~2 hours ago:

  1. After completion of the last zoned cleaning (when the map was badly scaled & shifted again) I “tuned” again the map (i.e. map is properly positioned with respect to the Picture elements card with my floorplan).
    The “tuning” means:
  • editing the camera map object properties (along with using Configuration → Server controls → YAML configuration reloading → XIAOMI_CLOUD_MAP_EXTRACTOR tool) - particularly rotate, trim;
  • editing the Picture elements card with my floorplan - particularly left, top, scale.
  1. Then by using the “Lovelace Xiaomi Vacuum Map card” I selected a zone (by mouse), chose “Zoned cleanup” & pressed “Start”.

  2. Then moved to the HA page with floorplan + map (probably pressed F5).

  3. Then I realized that the map shifted again.

Is there any possible reasons of this behaviour?

BTW, I opened Mi Home (iPad) and the previously generated map is used, the path is painted above it. So it seems that the map is memorized in the robot.

Hm I’m not sure why it would have stopped working after working for so long?

Edit: IP changed on vacuum… after adjusting the host IP everything works great.
Thanks for your assistance and for all your hard work on this project.

-Russ

1 Like

@Ildar_Gabdullin
I think that you should wait for your vacuum to learn your map (do some full cleanups after enabling map storing), it shouldn’t change afterwards.

@homebot
Well, that explains a lot :smiley:

Hey @3_14 , thanks for your greate support here.
I have since a few days the following “hint”: two factor auth required (see logs)

2021-11-08 22_27_56-Window

I understand what Vacuum Map Extractor like to tell me, but logs don’t show me anything. (settings → logs). If I remeber corret, there is no option to activte the two factor auth. in Vacuum Map Extractor. A few days ago, there was everthing fine and no message or problems.

Could you assist me?
Thanks

Often a simple HA restart helps and the map shows up thereafter. See post #494.

You can also check out these issues: #157, #180

I think you are right!
After several cleanups rooms appeared:

Earlier there were no rooms:

And the most important thing - I do not observe misalignment so far!

Here are some rules to provide same mutual alignment between a floorplan & a vacuum’s map:

  1. Do not shift a charging dock.
  2. Enable “Save map” feature (post).
  3. Do not start cleaning by a vacuum’s “hardware” button.
  4. Do not start cleaning by using a vacuum.start service.
  5. Always start cleaning by using a “zone cleaning” (use this card) or a “segment cleaning” feature by calling this service:
service: vacuum.send_command
service_data:
  entity_id: '[[SENSOR_VACUUM]]'
  command: app_segment_clean
  params: [2, 3, 16, 5, 17]

Room numbers may be retrieved from a vacuum’s map attributes.

Piotr, thank you again for the job!

@ 3_14
Piotr, may be you know:
is it possible to use a template for the params option?

service: vacuum.send_command
service_data:
  entity_id: '[[SENSOR_VACUUM]]'
  command: app_segment_clean
  params: [2, 3, 16, 5, 17]

I would like to generate the params option dynamically dependingly on which rooms are selected for cleaning & how many passes are selected for each room.
I know that there is fantastic Vacuum Interactive Map Card - but so far I cannot integrate it to my floorplan and wanted to select rooms from UI.

Where do you want to achieve it? It should be possible to do in a script

To achieve it:

  1. Create 3 set of entities:
  • input_boolean for each room - whether to add the room to the “cleaning list” or not;
  • input_number for each room - for keeping / changing room numbers (taken from camera);
  • input_number for each room - for keeping counts of passes (1…3, for example).
  1. Create a group containing these input_boolean entities.

  2. Create template sensor:

sensor:
  - platform: template
    sensors:
      vacuum_clean_command:
        value_template: >-
          {% set ns = namespace(COMMAND = "") -%}
          {%- set ROOM_FLAGS = expand('group.vacuum_clean_rooms') -%}

          {%- for flag in ROOM_FLAGS -%}
            {%- if flag.entity_id | regex_match("input_boolean.vacuum_clean_room_", ignorecase=False) and
                   is_state(flag.entity_id,'on') -%}
              {%- set ROOM = flag.entity_id.split("vacuum_clean_room_")[1] -%}
              {%- set ROOM_NUMBER = states('input_number.vacuum_clean_room_number_' + ROOM)|int -%}
              {%- set CLEAN_COUNT = states('input_number.vacuum_clean_room_count_' + ROOM)|int -%}
              {%- set ROOM_NUMBER_STRING = (ROOM_NUMBER|string + ",") * CLEAN_COUNT -%}
              {%- set ns.COMMAND = ns.COMMAND + ROOM_NUMBER_STRING -%}
            {%- endif -%}
          {%- endfor -%}

          {%- set ns.COMMAND = (ns.COMMAND)[:-1] -%}
          [{{ ns.COMMAND }}]

where:

  • input_boolean.vacuum_clean_room_* - names for input_boolean entities;
  • input_number.vacuum_clean_room_number_* - names for room numbers;
  • input_number.vacuum_clean_room_count_* - names for counts;
  • group.vacuum_clean_rooms - name of the group.
  1. Create smth like this:
    image
    You make hide this card inside fold-entity-row and expand it when needed.

So, the question is - is it possible to use smth like this:

service: vacuum.send_command
service_data:
  entity_id: '[[SENSOR_VACUUM]]'
  command: app_segment_clean
  params: "{{ states('sensor.vacuum_clean_command') }}"

Yeah, it should be possible to do in a script:

vacuum_rooms:
  sequence:
    - service: vacuum.send_command
      data:
        entity_id: vacuum.xiaomi
        command: app_segment_clean
        params:  "{{ states('sensor.vacuum_clean_command') }}"

or without template sensor:

vacuum_rooms:
  sequence:
    - service: vacuum.send_command
      data:
        entity_id: vacuum.xiaomi
        command: app_segment_clean
        params:  >-
          {% set ns = namespace(COMMAND = "") -%}
          {%- set ROOM_FLAGS = expand('group.vacuum_clean_rooms') -%}

          {%- for flag in ROOM_FLAGS -%}
            {%- if flag.entity_id | regex_match("input_boolean.vacuum_clean_room_", ignorecase=False) and
                   is_state(flag.entity_id,'on') -%}
              {%- set ROOM = flag.entity_id.split("vacuum_clean_room_")[1] -%}
              {%- set ROOM_NUMBER = states('input_number.vacuum_clean_room_number_' + ROOM)|int -%}
              {%- set CLEAN_COUNT = states('input_number.vacuum_clean_room_count_' + ROOM)|int -%}
              {%- set ROOM_NUMBER_STRING = (ROOM_NUMBER|string + ",") * CLEAN_COUNT -%}
              {%- set ns.COMMAND = ns.COMMAND + ROOM_NUMBER_STRING -%}
            {%- endif -%}
          {%- endfor -%}

          {%- set ns.COMMAND = (ns.COMMAND)[:-1] -%}
          [{{ ns.COMMAND }}]
1 Like

Great, will try it next day! Thank you!