@matterbridge/core 3.10.15-dev-20261020-1bd3061 → 3.11.0-dev-20261022-eb1098c

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/backend.js CHANGED
@@ -329,7 +329,7 @@ export class Backend extends EventEmitter {
329
329
  }
330
330
  async getApiSettings() {
331
331
  const start = performance.now();
332
- const response = await this.server.fetch({ type: 'matterbridge_apisettings', src: 'frontend', dst: 'matterbridge', params: undefined });
332
+ const response = await this.server.fetch({ type: 'matterbridge_apisettings', src: 'frontend', dst: 'matterbridge', params: {} });
333
333
  if (this.diagnostic)
334
334
  writeDiagnostic('Backend', `getApiSettings() took ${(performance.now() - start).toFixed(2)} ms`);
335
335
  return response.result.data;
@@ -1,3 +1,4 @@
1
+ import { type Timer } from '@matter/general';
1
2
  import { CameraAvSettingsUserLevelManagementServer } from '@matter/node/behaviors/camera-av-settings-user-level-management';
2
3
  import { CameraAvSettingsUserLevelManagement } from '@matter/types/clusters/camera-av-settings-user-level-management';
3
4
  import type { CameraAvStreamManagement } from '@matter/types/clusters/camera-av-stream-management';
@@ -11,6 +12,7 @@ declare const MatterbridgeCameraAvSettingsUserLevelManagementServer_base: import
11
12
  mechanicalZoom: true;
12
13
  }>, import("@matter/types").ClusterType.Concrete, new () => {}, "cameraAvSettingsUserLevelManagement">;
13
14
  export declare class MatterbridgeCameraAvSettingsUserLevelManagementServer extends MatterbridgeCameraAvSettingsUserLevelManagementServer_base {
15
+ #private;
14
16
  readonly endpoint: MatterbridgeEndpoint;
15
17
  protected internal: MatterbridgeCameraAvSettingsUserLevelManagementServer.Internal;
16
18
  initialize(): void;
@@ -26,10 +28,13 @@ export declare class MatterbridgeCameraAvSettingsUserLevelManagementServer exten
26
28
  private applyDptzViewport;
27
29
  dptzSetViewport(request: CameraAvSettingsUserLevelManagement.DptzSetViewportRequest): void;
28
30
  dptzRelativeMove(request: CameraAvSettingsUserLevelManagement.DptzRelativeMoveRequest): void;
31
+ [Symbol.asyncDispose](): Promise<void>;
29
32
  }
30
33
  export declare namespace MatterbridgeCameraAvSettingsUserLevelManagementServer {
31
34
  class Internal {
32
35
  lastGeneratedPresetId: number;
36
+ movementTimer?: Timer;
37
+ movementTarget?: CameraAvSettingsUserLevelManagement.Mptz;
33
38
  }
34
39
  }
