@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 +1 -1
- package/dist/behaviors/cameraAvSettingsUserLevelManagementServer.d.ts +5 -0
- package/dist/behaviors/cameraAvSettingsUserLevelManagementServer.js +34 -4
- package/dist/behaviors/cameraAvStreamManagementServer.js +0 -4
- package/dist/behaviors/colorControlServer.d.ts +13 -1
- package/dist/behaviors/doorLockServer.d.ts +58 -2
- package/dist/behaviors/smokeCoAlarmServer.d.ts +7 -1
- package/dist/behaviors/thermostatServer.d.ts +23 -1
- package/dist/behaviors/windowCoveringServer.d.ts +11 -1
- package/dist/chipTests.js +29 -10
- package/dist/devices/electricalUtilityMeter.js +2 -2
- package/dist/devices/roboticVacuumCleaner.js +2 -1
- package/dist/frontend.d.ts +0 -4
- package/dist/frontend.js +38 -20
- package/dist/matterbridge.d.ts +5 -0
- package/dist/matterbridge.js +42 -23
- package/dist/matterbridgeDeviceTypes.js +41 -41
- package/dist/matterbridgeEndpointHelpers.d.ts +89 -7
- package/dist/matterbridgeEndpointHelpers.js +3 -0
- package/package.json +6 -6
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:
|
|
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
|
|
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 ${
|
|
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
|
|
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
|
-
},
|
|
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: [{
|
|
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',
|
|
847
|
-
{ label: 'Afternoon',
|
|
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,
|
|
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.
|
|
878
|
-
.flatMap((period) => period.
|
|
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,
|
|
892
|
-
calendarPeriods: [{ startDate: tariffStartDate,
|
|
893
|
-
individualDays: [{ date: anchor - 30 * 86_400, dayType: CommodityTariff.DayType.Holiday,
|
|
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.
|
|
50
|
-
const response = { label: period?.label ?? null,
|
|
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 &&
|
|
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
|
};
|
package/dist/frontend.d.ts
CHANGED
|
@@ -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;
|