[3.10.8] - 2026-09-04
Development News
-
[chip]: ThermostatAuto endpoint 901 CHIP conformance is green ✅ for all applicable automated harness tests covering the
Thermostatcluster. -
[chip]: ThermostatHeating endpoint 9011 CHIP conformance is green ✅ for all applicable automated harness tests covering the
Thermostatcluster. -
[chip]: ThermostatCooling endpoint 9012 CHIP conformance is green ✅ for all applicable automated harness tests covering the
Thermostatcluster. -
[chip]: ThermostatPresets endpoint 9013 CHIP conformance is green ✅ for all applicable automated harness tests covering the
Thermostatcluster, including thePresetsfeature (TC_TSTAT_4_2.py). -
[chip]: ThermostatSchedules endpoint 9014 CHIP conformance is green ✅ for all applicable automated harness tests covering the
Thermostatcluster, including theMatterScheduleConfigurationfeature. -
[chip]: ThermostatSuggestions endpoint 9015 CHIP conformance is green ✅ for all applicable automated harness tests covering the
Thermostatcluster, including theThermostatSuggestionsfeature (TC_TSTAT_4_3.py). -
[chip]: DoorLock endpoint 801 CHIP conformance is green ✅ for all applicable automated harness tests covering the
DoorLockcluster. -
[chip]: DoorLockUserPINSchedules endpoint 8012 CHIP conformance is green ✅ for all applicable automated harness tests covering the
DoorLockcluster. -
[chip]: Closure endpoint 805 CHIP conformance is green ✅ for the automated harness tests covering the
ClosureControlcluster. -
[chip]: ClosureComplete endpoint 8054 CHIP conformance is green ✅ for the automated harness tests covering the
ClosureControlcluster. -
[chip]: ClosureDimension endpoint 8062 (Closure Panel Roller, Translation shape) CHIP conformance is green ✅ for the automated harness tests covering the
ClosureDimensioncluster. -
[chip]: ClusurePanelVenetian endpoint 8064 (Closure Panel Venetian, Rotation shape) CHIP conformance is green ✅ for the automated harness tests covering the
ClosureDimensioncluster. -
[chip]: ClosurePanelSmartGlass endpoint 8066 (Closure Panel Smart-Glass, Modulation shape) CHIP conformance is green ✅ for the automated harness tests covering the
ClosureDimensioncluster. -
[chip]: WindowCoveringLift endpoint 803 CHIP conformance is green ✅ for the automated harness tests covering the
WindowCoveringcluster. -
[chip]: WindowCoveringTilt endpoint 8031 CHIP conformance is green ✅ for the automated harness tests covering the
WindowCoveringcluster. -
[chip]: WindowCoveringLiftTilt endpoint 8032 CHIP conformance is green ✅ for the automated harness tests covering the
WindowCoveringcluster. -
[endpoint]: Clarify
addCommandHandler()JSDoc after #617: command handlers run before the Matterbridge behavior command implementation starts its cluster-specific validation and state checks, so handlers with real side effects must validate the relevant Matter preconditions and current cluster state before acting; usesubscribeAttribute()when actions should run only after Matterbridge accepts a command and updates the corresponding attributes.
Added
- [closureControl]: Add
motionLatchingandspeedoptions toClosureOptionsto opt in to the optional MotionLatching and Speed features. Thanks Ludovic BOUÉ (#622). - [closureDimension]: Add
motionLatchingandspeedoptions toClosurePanelOptionsto opt in to the optional MotionLatching and Speed features per panel. Thanks Ludovic BOUÉ (#618). - [closureControl]:
MatterbridgeClosureControlServercan now simulate MoveTo/Calibrate completion, opt-in via the newstate.movementDuration/state.calibrationDuration(both disabled by default; automatically enabled underMATTERBRIDGE_CHIP_TEST). - [closureDimension]: Add the
movementDurationoption toClosurePanelOptions;MatterbridgeClosureDimensionServercan now simulate SetTarget/Step completion (CurrentStateconverging toTargetState), opt-in viastate.movementDuration(disabled by default; automatically enabled underMATTERBRIDGE_CHIP_TEST). - [doorlock]: Add Week Day Access Schedules (WDSCH), Year Day Access Schedules (YDSCH), and Holiday Schedules (HDSCH) feature support. Thanks Ludovic BOUÉ.
- [ElectricalUtilityMeter]: Add the option to expose an Electrical Energy Tariff on the same meter endpoint. Thanks Ludovic BOUÉ.
- [ElectricalUtilityMeter]: Add the full
CommodityTariffday/tariff schedule fields (startDate,dayEntries,dayPatterns,calendarPeriods,individualDays,currentDay,nextDay,currentDayEntry,currentDayEntryDate,nextDayEntry,nextDayEntryDate,tariffComponents,tariffPeriods,currentTariffComponents,nextTariffComponents) toElectricalEnergyTariffOptions, soaddElectricalMeter()/addElectricalEnergyTariff()can seed a real schedule at construction time instead of leaving it null. Thanks Ludovic BOUÉ (#625). - [matterbridge]: Add the
--root-power-sourceparam to opt in to a wired AC PowerSource cluster on the Root endpoint (disabled by default, since it was found to break ElectricalPowerMeasurement rendering in Apple Home). - [endpoint]: Add typed overloads for the
getClusterServerOptions()typed surface when called withBehavior.TypeorClusterType. - [endpoint]: Add
createDefaultWaterTankLevelMonitoringClusterServer()toMatterbridgeEndpoint, creating a defaultWaterTankLevelMonitoringcluster server (Condition, Warning, and ReplacementProductList features) with aresetConditioncommand handler, following the existing HepaFilterMonitoring/ActivatedCarbonFilterMonitoring pattern. TheMatterbridgeWaterTankLevelMonitoringServerbehavior is exported like the other two monitoring behaviors, and the frontend device tooltip now showsWater tank: <condition>%. No Matterbridge device type declares this cluster yet, as the only Matter device type that lists it (Humidifier/Dehumidifier) is planned for Matter 1.7. Thanks Ludovic BOUÉ. - [temperatureAlarm]: Add
MatterbridgeTemperatureAlarmServer, implementing the derivedTemperatureAlarmcluster (Matter 1.6.0 § 2.17) with the Alarm BaseResetfeature and theOverTemperature/UnderTemperaturefeatures, so theCriticalOverTemperatureThresholdandCriticalUnderTemperatureThresholdattributes, the baseResetandModifyEnabledAlarmscommands and the mandatoryNotifyevent are all supported. matter.js has no Alarm Base implementation and only a bareTemperatureAlarmbehavior, so the commands and the event are implemented here, and the cluster schema is extended to bind the inherited Alarm Base elements to theTemperatureAlarmAlarmBitmap(same fix already applied toMatterbridgeRefrigeratorAlarmServerandMatterbridgeDishwasherAlarmServer).Notifyis emitted automatically whenever theStateattribute changes. No Matterbridge device type declares this cluster yet. - [temperatureAlarm]: Add
createDefaultTemperatureAlarmClusterServer()toMatterbridgeEndpoint, creating a defaultTemperatureAlarmcluster server (Reset, OverTemperature and UnderTemperature features) with sensible critical thresholds, following the existing main-cluster pattern.TemperatureAlarmis registered insupportedClusters, ingetBehaviourTypeFromClusterServerId()and inaddClusterServers(), soaddRequiredClusterServers()/addOptionalClusterServers()create it automatically,MatterbridgeTemperatureAlarmServeris exported like the other main-cluster behaviors, and the frontend device tooltip now showsTemp alarm: <state>. No Matterbridge device type declares this cluster yet, as it is provisional in Matter 1.6.0 (§ 2.17.3). - [dishwasherAlarm]:
MatterbridgeDishwasherAlarmServernow implements the Alarm BaseResetandModifyEnabledAlarmscommands and the mandatoryNotifyevent, which matter.js does not provide (it ships no Alarm Base implementation and only a bareDishwasherAlarmbehavior). The Alarm BaseRESETfeature is enabled, so the cluster now reportsFeatureMap={reset:true}, adds the fixedLatchattribute and accepts commands0x00/0x01. The cluster schema is also extended to bindLatchand theReset/ModifyEnabledAlarmscommand fields to the DishwasherAlarmBitmap, alongside the attributes and theNotifyevent fixed previously.Notifyis emitted automatically wheneverStatechanges. - [refrigeratorAlarm]:
MatterbridgeRefrigeratorAlarmServernow implements the mandatoryNotifyevent, emitted automatically wheneverStatechanges, soRefrigerator.setDoorOpenState()alone raises and clears the alarm. No command is added: Matter 1.6.0 § 8.8.4 marks the Alarm BaseRESETfeature as disallowed (X), which also removes theResetcommand and theLatchattribute, and § 8.8.7 marksModifyEnabledAlarmsas disallowed (X), so the cluster correctly accepts no commands at all.Refrigerator.triggerDoorOpenState()is deprecated in favour ofsetDoorOpenState(), since it only duplicates the event without updatingState. - [buntest]: Add
wssTest.test.ts, auditing awss(WebSocket over TLS) mTLS handshake under Bun with both the globalWebSocketand thewspackage client, documenting that thewsclient silently ignores top-level TLS options under Bun and requires them nested undertls(see README-BUN.md known issues, and upstream oven-sh/bun#31396). - [utils]: Add spec compliant
luxToMatterandmatterToLuxutilities. - [WindowCovering]: Add
createDefaultTiltWindowCoveringClusterServer()toMatterbridgeEndpoint, creating a tilt-only WindowCovering cluster server (Tilt and PositionAwareTilt features), mirroringcreateDefaultWindowCoveringClusterServer(). - [WindowCovering]:
MatterbridgeWindowCoveringServercan now simulate lift/tilt movement completion, opt-in via the newstate.movementDuration(disabled by default; automatically enabled underMATTERBRIDGE_CHIP_TEST). - [doorlock]:
createUserPinDoorLockClusterServer()accepts a new optionalexpiringUserTimeoutparameter that creates theExpiringUserTimeoutattribute (Matter 1.6.0 § 5.2.9.36, constraint 1 to 2880 minutes), enabling support forDoorLock.UserType.ExpiringUsertemporary PIN credentials. Thanks Ludovic BOUÉ. - [chip]: Add the DoorLockUserPINExpiring demo device on endpoint 8013, a User/PIN door lock with
expiringUserTimeoutset, with its owndoor-lock-user-pin-expiring.picsand a TC_DRLK_2_1 run, so steps 34a-34c (read, write, read-back ofExpiringUserTimeout) are executed instead of skipped. Thanks Ludovic BOUÉ. - [DoorLock]:
createUserPinDoorLockClusterServer()accepts a new optionalnumberOfRfidUsersSupportedparameter that enables theRfidCredential(RID) feature (Matter 1.6.0 § 5.2.4), creating theNumberOfRFIDUsersSupported,MaxRFIDCodeLength, andMinRFIDCodeLengthattributes; the last two are also exposed as optionalminRfidCodeLength/maxRfidCodeLengthparameters (defaults 8/20 bytes, matching 4/10-byte ISO 14443A UIDs when represented as ASCII hex, per the spec recommendation).SetCredential/GetCredentialStatus/ClearCredentialalready handleDoorLock.CredentialType.Rfidgenerically inMatterbridgeDoorLockServer, so no command-handler changes were needed. Thanks Ludovic BOUÉ.
Changed
- [matterbridge]: Bump
matterbridgeversion to v.3.10.8. - [matterbridge]: Bump
@types/nodeto v.26.4.0. - [matterbridge]: Bump
markedto v.18.0.11. - [matterbridge]: Bump
oxfmtto v.0.65.0. - [matterbridge]: Bump
oxlintto v.1.80.0. - [matterbridge]: Bump
node-ansi-loggerto v.3.3.1. - [matterbridge]: Bump
node-persist-managerto v.2.1.1. - [matterbridge]: Bump
express-rate-limitto v.8.7.0. - [matterbridge]: Bump
multerto v.2.3.0. - [matterbridge]: Bump
@zip.js/zip.jsto v.2.8.61. - [frontend]: Bump
frontendversion to v.3.5.10. - [frontend]: Bump
@testing-library/reactto v.16.3.3. - [frontend]: Bump
@types/nodeto v.26.4.0. - [frontend]: Bump
@types/react-domto v.19.2.5. - [frontend]: Bump
@vitejs/plugin-reactto v.6.1.1. - [frontend]: Bump
oxfmtto v.0.65.0. - [frontend]: Bump
oxlintto v.1.80.0. - [closureDimension]: Change
ClosurePanelOptionsdefaults forresolutionandstepValueto advertise whole-percent (1%) granularity by default instead of 0.01%, matching typical real closure APIs. Thanks Ludovic BOUÉ (#620).
Fixed
- [Closure]: Fix Calibration slipping into the default ClosureControl feature map and command list; the Calibration feature and Calibrate command are now advertised only when the
calibrationoption is enabled. Thanks Ludovic BOUÉ. - [Closure]: Fix
secureStatestaying frozen at its initial value onMoveTocompletion for a Closure without the MotionLatching feature; it now tracksPosition(secure only when FullyClosed) as required by the Application Cluster Specification, andSecureStateChangedfires accordingly. - [frontend]: Fix
HomeDevicesremixing the whole devices/selectDevices list (and rendering twice) on every single device reachabilitystate_update; a reachable-only update now patches the affected row inmixedDevicesdirectly instead of rebuilding the merged list. - [frontend]: Fix
DevicesIconstearing down and re-registering its WebSocket listener on every singlestate_update;stateUpdatenow reads the currentdevices/clustersstate through refs instead of closing over them, keeping its identity stable so the listener effect no longer remounts on every message. - [scripts]: Fix
update-matter.mjs loc(npm run updateMatter:loc) only installing../matter.js/packages/mainfrom the local matter.js checkout;@matter/main's ownpackage.jsondeclares its split-package dependencies (@matter/general,@matter/model,@matter/node,@matter/nodejs,@matter/protocol,@matter/types) as"*", which only resolves inside the matter.js monorepo workspace, so those packages were left unresolved and broke thetscbuild.locmode now also installs all six sibling packages from their local paths alongsidemain. - [WindowCovering]: Fix
operationalStatusalways including thelift/tiltbits regardless of the endpoint's supported features; the Matter 1.6.0 Application Cluster Specification §5.3.5.3.2/§5.3.5.3.3 conditions those bits on the LF/TL features.createDefaultWindowCoveringClusterServer()(Lift-only) no longer setstilt,createDefaultTiltWindowCoveringClusterServer()(Tilt-only) no longer setslift, andsetWindowCoveringTargetAsCurrentAndStopped(),setWindowCoveringCurrentTargetStatus(),setWindowCoveringStatus(),setWindowCoveringTargetAndCurrentPosition(), andMatterbridgeWindowCoveringServer.stopMotion()now include only the bit(s) the endpoint actually supports. Also fixessetWindowCoveringTargetAsCurrentAndStopped()silently doing nothing at all (no target sync, nooperationalStatusupdate) when called on a Tilt-only server. - [WindowCovering]: Fix
operationalStatus.globalstaying Stopped while a Tilt-only covering was moving, failingTest_TC_WNCV_3_1/Test_TC_WNCV_3_2on a Tilt-only endpoint.MatterbridgeWindowCoveringServerderivesglobalfrom thelift/tiltbits, but on a Tilt-only serverliftis now absent, so the derivation assignedglobalan undefined value that encoded as Stopped. An absent axis is now read as Stopped andglobalfollows the axis the server actually supports. - [matterbridgeFactory]: Fix
createClusterServer()throwing whenoptions.featuresnames a feature the target cluster doesn't have (e.g. anOnOff-only feature name passed forBooleanState); unknown feature names are now silently ignored instead of raisingImplementationError, matching the documented "ignore unsupported features" behavior.