homebridge-roborock-matter 2.1.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/.gitattributes +13 -0
- package/CHANGELOG.md +469 -0
- package/LICENSE +23 -0
- package/README.md +45 -0
- package/__tests__/testdata/b01_q7_get_prop_response.json +1 -0
- package/__tests__/testdata/b01_q7_map_fixture.json +16 -0
- package/config.schema.json +118 -0
- package/dist/crypto.js +65 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/live_message.js +25 -0
- package/dist/live_message.js.map +1 -0
- package/dist/logger.js +37 -0
- package/dist/logger.js.map +1 -0
- package/dist/matter_vacuum_accessory.js +1877 -0
- package/dist/matter_vacuum_accessory.js.map +1 -0
- package/dist/platform.js +441 -0
- package/dist/platform.js.map +1 -0
- package/dist/settings.js +8 -0
- package/dist/settings.js.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/index.js +741 -0
- package/dist/ui/index.js.map +1 -0
- package/docs/matter-rvc-updating-homebridge-report.md +120 -0
- package/homebridge-roborock-vacuum.code-workspace +7 -0
- package/homebridge-ui/public/index.html +257 -0
- package/homebridge-ui/public/index.js +1276 -0
- package/homebridge-ui/public/styles.css +611 -0
- package/homebridge-ui/server.js +3 -0
- package/package.json +91 -0
- package/roborockLib/i18n/de/translations.json +188 -0
- package/roborockLib/i18n/en/translations.json +208 -0
- package/roborockLib/i18n/es/translations.json +188 -0
- package/roborockLib/i18n/fr/translations.json +188 -0
- package/roborockLib/i18n/it/translations.json +188 -0
- package/roborockLib/i18n/nl/translations.json +188 -0
- package/roborockLib/i18n/pl/translations.json +188 -0
- package/roborockLib/i18n/pt/translations.json +188 -0
- package/roborockLib/i18n/ru/translations.json +188 -0
- package/roborockLib/i18n/uk/translations.json +188 -0
- package/roborockLib/i18n/zh-cn/translations.json +188 -0
- package/roborockLib/lib/RRMapParser.js +459 -0
- package/roborockLib/lib/b01Q7Adapter.js +468 -0
- package/roborockLib/lib/deviceFeatures.js +1349 -0
- package/roborockLib/lib/localConnector.js +629 -0
- package/roborockLib/lib/map/map.html +137 -0
- package/roborockLib/lib/map/zones.js +851 -0
- package/roborockLib/lib/message.js +402 -0
- package/roborockLib/lib/messageQueueHandler.js +411 -0
- package/roborockLib/lib/roborockAuth.js +178 -0
- package/roborockLib/lib/roborockCrypto.js +55 -0
- package/roborockLib/lib/roborockPackageHelper.js +142 -0
- package/roborockLib/lib/roborock_mqtt_connector.js +567 -0
- package/roborockLib/lib/sniffing/mitmproxy_roborock.py +300 -0
- package/roborockLib/lib/vacuum.js +992 -0
- package/roborockLib/roborockAPI.js +3635 -0
- package/tsconfig.roborockLib.json +17 -0
package/.gitattributes
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Normalize line endings to LF in the repository and on checkout for all
|
|
2
|
+
# platforms. Prevents Windows (core.autocrlf=true) from checking files out as
|
|
3
|
+
# CRLF, which otherwise makes `npm run lint` (Prettier, endOfLine: lf) fail
|
|
4
|
+
# locally even though the committed files are LF and pass in CI.
|
|
5
|
+
* text=auto eol=lf
|
|
6
|
+
|
|
7
|
+
# Leave common binary assets untouched.
|
|
8
|
+
*.png binary
|
|
9
|
+
*.jpg binary
|
|
10
|
+
*.jpeg binary
|
|
11
|
+
*.gif binary
|
|
12
|
+
*.ico binary
|
|
13
|
+
*.webp binary
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2.1.0 (first public fork release as homebridge-roborock-matter)
|
|
4
|
+
|
|
5
|
+
This is the first release under the fork name **homebridge-roborock-matter**, maintained by Mathias Hornbek. It is a Matter-only fork of `homebridge-roborock-vacuum2` by Joshua Appleman (originally adapted from ioBroker.roborock by copystring), published under the MIT license with all original copyright preserved.
|
|
6
|
+
|
|
7
|
+
The 2.0.0-matter.x pre-release series is consolidated into this release. Highlights versus upstream:
|
|
8
|
+
|
|
9
|
+
- Matter-only: HomeKit accessories removed; each robot is a single native Matter vacuum.
|
|
10
|
+
- Full B01/Q7-series (roborock.vacuum.sc05) support: commands, status, battery, charging, mop/vacuum mode switching, and room selection via the encrypted B01 map channel, built against the python-roborock reference.
|
|
11
|
+
- Robustness: startup guards, a dedicated self-healing B01 status loop, per-cluster Matter publish isolation, interval-lifecycle fixes, request-id and throttling fixes.
|
|
12
|
+
- UI: light, WCAG-AA settings theme with per-device enable/disable and a Charging/Docked tile option with a configurable battery threshold.
|
|
13
|
+
- 210 passing tests, including fixture-driven B01 protocol and map-decode verification and a full three-robot end-to-end simulation.
|
|
14
|
+
|
|
15
|
+
## 2.0.0-matter.10 (Matter-only edition, unofficial)
|
|
16
|
+
|
|
17
|
+
Boot responsiveness and publish evidence, following field verification that the plugin chain is now fully correct (robots report state=8, battery=100%, charging=yes across restarts):
|
|
18
|
+
|
|
19
|
+
- **The dedicated B01 status loop now polls immediately at start** instead of waiting for the first 15-second tick: after a restart the Matter store briefly holds the registration snapshot, and landing the real values right away both shortens that window and generates a genuine attribute-change report for controllers as early as possible.
|
|
20
|
+
- **One-time publish evidence at info level:** the first successful Matter publish per accessory logs the exact values handed to the Matter layer ("Matter publish for <duid>: battery=100%, operationalState=66"), closing the last observability gap between the robot and Apple Home — any remaining discrepancy is now provably on the controller side (hub cache/subscription), where a Matter-hub restart or a re-pair of the affected accessory resolves it.
|
|
21
|
+
- Full suite: 210 passing.
|
|
22
|
+
|
|
23
|
+
## 2.0.0-matter.9 (Matter-only edition, unofficial)
|
|
24
|
+
|
|
25
|
+
The frozen-battery mystery, solved with field evidence:
|
|
26
|
+
|
|
27
|
+
- **Root cause found via the new first-success log lines:** both Q7 robots reported `battery=100%` correctly through the B01 channel — but with `fault=407`, and the adapter treated any non-zero fault as an error state. Q7 fault code 407 is the informational "Cleaning in progress. Scheduled cleanup ignored." message, which lingers after harmless events; the reference implementation treats the fault field as a separate diagnostic channel that never overrides the work status. The adapter now does the same: work status is the sole source of the robot state, informational codes (0, 407) are normalized out of error_code, and real fault codes still surface as diagnostics without disturbing the state.
|
|
28
|
+
- **Fixed the freezing mechanism itself — per-cluster Matter publish isolation.** Cluster publishes ran in one all-or-nothing batch, so a single misbehaving cluster (here: the erroneous operational-state publish) could block every other attribute, leaving Apple Home stuck on pairing-day values (74%, not charging, Ready). Each cluster now publishes independently: one failure can never again freeze the battery. A totally failed batch keeps its previous semantics, and an "endpoint still initializing" failure still schedules the retry even when other clusters landed.
|
|
29
|
+
- **The full-chain simulation now replays the exact field payloads** (fault 407 on healthy, charging robots) and asserts the complete user-visible outcome: correct battery, Charging below the threshold, Docked at 100%.
|
|
30
|
+
- Full suite: 210 passing.
|
|
31
|
+
|
|
32
|
+
## 2.0.0-matter.8 (Matter-only edition, unofficial)
|
|
33
|
+
|
|
34
|
+
Deep verification and cleanup pass, anchored by a new full-chain simulation:
|
|
35
|
+
|
|
36
|
+
- **Fixed a sequencing flaw in the dedicated B01 status loop start:** the loop was started from inside the device-creation loop but gated on a set that is only populated later, so whether it started at boot depended on device ordering (with a single Q7 it would not start until the 3-minute supervisor). It now starts deterministically after all devices are created.
|
|
37
|
+
- **Verification without debug mode:** the loop start is logged at info level, and each Q7 logs a one-time "B01 status online for <duid>: state=…, battery=…%, charging=yes/no" info line on its first successful status — the raw values straight from the robot, making frozen-battery reports diagnosable at a glance.
|
|
38
|
+
- **New full-chain simulation test** replicating the exact three-robot setup (two Q7s + one classic): real createDevices + initializeDeviceUpdates, real dedicated loop under fake timers, real map decode against the reference fixture, real Matter accessories — only the cloud transport is scripted. It asserts battery following the robot (74% → 100%) and the tile switching Charging (65) → Docked (66) across the 90% threshold.
|
|
39
|
+
- **The startup warning for sc05/Q7 models is gone:** B01/Q7-series robots are first-class citizens of this fork (debug note instead), and the v1 feature probes (get_timer, carpet, water box) are skipped for them entirely — faster startup, clean log.
|
|
40
|
+
- **Dead-weight removal:** the HomeKit-era scenes machinery is deleted (this also removes a pointless cloud API call every 3 minutes), consumable state churn is dropped from the HomeData poller, the per-device 1-second status tick is skipped for B01 robots (the dedicated loop owns their cadence), room refreshes run in the background when a persisted cache exists (faster boot), and unused water tables plus a dead variable are removed.
|
|
41
|
+
- Full suite: 209 passing.
|
|
42
|
+
|
|
43
|
+
## 2.0.0-matter.7 (Matter-only edition, unofficial)
|
|
44
|
+
|
|
45
|
+
Deep interval-lifecycle surgery — the actual root cause behind frozen battery/status readings:
|
|
46
|
+
|
|
47
|
+
- **Found and fixed an upstream architectural bug: the per-device interval properties held STARTER FUNCTIONS, not interval handles.** Every `clearInterval(vacuum.getStatusIntervall)` call was a silent no-op, and the "restart when missing" check (`!vacuum.mainUpdateInterval`) could never fire because a function is always truthy. Consequence: whichever flow stopped polling first (offline flap, reconnect, shutdown-restart races) killed it permanently, and every supervision layer — including matter.6's — faithfully called a restart mechanism that was structurally incapable of restarting anything. The starters now store real handles (self-clearing on restart), offline clears the handles and nulls the properties, and coming back online genuinely restarts both intervals. This benefits classic robots too.
|
|
48
|
+
- **B01/Q7 robots get a dedicated, self-managed status loop** completely independent of the v1 per-device machinery: one adapter-level interval ticks every 15 seconds and refreshes every initialized B01 robot (the attempt throttle keeps the effective cloud cadence at ~45s). It is cleared properly on shutdown and revived by the HomeData supervisor within 3 minutes if anything ever kills it. A Q7 battery reading can now be at most about a minute old whenever the cloud answers.
|
|
49
|
+
- Four new lifecycle tests, including the historically impossible restart branch and a full kill-and-revive cycle of the B01 loop. Full suite: 208 passing.
|
|
50
|
+
|
|
51
|
+
## 2.0.0-matter.6 (Matter-only edition, unofficial)
|
|
52
|
+
|
|
53
|
+
Room cleaning fix plus a status self-healing package, both driven by field logs:
|
|
54
|
+
|
|
55
|
+
- **Fixed Q7 room cleaning aborting with "Method load_multi_map is not supported".** The Matter room-clean flow compares the area's map id with the device's current map id and switches maps on mismatch. For B01 robots the current-map lookup returned null (v1 structure), so every room command attempted a map switch that has no Q7 equivalent — and aborted before the segment command was ever sent. B01 rooms are always fetched from the robot's current map (the `cur` flag), so the current map id now reports the canonical 0 and no switch is attempted. Full-home cleaning was unaffected; per-room cleaning now sends `service.set_room_clean` with the selected room ids directly.
|
|
56
|
+
- **Fixed stale battery/status freezing (Home app showing an hours-old percentage):**
|
|
57
|
+
- B01 status refreshes now throttle on attempts, not successes — a robot or cloud that stops answering no longer turns the poll tick into a per-second retry storm that can perpetuate rate limiting.
|
|
58
|
+
- Consecutive failures are counted: every 10th logs a warning with the last error, and recovery logs an info line, so silent outages become visible.
|
|
59
|
+
- The HomeData poller now supervises B01 device intervals: an online flap used to kill Q7 status polling permanently (the v1 restart path never runs for B01); intervals now restart automatically when the robot is back online.
|
|
60
|
+
- Live status values older than 15 minutes fall back to the periodically refreshed HomeData snapshot (which translates Q7-native codes), so the Matter tile self-heals even if the request path is down.
|
|
61
|
+
- Note: Q7 room names are refreshed from the map at most every 6 hours; after renaming rooms in the Roborock app, restart the Roborock bridge to pick the new names up immediately.
|
|
62
|
+
- Nine new tests (attempt throttling, failure escalation and recovery, staleness fallback, interval supervision, canonical B01 map id, and a no-map-switch room-clean regression). Full suite: 204 passing.
|
|
63
|
+
|
|
64
|
+
## 2.0.0-matter.5 (Matter-only edition, unofficial)
|
|
65
|
+
|
|
66
|
+
- **Fixed the Apple Home tile showing "Ready" instead of "Charging" on Q7 robots.** Root cause: when the Matter layer falls back to the cloud HomeData snapshot (cold start, or before the first live refresh), Q7 devices store their NATIVE work-status codes there — charging is 4, which reads as the v1 "remote control" state and never maps to the Charging tile. The fallback now translates Q7 codes to v1 states for B01 robots, and the live status mapping additionally carries `charge_status` (charging and dock air-drying) so the PowerSource cluster and the Charging/Docked threshold logic see the charger in every path. Verified by three new tests including an end-to-end accessory publish asserting Matter operational state 65 (Charging) for a charging Q7 at 74% with the 90% threshold.
|
|
67
|
+
|
|
68
|
+
## 2.0.0-matter.4 (Matter-only edition, unofficial)
|
|
69
|
+
|
|
70
|
+
- Removed the "Enable Matter vacuum" option from the settings UI, config schema, and code. In a Matter-only plugin the toggle was meaningless (off would mean the plugin does nothing). Matter publication is now unconditional; availability depends solely on the Homebridge Matter API. Legacy configs still carrying `"enableMatter": false` are ignored with a friendly one-line note in the log. The Matter feature toggles (Service Area, Power Source, Clean Mode, Charging/Docked status, threshold) are unchanged.
|
|
71
|
+
|
|
72
|
+
## 2.0.0-matter.4 (Matter-only edition, unofficial)
|
|
73
|
+
|
|
74
|
+
The two missing Q7 pieces, built against the python-roborock reference:
|
|
75
|
+
|
|
76
|
+
- **Mop/Vacuum mode switching for Q7.** The Matter clean-mode selection (Vacuum / Mop / Vacuum + Mop) now maps to the Q7 native `mode` property via `prop.set` — including the crossed enum values (Matter Mop=1 is Q7 mode 2; Matter combo=2 is Q7 mode 1). The v1-era "fan power off" workaround for mop-only is never sent to Q7 robots; suction levels still apply through the wind mapping. Water remains fully unexposed (manual tank).
|
|
77
|
+
- **Room selection (Matter Service Area) for Q7.** Implemented the B01 map channel end to end: `service.get_map_list` -> current map id (`cur` flag) -> `service.upload_by_mapid` -> protocol-301 payload -> base64 + AES-128-ECB (key derived from serial+model exactly as the reference) + zlib inflate -> minimal SCMap protobuf reader extracting room ids and names. Rooms are cached, persisted across restarts, refreshed at most every 6 hours, and fed to the Matter Service Area cluster in the standard shape — so per-room cleaning uses the same `service.set_room_clean` room ids the robot expects.
|
|
78
|
+
- Verified against a wire fixture generated with the reference implementation's own protobuf gencode and crypto: map-key derivation matches character for character, and the full decode chain reproduces the reference rooms (including UTF-8 names). Full suite: 195 passing.
|
|
79
|
+
- Note: robots already paired before rooms were available must be removed from Apple Home and re-paired once for the Service Area cluster to appear (Matter locks the cluster set at commissioning).
|
|
80
|
+
|
|
81
|
+
## 2.0.0-matter.3 (Matter-only edition, unofficial)
|
|
82
|
+
|
|
83
|
+
Deep Q7/B01 hardening pass:
|
|
84
|
+
|
|
85
|
+
- **Fixed a serious polling bug: B01 status refreshes bypassed the v1 throttle**, turning the 1-second poll tick into roughly one cloud request per second per Q7 robot. B01 refreshes are now throttled (periodic at most every 45s, forced/post-command at most every 1.5s) with concurrent callers sharing a single in-flight request. Robot-initiated pushes trigger a forced refresh so Matter still converges within seconds of real changes.
|
|
86
|
+
- **Q7 water is neither queried nor exposed.** Q7-series robots use a manually filled water tank with no electronic water control, so the `water` property is no longer polled, water state is never mapped, water-control commands are rejected, and — most importantly — Matter clean-mode capabilities for B01 robots are now pinned to vacuum-only (`canMop: false`) regardless of what the generic cloud schema claims. No mop modes ever appear in Apple Home for Q7 robots.
|
|
87
|
+
- **Fixed Matter room cleaning for Q7**: the adapter translated `app_segment_clean`, but the API layer's actual wire method is `app_segment_clean_by_ids` with a `{segments, repeat}` object. Both names now translate to `service.set_room_clean` with the correct room ids (ready for when the B01 map channel lands).
|
|
88
|
+
- **B01 robots are marked remote at creation**, so the transport layer never attempts local TCP connections to them (they are cloud/MQTT-only by design).
|
|
89
|
+
- **Fixed a request-id wraparound collision** affecting all protocols: the id generator handed out 0 twice in a row every 10,000 requests, colliding two pending requests.
|
|
90
|
+
- Six new tests: throttle cadence and forced-gap behavior, in-flight deduplication, B01 capability pinning against a mop-advertising schema, the segment wire-method translation, water exclusion, and wraparound id uniqueness. Full suite: 186 passing.
|
|
91
|
+
|
|
92
|
+
## 2.0.0-matter.2 (Matter-only edition, unofficial)
|
|
93
|
+
|
|
94
|
+
Fixes from the first field test of B01/Q7 support:
|
|
95
|
+
|
|
96
|
+
- **Fixed Apple Home commissioning failure for room-less robots.** The Service Area cluster was published with an empty supportedAreas list for robots without room data (all B01/Q7 robots until the map channel lands), which violates Matter conformance and makes Apple Home abort pairing. The cluster is now omitted entirely when no rooms are available; robots with rooms (classic models) are unchanged. Covered by tests for both cases.
|
|
97
|
+
- **Fixed a TypeError in the Service Area room refresh on B01 devices** ("Cannot read properties of undefined (reading 'map_status')"): the classic get_room_mapping flow reads a v1-shaped status array, but B01 status responses are Q7 dictionaries. The room refresh is now skipped for B01 robots (their room data requires the protobuf map channel), and the map_status read is defensively guarded regardless.
|
|
98
|
+
- **B01-unsupported methods now log at debug level** instead of red errors. get_timer, get_carpet_clean_mode, and similar feature probes simply have no Q7 equivalent yet; startup logs stay calm.
|
|
99
|
+
|
|
100
|
+
## 2.0.0-matter.1 (Matter-only edition, unofficial)
|
|
101
|
+
|
|
102
|
+
**Breaking: HomeKit (HAP) accessories removed.** The plugin now publishes each robot exclusively as a native Matter vacuum for Apple Home. On first start, all legacy HomeKit accessories (the fan tile and helper switches, including scene and schedule switches) are unregistered automatically, so every robot appears exactly once. This removes ~1,500 lines of accessory code, the scene/schedule polling loops, and the consumables/clean-summary refreshers — fewer moving parts, less MQTT traffic, fewer failure modes.
|
|
103
|
+
|
|
104
|
+
**New: B01/Q7-series protocol support (Q7 M5 `roborock.vacuum.sc05`, Q7 M5+ `ss07`, ...).** These 2025 robots speak a different RPC dialect; the plugin previously sent classic v1 methods they ignore, and dropped their responses (correlated by `msgId`, not `id`) — hence the endless command timeouts. Implemented against the actively maintained python-roborock reference and its recorded protocol fixtures:
|
|
105
|
+
|
|
106
|
+
- A translation layer (`b01Q7Adapter`) maps the plugin's v1 command surface to the Q7 dialect: start/stop/pause via `service.set_room_clean`, dock via `service.start_recharge`, locate via `service.find_device`, segment cleaning with Q7 room ids, fan power and water level via `prop.set`, and status via `prop.get` — with Q7 work states, battery, faults, and modes mapped back to the universal v1 fields the Matter layer already understands (including the Charging/Docked tile logic).
|
|
107
|
+
- Correct B01 request payloads (single object on dps 10000 with `method`/`msgId`/`params`; no `t`, no numeric `id`) and response correlation by the 12-digit `msgId` on dps 10001, with `code != 0` surfaced as command errors. Robot-initiated B01 pushes trigger an immediate status refresh.
|
|
108
|
+
- B01 devices are routed cloud/MQTT-only, and periodic v1 reads with no Q7 equivalent (network info, consumables, server timers, room mapping) return quiet neutral responses — ending the `get_network_info` timeout noise permanently.
|
|
109
|
+
- Known limitation: Matter Service Area (room selection) is not yet available for Q7-series robots; it requires the B01 protobuf map channel and will follow. Classic robots are unaffected.
|
|
110
|
+
- 20 new tests, including byte-level encryption round-trips and correlation against a real recorded Q7 response fixture. Full suite: 175 passing.
|
|
111
|
+
|
|
112
|
+
## 1.4.67-hardened.6 (unofficial hardening build)
|
|
113
|
+
|
|
114
|
+
- Redesigned the plugin settings UI as a light, readable theme: white panels on a soft neutral background, a calm teal accent, and dark headings/text. All key color pairs verified at WCAG AA contrast (headings 16-17:1, muted text and pills 5+:1).
|
|
115
|
+
- Headings now use explicit colors instead of inheritance. Homebridge UI injects its own theme stylesheet into custom-UI iframes, which could previously render section headings nearly invisible depending on the selected Homebridge theme.
|
|
116
|
+
- Fixed the Devices section layout: the list container borrowed the pairing-list grid class, misaligning checkbox rows. Devices now have their own styled rows with hover states and a "Disabled" chip on skipped robots.
|
|
117
|
+
- Accessibility and polish: keyboard focus rings on buttons/inputs/links, input focus glow, accent-colored checkboxes, toast notifications with colored edge indicators, and consistent button hover/active states.
|
|
118
|
+
|
|
119
|
+
## 1.4.67-hardened.5 (unofficial hardening build)
|
|
120
|
+
|
|
121
|
+
- Fixed Matter pairing entries never matching their robots: the commissioning serial (the robot's SN for vacuum nodes) was looked up in a DUID-keyed map, so every node fell back to the generic "Matter Roborock Bridge" label. Devices are now indexed by both DUID and serial, so vacuum pairing cards show the robot's name.
|
|
122
|
+
- Pairing records belonging to disabled (skipped) robots are now hidden behind a one-line note with a "Show anyway" toggle. These records are inert leftovers in Homebridge's Matter storage from when the robots were managed; the accessories themselves are no longer registered. The list updates live when robots are enabled/disabled in the Devices section.
|
|
123
|
+
- The platform now logs each stale Matter accessory it unregisters ("Unregistering stale Matter accessory ..."), making skip-list cleanup visible in the Homebridge log.
|
|
124
|
+
- Polished the Devices section row layout (alignment/spacing) introduced in hardened.3.
|
|
125
|
+
|
|
126
|
+
## 1.4.67-hardened.4 (unofficial hardening build)
|
|
127
|
+
|
|
128
|
+
- The Charging/Docked tile opt-in now uses the battery percentage as the discriminator between the two states, with a configurable "Charged Battery Threshold (%)" (default 100). While docked below the threshold the Apple Home tile shows Charging — even if the robot already claims fully charged — and at or above it the tile shows Docked, even if the robot still reports a charging flag. Worn batteries commonly report "fully charged" early; lowering the threshold (e.g. 90) keeps the tile honest. Falls back to the state-based value when no battery reading is available. Exposed in both the config schema and the settings UI; covered by four new tests.
|
|
129
|
+
|
|
130
|
+
## 1.4.67-hardened.3 (unofficial hardening build)
|
|
131
|
+
|
|
132
|
+
- Fixed skip-list enforcement: `skipDevices` was only applied to the login-time runtime list, so skipped robots still had HomeKit and Matter accessories published for them with no runtime behind them. The skip list is now enforced at the source (`getAllHomeDevices`), covering discovery, Matter publication, read paths, and local-key refresh consistently; existing accessories for skipped robots are unregistered by the stale-accessory cleanup on the next bridge restart. Covered by a regression test matching both DUID and serial number.
|
|
133
|
+
- Added a Devices section to the plugin settings UI listing every robot from cached HomeData (name, model, DUID, serial, online state) with a per-robot checkbox. Unchecking a robot writes it to Skip Devices and saves automatically; skipped robots stay visible so they can be re-enabled. The section is fed by the existing diagnostics endpoint, so it works even for robots the plugin no longer manages.
|
|
134
|
+
- Exposed the "Show Charging/Docked on the Apple Home tile" option in the settings UI (previously only reachable through the JSON config editor, since the custom UI replaces the schema-generated form).
|
|
135
|
+
- Performance: `getStoredHomeData` now memoizes the parsed HomeData per distinct payload. Previously every Matter attribute read and cluster build re-parsed the full multi-kilobyte HomeData JSON; steady-state CPU/GC pressure drops accordingly. The ignored-device set is also cached per config identity (including a fix for a fresh-array fallback that defeated identity comparison).
|
|
136
|
+
- Regression suite extended to 19 tests, including parse-memoization reference stability and source-level skip enforcement.
|
|
137
|
+
|
|
138
|
+
## 1.4.67-hardened.2 (unofficial hardening build)
|
|
139
|
+
|
|
140
|
+
- Added an opt-in "Enable Matter Charging/Docked Status" setting. When enabled, the plugin publishes the standard RVC Charging (0x41) and Docked (0x42) operational states — and advertises them in the operational state list for Matter conformance — so the Apple Home tile shows "Charging"/"Docked" instead of always "Ready" while on the dock. Default remains off, preserving the upstream Ready-on-dock behavior for older iOS versions. Covered by three new conformance tests (charging, fully-charged/docked, and default-off).
|
|
141
|
+
|
|
142
|
+
## 1.4.67-hardened.1 (unofficial hardening build)
|
|
143
|
+
|
|
144
|
+
All robustness changes from the 1.4.64-hardened.1 build, re-ported onto upstream 1.4.66 (none had been independently fixed upstream), plus two new fixes:
|
|
145
|
+
|
|
146
|
+
- `catchError` no longer renders "Failed to execute undefined on robot undefined (unknown model)" when a caller only passes a message; the message is logged as-is. Contextual calls keep the existing format.
|
|
147
|
+
- The unmapped-model notice (e.g. `roborock.vacuum.sc05` / Q7 M5) is now an informative warning explaining that generic defaults are applied and that core controls and Matter still work, instead of a scary "not fully supported / contact the dev" error with broken formatting.
|
|
148
|
+
- The Matter device-not-ready classifier now also recognizes the upstream "Vacuum <duid> is not initialized." phrasing used by the new schedule endpoints, so those failures log calmly during startup races too.
|
|
149
|
+
|
|
150
|
+
Re-ported hardening (see 1.4.64-hardened.1 notes for details): startup-race command guards with rollback, no silent success on unbuildable messages, self-healing 60s Matter heartbeat, throw-proof status reads, extended endpoint-init backoff (1s–60s), dispose() lifecycle on shutdown/unregister, unref'ed timers, clean-mode capability fallback, and lazy HomeData debug serialization. Regression suite extended to 13 tests covering all of the above.
|
|
151
|
+
|
|
152
|
+
## 1.4.66
|
|
153
|
+
|
|
154
|
+
- Exposed each Roborock app schedule as a persistent HomeKit switch, with live enable/disable state backed by `get_server_timer` and `upd_server_timer`. Addresses issue #6.
|
|
155
|
+
- Added Matter Service Area current-room reporting for active room cleaning, including resets that prevent stale room status during whole-home, spot, or zone cleaning. Addresses issue #7.
|
|
156
|
+
|
|
157
|
+
## 1.4.65
|
|
158
|
+
|
|
159
|
+
- Internal cleanup pass across the whole codebase: removed duplicated logic (shared crypto helpers, shared live-message parsing, consolidated device-model tables), deleted dead code, and simplified several hot paths (parallelized independent requests, reduced redundant JSON parsing/buffer reads) with no intended behavior changes. Verified against a live Roborock S6 Pure over Matter (start, pause, dock).
|
|
160
|
+
- Fixed a display bug in the Homebridge UI's Matter pairing card where a real pairing/setup code could be mistaken for "not available" if it happened to match the literal placeholder text used for missing codes.
|
|
161
|
+
- Fixed plugin config local test failing after first successful run within the same config session. The TCP socket probe was not properly managing socket lifecycle, which could cause resource exhaustion on subsequent test runs. Added `socket.unref()` to prevent sockets from keeping the Node process alive and improved error handling during socket cleanup. Addresses issue #13.
|
|
162
|
+
|
|
163
|
+
## 1.4.63
|
|
164
|
+
|
|
165
|
+
- Matter Pause and Return to Dock are now always forwarded to the robot instead of being dropped when the plugin's cached state looks idle. The cache can lag or be overridden by a stale HomeData refresh while the robot is really cleaning, which previously made the plugin silently reject real pause/dock commands as "not cleaning" / "already docked" (seen on a Roborock S7 `roborock.vacuum.a15` that was room-cleaning while HomeData reported it as charging). A redundant pause/dock on an already-docked robot is a harmless no-op. Addresses issue #12.
|
|
166
|
+
- Fixed the Matter Cleaning tile collapsing back to Docked/Ready in Apple Home almost immediately after Start on models that sync slowly through the cloud (e.g. S8 / `roborock.vacuum.a51`). The optimistic Cleaning state is now held through the lagging "still docked/charging" reports during the recent-command window after a Start/Resume/area-clean, instead of being abandoned after two contradicting reports, so the tile stays on Cleaning — and Return to Dock stays available — until the robot actually reports Cleaning. It still falls back to the real state once that window passes, so a start the robot never acted on (e.g. a full bin) does not stay stuck on Cleaning. Follow-up to the 1.4.60 command-forwarding fix for issue #4.
|
|
167
|
+
|
|
168
|
+
## 1.4.62
|
|
169
|
+
|
|
170
|
+
- Added explicit package author metadata so npm identifies Joshua Appleman as the package author while keeping trusted GitHub Actions publishing intact.
|
|
171
|
+
|
|
172
|
+
## 1.4.61
|
|
173
|
+
|
|
174
|
+
- Kept Matter RVC state publishes as serialized full snapshots for all refresh paths, including live updates and Service Area selection changes, so Apple Home is not left depending on partial cluster writes after controller refreshes.
|
|
175
|
+
- Removed the plugin's explicit RVC Operational State `operationalError` write and added tests pinning the Matter RVC mode clusters without unsupported `startUpMode`/`onMode` attributes.
|
|
176
|
+
- Added rechargeable battery metadata to the optional Matter Power Source cluster, including nullable charging-current and time-to-full-charge values.
|
|
177
|
+
- Improved the Homebridge UI Matter Pairing lookup to search common Docker/Homebridge Matter storage paths and keep loading pairing data even when plugin config is unavailable.
|
|
178
|
+
- Updated Matter RVC `Updating...` documentation after the live Homebridge 2.1.1-beta reset/re-pair test rendered the full RVC endpoint correctly in Apple Home.
|
|
179
|
+
|
|
180
|
+
## 1.4.60
|
|
181
|
+
|
|
182
|
+
- Fixed Matter Pause and Return to Dock being silently dropped on models that sync slowly (e.g. Roborock S8 / `roborock.vacuum.a51`, which fall back to the cloud). After a Matter Start, these robots can keep reporting "docked/charging" for tens of seconds before they report "Cleaning"; during that lag the plugin's cached state was stale, so a follow-up pause/dock was rejected as "not cleaning" / "already docked." An explicit Matter pause/dock issued within 60s of a start/resume/area-clean is now forwarded to the robot even when the cached snapshot still reads docked (a redundant pause/dock on an already-docked robot is a harmless no-op). The Pause control also gained the same in-flight-command allowance that Return to Dock already had. Addresses issue #4.
|
|
183
|
+
|
|
184
|
+
## 1.4.59
|
|
185
|
+
|
|
186
|
+
- Made the HomeKit Pause Cleaning and Return to Dock switches wait for Roborock acknowledgement and log command timing, matching the fan Start/Stop path. Previously these were fire-and-forget, so a pause/dock that the robot did not acknowledge (e.g. once it is already cleaning) failed silently with no log; they now surface the acknowledgement time or a clear timeout/error to aid diagnosis.
|
|
187
|
+
|
|
188
|
+
## 1.4.58
|
|
189
|
+
|
|
190
|
+
- Fixed the root cause of Apple Home getting stuck on "Updating..." until Play Sound to Locate was pressed: Matter publishes are now serialized full snapshots with no plugin-side change tracking, so racing state updates can no longer leave the Matter store holding a stale value that the plugin refused to re-send. Verified at the Matter protocol level against a live Homebridge 2.1.1-beta container.
|
|
191
|
+
- Restored spec-conformant RVC Operational State phase attributes (`phaseList`/`currentPhase` are null again) and removed the synthetic identify pulses and phase flapping that were broadcast to every Apple Home hub as refresh signals. The nulls are written on every publish so upgraded installs repair their Matter store without re-pairing.
|
|
192
|
+
- Replaced the 5-second active-state heartbeat with a quiet 60-second full-snapshot safety net; matter.js suppresses unchanged writes, so steady-state Matter traffic drops to normal keep-alives.
|
|
193
|
+
- Kept Play Sound to Locate (Identify) working as a manual full-state resync, and added regression tests pinning publish serialization, null phase attributes, full-snapshot republishes, and the no-synthetic-identify rule.
|
|
194
|
+
|
|
195
|
+
## 1.4.57
|
|
196
|
+
|
|
197
|
+
- Hardened Roborock MQTT protocol 300/301 parsing so short cloud payloads are skipped cleanly instead of throwing `RangeError` during inbound message handling.
|
|
198
|
+
- Made legacy HomeKit fan Start/Stop commands wait for Roborock acknowledgement and log command timing, improving diagnostics for models where switches appear to do nothing.
|
|
199
|
+
- Propagated Matter command errors/timeouts reliably and added one bounded Matter Return to Dock retry when Roborock still reports active cleaning after an ambiguous `app_charge` timeout.
|
|
200
|
+
|
|
201
|
+
## 1.4.56
|
|
202
|
+
|
|
203
|
+
- Hardened Roborock live cloud/local status routing so device-scoped updates are delivered only to the matching vacuum, and unscoped live arrays are ignored when multiple vacuums are configured.
|
|
204
|
+
- Added normal Homebridge log entries when the legacy HomeKit fan accessory receives Start/Stop writes, making it easier to tell whether a failed command reached the plugin.
|
|
205
|
+
- Added regression coverage for multi-vacuum live-message routing and unscoped live payload handling.
|
|
206
|
+
|
|
207
|
+
## 1.4.55
|
|
208
|
+
|
|
209
|
+
- Kept Matter optimistic state after Roborock cloud or local command acknowledgement timeouts and started an immediate fast follow-up refresh cadence so Apple Home can converge once live `get_status` catches up.
|
|
210
|
+
- Allowed Matter Return to Dock to send `app_charge` after a recently timed-out Start even when the cached Roborock snapshot still says docked or charging.
|
|
211
|
+
- Added regression coverage for timed-out Matter commands, fast status refreshes, and stale docked snapshots during follow-up dock requests.
|
|
212
|
+
|
|
213
|
+
## 1.4.54
|
|
214
|
+
|
|
215
|
+
- Bounded Matter clean-mode preparation so slow Roborock cloud acknowledgements for fan or mop settings no longer delay the actual Start command for 30-40 seconds.
|
|
216
|
+
- Limited Matter clean-mode prep commands to a short request timeout and kept Start moving with optimistic state when prep is slow or ambiguous.
|
|
217
|
+
- Stopped trying alternate Roborock water-mode commands after timeout errors, while still falling back for unsupported or unknown command responses.
|
|
218
|
+
|
|
219
|
+
## 1.4.53
|
|
220
|
+
|
|
221
|
+
- Improved Matter state reads so Apple Home can receive cached/live vacuum state quickly while the plugin refreshes Roborock in the background, reducing long `Updating...` stalls after reopening Home.
|
|
222
|
+
- Added a Matter Pairing section to the Config UI that reads Homebridge commissioning data and shows the Roborock child/daughter bridge QR code plus each vacuum's 11-digit setup code after restart.
|
|
223
|
+
- Improved the Config UI local connection test to recognize an already-active or recently-used local Roborock connection and show the source of the diagnostic result.
|
|
224
|
+
- Moved debug logging and Roborock cloud fallback toggles into an Advanced troubleshooting section so the normal setup flow stays focused on account, Matter, and pairing.
|
|
225
|
+
- Quieted repeated `get_status` warnings for known Roborock status fields when Homebridge has not created a matching diagnostic state object, while keeping warnings for genuinely new fields.
|
|
226
|
+
|
|
227
|
+
## 1.4.52
|
|
228
|
+
|
|
229
|
+
- Delayed and retried Matter state refreshes while Homebridge reports a freshly registered endpoint is still initializing, reducing startup AccessControl warnings after bridge or child-bridge restarts.
|
|
230
|
+
- Added compact Roborock status diagnostics to copied Config UI reports, including recent `get_status` and live cloud/local payloads for troubleshooting incorrect current-state or room-status reports.
|
|
231
|
+
- Captured compact `get_server_timer` and `get_timer` responses while debug logging is enabled so schedule-switch feature requests can be investigated without exposing credentials.
|
|
232
|
+
|
|
233
|
+
## 1.4.51
|
|
234
|
+
|
|
235
|
+
- Scoped live Roborock cloud/local status updates to the source vacuum so one robot's push messages no longer update every configured HomeKit or Matter vacuum.
|
|
236
|
+
- Kept Matter optimistic state after Roborock command acknowledgement timeouts, avoiding stale Idle/Charging rollbacks when the robot accepted the command but the cloud acknowledgement arrived late or not at all.
|
|
237
|
+
- Made the Config UI local connection test recover from stalled requests and skip LAN probing when **Use Roborock cloud only** is enabled.
|
|
238
|
+
|
|
239
|
+
## 1.4.50
|
|
240
|
+
|
|
241
|
+
- Fixed the Node current CI test failure by isolating Matter timer cleanup in tests and adding a safe timer fallback for deferred Matter state updates when the test runtime removes the global timer.
|
|
242
|
+
|
|
243
|
+
## 1.4.49
|
|
244
|
+
|
|
245
|
+
- Added **Use Roborock cloud only** to disable local LAN discovery and local TCP commands for installations where local sockets appear connected but repeatedly time out; commands and status polling now route through Roborock cloud when available.
|
|
246
|
+
- Updated diagnostics and copied reports to show cloud-only mode clearly instead of stale local connection state.
|
|
247
|
+
- Graduated Matter Service Area room selection from a separate beta checkbox so it is included automatically whenever the Matter vacuum is enabled.
|
|
248
|
+
|
|
249
|
+
## 1.4.48
|
|
250
|
+
|
|
251
|
+
- Applied **Prefer Roborock cloud for Matter commands** to Matter follow-up status refreshes as well as commands, so S8-style local status timeouts do not leave Apple Home stuck on Cleaning after the robot returns to dock.
|
|
252
|
+
- Passed the Matter cloud preference through the Roborock status polling stack down to the underlying `get_prop/get_status` request.
|
|
253
|
+
|
|
254
|
+
## 1.4.47
|
|
255
|
+
|
|
256
|
+
- Kept the Matter vacuum run mode active while Roborock is returning to dock, avoiding an inconsistent Idle/Returning state combination that could make Apple Home show "No Response" during the charging transition.
|
|
257
|
+
|
|
258
|
+
## 1.4.46
|
|
259
|
+
|
|
260
|
+
- Preferred Roborock cloud acknowledgements for Matter saved-map switches before selected-area cleaning, avoiding local `load_multi_map` acknowledgement timeouts that could leave Apple Home stuck on "Updating...".
|
|
261
|
+
- Continued Matter selected-area cleaning when Roborock has already switched to the requested saved map even if the map-load acknowledgement reports a timeout.
|
|
262
|
+
|
|
263
|
+
## 1.4.45
|
|
264
|
+
|
|
265
|
+
- Added an optional **Prefer Roborock cloud for Matter commands** setting so Matter vacuum commands can bypass local LAN command timeouts on models such as the S8 while leaving the existing HomeKit accessories on their normal transport path.
|
|
266
|
+
- Forced short follow-up status refreshes after Matter commands are acknowledged so Apple Home can move out of optimistic states such as Returning once Roborock reports the real charging/docked status.
|
|
267
|
+
- Ignored empty Roborock cloud push results so `CloudMessage data: undefined` packets no longer get forwarded as accessory updates.
|
|
268
|
+
|
|
269
|
+
## 1.4.44
|
|
270
|
+
|
|
271
|
+
- Treated unsupported Roborock clean-mode setting responses such as `unknown_method` as best-effort during Matter starts, so models that reject water-box commands can still continue to the actual start command and remember the unsupported setting path.
|
|
272
|
+
|
|
273
|
+
## 1.4.43
|
|
274
|
+
|
|
275
|
+
- Cleared stale remote-fallback markers when a vacuum reconnects over local TCP, so polling can return to local transport instead of staying pinned to Roborock cloud after a temporary connect failure.
|
|
276
|
+
|
|
277
|
+
## 1.4.42
|
|
278
|
+
|
|
279
|
+
- Fixed Apple Home getting stuck on "Connecting" when commissioning the Matter vacuum by reverting the operational state list to bare state IDs without labels. The manufacturer-range operational states with labels introduced in 1.4.40 were not tolerated by Apple Home during commissioning; this restores the known-good advertisement that paired successfully.
|
|
280
|
+
|
|
281
|
+
## 1.4.41
|
|
282
|
+
|
|
283
|
+
- Built the Matter cluster snapshot from the freshest live Roborock status (state, battery, charge) instead of the slower periodic HomeData snapshot, so registration snapshots and Apple Home attribute reads reflect changes sooner.
|
|
284
|
+
- Allowed slow saved-map switches (`load_multi_map`) up to 30 seconds before timing out, because older models such as the S6 Pure can take longer than the default 10 seconds to switch maps, and kept transient timeout warnings classified correctly regardless of the configured duration.
|
|
285
|
+
- Internal hardening with no behavior change: introduced a typed Roborock API surface for the Matter accessory and consolidated duplicated Matter name normalization to reduce drift.
|
|
286
|
+
|
|
287
|
+
## 1.4.40
|
|
288
|
+
|
|
289
|
+
- Restored the original Roborock map after Matter Service Area room refreshes, even when another saved-map load times out, and retried empty saved maps periodically so newly segmented rooms can appear without restarting Homebridge.
|
|
290
|
+
- Hardened Matter RVC conformance by using standard Vacuum and Mop clean-mode tags for Vacuum + Mop, moving Roborock-specific operational states into the labeled manufacturer range, and returning INVALID_SET for multi-map room selections.
|
|
291
|
+
- Cleared optimistic Matter state after repeated contradicting Roborock updates so Apple Home does not stay on a wrong state until the timeout when a command is acknowledged but has no effect.
|
|
292
|
+
- Built only the requested Matter cluster for single-attribute reads and mirrored the Roborock name onto the accessory `name` to reduce generic "Matter Accessory" labels during pairing.
|
|
293
|
+
|
|
294
|
+
## 1.4.38
|
|
295
|
+
|
|
296
|
+
- Ensured every Matter Service Area room advertises a matching saved-map entry, using Roborock map names when available and a generated label otherwise, so Apple Home no longer risks getting stuck on Updating when a room references a map without a reported name.
|
|
297
|
+
- Cached persisted Roborock state (HomeData, room mappings, transport diagnostics) in memory after the first read to cut repeated disk reads on every status lookup and command while preserving the on-disk file format and legacy migration.
|
|
298
|
+
- Removed an unreachable internal command branch and a duplicate status helper, and ignored local tooling files during lint.
|
|
299
|
+
|
|
300
|
+
## 1.4.37
|
|
301
|
+
|
|
302
|
+
- Kept unresolved Roborock maps out of Matter Service Area metadata until they have matching room segment IDs, avoiding Apple Home getting stuck on Updating with incomplete map data.
|
|
303
|
+
- Avoided reloading the Roborock map that is already active while refreshing Matter room mappings, preventing startup timeouts on models that reject that reload.
|
|
304
|
+
|
|
305
|
+
## 1.4.36
|
|
306
|
+
|
|
307
|
+
- Reloaded saved Roborock maps during Matter Service Area refresh even when Roborock reports the map is already active, giving multi-floor rooms another chance to expose segment IDs.
|
|
308
|
+
- Published saved Matter Service Area map names as soon as Roborock reports them, even while rooms for a map are still being resolved.
|
|
309
|
+
- Documented Matter pairing-name behavior and why Apple Home may ask to add the external vacuum accessory after the bridge is commissioned.
|
|
310
|
+
|
|
311
|
+
## 1.4.35
|
|
312
|
+
|
|
313
|
+
- Added capability-gated Matter clean modes for Vacuum, Mop, and Vacuum + Mop on Roborock models that report mop or water support.
|
|
314
|
+
- Applied selected Matter clean modes before Matter start/resume commands by updating Roborock suction and water settings where the model exposes those controls.
|
|
315
|
+
- Refreshed Matter Service Area room mappings across saved Roborock maps while idle, then restored the original map so multi-floor room lists can populate automatically.
|
|
316
|
+
- Applied cached Roborock identity metadata earlier for restored Matter accessories so re-pairing is less likely to show a generic Matter Accessory name.
|
|
317
|
+
|
|
318
|
+
## 1.4.34
|
|
319
|
+
|
|
320
|
+
- Prefixed Matter Service Area room labels with the Roborock map name when multiple saved maps are available, so controllers that flatten maps still show floor context.
|
|
321
|
+
- Documented the map-name label fallback for Apple Home and other Matter clients that do not expose a separate map picker yet.
|
|
322
|
+
|
|
323
|
+
## 1.4.33
|
|
324
|
+
|
|
325
|
+
- Added multi-map Matter Service Area metadata so supported clients can group rooms by saved Roborock maps.
|
|
326
|
+
- Cached room mappings per Roborock map and preserved saved map names for upper/lower floor setups.
|
|
327
|
+
- Loaded the selected Roborock map before starting Matter room cleaning when a selected area is on another map.
|
|
328
|
+
|
|
329
|
+
## 1.4.32
|
|
330
|
+
|
|
331
|
+
- Deferred Matter state pushes until after command handlers return to reduce HomeKit command timeouts.
|
|
332
|
+
- Added Matter Service Area map metadata and clearer Matter command/room-selection diagnostics.
|
|
333
|
+
- Documented re-pairing the Matter vacuum after changing the Service Area beta setting because controllers can cache the cluster list.
|
|
334
|
+
|
|
335
|
+
## 1.4.31
|
|
336
|
+
|
|
337
|
+
- Added an opt-in beta Matter Service Area path that exposes cached Roborock rooms to Matter clients and uses selected rooms for Matter-initiated cleaning.
|
|
338
|
+
- Documented the Service Area beta as work in progress and kept it behind a separate setting from the main experimental Matter vacuum.
|
|
339
|
+
|
|
340
|
+
## 1.4.30
|
|
341
|
+
|
|
342
|
+
- Moved local/cloud transport transition diagnostics behind debug logging to keep normal Homebridge logs quieter.
|
|
343
|
+
- Updated Matter vacuum commands to report the requested state immediately and log Roborock acknowledgment timing.
|
|
344
|
+
- Expanded Matter battery power-source state and linked the regular HomeKit battery service to the main accessory.
|
|
345
|
+
- Sanitized Roborock scene switch names so generated HomeKit names avoid unsupported characters.
|
|
346
|
+
|
|
347
|
+
## 1.4.29
|
|
348
|
+
|
|
349
|
+
- Kept Matter vacuum state optimistic after commands so Apple Home does not fall back to stale ready/idle status while Roborock reports the transition.
|
|
350
|
+
|
|
351
|
+
## 1.4.28
|
|
352
|
+
|
|
353
|
+
- Added a Matter RVC clean-mode cluster so Apple Home can complete the native vacuum accessory setup.
|
|
354
|
+
- Clarified Matter vacuum setup instructions for child bridge Matter enablement and log-based pairing codes.
|
|
355
|
+
|
|
356
|
+
## 1.4.27
|
|
357
|
+
|
|
358
|
+
- Removed the unsupported Matter run-mode startup attribute from experimental vacuum state updates.
|
|
359
|
+
|
|
360
|
+
## 1.4.26
|
|
361
|
+
|
|
362
|
+
- Fixed experimental Matter vacuum registration by omitting standard operational-state labels that Matter rejects during conformance validation.
|
|
363
|
+
|
|
364
|
+
## 1.4.25
|
|
365
|
+
|
|
366
|
+
- Added optional experimental Matter robotic vacuum exposure for Homebridge 2 with Matter enabled.
|
|
367
|
+
- Kept the existing HomeKit fan/switch accessory path active for backwards compatibility.
|
|
368
|
+
- Documented the Matter setting and Phase 1 command mapping in the README, roadmap, and admin UI.
|
|
369
|
+
|
|
370
|
+
## 1.4.24
|
|
371
|
+
|
|
372
|
+
- Changed transient timeout warning throttling to group repeated polling failures per vacuum instead of per command.
|
|
373
|
+
- Increased the default transient warning interval to 6 hours and added a configurable Homebridge/UI setting.
|
|
374
|
+
- Added support for setting the transient warning interval to 0 so recurring transient warnings only appear when debug logging is enabled.
|
|
375
|
+
|
|
376
|
+
## 1.4.23
|
|
377
|
+
|
|
378
|
+
- Throttled repeated transient command warnings so recurring Roborock polling timeouts are logged periodically instead of every refresh cycle.
|
|
379
|
+
|
|
380
|
+
## 1.4.22
|
|
381
|
+
|
|
382
|
+
- Added dedicated HomeKit momentary switches for Pause Cleaning and Return to Dock.
|
|
383
|
+
- Changed the main HomeKit off action to stop cleaning only instead of also sending a dock command.
|
|
384
|
+
- Clarified cloud-only transport logs so expected Roborock cloud calls are not described as fallback from local control.
|
|
385
|
+
|
|
386
|
+
## 1.4.21
|
|
387
|
+
|
|
388
|
+
- Added plain-English transport transition logs for local TCP connections, cloud fallback, local recovery, remote/shared devices, offline state, missing local credentials, and missing local IP discovery.
|
|
389
|
+
- Reduced duplicate fallback logging and stopped printing local keys in debug discovery logs.
|
|
390
|
+
|
|
391
|
+
## 1.4.20
|
|
392
|
+
|
|
393
|
+
- Added a "Test Local Connection" action in the admin UI that performs a live LAN TCP probe for each cached vacuum.
|
|
394
|
+
- Included local test results in copied diagnostic reports with DUIDs and local IPs still redacted.
|
|
395
|
+
|
|
396
|
+
## 1.4.19
|
|
397
|
+
|
|
398
|
+
- Added a short diagnostics auto-refresh after admin UI startup when the first snapshot is not locally connected.
|
|
399
|
+
- Added transport freshness timestamps to diagnostic cards and copied diagnostic reports.
|
|
400
|
+
|
|
401
|
+
## 1.4.18
|
|
402
|
+
|
|
403
|
+
- Updated the roadmap to reflect completed diagnostics, Homebridge compatibility, CI, release automation, and security work.
|
|
404
|
+
- Improved diagnostics wording so local credentials, local TCP connectivity, cloud fallback, and offline states are easier to understand.
|
|
405
|
+
- Added a redacted "Copy Diagnostic Report" action for future GitHub Issues.
|
|
406
|
+
- Added GitHub Issue templates for bug reports, feature requests, and model support reports.
|
|
407
|
+
|
|
408
|
+
## 1.4.17
|
|
409
|
+
|
|
410
|
+
- Maintenance release to verify the trusted publishing and GitHub release automation after the admin UI and diagnostics updates.
|
|
411
|
+
- No runtime behavior changes from `1.4.16`.
|
|
412
|
+
|
|
413
|
+
## 1.4.16
|
|
414
|
+
|
|
415
|
+
- Improved the Homebridge admin UI for readability with clearer section layout, status messaging, help text, and explicit settings save behavior.
|
|
416
|
+
- Documented all plugin settings in the Homebridge schema and README, including region selection, encrypted tokens, password fallback, debug logging, and skipped devices.
|
|
417
|
+
- Added serial numbers to UI diagnostics so ignored device values are easier to copy from the admin panel.
|
|
418
|
+
- Fixed `skipDevices` so Homebridge config values are passed into discovery and can match either Roborock serial numbers or DUIDs.
|
|
419
|
+
|
|
420
|
+
## 1.4.15
|
|
421
|
+
|
|
422
|
+
- Tightened obstacle photo handling in the map UI to accept only base64-encoded image data and render it through browser-generated blob URLs.
|
|
423
|
+
- Added blob URL cleanup when closing or replacing obstacle photos to avoid leaking browser-side object URLs.
|
|
424
|
+
|
|
425
|
+
## 1.4.14
|
|
426
|
+
|
|
427
|
+
- Hardened region detection by parsing the configured Roborock host instead of using substring matches.
|
|
428
|
+
- Sanitized map obstacle image URLs before assigning them in the browser UI to reduce XSS and client-side redirect risk.
|
|
429
|
+
- Added explicit read-only permissions to the CI workflow, upgraded GitHub Actions versions, and moved Codecov uploads to a repository secret.
|
|
430
|
+
|
|
431
|
+
## 1.4.13
|
|
432
|
+
|
|
433
|
+
- Adjusted `package.json` repository metadata to match the fork URL exactly for npm Trusted Publishing compatibility.
|
|
434
|
+
- Updated the npm publish workflow to use Node 24 and the latest npm CLI for Trusted Publishing compatibility.
|
|
435
|
+
|
|
436
|
+
## 1.4.12
|
|
437
|
+
|
|
438
|
+
- Improved model resolution and startup hardening for newer Roborock metadata layouts.
|
|
439
|
+
- Added diagnostics in the Homebridge UI for model detection, local key availability, discovery state, local IP, TCP connection state, and last transport used.
|
|
440
|
+
- Fixed updater payload crashes caused by malformed or partial cloud/local message payloads.
|
|
441
|
+
- Improved room mapping behavior with clearer logging and fallback labels when Roborock room names are missing.
|
|
442
|
+
- Replaced forced hourly MQTT reconnects with a health-check-based reconnect path.
|
|
443
|
+
- Added guards against transient `0%` battery reports while the robot is docked or charging to reduce false HomeKit low-battery alerts.
|
|
444
|
+
- Added regression tests around transport selection, room mapping, and model/diagnostics handling.
|
|
445
|
+
- Added incremental TypeScript-style checking for the core transport queue and a `typecheck` script for ongoing migration work.
|
|
446
|
+
- Added GitHub Actions automation for npm publishing on `master` using npm Trusted Publishing.
|
|
447
|
+
|
|
448
|
+
## 1.2.2
|
|
449
|
+
|
|
450
|
+
- **New Feature**: Dynamic Scene Switch Management
|
|
451
|
+
- Automatically create HomeKit switch buttons for each device's available scenes
|
|
452
|
+
- Scene switches named after scene names with momentary switch behavior
|
|
453
|
+
- Automatically add/remove corresponding switch buttons when scenes change
|
|
454
|
+
- Execute corresponding scenes when switches are pressed, with error handling and status feedback
|
|
455
|
+
- Synchronize scene switches when HomeData is updated
|
|
456
|
+
- **Improvement**: Refactored scene API methods, separated scene fetching and device filtering functionality
|
|
457
|
+
- **Fix**: Resolved recursive call issue in scene methods
|
|
458
|
+
|
|
459
|
+
## 1.0.15
|
|
460
|
+
|
|
461
|
+
- Fix Roborock Saros 10R Status issue
|
|
462
|
+
|
|
463
|
+
## 1.0.6
|
|
464
|
+
|
|
465
|
+
- Support new model
|
|
466
|
+
|
|
467
|
+
## 1.0.0
|
|
468
|
+
|
|
469
|
+
- First version.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2018-2019 Nico Hartung
|
|
4
|
+
Copyright (c) 2023-2025 Joshua Appleman (homebridge-roborock-vacuum2)
|
|
5
|
+
Copyright (c) 2026 Mathias Hornbek (homebridge-roborock-matter, Matter-only fork)
|
|
6
|
+
|
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
in the Software without restriction, including without limitation the rights
|
|
10
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
furnished to do so, subject to the following conditions:
|
|
13
|
+
|
|
14
|
+
The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
copies or substantial portions of the Software.
|
|
16
|
+
|
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# homebridge-roborock-matter
|
|
2
|
+
|
|
3
|
+
A **Matter-only** Homebridge plugin that publishes your Roborock robot vacuums — including the 2025 **B01/Q7-series** (`roborock.vacuum.sc05`, Q7 M5 / M5+) — as native **Matter** accessories for Apple Home.
|
|
4
|
+
|
|
5
|
+
> This is a fork of [`homebridge-roborock-vacuum2`](https://github.com/applemanj/homebridge-roborock-vacuum2) by Joshua Appleman, itself adapted from [ioBroker.roborock](https://github.com/copystring/ioBroker.roborock) by copystring. See [Attribution](#attribution) and [LICENSE](./LICENSE). All original copyright is preserved.
|
|
6
|
+
|
|
7
|
+
## What makes this fork different
|
|
8
|
+
|
|
9
|
+
- **Matter-only.** All HomeKit (HAP) accessories — the fan tile, helper switches, scene and schedule switches — have been removed. Each robot appears exactly once in Apple Home as a native Matter robot vacuum. Legacy HomeKit accessories are unregistered automatically on first start.
|
|
10
|
+
- **B01/Q7-series protocol support.** The 2025 Q-series robots speak a different RPC dialect that upstream does not implement. This fork adds a full B01 adapter — commands (start/stop/pause/dock/locate/segment cleaning), status, battery, charging state, mop/vacuum mode switching, and room selection via the encrypted B01 map channel — implemented against the [python-roborock](https://github.com/Python-roborock/python-roborock) reference and verified with fixture-driven tests.
|
|
11
|
+
- **Robustness hardening.** Startup guards, self-healing status polling with a dedicated B01 loop, per-cluster Matter publish isolation, interval-lifecycle fixes, and a light, accessible settings UI with per-device enable/disable.
|
|
12
|
+
|
|
13
|
+
## Requirements
|
|
14
|
+
|
|
15
|
+
- Homebridge 2 with Matter enabled on the Roborock child/daughter bridge.
|
|
16
|
+
- A Matter controller (a HomePod or Apple TV acting as a home hub) to add the accessories to Apple Home.
|
|
17
|
+
|
|
18
|
+
## Supported robots
|
|
19
|
+
|
|
20
|
+
- Classic protocol Roborock vacuums supported by the upstream plugin (published as Matter).
|
|
21
|
+
- **B01/Q7-series** (`roborock.vacuum.sc05` and compatible), including manual-tank mopping (vacuum/mop mode switch; no water-level status, by design).
|
|
22
|
+
|
|
23
|
+
## Setup
|
|
24
|
+
|
|
25
|
+
1. Install the plugin in Homebridge.
|
|
26
|
+
2. Enter your Roborock app account credentials in the plugin settings.
|
|
27
|
+
3. Enable Matter for the Roborock child bridge, restart, and add each robot to Apple Home using the codes shown in the **Matter Pairing** section of the plugin settings.
|
|
28
|
+
4. Use the **Devices** section to choose which robots the plugin manages.
|
|
29
|
+
|
|
30
|
+
For B01/Q7 robots, room selection appears after the plugin has fetched the map (watch for a `B01 rooms for ...` log line); robots paired before rooms were available must be removed from Apple Home and re-paired once, as Matter fixes the cluster set at commissioning.
|
|
31
|
+
|
|
32
|
+
## Attribution
|
|
33
|
+
|
|
34
|
+
This project builds directly on the work of others, preserved under the MIT license:
|
|
35
|
+
|
|
36
|
+
- **Nico Hartung** — original author of the upstream lineage.
|
|
37
|
+
- **Joshua Appleman** — author of [`homebridge-roborock-vacuum2`](https://github.com/applemanj/homebridge-roborock-vacuum2), the base for this fork.
|
|
38
|
+
- **copystring** — [ioBroker.roborock](https://github.com/copystring/ioBroker.roborock), the source of much of the Roborock protocol implementation.
|
|
39
|
+
- **The python-roborock project** — the reference implementation used to build B01/Q7 support.
|
|
40
|
+
|
|
41
|
+
This fork is maintained by **Mathias Hornbek**. It is an independent, community-maintained fork and is not affiliated with or endorsed by Roborock or Apple.
|
|
42
|
+
|
|
43
|
+
## License
|
|
44
|
+
|
|
45
|
+
MIT — see [LICENSE](./LICENSE).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"t":1765660648,"dps":{"10001":"{\"msgId\":\"200000000001\",\"code\":0,\"method\":\"prop.get\",\"data\":{\"status\":4,\"main_brush\":4088}}"}}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"serial": "RCOEHP52901640",
|
|
3
|
+
"model": "roborock.vacuum.sc05",
|
|
4
|
+
"expectedMapKey": "8b843fa941befe34",
|
|
5
|
+
"payloadBase64": "dJvBLyjxxSb0cQ1J8sw07L79P8tQ5pBshSuy77vNc3GnbZaRcIwTcEpaETDI2ehx8XpNGYqy5ac1irT3svbeTOiRtj31RhErHEKGm1NSAQBOwHHDKR8aLcXVUT0wewNM9Vd5H1C0L3uaxwHPW1Pp9A==",
|
|
6
|
+
"expectedRooms": [
|
|
7
|
+
{
|
|
8
|
+
"roomId": 42,
|
|
9
|
+
"roomName": "Køkken"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"roomId": 7,
|
|
13
|
+
"roomName": "Stue"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|