Skip to content

Onboarding report: Roborock Saros 10R — success (firmware 02.52.86, Let's Encrypt) #61

Description

@skittyxan

Got the Saros 10R working on firmware 02.52.86. The docs list 02.52.32 as the tested version, so figured this was worth sharing for the table.

Setup:

  • Model: roborock.vacuum.a144, firmware 02.52.86
  • Cert: Let's Encrypt wildcard (*.mydomain.com) via Cloudflare DNS-01, reused from Nginx Proxy Manager - I mounted NPM's letsencrypt volume read-only into the container. No separate cert pipeline. One thing to know: NPM's cert directory is mode 700, so the container needs to run as root (user: "0:0" in compose).
  • Server: v1.0.2, Docker Compose, build-from-source
  • DNS: AdGuard Home wildcard *.mydomain.com → server host. Already covered api-roborock.mydomain.com with no dedicated rewrite.
  • Don't add an NPM proxy host for this, the server serves TLS directly on :555/:8881, and a proxy in front of it breaks the protocol path.

Things that bit me:

BLE binding kept failing with -3004.1 ("Failed to send information to the device"). The fix was turning off the VPN on my phone that I didn't realize was on like a dumb dumb. Also worth disabling any private/ad-block DNS on the device during pairing. I went through the obvious suspects first - band steering, WPA/WPA2 mode, VLAN firewall rules, Android BLE permissions, none of them were it.

The cfgwifi local-first flow doesn't run the Roborock app's first-run map creation, so after cutover the vacuum had no map. What worked: re-onboard via the Roborock cloud app to build the map, re-import room metadata from the cloud snapshot, then re-cut to the local server. Map and rooms carried over intact.

After cutover the vacuum showed unavailable in Home Assistant. Stale MQTT credentials in memory - restart HA and it comes back. This was likely due to first authenticating with cloud credentials, then swapping to the local version.

The cfgwifi server token format is yourdomain.com:555, not api-yourdomain.com:555. The api- prefix is only for DNS.

HA integration is working well. Using the roborock_custom_map HACS bridge for the interactive map card. Room cleaning via app_segment_clean works with numeric segment IDs - on this unit, HA Room N maps directly to segment ID N (1–12).

One other thing worth mentioning: I tackled this as part of a larger homelab project running on Proxmox + Home Assistant, and I used Claude Code throughout - planning the spec/plan phases, working through the DNS/cert architecture, debugging the issues above, and wiring it all into HA. It's genuinely good at holding the full context of a complex setup (VLANs, NPM cert paths, firewall rules, MQTT topology) across a multi-day project. I stood up this site as a way to help others if you're interested in how I'm doing that https://vdb-ai.com/homelab (I'm 100% confident I could not have done this w/o AI).

Full transparency, I had Claude help me write this up to share based on my feedback going through this 😆. I was holding my breath on the documented firmware version hoping that the most recent one I updated to would work, and sure enough it did.

Thanks for the project, this was exactly what I was looking for.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions