@matterbridge/core 3.7.2-dev-20260328-c77b608 → 3.7.2-dev-20260330-bb55c39

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.
Files changed (76) hide show
  1. package/dist/behaviors/activatedCarbonFilterMonitoringServer.d.ts +8 -0
  2. package/dist/behaviors/activatedCarbonFilterMonitoringServer.js +20 -0
  3. package/dist/{matterbridgeBehaviorsClient.js → behaviors/bindingServer.js} +1 -1
  4. package/dist/behaviors/booleanStateConfigurationServer.d.ts +7 -0
  5. package/dist/behaviors/booleanStateConfigurationServer.js +18 -0
  6. package/dist/behaviors/colorControlServer.d.ts +788 -0
  7. package/dist/behaviors/colorControlServer.js +105 -0
  8. package/dist/behaviors/deviceEnergyManagementModeServer.d.ts +5 -0
  9. package/dist/behaviors/deviceEnergyManagementModeServer.js +42 -0
  10. package/dist/behaviors/deviceEnergyManagementServer.d.ts +306 -0
  11. package/dist/behaviors/deviceEnergyManagementServer.js +31 -0
  12. package/dist/behaviors/doorLockServer.d.ts +28 -0
  13. package/dist/behaviors/doorLockServer.js +97 -0
  14. package/dist/behaviors/export.d.ts +24 -1
  15. package/dist/behaviors/export.js +24 -1
  16. package/dist/behaviors/fanControlServer.d.ts +7 -0
  17. package/dist/behaviors/fanControlServer.js +35 -0
  18. package/dist/behaviors/hepaFilterMonitoringServer.d.ts +8 -0
  19. package/dist/behaviors/hepaFilterMonitoringServer.js +20 -0
  20. package/dist/behaviors/identifyServer.d.ts +6 -0
  21. package/dist/behaviors/identifyServer.js +32 -0
  22. package/dist/behaviors/levelControlServer.d.ts +6 -0
  23. package/dist/behaviors/levelControlServer.js +32 -0
  24. package/dist/behaviors/matterbridgeServer.d.ts +14 -0
  25. package/dist/behaviors/matterbridgeServer.js +15 -0
  26. package/dist/behaviors/modeSelectServer.d.ts +5 -0
  27. package/dist/behaviors/modeSelectServer.js +18 -0
  28. package/dist/behaviors/onOffServer.d.ts +6 -0
  29. package/dist/behaviors/onOffServer.js +46 -0
  30. package/dist/behaviors/operationalStateServer.d.ts +10 -0
  31. package/dist/behaviors/operationalStateServer.js +84 -0
  32. package/dist/behaviors/pinDoorLockServer.d.ts +32 -0
  33. package/dist/behaviors/pinDoorLockServer.js +168 -0
  34. package/dist/behaviors/powerSourceServer.d.ts +4 -0
  35. package/dist/behaviors/powerSourceServer.js +21 -0
  36. package/dist/behaviors/serviceAreaServer.d.ts +5 -0
  37. package/dist/behaviors/serviceAreaServer.js +18 -0
  38. package/dist/behaviors/smokeCoAlarmServer.d.ts +83 -0
  39. package/dist/behaviors/smokeCoAlarmServer.js +18 -0
  40. package/dist/behaviors/switchServer.d.ts +4 -0
  41. package/dist/behaviors/switchServer.js +8 -0
  42. package/dist/behaviors/thermostatServer.d.ts +732 -0
  43. package/dist/behaviors/thermostatServer.js +50 -0
  44. package/dist/behaviors/userPinDoorLockServer.d.ts +57 -0
  45. package/dist/behaviors/userPinDoorLockServer.js +348 -0
  46. package/dist/behaviors/valveConfigurationAndControlServer.d.ts +8 -0
  47. package/dist/behaviors/valveConfigurationAndControlServer.js +44 -0
  48. package/dist/behaviors/windowCoveringServer.d.ts +583 -0
  49. package/dist/behaviors/windowCoveringServer.js +96 -0
  50. package/dist/devices/basicVideoPlayer.js +2 -1
  51. package/dist/devices/castingVideoPlayer.js +1 -1
  52. package/dist/devices/closure.js +1 -1
  53. package/dist/devices/closurePanel.js +1 -1
  54. package/dist/devices/dishwasher.js +2 -1
  55. package/dist/devices/evse.js +1 -1
  56. package/dist/devices/laundryWasher.js +2 -1
  57. package/dist/devices/microwaveOven.js +2 -1
  58. package/dist/devices/oven.js +1 -1
  59. package/dist/devices/refrigerator.js +1 -1
  60. package/dist/devices/roboticVacuumCleaner.js +2 -1
  61. package/dist/devices/temperatureControl.js +1 -1
  62. package/dist/devices/waterHeater.js +1 -1
  63. package/dist/export.d.ts +24 -1
  64. package/dist/export.js +24 -1
  65. package/dist/frontend.js +2 -0
  66. package/dist/matterbridge.d.ts +1 -0
  67. package/dist/matterbridge.js +11 -0
  68. package/dist/matterbridgeEndpoint.d.ts +12 -1
  69. package/dist/matterbridgeEndpoint.js +22 -1
  70. package/dist/matterbridgeEndpointCommandHandler.d.ts +5 -1
  71. package/dist/matterbridgeEndpointHelpers.d.ts +5 -1
  72. package/dist/matterbridgeEndpointHelpers.js +24 -1
  73. package/package.json +9 -5
  74. package/dist/matterbridgeBehaviorsServer.d.ts +0 -2687
  75. package/dist/matterbridgeBehaviorsServer.js +0 -1222
  76. /package/dist/{matterbridgeBehaviorsClient.d.ts → behaviors/bindingServer.d.ts} +0 -0
