Skip to content

Onboarding report: Q8 Max - FW 02.06.86 - Let's Encrypt (Success) #70

Description

@lVlyke

I was successfully able to onboard a Q8 Max. The process went smoothly and so far everything has been working great.

  • Firmware version: 02.06.86
  • SSL chain: Let's Encrypt
  • Total pairing attempts: 4

Redacted log of onboarding flow:

Show log output
> uv run start_onboarding.py --server api-rr.<domain>:555 --ssid "<ssid>" --timezone "America/New_York" --cst EST5EDT,M3.2.0,M11.1.0 --country-domain us

Checking admin API reachability at https://api-rr.[domain]:555/admin/api/status...
Admin API login succeeded.
Checking required stack services...
Required services are running: https_server, mqtt_tls_proxy, mqtt_backend_broker.
Checking API TLS listener at https://api-rr.[domain]:555...
TLS certificate is valid and listener is reachable at https://api-rr.[domain]:555.
Checking MQTT TLS listener at ssl://api-rr.<domain>:8881...
TLS certificate is valid and listener is reachable at ssl://api-rr.<domain>:8881.
Available vacuums:

  1. Q8 Max [No Public Key ] [Disconnected ] [0 Query Samples]
    Select a vacuum by number, or type 'quit': 1

Reset the vacuum Wi-Fi, connect this machine to the vacuum Wi-Fi, then press Enter to send onboarding.
Type 'reselect' to choose another vacuum or 'quit' to exit.
>
Sending cfgwifi onboarding packet...
HELLO_RESP_CMD=17
HELLO_RESP_JSON={"id":1,"method":"hello","params":{"sdks":{"roborock":"02"},"key":"..."}}
TOKEN_S=...
TOKEN_T=...
WIFI_BODY_SENT={"u":"1234567890","ssid":"<ssid>","token":{"r":"rr.<domain>:555/","tz":"America/New_York","s":"...","cst":"EST5EDT,M3.2.0,M11.1.0","t":"..."},"passwd":"...","country_domain":"us"}
WIFI_RESP_CMD=2
WIFI_RESP_HEX=...
Reconnect this machine to your normal Wi-Fi. Once the main server is reachable again, the script will poll every 5 seconds for up to 5 minutes. Some vacuums take most of that window, especially on the final cycle.
Waiting for the server to observe new onboarding traffic... <repeated 33 times>
Status for Q8 Max: samples=1, public_key=False, connected=False, state=collecting
Signed requests were captured, but the public key is not ready yet. Wait for the sample count to increase, then retry pairing.
The sample count increased. Repeat the pairing cycle to collect more onboarding data.

Reset the vacuum Wi-Fi, connect this machine to the vacuum Wi-Fi, then press Enter to send onboarding.
Type 'reselect' to choose another vacuum or 'quit' to exit.
>
Sending cfgwifi onboarding packet...
HELLO_RESP_CMD=17
HELLO_RESP_JSON={"id":1,"method":"hello","params":{"sdks":{"roborock":"02"},"key":"..."}}
TOKEN_S=...
TOKEN_T=...
WIFI_BODY_SENT={"u":"1234567890","ssid":"<ssid>","token":{"r":"rr.<domain>:555/","tz":"America/New_York","s":"...","cst":"EST5EDT,M3.2.0,M11.1.0","t":"..."},"passwd":"...","country_domain":"us"}
WIFI_RESP_CMD=2
WIFI_RESP_HEX=...
Reconnect this machine to your normal Wi-Fi. Once the main server is reachable again, the script will poll every 5 seconds for up to 5 minutes. Some vacuums take most of that window, especially on the final cycle.
Waiting for the server to observe new onboarding traffic... <repeated 38 times>
Status for Q8 Max: samples=2, public_key=False, connected=False, state=recovering
Public key recovery is running. Wait for it to finish or retry if it stalls.
The sample count increased. Repeat the pairing cycle to collect more onboarding data.

Reset the vacuum Wi-Fi, connect this machine to the vacuum Wi-Fi, then press Enter to send onboarding.
Type 'reselect' to choose another vacuum or 'quit' to exit.
>
Sending cfgwifi onboarding packet...
HELLO_RESP_CMD=17
HELLO_RESP_JSON={"id":1,"method":"hello","params":{"sdks":{"roborock":"02"},"key":"..."}}
TOKEN_S=...
TOKEN_T=...
WIFI_BODY_SENT={"u":"1234567890","ssid":"<ssid>","token":{"r":"rr.<domain>:555/","tz":"America/New_York","s":"...","cst":"EST5EDT,M3.2.0,M11.1.0","t":"..."},"passwd":"...","country_domain":"us"}
WIFI_RESP_CMD=2
WIFI_RESP_HEX=...
Reconnect this machine to your normal Wi-Fi. Once the main server is reachable again, the script will poll every 5 seconds for up to 5 minutes. Some vacuums take most of that window, especially on the final cycle.
Status for Q8 Max: samples=2, public_key=True, connected=False, state=ready
Public key is ready. Run one more pairing cycle so the vacuum connects. Some vacuums take a few minutes on this final cycle.
The public key is ready. Do one final pairing cycle to finish the connection.

Reset the vacuum Wi-Fi, connect this machine to the vacuum Wi-Fi, then press Enter to send onboarding.
Type 'reselect' to choose another vacuum or 'quit' to exit.
The public key is already ready. This should be the final pairing cycle, but some vacuums still take a few minutes to finish reconnecting.
>
Sending cfgwifi onboarding packet...
HELLO_RESP_CMD=17
HELLO_RESP_JSON={"id":1,"method":"hello","params":{"sdks":{"roborock":"02"},"key":"..."}}
TOKEN_S=...
TOKEN_T=...
WIFI_BODY_SENT={"u":"1234567890","ssid":"<ssid>","token":{"r":"rr.<domain>:555/","tz":"America/New_York","s":"...","cst":"EST5EDT,M3.2.0,M11.1.0","t":"..."},"passwd":"...","country_domain":"us"}
WIFI_RESP_CMD=2
WIFI_RESP_HEX=...
Reconnect this machine to your normal Wi-Fi. Once the main server is reachable again, the script will poll every 5 seconds for up to 5 minutes. Some vacuums take most of that window, especially on the final cycle.
Status for Q8 Max: samples=4, public_key=True, connected=True, state=ready
Device paired and connected.
The vacuum is connected to the local server.

Awesome project, thanks for all the effort that went into this!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions