@matterbridge/core 3.10.7-dev-20260822-149e3eb → 3.10.7-dev-20260823-6142c00

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.
@@ -1,3 +1,4 @@
1
+ import type { MaybePromise } from '@matter/general';
1
2
  import { ColorControlServer } from '@matter/node/behaviors/color-control';
2
3
  import { ColorControl } from '@matter/types/clusters/color-control';
3
4
  declare const MatterbridgeColorControlServer_base: import("@matter/node").ClusterBehavior.Type<typeof ColorControlServer, import("@matter/types").ClusterType.WithSupportedFeatures<ColorControl, {
@@ -8,6 +9,7 @@ declare const MatterbridgeColorControlServer_base: import("@matter/node").Cluste
8
9
  xy: true;
9
10
  }>, import("@matter/types").ClusterType.Concrete, typeof import("@matter/node/behaviors/color-control").ColorControlBaseServer.Internal, "colorControl">;
10
11
  export declare class MatterbridgeColorControlServer extends MatterbridgeColorControlServer_base {
12
+ initialize(): MaybePromise;
11
13
  moveToHue(request: ColorControl.MoveToHueRequest): Promise<void>;
12
14
  moveHue(request: ColorControl.MoveHueRequest): Promise<void>;
13
15
  stepHue(request: ColorControl.StepHueRequest): Promise<void>;
@@ -2,9 +2,18 @@ import { ColorControlServer } from '@matter/node/behaviors/color-control';
2
2
  import { ColorControl } from '@matter/types/clusters/color-control';
3
3
  import { MatterbridgeServer } from './matterbridgeServer.js';
4
4
  export class MatterbridgeColorControlServer extends ColorControlServer.with(ColorControl.Feature.HueSaturation, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature, ColorControl.Feature.EnhancedHue) {
5
+ initialize() {
6
+ if (process.env.MATTERBRIDGE_CHIP_TEST)
7
+ this.state.managedTransitionTimeHandling = true;
8
+ return super.initialize();
9
+ }
5
10
  async moveToHue(request) {
6
11
  const device = this.endpoint.stateOf(MatterbridgeServer);
7
12
  device.log.info(`Setting hue to ${request.hue} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
13
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
14
+ await super.moveToHue(request);
15
+ return;
16
+ }
8
17
  await device.commandHandler.executeHandler('ColorControl.moveToHue', {
9
18
  command: 'moveToHue',
10
19
  request,
@@ -19,6 +28,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
19
28
  async moveHue(request) {
20
29
  const device = this.endpoint.stateOf(MatterbridgeServer);
21
30
  device.log.info(`Moving hue with mode ${request.moveMode} and rate ${request.rate} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
31
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
32
+ await super.moveHue(request);
33
+ return;
34
+ }
22
35
  await device.commandHandler.executeHandler('ColorControl.moveHue', {
23
36
  command: 'moveHue',
24
37
  request,
@@ -33,6 +46,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
33
46
  async stepHue(request) {
34
47
  const device = this.endpoint.stateOf(MatterbridgeServer);
35
48
  device.log.info(`Stepping hue with mode ${request.stepMode} and size ${request.stepSize} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
49
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
50
+ await super.stepHue(request);
51
+ return;
52
+ }
36
53
  await device.commandHandler.executeHandler('ColorControl.stepHue', {
37
54
  command: 'stepHue',
38
55
  request,
@@ -47,6 +64,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
47
64
  async enhancedMoveToHue(request) {
48
65
  const device = this.endpoint.stateOf(MatterbridgeServer);
49
66
  device.log.info(`Setting enhanced hue to ${request.enhancedHue} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
67
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
68
+ await super.enhancedMoveToHue(request);
69
+ return;
70
+ }
50
71
  await device.commandHandler.executeHandler('ColorControl.enhancedMoveToHue', {
51
72
  command: 'enhancedMoveToHue',
52
73
  request,
@@ -61,6 +82,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
61
82
  async enhancedMoveHue(request) {
62
83
  const device = this.endpoint.stateOf(MatterbridgeServer);
63
84
  device.log.info(`Moving enhanced hue with mode ${request.moveMode} and rate ${request.rate} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
85
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
86
+ await super.enhancedMoveHue(request);
87
+ return;
88
+ }
64
89
  await device.commandHandler.executeHandler('ColorControl.enhancedMoveHue', {
65
90
  command: 'enhancedMoveHue',
66
91
  request,
@@ -75,6 +100,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
75
100
  async enhancedStepHue(request) {
76
101
  const device = this.endpoint.stateOf(MatterbridgeServer);
77
102
  device.log.info(`Stepping enhanced hue with mode ${request.stepMode} and size ${request.stepSize} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
103
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
104
+ await super.enhancedStepHue(request);
105
+ return;
106
+ }
78
107
  await device.commandHandler.executeHandler('ColorControl.enhancedStepHue', {
79
108
  command: 'enhancedStepHue',
80
109
  request,
@@ -89,6 +118,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
89
118
  async moveToSaturation(request) {
90
119
  const device = this.endpoint.stateOf(MatterbridgeServer);
91
120
  device.log.info(`Setting saturation to ${request.saturation} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
121
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
122
+ await super.moveToSaturation(request);
123
+ return;
124
+ }
92
125
  await device.commandHandler.executeHandler('ColorControl.moveToSaturation', {
93
126
  command: 'moveToSaturation',
94
127
  request,
@@ -103,6 +136,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
103
136
  async moveSaturation(request) {
104
137
  const device = this.endpoint.stateOf(MatterbridgeServer);
105
138
  device.log.info(`Moving saturation with mode ${request.moveMode} and rate ${request.rate} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
139
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
140
+ await super.moveSaturation(request);
141
+ return;
142
+ }
106
143
  await device.commandHandler.executeHandler('ColorControl.moveSaturation', {
107
144
  command: 'moveSaturation',
108
145
  request,
@@ -117,6 +154,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
117
154
  async stepSaturation(request) {
118
155
  const device = this.endpoint.stateOf(MatterbridgeServer);
119
156
  device.log.info(`Stepping saturation with mode ${request.stepMode} and size ${request.stepSize} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
157
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
158
+ await super.stepSaturation(request);
159
+ return;
160
+ }
120
161
  await device.commandHandler.executeHandler('ColorControl.stepSaturation', {
121
162
  command: 'stepSaturation',
122
163
  request,
@@ -131,6 +172,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
131
172
  async moveToHueAndSaturation(request) {
132
173
  const device = this.endpoint.stateOf(MatterbridgeServer);
133
174
  device.log.info(`Setting hue to ${request.hue} and saturation to ${request.saturation} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
175
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
176
+ await super.moveToHueAndSaturation(request);
177
+ return;
178
+ }
134
179
  await device.commandHandler.executeHandler('ColorControl.moveToHueAndSaturation', {
135
180
  command: 'moveToHueAndSaturation',
136
181
  request,
@@ -145,6 +190,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
145
190
  async enhancedMoveToHueAndSaturation(request) {
146
191
  const device = this.endpoint.stateOf(MatterbridgeServer);
147
192
  device.log.info(`Setting enhanced hue to ${request.enhancedHue} and saturation to ${request.saturation} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
193
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
194
+ await super.enhancedMoveToHueAndSaturation(request);
195
+ return;
196
+ }
148
197
  await device.commandHandler.executeHandler('ColorControl.enhancedMoveToHueAndSaturation', {
149
198
  command: 'enhancedMoveToHueAndSaturation',
150
199
  request,
@@ -159,6 +208,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
159
208
  async moveToColor(request) {
160
209
  const device = this.endpoint.stateOf(MatterbridgeServer);
161
210
  device.log.info(`Setting color to ${request.colorX}, ${request.colorY} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
211
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
212
+ await super.moveToColor(request);
213
+ return;
214
+ }
162
215
  await device.commandHandler.executeHandler('ColorControl.moveToColor', {
163
216
  command: 'moveToColor',
164
217
  request,
@@ -173,6 +226,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
173
226
  async moveColor(request) {
174
227
  const device = this.endpoint.stateOf(MatterbridgeServer);
175
228
  device.log.info(`Moving color with rateX ${request.rateX} and rateY ${request.rateY} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
229
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
230
+ await super.moveColor(request);
231
+ return;
232
+ }
176
233
  await device.commandHandler.executeHandler('ColorControl.moveColor', {
177
234
  command: 'moveColor',
178
235
  request,
@@ -187,6 +244,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
187
244
  async stepColor(request) {
188
245
  const device = this.endpoint.stateOf(MatterbridgeServer);
189
246
  device.log.info(`Stepping color with stepX ${request.stepX} and stepY ${request.stepY} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
247
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
248
+ await super.stepColor(request);
249
+ return;
250
+ }
190
251
  await device.commandHandler.executeHandler('ColorControl.stepColor', {
191
252
  command: 'stepColor',
192
253
  request,
@@ -201,6 +262,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
201
262
  async moveToColorTemperature(request) {
202
263
  const device = this.endpoint.stateOf(MatterbridgeServer);
203
264
  device.log.info(`Setting color temperature to ${request.colorTemperatureMireds} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
265
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
266
+ await super.moveToColorTemperature(request);
267
+ return;
268
+ }
204
269
  await device.commandHandler.executeHandler('ColorControl.moveToColorTemperature', {
205
270
  command: 'moveToColorTemperature',
206
271
  request,
@@ -215,6 +280,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
215
280
  async moveColorTemperature(request) {
216
281
  const device = this.endpoint.stateOf(MatterbridgeServer);
217
282
  device.log.info(`Moving color temperature with mode ${request.moveMode} and rate ${request.rate} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
283
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
284
+ await super.moveColorTemperature(request);
285
+ return;
286
+ }
218
287
  await device.commandHandler.executeHandler('ColorControl.moveColorTemperature', {
219
288
  command: 'moveColorTemperature',
220
289
  request,
@@ -229,6 +298,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
229
298
  async stepColorTemperature(request) {
230
299
  const device = this.endpoint.stateOf(MatterbridgeServer);
231
300
  device.log.info(`Stepping color temperature with mode ${request.stepMode} and size ${request.stepSize} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
301
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
302
+ await super.stepColorTemperature(request);
303
+ return;
304
+ }
232
305
  await device.commandHandler.executeHandler('ColorControl.stepColorTemperature', {
233
306
  command: 'stepColorTemperature',
234
307
  request,
@@ -243,6 +316,10 @@ export class MatterbridgeColorControlServer extends ColorControlServer.with(Colo
243
316
  async stopMoveStep(request) {
244
317
  const device = this.endpoint.stateOf(MatterbridgeServer);
245
318
  device.log.info(`Stopping color move/step (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
319
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
320
+ await super.stopMoveStep(request);
321
+ return;
322
+ }
246
323
  await device.commandHandler.executeHandler('ColorControl.stopMoveStep', {
247
324
  command: 'stopMoveStep',
248
325
  request,
@@ -1,6 +1,8 @@
1
+ import type { MaybePromise } from '@matter/general';
1
2
  import { LevelControlServer } from '@matter/node/behaviors/level-control';
2
3
  import type { LevelControl } from '@matter/types/clusters/level-control';
3
4
  export declare class MatterbridgeLevelControlServer extends LevelControlServer {
5
+ initialize(): MaybePromise;
4
6
  moveToLevel(request: LevelControl.MoveToLevelRequest): Promise<void>;
5
7
  moveToLevelWithOnOff(request: LevelControl.MoveToLevelRequest): Promise<void>;
6
8
  move(request: LevelControl.MoveRequest): Promise<void>;
@@ -1,9 +1,18 @@
1
1
  import { LevelControlServer } from '@matter/node/behaviors/level-control';
2
2
  import { MatterbridgeServer } from './matterbridgeServer.js';
3
3
  export class MatterbridgeLevelControlServer extends LevelControlServer {
4
+ initialize() {
5
+ if (process.env.MATTERBRIDGE_CHIP_TEST)
6
+ this.state.managedTransitionTimeHandling = true;
7
+ return super.initialize();
8
+ }
4
9
  async moveToLevel(request) {
5
10
  const device = this.endpoint.stateOf(MatterbridgeServer);
6
11
  device.log.info(`Setting level to ${request.level} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
12
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
13
+ await super.moveToLevel(request);
14
+ return;
15
+ }
7
16
  await device.commandHandler.executeHandler('LevelControl.moveToLevel', {
8
17
  command: 'moveToLevel',
9
18
  request,
@@ -18,6 +27,10 @@ export class MatterbridgeLevelControlServer extends LevelControlServer {
18
27
  async moveToLevelWithOnOff(request) {
19
28
  const device = this.endpoint.stateOf(MatterbridgeServer);
20
29
  device.log.info(`Setting level to ${request.level} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
30
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
31
+ await super.moveToLevelWithOnOff(request);
32
+ return;
33
+ }
21
34
  await device.commandHandler.executeHandler('LevelControl.moveToLevelWithOnOff', {
22
35
  command: 'moveToLevelWithOnOff',
23
36
  request,
@@ -32,6 +45,10 @@ export class MatterbridgeLevelControlServer extends LevelControlServer {
32
45
  async move(request) {
33
46
  const device = this.endpoint.stateOf(MatterbridgeServer);
34
47
  device.log.info(`Moving level with mode ${request.moveMode} and rate ${request.rate} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
48
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
49
+ await super.move(request);
50
+ return;
51
+ }
35
52
  await device.commandHandler.executeHandler('LevelControl.move', {
36
53
  command: 'move',
37
54
  request,
@@ -46,6 +63,10 @@ export class MatterbridgeLevelControlServer extends LevelControlServer {
46
63
  async moveWithOnOff(request) {
47
64
  const device = this.endpoint.stateOf(MatterbridgeServer);
48
65
  device.log.info(`Moving level with mode ${request.moveMode} and rate ${request.rate} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
66
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
67
+ await super.moveWithOnOff(request);
68
+ return;
69
+ }
49
70
  await device.commandHandler.executeHandler('LevelControl.moveWithOnOff', {
50
71
  command: 'moveWithOnOff',
51
72
  request,
@@ -60,6 +81,10 @@ export class MatterbridgeLevelControlServer extends LevelControlServer {
60
81
  async step(request) {
61
82
  const device = this.endpoint.stateOf(MatterbridgeServer);
62
83
  device.log.info(`Stepping level with mode ${request.stepMode} and size ${request.stepSize} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
84
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
85
+ await super.step(request);
86
+ return;
87
+ }
63
88
  await device.commandHandler.executeHandler('LevelControl.step', {
64
89
  command: 'step',
65
90
  request,
@@ -74,6 +99,10 @@ export class MatterbridgeLevelControlServer extends LevelControlServer {
74
99
  async stepWithOnOff(request) {
75
100
  const device = this.endpoint.stateOf(MatterbridgeServer);
76
101
  device.log.info(`Stepping level with mode ${request.stepMode} and size ${request.stepSize} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
102
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
103
+ await super.stepWithOnOff(request);
104
+ return;
105
+ }
77
106
  await device.commandHandler.executeHandler('LevelControl.stepWithOnOff', {
78
107
  command: 'stepWithOnOff',
79
108
  request,
@@ -88,6 +117,10 @@ export class MatterbridgeLevelControlServer extends LevelControlServer {
88
117
  async stop(request) {
89
118
  const device = this.endpoint.stateOf(MatterbridgeServer);
90
119
  device.log.info(`Stopping level change (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
120
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
121
+ await super.stop(request);
122
+ return;
123
+ }
91
124
  await device.commandHandler.executeHandler('LevelControl.stop', {
92
125
  command: 'stop',
93
126
  request,
@@ -102,6 +135,10 @@ export class MatterbridgeLevelControlServer extends LevelControlServer {
102
135
  async stopWithOnOff(request) {
103
136
  const device = this.endpoint.stateOf(MatterbridgeServer);
104
137
  device.log.info(`Stopping level change (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
138
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
139
+ await super.stopWithOnOff(request);
140
+ return;
141
+ }
105
142
  await device.commandHandler.executeHandler('LevelControl.stopWithOnOff', {
106
143
  command: 'stopWithOnOff',
107
144
  request,
@@ -5,96 +5,108 @@ export class MatterbridgeOnOffServer extends OnOffServer.with(OnOff.Feature.Ligh
5
5
  async on() {
6
6
  const device = this.endpoint.stateOf(MatterbridgeServer);
7
7
  device.log.info(`Switching device on (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
8
- if (!process.env.MATTERBRIDGE_CHIP_TEST) {
9
- await device.commandHandler.executeHandler('OnOff.on', {
10
- command: 'on',
11
- request: {},
12
- cluster: OnOffServer.id,
13
- attributes: this.state,
14
- endpoint: this.endpoint,
15
- context: this.context,
16
- });
8
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
9
+ await super.on();
10
+ return;
17
11
  }
12
+ await device.commandHandler.executeHandler('OnOff.on', {
13
+ command: 'on',
14
+ request: {},
15
+ cluster: OnOffServer.id,
16
+ attributes: this.state,
17
+ endpoint: this.endpoint,
18
+ context: this.context,
19
+ });
18
20
  device.log.debug(`MatterbridgeOnOffServer: on called`);
19
21
  await super.on();
20
22
  }
21
23
  async off() {
22
24
  const device = this.endpoint.stateOf(MatterbridgeServer);
23
25
  device.log.info(`Switching device off (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
24
- if (!process.env.MATTERBRIDGE_CHIP_TEST) {
25
- await device.commandHandler.executeHandler('OnOff.off', {
26
- command: 'off',
27
- request: {},
28
- cluster: OnOffServer.id,
29
- attributes: this.state,
30
- endpoint: this.endpoint,
31
- context: this.context,
32
- });
26
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
27
+ await super.off();
28
+ return;
33
29
  }
30
+ await device.commandHandler.executeHandler('OnOff.off', {
31
+ command: 'off',
32
+ request: {},
33
+ cluster: OnOffServer.id,
34
+ attributes: this.state,
35
+ endpoint: this.endpoint,
36
+ context: this.context,
37
+ });
34
38
  device.log.debug(`MatterbridgeOnOffServer: off called`);
35
39
  await super.off();
36
40
  }
37
41
  async toggle() {
38
42
  const device = this.endpoint.stateOf(MatterbridgeServer);
39
43
  device.log.info(`Toggle device on/off (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
40
- if (!process.env.MATTERBRIDGE_CHIP_TEST) {
41
- await device.commandHandler.executeHandler('OnOff.toggle', {
42
- command: 'toggle',
43
- request: {},
44
- cluster: OnOffServer.id,
45
- attributes: this.state,
46
- endpoint: this.endpoint,
47
- context: this.context,
48
- });
44
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
45
+ await super.toggle();
46
+ return;
49
47
  }
48
+ await device.commandHandler.executeHandler('OnOff.toggle', {
49
+ command: 'toggle',
50
+ request: {},
51
+ cluster: OnOffServer.id,
52
+ attributes: this.state,
53
+ endpoint: this.endpoint,
54
+ context: this.context,
55
+ });
50
56
  device.log.debug(`MatterbridgeOnOffServer: toggle called`);
51
57
  await super.toggle();
52
58
  }
53
59
  async offWithEffect(request) {
54
60
  const device = this.endpoint.stateOf(MatterbridgeServer);
55
61
  device.log.info(`Switching device off with effect ${request.effectIdentifier} and variant ${request.effectVariant} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
56
- if (!process.env.MATTERBRIDGE_CHIP_TEST) {
57
- await device.commandHandler.executeHandler('OnOff.offWithEffect', {
58
- command: 'offWithEffect',
59
- request,
60
- cluster: OnOffServer.id,
61
- attributes: this.state,
62
- endpoint: this.endpoint,
63
- context: this.context,
64
- });
62
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
63
+ await super.offWithEffect(request);
64
+ return;
65
65
  }
66
+ await device.commandHandler.executeHandler('OnOff.offWithEffect', {
67
+ command: 'offWithEffect',
68
+ request,
69
+ cluster: OnOffServer.id,
70
+ attributes: this.state,
71
+ endpoint: this.endpoint,
72
+ context: this.context,
73
+ });
66
74
  device.log.debug(`MatterbridgeOnOffServer: offWithEffect called`);
67
75
  await super.offWithEffect(request);
68
76
  }
69
77
  async onWithRecallGlobalScene() {
70
78
  const device = this.endpoint.stateOf(MatterbridgeServer);
71
79
  device.log.info(`Switching device on with recall global scene (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
72
- if (!process.env.MATTERBRIDGE_CHIP_TEST) {
73
- await device.commandHandler.executeHandler('OnOff.onWithRecallGlobalScene', {
74
- command: 'onWithRecallGlobalScene',
75
- request: {},
76
- cluster: OnOffServer.id,
77
- attributes: this.state,
78
- endpoint: this.endpoint,
79
- context: this.context,
80
- });
80
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
81
+ await super.onWithRecallGlobalScene();
82
+ return;
81
83
  }
84
+ await device.commandHandler.executeHandler('OnOff.onWithRecallGlobalScene', {
85
+ command: 'onWithRecallGlobalScene',
86
+ request: {},
87
+ cluster: OnOffServer.id,
88
+ attributes: this.state,
89
+ endpoint: this.endpoint,
90
+ context: this.context,
91
+ });
82
92
  device.log.debug(`MatterbridgeOnOffServer: onWithRecallGlobalScene called`);
83
93
  await super.onWithRecallGlobalScene();
84
94
  }
85
95
  async onWithTimedOff(request) {
86
96
  const device = this.endpoint.stateOf(MatterbridgeServer);
87
97
  device.log.info(`Switching device on with timed off control ${JSON.stringify(request.onOffControl)}, offWaitTime ${request.offWaitTime} and onTime ${request.onTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
88
- if (!process.env.MATTERBRIDGE_CHIP_TEST) {
89
- await device.commandHandler.executeHandler('OnOff.onWithTimedOff', {
90
- command: 'onWithTimedOff',
91
- request,
92
- cluster: OnOffServer.id,
93
- attributes: this.state,
94
- endpoint: this.endpoint,
95
- context: this.context,
96
- });
98
+ if (process.env.MATTERBRIDGE_CHIP_TEST) {
99
+ await super.onWithTimedOff(request);
100
+ return;
97
101
  }
102
+ await device.commandHandler.executeHandler('OnOff.onWithTimedOff', {
103
+ command: 'onWithTimedOff',
104
+ request,
105
+ cluster: OnOffServer.id,
106
+ attributes: this.state,
107
+ endpoint: this.endpoint,
108
+ context: this.context,
109
+ });
98
110
  device.log.debug(`MatterbridgeOnOffServer: onWithTimedOff called`);
99
111
  await super.onWithTimedOff(request);
100
112
  }
@@ -1,10 +1,21 @@
1
1
  import type { MaybePromise } from '@matter/general';
2
2
  import { OperationalStateServer } from '@matter/node/behaviors/operational-state';
3
3
  import { OperationalState } from '@matter/types/clusters/operational-state';
4
- export declare class MatterbridgeOperationalStateServer extends OperationalStateServer {
4
+ declare const MatterbridgeOperationalStateServerBase: import("@matter/node").ClusterBehavior.Type<typeof OperationalStateServer, import("@matter/types").ClusterType.WithEnabledAttributes<import("@matter/types").ClusterType.WithEnabledEvents<OperationalState, "operationCompletion">, never>, import("@matter/types").ClusterType.Concrete, new () => {}, "operationalState">;
5
+ export declare class MatterbridgeOperationalStateServer extends MatterbridgeOperationalStateServerBase {
6
+ protected internal: MatterbridgeOperationalStateServer.Internal;
5
7
  initialize(): MaybePromise;
6
8
  pause(): Promise<OperationalState.OperationalCommandResponse>;
7
9
  stop(): Promise<OperationalState.OperationalCommandResponse>;
8
10
  start(): Promise<OperationalState.OperationalCommandResponse>;
9
11
  resume(): Promise<OperationalState.OperationalCommandResponse>;
10
12
  }
13
+ export declare namespace MatterbridgeOperationalStateServer {
14
+ class Internal extends MatterbridgeOperationalStateServerBase.Internal {
15
+ operationalStateBeforePause: OperationalState.OperationalStateEnum;
16
+ operationStartedAt: number | undefined;
17
+ pausedAccumulatedMs: number;
18
+ pausedSinceMs: number | undefined;
19
+ }
20
+ }
21
+ export {};
@@ -1,7 +1,8 @@
1
1
  import { OperationalStateServer } from '@matter/node/behaviors/operational-state';
2
2
  import { OperationalState } from '@matter/types/clusters/operational-state';
3
3
  import { MatterbridgeServer } from './matterbridgeServer.js';
4
- export class MatterbridgeOperationalStateServer extends OperationalStateServer {
4
+ const MatterbridgeOperationalStateServerBase = OperationalStateServer.enable({ events: { operationCompletion: true } });
5
+ export class MatterbridgeOperationalStateServer extends MatterbridgeOperationalStateServerBase {
5
6
  initialize() {
6
7
  const device = this.endpoint.stateOf(MatterbridgeServer);
7
8
  device.log.debug('MatterbridgeOperationalStateServer initialized: setting operational state to Stopped');
@@ -20,7 +21,21 @@ export class MatterbridgeOperationalStateServer extends OperationalStateServer {
20
21
  endpoint: this.endpoint,
21
22
  context: this.context,
22
23
  });
24
+ if (this.state.operationalState === OperationalState.OperationalStateEnum.Paused) {
25
+ device.log.debug('MatterbridgeOperationalStateServer: pause received while already Paused, taking no further action');
26
+ return {
27
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Already paused' },
28
+ };
29
+ }
30
+ if (this.state.operationalState !== OperationalState.OperationalStateEnum.Running) {
31
+ device.log.debug(`MatterbridgeOperationalStateServer: pause received in state ${this.state.operationalState} which is not Pause-compatible`);
32
+ return {
33
+ commandResponseState: { errorStateId: OperationalState.ErrorState.CommandInvalidInState, errorStateDetails: 'Not Pause-compatible in the current operational state' },
34
+ };
35
+ }
23
36
  device.log.debug('MatterbridgeOperationalStateServer: pause called setting operational state to Paused');
37
+ this.internal.operationalStateBeforePause = this.state.operationalState;
38
+ this.internal.pausedSinceMs = Date.now();
24
39
  this.state.operationalState = OperationalState.OperationalStateEnum.Paused;
25
40
  this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' };
26
41
  return {
@@ -38,7 +53,22 @@ export class MatterbridgeOperationalStateServer extends OperationalStateServer {
38
53
  endpoint: this.endpoint,
39
54
  context: this.context,
40
55
  });
56
+ if (this.state.operationalState === OperationalState.OperationalStateEnum.Stopped) {
57
+ device.log.debug('MatterbridgeOperationalStateServer: stop received while already Stopped, taking no further action');
58
+ return {
59
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Already stopped' },
60
+ };
61
+ }
41
62
  device.log.debug('MatterbridgeOperationalStateServer: stop called setting operational state to Stopped');
63
+ if (this.internal.pausedSinceMs !== undefined) {
64
+ this.internal.pausedAccumulatedMs += Date.now() - this.internal.pausedSinceMs;
65
+ this.internal.pausedSinceMs = undefined;
66
+ }
67
+ const totalOperationalTime = this.internal.operationStartedAt === undefined ? null : Math.round((Date.now() - this.internal.operationStartedAt) / 1000);
68
+ const pausedTime = this.internal.operationStartedAt === undefined ? null : Math.round(this.internal.pausedAccumulatedMs / 1000);
69
+ this.internal.operationStartedAt = undefined;
70
+ this.internal.pausedAccumulatedMs = 0;
71
+ this.events.operationCompletion.emit({ completionErrorCode: OperationalState.ErrorState.NoError, totalOperationalTime, pausedTime }, this.context);
42
72
  this.state.operationalState = OperationalState.OperationalStateEnum.Stopped;
43
73
  this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' };
44
74
  return {
@@ -56,7 +86,27 @@ export class MatterbridgeOperationalStateServer extends OperationalStateServer {
56
86
  endpoint: this.endpoint,
57
87
  context: this.context,
58
88
  });
89
+ if (this.state.operationalState === OperationalState.OperationalStateEnum.Running) {
90
+ device.log.debug('MatterbridgeOperationalStateServer: start received while already Running, taking no further action');
91
+ return {
92
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Already running' },
93
+ };
94
+ }
95
+ if (this.state.operationalState === OperationalState.OperationalStateEnum.Error) {
96
+ device.log.debug('MatterbridgeOperationalStateServer: start received while in the Error state, unable to honor');
97
+ return {
98
+ commandResponseState: { errorStateId: OperationalState.ErrorState.UnableToStartOrResume, errorStateDetails: 'Unable to start while in the Error state' },
99
+ };
100
+ }
59
101
  device.log.debug('MatterbridgeOperationalStateServer: start called setting operational state to Running');
102
+ if (this.state.operationalState === OperationalState.OperationalStateEnum.Paused && this.internal.pausedSinceMs !== undefined) {
103
+ this.internal.pausedAccumulatedMs += Date.now() - this.internal.pausedSinceMs;
104
+ this.internal.pausedSinceMs = undefined;
105
+ }
106
+ else {
107
+ this.internal.operationStartedAt = Date.now();
108
+ this.internal.pausedAccumulatedMs = 0;
109
+ }
60
110
  this.state.operationalState = OperationalState.OperationalStateEnum.Running;
61
111
  this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' };
62
112
  return {
@@ -74,11 +124,36 @@ export class MatterbridgeOperationalStateServer extends OperationalStateServer {
74
124
  endpoint: this.endpoint,
75
125
  context: this.context,
76
126
  });
127
+ if (this.state.operationalState === OperationalState.OperationalStateEnum.Running) {
128
+ device.log.debug('MatterbridgeOperationalStateServer: resume received while already Running, taking no further action');
129
+ return {
130
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Already running' },
131
+ };
132
+ }
133
+ if (this.state.operationalState !== OperationalState.OperationalStateEnum.Paused) {
134
+ device.log.debug(`MatterbridgeOperationalStateServer: resume received in state ${this.state.operationalState} which is not Resume-compatible`);
135
+ return {
136
+ commandResponseState: { errorStateId: OperationalState.ErrorState.CommandInvalidInState, errorStateDetails: 'Not Resume-compatible in the current operational state' },
137
+ };
138
+ }
77
139
  device.log.debug('MatterbridgeOperationalStateServer: resume called setting operational state to Running');
78
- this.state.operationalState = OperationalState.OperationalStateEnum.Running;
140
+ if (this.internal.pausedSinceMs !== undefined) {
141
+ this.internal.pausedAccumulatedMs += Date.now() - this.internal.pausedSinceMs;
142
+ this.internal.pausedSinceMs = undefined;
143
+ }
144
+ this.state.operationalState = this.internal.operationalStateBeforePause;
79
145
  this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' };
80
146
  return {
81
147
  commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Fully operational' },
82
148
  };
83
149
  }
84
150
  }
151
+ (function (MatterbridgeOperationalStateServer) {
152
+ class Internal extends MatterbridgeOperationalStateServerBase.Internal {
153
+ operationalStateBeforePause = OperationalState.OperationalStateEnum.Running;
154
+ operationStartedAt;
155
+ pausedAccumulatedMs = 0;
156
+ pausedSinceMs;
157
+ }
158
+ MatterbridgeOperationalStateServer.Internal = Internal;
159
+ })(MatterbridgeOperationalStateServer || (MatterbridgeOperationalStateServer = {}));
@@ -1,11 +1,29 @@
1
+ import { type MaybePromise, type Timer } from '@matter/general';
1
2
  import { ValveConfigurationAndControlServer } from '@matter/node/behaviors/valve-configuration-and-control';
2
3
  import { ValveConfigurationAndControl } from '@matter/types/clusters/valve-configuration-and-control';
3
- declare const MatterbridgeValveConfigurationAndControlServer_base: import("@matter/node").ClusterBehavior.Type<typeof ValveConfigurationAndControlServer, import("@matter/types").ClusterType.WithSupportedFeatures<ValveConfigurationAndControl, {
4
+ declare const MatterbridgeValveConfigurationAndControlServerBase: import("@matter/node").ClusterBehavior.Type<typeof ValveConfigurationAndControlServer, import("@matter/types").ClusterType.WithSupportedFeatures<ValveConfigurationAndControl, {
4
5
  level: true;
5
6
  timeSync: false;
6
7
  }>, import("@matter/types").ClusterType.Concrete, new () => {}, "valveConfigurationAndControl">;
7
- export declare class MatterbridgeValveConfigurationAndControlServer extends MatterbridgeValveConfigurationAndControlServer_base {
8
+ export declare class MatterbridgeValveConfigurationAndControlServer extends MatterbridgeValveConfigurationAndControlServerBase {
9
+ #private;
10
+ readonly state: MatterbridgeValveConfigurationAndControlServer.State;
11
+ protected internal: MatterbridgeValveConfigurationAndControlServer.Internal;
12
+ initialize(): MaybePromise;
8
13
  open(request: ValveConfigurationAndControl.OpenRequest): Promise<void>;
9
14
  close(): Promise<void>;
15
+ [Symbol.asyncDispose](): Promise<void>;
16
+ }
17
+ export declare namespace MatterbridgeValveConfigurationAndControlServer {
18
+ class Internal extends MatterbridgeValveConfigurationAndControlServerBase.Internal {
19
+ movementTimer?: Timer;
20
+ movementFinalState: ValveConfigurationAndControl.ValveState;
21
+ movementFinalLevel: number;
22
+ autoCloseTimer?: Timer;
23
+ }
24
+ class State extends MatterbridgeValveConfigurationAndControlServerBase.State {
25
+ movementDuration: number;
26
+ autoClose: boolean;
27
+ }
10
28
  }
11
29
  export {};