Tasshack/dreame-vacuum

goto is not working (with Dreame D9)

jlssmt opened this issue · 15 comments

Hello,

Describe the bug
I have installed latest Beta v2.0.0B16.
The goto feature is not working with my Dreame D9.
I send following command to my device:

action: dreame_vacuum.vacuum_goto
target:
  device_id: XXXXXXXXXXXXXXXXXXXXXXX
data:
  x: 2468
  y: -4428

Vacuum is answering me the following:

"start zone cleaning"
"unable to reach the specified area"
"please try to clear obstacles in the path"
"returning to the dock to charge"
"paused"
  • there are no obstacles in the way.

  • the vacuum has not even start to move.

  • it just has left the charging station.

  • i tried different coordinates.

  • i extracted the coordinates via lovelace-xiaomi-vacuum-map-card
     

the button of the service is green:
image

  • If I send totally bad coordinates (f.e. -999999999999) the button is red and i get the log message Error handling message: Coordinate is not inside the map
  • dreame_vacuum.vacuum_clean_spot with this coordinates is also working
  • so i don't think it's caused by wrong coordinates.
     
     

To Reproduce

  • send mentioned yaml via HASS dev tools to Dreame D9
     
     

Expected behavior
The vacuum should go to a specific coordinate and stop there until further commands.
 
 

Screenshots
no
 
 

Additional Information (please complete the following information)

  • Model Name [e.g. dreame.vacuum.p2028]: dreame-vacuum-p2009
  • Firmware Version [e.g. 1156]: 1132
  • Home Assistant Version: 2024.9.3
  • Configuration Type [With or without map support]: with map support
  • Errors or warnings shown in the HA logs (if applicable): none

Your vacuum does not internally have a go to feature like the vacuums has streaming capability.
Integration sends a 5cm² cleaning area and stop command to make go to possible for these vacuums.
This method has been tested on Z10/L10 and works without an issue.
The beaviour you are describing is the same when you try to use area coordinates that the vacuum cannot reach.

So there are two options;

  • You are sending coordinate that the vacuum thinks it cannot reach there.
  • 5cm² area may not be enough for you vacuum to check that it is reachable since it is much older than a L10.

Problem is I cannot reproduce the issue and I cannot test any modification, what is your suggestion about this?

Since I don't think that it's because I send wrong coordinates (see cause above):
Can you tell me how to test a bigger area with my setup, please? 😊

You need to edit this line;
https://github.com/Tasshack/dreame-vacuum/blob/dev/custom_components/dreame_vacuum/dreame/device.py#L4000

Like this;
size = 100

50 is the minimum can be set and also the max resolution of the map coordinate system.
50 / 10 = 5.0 cm

So 100x100 px map image represents 5 square meters of area.

I changed to 100. Then restarted HASS.
Didn't work. Same voice responds like before.

I also tried 75, 150 and 500. But without restart. Do I need to restart after every change? (BTW: my HASS runs in Docker Container)

forget my previous message. i set only the else part.
it's working with 100 if line 4000 is like this:
size = 100

If it works with 100 then I can update the integration, it is not much difference between 5cm and 10cm for operation of the go to feature.
Your device firmware probably uses < symbol for checking the area coordinates instead of <= like mine so it cannot find valid a point when coordinates are set to 50x50 because that means 0x0 square cm area for it.

You should also be seeing a marker on the map image generated by the integration (for a brief period of time). You can confirm your coordinates from the image like that too.

yes. i can see the marker on map.
i updated my message above. i accidentially wrote 50.

it works if line 4000 is:
size = 100
 

it's not (!!!!!) working if line 4000 is:
size = self.status.current_map.dimensions.grid_size if self.status.current_map else 100

it's not (!!!!!) working if line 4000 is:

Yes because if statement returns left side of the argument.

It should be like this because 50 is the grid_size and 100 is grid_size * 2
size = (self.status.current_map.dimensions.grid_size * 2) if self.status.current_map else 100

100 is for fallback in case of the integration does not have the current map data for some reason.

Can you also try values between 50 and 100 like 55 or 80?

Like;

size = 55
size = 80

size = 55
also works

There are several other places that needs to be edited for handling virtual go to markers like cleaning history maps so I have made the changes according to your results. I have also used 56 instead of 55 to prevent floating points when dividing it to half.

You can update this file and rest of it should work properly.
device.zip

the goto service is working with your zip file.
anything else I should test?

Thanks for your help. I will close the issue when a new Beta version has been released.

Thank you very much for your work!
This custom_component is the best innovation for my smart home in a few months!

I also posted an idea how to improve this even more:
#739