homebridge-roborock-matter 3.40.0-beta.2 → 3.40.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,16 +1,68 @@
1
1
  # Changelog
2
2
 
3
- ## 3.40.0-beta.2
3
+ ## 3.40.0
4
4
 
5
- **A test build of the biggest reliability round so far. The plugin now handles the local and cloud connections the way python-roborock does, and a long list of Apple Home, schedule and Q7/Q10 faults found in a full review are fixed. Feedback before 3.40.0 is very welcome.**
5
+ **The same failures kept coming back because the plugin handled its connections differently from python-roborock, the library Home Assistant uses, in exactly the places where that library had already fixed them. A full review against it found those differences and the faults around them. This release closes them.**
6
6
 
7
- - **Local connection:** a ping every 10 s, an immediate reconnect after a drop, and a request whose connection dies under it is retried at once over the cloud instead of timing out. A local connection that stops answering is closed and reopened instead of leaving the robot on the cloud until a restart.
8
- - **Cloud connection:** a new MQTT client with its own id for every connection, python-roborock's back-off instead of a reconnect every second, and the "3 unanswered requests" restart now also fires on an account that has Q7 robots. Map lists, maps and network info always go over the cloud, and every cloud request carries the security block.
9
- - **The log:** one line per robot per hour says how its requests fared on the LAN and the cloud. The old "Failed to execute" line was throttled to once per 6 hours and hid most failures: on my own server an estimated 1,400 timeouts in a week showed up as 36 lines.
10
- - **Apple Home:** resume continues a paused room clean instead of starting a whole-home clean; the clean mode follows the robot's own water setting; a standing tank warning is no longer repeated by a restart, a quiet spell or a dust-bin emptying; a full dirty-water tank is reported as such (#26); rooms are marked cleaned only when a run really finished; the room selection survives a restart.
11
- - **Startup and login:** a start that succeeds on its retry publishes the robots (it used to leave every robot unpublished until a manual restart); a login Roborock no longer accepts is replaced or reported instead of retried forever; logins send the agreement version Roborock asks for; robots shared with the account work; a self-hosted local_roborock_server can be used (#43).
12
- - **Schedules and Routines:** a schedule switch answers Apple Home within its time limit; a timed-out timer read no longer hides the Routines; a schedule deleted while Homebridge was stopped loses its switch.
13
- - **Q7 and Q10:** a Q7's live room comes from the map it pushes while cleaning, faults like trapped or brush jammed reach Apple Home, 2103 at the dock is no longer a fault, and a Q10 reads its own units, rooms and resume (#19).
7
+ ### My own mistakes first
8
+
9
+ - The "Failed to execute …" line was printed at most once every 6 hours per robot and error. Every weekly check read the log through it: on my own server 36 lines in a week stood for an estimated 1,400 timeouts. One line per robot per hour now says how its requests fared on the LAN and the cloud, and the warning repeats after an hour, not six.
10
+ - 3.36.0's rule "3 cloud requests unanswered in a row → fresh MQTT session" could not fire on an account with a Q7: any Q7 reply reset the count of a classic robot that had stopped answering. My own S8 Pro Ultra's cloud path stayed dead for 2.3 days that way.
11
+ - 3.35.0's resume fix (#28) never worked in production. The robot's `in_cleaning` was not kept from its live status, so Resume always sent a whole-home start, and a paused room clean became a whole-home clean. The tests passed because they set the value themselves.
12
+ - I told #26 that Matter has no code for a full dirty-water tank. It has (74, since Matter 1.4.2), and Homebridge 2.4.0's matter.js accepts it.
13
+ - A start that failed and then succeeded on its retry never published the robots. Every robot showed "No Response" until a manual restart.
14
+
15
+ ### The local connection
16
+
17
+ - Every local connection gets python-roborock's ping every 10 s and is reconnected at once after a drop. A request whose connection dies under it, or that times out on the LAN, is sent again over the cloud straight away instead of failing. That is the `Local connect state: false` in #24.
18
+ - A connection that stops answering is closed and reopened. It used to leave the robot on the cloud until Homebridge restarted, with the settings page still saying "Local connected".
19
+ - Map lists, map switches, maps and network info always go over the cloud, as python-roborock sends them.
20
+ - A timeout no longer cuts another reply in half, and a robot removed from the account no longer keeps a connection.
21
+
22
+ ### The cloud connection
23
+
24
+ - Each MQTT connection is a new client with its own id, opened after python-roborock's back-off (10 s, ×1.5, at most 10 minutes) instead of every second with the account-wide id. Every cloud request carries the security block, as python-roborock sends it.
25
+ - The 3-silence restart counts classic robots' cloud requests only, as python-roborock's HealthManager does.
26
+ - A request whose connection went away under it is never counted as a robot that stopped answering.
27
+
28
+ ### Apple Home
29
+
30
+ - Resume continues a paused room clean (`resume_segment_clean`).
31
+ - The clean mode follows the robot's own water setting, live, not the 3-minute home-data snapshot.
32
+ - A standing tank warning is no longer withdrawn and raised again by a Homebridge restart, by 15 minutes without a live status, or by dock chores (emptying the bin, washing or drying the mop). One notification per cleaning run remains while the tank is not dealt with, on purpose.
33
+ - A full dirty-water tank is reported as DirtyWaterTankFull (#26). Missing is not: the dock does not tell full from not fitted.
34
+ - Rooms are marked cleaned only when a run actually finished; a Stop marks the rest skipped. Mop washing and other busy states without a Matter name no longer end the run on the tile.
35
+ - The room selection survives a restart. A briefly incomplete room list no longer shrinks it, and a room filed under no map no longer freezes the room list.
36
+ - A write the Matter store refused is repaired on the next publish instead of being believed.
37
+
38
+ ### Startup, login and the account
39
+
40
+ - A login session Roborock no longer accepts is replaced (with a password) or reported once (without one), instead of retried forever as "temporary". A transient error never counts as a refusal.
41
+ - Logins send the agreement version and country Roborock asks for, avoiding error 3006, and are capped at python-roborock's rates. Only an attempt Roborock answered counts toward the cap.
42
+ - Robots shared with the account get a runtime and their owner's room names. The 3-minute refresh applies renamed robots and room names, and removes a robot only after two readings in a row lack it.
43
+ - A self-hosted [local_roborock_server](https://github.com/Python-roborock/local_roborock_server) can be used for the login (#43). Leave the setting empty and nothing changes.
44
+ - Both cloud REST clients give up after 30 s, so a hung request cannot block a Routine or schedule switch until restart.
45
+ - Shutdown during a start, a retry or a restart no longer leaves a client or timer behind.
46
+
47
+ ### Schedules and Routines
48
+
49
+ - A schedule switch answers Apple Home within its time limit and confirms afterwards; a write the cloud does not confirm is switched back, with the reason in the log.
50
+ - A timed-out timer read no longer hides the Routines, and is retried. A schedule deleted while Homebridge was stopped loses its switch. A request numbered 429 is not a rate limit.
51
+
52
+ ### Q7 and Q10
53
+
54
+ - A Q7's live room comes from the map it pushes while cleaning, never from the saved map a request returns; that saved map's placeholder was the "placeholder instead of the robot's position" line. Its map list is fetched once per run, not every 10 s.
55
+ - Trapped, brush-jammed and similar Q7 and Q10 faults reach Apple Home while the robot is out of its dock. 2103 at the dock is no longer a fault (python-roborock: "not an error").
56
+ - A Q7 answer that does not say what the robot is doing, or a state the tables cannot translate, reads as unknown instead of idle. A Q7 started from Apple Home is not asked to read back its suction.
57
+ - A Q10 reads its own units for suction, clean mode and faults, shows its rooms, continues a paused room clean, and is asked for its status once a minute (#19). A B01 model that is neither Q7 nor Q10 is no longer sent Q7 frames.
58
+
59
+ ### Contributions
60
+
61
+ [@pponce](https://github.com/pponce)'s [#30](https://github.com/mathiashornbek/homebridge-roborock-matter/pull/30) (correlated MQTT silence is not counted against a method) and [#42](https://github.com/mathiashornbek/homebridge-roborock-matter/pull/42) (OS-assigned ports in the probe tests) are in this release.
62
+
63
+ ### Tests
64
+
65
+ 2,541 tests, 286 more than 3.39.0. Each fix's new tests were run against the code before the fix and fail there. Four independent reviews of the merged code ran before release, two of them against the real Homebridge 2.4.0 and matter.js 0.17.9, and the faults they found are fixed above.
14
66
 
15
67
  ## 3.39.0
16
68
 
package/README.md CHANGED
@@ -37,7 +37,7 @@ This is the most feature-packed, most thoroughly engineered Roborock plugin for
37
37
  - 📍 **See where it's cleaning — live.** Apple Home shows _"Cleaning — Kitchen"_ with the room the robot is actually inside, updating as it moves from room to room. Works even for cleans started from the robot's button or the Roborock app. No other Homebridge plugin does this.
38
38
  - 🧭 **One robot, one tile — and as many robots as you own.** Sign in once and your whole fleet comes along: every vacuum on your account appears as its own clean, native accessory in Apple Home. No clutter of fake fans and helper switches, and rooms appear with the names you gave them in the Roborock app.
39
39
  - ⚡ **Fast and reliable.** Commands go directly to the robot over your own network whenever possible, with the Roborock cloud as automatic backup — and built-in diagnostics in the settings if you ever want to look under the hood.
40
- - 🛡️ **Verified by Homebridge.** Reviewed and endorsed by the Homebridge team. 2540 automated tests, zero known vulnerabilities, no analytics, and a startup designed to never crash your Homebridge — even when your Wi-Fi or the Roborock cloud has a bad day.
40
+ - 🛡️ **Verified by Homebridge.** Reviewed and endorsed by the Homebridge team. 2541 automated tests, zero known vulnerabilities, no analytics, and a startup designed to never crash your Homebridge — even when your Wi-Fi or the Roborock cloud has a bad day.
41
41
 
42
42
  ## Features
43
43
 
@@ -264,7 +264,7 @@ The complete path — robot → plugin → Homebridge → matter.js store — wa
264
264
 
265
265
  ## Contributing
266
266
 
267
- Model reports, diagnostics exports, and pull requests are very welcome. The codebase ships with 2540 tests (protocol fixtures verified against the [python-roborock](https://github.com/Python-roborock/python-roborock) reference), strict TypeScript checking, and CI across Node 22/24 × Homebridge 1.11/2.x — `npm test` before you push and you're set.
267
+ Model reports, diagnostics exports, and pull requests are very welcome. The codebase ships with 2541 tests (protocol fixtures verified against the [python-roborock](https://github.com/Python-roborock/python-roborock) reference), strict TypeScript checking, and CI across Node 22/24 × Homebridge 1.11/2.x — `npm test` before you push and you're set.
268
268
 
269
269
  ## Support the project
270
270
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "homebridge-roborock-matter",
3
- "version": "3.40.0-beta.2",
3
+ "version": "3.40.0",
4
4
  "description": "The most complete Roborock plugin for Apple Home. Supports the entire Roborock lineup — from the classic S-series to the new 2025 Q7 series that no other plugin can control. Sign in with your Roborock account and get native start/stop, room cleaning, suction levels, battery, and live 'cleaning in the kitchen' room tracking. Verified by Homebridge.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -483,8 +483,11 @@ class vacuum {
483
483
  refreshStateAfterCommand(duid, parameter, options) {
484
484
  const getCommand = parameter.replace("set", "get");
485
485
  // Nothing to read back: a command with no `set` in its name would other-
486
- // wise be re-sent to the robot as its own "refresh".
487
- if (getCommand === parameter) {
486
+ // wise be re-sent to the robot as its own "refresh". A B01 robot has no v1
487
+ // reads at all — its state comes from its own status loop and pushes —
488
+ // and reading back its suction logged "Unknown parameter: []" after
489
+ // every start from Apple Home.
490
+ if (getCommand === parameter || this.adapter.isB01Device?.(duid)) {
488
491
  return;
489
492
  }
490
493
 
@@ -6798,8 +6798,9 @@ class Roborock {
6798
6798
  if (previous && previous.segmentId === roomId && missedBeforeThis > 0) {
6799
6799
  // Re-entering the room it was already in resets the miss counter
6800
6800
  // without printing anything, which made the "attempt N" numbers look
6801
- // as if they reset at random. Say it happened.
6802
- this.log.info(
6801
+ // as if they reset at random. Say it happened — at debug: with live
6802
+ // frames a Q7 does this every minute or so, and nothing changed.
6803
+ this.log.debug(
6803
6804
  `Live room for ${this.describeDevice(duid)}: back in ${roomName} (${roomId}) after ${missedBeforeThis} unresolved position(s).`
6804
6805
  );
6805
6806
  }