@matterbridge/core 3.7.1-dev-20260323-0a65511 → 3.7.1-dev-20260324-9c29691

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.
@@ -9,10 +9,10 @@ import { RvcRunMode } from '@matter/types/clusters/rvc-run-mode';
9
9
  import { ServiceArea } from '@matter/types/clusters/service-area';
10
10
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
11
11
  export declare class RoboticVacuumCleaner extends MatterbridgeEndpoint {
12
- constructor(name: string, serial: string, mode?: 'server' | 'matter' | undefined, currentRunMode?: number, supportedRunModes?: RvcRunMode.ModeOption[], currentCleanMode?: number, supportedCleanModes?: RvcCleanMode.ModeOption[], currentPhase?: number | null, phaseList?: string[] | null, operationalState?: RvcOperationalState.OperationalState, operationalStateList?: RvcOperationalState.OperationalStateStruct[], supportedAreas?: ServiceArea.Area[], selectedAreas?: number[], currentArea?: number, supportedMaps?: ServiceArea.Map[]);
12
+ constructor(name: string, serial: string, mode?: 'server' | 'matter' | undefined, currentRunMode?: number, supportedRunModes?: RvcRunMode.ModeOption[], currentCleanMode?: number, supportedCleanModes?: RvcCleanMode.ModeOption[], currentPhase?: number | null, phaseList?: string[] | null, operationalState?: RvcOperationalState.OperationalState, operationalStateList?: RvcOperationalState.OperationalStateStruct[], supportedAreas?: ServiceArea.Area[], selectedAreas?: number[], currentArea?: number | null, supportedMaps?: ServiceArea.Map[]);
13
13
  createDefaultRvcRunModeClusterServer(currentMode?: number, supportedModes?: RvcRunMode.ModeOption[]): this;
14
14
  createDefaultRvcCleanModeClusterServer(currentMode?: number, supportedModes?: RvcCleanMode.ModeOption[]): this;
15
- createDefaultServiceAreaClusterServer(supportedAreas?: ServiceArea.Area[], selectedAreas?: number[], currentArea?: number, supportedMaps?: ServiceArea.Map[]): this;
15
+ createDefaultServiceAreaClusterServer(supportedAreas?: ServiceArea.Area[], selectedAreas?: number[], currentArea?: number | null, supportedMaps?: ServiceArea.Map[]): this;
16
16
  createDefaultRvcOperationalStateClusterServer(phaseList?: string[] | null, currentPhase?: number | null, operationalStateList?: RvcOperationalState.OperationalStateStruct[], operationalState?: RvcOperationalState.OperationalState, operationalError?: RvcOperationalState.ErrorStateStruct): this;
17
17
  }
18
18
  export declare class MatterbridgeRvcRunModeServer extends RvcRunModeServer {
@@ -71,7 +71,7 @@ export class RoboticVacuumCleaner extends MatterbridgeEndpoint {
71
71
  },
72
72
  ],
73
73
  selectedAreas: selectedAreas ?? [],
74
- currentArea: currentArea ?? 1,
74
+ currentArea: currentArea !== undefined ? currentArea : 1,
75
75
  supportedMaps: supportedMaps ?? [],
76
76
  estimatedEndTime: null,
77
77
  });
package/dist/helpers.js CHANGED
@@ -13,6 +13,8 @@ import { Identify } from '@matter/types/clusters/identify';
13
13
  import { OnOff } from '@matter/types/clusters/on-off';
14
14
  import { VendorId } from '@matter/types/datatype';
15
15
  import { hasParameter } from '@matterbridge/utils/cli';
16
+ import { doorLockDevice } from './matterbridgeDeviceTypes.js';
17
+ import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
16
18
  export async function addVirtualDevice(aggregatorEndpoint, name, type, callback) {
17
19
  let deviceType;
18
20
  switch (type) {
@@ -36,7 +38,7 @@ export async function addVirtualDevice(aggregatorEndpoint, name, type, callback)
36
38
  vendorName: 'Matterbridge',
37
39
  productName: 'Matterbridge Virtual Device',
38
40
  nodeLabel: name.slice(0, 32),
39
- softwareVersion: 2000,
41
+ softwareVersion: 20000,
40
42
  softwareVersionString: '2.0.0',
41
43
  },
42
44
  onOff: { onOff: false },
@@ -71,6 +73,13 @@ export async function addVirtualDevice(aggregatorEndpoint, name, type, callback)
71
73
  return device;
72
74
  }