35
40
  export interface CameraAvSettingsUserLevelManagementClusterOptions {
@@ -1,9 +1,11 @@
1
+ import { Millis, Time } from '@matter/general';
1
2
  import { CameraAvSettingsUserLevelManagementServer } from '@matter/node/behaviors/camera-av-settings-user-level-management';
2
3
  import { CameraAvSettingsUserLevelManagement } from '@matter/types/clusters/camera-av-settings-user-level-management';
3
4
  import { StatusResponseError } from '@matter/types/common';
4
5
  import { Status } from '@matter/types/globals';
5
6
  import { MatterbridgeCameraAvStreamManagementServer } from './cameraAvStreamManagementServer.js';
6
7
  import { MatterbridgeServer } from './matterbridgeServer.js';
8
+ const MPTZ_MOVEMENT_DURATION = Millis(100);
7
9
  function clamp(value, min, max) {
8
10
  return Math.min(Math.max(value, min), max);
9
11
  }
@@ -56,12 +58,14 @@ export class MatterbridgeCameraAvSettingsUserLevelManagementServer extends Camer
56
58
  if (zoom !== undefined && (zoom < 1 || zoom > this.state.zoomMax)) {
57
59
  throw new StatusResponseError(`MatterbridgeCameraAvSettingsUserLevelManagementServer: zoom ${zoom} is outside of the supported range [1, ${this.state.zoomMax}] (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`, Status.ConstraintError);
58
60
  }
59
- this.state.mptzPosition = {
61
+ this.#assertNotMoving('mptzSetPosition');
62
+ const target = {
60
63
  pan: pan ?? this.state.mptzPosition.pan,
61
64
  tilt: tilt ?? this.state.mptzPosition.tilt,
62
65
  zoom: zoom ?? this.state.mptzPosition.zoom,
63
66
  };
64
- device.log.info(`MatterbridgeCameraAvSettingsUserLevelManagementServer: set mechanical PTZ position to pan ${this.state.mptzPosition.pan}°, tilt ${this.state.mptzPosition.tilt}°, zoom ${this.state.mptzPosition.zoom} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
67
+ device.log.info(`MatterbridgeCameraAvSettingsUserLevelManagementServer: set mechanical PTZ position to pan ${target.pan}°, tilt ${target.tilt}°, zoom ${target.zoom} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
68
+ this.#startMovement(target);
65
69
  this.endpoint.emitCommand(CameraAvSettingsUserLevelManagement, 'mptzSetPosition', request, this.context);
66
70
  }
67
71
  mptzRelativeMove(request) {
@@ -69,12 +73,13 @@ export class MatterbridgeCameraAvSettingsUserLevelManagementServer extends Camer
69
73
  if (request.panDelta === undefined && request.tiltDelta === undefined && request.zoomDelta === undefined) {
70
74
  throw new StatusResponseError(`MatterbridgeCameraAvSettingsUserLevelManagementServer: mptzRelativeMove requires at least one of panDelta, tiltDelta or zoomDelta to be present (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`, Status.InvalidCommand);
71
75
  }
76
+ this.#assertNotMoving('mptzRelativeMove');
72
77
  const current = this.state.mptzPosition;
73
78
  const pan = request.panDelta === undefined ? current.pan : clamp((current.pan ?? 0) + request.panDelta, this.state.panMin, this.state.panMax);
74
79
  const tilt = request.tiltDelta === undefined ? current.tilt : clamp((current.tilt ?? 0) + request.tiltDelta, this.state.tiltMin, this.state.tiltMax);
75
80
  const zoom = request.zoomDelta === undefined ? current.zoom : clamp((current.zoom ?? 1) + request.zoomDelta, 1, this.state.zoomMax);
76
- this.state.mptzPosition = { pan, tilt, zoom };
77
81
  device.log.info(`MatterbridgeCameraAvSettingsUserLevelManagementServer: moved mechanical PTZ position by pan ${request.panDelta ?? 0}°, tilt ${request.tiltDelta ?? 0}°, zoom ${request.zoomDelta ?? 0} to pan ${pan}°, tilt ${tilt}°, zoom ${zoom} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
82
+ this.#startMovement({ pan, tilt, zoom });
78
83
  this.endpoint.emitCommand(CameraAvSettingsUserLevelManagement, 'mptzRelativeMove', request, this.context);
79
84
  }
80
85
  mptzMoveToPreset(request) {
@@ -87,10 +92,28 @@ export class MatterbridgeCameraAvSettingsUserLevelManagementServer extends Camer
87
92
  if (preset === undefined) {
88
93
  throw new StatusResponseError(`MatterbridgeCameraAvSettingsUserLevelManagementServer: presetId ${presetId} is not present in mptzPresets (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`, Status.NotFound);
89
94
  }
90
- this.state.mptzPosition = preset.settings;
95
+ this.#assertNotMoving('mptzMoveToPreset');
91
96
  device.log.info(`MatterbridgeCameraAvSettingsUserLevelManagementServer: moved mechanical PTZ position to preset ${presetId} "${preset.name}": pan ${preset.settings.pan}°, tilt ${preset.settings.tilt}°, zoom ${preset.settings.zoom} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
97
+ this.#startMovement(preset.settings);
92
98
  this.endpoint.emitCommand(CameraAvSettingsUserLevelManagement, 'mptzMoveToPreset', request, this.context);
93
99
  }
100
+ #assertNotMoving(command) {
101
+ if (this.state.movementState === CameraAvSettingsUserLevelManagement.PhysicalMovement.Moving) {
102
+ throw new StatusResponseError(`MatterbridgeCameraAvSettingsUserLevelManagementServer: ${command} rejected, the camera is already moving (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`, Status.Busy);
103
+ }
104
+ }
105
+ #startMovement(target) {
106
+ this.state.movementState = CameraAvSettingsUserLevelManagement.PhysicalMovement.Moving;
107
+ this.internal.movementTarget = target;
108
+ this.internal.movementTimer = Time.getTimer('CameraAvSettingsUserLevelManagement movement complete', MPTZ_MOVEMENT_DURATION, this.callback(this.#completeMovement, { lock: true })).start();
109
+ }
110
+ #completeMovement() {
111
+ this.internal.movementTimer = undefined;
112
+ if (this.internal.movementTarget !== undefined)
113
+ this.state.mptzPosition = this.internal.movementTarget;
114
+ this.internal.movementTarget = undefined;
115
+ this.state.movementState = CameraAvSettingsUserLevelManagement.PhysicalMovement.Idle;
116
+ }
94
117
  mptzSavePreset(request) {
95
118
  const device = this.endpoint.stateOf(MatterbridgeServer);
96
119
  const { presetId, name } = request;
@@ -205,10 +228,17 @@ export class MatterbridgeCameraAvSettingsUserLevelManagementServer extends Camer
205
228
  device.log.info(`MatterbridgeCameraAvSettingsUserLevelManagementServer: moved the viewport of video stream ${videoStreamId} by deltaX ${deltaX ?? 0}, deltaY ${deltaY ?? 0}, zoomDelta ${zoomDelta ?? 0} to (${viewport.x1}, ${viewport.y1})-(${viewport.x2}, ${viewport.y2}) (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
206
229
  this.endpoint.emitCommand(CameraAvSettingsUserLevelManagement, 'dptzRelativeMove', request, this.context);
207
230
  }
231
+ async [Symbol.asyncDispose]() {
232
+ this.internal.movementTimer?.stop();
233
+ this.internal.movementTimer = undefined;
234
+ await super[Symbol.asyncDispose]?.();
235
+ }
208
236
  }
209
237
  (function (MatterbridgeCameraAvSettingsUserLevelManagementServer) {
210
238
  class Internal {
211
239
  lastGeneratedPresetId = 0;
240
+ movementTimer;
241
+ movementTarget;
212
242
  }
213
243
  MatterbridgeCameraAvSettingsUserLevelManagementServer.Internal = Internal;
214
244
  })(MatterbridgeCameraAvSettingsUserLevelManagementServer || (MatterbridgeCameraAvSettingsUserLevelManagementServer = {}));
@@ -42,8 +42,6 @@ export class MatterbridgeCameraAvStreamManagementServer extends MatterbridgeCame
42
42
  minBitRate,
43
43
  maxBitRate: minBitRate * 4,
44
44
  keyFrameInterval: 4000,
45
- ...(this.features.watermark ? { watermarkEnabled: false } : {}),
46
- ...(this.features.onScreenDisplay ? { osdEnabled: false } : {}),
47
45
  referenceCount: 0,
48
46
  },
49
47
  ];
@@ -87,8 +85,6 @@ export class MatterbridgeCameraAvStreamManagementServer extends MatterbridgeCame
87
85
  referenceCount: 0,
88
86
  encodedPixels: false,
89
87
  hardwareEncoder: false,
90
- ...(this.features.watermark ? { watermarkEnabled: false } : {}),
91
- ...(this.features.onScreenDisplay ? { osdEnabled: false } : {}),
92
88
  },
93
89
  ];
94
90
  }
@@ -2,7 +2,19 @@ import type { MaybePromise } from '@matter/general';
2
2
  import { ColorControlServer } from '@matter/node/behaviors/color-control';
3
3
  import { ColorControl } from '@matter/types/clusters/color-control';
4
4
  import type { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
5
- declare const MatterbridgeColorControlServer_base: import("@matter/node").ClusterBehavior.Type<typeof ColorControlServer, import("@matter/types").ClusterType.WithSupportedFeatures<ColorControl, {
5
+ declare const MatterbridgeColorControlServer_base: import("@matter/node").ClusterBehavior.Type<typeof ColorControlServer, import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<ColorControl, {
6
+ colorLoop: true;
7
+ colorTemperature: true;
8
+ enhancedHue: true;
9
+ hueSaturation: true;
10
+ xy: true;
11
+ }>, {
12
+ colorLoop: false;
13
+ colorTemperature: false;
14
+ enhancedHue: false;
15
+ hueSaturation: false;
16
+ xy: false;
17
+ }>, {
6
18
  colorLoop: false;
7
19
  colorTemperature: true;
8
20
  enhancedHue: true;
@@ -1,7 +1,35 @@
1
1
  import { DoorLockServer } from '@matter/node/behaviors/door-lock';
2
2
  import { DoorLock } from '@matter/types/clusters/door-lock';
3
3
  import type { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
4
- declare const MatterbridgeDoorLockServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/node").ClusterBehavior.Type<typeof DoorLockServer, import("@matter/types").ClusterType.WithSupportedFeatures<DoorLock, {
4
+ declare const MatterbridgeDoorLockServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/node").ClusterBehavior.Type<typeof DoorLockServer, import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<DoorLock, {
5
+ aliroBleuwb: false;
6
+ aliroProvisioning: false;
7
+ credentialOverTheAirAccess: true;
8
+ doorPositionSensor: true;
9
+ faceCredentials: true;
10
+ fingerCredentials: true;
11
+ holidaySchedules: true;
12
+ pinCredential: true;
13
+ rfidCredential: true;
14
+ unbolting: true;
15
+ user: true;
16
+ weekDayAccessSchedules: true;
17
+ yearDayAccessSchedules: true;
18
+ }>, {
19
+ aliroBleuwb: false;
20
+ aliroProvisioning: false;
21
+ credentialOverTheAirAccess: false;
22
+ doorPositionSensor: false;
23
+ faceCredentials: false;
24
+ fingerCredentials: false;
25
+ holidaySchedules: false;
26
+ pinCredential: false;
27
+ rfidCredential: false;
28
+ unbolting: false;
29
+ user: false;
30
+ weekDayAccessSchedules: false;
31
+ yearDayAccessSchedules: false;
32
+ }>, {
5
33
  aliroBleuwb: false;
6
34
  aliroProvisioning: false;
7
35
  credentialOverTheAirAccess: false;
@@ -15,7 +43,35 @@ declare const MatterbridgeDoorLockServer_base: import("@matter/node").ClusterBeh
15
43
  user: true;
16
44
  weekDayAccessSchedules: true;
17
45
  yearDayAccessSchedules: true;
18
- }>, import("@matter/types").ClusterType.Concrete, typeof import("@matter/node/behaviors/door-lock").DoorLockBaseServer.Internal, "doorLock">, import("@matter/types").ClusterType.WithEnabledAttributes<import("@matter/types").ClusterType.WithEnabledEvents<import("@matter/types").ClusterType.WithSupportedFeatures<DoorLock, {
46
+ }>, import("@matter/types").ClusterType.Concrete, typeof import("@matter/node/behaviors/door-lock").DoorLockBaseServer.Internal, "doorLock">, import("@matter/types").ClusterType.WithEnabledAttributes<import("@matter/types").ClusterType.WithEnabledEvents<import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<DoorLock, {
47
+ aliroBleuwb: false;
48
+ aliroProvisioning: false;
49
+ credentialOverTheAirAccess: true;
50
+ doorPositionSensor: true;
51
+ faceCredentials: true;
52
+ fingerCredentials: true;
53
+ holidaySchedules: true;
54
+ pinCredential: true;
55
+ rfidCredential: true;
56
+ unbolting: true;
57
+ user: true;
58
+ weekDayAccessSchedules: true;
59
+ yearDayAccessSchedules: true;
60
+ }>, {
61
+ aliroBleuwb: false;
62
+ aliroProvisioning: false;
63
+ credentialOverTheAirAccess: false;
64
+ doorPositionSensor: false;
65
+ faceCredentials: false;
66
+ fingerCredentials: false;
67
+ holidaySchedules: false;
68
+ pinCredential: false;
69
+ rfidCredential: false;
70
+ unbolting: false;
71
+ user: false;
72
+ weekDayAccessSchedules: false;
73
+ yearDayAccessSchedules: false;
74
+ }>, {
19
75
  aliroBleuwb: false;
20
76
  aliroProvisioning: false;
21
77
  credentialOverTheAirAccess: false;
@@ -2,7 +2,13 @@ import { type Timer } from '@matter/general';
2
2
  import { SmokeCoAlarmServer } from '@matter/node/behaviors/smoke-co-alarm';
3
3
  import { SmokeCoAlarm } from '@matter/types/clusters/smoke-co-alarm';
4
4
  import type { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
5
- declare const MatterbridgeSmokeCoAlarmServer_base: import("@matter/node").ClusterBehavior.Type<typeof SmokeCoAlarmServer, import("@matter/types").ClusterType.WithSupportedFeatures<SmokeCoAlarm, {
5
+ declare const MatterbridgeSmokeCoAlarmServer_base: import("@matter/node").ClusterBehavior.Type<typeof SmokeCoAlarmServer, import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<SmokeCoAlarm, {
6
+ coAlarm: true;
7
+ smokeAlarm: true;
8
+ }>, {
9
+ coAlarm: false;
10
+ smokeAlarm: false;
11
+ }>, {
6
12
  coAlarm: true;
7
13
  smokeAlarm: true;
8
14
  }>, import("@matter/types").ClusterType.Concrete, new () => {}, "smokeCoAlarm">;
@@ -1,7 +1,29 @@
1
1
  import { ThermostatServer } from '@matter/node/behaviors/thermostat';
2
2
  import { Thermostat } from '@matter/types/clusters/thermostat';
3
3
  import type { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
4
- declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterBehavior.Type<typeof ThermostatServer, import("@matter/types").ClusterType.WithSupportedFeatures<Thermostat, {
4
+ declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterBehavior.Type<typeof ThermostatServer, import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<Thermostat, {
5
+ autoMode: true;
6
+ cooling: true;
7
+ events: false;
8
+ heating: true;
9
+ localTemperatureNotExposed: false;
10
+ matterScheduleConfiguration: false;
11
+ occupancy: true;
12
+ presets: true;
13
+ setback: false;
14
+ thermostatSuggestions: false;
15
+ }>, {
16
+ autoMode: false;
17
+ cooling: false;
18
+ events: false;
19
+ heating: false;
20
+ localTemperatureNotExposed: false;
21
+ matterScheduleConfiguration: false;
22
+ occupancy: false;
23
+ presets: false;
24
+ setback: false;
25
+ thermostatSuggestions: false;
26
+ }>, {
5
27
  autoMode: true;
6
28
  cooling: true;
7
29
  events: false;
@@ -2,7 +2,17 @@ import { type Timer } from '@matter/general';
2
2
  import { WindowCoveringBaseServer, WindowCoveringServer } from '@matter/node/behaviors/window-covering';
3
3
  import { WindowCovering } from '@matter/types/clusters/window-covering';
4
4
  import type { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
5
- declare const MatterbridgeWindowCoveringServer_base: import("@matter/node").ClusterBehavior.Type<typeof WindowCoveringServer, import("@matter/types").ClusterType.WithSupportedFeatures<WindowCovering, {
5
+ declare const MatterbridgeWindowCoveringServer_base: import("@matter/node").ClusterBehavior.Type<typeof WindowCoveringServer, import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<import("@matter/types").ClusterType.WithSupportedFeatures<WindowCovering, {
6
+ lift: true;
7
+ positionAwareLift: true;
8
+ positionAwareTilt: true;
9
+ tilt: true;
10
+ }>, {
11
+ lift: false;
12
+ positionAwareLift: false;
13
+ positionAwareTilt: false;
14
+ tilt: false;
15
+ }>, {
6
16
  lift: true;
7
17
  positionAwareLift: true;
8
18
  positionAwareTilt: true;
package/dist/chipTests.js CHANGED
@@ -52,6 +52,11 @@ const smokeCoAlarmHardwareFaultAlertTrigger = 0xffffffff00000093n;
52
52
  const smokeCoAlarmHardwareFaultAlertClearTrigger = 0xffffffff000000a3n;
53
53
  const smokeCoAlarmEndOfServiceAlertTrigger = 0xffffffff0000009an;
54
54
  const smokeCoAlarmEndOfServiceAlertClearTrigger = 0xffffffff000000aan;
55
+ const smokeCoAlarmYamlCriticalBatteryAlertTrigger = 0x005c00000000009en;
56
+ const smokeCoAlarmYamlHardwareFaultAlertTrigger = 0x005c000000000093n;
57
+ const smokeCoAlarmYamlHardwareFaultAlertClearTrigger = 0x005c0000000000a3n;
58
+ const smokeCoAlarmYamlEndOfServiceAlertTrigger = 0x005c00000000009an;
59
+ const smokeCoAlarmYamlEndOfServiceAlertClearTrigger = 0x005c0000000000aan;
55
60
  const smokeCoAlarmDeviceMutedTrigger = 0x005c00000000009bn;
56
61
  const smokeCoAlarmDeviceMutedClearTrigger = 0x005c0000000000abn;
57
62
  const electricalPowerMeasurementStartFakeLoadTrigger = 0x0091000000000001n;
@@ -299,7 +304,7 @@ export function createChipTestAppPipe(matterbridge) {
299
304
  return;
300
305
  matterbridge.log.error(`CHIP test app pipe ${chipTestAppPipePath} read error: ${error instanceof Error ? error.message : String(error)}`);
301
306
  }
302
- }, 50);
307
+ }, 10);
303
308
  pollInterval.unref();
304
309
  const closePipeWithInterval = () => {
305
310
  clearInterval(pollInterval);
@@ -340,6 +345,11 @@ async function handleChipTestEventTrigger(eventTrigger) {
340
345
  normalizedEventTrigger !== normalizeTestEventTrigger(smokeCoAlarmHardwareFaultAlertClearTrigger) &&
341
346
  normalizedEventTrigger !== normalizeTestEventTrigger(smokeCoAlarmEndOfServiceAlertTrigger) &&
342
347
  normalizedEventTrigger !== normalizeTestEventTrigger(smokeCoAlarmEndOfServiceAlertClearTrigger) &&
348
+ normalizedEventTrigger !== normalizeTestEventTrigger(smokeCoAlarmYamlCriticalBatteryAlertTrigger) &&
349
+ normalizedEventTrigger !== normalizeTestEventTrigger(smokeCoAlarmYamlHardwareFaultAlertTrigger) &&
350
+ normalizedEventTrigger !== normalizeTestEventTrigger(smokeCoAlarmYamlHardwareFaultAlertClearTrigger) &&
351
+ normalizedEventTrigger !== normalizeTestEventTrigger(smokeCoAlarmYamlEndOfServiceAlertTrigger) &&
352
+ normalizedEventTrigger !== normalizeTestEventTrigger(smokeCoAlarmYamlEndOfServiceAlertClearTrigger) &&
343
353
  normalizedEventTrigger !== normalizeTestEventTrigger(smokeCoAlarmDeviceMutedTrigger) &&
344
354
  normalizedEventTrigger !== normalizeTestEventTrigger(smokeCoAlarmDeviceMutedClearTrigger)) {
345
355
  return ((await handleElectricalEnergyTestEventTrigger(normalizedEventTrigger)) ||
@@ -606,6 +616,7 @@ async function applySmokeCoAlarmTestEventTrigger(endpoint, eventTrigger, log) {
606
616
  await endpoint.triggerEvent(SmokeCoAlarm, 'lowBattery', { alarmSeverityLevel: SmokeCoAlarm.AlarmState.Warning }, log);
607
617
  return;
608
618
  case normalizeTestEventTrigger(smokeCoAlarmCriticalBatteryAlertTrigger):
619
+ case normalizeTestEventTrigger(smokeCoAlarmYamlCriticalBatteryAlertTrigger):
609
620
  await endpoint.setCluster(SmokeCoAlarm, { batteryAlert: SmokeCoAlarm.AlarmState.Critical, expressedState: getSmokeCoAlarmExpressedState(endpoint, { batteryAlert: SmokeCoAlarm.AlarmState.Critical }) }, log);
610
621
  await endpoint.triggerEvent(SmokeCoAlarm, 'lowBattery', { alarmSeverityLevel: SmokeCoAlarm.AlarmState.Critical }, log);
611
622
  return;
@@ -615,18 +626,22 @@ async function applySmokeCoAlarmTestEventTrigger(endpoint, eventTrigger, log) {
615
626
  await endpoint.triggerEvent(SmokeCoAlarm, 'allClear', undefined, log);
616
627
  return;
617
628
  case normalizeTestEventTrigger(smokeCoAlarmHardwareFaultAlertTrigger):
629
+ case normalizeTestEventTrigger(smokeCoAlarmYamlHardwareFaultAlertTrigger):
618
630
  await endpoint.setCluster(SmokeCoAlarm, { hardwareFaultAlert: true, expressedState: SmokeCoAlarm.ExpressedState.HardwareFault }, log);
619
631
  await endpoint.triggerEvent(SmokeCoAlarm, 'hardwareFault', undefined, log);
620
632
  return;
621
633
  case normalizeTestEventTrigger(smokeCoAlarmHardwareFaultAlertClearTrigger):
634
+ case normalizeTestEventTrigger(smokeCoAlarmYamlHardwareFaultAlertClearTrigger):
622
635
  await endpoint.setCluster(SmokeCoAlarm, { hardwareFaultAlert: false, expressedState: SmokeCoAlarm.ExpressedState.Normal }, log);
623
636
  await endpoint.triggerEvent(SmokeCoAlarm, 'allClear', undefined, log);
624
637
  return;
625
638
  case normalizeTestEventTrigger(smokeCoAlarmEndOfServiceAlertTrigger):
639
+ case normalizeTestEventTrigger(smokeCoAlarmYamlEndOfServiceAlertTrigger):
626
640
  await endpoint.setCluster(SmokeCoAlarm, { endOfServiceAlert: SmokeCoAlarm.EndOfService.Expired, expressedState: SmokeCoAlarm.ExpressedState.EndOfService }, log);
627
641
  await endpoint.triggerEvent(SmokeCoAlarm, 'endOfService', undefined, log);
628
642
  return;
629
643
  case normalizeTestEventTrigger(smokeCoAlarmEndOfServiceAlertClearTrigger):
644
+ case normalizeTestEventTrigger(smokeCoAlarmYamlEndOfServiceAlertClearTrigger):
630
645
  await endpoint.setCluster(SmokeCoAlarm, { endOfServiceAlert: SmokeCoAlarm.EndOfService.Normal, expressedState: SmokeCoAlarm.ExpressedState.Normal }, log);
631
646
  await endpoint.triggerEvent(SmokeCoAlarm, 'allClear', undefined, log);
632
647
  return;
@@ -787,7 +802,7 @@ async function handleMeterIdentificationTestEventTrigger(eventTrigger) {
787
802
  }
788
803
  const commodityMeteringFakeValues = {
789
804
  maximumMeteredQuantities: 8,
790
- meteredQuantity: [{ tariffComponentIDs: [1], quantity: 1_234 }],
805
+ meteredQuantity: [{ tariffComponentIds: [1], quantity: 1_234 }],
791
806
  meteredQuantityTimestamp: Math.floor(Date.now() / 1000),
792
807
  tariffUnit: TariffUnit.KWh,
793
808
  };
@@ -843,8 +858,8 @@ const commodityTariffTariffComponents = [
843
858
  },
844
859
  ];
845
860
  const commodityTariffTariffPeriods = [
846
- { label: 'Morning', dayEntryIDs: [1], tariffComponentIDs: [100] },
847
- { label: 'Afternoon', dayEntryIDs: [2], tariffComponentIDs: [101] },
861
+ { label: 'Morning', dayEntryIds: [1], tariffComponentIds: [100] },
862
+ { label: 'Afternoon', dayEntryIds: [2], tariffComponentIds: [101] },
848
863
  ];
849
864
  const commodityTariffClearedValues = {
850
865
  tariffInfo: null,
@@ -870,12 +885,12 @@ let commodityTariffEntryIndex = 0;
870
885
  function buildCommodityTariffFakeValues(dayOffset, entryIndex) {
871
886
  const anchor = Math.floor(Date.now() / 86_400_000) * 86_400;
872
887
  const tariffStartDate = anchor - 365 * 86_400;
873
- const dayOf = (offset) => ({ date: anchor + offset * 86_400, dayType: CommodityTariff.DayType.Standard, dayEntryIDs: [1, 2] });
888
+ const dayOf = (offset) => ({ date: anchor + offset * 86_400, dayType: CommodityTariff.DayType.Standard, dayEntryIds: [1, 2] });
874
889
  const entryDate = (offset, idx) => anchor + offset * 86_400 + commodityTariffDayEntries[idx].startTime * 60;
875
890
  const nextEntry = entryIndex === commodityTariffDayEntries.length - 1 ? { offset: dayOffset + 1, idx: 0 } : { offset: dayOffset, idx: entryIndex + 1 };
876
891
  const tariffComponentsFor = (dayEntryId) => commodityTariffTariffPeriods
877
- .filter((period) => period.dayEntryIDs.includes(dayEntryId))
878
- .flatMap((period) => period.tariffComponentIDs)
892
+ .filter((period) => period.dayEntryIds.includes(dayEntryId))
893
+ .flatMap((period) => period.tariffComponentIds)
879
894
  .map((id) => commodityTariffTariffComponents.find((component) => component.tariffComponentId === id))
880
895
  .filter((component) => component !== undefined);
881
896
  return {
@@ -888,9 +903,9 @@ function buildCommodityTariffFakeValues(dayOffset, entryIndex) {
888
903
  tariffUnit: TariffUnit.KWh,
889
904
  startDate: tariffStartDate,
890
905
  dayEntries: commodityTariffDayEntries,
891
- dayPatterns: [{ dayPatternId: commodityTariffDayPatternId, daysOfWeek: commodityTariffAllDaysOfWeek, dayEntryIDs: [1, 2] }],
892
- calendarPeriods: [{ startDate: tariffStartDate, dayPatternIDs: [commodityTariffDayPatternId] }],
893
- individualDays: [{ date: anchor - 30 * 86_400, dayType: CommodityTariff.DayType.Holiday, dayEntryIDs: [1, 2] }],
906
+ dayPatterns: [{ dayPatternId: commodityTariffDayPatternId, daysOfWeek: commodityTariffAllDaysOfWeek, dayEntryIds: [1, 2] }],
907
+ calendarPeriods: [{ startDate: tariffStartDate, dayPatternIds: [commodityTariffDayPatternId] }],
908
+ individualDays: [{ date: anchor - 30 * 86_400, dayType: CommodityTariff.DayType.Holiday, dayEntryIds: [1, 2] }],
894
909
  currentDay: dayOf(dayOffset),
895
910
  nextDay: dayOf(dayOffset + 1),
896
911
  currentDayEntry: commodityTariffDayEntries[entryIndex],
@@ -1172,6 +1187,10 @@ async function handleChipTestAppPipeCommand(matterbridge, command) {
1172
1187
  case 'SimulateLongPress':
1173
1188
  await simulateChipTestSwitchLongPress(matterbridge, endpoint, endpointId, command);
1174
1189
  return;
1190
+ case 'LongPress':
1191
+ await endpoint.invokeBehaviorCommand(SmokeCoAlarm, 'selfTestRequest');
1192
+ matterbridge.log.info(`CHIP test app pipe started the SmokeCoAlarm self-test on endpoint ${endpointId}`);
1193
+ return;
1175
1194
  case 'SimulateLatchPosition': {
1176
1195
  const newPosition = command.PositionId ?? 0;
1177
1196
  if (endpoint.getAttribute(Switch.id, 'currentPosition', matterbridge.log) === newPosition) {
@@ -46,8 +46,8 @@ export class MatterbridgeCommodityTariffServer extends CommodityTariffServer.wit
46
46
  if (!tariffComponent) {
47
47
  throw new StatusResponse.NotFoundError(`MatterbridgeCommodityTariffServer: no TariffComponent with id ${request.tariffComponentId} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
48
48
  }
49
- const period = (this.state.tariffPeriods ?? []).find((p) => p.tariffComponentIDs.includes(request.tariffComponentId));
50
- const response = { label: period?.label ?? null, dayEntryIDs: period?.dayEntryIDs ?? [], tariffComponent };
49
+ const period = (this.state.tariffPeriods ?? []).find((p) => p.tariffComponentIds.includes(request.tariffComponentId));
50
+ const response = { label: period?.label ?? null, dayEntryIds: period?.dayEntryIds ?? [], tariffComponent };
51
51
  this.endpoint.emitCommand(CommodityTariff, 'getTariffComponent', request, this.context);
52
52
  return response;
53
53
  }
@@ -240,7 +240,8 @@ export class MatterbridgeRvcOperationalStateServer extends MatterbridgeRvcOperat
240
240
  if (this.state.operationalState === RvcOperationalState.OperationalState.Paused) {
241
241
  return { commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateDetails: 'Already paused' } };
242
242
  }
243
- if (this.state.operationalState !== RvcOperationalState.OperationalState.Running && this.state.operationalState !== RvcOperationalState.OperationalState.SeekingCharger) {
243
+ if (this.state.operationalState !== RvcOperationalState.OperationalState.Running &&
244
+ this.state.operationalState !== RvcOperationalState.OperationalState.SeekingCharger) {
244
245
  return {
245
246
  commandResponseState: { errorStateId: OperationalState.ErrorState.CommandInvalidInState, errorStateDetails: 'Not Pause-compatible in the current operational state' },
246
247
  };
@@ -27,10 +27,6 @@ export declare class Frontend extends EventEmitter<FrontendEvents> {
27
27
  private readonly debug;
28
28
  private readonly verbose;
29
29
  private readonly diagnostic;
30
- readonly readOnly: boolean;
31
- restartRequired: boolean;
32
- fixedRestartRequired: boolean;
33
- updateRequired: boolean;
34
30
  constructor(matterbridge: Matterbridge);
35
31
  destroy(): void;
36
32
  private broadcastMsgHandler;