homebridge-roborock-vacuum 2.1.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.2.0 (unreleased)
4
+
5
+ Connectivity and device-support release, porting recent fixes from the python-roborock and ioBroker.roborock upstream projects (see `UpstreamReview-2026-07.md`).
6
+
7
+ - **New Feature**: Docks introduced since 2025 (Qrevo Curv, Saros 10, Qrevo S5V, Saros 20, and other new dock type codes 10–40) now get their dust-collection, mop-wash, and drying features — including the dock mop-wash switch. Unknown future dock types default to full-featured instead of featureless
8
+ - **New Feature**: Room names now resolve for vacuums shared from another Roborock account (fetched via the device-share rooms API), so Matter room cleaning and the current-room publisher work on shared devices
9
+ - **New Feature**: Qrevo Edge 2 (`a298`) support for clean-mode switching — it uses banded water levels (221–250), so the plugin no longer writes the classic level 202 that the device rejects
10
+ - **Fix (connectivity)**: A vacuum whose IP changed (DHCP) no longer stays unreachable or silently cloud-only until Homebridge restarts — the local reconnect loop now re-queries the device's current IP over the cloud and reconnects to the fresh address; devices demoted to cloud mode after a TCP failure are promoted back to local mode once reachable again
11
+ - **Fix (connectivity)**: The cloud MQTT connection is only reported healthy after the device-topic subscription actually succeeds (broker rejections arrive as qos 128); previously a failed subscription left the plugin claiming a working cloud channel that could never deliver a response
12
+ - **Fix (connectivity)**: Q10-generation (B01 protocol) devices no longer hang startup with a 10-second timeout and stay cloud-only — they are queried with their own `service.get_net_info` method so they can learn their local IP
13
+ - **Fix**: UDP discovery responses were silently discarded due to a missing `this.` in the decryption path; discovery now works again. A UDP port conflict (e.g. ioBroker.roborock on the same host) also no longer aborts all device creation
14
+ - **Fix**: An invalidated cloud session (password change, session revoked) no longer produces an endless 401 retry loop — the cached session is cleared once, polling stops, and the log tells you to re-authenticate. If the 401 is caused by host clock drift (common on NAS hosts), the log instead points at the system time/NTP
15
+ - Licensing note: python-roborock relicensed to Apache 2.0 (2026-07-20), making these ports license-compatible with this MIT plugin
16
+
17
+ ## 2.1.3
18
+
19
+ Stability release — no new features.
20
+
21
+ - **Fix (crash)**: A failed Roborock cloud login (wrong credentials, expired session, or the cloud being unreachable) crashed Homebridge with an unhandled rejection during startup. The plugin now logs the error and stays idle instead of sending Homebridge into a crash-restart loop
22
+ - **Hardening**: Platform startup is wrapped so any unexpected initialization error is logged instead of taking down Homebridge
23
+
3
24
  ## 2.1.2
4
25
 
5
26
  Maintenance release — no functional changes.
package/dist/platform.js CHANGED
@@ -106,7 +106,12 @@ class RoborockPlatform {
106
106
  */
107
107
  this.api.on("didFinishLaunching" /* APIEvent.DID_FINISH_LAUNCHING */, () => {
108
108
  this.log.debug("Finished launching and restored cached accessories.");
109
- this.configurePlugin();
109
+ this.configurePlugin().catch((error) => {
110
+ this.log.error(`Failed to start the Roborock platform: ${error}. ` +
111
+ "The plugin will stay idle; fix the configuration or connectivity " +
112
+ "issue and restart Homebridge.");
113
+ this.log.debug(error);
114
+ });
110
115
  });
111
116
  this.api.on("shutdown" /* APIEvent.SHUTDOWN */, () => {
112
117
  this.log.debug("Shutting down...");
@@ -204,10 +209,15 @@ class RoborockPlatform {
204
209
  }
205
210
  }
206
211
  });