@@ -1 +1,24 @@
1
- export {};
1
+ export * from './activatedCarbonFilterMonitoringServer.js';
2
+ export * from './bindingServer.js';
3
+ export * from './booleanStateConfigurationServer.js';
4
+ export * from './colorControlServer.js';
5
+ export * from './deviceEnergyManagementModeServer.js';
6
+ export * from './deviceEnergyManagementServer.js';
7
+ export * from './doorLockServer.js';
8
+ export * from './fanControlServer.js';
9
+ export * from './hepaFilterMonitoringServer.js';
10
+ export * from './identifyServer.js';
11
+ export * from './levelControlServer.js';
12
+ export * from './matterbridgeServer.js';
13
+ export * from './modeSelectServer.js';
14
+ export * from './onOffServer.js';
15
+ export * from './operationalStateServer.js';
16
+ export * from './pinDoorLockServer.js';
17
+ export * from './powerSourceServer.js';
18
+ export * from './serviceAreaServer.js';
19
+ export * from './smokeCoAlarmServer.js';
20
+ export * from './switchServer.js';
21
+ export * from './thermostatServer.js';
22
+ export * from './userPinDoorLockServer.js';
23
+ export * from './valveConfigurationAndControlServer.js';
24
+ export * from './windowCoveringServer.js';
@@ -0,0 +1,7 @@
1
+ import { FanControlServer } from '@matter/node/behaviors/fan-control';
2
+ import { FanControl } from '@matter/types/clusters/fan-control';
3
+ declare const MatterbridgeFanControlServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<FanControl.Cluster, readonly [FanControl.Feature.Auto, FanControl.Feature.Step]>, typeof FanControlServer, import("@matter/node/behaviors/fan-control").FanControlInterface>;
4
+ export declare class MatterbridgeFanControlServer extends MatterbridgeFanControlServer_base {
5
+ step(request: FanControl.StepRequest): Promise<void>;
6
+ }
7
+ export {};
@@ -0,0 +1,35 @@
1
+ import { FanControlServer } from '@matter/node/behaviors/fan-control';
2
+ import { FanControl } from '@matter/types/clusters/fan-control';
3
+ import { MatterbridgeServer } from './matterbridgeServer.js';
4
+ export class MatterbridgeFanControlServer extends FanControlServer.with(FanControl.Feature.Auto, FanControl.Feature.Step) {
5
+ async step(request) {
6
+ const device = this.endpoint.stateOf(MatterbridgeServer);
7
+ device.log.info(`Stepping fan with direction ${request.direction} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
8
+ await device.commandHandler.executeHandler('FanControl.step', {
9
+ command: 'step',
10
+ request,
11
+ cluster: FanControlServer.id,
12
+ attributes: this.state,
13
+ endpoint: this.endpoint,
14
+ context: this.context,
15
+ });
16
+ const lookupStepDirection = ['Increase', 'Decrease'];
17
+ device.log.debug(`MatterbridgeFanControlServer: step called with direction: ${lookupStepDirection[request.direction]} wrap: ${request.wrap} lowestOff: ${request.lowestOff}`);
18
+ device.log.debug(`- current percentCurrent: ${this.state.percentCurrent}`);
19
+ if (request.direction === FanControl.StepDirection.Increase) {
20
+ if (request.wrap && this.state.percentCurrent === 100) {
21
+ this.state.percentCurrent = request.lowestOff ? 0 : 10;
22
+ }
23
+ else
24
+ this.state.percentCurrent = Math.min(this.state.percentCurrent + 10, 100);
25
+ }
26
+ else if (request.direction === FanControl.StepDirection.Decrease) {
27
+ if (request.wrap && this.state.percentCurrent === (request.lowestOff ? 0 : 10)) {
28
+ this.state.percentCurrent = 100;
29
+ }
30
+ else
31
+ this.state.percentCurrent = Math.max(this.state.percentCurrent - 10, request.lowestOff ? 0 : 10);
32
+ }
33
+ device.log.debug('Set percentCurrent to:', this.state.percentCurrent);
34
+ }
35
+ }
@@ -0,0 +1,8 @@
1
+ import { HepaFilterMonitoringServer } from '@matter/node/behaviors/hepa-filter-monitoring';
2
+ import { HepaFilterMonitoring } from '@matter/types/clusters/hepa-filter-monitoring';
3
+ import { ResourceMonitoring } from '@matter/types/clusters/resource-monitoring';
4
+ declare const MatterbridgeHepaFilterMonitoringServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<HepaFilterMonitoring.Cluster, readonly [ResourceMonitoring.Feature.Condition]>, typeof HepaFilterMonitoringServer, import("@matter/node/behaviors").ResourceMonitoringInterface>;
5
+ export declare class MatterbridgeHepaFilterMonitoringServer extends MatterbridgeHepaFilterMonitoringServer_base {
6
+ resetCondition(): Promise<void>;
7
+ }
8
+ export {};
@@ -0,0 +1,20 @@
1
+ import { HepaFilterMonitoringServer } from '@matter/node/behaviors/hepa-filter-monitoring';
2
+ import { ResourceMonitoring } from '@matter/types/clusters/resource-monitoring';
3
+ import { MatterbridgeServer } from './matterbridgeServer.js';
4
+ export class MatterbridgeHepaFilterMonitoringServer extends HepaFilterMonitoringServer.with(ResourceMonitoring.Feature.Condition) {
5
+ async resetCondition() {
6
+ const device = this.endpoint.stateOf(MatterbridgeServer);
7
+ device.log.info(`Resetting condition (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
8
+ await device.commandHandler.executeHandler('HepaFilterMonitoring.resetCondition', {
9
+ command: 'resetCondition',
10
+ request: {},
11
+ cluster: MatterbridgeHepaFilterMonitoringServer.id,
12
+ attributes: this.state,
13
+ endpoint: this.endpoint,
14
+ context: this.context,
15
+ });
16
+ this.state.condition = 100;
17
+ this.state.lastChangedTime = Math.floor(new Date().getTime() / 1000);
18
+ device.log.debug(`MatterbridgeHepaFilterMonitoringServer: resetCondition called`);
19
+ }
20
+ }
@@ -0,0 +1,6 @@
1
+ import { IdentifyServer } from '@matter/node/behaviors/identify';
2
+ import { Identify } from '@matter/types/clusters/identify';
3
+ export declare class MatterbridgeIdentifyServer extends IdentifyServer {
4
+ identify(request: Identify.IdentifyRequest): Promise<void>;
5
+ triggerEffect(request: Identify.TriggerEffectRequest): Promise<void>;
6
+ }
@@ -0,0 +1,32 @@
1
+ import { IdentifyServer } from '@matter/node/behaviors/identify';
2
+ import { MatterbridgeServer } from './matterbridgeServer.js';
3
+ export class MatterbridgeIdentifyServer extends IdentifyServer {
4
+ async identify(request) {
5
+ const device = this.endpoint.stateOf(MatterbridgeServer);
6
+ device.log.info(`Identifying device for ${request.identifyTime} seconds (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
7
+ await device.commandHandler.executeHandler('Identify.identify', {
8
+ command: 'identify',
9
+ request,
10
+ cluster: IdentifyServer.id,
11
+ attributes: this.state,
12
+ endpoint: this.endpoint,
13
+ context: this.context,
14
+ });
15
+ device.log.debug(`MatterbridgeIdentifyServer: identify called`);
16
+ await super.identify(request);
17
+ }
18
+ async triggerEffect(request) {
19
+ const device = this.endpoint.stateOf(MatterbridgeServer);
20
+ device.log.info(`Triggering effect ${request.effectIdentifier} variant ${request.effectVariant} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
21
+ await device.commandHandler.executeHandler('Identify.triggerEffect', {
22
+ command: 'triggerEffect',
23
+ request,
24
+ cluster: IdentifyServer.id,
25
+ attributes: this.state,
26
+ endpoint: this.endpoint,
27
+ context: this.context,
28
+ });
29
+ device.log.debug(`MatterbridgeIdentifyServer: triggerEffect called`);
30
+ await super.triggerEffect(request);
31
+ }
32
+ }
@@ -0,0 +1,6 @@
1
+ import { LevelControlServer } from '@matter/node/behaviors/level-control';
2
+ import { LevelControl } from '@matter/types/clusters/level-control';
3
+ export declare class MatterbridgeLevelControlServer extends LevelControlServer {
4
+ moveToLevel(request: LevelControl.MoveToLevelRequest): Promise<void>;
5
+ moveToLevelWithOnOff(request: LevelControl.MoveToLevelRequest): Promise<void>;
6
+ }
@@ -0,0 +1,32 @@
1
+ import { LevelControlServer } from '@matter/node/behaviors/level-control';
2
+ import { MatterbridgeServer } from './matterbridgeServer.js';
3
+ export class MatterbridgeLevelControlServer extends LevelControlServer {
4
+ async moveToLevel(request) {
5
+ const device = this.endpoint.stateOf(MatterbridgeServer);
6
+ device.log.info(`Setting level to ${request.level} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
7
+ await device.commandHandler.executeHandler('LevelControl.moveToLevel', {
8
+ command: 'moveToLevel',
9
+ request,
10
+ cluster: LevelControlServer.id,
11
+ attributes: this.state,
12
+ endpoint: this.endpoint,
13
+ context: this.context,
14
+ });
15
+ device.log.debug(`MatterbridgeLevelControlServer: moveToLevel called`);
16
+ await super.moveToLevel(request);
17
+ }
18
+ async moveToLevelWithOnOff(request) {
19
+ const device = this.endpoint.stateOf(MatterbridgeServer);
20
+ device.log.info(`Setting level to ${request.level} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
21
+ await device.commandHandler.executeHandler('LevelControl.moveToLevelWithOnOff', {
22
+ command: 'moveToLevelWithOnOff',
23
+ request,
24
+ cluster: LevelControlServer.id,
25
+ attributes: this.state,
26
+ endpoint: this.endpoint,
27
+ context: this.context,
28
+ });
29
+ device.log.debug(`MatterbridgeLevelControlServer: moveToLevelWithOnOff called`);
30
+ await super.moveToLevelWithOnOff(request);
31
+ }
32
+ }
@@ -0,0 +1,14 @@
1
+ import { Behavior } from '@matter/node';
2
+ import { AnsiLogger } from 'node-ansi-logger';
3
+ import { CommandHandler } from '../matterbridgeEndpointCommandHandler.js';
4
+ export declare class MatterbridgeServer extends Behavior {
5
+ static readonly id = "matterbridge";
6
+ state: MatterbridgeServer.State;
7
+ initialize(): void;
8
+ }
9
+ export declare namespace MatterbridgeServer {
10
+ class State {
11
+ log: AnsiLogger;
12
+ commandHandler: CommandHandler;
13
+ }
14
+ }
@@ -0,0 +1,15 @@
1
+ import { Behavior } from '@matter/node';
2
+ export class MatterbridgeServer extends Behavior {
3
+ static id = 'matterbridge';
4
+ initialize() {
5
+ this.state.log.debug(`MatterbridgeServer initialized (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
6
+ super.initialize();
7
+ }
8
+ }
9
+ (function (MatterbridgeServer) {
10
+ class State {
11
+ log;
12
+ commandHandler;
13
+ }
14
+ MatterbridgeServer.State = State;
15
+ })(MatterbridgeServer || (MatterbridgeServer = {}));
@@ -0,0 +1,5 @@
1
+ import { ModeSelectServer } from '@matter/node/behaviors/mode-select';
2
+ import { ModeSelect } from '@matter/types/clusters/mode-select';
3
+ export declare class MatterbridgeModeSelectServer extends ModeSelectServer {
4
+ changeToMode(request: ModeSelect.ChangeToModeRequest): Promise<void>;
5
+ }
@@ -0,0 +1,18 @@
1
+ import { ModeSelectServer } from '@matter/node/behaviors/mode-select';
2
+ import { MatterbridgeServer } from './matterbridgeServer.js';
3
+ export class MatterbridgeModeSelectServer extends ModeSelectServer {
4
+ async changeToMode(request) {
5
+ const device = this.endpoint.stateOf(MatterbridgeServer);
6
+ device.log.info(`Changing mode to ${request.newMode} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
7
+ await device.commandHandler.executeHandler('ModeSelect.changeToMode', {
8
+ command: 'changeToMode',
9
+ request,
10
+ cluster: ModeSelectServer.id,
11
+ attributes: this.state,
12
+ endpoint: this.endpoint,
13
+ context: this.context,
14
+ });
15
+ device.log.debug(`MatterbridgeModeSelectServer: changeToMode called with mode: ${request.newMode}`);
16
+ await super.changeToMode(request);
17
+ }
18
+ }
@@ -0,0 +1,6 @@
1
+ import { OnOffServer } from '@matter/node/behaviors/on-off';
2
+ export declare class MatterbridgeOnOffServer extends OnOffServer {
3
+ on(): Promise<void>;
4
+ off(): Promise<void>;
5
+ toggle(): Promise<void>;
6
+ }
@@ -0,0 +1,46 @@
1
+ import { OnOffServer } from '@matter/node/behaviors/on-off';
2
+ import { MatterbridgeServer } from './matterbridgeServer.js';
3
+ export class MatterbridgeOnOffServer extends OnOffServer {
4
+ async on() {
5
+ const device = this.endpoint.stateOf(MatterbridgeServer);
6
+ device.log.info(`Switching device on (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
7
+ await device.commandHandler.executeHandler('OnOff.on', {
8
+ command: 'on',
9
+ request: {},
10
+ cluster: OnOffServer.id,
11
+ attributes: this.state,
12
+ endpoint: this.endpoint,
13
+ context: this.context,
14
+ });
15
+ device.log.debug(`MatterbridgeOnOffServer: on called`);
16
+ await super.on();
17
+ }
18
+ async off() {
19
+ const device = this.endpoint.stateOf(MatterbridgeServer);
20
+ device.log.info(`Switching device off (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
21
+ await device.commandHandler.executeHandler('OnOff.off', {
22
+ command: 'off',
23
+ request: {},
24
+ cluster: OnOffServer.id,
25
+ attributes: this.state,
26
+ endpoint: this.endpoint,
27
+ context: this.context,
28
+ });
29
+ device.log.debug(`MatterbridgeOnOffServer: off called`);
30
+ await super.off();
31
+ }
32
+ async toggle() {
33
+ const device = this.endpoint.stateOf(MatterbridgeServer);
34
+ device.log.info(`Toggle device on/off (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
35
+ await device.commandHandler.executeHandler('OnOff.toggle', {
36
+ command: 'toggle',
37
+ request: {},
38
+ cluster: OnOffServer.id,
39
+ attributes: this.state,
40
+ endpoint: this.endpoint,
41
+ context: this.context,
42
+ });
43
+ device.log.debug(`MatterbridgeOnOffServer: toggle called`);
44
+ await super.toggle();
45
+ }
46
+ }
@@ -0,0 +1,10 @@
1
+ import { MaybePromise } from '@matter/general';
2
+ import { OperationalStateServer } from '@matter/node/behaviors/operational-state';
3
+ import { OperationalState } from '@matter/types/clusters/operational-state';
4
+ export declare class MatterbridgeOperationalStateServer extends OperationalStateServer {
5
+ initialize(): MaybePromise;
6
+ pause(): Promise<OperationalState.OperationalCommandResponse>;
7
+ stop(): Promise<OperationalState.OperationalCommandResponse>;
8
+ start(): Promise<OperationalState.OperationalCommandResponse>;
9
+ resume(): Promise<OperationalState.OperationalCommandResponse>;
10
+ }
@@ -0,0 +1,84 @@
1
+ import { OperationalStateServer } from '@matter/node/behaviors/operational-state';
2
+ import { OperationalState } from '@matter/types/clusters/operational-state';
3
+ import { MatterbridgeServer } from './matterbridgeServer.js';
4
+ export class MatterbridgeOperationalStateServer extends OperationalStateServer {
5
+ initialize() {
6
+ const device = this.endpoint.stateOf(MatterbridgeServer);
7
+ device.log.debug('MatterbridgeOperationalStateServer initialized: setting operational state to Stopped');
8
+ this.state.operationalState = OperationalState.OperationalStateEnum.Stopped;
9
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' };
10
+ super.initialize();
11
+ }
12
+ async pause() {
13
+ const device = this.endpoint.stateOf(MatterbridgeServer);
14
+ device.log.info(`Pause (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
15
+ await device.commandHandler.executeHandler('OperationalState.pause', {
16
+ command: 'pause',
17
+ request: {},
18
+ cluster: OperationalStateServer.id,
19
+ attributes: this.state,
20
+ endpoint: this.endpoint,
21
+ context: this.context,
22
+ });
23
+ device.log.debug('MatterbridgeOperationalStateServer: pause called setting operational state to Paused');
24
+ this.state.operationalState = OperationalState.OperationalStateEnum.Paused;
25
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' };
26
+ return {
27
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' },
28
+ };
29
+ }
30
+ async stop() {
31
+ const device = this.endpoint.stateOf(MatterbridgeServer);
32
+ device.log.info(`Stop (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
33
+ await device.commandHandler.executeHandler('OperationalState.stop', {
34
+ command: 'stop',
35
+ request: {},
36
+ cluster: OperationalStateServer.id,
37
+ attributes: this.state,
38
+ endpoint: this.endpoint,
39
+ context: this.context,
40
+ });
41
+ device.log.debug('MatterbridgeOperationalStateServer: stop called setting operational state to Stopped');
42
+ this.state.operationalState = OperationalState.OperationalStateEnum.Stopped;
43
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' };
44
+ return {
45
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' },
46
+ };
47
+ }
48
+ async start() {
49
+ const device = this.endpoint.stateOf(MatterbridgeServer);
50
+ device.log.info(`Start (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
51
+ await device.commandHandler.executeHandler('OperationalState.start', {
52
+ command: 'start',
53
+ request: {},
54
+ cluster: OperationalStateServer.id,
55
+ attributes: this.state,
56
+ endpoint: this.endpoint,
57
+ context: this.context,
58
+ });
59
+ device.log.debug('MatterbridgeOperationalStateServer: start called setting operational state to Running');
60
+ this.state.operationalState = OperationalState.OperationalStateEnum.Running;
61
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' };
62
+ return {
63
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' },
64
+ };
65
+ }
66
+ async resume() {
67
+ const device = this.endpoint.stateOf(MatterbridgeServer);
68
+ device.log.info(`Resume (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
69
+ await device.commandHandler.executeHandler('OperationalState.resume', {
70
+ command: 'resume',
71
+ request: {},
72
+ cluster: OperationalStateServer.id,
73
+ attributes: this.state,
74
+ endpoint: this.endpoint,
75
+ context: this.context,
76
+ });
77
+ device.log.debug('MatterbridgeOperationalStateServer: resume called setting operational state to Running');
78
+ this.state.operationalState = OperationalState.OperationalStateEnum.Running;
79
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' };
80
+ return {
81
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' },
82
+ };
83
+ }
84
+ }
@@ -0,0 +1,32 @@
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 {};
@@ -0,0 +1,168 @@
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
+ }
@@ -0,0 +1,4 @@
1
+ import { PowerSourceServer } from '@matter/node/behaviors/power-source';
2
+ export declare class MatterbridgePowerSourceServer extends PowerSourceServer {
3
+ initialize(): Promise<void>;
4
+ }
@@ -0,0 +1,21 @@
1
+ import { PowerSourceServer } from '@matter/node/behaviors/power-source';
2
+ import { MatterbridgeServer } from './matterbridgeServer.js';
3
+ export class MatterbridgePowerSourceServer extends PowerSourceServer {
4
+ async initialize() {
5
+ await super.initialize();
6
+ const device = this.endpoint.stateOf(MatterbridgeServer);
7
+ device.log.info(`Initializing MatterbridgePowerSourceServer (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
8
+ this.state.endpointList = [this.endpoint.number];
9
+ this.endpoint.construction.onSuccess(async () => {
10
+ device.log.debug(`MatterbridgePowerSourceServer: endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber} construction completed`);
11
+ const endpointList = [this.endpoint.number];
12
+ for (const endpoint of this.endpoint.parts) {
13
+ if (endpoint.lifecycle.isReady) {
14
+ endpointList.push(endpoint.number);
15
+ }
16
+ }
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(', ')}`);
19
+ });
20
+ }
21
+ }
@@ -0,0 +1,5 @@
1
+ import { ServiceAreaServer } from '@matter/node/behaviors/service-area';
2
+ import { ServiceArea } from '@matter/types/clusters/service-area';
3
+ export declare class MatterbridgeServiceAreaServer extends ServiceAreaServer {
4
+ selectAreas(request: ServiceArea.SelectAreasRequest): Promise<ServiceArea.SelectAreasResponse>;
5
+ }