@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.
- package/dist/behaviors/doorLockServer.d.ts +15 -6
- package/dist/behaviors/doorLockServer.js +171 -32
- package/dist/behaviors/powerSourceServer.js +3 -3
- package/dist/cli.js +1 -0
- package/dist/demoDevices.js +10 -1
- package/dist/matterNode.js +13 -8
- package/dist/matterbridge.js +12 -8
- package/dist/matterbridgeEndpoint.d.ts +2 -2
- package/dist/matterbridgeEndpoint.js +10 -4
- package/dist/matterbridgeEndpointCommandHandler.d.ts +66 -0
- package/package.json +5 -5
|
@@ -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:
|
|
10
|
+
holidaySchedules: true;
|
|
11
11
|
pinCredential: true;
|
|
12
12
|
rfidCredential: false;
|
|
13
13
|
unbolting: false;
|
|
14
14
|
user: true;
|
|
15
|
-
weekDayAccessSchedules:
|
|
16
|
-
yearDayAccessSchedules:
|
|
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:
|
|
24
|
+
holidaySchedules: true;
|
|
25
25
|
pinCredential: true;
|
|
26
26
|
rfidCredential: false;
|
|
27
27
|
unbolting: false;
|
|
28
28
|
user: true;
|
|
29
|
-
weekDayAccessSchedules:
|
|
30
|
-
yearDayAccessSchedules:
|
|
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(`
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(`
|
|
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(`
|
|
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(`
|
|
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(`
|
|
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(`
|
|
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(`
|
|
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(
|
|
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(`
|
|
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}
|
|
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:
|
|
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
|
package/dist/demoDevices.js
CHANGED
|
@@ -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: '
|
|
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) });
|
package/dist/matterNode.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
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!`);
|
package/dist/matterbridge.js
CHANGED
|
@@ -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
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
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.
|
|
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.
|
|
136
|
-
"@matterbridge/thread": "3.10.
|
|
137
|
-
"@matterbridge/types": "3.10.
|
|
138
|
-
"@matterbridge/utils": "3.10.
|
|
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",
|