[1.1.5] - 2026-03-15
Changed
- Requires matterbridge@3.6.1 — Official release of
1.1.5. Minimum required Matterbridge version is3.6.1.
Added
- Burst polling after vacuum commands — Polls device every 10 seconds until idle/docked after triggering start, resume, or go home.
- Per-device model name override — Auto-populates
deviceProductNamesin config on first run when "Override Matter Configuration" is enabled. - Full MQTT lifecycle email notifications — Covers connected, offline, close, and error events.
- Device OTA status handling — Handles protocol 500 (
device_status_ota) messages for firmware update status and progress. - Email notification test on startup — Sends a test email on
onConfigureto verify SMTP settings.
Fixed
- "Traveling to room" status accuracy — Stays visible until cleaning actually starts, using
clean_areaandclean_timeto detect travel vs. cleaning. - State resolver expanded — All active cleaning statuses (
ManualMode,RoomClean,ZoneClean,SpotCleaning, mop variants) now fully respect modifier flags. - Sleeping and InError statuses — Both are now Priority 0 overrides returning correct states based on
inCleaningandisExploringflags. Pausedstatus preserves area context —cleaning_infois now considered relevant when the vacuum is paused.- Single-room
currentAreapreserved — Whencleaning_infois absent and only one room is selected,currentAreais set to that room's area ID. - Email notifications suppressed during keep-alive reconnects —
isForceReconnectingflag prevents false alerts on intentional reconnections. - Charging state regression —
handleDeviceStatusUpdateno longer overridesChargingwithDockedwhile still charging. - MQTT subscription race condition —
subscribeToQueue()called beforeconnectionBroadcaster.onConnected()to avoid missed responses. - Local client stale socket race condition — Closure-captured socket reference prevents old
closeevents from destroying newly created sockets. - MQTT fallback during local reconnect —
ClientRouterfalls back to MQTT and logs a notice while local client is reconnecting. correct type of selectedAreas— Typed asnumber[]instead ofServiceArea.Area[], fixing incorrect.areaIdaccess.- Properly await all async calls — All message handler functions now correctly
awaitasync operations to prevent unhandled rejections. - Per-device polling interval — Each device now maintains its own independent polling interval keyed by DUID, fixing multi-vacuum sync.
vendorIdtype safety — UsesVendorIdtype for correct type assignment.B01VacuumModeResolverclass to const — Resolves@typescript-eslint/no-extraneous-classESLint error.- Test async assertions awaited — Fixes
vitest/valid-expectESLint errors. - Array type notation unified —
Array<T>replaced withT[]. pending.has(messageId)key fix — Map key isduid:messageIdstring, not raw numericmessageId.
Improved
- Connection lifecycle clarity —
AbstractConnectionListenerexposesonOfflineandonCloseas distinct callbacks. - Reduced response noise —
V1ResponseBroadcastersilently drops simple ok responses. - Message result type safety —
MessageResultuses strongly-typed enums instead of raw numeric values. deviceNotifycallback removed fromPollingService— Unused after async refactor.- Whitelist accepts DUIDs only — Simplified to raw DUID string matching.
- State change logging — Includes both human-readable label and numeric code for easier tracing.