Roborock: Q10, Q7, and other new vacuums not supported
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
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 closeCloses the issue. -
@home-assistant rename Awesome new titleRenames the issue. -
@home-assistant reopenReopen the issue. -
@home-assistant unassign roborockRemoves the current integration label and assignees on the issue, add the integration domain after the command. -
@home-assistant add-label needs-more-informationAdd a label (needs-more-information, problem in dependency, problem in custom component) to the issue. -
@home-assistant remove-label needs-more-informationRemove 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)
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.
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.
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
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. 😃
Thank you for taking the time to reply @Lash-L.
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
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.
This issue will need re-opening by the looks of things 😄
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.
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
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 ;-)
Can we please re-open this issue so it is not forgotten about.
Is there anything I can do to assist?
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 @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]
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.
I have the Same Issue with a Q10 , its not seen or added
Q10 X5+ here, hoping to see support added in the near future.
Also affects model Q7B. Happy to help out with testing.
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
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.
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
Bumping this because I also picked up a Q10 S5 during Prime day 😊 Eagerly awaiting to integrate it into my HA setup! 🙏
Hi, I bought one too. If there's any testing I can do to get it integrated, I'd be happy to help.
I also have a Q10 since today which unfortunately cannot be integrated, the Q8 goes
Thanks Thanks
I bought one too. Hoping to see support added in the near future.
- 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
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.
Same issue here with Roborock Q7 LB+