73
75
  export async function addVirtualDevices(matterbridge, aggregatorEndpoint) {
76
+ if (hasParameter('experimental') && matterbridge.bridgeMode === 'bridge' && aggregatorEndpoint) {
77
+ const lock = new MatterbridgeEndpoint(doorLockDevice, { id: 'system_lock' });
78
+ lock.createDefaultBridgedDeviceBasicInformationClusterServer('Matterbridge System Lock', 'sn_system_lock', 0xfff1, 'Matterbridge', 'Matterbridge Virtual Device', 20000, '2.0.0');
79
+ lock.createPinDoorLockClusterServer();
80
+ lock.addRequiredClusterServers();
81
+ await aggregatorEndpoint.add(lock);
82
+ }
74
83
  if (matterbridge.virtualMode !== 'disabled' && matterbridge.bridgeMode === 'bridge' && aggregatorEndpoint) {
75
84
  matterbridge.log.notice(`Creating virtual devices for Matterbridge server node...`);
76
85
  await addVirtualDevice(aggregatorEndpoint, 'Restart Matterbridge', matterbridge.virtualMode, async () => {
@@ -80,13 +89,7 @@ export async function addVirtualDevices(matterbridge, aggregatorEndpoint) {
80
89
  await matterbridge.shutdownProcess();
81
90
  });
82
91
  await addVirtualDevice(aggregatorEndpoint, 'Update Matterbridge', matterbridge.virtualMode, async () => {
83
- if (hasParameter('shelly')) {
84
- }
85
- else {
86
- await matterbridge.updateProcess();
87
- }
92
+ await matterbridge.updateProcess();
88
93
  });
89
- if (hasParameter('shelly')) {
90
- }
91
94
  }
92
95
  }
@@ -1197,11 +1197,33 @@ export class Matterbridge extends EventEmitter {
1197
1197
  }
1198
1198
  if (message === 'shutting down with reset...') {
1199
1199
  this.log.info('Resetting Matterbridge commissioning information...');
1200
- await this.matterStorageManager?.createContext('events')?.clearAll();
1201
- await this.matterStorageManager?.createContext('fabrics')?.clearAll();
1202
- await this.matterStorageManager?.createContext('root')?.clearAll();
1203
- await this.matterStorageManager?.createContext('sessions')?.clearAll();
1204
1200
  await this.matterbridgeContext?.clearAll();
1201
+ if (this.bridgeMode === 'bridge') {
1202
+ await this.matterStorageManager?.createContext('events')?.clearAll();
1203
+ await this.matterStorageManager?.createContext('fabrics')?.clearAll();
1204
+ await this.matterStorageManager?.createContext('root')?.clearAll();
1205
+ await this.matterStorageManager?.createContext('sessions')?.clearAll();
1206
+ }
1207
+ else if (this.bridgeMode === 'childbridge') {
1208
+ for (const plugin of this.plugins.array()) {
1209
+ plugin.storageContext?.clearAll();
1210
+ const storageManager = await this.matterStorageService?.open(plugin.name);
1211
+ await storageManager?.createContext('events')?.clearAll();
1212
+ await storageManager?.createContext('fabrics')?.clearAll();
1213
+ await storageManager?.createContext('root')?.clearAll();
1214
+ await storageManager?.createContext('sessions')?.clearAll();
1215
+ }
1216
+ }
1217
+ for (const device of this.devices.array()) {
1218
+ if (device.mode === 'server' && device.deviceName) {
1219
+ const storageManager = await this.matterStorageService?.open(device.deviceName.replaceAll(' ', ''));
1220
+ await storageManager?.createContext('persist')?.clearAll();
1221
+ await storageManager?.createContext('events')?.clearAll();
1222
+ await storageManager?.createContext('fabrics')?.clearAll();
1223
+ await storageManager?.createContext('root')?.clearAll();
1224
+ await storageManager?.createContext('sessions')?.clearAll();
1225
+ }
1226
+ }
1205
1227
  this.log.info('Matter storage reset done! Remove the bridge from the controller.');
1206
1228
  }
1207
1229
  if (message === 'unregistered all devices and shutting down...') {
@@ -24,6 +24,7 @@ import { ActivatedCarbonFilterMonitoring } from '@matter/types/clusters/activate
24
24
  import { BooleanStateConfiguration } from '@matter/types/clusters/boolean-state-configuration';
25
25
  import { ColorControl } from '@matter/types/clusters/color-control';
26
26
  import { DeviceEnergyManagement } from '@matter/types/clusters/device-energy-management';
27
+ import { DoorLock } from '@matter/types/clusters/door-lock';
27
28
  import { FanControl } from '@matter/types/clusters/fan-control';
28
29
  import { HepaFilterMonitoring } from '@matter/types/clusters/hepa-filter-monitoring';
29
30
  import { Identify } from '@matter/types/clusters/identify';
@@ -452,15 +453,17 @@ declare const MatterbridgeColorControlServer_base: import("@matter/node").Cluste
452
453
  };
453
454
  readonly component: false;
454
455
  }];
455
- }>, readonly [ColorControl.Feature.HueSaturation, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature]>, typeof ColorControlServer, import("@matter/node/behaviors/color-control").ColorControlInterface>;
456
+ }>, readonly [ColorControl.Feature.HueSaturation, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature, ColorControl.Feature.EnhancedHue]>, typeof ColorControlServer, import("@matter/node/behaviors/color-control").ColorControlInterface>;
456
457
  export declare class MatterbridgeColorControlServer extends MatterbridgeColorControlServer_base {
457
458
  moveToHue(request: ColorControl.MoveToHueRequest): Promise<void>;
459
+ enhancedMoveToHue(request: ColorControl.EnhancedMoveToHueRequest): Promise<void>;
458
460
  moveToSaturation(request: ColorControl.MoveToSaturationRequest): Promise<void>;
459
461
  moveToHueAndSaturation(request: ColorControl.MoveToHueAndSaturationRequest): Promise<void>;
462
+ enhancedMoveToHueAndSaturation(request: ColorControl.EnhancedMoveToHueAndSaturationRequest): Promise<void>;
460
463
  moveToColor(request: ColorControl.MoveToColorRequest): Promise<void>;
461
464
  moveToColorTemperature(request: ColorControl.MoveToColorTemperatureRequest): Promise<void>;
462
465
  }
463
- declare const MatterbridgeEnhancedColorControlServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
466
+ declare const MatterbridgeEnhancedColorControlServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
464
467
  readonly id: 768;
465
468
  readonly name: "ColorControl";
466
469
  readonly revision: 7;
@@ -846,15 +849,8 @@ declare const MatterbridgeEnhancedColorControlServer_base: import("@matter/node"
846
849
  };
847
850
  readonly component: false;
848
851
  }];
849
- }>, readonly [ColorControl.Feature.HueSaturation, ColorControl.Feature.EnhancedHue, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature]>, typeof ColorControlServer, import("@matter/node/behaviors/color-control").ColorControlInterface>;
852
+ }>, readonly [ColorControl.Feature.HueSaturation, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature, ColorControl.Feature.EnhancedHue]>, readonly [ColorControl.Feature.HueSaturation, ColorControl.Feature.EnhancedHue, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature]>, typeof MatterbridgeColorControlServer, import("@matter/node/behaviors/color-control").ColorControlInterface>;
850
853
  export declare class MatterbridgeEnhancedColorControlServer extends MatterbridgeEnhancedColorControlServer_base {
851
- moveToHue(request: ColorControl.MoveToHueRequest): Promise<void>;
852
- enhancedMoveToHue(request: ColorControl.EnhancedMoveToHueRequest): Promise<void>;
853
- moveToSaturation(request: ColorControl.MoveToSaturationRequest): Promise<void>;
854
- moveToHueAndSaturation(request: ColorControl.MoveToHueAndSaturationRequest): Promise<void>;
855
- enhancedMoveToHueAndSaturation(request: ColorControl.EnhancedMoveToHueAndSaturationRequest): Promise<void>;
856
- moveToColor(request: ColorControl.MoveToColorRequest): Promise<void>;
857
- moveToColorTemperature(request: ColorControl.MoveToColorTemperatureRequest): Promise<void>;
858
854
  }
859
855
  declare const MatterbridgeWindowCoveringServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
860
856
  readonly id: 258;
