@matterbridge/core 3.10.7 → 3.10.8-dev-20260828-030e705

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.
@@ -7,13 +7,13 @@ declare const MatterbridgeDoorLockServer_base: import("@matter/node").ClusterBeh
7
7
  doorPositionSensor: false;
8
8
  faceCredentials: false;
9
9
  fingerCredentials: false;
10
- holidaySchedules: false;
10
+ holidaySchedules: true;
11
11
  pinCredential: true;
12
12
  rfidCredential: false;
13
13
  unbolting: false;
14
14
  user: true;
15
- weekDayAccessSchedules: false;
16
- yearDayAccessSchedules: false;
15
+ weekDayAccessSchedules: true;
16
+ yearDayAccessSchedules: true;
17
17
  }>, import("@matter/types").ClusterType.Concrete, typeof import("@matter/node/behaviors/door-lock").DoorLockBaseServer.Internal, "doorLock">, import("@matter/types").ClusterType.WithEnabledAttributes<import("@matter/types").ClusterType.WithEnabledEvents<import("@matter/types").ClusterType.WithSupportedFeatures<DoorLock, {
18
18
  aliroBleuwb: false;
19
19
  aliroProvisioning: false;
@@ -21,13 +21,13 @@ declare const MatterbridgeDoorLockServer_base: import("@matter/node").ClusterBeh
21
21
  doorPositionSensor: false;
22
22
  faceCredentials: false;
23
23
  fingerCredentials: false;
24
- holidaySchedules: false;
24
+ holidaySchedules: true;
25
25
  pinCredential: true;
26
26
  rfidCredential: false;
27
27
  unbolting: false;
28
28
  user: true;
29
- weekDayAccessSchedules: false;
30
- yearDayAccessSchedules: false;
29
+ weekDayAccessSchedules: true;
30
+ yearDayAccessSchedules: true;
31
31
  }>, "doorLockAlarm" | "lockOperation" | "lockOperationError">, never>, import("@matter/types").ClusterType.Concrete, typeof import("@matter/node/behaviors/door-lock").DoorLockBaseServer.Internal, "doorLock">;
32
32
  export declare class MatterbridgeDoorLockServer extends MatterbridgeDoorLockServer_base {
33
33
  initialize(): void;
@@ -40,5 +40,14 @@ export declare class MatterbridgeDoorLockServer extends MatterbridgeDoorLockServ
40
40
  setCredential(request: DoorLock.SetCredentialRequest): Promise<DoorLock.SetCredentialResponse>;
41
41
  getCredentialStatus(request: DoorLock.GetCredentialStatusRequest): Promise<DoorLock.GetCredentialStatusResponse>;
42
42
  clearCredential(request: DoorLock.ClearCredentialRequest): Promise<void>;
43
+ setWeekDaySchedule(request: DoorLock.SetWeekDayScheduleRequest): Promise<void>;
44
+ getWeekDaySchedule(request: DoorLock.GetWeekDayScheduleRequest): Promise<DoorLock.GetWeekDayScheduleResponse>;
45
+ clearWeekDaySchedule(request: DoorLock.ClearWeekDayScheduleRequest): Promise<void>;
46
+ setYearDaySchedule(request: DoorLock.SetYearDayScheduleRequest): Promise<void>;
47
+ getYearDaySchedule(request: DoorLock.GetYearDayScheduleRequest): Promise<DoorLock.GetYearDayScheduleResponse>;
48
+ clearYearDaySchedule(request: DoorLock.ClearYearDayScheduleRequest): Promise<void>;
49
+ setHolidaySchedule(request: DoorLock.SetHolidayScheduleRequest): Promise<void>;
50
+ getHolidaySchedule(request: DoorLock.GetHolidayScheduleRequest): Promise<DoorLock.GetHolidayScheduleResponse>;
51
+ clearHolidaySchedule(request: DoorLock.ClearHolidayScheduleRequest): Promise<void>;
43
52
  }
44
53
  export {};
@@ -2,22 +2,18 @@ import { DoorLockServer } from '@matter/node/behaviors/door-lock';
2
2
  import { DoorLock } from '@matter/types/clusters/door-lock';
3
3
  import { getEnumDescription } from '@matterbridge/utils/enum';
4
4
  import { MatterbridgeServer } from './matterbridgeServer.js';
