core icon indicating copy to clipboard operation
core copied to clipboard

Roborock: Q10, Q7, and other new vacuums not supported

Open dgibbs64 opened this issue 8 months ago • 127 comments

The problem

I recently got a 2nd vacuum and added it to the roborock app without issue. However for some reason it is not importing into the roborock integration even after reloading and rebooting. The vacuum is the Q10 S5

What version of Home Assistant Core has the issue?

core-2025.4.4

What was the last working version of Home Assistant Core?

No response

What type of installation are you running?

Home Assistant OS

Integration causing the issue

Roborock

Link to integration documentation on our website

No response

Diagnostics information

home-assistant_roborock_2025-05-03T09-56-39.788Z.log

Example YAML snippet


Anything in the logs that might be useful for us?


Additional information

No response

dgibbs64 avatar May 03 '25 09:05 dgibbs64

Hey there @lash-l, @allenporter, mind taking a look at this issue as it has been labeled with an integration (roborock) you are listed as a code owner for? Thanks!

Code owner commands

Code owners of roborock can trigger bot actions by commenting:

  • @home-assistant close Closes the issue.
  • @home-assistant rename Awesome new title Renames the issue.
  • @home-assistant reopen Reopen the issue.
  • @home-assistant unassign roborock Removes the current integration label and assignees on the issue, add the integration domain after the command.
  • @home-assistant add-label needs-more-information Add a label (needs-more-information, problem in dependency, problem in custom component) to the issue.
  • @home-assistant remove-label needs-more-information Remove a label (needs-more-information, problem in dependency, problem in custom component) on the issue.

(message by CodeOwnersMention)


roborock documentation roborock source (message by IssueLinks)

home-assistant[bot] avatar May 03 '25 13:05 home-assistant[bot]

I have the same problem with my Q10 S5. It is the only device in the app, but is not picked up by the integration:

DEBUG (MainThread) [homeassistant.components.roborock] Got home data HomeData(id=XXXXXXX, name='My Home', products=[], devices=[], received_devices=[], lon=None, lat=None, geo_name=None, rooms=[HomeDataRoom(id=XXXXXXX, name='Kitchen'), HomeDataRoom(id=XXXXXXXX, name='Living')])

I also tried with the original python-roborock, there the "Known Devices" is also empty.

theFeverDog avatar May 03 '25 20:05 theFeverDog

Interesting, so it must be an issue specific to the Q10 S5. I know it's a very new model, so maybe there is an issue with the roborock API or something, at a guess.

dgibbs64 avatar May 04 '25 11:05 dgibbs64

Hi all - if I had to guess our home data api needs to be bumped up versioning. Every now and then Roborock changes their home data API (how we get devices). It's a new endpoint. I had made a new function to do it in the Python library but I haven't switched it over in core. I figure that will solve the problem.

However, my wife had a emergency c section and our son come 5/6 weeks early, so I've been in the nicu a lot and I'm unsure when I will have a chance to update this

Lash-L avatar May 04 '25 11:05 Lash-L

Thanks for the update @Lash-L . I hope all goes well and your Wife and Baby are safe and well. It's always a challenging time when a baby is born.

It sounds likely that the problem is as you described, as this vacuum is so new. Obviously would appreciate the update is rolled out as soon as possible. However, with your current circumstances, I fully understand a delay. All the best. 😃

dgibbs64 avatar May 04 '25 11:05 dgibbs64

Thank you for taking the time to reply @Lash-L.

theFeverDog avatar May 04 '25 18:05 theFeverDog

BTW, I looked in the .roborock file created by the python library, and it does seem to contain some data related to the Q10 S5:

"products": [{"id": "XXX", "name": "Roborock Q10 Series", "model": "roborock.vacuum.ss07", "category": "robot.vacuum.cleaner", "capability": 0, "schema": [...]

theFeverDog avatar May 04 '25 18:05 theFeverDog

@theFeverDog

Please share that schema with me if you don't mind.

As well, I will need a copy of the mqtt payload of one of the messages as well as your local key - this can be a bit of a technical undertaking if you are not experience in the sort of thing, but I can potentailly walk you through it. Alternatively, you can make a burner roborock account, share the vacuum with that burner account, and then give me the login via email and I can get the payload.

I unfortunately cannot make any promises on how long this will take me, I have a lot going on and in order to know how complicated of a refactor this is going to be, I have to have some unencrypted bytes.

Lash-L avatar May 07 '25 17:05 Lash-L

This issue will need re-opening by the looks of things 😄

dgibbs64 avatar May 10 '25 11:05 dgibbs64

Thanks @Lash-L for keeping this going. Here is the rest, starting from schema:

"schema": [{"id": 101, "name": "RPC Request", "code": "rpc_request", "mode": "rw", "type": "RAW", "property": "null"}, {"id": 102, "name": "RPC Response", "code": "rpc_response", "mode": "rw", "type": "RAW", "property": "null"}, {"id": 120, "name": "\u9519\u8bef\u4ee3\u7801", "code": "error_code", "mode": "ro", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 121, "name": "\u8bbe\u5907\u72b6\u6001", "code": "state", "mode": "ro", "type": "VALUE", "property": "null"}, {"id": 122, "name": "\u8bbe\u5907\u7535\u91cf", "code": "battery", "mode": "ro", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 123, "name": "\u5438\u529b\u6863\u4f4d", "code": "fan_power", "mode": "rw", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 124, "name": "\u62d6\u5730\u6863\u4f4d", "code": "water_box_mode", "mode": "rw", "type": "RAW", "property": "null"}, {"id": 125, "name": "\u4e3b\u5237\u5bff\u547d", "code": "main_brush_life", "mode": "ro", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 126, "name": "\u8fb9\u5237\u5bff\u547d", "code": "side_brush_life", "mode": "ro", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 127, "name": "\u6ee4\u7f51\u5bff\u547d", "code": "filter_life", "mode": "ro", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 135, "name": "\u79bb\u7ebf\u539f\u56e0", "code": "offline_status", "mode": "ro", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 136, "name": "\u6e05\u6d01\u6b21\u6570", "code": "clean_times", "mode": "rw", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 137, "name": "\u626b\u62d6\u6a21\u5f0f", "code": "cleaning_preference", "mode": "rw", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 138, "name": "\u6e05\u6d01\u4efb\u52a1\u7c7b\u578b", "code": "clean_task_type", "mode": "ro", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 139, "name": "\u8fd4\u56de\u57fa\u7ad9\u7c7b\u578b", "code": "back_type", "mode": "ro", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 140, "name": "\u57fa\u7ad9\u4efb\u52a1\u7c7b\u578b", "code": "dock_task_type", "mode": "ro", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 141, "name": "\u6e05\u6d01\u8fdb\u5ea6", "code": "cleaning_progress", "mode": "ro", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 142, "name": "\u7a9c\u8d27\u4fe1\u606f", "code": "fc_state", "mode": "ro", "type": "RAW", "property": "null"}, {"id": 201, "name": "\u542f\u52a8\u6e05\u6d01\u4efb\u52a1", "code": "start_clean_task", "mode": "wo", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 202, "name": "\u8fd4\u56de\u57fa\u7ad9\u4efb\u52a1", "code": "start_back_dock_task", "mode": "wo", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 203, "name": "\u542f\u52a8\u57fa\u7ad9\u4efb\u52a1", "code": "start_dock_task", "mode": "wo", "type": "ENUM", "property": "{\"range\": []}"}, {"id": 204, "name": "\u6682\u505c\u4efb\u52a1", "code": "pause", "mode": "wo", "type": "RAW", "property": "null"}, {"id": 205, "name": "\u7ee7\u7eed\u4efb\u52a1", "code": "resume", "mode": "wo", "type": "RAW", "property": "null"}, {"id": 206, "name": "\u7ed3\u675f\u4efb\u52a1", "code": "stop", "mode": "wo", "type": "RAW", "property": "null"}, {"id": 207, "name": "\u7528\u6237\u6539\u5584\u8ba1\u5212", "code": "ceip", "mode": "rw", "type": "ENUM", "property": "{\"range\": [\"0,1\"]}"}]}], "devices": [], "receivedDevices": [], "rooms": []}}

I also played around with MITMing the traffic using an Android emulator, but I'm a bit out of my depth :-P