207
- self.roborockAPI.startService(function () {
212
+ Promise.resolve(self.roborockAPI.startService(function () {
208
213
  self.log.info("Service started");
209
214
  //call the discoverDevices function
210
215
  self.discoverDevices();
216
+ })).catch((error) => {
217
+ self.log.error(`Failed to start the Roborock service: ${error}. ` +
218
+ "The plugin will stay idle; fix the configuration or connectivity " +
219
+ "issue and restart Homebridge.");
220
+ self.log.debug(error);
211
221
  });
212
222
  }
213
223
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "homebridge-roborock-vacuum",
3
- "version": "2.1.2",
3
+ "version": "2.2.0",
4
4
  "description": "Roborock Vacuum Cleaner - plugin for Homebridge.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -65,9 +65,27 @@ const dockTypes = {
65
65
  2: "Empty Wash Fill Dock",
66
66
  3: "Empty Wash Fill (Dry) Dock",
67
67
  5: "Auto-Empty Dock (Q8 Max+)",
68
+ 6: "Empty Wash Fill Dry Dock (S7 Max Ultra)",
68
69
  7: "Empty Wash Fill Dry Dock (S8 Pro Ultra)",
69
70
  8: "Empty Wash Fill Dry Dock (Q Revo)",
70
71
  9: "Empty Wash Fill Dry Dock (Q Revo Pro)",
72
+ 10: "Empty Wash Fill Dry Dock (o5)",
73
+ 11: "Empty Wash Fill Dry Dock (shell_2s)",
74
+ 13: "Empty Wash Fill Dry Dock (couple dock)",
75
+ 14: "Empty Wash Fill Dry Dock (shell_3)",
76
+ 15: "Empty Wash Fill Dry Dock (shell_2c)",
77
+ 16: "Empty Wash Fill Dry Dock (shell_3s)",
78
+ 17: "Empty Wash Fill Dry Dock (Qrevo Curv)",
79
+ 18: "Empty Wash Fill Dry Dock (Saros 10)",
80
+ 19: "Empty Wash Fill Dry Dock (k1c)",
81
+ 20: "Empty Wash Fill Dry Dock (k1s)",
82
+ 21: "Empty Wash Fill Dry Dock (shell_e)",
83
+ 22: "Empty Wash Fill Dry Dock (Qrevo S5V)",
84
+ 23: "Empty Wash Fill Dry Dock (shell_3c)",
85
+ 27: "Empty Wash Fill Dry Dock (Saros 20)",
86
+ 28: "Empty Wash Fill Dry Dock (k1c lite)",
87
+ 30: "Empty Wash Fill Dry Dock (shell_2e lite)",
88
+ 40: "Empty Wash Fill Dry Dock (shell_2e heat)",
71
89
  };
72
90
 
73
91
 
@@ -1202,6 +1220,13 @@ class deviceFeatures {
1202
1220
  this.isSupportedDrying();
1203
1221
  break;
1204
1222
  default:
1223
+ // Every dock code not listed above (10-40 and any future code) is a
1224
+ // full-featured dock: collect + wash + dry. Only the small legacy
1225
+ // exception set above lacks features, so unknown codes must enable
1226
+ // everything instead of silently disabling dock controls.
1227
+ this.isDustCollectionSettingSupported();
1228
+ this.isWashThenChargeCmdSupported();
1229
+ this.isSupportedDrying();
1205
1230
  break;
1206
1231
  }
1207
1232
  }
@@ -15,6 +15,9 @@ const BROADCAST_TOKEN = Buffer.from("qWKYcdQWrbm9hPqe", "utf8");
15
15
  const MAX_SEGMENT_LENGTH = 8 * 1024 * 1024; // 8 MB per frame
16
16
  const MAX_CHUNK_BUFFER = 16 * 1024 * 1024; // 16 MB total buffered
17
17
  const RECONNECT_DELAY = 60000;
18
+ // Minimum spacing between cloud-side IP refreshes per device, so the
19
+ // reconnect loop cannot flood the cloud API when a device stays unreachable.
20
+ const IP_REFRESH_MIN_INTERVAL = 60000;
18
21
 