@@ -1435,9 +1431,14 @@ declare const MatterbridgeLiftTiltWindowCoveringServer_base: import("@matter/nod
1435
1431
  }>, readonly [WindowCovering.Feature.Lift, WindowCovering.Feature.PositionAwareLift, WindowCovering.Feature.Tilt, WindowCovering.Feature.PositionAwareTilt]>, readonly [WindowCovering.Feature.Lift, WindowCovering.Feature.PositionAwareLift, WindowCovering.Feature.Tilt, WindowCovering.Feature.PositionAwareTilt]>, typeof MatterbridgeWindowCoveringServer, import("@matter/node/behaviors/window-covering").WindowCoveringInterface>;
1436
1432
  export declare class MatterbridgeLiftTiltWindowCoveringServer extends MatterbridgeLiftTiltWindowCoveringServer_base {
1437
1433
  }
1438
- export declare class MatterbridgeDoorLockServer extends DoorLockServer {
1439
- lockDoor(): Promise<void>;
1440
- unlockDoor(): Promise<void>;
1434
+ declare const MatterbridgeDoorLockServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<DoorLock.Cluster, readonly [DoorLock.Feature.PinCredential, DoorLock.Feature.CredentialOverTheAirAccess]>, typeof DoorLockServer, import("@matter/node/behaviors/door-lock").DoorLockInterface>;
1435
+ export declare class MatterbridgeDoorLockServer extends MatterbridgeDoorLockServer_base {
1436
+ lockDoor(request: DoorLock.LockDoorRequest): Promise<void>;
1437
+ unlockDoor(request: DoorLock.UnlockDoorRequest): Promise<void>;
1438
+ setPinCode(request: DoorLock.SetPinCodeRequest): Promise<void>;
1439
+ getPinCode(request: DoorLock.GetPinCodeRequest): Promise<DoorLock.GetPinCodeResponse>;
1440
+ clearPinCode(request: DoorLock.ClearPinCodeRequest): Promise<void>;
1441
+ clearAllPinCodes(): Promise<void>;
1441
1442
  }
1442
1443
  declare const MatterbridgeFanControlServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<FanControl.Cluster, readonly [FanControl.Feature.Auto, FanControl.Feature.Step]>, typeof FanControlServer, import("@matter/node/behaviors/fan-control").FanControlInterface>;
1443
1444
  export declare class MatterbridgeFanControlServer extends MatterbridgeFanControlServer_base {
@@ -1803,10 +1804,11 @@ declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterB
1803
1804
  };
1804
1805
  readonly component: false;
1805
1806
  }];
1806
- }>, readonly [Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode]>, typeof ThermostatServer, import("@matter/node/behaviors/thermostat").ThermostatInterface>;
1807
+ }>, readonly [Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode, Thermostat.Feature.Presets]>, typeof ThermostatServer, import("@matter/node/behaviors/thermostat").ThermostatInterface>;
1807
1808
  export declare class MatterbridgeThermostatServer extends MatterbridgeThermostatServer_base {
1808
1809
  initialize(): Promise<void>;
1809
1810
  setpointRaiseLower(request: Thermostat.SetpointRaiseLowerRequest): Promise<void>;
1811
+ setActivePresetRequest(request: Thermostat.SetActivePresetRequest): Promise<void>;
1810
1812
  }
1811
1813
  declare const MatterbridgePresetThermostatServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
1812
1814
  readonly id: 513;
@@ -2170,8 +2172,6 @@ declare const MatterbridgePresetThermostatServer_base: import("@matter/node").Cl
2170
2172
  }];
2171
2173
  }>, readonly [Thermostat.Feature.Presets, Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode]>, typeof ThermostatServer, import("@matter/node/behaviors/thermostat").ThermostatInterface>;
2172
2174
  export declare class MatterbridgePresetThermostatServer extends MatterbridgePresetThermostatServer_base {
2173
- setpointRaiseLower(request: Thermostat.SetpointRaiseLowerRequest): Promise<void>;
2174
- setActivePresetRequest(request: Thermostat.SetActivePresetRequest): Promise<void>;
2175
2175
  }
2176
2176
  declare const MatterbridgeValveConfigurationAndControlServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<ValveConfigurationAndControl.Cluster, readonly [ValveConfigurationAndControl.Feature.Level]>, typeof ValveConfigurationAndControlServer, import("@matter/node/behaviors/valve-configuration-and-control").ValveConfigurationAndControlInterface>;
