homebridge-roborock-matter 3.19.5 → 3.19.6

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,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.19.6
4
+
5
+ **The periodic poll no longer carries a cloud firmware check whose answer nothing reads. The check has in fact never run — a missing `await` disabled it — and the tempting one-character repair would have added roughly 480 discarded cloud round-trips per robot per day.**
6
+
7
+ `checkForNewFirmware()` sat in the poll chain and asked the Roborock cloud for `ota/firmware/<duid>/updatev2` once per robot per poll interval. Its own gate read `const isLocalDevice = !this.isRemoteDevice(duid)`, and `isRemoteDevice` is `async`. Negating a promise is false for every promise there has ever been, so the gate never opened and the body behind it has been unreachable for the life of this plugin. Every other caller of that method awaits it; this one line did not.
8
+
9
+ Adding the missing `await` was the obvious repair and it was the wrong one. The request's result goes to `setObjectNotExistsAsync`, which is a documented no-op here, and to `setStateAsync("Devices.<duid>.updateStatus.<field>")`, which nothing in the plugin, the settings UI or the diagnostics export ever reads. The firmware revision Apple Home shows comes from a different source entirely — the `fv` field in HomeData. So the repair would have bought an awaited HTTPS round-trip on the poll thread, per robot, every three minutes, for an answer with no reader, plus a `catchError` path able to log a warning once per poll whenever the OTA endpoint was unhappy. That is the same never-throttled retry loop that 3.19.0, 3.19.1 and 3.19.5 each closed one instance of, and it would have been introduced rather than found.
10
+
11
+ The call and the unreachable method are removed instead. Because the code could never execute, this changes no runtime behaviour on any robot: the same requests go out, the same values reach Apple Home, and nothing that had a reader lost one.
12
+
13
+ What is new is the guard. A test now pins the outcome rather than the implementation — a periodic poll may spend no cloud round-trip on an answer no one can read — and it was verified by applying the naive `await` and watching it go red at exactly 480 requests per simulated day.
14
+
3
15
  ## 3.19.5
4
16
 
5
17
  **A room-list refresh that cannot succeed is no longer re-attempted by every periodic poll. On a Q10 it is not attempted at all, and on a Q7 whose map channel is down it now backs off instead of running 480 guaranteed-to-fail map reads a day.**
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. 1636 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. 1642 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
 
@@ -253,7 +253,7 @@ The complete path — robot → plugin → Homebridge → matter.js store — wa
253
253
 
254
254
  ## Contributing
255
255
 
256
- Model reports, diagnostics exports, and pull requests are very welcome. The codebase ships with 1636 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.
256
+ Model reports, diagnostics exports, and pull requests are very welcome. The codebase ships with 1642 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.
257
257
 
258
258
  ## Support the project
259
259
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "homebridge-roborock-matter",
3
- "version": "3.19.5",
3
+ "version": "3.19.6",
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": {
@@ -3310,8 +3310,6 @@ class Roborock {
3310
3310
 
3311
3311
  await this.pollParameter(duid, vacuum, "get_timer", isB01);
3312
3312
 
3313
- await this.checkForNewFirmware(duid);
3314
-
3315
3313
  switch (robotModel) {
3316
3314
  case "roborock.vacuum.s4":
3317
3315
  case "roborock.vacuum.s5":
@@ -3700,53 +3698,6 @@ class Roborock {
3700
3698
  }
3701
3699
  }
3702
3700
 
3703
- async checkForNewFirmware(duid) {
3704
- const isLocalDevice = !this.isRemoteDevice(duid);
3705
-
3706
- if (isLocalDevice) {
3707
- this.log.debug(`getting firmware status`);
3708
- if (this.api) {
3709
- try {
3710
- const update = await this.api.get(`ota/firmware/${duid}/updatev2`);
3711
-
3712
- await this.setObjectNotExistsAsync(
3713
- "Devices." + duid + ".updateStatus",
3714
- {
3715
- type: "folder",
3716
- common: {
3717
- name: "Update status",
3718
- },
3719
- native: {},
3720
- }
3721
- );
3722
-
3723
- for (const state in update.data.result) {
3724
- await this.setObjectNotExistsAsync(
3725
- "Devices." + duid + ".updateStatus." + state,
3726
- {
3727
- type: "state",
3728
- common: {
3729
- name: state,
3730
- type: this.getType(update.data.result[state]),
3731
- role: "value",
3732
- read: true,
3733
- write: false,
3734
- },
3735
- native: {},
3736
- }
3737
- );
3738
- this.setStateAsync("Devices." + duid + ".updateStatus." + state, {
3739
- val: update.data.result[state],
3740
- ack: true,
3741
- });
3742
- }
3743
- } catch (error) {
3744
- this.catchError(error, "checkForNewFirmware()", duid);
3745
- }
3746
- }
3747
- }
3748
- }
3749
-
3750
3701
  getType(attribute) {
3751
3702
  // Get the type of the attribute.
3752
3703
  const type = typeof attribute;