19
22
  class EnhancedSocket extends net.Socket {
20
23
  constructor(options) {
@@ -70,6 +73,7 @@ class localConnector {
70
73
  this.localClients = {};
71
74
  this.l01HandshakeWaiters = new Map();
72
75
  this.reconnectTimeouts = new Map();
76
+ this.lastIpRefresh = new Map();
73
77
  this.shuttingDown = false;
74
78
  }
75
79
 
@@ -85,6 +89,13 @@ class localConnector {
85
89
  client
86
90
  .connect(58867, ip, async () => {
87
91
  this.adapter.log.debug(`tcp client for ${duid} connected`);
92
+ // A device that was demoted to the cloud path after a failed TCP
93
+ // connect is reachable again — promote it back to local mode.
94
+ if (this.adapter.remoteDevices.delete(duid)) {
95
+ this.adapter.log.info(
96
+ `Local connection for ${duid} restored. Switching back from cloud to local mode.`
97
+ );
98
+ }
88
99
  this.ensureL01Handshake(duid).catch((error) => {
89
100
  this.adapter.log.debug(
90
101
  `L01 handshake on connect failed for ${duid}: ${error.message}`
@@ -108,6 +119,10 @@ class localConnector {
108
119
  this.adapter.remoteDevices.add(duid);
109
120
  // this.adapter.catchError(`Failed to create tcp client: ${error.stack}`, `function createClient`, duid);
110
121
  }
122
+ // Keep probing in the background (with a cloud-side IP refresh) so a
123
+ // device that becomes reachable — or got a new DHCP address — is
124
+ // promoted back to local mode instead of staying cloud-only forever.
125
+ this.scheduleReconnect(duid, ip);
111
126
  });
112
127
 
113
128
  client.on("data", async (message) => {
@@ -270,11 +285,42 @@ class localConnector {
270
285
  duid,
271
286
  setTimeout(async () => {
272
287
  this.reconnectTimeouts.delete(duid);
273
- await this.createClient(duid, ip);
288
+ // The IP captured at startup goes stale when DHCP hands the device a
289
+ // new address; re-query it over the cloud before dialing.
290
+ const refreshedIp = await this.refreshLocalIp(duid);
291
+ await this.createClient(duid, refreshedIp || ip);
274
292
  }, RECONNECT_DELAY)
275
293
  );
276
294
  }
277
295
 
296
+ // Re-query the device's current local IP over the cloud channel
297
+ // (get_network_info updates adapter.localDevices). Rate-limited per device;
298
+ // returns the freshest known IP or undefined when none is available.
299
+ async refreshLocalIp(duid) {
300
+ const now = Date.now();
301
+ const lastRefresh = this.lastIpRefresh.get(duid) || 0;
302
+ if (now - lastRefresh >= IP_REFRESH_MIN_INTERVAL) {
303
+ this.lastIpRefresh.set(duid, now);
304
+ try {
305
+ if (
306
+ this.adapter.hasInitializedVacuum &&
307
+ this.adapter.hasInitializedVacuum(duid)
308
+ ) {
309
+ await this.adapter.vacuums[duid].getParameter(
310
+ duid,
311
+ "get_network_info"
312
+ );
313
+ }
314
+ } catch (error) {
315
+ this.adapter.log.debug(
316
+ `Cloud IP refresh failed for ${duid}: ${error && error.message}`
317
+ );
318
+ }
319
+ }
320
+
321
+ return this.adapter.localDevices[duid];
322
+ }
323
+
278
324
  shutdown() {
279
325
  this.shuttingDown = true;
280
326
 
@@ -474,11 +520,19 @@ class localConnector {
474
520
  });
475
521
 
476
522
  server.on("error", (error) => {
477
- this.adapter.catchError(`Discover server error: ${error.stack}`);
523
+ // Port 58866 may already be taken by another Roborock integration on
524
+ // the same host. Discovery is best-effort (get_network_info provides
525
+ // IPs too), so a bind failure must not abort device creation.
526
+ this.adapter.log.warn(
527
+ `UDP discovery unavailable (${error.message}). Continuing without it; local IPs will come from the cloud instead.`
528
+ );
478
529
  closeServer();
530
+ if (this.localDevicesTimeout) {
531
+ this.adapter.clearTimeout(this.localDevicesTimeout);
532
+ }
479
533
  if (!settled) {
480
534
  settled = true;
481
- reject(error);
535
+ resolve(devices);
482
536
  }
483
537
  });
484
538
 
@@ -533,7 +587,7 @@ class localConnector {
533
587
  decipher.update(input),
534
588
  decipher.final(),
535
589
  ]);
536
- const unpadded = safeRemovePkcs7(decryptedBuf);
590
+ const unpadded = this.safeRemovePkcs7(decryptedBuf);
537
591
 
538
592
  // 若原協定內容是 UTF-8,這裡再轉字串;否則直接回傳 Buffer 讓上層處理
539
593
  return unpadded.toString("utf8");
@@ -15,7 +15,7 @@ class messageQueueHandler {
15
15
  const mqttConnectionState = this.adapter.rr_mqtt_connector.isConnected();
16
16
  const localConnectionState = this.adapter.localConnector.isConnected(duid);
17
17
 
18
- let useCloudConnection = remoteConnection || secure || photo || method == "get_network_info";
18
+ let useCloudConnection = remoteConnection || secure || photo || method == "get_network_info" || method == "service.get_net_info";
19
19
  if (!useCloudConnection && !localConnectionState && mqttConnectionState) {
20
20
  useCloudConnection = true;
21
21
  this.adapter.log.info(`Local connection unavailable for ${duid}. Falling back to cloud connection for method ${method}.`);
@@ -69,17 +69,7 @@ class roborock_mqtt_connector {
69
69
 
70
70
  await client.on("connect", (result) => {
71
71
  if (typeof result != "undefined") {
72
- client.subscribe(`rr/m/o/${rriot.u}/${mqttUser}/#`, (err, granted) => {
73
- if (err) {
74
- this.adapter.catchError(
75
- `Failed to subscribe to Roborock MQTT Server! Error: ${err}, granted: ${JSON.stringify(granted)}`,
76
- `client.on("connect")`
77
- );
78
- }
79
- });
80
- clearTimeout(timeout);
81
-
82
- this.connected = true;
72
+ this.subscribeAndMarkConnected(timeout, `client.on("connect")`);
83
73
  }
84
74
  this.adapter.log.debug(
85
75
  `MQTT connection connected ${JSON.stringify(result)}.`
@@ -108,15 +98,7 @@ class roborock_mqtt_connector {
108
98
  `mqtt client reconnect`
109
99
  );
110
100
  } else {
111
- client.subscribe(`rr/m/o/${rriot.u}/${mqttUser}/#`, (err, granted) => {
112
- if (err) {
113
- this.adapter.catchError(
114
- `Failed to subscribe to Roborock MQTT Server! Error: ${err}, granted: ${JSON.stringify(granted)}`,
115
- `client.on("reconnect")`
116
- );
117
- }
118
- });
119
- clearTimeout(timeout);
101
+ this.subscribeAndMarkConnected(timeout, `client.on("reconnect")`);
120
102
  }
121
103
  this.adapter.log.info(`MQTT connection reconnect.`);
122
104
  });
@@ -131,6 +113,29 @@ class roborock_mqtt_connector {
131
113
  });
132
114
  }
133
115
 
116
+ // The connection only counts as healthy once the device-topic subscription
117
+ // is granted: a connected broker session with a failed subscribe can never
118
+ // deliver a response, and reporting it as connected would suppress the
119
+ // local-connection fallback. Note the broker signals a rejected
120
+ // subscription via qos 128 in the grant, not via err.
121
+ subscribeAndMarkConnected(connectTimeout, context) {
122
+ client.subscribe(`rr/m/o/${rriot.u}/${mqttUser}/#`, (err, granted) => {
123
+ const rejected = !err && granted && granted[0] && granted[0].qos === 128;
124
+
125
+ if (err || rejected) {
126
+ this.connected = false;
127
+ this.adapter.catchError(
128
+ `Failed to subscribe to Roborock MQTT Server! Error: ${err}, granted: ${JSON.stringify(granted)}`,
129
+ context
130
+ );
131
+ return;
132
+ }
133
+
134
+ clearTimeout(connectTimeout);
135
+ this.connected = true;
136
+ });
137
+ }
138
+
134
139
  async isArray(what) {
135
140
  return Object.prototype.toString.call(what) === "[object Array]";
136
141
  }
@@ -186,20 +186,43 @@ class vacuum {
186
186
  try {
187
187
  if (parameter == "get_network_info") {
188
188
  mode = parameter;
189
- const networkInfo = await this.adapter.messageQueueHandler.sendRequest(
189
+ // B01 devices do not answer get_network_info; they expose the same
190
+ // data via service.get_net_info, with the IP under inconsistent
191
+ // field names depending on firmware (ip / ipAddress / ipAdress).
192
+ const version = await this.adapter.getRobotVersion(duid);
193
+ const method =
194
+ version == "B01" ? "service.get_net_info" : "get_network_info";
195
+ let networkInfo = await this.adapter.messageQueueHandler.sendRequest(
190
196
  duid,
191
- parameter,
197
+ method,
192
198
  []
193
199
  );
194
200
 
195
- for (const attribute in networkInfo) {
196
- if (attribute == "ip" && !(await this.adapter.isRemoteDevice(duid))) {
197
- this.adapter.localDevices[duid] = networkInfo[attribute];
201
+ if (Array.isArray(networkInfo)) {
202
+ networkInfo = networkInfo[0];
203
+ }
204
+
205
+ if (networkInfo && typeof networkInfo == "object") {
206
+ if (!networkInfo.ip) {
207
+ const alternateIp = networkInfo.ipAddress || networkInfo.ipAdress;
208
+ if (alternateIp) {
209
+ networkInfo.ip = alternateIp;
210
+ }
211
+ }
212
+
213
+ for (const attribute in networkInfo) {
214
+ // Devices demoted to the cloud path after a TCP failure
215
+ // (remoteDevices) still record their IP here so the reconnect
216
+ // loop can dial the fresh address; only devices shared from
217
+ // another account can never be local.
218
+ if (attribute == "ip" && !this.adapter.isSharedDevice(duid)) {
219
+ this.adapter.localDevices[duid] = networkInfo[attribute];
220
+ }
221
+ this.adapter.setStateAsync(
222
+ `Devices.${duid}.networkInfo.${attribute}`,
223
+ { val: networkInfo[attribute], ack: true }
224
+ );
198
225
  }
199
- this.adapter.setStateAsync(
200
- `Devices.${duid}.networkInfo.${attribute}`,
201
- { val: networkInfo[attribute], ack: true }
202
- );
203
226
  }
204
227
  } else if (parameter == "get_consumable") {
205
228
  const consumables = (
@@ -33,8 +33,12 @@ function md5hex(str) {
33
33
  return crypto.createHash("md5").update(str).digest("hex");
34
34
  }
35
35
 
36
- // Dock types whose station can wash the mop (see deviceFeatures.processDockType).
37
- const MOP_WASHING_DOCK_TYPES = [2, 3, 6, 7, 8, 9];
36
+ // Dock types whose station cannot wash the mop: 0 = plain charging dock,
37
+ // 1 and 5 = auto-empty only. Every other dock code (2, 3, 6-40 and future
38
+ // generations) washes the mop, so the gate is membership in this small
39
+ // exception set rather than an ever-growing wash-capable list
40
+ // (see deviceFeatures.processDockType).
41
+ const NON_MOP_WASHING_DOCK_TYPES = [0, 1, 5];
38
42
 
39
43
  // Only languages with a bundled i18n catalog are accepted; anything else
40
44
  // (including path-traversal attempts) falls back to English.
@@ -591,6 +595,8 @@ class Roborock {
591
595
 
592
596
  this.roomIDs[roomID] = roomName;
593
597
  }
598
+
599
+ await this.loadSharedDeviceRooms();
594
600
  this.log.debug(`RoomIDs debug: ${JSON.stringify(this.roomIDs)}`);
595
601
 
596
602
  // reconnect every 3 hours (10800 seconds)
@@ -728,10 +734,14 @@ class Roborock {
728
734
 
729
735
  throw new Error(`Login failed: ${JSON.stringify(loginResult)}`);
730
736
  } catch (error) {
737
+ // Failed logins (bad credentials, unreachable cloud) are expected
738
+ // runtime conditions — report "no user data" so startService aborts
739
+ // gracefully instead of crashing Homebridge with an unhandled
740
+ // rejection.
731
741
  this.log.error(`Error in getUserData: ${error.message}`);
732
742
  await this.deleteStateAsync("HomeData");
733
743
  await this.deleteStateAsync("UserData");
734
- throw error;
744
+ return null;
735
745
  }
736
746
  }
737
747
 
@@ -1038,7 +1048,9 @@ class Roborock {
1038
1048
  try {
1039
1049
  await this.api.post(`user/scene/${sceneID.val}/execute`);
1040
1050
  } catch (error) {
1041
- this.catchError(error.stack, "executeScene");
1051
+ if (!this.handleApiUnauthorized(error, "executeScene")) {
1052
+ this.catchError(error.stack, "executeScene");
1053
+ }
1042
1054
  }
1043
1055
  }
1044
1056
  }
@@ -1085,7 +1097,9 @@ class Roborock {
1085
1097
 
1086
1098
  return response.data;
1087
1099
  } catch (error) {
1088
- this.log.error(`Failed to get scenes: ${error.message}`);
1100
+ if (!this.handleApiUnauthorized(error, "getScenes")) {
1101
+ this.log.error(`Failed to get scenes: ${error.message}`);
1102
+ }
1089
1103
  throw error;
1090
1104
  }
1091
1105
  }
@@ -1231,6 +1245,45 @@ class Roborock {
1231
1245
  return !!receivedDevice || this.remoteDevices.has(duid);
1232
1246
  }
1233
1247
 
1248
+ // Rooms of a device shared from another account are not part of this
1249
+ // account's home data, so their segment ids would never resolve to names.
1250
+ // Query them per shared device and merge into roomIDs. Room entries carry
1251
+ // their id as either `id` or `roomId` depending on the backend.
1252
+ async loadSharedDeviceRooms() {
1253
+ for (const device of this.receivedDevices || []) {
1254
+ try {
1255
+ const response = await this.api.get(
1256
+ `user/deviceshare/query/${device.duid}/rooms`
1257
+ );
1258
+ const rooms = response?.data?.result;
1259
+ if (!Array.isArray(rooms)) {
1260
+ continue;
1261
+ }
1262
+
1263
+ for (const room of rooms) {
1264
+ const roomID = room.id !== undefined ? room.id : room.roomId;
1265
+ if (roomID !== undefined && room.name) {
1266
+ this.roomIDs[roomID] = room.name;
1267
+ }
1268
+ }
1269
+ } catch (error) {
1270
+ this.log.warn(
1271
+ `Failed to load rooms for shared device ${device.duid}: ${error && error.message}`
1272
+ );
1273
+ }
1274
+ }
1275
+ }
1276
+
1277
+ // A device shared from another account (receivedDevices) can never use the
1278
+ // local connection. Unlike isRemoteDevice, this excludes remoteDevices
1279
+ // membership, which is only a temporary TCP-failure fallback.
1280
+ isSharedDevice(duid) {
1281
+ const homedata = this.getParsedHomeData();
1282
+ const received = this.receivedDevices || homedata?.receivedDevices || [];
1283
+
1284
+ return received.some((device) => device.duid == duid);
1285
+ }
1286
+
1234
1287
  async getConnector(duid) {
1235
1288
  const isRemote = await this.isRemoteDevice(duid);
1236
1289
 
@@ -1412,9 +1465,72 @@ class Roborock {
1412
1465
  this.log.warn("homedata failed to download");
1413
1466
  }
1414
1467
  } catch (error) {
1415
- this.log.error(`Failed to update updateHomeData with error: ${error}`);
1468
+ if (!this.handleApiUnauthorized(error, "updateHomeData")) {
1469
+ this.log.error(
1470
+ `Failed to update updateHomeData with error: ${error}`
1471
+ );
1472
+ }
1473
+ }
1474
+ }
1475
+ }
1476
+
1477
+ /**
1478
+ * Shared 401 handling for the Hawk-signed cloud API. Two distinct causes:
1479
+ * - Host clock skew: the Hawk signature embeds a local timestamp, so NTP
1480
+ * drift (common on NAS hosts) invalidates every request. Detected via the
1481
+ * server Date header; self-heals once the clock is fixed, so polling
1482
+ * continues and only a clear hint is logged.
1483
+ * - Invalidated session (password change, session revoked): retrying forever
1484
+ * just loops the same error, so the cached session is cleared and the
1485
+ * HomeData polling stops until the user re-authenticates.
1486
+ * Returns true when the error was a 401 and has been handled here.
1487
+ */
1488
+ handleApiUnauthorized(error, context) {
1489
+ if (!error || !error.response || error.response.status !== 401) {
1490
+ return false;
1491
+ }
1492
+
1493
+ const serverDate = error.response.headers?.date;
1494
+ if (serverDate) {
1495
+ const skewSeconds = Math.round(
1496
+ (new Date(serverDate).getTime() - Date.now()) / 1000
1497
+ );
1498
+ if (Number.isFinite(skewSeconds) && Math.abs(skewSeconds) > 60) {
1499
+ // Skew 401s hit every signed request; log the hint at most every 10 min.
1500
+ const now = Date.now();
1501
+ if (
1502
+ !this.lastClockSkewWarning ||
1503
+ now - this.lastClockSkewWarning > 10 * 60 * 1000
1504
+ ) {
1505
+ this.lastClockSkewWarning = now;
1506
+ this.log.error(
1507
+ `Roborock API rejected the request (401) in ${context}, and this host's clock is off by ${skewSeconds} seconds from the server. ` +
1508
+ `Fix the system time (enable NTP) — the API request signature embeds a timestamp, so large clock skew invalidates every request.`
1509
+ );
1510
+ }
1511
+ return true;
1416
1512
  }
1417
1513
  }
1514
+
1515
+ if (this.sessionInvalidated) {
1516
+ return true;
1517
+ }
1518
+ this.sessionInvalidated = true;
1519
+
1520
+ this.log.warn(
1521
+ `Roborock API rejected the session (401) in ${context}. ` +
1522
+ `Clearing the cached session — please re-authenticate in the plugin settings and restart Homebridge.`
1523
+ );
1524
+
1525
+ this.userData = null;
1526
+ this.deleteStateAsync("UserData");
1527
+
1528
+ if (this.homedataInterval) {
1529
+ this.clearInterval(this.homedataInterval);
1530
+ this.homedataInterval = undefined;
1531
+ }
1532
+
1533
+ return true;
1418
1534
  }
1419
1535
 
1420
1536
  async updateConsumablesPercent(devices) {
@@ -2231,10 +2347,13 @@ class Roborock {
2231
2347
  this.log.debug(`isDockWashSupported: ${error}`);
2232
2348
  }
2233
2349
 
2234
- const dockType = this.getStateAsync(
2235
- `Devices.${duid}.deviceStatus.dock_type`
2350
+ const dockType = Number(
2351
+ this.getStateAsync(`Devices.${duid}.deviceStatus.dock_type`)?.val
2352
+ );
2353
+ return (
2354
+ Number.isFinite(dockType) &&
2355
+ !NON_MOP_WASHING_DOCK_TYPES.includes(dockType)
2236
2356
  );
2237
- return MOP_WASHING_DOCK_TYPES.includes(Number(dockType?.val));
2238
2357
  }
2239
2358
 
2240
2359
  /**
@@ -2374,11 +2493,19 @@ class Roborock {
2374
2493
  this.log.debug(`getCleanModeCapabilities: ${error}`);
2375
2494
  }
2376
2495
 
2496
+ // The Qrevo Edge 2 (a298) does not use the classic 200-203 water levels:
2497
+ // it keeps 200 = Off but replaces 201-203 with banded levels 221-250,
2498
+ // so writing the classic default 202 would be rejected by the device.
2499
+ // 233 is the middle ("Medium") band. The sibling Qrevo Edge (a187) still
2500
+ // uses the classic values.
2501
+ const model = this.getProductAttribute(duid, "model");
2502
+ const usesBandedWaterLevels = model === "roborock.vacuum.a298";
2503
+
2377
2504
  return {
2378
2505
  fanOff: 105,
2379
2506
  fanDefault: 102,
2380
2507
  waterOff: 200,
2381
- waterDefault: 202,
2508
+ waterDefault: usesBandedWaterLevels ? 233 : 202,
2382
2509
  mopSupported: mopSupported,
2383
2510
  };
2384
2511
  }