2177
2177
  export declare class MatterbridgeValveConfigurationAndControlServer extends MatterbridgeValveConfigurationAndControlServer_base {
@@ -23,15 +23,16 @@ import { BooleanStateConfiguration } from '@matter/types/clusters/boolean-state-
23
23
  import { ColorControl } from '@matter/types/clusters/color-control';
24
24
  import { DeviceEnergyManagement } from '@matter/types/clusters/device-energy-management';
25
25
  import { DeviceEnergyManagementMode } from '@matter/types/clusters/device-energy-management-mode';
26
+ import { DoorLock } from '@matter/types/clusters/door-lock';
26
27
  import { FanControl } from '@matter/types/clusters/fan-control';
27
28
  import { ModeBase } from '@matter/types/clusters/mode-base';
28
29
  import { OperationalState } from '@matter/types/clusters/operational-state';
29
30
  import { ResourceMonitoring } from '@matter/types/clusters/resource-monitoring';
30
- import { ServiceArea } from '@matter/types/clusters/service-area';
31
31
  import { SmokeCoAlarm } from '@matter/types/clusters/smoke-co-alarm';
32
32
  import { Thermostat } from '@matter/types/clusters/thermostat';
33
33
  import { ValveConfigurationAndControl } from '@matter/types/clusters/valve-configuration-and-control';
34
34
  import { WindowCovering } from '@matter/types/clusters/window-covering';
35
+ import { getEnumDescription } from '@matterbridge/utils';
35
36
  export class MatterbridgeServer extends Behavior {
36
37
  static id = 'matterbridge';
37
38
  initialize() {
@@ -162,74 +163,7 @@ export class MatterbridgeLevelControlServer extends LevelControlServer {
162
163
  await super.moveToLevelWithOnOff(request);
163
164
  }
164
165
  }
165
- export class MatterbridgeColorControlServer extends ColorControlServer.with(ColorControl.Feature.HueSaturation, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature) {
166
- async moveToHue(request) {
167
- const device = this.endpoint.stateOf(MatterbridgeServer);
168
- device.log.info(`Setting hue to ${request.hue} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
169
- await device.commandHandler.executeHandler('ColorControl.moveToHue', {
170
- command: 'moveToHue',
171
- request,
172
- cluster: ColorControlServer.id,
173
- attributes: this.state,
174
- endpoint: this.endpoint,
175
- });
176
- device.log.debug(`MatterbridgeColorControlServer: moveToHue called`);
177
- await super.moveToHue(request);
178
- }
179
- async moveToSaturation(request) {
180
- const device = this.endpoint.stateOf(MatterbridgeServer);
181
- device.log.info(`Setting saturation to ${request.saturation} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
182
- await device.commandHandler.executeHandler('ColorControl.moveToSaturation', {
183
- command: 'moveToSaturation',
184
- request,
185
- cluster: ColorControlServer.id,
186
- attributes: this.state,
187
- endpoint: this.endpoint,
188
- });
189
- device.log.debug(`MatterbridgeColorControlServer: moveToSaturation called`);
190
- await super.moveToSaturation(request);
191
- }
192
- async moveToHueAndSaturation(request) {
193
- const device = this.endpoint.stateOf(MatterbridgeServer);
194
- device.log.info(`Setting hue to ${request.hue} and saturation to ${request.saturation} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
195
- await device.commandHandler.executeHandler('ColorControl.moveToHueAndSaturation', {
196
- command: 'moveToHueAndSaturation',
197
- request,
198
- cluster: ColorControlServer.id,
199
- attributes: this.state,
200
- endpoint: this.endpoint,
201
- });
202
- device.log.debug(`MatterbridgeColorControlServer: moveToHueAndSaturation called`);
203
- await super.moveToHueAndSaturation(request);
204
- }
205
- async moveToColor(request) {
206
- const device = this.endpoint.stateOf(MatterbridgeServer);
207
- device.log.info(`Setting color to ${request.colorX}, ${request.colorY} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
208
- await device.commandHandler.executeHandler('ColorControl.moveToColor', {
209
- command: 'moveToColor',
210
- request,
211
- cluster: ColorControlServer.id,
212
- attributes: this.state,
213
- endpoint: this.endpoint,
214
- });
215
- device.log.debug(`MatterbridgeColorControlServer: moveToColor called`);
216
- await super.moveToColor(request);
217
- }
218
- async moveToColorTemperature(request) {
219
- const device = this.endpoint.stateOf(MatterbridgeServer);
220
- device.log.info(`Setting color temperature to ${request.colorTemperatureMireds} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
221
- await device.commandHandler.executeHandler('ColorControl.moveToColorTemperature', {
222
- command: 'moveToColorTemperature',
223
- request,
224
- cluster: ColorControlServer.id,
225
- attributes: this.state,
226
- endpoint: this.endpoint,
227
- });
228
- device.log.debug(`MatterbridgeColorControlServer: moveToColorTemperature called`);
229
- await super.moveToColorTemperature(request);
230
- }
231
- }
232
- export class MatterbridgeEnhancedColorControlServer extends ColorControlServer.with(ColorControl.Feature.HueSaturation, ColorControl.Feature.EnhancedHue, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature) {
166
+ export class MatterbridgeColorControlServer extends ColorControlServer.with(ColorControl.Feature.HueSaturation, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature, ColorControl.Feature.EnhancedHue) {
233
167
  async moveToHue(request) {
234
168
  const device = this.endpoint.stateOf(MatterbridgeServer);
235
169
  device.log.info(`Setting hue to ${request.hue} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
@@ -322,6 +256,8 @@ export class MatterbridgeEnhancedColorControlServer extends ColorControlServer.w
322
256
  await super.moveToColorTemperature(request);
323
257
  }
324
258
  }
259
+ export class MatterbridgeEnhancedColorControlServer extends MatterbridgeColorControlServer.with(ColorControl.Feature.HueSaturation, ColorControl.Feature.EnhancedHue, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature) {
260
+ }
325
261
  export class MatterbridgeWindowCoveringServer extends WindowCoveringServer.with(WindowCovering.Feature.Lift, WindowCovering.Feature.PositionAwareLift, WindowCovering.Feature.Tilt, WindowCovering.Feature.PositionAwareTilt) {
326
262
  lookupMovementStatus = ['Stopped', 'Opening', 'Closing', 'Unknown'];
327
263
  async initialize() {
@@ -407,32 +343,85 @@ export class MatterbridgeLiftWindowCoveringServer extends MatterbridgeWindowCove
407
343
  }
408
344
  export class MatterbridgeLiftTiltWindowCoveringServer extends MatterbridgeWindowCoveringServer.with(WindowCovering.Feature.Lift, WindowCovering.Feature.PositionAwareLift, WindowCovering.Feature.Tilt, WindowCovering.Feature.PositionAwareTilt) {
409
345
  }
410
- export class MatterbridgeDoorLockServer extends DoorLockServer {
411
- async lockDoor() {
346
+ export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Feature.PinCredential, DoorLock.Feature.CredentialOverTheAirAccess) {
347
+ async lockDoor(request) {
412
348
  const device = this.endpoint.stateOf(MatterbridgeServer);
413
- device.log.info(`Locking door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
349
+ device.log.info(`Locking door with pincode ${request.pinCode ? '0x' + Buffer.from(request.pinCode).toString('hex') : 'N/A'} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
414
350
  await device.commandHandler.executeHandler('DoorLock.lockDoor', {
415
351
  command: 'lockDoor',
416
- request: {},
352
+ request,
417
353
  cluster: DoorLockServer.id,
418
354
  attributes: this.state,
419
355
  endpoint: this.endpoint,
420
356
  });
421
357
  device.log.debug(`MatterbridgeDoorLockServer: lockDoor called`);
422
- await super.lockDoor();
358
+ await super.lockDoor(request);
423
359
  }
424
- async unlockDoor() {
360
+ async unlockDoor(request) {
425
361
  const device = this.endpoint.stateOf(MatterbridgeServer);
426
- device.log.info(`Unlocking door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
362
+ device.log.info(`Unlocking door with pincode ${request.pinCode ? '0x' + Buffer.from(request.pinCode).toString('hex') : 'N/A'} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
427
363
  await device.commandHandler.executeHandler('DoorLock.unlockDoor', {
428
364
  command: 'unlockDoor',
429
- request: {},
365
+ request,
430
366
  cluster: DoorLockServer.id,
431
367
  attributes: this.state,
432
368
  endpoint: this.endpoint,
433
369
  });
434
370
  device.log.debug(`MatterbridgeDoorLockServer: unlockDoor called`);
435
- await super.unlockDoor();
371
+ await super.unlockDoor(request);
372
+ }
373
+ async setPinCode(request) {
374
+ const device = this.endpoint.stateOf(MatterbridgeServer);
375
+ device.log.info(`Setting pin code ${request.pin ? '0x' + Buffer.from(request.pin).toString('hex') : 'N/A'} for user ${request.userId} type ${getEnumDescription(DoorLock.UserType, request.userType)} status ${getEnumDescription(DoorLock.UserStatus, request.userStatus)} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
376
+ await device.commandHandler.executeHandler('DoorLock.setPinCode', {
377
+ command: 'setPinCode',
378
+ request,
379
+ cluster: DoorLockServer.id,
380
+ attributes: this.state,
381
+ endpoint: this.endpoint,
382
+ });
383
+ device.log.debug(`MatterbridgeDoorLockServer: setPinCode called for user ${request.userId}`);
384
+ }
385
+ async getPinCode(request) {
386
+ const device = this.endpoint.stateOf(MatterbridgeServer);
387
+ device.log.info(`Getting pin code for user ${request.userId} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
388
+ await device.commandHandler.executeHandler('DoorLock.getPinCode', {
389
+ command: 'getPinCode',
390
+ request,
391
+ cluster: DoorLockServer.id,
392
+ attributes: this.state,
393
+ endpoint: this.endpoint,
394
+ });
395
+ return {
396
+ userId: request.userId,
397
+ userStatus: DoorLock.UserStatus.Available,
398
+ userType: DoorLock.UserType.UnrestrictedUser,
399
+ pinCode: Buffer.from('1234'),
400
+ };
401
+ }
402
+ async clearPinCode(request) {
403
+ const device = this.endpoint.stateOf(MatterbridgeServer);
404
+ device.log.info(`Clearing pin code for ${request.pinSlotIndex === 0xfffe ? 'all slots' : 'slot ' + request.pinSlotIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
405
+ await device.commandHandler.executeHandler('DoorLock.clearPinCode', {
406
+ command: 'clearPinCode',
407
+ request,
408
+ cluster: DoorLockServer.id,
409
+ attributes: this.state,
410
+ endpoint: this.endpoint,
411
+ });
412
+ device.log.debug(`MatterbridgeDoorLockServer: clearPinCode called for ${request.pinSlotIndex === 0xfffe ? 'all PIN slots' : 'PIN slot ' + request.pinSlotIndex}`);
413
+ }
414
+ async clearAllPinCodes() {
415
+ const device = this.endpoint.stateOf(MatterbridgeServer);
416
+ device.log.info(`Clearing all pin codes (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
417
+ await device.commandHandler.executeHandler('DoorLock.clearAllPinCodes', {
418
+ command: 'clearAllPinCodes',
419
+ request: {},
420
+ cluster: DoorLockServer.id,
421
+ attributes: this.state,
422
+ endpoint: this.endpoint,
423
+ });
424
+ device.log.debug('MatterbridgeDoorLockServer: clearAllPinCodes called');
436
425
  }
437
426
  }
438
427
  export class MatterbridgeFanControlServer extends FanControlServer.with(FanControl.Feature.Auto, FanControl.Feature.Step) {
@@ -466,7 +455,7 @@ export class MatterbridgeFanControlServer extends FanControlServer.with(FanContr
466
455
  device.log.debug('Set percentCurrent to:', this.state.percentCurrent);
467
456
  }
468
457
  }
469
- export class MatterbridgeThermostatServer extends ThermostatServer.with(Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode) {
458
+ export class MatterbridgeThermostatServer extends ThermostatServer.with(Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode, Thermostat.Feature.Presets) {
470
459
  async initialize() {
471
460
  await super.initialize();
472
461
  this.endpoint.construction.onSuccess(async () => {
@@ -492,22 +481,6 @@ export class MatterbridgeThermostatServer extends ThermostatServer.with(Thermost
492
481
  device.log.debug(`MatterbridgeThermostatServer: setpointRaiseLower called with mode: ${lookupSetpointAdjustMode[request.mode]} amount: ${request.amount / 10}`);
493
482
  await super.setpointRaiseLower(request);
494
483
  }
495
- }
496
- export class MatterbridgePresetThermostatServer extends ThermostatServer.with(Thermostat.Feature.Presets, Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode) {
497
- async setpointRaiseLower(request) {
498
- const device = this.endpoint.stateOf(MatterbridgeServer);
499
- device.log.info(`Setting setpoint by ${request.amount} in mode ${request.mode} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
500
- await device.commandHandler.executeHandler('Thermostat.setpointRaiseLower', {
501
- command: 'setpointRaiseLower',
502
- request,
503
- cluster: ThermostatServer.id,
504
- attributes: this.state,
505
- endpoint: this.endpoint,
506
- });
507
- const lookupSetpointAdjustMode = ['Heat', 'Cool', 'Both'];
508
- device.log.debug(`MatterbridgePresetThermostatServer: setpointRaiseLower called with mode: ${lookupSetpointAdjustMode[request.mode]} amount: ${request.amount / 10}`);
509
- await super.setpointRaiseLower(request);
510
- }
511
484
  async setActivePresetRequest(request) {
512
485
  const device = this.endpoint.stateOf(MatterbridgeServer);
513
486
  const presetHandle = request.presetHandle ? `0x${Buffer.from(request.presetHandle).toString('hex')}` : 'null';
@@ -519,12 +492,14 @@ export class MatterbridgePresetThermostatServer extends ThermostatServer.with(Th
519
492
  attributes: this.state,
520
493
  endpoint: this.endpoint,
521
494
  });
522
- device.log.debug(`MatterbridgePresetThermostatServer: setActivePresetRequest called with presetHandle: ${presetHandle}`);
495
+ device.log.debug(`MatterbridgeThermostatServer: setActivePresetRequest called with presetHandle: ${presetHandle}`);
523
496
  await super.setActivePresetRequest(request);
524
497
  const activePresetHandle = this.state.activePresetHandle ? `0x${Buffer.from(this.state.activePresetHandle).toString('hex')}` : 'null';
525
- device.log.debug(`MatterbridgePresetThermostatServer: setActivePresetRequest completed with activePresetHandle: ${activePresetHandle} occupiedHeatingSetpoint: ${this.state.occupiedHeatingSetpoint} occupiedCoolingSetpoint: ${this.state.occupiedCoolingSetpoint}`);
498
+ device.log.debug(`MatterbridgeThermostatServer: setActivePresetRequest completed with activePresetHandle: ${activePresetHandle} occupiedHeatingSetpoint: ${this.state.occupiedHeatingSetpoint} occupiedCoolingSetpoint: ${this.state.occupiedCoolingSetpoint}`);
526
499
  }
527
500
  }
501
+ export class MatterbridgePresetThermostatServer extends ThermostatServer.with(Thermostat.Feature.Presets, Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode) {
502
+ }
528
503
  export class MatterbridgeValveConfigurationAndControlServer extends ValveConfigurationAndControlServer.with(ValveConfigurationAndControl.Feature.Level) {
529
504
  async open(request) {
530
505
  const device = this.endpoint.stateOf(MatterbridgeServer);
@@ -676,7 +651,7 @@ export class MatterbridgeOperationalStateServer extends OperationalStateServer {
676
651
  export class MatterbridgeServiceAreaServer extends ServiceAreaServer {
677
652
  async selectAreas(request) {
678
653
  const device = this.endpoint.stateOf(MatterbridgeServer);
679
- device.log.info(`Selecting areas ${request.newAreas} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
654
+ device.log.info(`Selecting areas [${request.newAreas.join(', ')}] (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
680
655
  await device.commandHandler.executeHandler('ServiceArea.selectAreas', {
681
656
  command: 'selectAreas',
682
657
  request,
@@ -684,15 +659,7 @@ export class MatterbridgeServiceAreaServer extends ServiceAreaServer {
684
659
  attributes: this.state,
685
660
  endpoint: this.endpoint,
686
661
  });
687
- for (const area of request.newAreas) {
688
- const supportedArea = this.state.supportedAreas.find((supportedArea) => supportedArea.areaId === area);
689
- if (!supportedArea) {
690
- device.log.error(`MatterbridgeServiceAreaServer selectAreas called with unsupported area: ${area}`);
691
- return { status: ServiceArea.SelectAreasStatus.UnsupportedArea, statusText: 'Unsupported areas' };
692
- }
693
- }
694
- this.state.selectedAreas = request.newAreas;
695
- device.log.debug(`MatterbridgeServiceAreaServer selectAreas called with: ${request.newAreas.map((area) => area.toString()).join(', ')}`);
662
+ device.log.debug(`MatterbridgeServiceAreaServer selectAreas called with: [${request.newAreas.join(', ')}]`);
696
663
  return await super.selectAreas(request);
697
664
  }
698
665
  }
@@ -172,6 +172,7 @@ export declare class MatterbridgeEndpoint extends Endpoint {
172
172
  createDefaultHepaFilterMonitoringClusterServer(condition?: number, changeIndication?: ResourceMonitoring.ChangeIndication, inPlaceIndicator?: boolean | undefined, lastChangedTime?: number | null | undefined, replacementProductList?: ResourceMonitoring.ReplacementProduct[]): this;
173
173
  createDefaultActivatedCarbonFilterMonitoringClusterServer(condition?: number, changeIndication?: ResourceMonitoring.ChangeIndication, inPlaceIndicator?: boolean | undefined, lastChangedTime?: number | null | undefined, replacementProductList?: ResourceMonitoring.ReplacementProduct[]): this;
174
174
  createDefaultDoorLockClusterServer(lockState?: DoorLock.LockState, lockType?: DoorLock.LockType): this;
175
+ createPinDoorLockClusterServer(lockState?: DoorLock.LockState, lockType?: DoorLock.LockType): this;
175
176
  createDefaultModeSelectClusterServer(description: string, supportedModes: ModeSelect.ModeOption[], currentMode?: number, startUpMode?: number): this;
176
177
  createDefaultValveConfigurationAndControlClusterServer(valveState?: ValveConfigurationAndControl.ValveState, valveLevel?: number): this;
177
178
  createDefaultPumpConfigurationAndControlClusterServer(pumpMode?: PumpConfigurationAndControl.OperationMode): this;
@@ -62,7 +62,7 @@ import { VendorId } from '@matter/types/datatype';
62
62
  import { inspectError } from '@matterbridge/utils/error';
63
63
  import { isValidNumber, isValidObject, isValidString } from '@matterbridge/utils/validate';
64
64
  import { AnsiLogger, CYAN, db, debugStringify, hk, or, YELLOW, zb } from 'node-ansi-logger';
65
- import { MatterbridgeActivatedCarbonFilterMonitoringServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDoorLockServer, MatterbridgeEnhancedColorControlServer, MatterbridgeFanControlServer, MatterbridgeHepaFilterMonitoringServer, MatterbridgeIdentifyServer, MatterbridgeLevelControlServer, MatterbridgeModeSelectServer, MatterbridgeOnOffServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer, MatterbridgePresetThermostatServer, MatterbridgeServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeSwitchServer, MatterbridgeThermostatServer, MatterbridgeValveConfigurationAndControlServer, MatterbridgeWindowCoveringServer, } from './matterbridgeBehaviorsServer.js';
65
+ import { MatterbridgeActivatedCarbonFilterMonitoringServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDoorLockServer, MatterbridgeFanControlServer, MatterbridgeHepaFilterMonitoringServer, MatterbridgeIdentifyServer, MatterbridgeLevelControlServer, MatterbridgeModeSelectServer, MatterbridgeOnOffServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer, MatterbridgeServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeSwitchServer, MatterbridgeThermostatServer, MatterbridgeValveConfigurationAndControlServer, MatterbridgeWindowCoveringServer, } from './matterbridgeBehaviorsServer.js';
66
66
  import { CommandHandler } from './matterbridgeEndpointCommandHandler.js';
67
67
  import { addClusterServers, addFixedLabel, addOptionalClusterServers, addRequiredClusterServers, addUserLabel, checkNotLatinCharacters, createUniqueId, featuresFor, generateUniqueId, getApparentElectricalPowerMeasurementClusterServer, getAttribute, getAttributeId, getBehavior, getBehaviourTypesFromClusterClientIds, getBehaviourTypesFromClusterServerIds, getCluster, getClusterId, getDefaultDeviceEnergyManagementClusterServer, getDefaultDeviceEnergyManagementModeClusterServer, getDefaultElectricalEnergyMeasurementClusterServer, getDefaultElectricalPowerMeasurementClusterServer, getDefaultFlowMeasurementClusterServer, getDefaultIlluminanceMeasurementClusterServer, getDefaultOccupancySensingClusterServer, getDefaultOperationalStateClusterServer, getDefaultPowerSourceBatteryClusterServer, getDefaultPowerSourceRechargeableBatteryClusterServer, getDefaultPowerSourceReplaceableBatteryClusterServer, getDefaultPowerSourceWiredClusterServer, getDefaultPressureMeasurementClusterServer, getDefaultRelativeHumidityMeasurementClusterServer, getDefaultTemperatureMeasurementClusterServer, invokeBehaviorCommand, lowercaseFirstLetter, setAttribute, setCluster, subscribeAttribute, triggerEvent, updateAttribute, } from './matterbridgeEndpointHelpers.js';
68
68
  const MATTERBRIDGE_ENDPOINT_BRAND = Symbol('MatterbridgeEndpoint.brand');
@@ -639,7 +639,7 @@ export class MatterbridgeEndpoint extends Endpoint {
639
639
  return this;
640
640
  }
641
641
  createEnhancedColorControlClusterServer(currentX = 0, currentY = 0, enhancedCurrentHue = 0, currentSaturation = 0, colorTemperatureMireds = 500, colorTempPhysicalMinMireds = 147, colorTempPhysicalMaxMireds = 500) {
642
- this.behaviors.require(MatterbridgeEnhancedColorControlServer.with(ColorControl.Feature.Xy, ColorControl.Feature.HueSaturation, ColorControl.Feature.EnhancedHue, ColorControl.Feature.ColorTemperature), {
642
+ this.behaviors.require(MatterbridgeColorControlServer.with(ColorControl.Feature.Xy, ColorControl.Feature.HueSaturation, ColorControl.Feature.EnhancedHue, ColorControl.Feature.ColorTemperature), {
643
643
  colorMode: ColorControl.ColorMode.CurrentHueAndCurrentSaturation,
644
644
  enhancedColorMode: ColorControl.EnhancedColorMode.EnhancedCurrentHueAndCurrentSaturation,
645
645
  colorCapabilities: { xy: true, hueSaturation: true, colorLoop: false, enhancedHue: true, colorTemperature: true },
@@ -893,7 +893,7 @@ export class MatterbridgeEndpoint extends Endpoint {
893
893
  return this;
894
894
  }
895
895
  createDefaultPresetsThermostatClusterServer(localTemperature = 23, occupiedHeatingSetpoint = 21, occupiedCoolingSetpoint = 25, minSetpointDeadBand = 0, minHeatSetpointLimit = 0, maxHeatSetpointLimit = 50, minCoolSetpointLimit = 0, maxCoolSetpointLimit = 50, unoccupiedHeatingSetpoint = undefined, unoccupiedCoolingSetpoint = undefined, occupied = undefined, outdoorTemperature = undefined, activePresetHandle = null, presetsList = undefined, presetTypes = undefined) {
896
- this.behaviors.require(MatterbridgePresetThermostatServer.with(Thermostat.Feature.Heating, Thermostat.Feature.Cooling, Thermostat.Feature.AutoMode, ...(occupied !== undefined ? [Thermostat.Feature.Occupancy] : []), Thermostat.Feature.Presets), {
896
+ this.behaviors.require(MatterbridgeThermostatServer.with(Thermostat.Feature.Heating, Thermostat.Feature.Cooling, Thermostat.Feature.AutoMode, ...(occupied !== undefined ? [Thermostat.Feature.Occupancy] : []), Thermostat.Feature.Presets), {
897
897
  localTemperature: localTemperature * 100,
898
898
  externalMeasuredIndoorTemperature: localTemperature * 100,
899
899
  ...(outdoorTemperature !== undefined ? { outdoorTemperature: outdoorTemperature !== null ? outdoorTemperature * 100 : outdoorTemperature } : {}),
@@ -1048,7 +1048,7 @@ export class MatterbridgeEndpoint extends Endpoint {
1048
1048
  return this;
1049
1049
  }
1050
1050
  createDefaultDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt) {
1051
- this.behaviors.require(MatterbridgeDoorLockServer.enable({ events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true } }), {
1051
+ this.behaviors.require(MatterbridgeDoorLockServer.with().enable({ events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true } }), {
1052
1052
  lockState,
1053
1053
  lockType,
1054
1054
  actuatorEnabled: true,
@@ -1058,6 +1058,26 @@ export class MatterbridgeEndpoint extends Endpoint {
1058
1058
  });
1059
1059
  return this;
1060
1060
  }
1061
+ createPinDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt) {
1062
+ this.behaviors.require(MatterbridgeDoorLockServer.with(DoorLock.Feature.PinCredential, DoorLock.Feature.CredentialOverTheAirAccess).enable({
1063
+ events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true },
1064
+ }), {
1065
+ lockState,
1066
+ lockType,
1067
+ actuatorEnabled: true,
1068
+ operatingMode: DoorLock.OperatingMode.Normal,
1069
+ supportedOperatingModes: { normal: false, vacation: true, privacy: true, noRemoteLockUnlock: false, passage: true, alwaysSet: 2047 },
1070
+ autoRelockTime: 0,
1071
+ numberOfPinUsersSupported: 10,
1072
+ minPinCodeLength: 4,
1073
+ maxPinCodeLength: 10,
1074
+ sendPinOverTheAir: true,
1075
+ requirePinForRemoteOperation: true,
1076
+ wrongCodeEntryLimit: 5,
1077
+ userCodeTemporaryDisableTime: 60,
1078
+ });
1079
+ return this;
1080
+ }
1061
1081
  createDefaultModeSelectClusterServer(description, supportedModes, currentMode = 0, startUpMode = 0) {
1062
1082
  this.behaviors.require(MatterbridgeModeSelectServer, {
1063
1083
  description: description,
@@ -71,6 +71,16 @@ export interface MatterbridgeEndpointCommands {
71
71
  setTarget: HandlerFunction;
72
72
  lockDoor: HandlerFunction;
73
73
  unlockDoor: HandlerFunction;
74
+ setPinCode: HandlerFunction;
75
+ getPinCode: HandlerFunction;
76
+ clearPinCode: HandlerFunction;
77
+ clearAllPinCodes: HandlerFunction;
78
+ setUser: HandlerFunction;
79
+ getUser: HandlerFunction;
80
+ clearUser: HandlerFunction;
81
+ setCredential: HandlerFunction;
82
+ getCredentialStatus: HandlerFunction;
83
+ clearCredential: HandlerFunction;
74
84
  setpointRaiseLower: HandlerFunction;
75
85
  setActivePresetRequest: HandlerFunction;
76
86
  step: HandlerFunction;
@@ -383,6 +393,16 @@ export type CommandHandlerDataMap = {
383
393
  };
384
394
  'lockDoor': CommandHandlerData<'DoorLock.lockDoor'>;
385
395
  'unlockDoor': CommandHandlerData<'DoorLock.unlockDoor'>;
396
+ 'setPinCode': CommandHandlerData<'DoorLock.setPinCode'>;
397
+ 'getPinCode': CommandHandlerData<'DoorLock.getPinCode'>;
398
+ 'clearPinCode': CommandHandlerData<'DoorLock.clearPinCode'>;
399
+ 'clearAllPinCodes': CommandHandlerData<'DoorLock.clearAllPinCodes'>;
400
+ 'setUser': CommandHandlerData<'DoorLock.setUser'>;
401
+ 'getUser': CommandHandlerData<'DoorLock.getUser'>;
402
+ 'clearUser': CommandHandlerData<'DoorLock.clearUser'>;
403
+ 'setCredential': CommandHandlerData<'DoorLock.setCredential'>;
404
+ 'getCredentialStatus': CommandHandlerData<'DoorLock.getCredentialStatus'>;
405
+ 'clearCredential': CommandHandlerData<'DoorLock.clearCredential'>;
386
406
  'DoorLock.lockDoor': {
387
407
  command: 'lockDoor';
388
408
  request: DoorLock.LockDoorRequest;
@@ -397,6 +417,76 @@ export type CommandHandlerDataMap = {
397
417
  attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
398
418
  endpoint: MatterbridgeEndpoint;
399
419
  };
420
+ 'DoorLock.setPinCode': {
421
+ command: 'setPinCode';
422
+ request: DoorLock.SetPinCodeRequest;
423
+ cluster: 'doorLock';
424
+ attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
425
+ endpoint: MatterbridgeEndpoint;
426
+ };
427
+ 'DoorLock.getPinCode': {
428
+ command: 'getPinCode';
429
+ request: DoorLock.GetPinCodeRequest;
430
+ cluster: 'doorLock';
431
+ attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
432
+ endpoint: MatterbridgeEndpoint;
433
+ };
434
+ 'DoorLock.clearPinCode': {
435
+ command: 'clearPinCode';
436
+ request: DoorLock.ClearPinCodeRequest;
437
+ cluster: 'doorLock';
438
+ attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
439
+ endpoint: MatterbridgeEndpoint;
440
+ };
441
+ 'DoorLock.clearAllPinCodes': {
442
+ command: 'clearAllPinCodes';
443
+ request: {};
444
+ cluster: 'doorLock';
445
+ attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
446
+ endpoint: MatterbridgeEndpoint;
447
+ };
448
+ 'DoorLock.setUser': {
449
+ command: 'setUser';
450
+ request: DoorLock.SetUserRequest;
451
+ cluster: 'doorLock';
452
+ attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
453
+ endpoint: MatterbridgeEndpoint;
454
+ };
455
+ 'DoorLock.getUser': {
456
+ command: 'getUser';
457
+ request: DoorLock.GetUserRequest;
458
+ cluster: 'doorLock';
459
+ attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
460
+ endpoint: MatterbridgeEndpoint;
461
+ };
462
+ 'DoorLock.clearUser': {
463
+ command: 'clearUser';
464
+ request: DoorLock.ClearUserRequest;
465
+ cluster: 'doorLock';
466
+ attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
467
+ endpoint: MatterbridgeEndpoint;
468
+ };
469
+ 'DoorLock.setCredential': {
470
+ command: 'setCredential';
471
+ request: DoorLock.SetCredentialRequest;
472
+ cluster: 'doorLock';
473
+ attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
474
+ endpoint: MatterbridgeEndpoint;
475
+ };
476
+ 'DoorLock.getCredentialStatus': {
477
+ command: 'getCredentialStatus';
478
+ request: DoorLock.GetCredentialStatusRequest;
479
+ cluster: 'doorLock';
480
+ attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
481
+ endpoint: MatterbridgeEndpoint;
482
+ };
483
+ 'DoorLock.clearCredential': {
484
+ command: 'clearCredential';
485
+ request: DoorLock.ClearCredentialRequest;
486
+ cluster: 'doorLock';
487
+ attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
488
+ endpoint: MatterbridgeEndpoint;
489
+ };
400
490
  'setpointRaiseLower': CommandHandlerData<'Thermostat.setpointRaiseLower'>;
401
491
  'setActivePresetRequest': CommandHandlerData<'Thermostat.setActivePresetRequest'>;
402
492
  'Thermostat.setpointRaiseLower': {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/core",
3
- "version": "3.7.1-dev-20260323-0a65511",
3
+ "version": "3.7.1-dev-20260324-9c29691",
4
4
  "description": "Matterbridge core library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -122,14 +122,14 @@
122
122
  ],
123
123
  "dependencies": {
124
124
  "@matter/main": "0.16.10",
125
- "@matterbridge/dgram": "3.7.1-dev-20260323-0a65511",
126
- "@matterbridge/thread": "3.7.1-dev-20260323-0a65511",
127
- "@matterbridge/types": "3.7.1-dev-20260323-0a65511",
128
- "@matterbridge/utils": "3.7.1-dev-20260323-0a65511",
125
+ "@matterbridge/dgram": "3.7.1-dev-20260324-9c29691",
126
+ "@matterbridge/thread": "3.7.1-dev-20260324-9c29691",
127
+ "@matterbridge/types": "3.7.1-dev-20260324-9c29691",
128
+ "@matterbridge/utils": "3.7.1-dev-20260324-9c29691",
129
129
  "express": "5.2.1",
130
130
  "multer": "2.1.1",
131
131
  "node-ansi-logger": "3.2.0",
132
132
  "node-persist-manager": "2.0.1",
133
- "ws": "8.19.0"
133
+ "ws": "8.20.0"
134
134
  }
135
135
  }