I'll try to set up a burner account.

theFeverDog avatar May 10 '25 18:05 theFeverDog

Schema is promising.

I also played around with MITMing the traffic using an Android emulator, but I'm a bit out of my depth :-P

I have found it is much easier to use mitm with wireguard mode https://mitmproxy.org/posts/wireguard-mode/

It sets you up in a transparent proxy and works pretty well. I have not tested on android but it works great on my iphone. Then you need to make sure your phone is on a different wifi than your vacuum. Then you will see a set of tcp messages inside mitm.

I'll try to set up a burner account.

A completely fine approach - just make sure you share the vacuum with that account, don't remove it from your account or try to add it separately on this account. The vacuum should just be shared so that you always have the ability to stop sharing whenever you would like

Lash-L avatar May 10 '25 19:05 Lash-L

I have found it is much easier to use mitm with wireguard mode

Ah, this is good to know, I'll give this a try later.

@Lash-L , please let me know were I can send you the credentials for the burner account ;-)

theFeverDog avatar May 10 '25 19:05 theFeverDog

Can we please re-open this issue so it is not forgotten about.

dgibbs64 avatar May 21 '25 22:05 dgibbs64

Is there anything I can do to assist?

dgibbs64 avatar May 27 '25 09:05 dgibbs64

Hey @Lash-L,

Thanks to your link I managed to intercept the traffic on iOS using the wireguard mode.

I found my localkey, and I intercepted two TCP streams with MQTT messages. Any way I can share these with you?

theFeverDog avatar May 27 '25 20:05 theFeverDog

Hey @Lash-L,

Thanks to your link I managed to intercept the traffic on iOS using the wireguard mode.

I found my localkey, and I intercepted two TCP streams with MQTT messages. Any way I can share these with you?

Hey! Sorry I have had very limited time. You can send to [email protected]

Lash-L avatar May 27 '25 20:05 Lash-L

Hello @Lash-L ,

Sorry to bother you, but I just wanted to ask if you've received your email with the MQTT payload/burner account? Otherwise I will send it again.

theFeverDog avatar Jun 01 '25 07:06 theFeverDog

I have the Same Issue with a Q10 , its not seen or added

jaspweowaale avatar Jun 06 '25 06:06 jaspweowaale

Q10 X5+ here, hoping to see support added in the near future.

frockstar avatar Jun 06 '25 13:06 frockstar

Also affects model Q7B. Happy to help out with testing.

anotherdave avatar Jun 10 '25 02:06 anotherdave

Bumping but also want to offer support if there is any needed. I have a Q10 X5+ and am seeing the same errors with the following in the logs:

Not adding device because its protocol version B01 or category VACUUM is not supported"

I had created another bug to track the support of the Q10 X5[+] but it looks like the solution will be the same as here. I can mark mine as duplicate and will follow this issue: https://github.com/home-assistant/core/issues/145945

kooikerseth avatar Jun 30 '25 18:06 kooikerseth

Just received a roborock Q10 S5+ and tryed to set it up in HA 2025.7.0. When adding my account the following logs appear:

Logger: homeassistant.config_entries Quelle: config_entries.py:749 Erstmals aufgetreten: 14:03:01 (1 Vorkommnis) Zuletzt protokolliert: 14:03:01

