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 +61 -9
- package/README.md +2 -2
- package/package.json +1 -1
- package/roborockLib/lib/vacuum.js +5 -2
- package/roborockLib/roborockAPI.js +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,16 +1,68 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 3.40.0
|
|
3
|
+
## 3.40.0
|
|
4
4
|
|
|
5
|
-
**
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
}
|