@matterbridge/core 3.7.2-dev-20260330-bb55c39 → 3.7.2-dev-20260402-c12a10e
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/backendExpress.d.ts +18 -0
- package/dist/backendExpress.js +445 -0
- package/dist/backendWsServer.d.ts +35 -0
- package/dist/backendWsServer.js +307 -0
- package/dist/behaviors/doorLockServer.d.ts +36 -2
- package/dist/behaviors/doorLockServer.js +352 -6
- package/dist/behaviors/export.d.ts +0 -2
- package/dist/behaviors/export.js +0 -2
- package/dist/cli.js +2 -1
- package/dist/export.d.ts +0 -2
- package/dist/export.js +0 -2
- package/dist/frontend.d.ts +16 -9
- package/dist/frontend.js +52 -42
- package/dist/helpers.js +0 -5
- package/dist/jestutils/jestHelpers.d.ts +1 -1
- package/dist/jestutils/jestHelpers.js +19 -9
- package/dist/matterNode.js +18 -8
- package/dist/matterbridge.d.ts +0 -7
- package/dist/matterbridge.js +24 -52
- package/dist/matterbridgeEndpoint.d.ts +4 -5
- package/dist/matterbridgeEndpoint.js +9 -33
- package/dist/matterbridgeEndpointCommandHandler.d.ts +8 -2
- package/dist/matterbridgeEndpointCommandHandler.js +2 -1
- package/dist/pluginManager.d.ts +1 -0
- package/dist/pluginManager.js +14 -2
- package/package.json +5 -5
- package/dist/behaviors/pinDoorLockServer.d.ts +0 -32
- package/dist/behaviors/pinDoorLockServer.js +0 -168
- package/dist/behaviors/userPinDoorLockServer.d.ts +0 -57
- package/dist/behaviors/userPinDoorLockServer.js +0 -348
|
@@ -76,12 +76,10 @@ import { MatterbridgeServer } from './behaviors/matterbridgeServer.js';
|
|
|
76
76
|
import { MatterbridgeModeSelectServer } from './behaviors/modeSelectServer.js';
|
|
77
77
|
import { MatterbridgeOnOffServer } from './behaviors/onOffServer.js';
|
|
78
78
|
import { MatterbridgeOperationalStateServer } from './behaviors/operationalStateServer.js';
|
|
79
|
-
import { MatterbridgePinDoorLockServer } from './behaviors/pinDoorLockServer.js';
|
|
80
79
|
import { MatterbridgePowerSourceServer } from './behaviors/powerSourceServer.js';
|
|
81
80
|
import { MatterbridgeSmokeCoAlarmServer } from './behaviors/smokeCoAlarmServer.js';
|
|
82
81
|
import { MatterbridgeSwitchServer } from './behaviors/switchServer.js';
|
|
83
82
|
import { MatterbridgeThermostatServer } from './behaviors/thermostatServer.js';
|
|
84
|
-
import { MatterbridgeUserPinDoorLockServer } from './behaviors/userPinDoorLockServer.js';
|
|
85
83
|
import { MatterbridgeValveConfigurationAndControlServer } from './behaviors/valveConfigurationAndControlServer.js';
|
|
86
84
|
import { MatterbridgeWindowCoveringServer } from './behaviors/windowCoveringServer.js';
|
|
87
85
|
import { CommandHandler } from './matterbridgeEndpointCommandHandler.js';
|
|
@@ -264,7 +262,7 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
264
262
|
return this;
|
|
265
263
|
}
|
|
266
264
|
async executeCommandHandler(command, request, cluster, attributes, endpoint) {
|
|
267
|
-
|
|
265
|
+
return this.commandHandler.executeHandler(command, { command, request, cluster, attributes, endpoint });
|
|
268
266
|
}
|
|
269
267
|
async invokeBehaviorCommand(cluster, command, params) {
|
|
270
268
|
await invokeBehaviorCommand(this, cluster, command, params);
|
|
@@ -1068,8 +1066,8 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
1068
1066
|
});
|
|
1069
1067
|
return this;
|
|
1070
1068
|
}
|
|
1071
|
-
createDefaultDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt) {
|
|
1072
|
-
this.behaviors.require(MatterbridgeDoorLockServer.enable({
|
|
1069
|
+
createDefaultDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt, autoRelockTime = 0) {
|
|
1070
|
+
this.behaviors.require(MatterbridgeDoorLockServer.with().enable({
|
|
1073
1071
|
events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true },
|
|
1074
1072
|
commands: { lockDoor: true, unlockDoor: true, unlockWithTimeout: true },
|
|
1075
1073
|
}), {
|
|
@@ -1078,33 +1076,12 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
1078
1076
|
actuatorEnabled: true,
|
|
1079
1077
|
operatingMode: DoorLock.OperatingMode.Normal,
|
|
1080
1078
|
supportedOperatingModes: { normal: false, vacation: true, privacy: true, noRemoteLockUnlock: false, passage: true, alwaysSet: 2047 },
|
|
1081
|
-
autoRelockTime
|
|
1079
|
+
autoRelockTime,
|
|
1082
1080
|
});
|
|
1083
1081
|
return this;
|
|
1084
1082
|
}
|
|
1085
|
-
|
|
1086
|
-
this.behaviors.require(
|
|
1087
|
-
events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true },
|
|
1088
|
-
commands: { lockDoor: true, unlockDoor: true, unlockWithTimeout: true, setUserStatus: true, getUserStatus: true, setUserType: true, getUserType: true },
|
|
1089
|
-
}), {
|
|
1090
|
-
lockState,
|
|
1091
|
-
lockType,
|
|
1092
|
-
actuatorEnabled: true,
|
|
1093
|
-
operatingMode: DoorLock.OperatingMode.Normal,
|
|
1094
|
-
supportedOperatingModes: { normal: false, vacation: true, privacy: true, noRemoteLockUnlock: false, passage: true, alwaysSet: 2047 },
|
|
1095
|
-
autoRelockTime: 0,
|
|
1096
|
-
numberOfPinUsersSupported: 10,
|
|
1097
|
-
maxPinCodeLength: 10,
|
|
1098
|
-
minPinCodeLength: 4,
|
|
1099
|
-
wrongCodeEntryLimit: 5,
|
|
1100
|
-
userCodeTemporaryDisableTime: 60,
|
|
1101
|
-
sendPinOverTheAir: true,
|
|
1102
|
-
requirePinForRemoteOperation: true,
|
|
1103
|
-
});
|
|
1104
|
-
return this;
|
|
1105
|
-
}
|
|
1106
|
-
createUserPinDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt) {
|
|
1107
|
-
this.behaviors.require(MatterbridgeUserPinDoorLockServer.with(DoorLock.Feature.User, DoorLock.Feature.PinCredential, DoorLock.Feature.CredentialOverTheAirAccess).enable({
|
|
1083
|
+
createUserPinDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt, autoRelockTime = 0, minPinCodeLength = 4, maxPinCodeLength = 10) {
|
|
1084
|
+
this.behaviors.require(MatterbridgeDoorLockServer.with(DoorLock.Feature.User, DoorLock.Feature.PinCredential).enable({
|
|
1108
1085
|
events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true },
|
|
1109
1086
|
commands: { lockDoor: true, unlockDoor: true, unlockWithTimeout: true },
|
|
1110
1087
|
}), {
|
|
@@ -1113,13 +1090,12 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
1113
1090
|
actuatorEnabled: true,
|
|
1114
1091
|
operatingMode: DoorLock.OperatingMode.Normal,
|
|
1115
1092
|
supportedOperatingModes: { normal: false, vacation: true, privacy: true, noRemoteLockUnlock: false, passage: true, alwaysSet: 2047 },
|
|
1116
|
-
autoRelockTime
|
|
1093
|
+
autoRelockTime,
|
|
1117
1094
|
numberOfPinUsersSupported: 10,
|
|
1118
|
-
|
|
1119
|
-
|
|
1095
|
+
minPinCodeLength,
|
|
1096
|
+
maxPinCodeLength,
|
|
1120
1097
|
wrongCodeEntryLimit: 5,
|
|
1121
1098
|
userCodeTemporaryDisableTime: 60,
|
|
1122
|
-
requirePinForRemoteOperation: true,
|
|
1123
1099
|
numberOfTotalUsersSupported: 10,
|
|
1124
1100
|
credentialRulesSupport: { single: true },
|
|
1125
1101
|
numberOfCredentialsSupportedPerUser: 10,
|
|
@@ -129,7 +129,10 @@ export type CommandHandlerData<T extends CommandHandlers = CommandHandlers> = Co
|
|
|
129
129
|
export type CommandHandlerPayload<T extends CommandHandlers = CommandHandlers> = CommandHandlerData<T> & {
|
|
130
130
|
context?: ActionContext;
|
|
131
131
|
};
|
|
132
|
-
|
|
132
|
+
type VoidReturn = ReturnType<() => void>;
|
|
133
|
+
export type CommandHandlerResponse<T extends CommandHandlers = CommandHandlers> = T extends keyof CommandHandlerResponseMap ? CommandHandlerResponseMap[T] : VoidReturn;
|
|
134
|
+
export type CommandHandlerExecutionResult<T extends CommandHandlers = CommandHandlers> = T extends keyof CommandHandlerResponseMap ? CommandHandlerResponseMap[T] | undefined : VoidReturn;
|
|
135
|
+
export type CommandHandlerFunction<T extends CommandHandlers = CommandHandlers> = (data: CommandHandlerPayload<T>) => CommandHandlerResponse<T> | Promise<CommandHandlerResponse<T>>;
|
|
133
136
|
export type CommandHandlerDataMap = {
|
|
134
137
|
'identify': CommandHandlerData<'Identify.identify'>;
|
|
135
138
|
'triggerEffect': CommandHandlerData<'Identify.triggerEffect'>;
|
|
@@ -918,11 +921,14 @@ export type CommandHandlerDataMap = {
|
|
|
918
921
|
endpoint: MatterbridgeEndpoint;
|
|
919
922
|
};
|
|
920
923
|
};
|
|
924
|
+
export type CommandHandlerResponseMap = {
|
|
925
|
+
'DoorLock.getUser': DoorLock.GetUserResponse;
|
|
926
|
+
};
|
|
921
927
|
export declare class CommandHandler {
|
|
922
928
|
private handler;
|
|
923
929
|
hasHandler<K extends CommandHandlers>(command: K): boolean;
|
|
924
930
|
addHandler<K extends CommandHandlers>(command: K, handler: CommandHandlerFunction<K>): void;
|
|
925
|
-
executeHandler<K extends CommandHandlers>(command: K, ...args: Parameters<CommandHandlerFunction<K>>): Promise<
|
|
931
|
+
executeHandler<K extends CommandHandlers>(command: K, ...args: Parameters<CommandHandlerFunction<K>>): Promise<CommandHandlerExecutionResult<K>>;
|
|
926
932
|
removeHandler<K extends CommandHandlers>(command: K, handler: CommandHandlerFunction<K>): void;
|
|
927
933
|
}
|
|
928
934
|
export {};
|
|
@@ -16,12 +16,13 @@ export class CommandHandler {
|
|
|
16
16
|
}
|
|
17
17
|
const fallbackCommand = command.includes('.') ? command.split('.').pop() : undefined;
|
|
18
18
|
if (fallbackCommand === undefined)
|
|
19
|
-
return;
|
|
19
|
+
return undefined;
|
|
20
20
|
for (const { command: registeredCommand, handler } of this.handler) {
|
|
21
21
|
if (registeredCommand === fallbackCommand) {
|
|
22
22
|
return await handler(...args);
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
+
return undefined;
|
|
25
26
|
}
|
|
26
27
|
removeHandler(command, handler) {
|
|
27
28
|
this.handler = this.handler.filter(({ command: registeredCommand, handler: registeredHandler }) => {
|
package/dist/pluginManager.d.ts
CHANGED
|
@@ -74,6 +74,7 @@ export declare class PluginManager extends EventEmitter<PluginManagerEvents> {
|
|
|
74
74
|
install(packageName: string): void;
|
|
75
75
|
uninstall(packageName: string): void;
|
|
76
76
|
getAuthor(packageJson: Record<string, string | number | Record<string, string | number | object>>): string;
|
|
77
|
+
getDescription(packageJson: Record<string, string | number | Record<string, string | number | object>>): string;
|
|
77
78
|
getHomepage(packageJson: Record<string, string | number | Record<string, string | number | object>>): string | undefined;
|
|
78
79
|
getHelp(packageJson: Record<string, string | number | Record<string, string | number | object>>): string | undefined;
|
|
79
80
|
getChangelog(packageJson: Record<string, string | number | Record<string, string | number | object>>): string | undefined;
|
package/dist/pluginManager.js
CHANGED
|
@@ -537,6 +537,11 @@ export class PluginManager extends EventEmitter {
|
|
|
537
537
|
return packageJson.author.name;
|
|
538
538
|
return 'Unknown author';
|
|
539
539
|
}
|
|
540
|
+
getDescription(packageJson) {
|
|
541
|
+
if (packageJson.description && typeof packageJson.description === 'string')
|
|
542
|
+
return packageJson.description;
|
|
543
|
+
return 'No description';
|
|
544
|
+
}
|
|
540
545
|
getHomepage(packageJson) {
|
|
541
546
|
if (packageJson.homepage && typeof packageJson.homepage === 'string' && packageJson.homepage.includes('http')) {
|
|
542
547
|
return packageJson.homepage.replace('git+', '').replace('.git', '');
|
|
@@ -828,7 +833,7 @@ export class PluginManager extends EventEmitter {
|
|
|
828
833
|
if (pluginInstance.default) {
|
|
829
834
|
const config = await this.loadConfig(plugin);
|
|
830
835
|
plugin.name = packageJson.name;
|
|
831
|
-
plugin.description = packageJson
|
|
836
|
+
plugin.description = this.getDescription(packageJson);
|
|
832
837
|
plugin.version = packageJson.version;
|
|
833
838
|
plugin.author = this.getAuthor(packageJson);
|
|
834
839
|
plugin.configJson = config;
|
|
@@ -853,7 +858,7 @@ export class PluginManager extends EventEmitter {
|
|
|
853
858
|
platform.isLoaded = true;
|
|
854
859
|
platform.setMatterNode?.(this.matterbridge.addBridgedEndpoint.bind(this.matterbridge), this.matterbridge.removeBridgedEndpoint.bind(this.matterbridge), this.matterbridge.removeAllBridgedEndpoints.bind(this.matterbridge), this.matterbridge.addVirtualEndpoint.bind(this.matterbridge));
|
|
855
860
|
plugin.name = packageJson.name;
|
|
856
|
-
plugin.description = packageJson
|
|
861
|
+
plugin.description = this.getDescription(packageJson);
|
|
857
862
|
plugin.version = packageJson.version;
|
|
858
863
|
plugin.author = this.getAuthor(packageJson);
|
|
859
864
|
plugin.homepage = this.getHomepage(packageJson);
|
|
@@ -1150,6 +1155,13 @@ export class PluginManager extends EventEmitter {
|
|
|
1150
1155
|
'readOnly': true,
|
|
1151
1156
|
'ui:widget': 'hidden',
|
|
1152
1157
|
},
|
|
1158
|
+
version: {
|
|
1159
|
+
'title': 'Plugin Version',
|
|
1160
|
+
'description': 'Plugin version',
|
|
1161
|
+
'type': 'string',
|
|
1162
|
+
'readOnly': true,
|
|
1163
|
+
'ui:widget': 'hidden',
|
|
1164
|
+
},
|
|
1153
1165
|
debug: {
|
|
1154
1166
|
title: 'Enable Debug',
|
|
1155
1167
|
description: 'Enable the debug for the plugin (development only)',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matterbridge/core",
|
|
3
|
-
"version": "3.7.2-dev-
|
|
3
|
+
"version": "3.7.2-dev-20260402-c12a10e",
|
|
4
4
|
"description": "Matterbridge core library",
|
|
5
5
|
"author": "https://github.com/Luligu",
|
|
6
6
|
"homepage": "https://matterbridge.io/",
|
|
@@ -126,10 +126,10 @@
|
|
|
126
126
|
],
|
|
127
127
|
"dependencies": {
|
|
128
128
|
"@matter/main": "0.16.10",
|
|
129
|
-
"@matterbridge/dgram": "3.7.2-dev-
|
|
130
|
-
"@matterbridge/thread": "3.7.2-dev-
|
|
131
|
-
"@matterbridge/types": "3.7.2-dev-
|
|
132
|
-
"@matterbridge/utils": "3.7.2-dev-
|
|
129
|
+
"@matterbridge/dgram": "3.7.2-dev-20260402-c12a10e",
|
|
130
|
+
"@matterbridge/thread": "3.7.2-dev-20260402-c12a10e",
|
|
131
|
+
"@matterbridge/types": "3.7.2-dev-20260402-c12a10e",
|
|
132
|
+
"@matterbridge/utils": "3.7.2-dev-20260402-c12a10e",
|
|
133
133
|
"express": "5.2.1",
|
|
134
134
|
"multer": "2.1.1",
|
|
135
135
|
"node-ansi-logger": "3.2.1-dev-20260327-7069fd7",
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { DoorLockServer } from '@matter/node/behaviors/door-lock';
|
|
2
|
-
import { DoorLock } from '@matter/types/clusters/door-lock';
|
|
3
|
-
declare const MatterbridgePinDoorLockServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterTypeModifier.WithAlterations<import("@matter/types").ClusterComposer.WithFeatures<DoorLock.Cluster, readonly [DoorLock.Feature.PinCredential, DoorLock.Feature.CredentialOverTheAirAccess]>, import("@matter/types").ClusterTypeModifier.ElementFlagAlterations<{
|
|
4
|
-
readonly events: {
|
|
5
|
-
readonly doorLockAlarm: true;
|
|
6
|
-
readonly lockOperation: true;
|
|
7
|
-
readonly lockOperationError: true;
|
|
8
|
-
};
|
|
9
|
-
readonly commands: {
|
|
10
|
-
readonly lockDoor: true;
|
|
11
|
-
readonly unlockDoor: true;
|
|
12
|
-
readonly unlockWithTimeout: true;
|
|
13
|
-
readonly setUserStatus: true;
|
|
14
|
-
readonly getUserStatus: true;
|
|
15
|
-
readonly setUserType: true;
|
|
16
|
-
readonly getUserType: true;
|
|
17
|
-
};
|
|
18
|
-
}>>, 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>, import("@matter/node/behaviors/door-lock").DoorLockInterface>;
|
|
19
|
-
export declare class MatterbridgePinDoorLockServer extends MatterbridgePinDoorLockServer_base {
|
|
20
|
-
lockDoor(request: DoorLock.LockDoorRequest): Promise<void>;
|
|
21
|
-
unlockDoor(request: DoorLock.UnlockDoorRequest): Promise<void>;
|
|
22
|
-
unlockWithTimeout(request: DoorLock.UnlockWithTimeoutRequest): Promise<void>;
|
|
23
|
-
setPinCode(request: DoorLock.SetPinCodeRequest): Promise<void>;
|
|
24
|
-
getPinCode(request: DoorLock.GetPinCodeRequest): Promise<DoorLock.GetPinCodeResponse>;
|
|
25
|
-
clearPinCode(request: DoorLock.ClearPinCodeRequest): Promise<void>;
|
|
26
|
-
clearAllPinCodes(): Promise<void>;
|
|
27
|
-
setUserStatus(request: DoorLock.SetUserStatusRequest): Promise<void>;
|
|
28
|
-
getUserStatus(request: DoorLock.GetUserStatusRequest): Promise<DoorLock.GetUserStatusResponse>;
|
|
29
|
-
setUserType(request: DoorLock.SetUserTypeRequest): Promise<void>;
|
|
30
|
-
getUserType(request: DoorLock.GetUserTypeRequest): Promise<DoorLock.GetUserTypeResponse>;
|
|
31
|
-
}
|
|
32
|
-
export {};
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { DoorLockServer } from '@matter/node/behaviors/door-lock';
|
|
2
|
-
import { DoorLock } from '@matter/types/clusters/door-lock';
|
|
3
|
-
import { getEnumDescription } from '@matterbridge/utils';
|
|
4
|
-
import { MatterbridgeServer } from './matterbridgeServer.js';
|
|
5
|
-
export class MatterbridgePinDoorLockServer extends DoorLockServer.with(DoorLock.Feature.PinCredential, DoorLock.Feature.CredentialOverTheAirAccess).enable({
|
|
6
|
-
events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true },
|
|
7
|
-
commands: { lockDoor: true, unlockDoor: true, unlockWithTimeout: true, setUserStatus: true, getUserStatus: true, setUserType: true, getUserType: true },
|
|
8
|
-
}) {
|
|
9
|
-
async lockDoor(request) {
|
|
10
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
11
|
-
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})`);
|
|
12
|
-
await device.commandHandler.executeHandler('DoorLock.lockDoor', {
|
|
13
|
-
command: 'lockDoor',
|
|
14
|
-
request,
|
|
15
|
-
cluster: DoorLockServer.id,
|
|
16
|
-
attributes: this.state,
|
|
17
|
-
endpoint: this.endpoint,
|
|
18
|
-
context: this.context,
|
|
19
|
-
});
|
|
20
|
-
device.log.debug(`MatterbridgeDoorLockServer: lockDoor called`);
|
|
21
|
-
await super.lockDoor(request);
|
|
22
|
-
}
|
|
23
|
-
async unlockDoor(request) {
|
|
24
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
25
|
-
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})`);
|
|
26
|
-
await device.commandHandler.executeHandler('DoorLock.unlockDoor', {
|
|
27
|
-
command: 'unlockDoor',
|
|
28
|
-
request,
|
|
29
|
-
cluster: DoorLockServer.id,
|
|
30
|
-
attributes: this.state,
|
|
31
|
-
endpoint: this.endpoint,
|
|
32
|
-
context: this.context,
|
|
33
|
-
});
|
|
34
|
-
device.log.debug(`MatterbridgeDoorLockServer: unlockDoor called`);
|
|
35
|
-
await super.unlockDoor(request);
|
|
36
|
-
}
|
|
37
|
-
async unlockWithTimeout(request) {
|
|
38
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
39
|
-
device.log.info(`Unlocking door with pincode ${request.pinCode ? '0x' + Buffer.from(request.pinCode).toString('hex') : 'N/A'} timeout ${request.timeout} seconds (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
40
|
-
await device.commandHandler.executeHandler('DoorLock.unlockWithTimeout', {
|
|
41
|
-
command: 'unlockWithTimeout',
|
|
42
|
-
request,
|
|
43
|
-
cluster: DoorLockServer.id,
|
|
44
|
-
attributes: this.state,
|
|
45
|
-
endpoint: this.endpoint,
|
|
46
|
-
context: this.context,
|
|
47
|
-
});
|
|
48
|
-
device.log.debug(`MatterbridgeDoorLockServer: unlockWithTimeout called`);
|
|
49
|
-
this.state.lockState = DoorLock.LockState.Unlocked;
|
|
50
|
-
}
|
|
51
|
-
async setPinCode(request) {
|
|
52
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
53
|
-
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})`);
|
|
54
|
-
await device.commandHandler.executeHandler('DoorLock.setPinCode', {
|
|
55
|
-
command: 'setPinCode',
|
|
56
|
-
request,
|
|
57
|
-
cluster: DoorLockServer.id,
|
|
58
|
-
attributes: this.state,
|
|
59
|
-
endpoint: this.endpoint,
|
|
60
|
-
context: this.context,
|
|
61
|
-
});
|
|
62
|
-
device.log.debug(`MatterbridgeDoorLockServer: setPinCode called for user ${request.userId}`);
|
|
63
|
-
}
|
|
64
|
-
async getPinCode(request) {
|
|
65
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
66
|
-
device.log.info(`Getting pin code for user ${request.userId} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
67
|
-
await device.commandHandler.executeHandler('DoorLock.getPinCode', {
|
|
68
|
-
command: 'getPinCode',
|
|
69
|
-
request,
|
|
70
|
-
cluster: DoorLockServer.id,
|
|
71
|
-
attributes: this.state,
|
|
72
|
-
endpoint: this.endpoint,
|
|
73
|
-
context: this.context,
|
|
74
|
-
});
|
|
75
|
-
return {
|
|
76
|
-
userId: request.userId,
|
|
77
|
-
userStatus: DoorLock.UserStatus.Available,
|
|
78
|
-
userType: DoorLock.UserType.UnrestrictedUser,
|
|
79
|
-
pinCode: Buffer.from('1234'),
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
async clearPinCode(request) {
|
|
83
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
84
|
-
device.log.info(`Clearing pin code for ${request.pinSlotIndex === 0xfffe ? 'all slots' : 'slot ' + request.pinSlotIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
85
|
-
await device.commandHandler.executeHandler('DoorLock.clearPinCode', {
|
|
86
|
-
command: 'clearPinCode',
|
|
87
|
-
request,
|
|
88
|
-
cluster: DoorLockServer.id,
|
|
89
|
-
attributes: this.state,
|
|
90
|
-
endpoint: this.endpoint,
|
|
91
|
-
context: this.context,
|
|
92
|
-
});
|
|
93
|
-
device.log.debug(`MatterbridgeDoorLockServer: clearPinCode called for ${request.pinSlotIndex === 0xfffe ? 'all PIN slots' : 'PIN slot ' + request.pinSlotIndex}`);
|
|
94
|
-
}
|
|
95
|
-
async clearAllPinCodes() {
|
|
96
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
97
|
-
device.log.info(`Clearing all pin codes (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
98
|
-
await device.commandHandler.executeHandler('DoorLock.clearAllPinCodes', {
|
|
99
|
-
command: 'clearAllPinCodes',
|
|
100
|
-
request: {},
|
|
101
|
-
cluster: DoorLockServer.id,
|
|
102
|
-
attributes: this.state,
|
|
103
|
-
endpoint: this.endpoint,
|
|
104
|
-
context: this.context,
|
|
105
|
-
});
|
|
106
|
-
device.log.debug('MatterbridgeDoorLockServer: clearAllPinCodes called');
|
|
107
|
-
}
|
|
108
|
-
async setUserStatus(request) {
|
|
109
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
110
|
-
device.log.info(`Setting user status for user ${request.userId} to ${getEnumDescription(DoorLock.UserStatus, request.userStatus)} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
111
|
-
await device.commandHandler.executeHandler('DoorLock.setUserStatus', {
|
|
112
|
-
command: 'setUserStatus',
|
|
113
|
-
request,
|
|
114
|
-
cluster: DoorLockServer.id,
|
|
115
|
-
attributes: this.state,
|
|
116
|
-
endpoint: this.endpoint,
|
|
117
|
-
context: this.context,
|
|
118
|
-
});
|
|
119
|
-
device.log.debug(`MatterbridgeDoorLockServer: setUserStatus called for user ${request.userId}`);
|
|
120
|
-
}
|
|
121
|
-
async getUserStatus(request) {
|
|
122
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
123
|
-
device.log.info(`Getting user status for user ${request.userId} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
124
|
-
await device.commandHandler.executeHandler('DoorLock.getUserStatus', {
|
|
125
|
-
command: 'getUserStatus',
|
|
126
|
-
request,
|
|
127
|
-
cluster: DoorLockServer.id,
|
|
128
|
-
attributes: this.state,
|
|
129
|
-
endpoint: this.endpoint,
|
|
130
|
-
context: this.context,
|
|
131
|
-
});
|
|
132
|
-
device.log.debug(`MatterbridgeDoorLockServer: getUserStatus called for user ${request.userId}`);
|
|
133
|
-
return {
|
|
134
|
-
userId: request.userId,
|
|
135
|
-
userStatus: DoorLock.UserStatus.Available,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
async setUserType(request) {
|
|
139
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
140
|
-
device.log.info(`Setting user type for user ${request.userId} to ${getEnumDescription(DoorLock.UserType, request.userType)} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
141
|
-
await device.commandHandler.executeHandler('DoorLock.setUserType', {
|
|
142
|
-
command: 'setUserType',
|
|
143
|
-
request,
|
|
144
|
-
cluster: DoorLockServer.id,
|
|
145
|
-
attributes: this.state,
|
|
146
|
-
endpoint: this.endpoint,
|
|
147
|
-
context: this.context,
|
|
148
|
-
});
|
|
149
|
-
device.log.debug(`MatterbridgeDoorLockServer: setUserType called for user ${request.userId}`);
|
|
150
|
-
}
|
|
151
|
-
async getUserType(request) {
|
|
152
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
153
|
-
device.log.info(`Getting user type for user ${request.userId} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
154
|
-
await device.commandHandler.executeHandler('DoorLock.getUserType', {
|
|
155
|
-
command: 'getUserType',
|
|
156
|
-
request,
|
|
157
|
-
cluster: DoorLockServer.id,
|
|
158
|
-
attributes: this.state,
|
|
159
|
-
endpoint: this.endpoint,
|
|
160
|
-
context: this.context,
|
|
161
|
-
});
|
|
162
|
-
device.log.debug(`MatterbridgeDoorLockServer: getUserType called for user ${request.userId}`);
|
|
163
|
-
return {
|
|
164
|
-
userId: request.userId,
|
|
165
|
-
userType: DoorLock.UserType.UnrestrictedUser,
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { DoorLockServer } from '@matter/node/behaviors/door-lock';
|
|
2
|
-
import { DoorLock } from '@matter/types/clusters/door-lock';
|
|
3
|
-
import { FabricIndex } from '@matter/types/datatype';
|
|
4
|
-
declare const MatterbridgeUserPinDoorLockServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterTypeModifier.WithAlterations<import("@matter/types").ClusterComposer.WithFeatures<DoorLock.Cluster, readonly [DoorLock.Feature.User, DoorLock.Feature.PinCredential, DoorLock.Feature.CredentialOverTheAirAccess]>, import("@matter/types").ClusterTypeModifier.ElementFlagAlterations<{
|
|
5
|
-
readonly events: {
|
|
6
|
-
readonly doorLockAlarm: true;
|
|
7
|
-
readonly lockOperation: true;
|
|
8
|
-
readonly lockOperationError: true;
|
|
9
|
-
};
|
|
10
|
-
readonly commands: {
|
|
11
|
-
readonly lockDoor: true;
|
|
12
|
-
readonly unlockDoor: true;
|
|
13
|
-
readonly unlockWithTimeout: true;
|
|
14
|
-
};
|
|
15
|
-
}>>, import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<DoorLock.Cluster, readonly [DoorLock.Feature.User, DoorLock.Feature.PinCredential, DoorLock.Feature.CredentialOverTheAirAccess]>, typeof DoorLockServer, import("@matter/node/behaviors/door-lock").DoorLockInterface>, import("@matter/node/behaviors/door-lock").DoorLockInterface>;
|
|
16
|
-
export declare class MatterbridgeUserPinDoorLockServer extends MatterbridgeUserPinDoorLockServer_base {
|
|
17
|
-
protected internal: MatterbridgeUserPinDoorLockServer.Internal;
|
|
18
|
-
private getAccessingFabricIndex;
|
|
19
|
-
private findStoredCredential;
|
|
20
|
-
private getStoredCredentialStateDebug;
|
|
21
|
-
private logStoredCredentialState;
|
|
22
|
-
private hasMatchingPinCredential;
|
|
23
|
-
private validateRemotePinCode;
|
|
24
|
-
private getNextOccupiedCredentialIndex;
|
|
25
|
-
private upsertStoredCredential;
|
|
26
|
-
private clearStoredCredential;
|
|
27
|
-
lockDoor(request: DoorLock.LockDoorRequest): Promise<void>;
|
|
28
|
-
unlockDoor(request: DoorLock.UnlockDoorRequest): Promise<void>;
|
|
29
|
-
unlockWithTimeout(request: DoorLock.UnlockWithTimeoutRequest): Promise<void>;
|
|
30
|
-
setUser(request: DoorLock.SetUserRequest): Promise<void>;
|
|
31
|
-
getUser(request: DoorLock.GetUserRequest): Promise<DoorLock.GetUserResponse>;
|
|
32
|
-
clearUser(request: DoorLock.ClearUserRequest): Promise<void>;
|
|
33
|
-
setCredential(request: DoorLock.SetCredentialRequest): Promise<DoorLock.SetCredentialResponse>;
|
|
34
|
-
getCredentialStatus(request: DoorLock.GetCredentialStatusRequest): Promise<DoorLock.GetCredentialStatusResponse>;
|
|
35
|
-
clearCredential(request: DoorLock.ClearCredentialRequest): Promise<void>;
|
|
36
|
-
}
|
|
37
|
-
export declare namespace MatterbridgeUserPinDoorLockServer {
|
|
38
|
-
type StoredCredential = DoorLock.Credential & {
|
|
39
|
-
credentialData: Uint8Array;
|
|
40
|
-
};
|
|
41
|
-
type StoredUser = {
|
|
42
|
-
userIndex: number;
|
|
43
|
-
userName: string | null;
|
|
44
|
-
userUniqueId: number | null;
|
|
45
|
-
userStatus: DoorLock.UserStatus | null;
|
|
46
|
-
userType: DoorLock.UserType | null;
|
|
47
|
-
credentialRule: DoorLock.CredentialRule | null;
|
|
48
|
-
credentials: StoredCredential[] | null;
|
|
49
|
-
creatorFabricIndex: FabricIndex | null;
|
|
50
|
-
lastModifiedFabricIndex: FabricIndex | null;
|
|
51
|
-
nextUserIndex: number | null;
|
|
52
|
-
};
|
|
53
|
-
class Internal {
|
|
54
|
-
users: StoredUser[];
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
export {};
|