Error setting up entry [email protected] for roborock Traceback (most recent call last): File "/usr/local/lib/python3.13/site-packages/aiohttp/resolver.py", line 117, in resolve resp = await self._resolver.getaddrinfo( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<5 lines>... ) ^ aiodns.error.DNSError: (12, 'Timeout while contacting DNS servers')

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/usr/local/lib/python3.13/site-packages/aiohttp/connector.py", line 1512, in _create_direct_connection hosts = await self._resolve_host(host, port, traces=traces) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/site-packages/aiohttp/connector.py", line 1128, in _resolve_host return await asyncio.shield(resolved_host_task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/site-packages/aiohttp/connector.py", line 1159, in _resolve_host_with_throttle addrs = await self._resolver.resolve(host, port, family=self._family) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/site-packages/aiohttp_asyncmdnsresolver/_impl.py", line 140, in resolve return await super().resolve(host, port, family) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/site-packages/aiohttp/resolver.py", line 126, in resolve raise OSError(None, msg) from exc OSError: [Errno None] Timeout while contacting DNS servers

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/config_entries.py", line 749, in __async_setup_with_context result = await component.async_setup_entry(hass, self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/roborock/init.py", line 56, in async_setup_entry home_data = await api_client.get_home_data_v3(user_data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/site-packages/roborock/web_api.py", line 384, in get_home_data_v3 home_id = await self._get_home_id(user_data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/site-packages/roborock/web_api.py", line 303, in _get_home_id home_id_response = await home_id_request.request( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<3 lines>... ) ^ File "/usr/local/lib/python3.13/site-packages/roborock/web_api.py", line 528, in request async with session.request(method, _url, params=params, data=data, headers=_headers, json=json) as resp: ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/site-packages/aiohttp/client.py", line 1482, in aenter self._resp: _RetType = await self._coro ^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/site-packages/aiohttp/client.py", line 770, in _request resp = await handler(req) ^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/site-packages/aiohttp/client.py", line 725, in _connect_and_send_request conn = await self._connector.connect( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ req, traces=traces, timeout=real_timeout ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File "/usr/local/lib/python3.13/site-packages/aiohttp/connector.py", line 622, in connect proto = await self._create_connection(req, traces, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/site-packages/aiohttp/connector.py", line 1189, in _create_connection _, proto = await self._create_direct_connection(req, traces, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.13/site-packages/aiohttp/connector.py", line 1518, in _create_direct_connection raise ClientConnectorDNSError(req.connection_key, exc) from exc aiohttp.client_exceptions.ClientConnectorDNSError: Cannot connect to host euiot.roborock.com:443 ssl:default [Timeout while contacting DNS servers]

and

Logger: homeassistant.components.roborock Quelle: components/roborock/init.py:238 Integration: Roborock (Dokumentation, Probleme) Erstmals aufgetreten: 14:00:25 (14 Vorkommnisse) Zuletzt protokolliert: 14:13:14

Not adding device XXXXXXXXXXXXXXX because its protocol version B01 or category VACUUM is not supported

Tryed to resolve euiot.roborock.com from my macbook and its working fine. I am using the same DNS Server for the macbook and all other wifi devices (including the robot) Kind of strange to me.

TeubyDE avatar Jul 03 '25 13:07 TeubyDE

Any hope of an update soon to support these vacuums? I just picked up a Q10 S5+ on Prime day and I was hoping to get it working with HA

mike1627 avatar Jul 14 '25 23:07 mike1627

Bumping this because I also picked up a Q10 S5 during Prime day 😊 Eagerly awaiting to integrate it into my HA setup! 🙏

S-n-d avatar Jul 16 '25 12:07 S-n-d

Hi, I bought one too. If there's any testing I can do to get it integrated, I'd be happy to help.

Subia75 avatar Jul 16 '25 13:07 Subia75

I also have a Q10 since today which unfortunately cannot be integrated, the Q8 goes

Thanks Thanks

0711smarthome avatar Jul 16 '25 16:07 0711smarthome

I bought one too. Hoping to see support added in the near future.

13ad13eat avatar Jul 17 '25 18:07 13ad13eat

  • me too. Mine's a Q10 S5+ giving the [homeassistant.components.roborock] Not adding device ########## because its protocol version B01 or category VACUUM is not supported

Vo0D0oD avatar Jul 18 '25 12:07 Vo0D0oD

The main developer of this module has just had a baby, so is currently away doing Dad stuff.

My understanding of the problem is that Roborock have a new api version for the new models which is very different from the existing one. This requires some reverse engineering and messing about to get things working. It's sadly just bad timing that these large API changes happened around the same time as the module developer is unavailable.

The only way to speed this up is if there is another developer that is able to step in and do the work. Sadly, I have no experience in this area, otherwise I would try myself. So if there is anyone who thinks they can help out, it maybe worth reaching out to the developer of this module.

dgibbs64 avatar Jul 18 '25 12:07 dgibbs64

Same issue here with Roborock Q7 LB+

jeerland avatar Jul 18 '25 13:07 jeerland