5
- export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Feature.User, DoorLock.Feature.PinCredential).enable({
5
+ export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Feature.User, DoorLock.Feature.PinCredential, DoorLock.Feature.WeekDayAccessSchedules, DoorLock.Feature.YearDayAccessSchedules, DoorLock.Feature.HolidaySchedules).enable({
6
6
  events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true },
7
7
  commands: { lockDoor: true, unlockDoor: true, unlockWithTimeout: true },
8
8
  }) {
9
9
  initialize() {
10
10
  const device = this.endpoint.stateOf(MatterbridgeServer);
11
- device.log.info(`Initializing MatterbridgeDoorLockServer (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
11
+ device.log.info(`MatterbridgeDoorLockServer: initializing server (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
12
12
  super.initialize();
13
13
  }
14
14
  async lockDoor(request) {
15
15
  const device = this.endpoint.stateOf(MatterbridgeServer);
16
- if (!this.state.actuatorEnabled) {
17
- device.log.warn(`Actuator disabled, cannot lock door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
18
- return;
19
- }
20
- device.log.info(`Locking door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
16
+ device.log.info(`MatterbridgeDoorLockServer: locking door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
21
17
  await device.commandHandler.executeHandler('DoorLock.lockDoor', {
22
18
  command: 'lockDoor',
23
19
  request,
@@ -26,16 +22,16 @@ export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Fea
26
22
  endpoint: this.endpoint,
27
23
  context: this.context,
28
24
  });
29
- device.log.debug(`MatterbridgeDoorLockServer: lockDoor called`);
25
+ if (!this.state.actuatorEnabled) {
26
+ device.log.warn(`MatterbridgeDoorLockServer: actuator disabled, cannot lock door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
27
+ return;
28
+ }
29
+ device.log.debug(`MatterbridgeDoorLockServer: lockDoor called (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
30
30
  await super.lockDoor(request);
31
31
  }
32
32
  async unlockDoor(request) {
33
33
  const device = this.endpoint.stateOf(MatterbridgeServer);
34
- if (!this.state.actuatorEnabled) {
35
- device.log.warn(`Actuator disabled, cannot unlock door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
36
- return;
37
- }
38
- device.log.info(`Unlocking door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
34
+ device.log.info(`MatterbridgeDoorLockServer: unlocking door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
39
35
  await device.commandHandler.executeHandler('DoorLock.unlockDoor', {
40
36
  command: 'unlockDoor',
41
37
  request,
@@ -44,16 +40,16 @@ export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Fea
44
40
  endpoint: this.endpoint,
45
41
  context: this.context,
46
42
  });
47
- device.log.debug(`MatterbridgeDoorLockServer: unlockDoor called ${this.state.autoRelockTime ? 'with ' + this.state.autoRelockTime + ' seconds' : 'without'} autoRelockTime`);
43
+ if (!this.state.actuatorEnabled) {
44
+ device.log.warn(`MatterbridgeDoorLockServer: actuator disabled, cannot unlock door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
45
+ return;
46
+ }
47
+ device.log.debug(`MatterbridgeDoorLockServer: unlockDoor called ${this.state.autoRelockTime ? 'with ' + this.state.autoRelockTime + ' seconds' : 'without'} autoRelockTime (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
48
48
  await super.unlockDoor(request);
49
49
  }
50
50
  async unlockWithTimeout(request) {
51
51
  const device = this.endpoint.stateOf(MatterbridgeServer);
52
- if (!this.state.actuatorEnabled) {
53
- device.log.warn(`Actuator disabled, cannot unlock door with timeout (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
54
- return;
55
- }
56
- device.log.info(`Unlocking door with timeout ${request.timeout} seconds (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
52
+ device.log.info(`MatterbridgeDoorLockServer: unlocking door with timeout ${request.timeout} seconds (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
57
53
  await device.commandHandler.executeHandler('DoorLock.unlockWithTimeout', {
58
54
  command: 'unlockWithTimeout',
59
55
  request,
@@ -62,12 +58,16 @@ export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Fea
62
58
  endpoint: this.endpoint,
63
59
  context: this.context,
64
60
  });
65
- device.log.debug(`MatterbridgeDoorLockServer: unlockWithTimeout called`);
61
+ if (!this.state.actuatorEnabled) {
62
+ device.log.warn(`MatterbridgeDoorLockServer: actuator disabled, cannot unlock door with timeout (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
63
+ return;
64
+ }
65
+ device.log.debug(`MatterbridgeDoorLockServer: unlockWithTimeout called (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
66
66
  await super.unlockWithTimeout(request);
67
67
  }
68
68
  async setUser(request) {
69
69
  const device = this.endpoint.stateOf(MatterbridgeServer);
70
- device.log.info(`Setting user operationType ${getEnumDescription(DoorLock.DataOperationType, request.operationType)} userIndex ${request.userIndex} userName ${request.userName ?? 'null'} userUniqueId ${request.userUniqueId ?? 'null'} userStatus ${getEnumDescription(DoorLock.UserStatus, request.userStatus, { fallback: 'null' })} userType ${getEnumDescription(DoorLock.UserType, request.userType, { fallback: 'null' })} credentialRule ${getEnumDescription(DoorLock.CredentialRule, request.credentialRule, { fallback: 'null' })} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
70
+ device.log.info(`MatterbridgeDoorLockServer: setting user operationType ${getEnumDescription(DoorLock.DataOperationType, request.operationType)} userIndex ${request.userIndex} userName ${request.userName ?? 'null'} userUniqueId ${request.userUniqueId ?? 'null'} userStatus ${getEnumDescription(DoorLock.UserStatus, request.userStatus, { fallback: 'null' })} userType ${getEnumDescription(DoorLock.UserType, request.userType, { fallback: 'null' })} credentialRule ${getEnumDescription(DoorLock.CredentialRule, request.credentialRule, { fallback: 'null' })} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
71
71
  await device.commandHandler.executeHandler('DoorLock.setUser', {
72
72
  command: 'setUser',
73
73
  request,
@@ -76,12 +76,12 @@ export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Fea
76
76
  endpoint: this.endpoint,
77
77
  context: this.context,
78
78
  });
79
- device.log.debug(`MatterbridgeDoorLockServer: setUser called for userIndex ${request.userIndex}`);
79
+ device.log.debug(`MatterbridgeDoorLockServer: setUser called for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
80
80
  await super.setUser(request);
81
81
  }
82
82
  async getUser(request) {
83
83
  const device = this.endpoint.stateOf(MatterbridgeServer);
84
- device.log.info(`Getting userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
84
+ device.log.info(`MatterbridgeDoorLockServer: getting userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
85
85
  const response = await device.commandHandler.executeHandler('DoorLock.getUser', {
86
86
  command: 'getUser',
87
87
  request,
@@ -93,12 +93,12 @@ export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Fea
93
93
  if (response !== undefined) {
94
94
  return response;
95
95
  }
96
- device.log.debug(`MatterbridgeDoorLockServer: getUser called for userIndex ${request.userIndex}`);
96
+ device.log.debug(`MatterbridgeDoorLockServer: getUser called for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
97
97
  return await super.getUser(request);
98
98
  }
99
99
  async clearUser(request) {
100
100
  const device = this.endpoint.stateOf(MatterbridgeServer);
101
- device.log.info(`Clearing userIndex ${request.userIndex} ${request.userIndex === 0xfffe ? '(all users)' : ''} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
101
+ device.log.info(`MatterbridgeDoorLockServer: clearing userIndex ${request.userIndex} ${request.userIndex === 0xfffe ? '(all users)' : ''} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
102
102
  await device.commandHandler.executeHandler('DoorLock.clearUser', {
103
103
  command: 'clearUser',
104
104
  request,
@@ -107,12 +107,12 @@ export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Fea
107
107
  endpoint: this.endpoint,
108
108
  context: this.context,
109
109
  });
110
- device.log.debug(`MatterbridgeDoorLockServer: clearUser called for userIndex ${request.userIndex}`);
110
+ device.log.debug(`MatterbridgeDoorLockServer: clearUser called for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
111
111
  await super.clearUser(request);
112
112
  }
113
113
  async setCredential(request) {
114
114
  const device = this.endpoint.stateOf(MatterbridgeServer);
115
- device.log.info(`Setting credential operationType ${getEnumDescription(DoorLock.DataOperationType, request.operationType)} credentialType ${getEnumDescription(DoorLock.CredentialType, request.credential.credentialType)} credentialIndex ${request.credential.credentialIndex} credentialData ${Buffer.from(request.credentialData).toString('hex') ? '0x' + Buffer.from(request.credentialData).toString('hex') : '0x'} userIndex ${request.userIndex ?? 'null'} userStatus ${getEnumDescription(DoorLock.UserStatus, request.userStatus, { fallback: 'null' })} userType ${getEnumDescription(DoorLock.UserType, request.userType, { fallback: 'null' })} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
115
+ device.log.info(`MatterbridgeDoorLockServer: setting credential operationType ${getEnumDescription(DoorLock.DataOperationType, request.operationType)} credentialType ${getEnumDescription(DoorLock.CredentialType, request.credential.credentialType)} credentialIndex ${request.credential.credentialIndex} credentialData ${Buffer.from(request.credentialData).toString('hex') ? '0x' + Buffer.from(request.credentialData).toString('hex') : '0x'} userIndex ${request.userIndex ?? 'null'} userStatus ${getEnumDescription(DoorLock.UserStatus, request.userStatus, { fallback: 'null' })} userType ${getEnumDescription(DoorLock.UserType, request.userType, { fallback: 'null' })} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
116
116
  await device.commandHandler.executeHandler('DoorLock.setCredential', {
117
117
  command: 'setCredential',
118
118
  request,
@@ -121,12 +121,19 @@ export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Fea
121
121
  endpoint: this.endpoint,
122
122
  context: this.context,
123
123
  });
124
- device.log.debug(`MatterbridgeDoorLockServer: setCredential called for userIndex ${request.userIndex}`);
124
+ device.log.debug(`MatterbridgeDoorLockServer: setCredential called for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
125
+ const auth = this.auth;
126
+ if (auth.isDuplicateCredential(request.credential.credentialType, request.credentialData, request.credential.credentialIndex)) {
127
+ throw new DoorLock.DuplicateError(`MatterbridgeDoorLockServer: credential data duplicates another credential of the same type (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
128
+ }
129
+ if (request.operationType === DoorLock.DataOperationType.Add && auth.findCredential(request.credential.credentialType, request.credential.credentialIndex)) {
130
+ throw new DoorLock.OccupiedError(`MatterbridgeDoorLockServer: add operation targets an occupied credential index (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
131
+ }
125
132
  return await super.setCredential(request);
126
133
  }
127
134
  async getCredentialStatus(request) {
128
135
  const device = this.endpoint.stateOf(MatterbridgeServer);
129
- device.log.info(`Getting credential status for credentialType ${getEnumDescription(DoorLock.CredentialType, request.credential.credentialType)} credentialIndex ${request.credential.credentialIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
136
+ device.log.info(`MatterbridgeDoorLockServer: getting credential status for credentialType ${getEnumDescription(DoorLock.CredentialType, request.credential.credentialType)} credentialIndex ${request.credential.credentialIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
130
137
  await device.commandHandler.executeHandler('DoorLock.getCredentialStatus', {
131
138
  command: 'getCredentialStatus',
132
139
  request,
@@ -135,12 +142,12 @@ export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Fea
135
142
  endpoint: this.endpoint,
136
143
  context: this.context,
137
144
  });
138
- device.log.debug(`MatterbridgeDoorLockServer: getCredentialStatus called`);
145
+ device.log.debug(`MatterbridgeDoorLockServer: getCredentialStatus called (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
139
146
  return await super.getCredentialStatus(request);
140
147
  }
141
148
  async clearCredential(request) {
142
149
  const device = this.endpoint.stateOf(MatterbridgeServer);
143
- device.log.info(`Clearing credentialType ${request.credential ? getEnumDescription(DoorLock.CredentialType, request.credential.credentialType) : 'null'} credentialIndex ${request.credential ? request.credential.credentialIndex : 'null'} ${request.credential === null ? '(all credentials)' : ''} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
150
+ device.log.info(`MatterbridgeDoorLockServer: clearing credentialType ${request.credential ? getEnumDescription(DoorLock.CredentialType, request.credential.credentialType) : 'null'} credentialIndex ${request.credential ? request.credential.credentialIndex : 'null'} ${request.credential === null ? '(all credentials)' : ''} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
144
151
  await device.commandHandler.executeHandler('DoorLock.clearCredential', {
145
152
  command: 'clearCredential',
146
153
  request,
@@ -149,7 +156,139 @@ export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Fea
149
156
  endpoint: this.endpoint,
150
157
  context: this.context,
151
158
  });
152
- device.log.debug('MatterbridgeDoorLockServer: clearCredential called');
159
+ device.log.debug(`MatterbridgeDoorLockServer: clearCredential called (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
153
160
  await super.clearCredential(request);
154
161
  }
162
+ async setWeekDaySchedule(request) {
163
+ const device = this.endpoint.stateOf(MatterbridgeServer);
164
+ device.log.info(`MatterbridgeDoorLockServer: setting week day schedule index ${request.weekDayIndex} for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
165
+ await device.commandHandler.executeHandler('DoorLock.setWeekDaySchedule', {
166
+ command: 'setWeekDaySchedule',
167
+ request,
168
+ cluster: DoorLockServer.id,
169
+ attributes: this.state,
170
+ endpoint: this.endpoint,
171
+ context: this.context,
172
+ });
173
+ device.log.debug(`MatterbridgeDoorLockServer: setWeekDaySchedule called for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
174
+ await super.setWeekDaySchedule(request);
175
+ }
176
+ async getWeekDaySchedule(request) {
177
+ const device = this.endpoint.stateOf(MatterbridgeServer);
178
+ device.log.info(`MatterbridgeDoorLockServer: getting week day schedule index ${request.weekDayIndex} for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
179
+ const response = await device.commandHandler.executeHandler('DoorLock.getWeekDaySchedule', {
180
+ command: 'getWeekDaySchedule',
181
+ request,
182
+ cluster: DoorLockServer.id,
183
+ attributes: this.state,
184
+ endpoint: this.endpoint,
185
+ context: this.context,
186
+ });
187
+ if (response !== undefined)
188
+ return response;
189
+ device.log.debug(`MatterbridgeDoorLockServer: getWeekDaySchedule called for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
190
+ return await super.getWeekDaySchedule(request);
191
+ }
192
+ async clearWeekDaySchedule(request) {
193
+ const device = this.endpoint.stateOf(MatterbridgeServer);
194
+ device.log.info(`MatterbridgeDoorLockServer: clearing week day schedule index ${request.weekDayIndex} for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
195
+ await device.commandHandler.executeHandler('DoorLock.clearWeekDaySchedule', {
196
+ command: 'clearWeekDaySchedule',
197
+ request,
198
+ cluster: DoorLockServer.id,
199
+ attributes: this.state,
200
+ endpoint: this.endpoint,
201
+ context: this.context,
202
+ });
203
+ device.log.debug(`MatterbridgeDoorLockServer: clearWeekDaySchedule called for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
204
+ await super.clearWeekDaySchedule(request);
205
+ }
206
+ async setYearDaySchedule(request) {
207
+ const device = this.endpoint.stateOf(MatterbridgeServer);
208
+ device.log.info(`MatterbridgeDoorLockServer: setting year day schedule index ${request.yearDayIndex} for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
209
+ await device.commandHandler.executeHandler('DoorLock.setYearDaySchedule', {
210
+ command: 'setYearDaySchedule',
211
+ request,
212
+ cluster: DoorLockServer.id,
213
+ attributes: this.state,
214
+ endpoint: this.endpoint,
215
+ context: this.context,
216
+ });
217
+ device.log.debug(`MatterbridgeDoorLockServer: setYearDaySchedule called for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
218
+ await super.setYearDaySchedule(request);
219
+ }
220
+ async getYearDaySchedule(request) {
221
+ const device = this.endpoint.stateOf(MatterbridgeServer);
222
+ device.log.info(`MatterbridgeDoorLockServer: getting year day schedule index ${request.yearDayIndex} for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
223
+ const response = await device.commandHandler.executeHandler('DoorLock.getYearDaySchedule', {
224
+ command: 'getYearDaySchedule',
225
+ request,
226
+ cluster: DoorLockServer.id,
227
+ attributes: this.state,
228
+ endpoint: this.endpoint,
229
+ context: this.context,
230
+ });
231
+ if (response !== undefined)
232
+ return response;
233
+ device.log.debug(`MatterbridgeDoorLockServer: getYearDaySchedule called for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
234
+ return await super.getYearDaySchedule(request);
235
+ }
236
+ async clearYearDaySchedule(request) {
237
+ const device = this.endpoint.stateOf(MatterbridgeServer);
238
+ device.log.info(`MatterbridgeDoorLockServer: clearing year day schedule index ${request.yearDayIndex} for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
239
+ await device.commandHandler.executeHandler('DoorLock.clearYearDaySchedule', {
240
+ command: 'clearYearDaySchedule',
241
+ request,
242
+ cluster: DoorLockServer.id,
243
+ attributes: this.state,
244
+ endpoint: this.endpoint,
245
+ context: this.context,
246
+ });
247
+ device.log.debug(`MatterbridgeDoorLockServer: clearYearDaySchedule called for userIndex ${request.userIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
248
+ await super.clearYearDaySchedule(request);
249
+ }
250
+ async setHolidaySchedule(request) {
251
+ const device = this.endpoint.stateOf(MatterbridgeServer);
252
+ device.log.info(`MatterbridgeDoorLockServer: setting holiday schedule index ${request.holidayIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
253
+ await device.commandHandler.executeHandler('DoorLock.setHolidaySchedule', {
254
+ command: 'setHolidaySchedule',
255
+ request,
256
+ cluster: DoorLockServer.id,
257
+ attributes: this.state,
258
+ endpoint: this.endpoint,
259
+ context: this.context,
260
+ });
261
+ device.log.debug(`MatterbridgeDoorLockServer: setHolidaySchedule called for holidayIndex ${request.holidayIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
262
+ await super.setHolidaySchedule(request);
263
+ }
264
+ async getHolidaySchedule(request) {
265
+ const device = this.endpoint.stateOf(MatterbridgeServer);
266
+ device.log.info(`MatterbridgeDoorLockServer: getting holiday schedule index ${request.holidayIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
267
+ const response = await device.commandHandler.executeHandler('DoorLock.getHolidaySchedule', {
268
+ command: 'getHolidaySchedule',
269
+ request,
270
+ cluster: DoorLockServer.id,
271
+ attributes: this.state,
272
+ endpoint: this.endpoint,
273
+ context: this.context,
274
+ });
275
+ if (response !== undefined)
276
+ return response;
277
+ device.log.debug(`MatterbridgeDoorLockServer: getHolidaySchedule called for holidayIndex ${request.holidayIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
278
+ return await super.getHolidaySchedule(request);
279
+ }
280
+ async clearHolidaySchedule(request) {
281
+ const device = this.endpoint.stateOf(MatterbridgeServer);
282
+ device.log.info(`MatterbridgeDoorLockServer: clearing holiday schedule index ${request.holidayIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
283
+ await device.commandHandler.executeHandler('DoorLock.clearHolidaySchedule', {
284
+ command: 'clearHolidaySchedule',
285
+ request,
286
+ cluster: DoorLockServer.id,
287
+ attributes: this.state,
288
+ endpoint: this.endpoint,
289
+ context: this.context,
290
+ });
291
+ device.log.debug(`MatterbridgeDoorLockServer: clearHolidaySchedule called for holidayIndex ${request.holidayIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
292
+ await super.clearHolidaySchedule(request);
293
+ }
155
294
  }
@@ -4,10 +4,10 @@ export class MatterbridgePowerSourceServer extends PowerSourceServer {
4
4
  async initialize() {
5
5
  await super.initialize();
6
6
  const device = this.endpoint.stateOf(MatterbridgeServer);
7
- device.log.info(`Initializing MatterbridgePowerSourceServer (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
7
+ device.log.info(`MatterbridgePowerSourceServer: initializing (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
8
8
  this.state.endpointList = [this.endpoint.number];
9
9
  this.endpoint.construction.onSuccess(async () => {
10
- device.log.debug(`MatterbridgePowerSourceServer: endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber} construction completed`);
10
+ device.log.debug(`MatterbridgePowerSourceServer: construction completed (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
11
11
  const endpointList = [this.endpoint.number];
12
12
  for (const endpoint of this.endpoint.parts) {
13
13
  if (endpoint.lifecycle.isReady) {
@@ -15,7 +15,7 @@ export class MatterbridgePowerSourceServer extends PowerSourceServer {
15
15
  }
16
16
  }
17
17
  await this.endpoint.setStateOf(PowerSourceServer, { endpointList });
18
- device.log.debug(`MatterbridgePowerSourceServer: endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber} construction completed with endpointList: ${endpointList.join(', ')}`);
18
+ device.log.debug(`MatterbridgePowerSourceServer: construction completed with endpointList ${endpointList.join(', ')} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
19
19
  });
20
20
  }
21
21
  }
package/dist/cli.js CHANGED
@@ -166,6 +166,7 @@ function help() {
166
166
  --nosudo: force not to use sudo to install or update packages if the internal logic fails
167
167
  --norestore: force not to automatically restore the matterbridge node storage and the matter storage from backup if it is corrupted
168
168
  --novirtual: disable the creation of the virtual devices Restart, Update and Reboot Matterbridge
169
+ --root-power-source: add a Power Source cluster for the mains power feed on the Root endpoint
169
170
  --ssl: enable SSL for the frontend and the WebSocketServer (the server will use the certificates and switch to https)
170
171
  --mtls: enable mTLS for the frontend and the WebSocketServer (both server and client will use and require the certificates and switch to https)
171
172
  --vendorId: override the default vendorId 0xfff1
@@ -2,6 +2,7 @@ import { readFile, writeFile } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { ClosureTag, ClosureWindowTag, CommodityTariffChronologyTag, CommodityTariffCommodityTag, CommodityTariffFlowTag, CommonNumberTag, CommonPositionTag, ElectricalMeasurementTag, PowerSourceTag, RefrigeratorTag, } from '@matter/node';
4
4
  import { AirQuality } from '@matter/types/clusters/air-quality';
5
+ import { DoorLock } from '@matter/types/clusters/door-lock';
5
6
  import { FanControl } from '@matter/types/clusters/fan-control';
6
7
  import { PowerSource } from '@matter/types/clusters/power-source';
7
8
  import { PowerTopology } from '@matter/types/clusters/power-topology';
@@ -145,7 +146,7 @@ export async function createDemoDevices(matterbridge) {
145
146
  type: demoPluginType,
146
147
  version: demoPluginVersion,
147
148
  description: 'Matterbridge demo devices',
148
- author: 'Matterbridge',
149
+ author: 'https://github.com/Luligu',
149
150
  enabled: false,
150
151
  private: true,
151
152
  registeredDevices: 0,
@@ -336,6 +337,14 @@ export async function createDemoDevices(matterbridge) {
336
337
  ep = new MatterbridgeEndpoint([getSupportedDeviceType('DoorLock'), bridgedNode, powerSource], { id: 'DoorLock', number: EndpointNumber(8_01) });
337
338
  ep.createDefaultPowerSourceBatteryClusterServer();
338
339
  await registerDevice(ep, 'Door Lock', 'ENTRY-08-01');
340
+ ep = new MatterbridgeEndpoint([getSupportedDeviceType('DoorLock'), bridgedNode, powerSource], { id: 'DoorLockUserPin', number: EndpointNumber(8_01_1) });
341
+ ep.createDefaultPowerSourceBatteryClusterServer();
342
+ ep.createUserPinDoorLockClusterServer();
343
+ await registerDevice(ep, 'Door Lock User PIN', 'ENTRY-08-01-1');
344
+ ep = new MatterbridgeEndpoint([getSupportedDeviceType('DoorLock'), bridgedNode, powerSource], { id: 'DoorLockUserPinSchedules', number: EndpointNumber(8_01_2) });
345
+ ep.createDefaultPowerSourceBatteryClusterServer();
346
+ ep.createUserPinDoorLockClusterServer(DoorLock.LockState.Locked, DoorLock.LockType.DeadBolt, 0, 4, 10, 2, 3, 4);
347
+ await registerDevice(ep, 'Door Lock User PIN Schedules', 'ENTRY-08-01-2');
339
348
  ep = new MatterbridgeEndpoint([getSupportedDeviceType('DoorLockController'), bridgedNode, powerSource], { id: 'DoorLockController', number: EndpointNumber(8_02) });
340
349
  await registerDevice(ep, 'Door Lock Controller', 'ENTRY-08-02');
341
350
  ep = new MatterbridgeEndpoint([getSupportedDeviceType('WindowCovering'), bridgedNode, powerSource], { id: 'WindowCovering', number: EndpointNumber(8_03) });
@@ -407,7 +407,8 @@ export class MatterNode extends EventEmitter {
407
407
  this.log.warn(`Invalid discriminator ${discriminator} for server node ${storeId}. Discriminator must be between 0 and 4095 (0xFFF). Generating a random discriminator...`);
408
408
  discriminator = PaseClient.generateRandomDiscriminator(this.environment.get(Crypto));
409
409
  }
410
- const serverNode = await ServerNode.create(ServerNode.RootEndpoint.with(PowerSourceServer.with(PowerSource.Feature.Wired)), {
410
+ const rootEndpoint = hasParameter('root-power-source') ? ServerNode.RootEndpoint.with(PowerSourceServer.with(PowerSource.Feature.Wired)) : ServerNode.RootEndpoint;
411
+ const serverNode = await ServerNode.create(rootEndpoint, {
411
412
  id: storeId,
412
413
  environment: this.environment,
413
414
  network: {
@@ -447,13 +448,17 @@ export class MatterNode extends EventEmitter {
447
448
  configurationVersion: await this.matterStorageContext.get('configurationVersion'),
448
449
  reachable: true,
449
450
  },
450
- powerSource: {
451
- status: PowerSource.PowerSourceStatus.Active,
452
- order: 0,
453
- description: 'AC Power',
454
- endpointList: [],
455
- wiredCurrentType: PowerSource.WiredCurrentType.Ac,
456
- },
451
+ ...(hasParameter('root-power-source')
452
+ ? {
453
+ powerSource: {
454
+ status: PowerSource.PowerSourceStatus.Active,
455
+ order: 0,
456
+ description: 'AC Power',
457
+ endpointList: [],
458
+ wiredCurrentType: PowerSource.WiredCurrentType.Ac,
459
+ },
460
+ }
461
+ : {}),
457
462
  });
458
463
  serverNode.lifecycle.commissioned.on(() => {
459
464
  this.log.notice(`Server node for ${storeId} was initially commissioned successfully!`);
@@ -1893,7 +1893,7 @@ export class Matterbridge extends EventEmitter {
1893
1893
  this.log.warn(`Invalid discriminator ${discriminator} for server node ${storeId}. Discriminator must be between 0 and 4095 (0xFFF). Generating a random discriminator...`);
1894
1894
  discriminator = PaseClient.generateRandomDiscriminator(this.environment.get(Crypto));
1895
1895
  }
1896
- let rootEndpoint = ServerNode.RootEndpoint.with(PowerSourceServer.with(PowerSource.Feature.Wired));
1896
+ let rootEndpoint = hasParameter('root-power-source') ? ServerNode.RootEndpoint.with(PowerSourceServer.with(PowerSource.Feature.Wired)) : ServerNode.RootEndpoint;
1897
1897
  if (process.env.MATTERBRIDGE_CHIP_TEST && fs.existsSync(path.join(path.dirname(fileURLToPath(import.meta.url)), 'chipTests.js'))) {
1898
1898
  this.log.warn(' ****************************************************************************************');
1899
1899
  this.log.warn(' * MATTERBRIDGE_CHIP_TEST environment variable is set. Running TestEventTrigger server. *');
@@ -1939,13 +1939,17 @@ export class Matterbridge extends EventEmitter {
1939
1939
  configurationVersion: await storageContext.get('configurationVersion'),
1940
1940
  reachable: true,
1941
1941
  },
1942
- powerSource: {
1943
- status: PowerSource.PowerSourceStatus.Active,
1944
- order: 0,
1945
- description: 'AC Power',
1946
- endpointList: [],
1947
- wiredCurrentType: PowerSource.WiredCurrentType.Ac,
1948
- },
1942
+ ...(hasParameter('root-power-source')
1943
+ ? {
1944
+ powerSource: {
1945
+ status: PowerSource.PowerSourceStatus.Active,
1946
+ order: 0,
1947
+ description: 'AC Power',
1948
+ endpointList: [],
1949
+ wiredCurrentType: PowerSource.WiredCurrentType.Ac,
1950
+ },
1951
+ }
1952
+ : {}),
1949
1953
  });
1950
1954
  serverNode.lifecycle.commissioned.on(() => {
1951
1955
  this.log.notice(`Server node for ${storeId} commissioned successfully!`);
@@ -204,8 +204,8 @@ export declare class MatterbridgeEndpoint extends Endpoint {
204
204
  }, airflowDirection?: FanControl.AirflowDirection): this;
205
205
  createDefaultHepaFilterMonitoringClusterServer(condition?: number, changeIndication?: ResourceMonitoring.ChangeIndication, inPlaceIndicator?: boolean | undefined, lastChangedTime?: number | null | undefined, replacementProductList?: ResourceMonitoring.ReplacementProduct[]): this;
206
206
  createDefaultActivatedCarbonFilterMonitoringClusterServer(condition?: number, changeIndication?: ResourceMonitoring.ChangeIndication, inPlaceIndicator?: boolean | undefined, lastChangedTime?: number | null | undefined, replacementProductList?: ResourceMonitoring.ReplacementProduct[]): this;
207
- createDefaultDoorLockClusterServer(lockState?: DoorLock.LockState, lockType?: DoorLock.LockType, autoRelockTime?: number): this;
208
- createUserPinDoorLockClusterServer(lockState?: DoorLock.LockState, lockType?: DoorLock.LockType, autoRelockTime?: number, minPinCodeLength?: number, maxPinCodeLength?: number): this;
207
+ createDefaultDoorLockClusterServer(lockState?: DoorLock.LockState, lockType?: DoorLock.LockType, autoRelockTime?: number, numberOfWeekDaySchedulesSupportedPerUser?: number, numberOfYearDaySchedulesSupportedPerUser?: number, numberOfHolidaySchedulesSupported?: number): this;
208
+ createUserPinDoorLockClusterServer(lockState?: DoorLock.LockState, lockType?: DoorLock.LockType, autoRelockTime?: number, minPinCodeLength?: number, maxPinCodeLength?: number, numberOfWeekDaySchedulesSupportedPerUser?: number, numberOfYearDaySchedulesSupportedPerUser?: number, numberOfHolidaySchedulesSupported?: number): this;
209
209
  createDefaultModeSelectClusterServer(description: string, supportedModes: ModeSelect.ModeOption[], currentMode?: number, startUpMode?: number): this;
210
210
  createDefaultValveConfigurationAndControlClusterServer(valveState?: ValveConfigurationAndControl.ValveState, valveLevel?: number, movementDuration?: number, autoClose?: boolean): this;
211
211
  createDefaultPumpConfigurationAndControlClusterServer(pumpMode?: PumpConfigurationAndControl.OperationMode, maxPressure?: number | null, maxSpeed?: number | null, maxFlow?: number | null, minConstSpeed?: number | null, maxConstSpeed?: number | null, speed?: number | null): this;
@@ -1254,8 +1254,8 @@ export class MatterbridgeEndpoint extends Endpoint {
1254
1254
  });
1255
1255
  return this;
1256
1256
  }
1257
- createDefaultDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt, autoRelockTime = 0) {
1258
- this.behaviors.require(MatterbridgeDoorLockServer.with().enable({
1257
+ createDefaultDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt, autoRelockTime = 0, numberOfWeekDaySchedulesSupportedPerUser, numberOfYearDaySchedulesSupportedPerUser, numberOfHolidaySchedulesSupported) {
1258
+ this.behaviors.require(MatterbridgeDoorLockServer.with(...(numberOfWeekDaySchedulesSupportedPerUser !== undefined ? [DoorLock.Feature.WeekDayAccessSchedules] : []), ...(numberOfYearDaySchedulesSupportedPerUser !== undefined ? [DoorLock.Feature.YearDayAccessSchedules] : []), ...(numberOfHolidaySchedulesSupported !== undefined ? [DoorLock.Feature.HolidaySchedules] : [])).enable({
1259
1259
  events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true },
1260
1260
  commands: { lockDoor: true, unlockDoor: true, unlockWithTimeout: true },
1261
1261
  }), {
@@ -1265,11 +1265,14 @@ export class MatterbridgeEndpoint extends Endpoint {
1265
1265
  operatingMode: DoorLock.OperatingMode.Normal,
1266
1266
  supportedOperatingModes: { normal: false, vacation: true, privacy: true, noRemoteLockUnlock: false, passage: true, alwaysSet: 2047 },
1267
1267
  autoRelockTime,
1268
+ ...(numberOfWeekDaySchedulesSupportedPerUser !== undefined ? { numberOfWeekDaySchedulesSupportedPerUser } : {}),
1269
+ ...(numberOfYearDaySchedulesSupportedPerUser !== undefined ? { numberOfYearDaySchedulesSupportedPerUser } : {}),
1270
+ ...(numberOfHolidaySchedulesSupported !== undefined ? { numberOfHolidaySchedulesSupported } : {}),
1268
1271
  });
1269
1272
  return this;
1270
1273
  }
1271
- createUserPinDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt, autoRelockTime = 0, minPinCodeLength = 4, maxPinCodeLength = 10) {
1272
- this.behaviors.require(MatterbridgeDoorLockServer.with(DoorLock.Feature.User, DoorLock.Feature.PinCredential).enable({
1274
+ createUserPinDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt, autoRelockTime = 0, minPinCodeLength = 4, maxPinCodeLength = 10, numberOfWeekDaySchedulesSupportedPerUser, numberOfYearDaySchedulesSupportedPerUser, numberOfHolidaySchedulesSupported) {
1275
+ this.behaviors.require(MatterbridgeDoorLockServer.with(DoorLock.Feature.User, DoorLock.Feature.PinCredential, ...(numberOfWeekDaySchedulesSupportedPerUser !== undefined ? [DoorLock.Feature.WeekDayAccessSchedules] : []), ...(numberOfYearDaySchedulesSupportedPerUser !== undefined ? [DoorLock.Feature.YearDayAccessSchedules] : []), ...(numberOfHolidaySchedulesSupported !== undefined ? [DoorLock.Feature.HolidaySchedules] : [])).enable({
1273
1276
  events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true },
1274
1277
  commands: { lockDoor: true, unlockDoor: true, unlockWithTimeout: true },
1275
1278
  }), {
@@ -1287,6 +1290,9 @@ export class MatterbridgeEndpoint extends Endpoint {
1287
1290
  numberOfTotalUsersSupported: 10,
1288
1291
  credentialRulesSupport: { single: true },
1289
1292
  numberOfCredentialsSupportedPerUser: 10,
1293
+ ...(numberOfWeekDaySchedulesSupportedPerUser !== undefined ? { numberOfWeekDaySchedulesSupportedPerUser } : {}),
1294
+ ...(numberOfYearDaySchedulesSupportedPerUser !== undefined ? { numberOfYearDaySchedulesSupportedPerUser } : {}),
1295
+ ...(numberOfHolidaySchedulesSupported !== undefined ? { numberOfHolidaySchedulesSupported } : {}),
1290
1296
  });
1291
1297
  return this;
1292
1298
  }
@@ -465,6 +465,69 @@ export type CommandHandlerDataMap = {
465
465
  attributes: ClusterAttributeValues<(typeof DoorLock)['attributes']>;
466
466
  endpoint: MatterbridgeEndpoint;
467
467
  };
468
+ 'DoorLock.setWeekDaySchedule': {
469
+ command: 'setWeekDaySchedule';
470
+ request: DoorLock.SetWeekDayScheduleRequest;
471
+ cluster: 'doorLock';
472
+ attributes: ClusterAttributeValues<(typeof DoorLock)['attributes']>;
473
+ endpoint: MatterbridgeEndpoint;
474
+ };
475
+ 'DoorLock.getWeekDaySchedule': {
476
+ command: 'getWeekDaySchedule';
477
+ request: DoorLock.GetWeekDayScheduleRequest;
478
+ cluster: 'doorLock';
479
+ attributes: ClusterAttributeValues<(typeof DoorLock)['attributes']>;
480
+ endpoint: MatterbridgeEndpoint;
481
+ };
482
+ 'DoorLock.clearWeekDaySchedule': {
483
+ command: 'clearWeekDaySchedule';
484
+ request: DoorLock.ClearWeekDayScheduleRequest;
485
+ cluster: 'doorLock';
486
+ attributes: ClusterAttributeValues<(typeof DoorLock)['attributes']>;
487
+ endpoint: MatterbridgeEndpoint;
488
+ };
489
+ 'DoorLock.setYearDaySchedule': {
490
+ command: 'setYearDaySchedule';
491
+ request: DoorLock.SetYearDayScheduleRequest;
492
+ cluster: 'doorLock';
493
+ attributes: ClusterAttributeValues<(typeof DoorLock)['attributes']>;
494
+ endpoint: MatterbridgeEndpoint;
495
+ };
496
+ 'DoorLock.getYearDaySchedule': {
497
+ command: 'getYearDaySchedule';
498
+ request: DoorLock.GetYearDayScheduleRequest;
499
+ cluster: 'doorLock';
500
+ attributes: ClusterAttributeValues<(typeof DoorLock)['attributes']>;
501
+ endpoint: MatterbridgeEndpoint;
502
+ };
503
+ 'DoorLock.clearYearDaySchedule': {
504
+ command: 'clearYearDaySchedule';
505
+ request: DoorLock.ClearYearDayScheduleRequest;
506
+ cluster: 'doorLock';
507
+ attributes: ClusterAttributeValues<(typeof DoorLock)['attributes']>;
508
+ endpoint: MatterbridgeEndpoint;
509
+ };
510
+ 'DoorLock.setHolidaySchedule': {
511
+ command: 'setHolidaySchedule';
512
+ request: DoorLock.SetHolidayScheduleRequest;
513
+ cluster: 'doorLock';
514
+ attributes: ClusterAttributeValues<(typeof DoorLock)['attributes']>;
515
+ endpoint: MatterbridgeEndpoint;
516
+ };
517
+ 'DoorLock.getHolidaySchedule': {
518
+ command: 'getHolidaySchedule';
519
+ request: DoorLock.GetHolidayScheduleRequest;
520
+ cluster: 'doorLock';
521
+ attributes: ClusterAttributeValues<(typeof DoorLock)['attributes']>;
522
+ endpoint: MatterbridgeEndpoint;
523
+ };
524
+ 'DoorLock.clearHolidaySchedule': {
525
+ command: 'clearHolidaySchedule';
526
+ request: DoorLock.ClearHolidayScheduleRequest;
527
+ cluster: 'doorLock';
528
+ attributes: ClusterAttributeValues<(typeof DoorLock)['attributes']>;
529
+ endpoint: MatterbridgeEndpoint;
530
+ };
468
531
  'setpointRaiseLower': CommandHandlerData<'Thermostat.setpointRaiseLower'>;
469
532
  'setActivePresetRequest': CommandHandlerData<'Thermostat.setActivePresetRequest'>;
470
533
  'setActiveScheduleRequest': CommandHandlerData<'Thermostat.setActiveScheduleRequest'>;
@@ -952,6 +1015,9 @@ export type CommandHandlerDataMap = {
952
1015
  };
953
1016
  export type CommandHandlerResponseMap = {
954
1017
  'DoorLock.getUser': DoorLock.GetUserResponse;
1018
+ 'DoorLock.getWeekDaySchedule': DoorLock.GetWeekDayScheduleResponse;
1019
+ 'DoorLock.getYearDaySchedule': DoorLock.GetYearDayScheduleResponse;
1020
+ 'DoorLock.getHolidaySchedule': DoorLock.GetHolidayScheduleResponse;
955
1021
  };
956
1022
  export declare class CommandHandler {
957
1023
  private handler;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/core",
3
- "version": "3.10.7",
3
+ "version": "3.10.8-dev-20260828-030e705",
4
4
  "description": "Matterbridge core library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -132,10 +132,10 @@
132
132
  },
133
133
  "dependencies": {
134
134
  "@matter/main": "0.17.9",
135
- "@matterbridge/dgram": "3.10.7",
136
- "@matterbridge/thread": "3.10.7",
137
- "@matterbridge/types": "3.10.7",
138
- "@matterbridge/utils": "3.10.7",
135
+ "@matterbridge/dgram": "3.10.8-dev-20260828-030e705",
136
+ "@matterbridge/thread": "3.10.8-dev-20260828-030e705",
137
+ "@matterbridge/types": "3.10.8-dev-20260828-030e705",
138
+ "@matterbridge/utils": "3.10.8-dev-20260828-030e705",
139
139
  "escape-html": "1.0.3",
140
140
  "express": "5.2.1",
141
141
  "express-rate-limit": "8.6.2",