@matterbridge/core 3.7.1-dev-20260323-0a65511 → 3.7.1-dev-20260324-9c29691
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/devices/roboticVacuumCleaner.d.ts +2 -2
- package/dist/devices/roboticVacuumCleaner.js +1 -1
- package/dist/helpers.js +11 -8
- package/dist/matterbridge.js +26 -4
- package/dist/matterbridgeBehaviorsServer.d.ts +16 -16
- package/dist/matterbridgeBehaviorsServer.js +74 -107
- package/dist/matterbridgeEndpoint.d.ts +1 -0
- package/dist/matterbridgeEndpoint.js +24 -4
- package/dist/matterbridgeEndpointCommandHandler.d.ts +90 -0
- package/package.json +6 -6
|
@@ -9,10 +9,10 @@ import { RvcRunMode } from '@matter/types/clusters/rvc-run-mode';
|
|
|
9
9
|
import { ServiceArea } from '@matter/types/clusters/service-area';
|
|
10
10
|
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
11
11
|
export declare class RoboticVacuumCleaner extends MatterbridgeEndpoint {
|
|
12
|
-
constructor(name: string, serial: string, mode?: 'server' | 'matter' | undefined, currentRunMode?: number, supportedRunModes?: RvcRunMode.ModeOption[], currentCleanMode?: number, supportedCleanModes?: RvcCleanMode.ModeOption[], currentPhase?: number | null, phaseList?: string[] | null, operationalState?: RvcOperationalState.OperationalState, operationalStateList?: RvcOperationalState.OperationalStateStruct[], supportedAreas?: ServiceArea.Area[], selectedAreas?: number[], currentArea?: number, supportedMaps?: ServiceArea.Map[]);
|
|
12
|
+
constructor(name: string, serial: string, mode?: 'server' | 'matter' | undefined, currentRunMode?: number, supportedRunModes?: RvcRunMode.ModeOption[], currentCleanMode?: number, supportedCleanModes?: RvcCleanMode.ModeOption[], currentPhase?: number | null, phaseList?: string[] | null, operationalState?: RvcOperationalState.OperationalState, operationalStateList?: RvcOperationalState.OperationalStateStruct[], supportedAreas?: ServiceArea.Area[], selectedAreas?: number[], currentArea?: number | null, supportedMaps?: ServiceArea.Map[]);
|
|
13
13
|
createDefaultRvcRunModeClusterServer(currentMode?: number, supportedModes?: RvcRunMode.ModeOption[]): this;
|
|
14
14
|
createDefaultRvcCleanModeClusterServer(currentMode?: number, supportedModes?: RvcCleanMode.ModeOption[]): this;
|
|
15
|
-
createDefaultServiceAreaClusterServer(supportedAreas?: ServiceArea.Area[], selectedAreas?: number[], currentArea?: number, supportedMaps?: ServiceArea.Map[]): this;
|
|
15
|
+
createDefaultServiceAreaClusterServer(supportedAreas?: ServiceArea.Area[], selectedAreas?: number[], currentArea?: number | null, supportedMaps?: ServiceArea.Map[]): this;
|
|
16
16
|
createDefaultRvcOperationalStateClusterServer(phaseList?: string[] | null, currentPhase?: number | null, operationalStateList?: RvcOperationalState.OperationalStateStruct[], operationalState?: RvcOperationalState.OperationalState, operationalError?: RvcOperationalState.ErrorStateStruct): this;
|
|
17
17
|
}
|
|
18
18
|
export declare class MatterbridgeRvcRunModeServer extends RvcRunModeServer {
|
|
@@ -71,7 +71,7 @@ export class RoboticVacuumCleaner extends MatterbridgeEndpoint {
|
|
|
71
71
|
},
|
|
72
72
|
],
|
|
73
73
|
selectedAreas: selectedAreas ?? [],
|
|
74
|
-
currentArea: currentArea
|
|
74
|
+
currentArea: currentArea !== undefined ? currentArea : 1,
|
|
75
75
|
supportedMaps: supportedMaps ?? [],
|
|
76
76
|
estimatedEndTime: null,
|
|
77
77
|
});
|
package/dist/helpers.js
CHANGED
|
@@ -13,6 +13,8 @@ import { Identify } from '@matter/types/clusters/identify';
|
|
|
13
13
|
import { OnOff } from '@matter/types/clusters/on-off';
|
|
14
14
|
import { VendorId } from '@matter/types/datatype';
|
|
15
15
|
import { hasParameter } from '@matterbridge/utils/cli';
|
|
16
|
+
import { doorLockDevice } from './matterbridgeDeviceTypes.js';
|
|
17
|
+
import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
|
|
16
18
|
export async function addVirtualDevice(aggregatorEndpoint, name, type, callback) {
|
|
17
19
|
let deviceType;
|
|
18
20
|
switch (type) {
|
|
@@ -36,7 +38,7 @@ export async function addVirtualDevice(aggregatorEndpoint, name, type, callback)
|
|
|
36
38
|
vendorName: 'Matterbridge',
|
|
37
39
|
productName: 'Matterbridge Virtual Device',
|
|
38
40
|
nodeLabel: name.slice(0, 32),
|
|
39
|
-
softwareVersion:
|
|
41
|
+
softwareVersion: 20000,
|
|
40
42
|
softwareVersionString: '2.0.0',
|
|
41
43
|
},
|
|
42
44
|
onOff: { onOff: false },
|
|
@@ -71,6 +73,13 @@ export async function addVirtualDevice(aggregatorEndpoint, name, type, callback)
|
|
|
71
73
|
return device;
|
|
72
74
|
}
|
|
73
75
|
export async function addVirtualDevices(matterbridge, aggregatorEndpoint) {
|
|
76
|
+
if (hasParameter('experimental') && matterbridge.bridgeMode === 'bridge' && aggregatorEndpoint) {
|
|
77
|
+
const lock = new MatterbridgeEndpoint(doorLockDevice, { id: 'system_lock' });
|
|
78
|
+
lock.createDefaultBridgedDeviceBasicInformationClusterServer('Matterbridge System Lock', 'sn_system_lock', 0xfff1, 'Matterbridge', 'Matterbridge Virtual Device', 20000, '2.0.0');
|
|
79
|
+
lock.createPinDoorLockClusterServer();
|
|
80
|
+
lock.addRequiredClusterServers();
|
|
81
|
+
await aggregatorEndpoint.add(lock);
|
|
82
|
+
}
|
|
74
83
|
if (matterbridge.virtualMode !== 'disabled' && matterbridge.bridgeMode === 'bridge' && aggregatorEndpoint) {
|
|
75
84
|
matterbridge.log.notice(`Creating virtual devices for Matterbridge server node...`);
|
|
76
85
|
await addVirtualDevice(aggregatorEndpoint, 'Restart Matterbridge', matterbridge.virtualMode, async () => {
|
|
@@ -80,13 +89,7 @@ export async function addVirtualDevices(matterbridge, aggregatorEndpoint) {
|
|
|
80
89
|
await matterbridge.shutdownProcess();
|
|
81
90
|
});
|
|
82
91
|
await addVirtualDevice(aggregatorEndpoint, 'Update Matterbridge', matterbridge.virtualMode, async () => {
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
await matterbridge.updateProcess();
|
|
87
|
-
}
|
|
92
|
+
await matterbridge.updateProcess();
|
|
88
93
|
});
|
|
89
|
-
if (hasParameter('shelly')) {
|
|
90
|
-
}
|
|
91
94
|
}
|
|
92
95
|
}
|
package/dist/matterbridge.js
CHANGED
|
@@ -1197,11 +1197,33 @@ export class Matterbridge extends EventEmitter {
|
|
|
1197
1197
|
}
|
|
1198
1198
|
if (message === 'shutting down with reset...') {
|
|
1199
1199
|
this.log.info('Resetting Matterbridge commissioning information...');
|
|
1200
|
-
await this.matterStorageManager?.createContext('events')?.clearAll();
|
|
1201
|
-
await this.matterStorageManager?.createContext('fabrics')?.clearAll();
|
|
1202
|
-
await this.matterStorageManager?.createContext('root')?.clearAll();
|
|
1203
|
-
await this.matterStorageManager?.createContext('sessions')?.clearAll();
|
|
1204
1200
|
await this.matterbridgeContext?.clearAll();
|
|
1201
|
+
if (this.bridgeMode === 'bridge') {
|
|
1202
|
+
await this.matterStorageManager?.createContext('events')?.clearAll();
|
|
1203
|
+
await this.matterStorageManager?.createContext('fabrics')?.clearAll();
|
|
1204
|
+
await this.matterStorageManager?.createContext('root')?.clearAll();
|
|
1205
|
+
await this.matterStorageManager?.createContext('sessions')?.clearAll();
|
|
1206
|
+
}
|
|
1207
|
+
else if (this.bridgeMode === 'childbridge') {
|
|
1208
|
+
for (const plugin of this.plugins.array()) {
|
|
1209
|
+
plugin.storageContext?.clearAll();
|
|
1210
|
+
const storageManager = await this.matterStorageService?.open(plugin.name);
|
|
1211
|
+
await storageManager?.createContext('events')?.clearAll();
|
|
1212
|
+
await storageManager?.createContext('fabrics')?.clearAll();
|
|
1213
|
+
await storageManager?.createContext('root')?.clearAll();
|
|
1214
|
+
await storageManager?.createContext('sessions')?.clearAll();
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
for (const device of this.devices.array()) {
|
|
1218
|
+
if (device.mode === 'server' && device.deviceName) {
|
|
1219
|
+
const storageManager = await this.matterStorageService?.open(device.deviceName.replaceAll(' ', ''));
|
|
1220
|
+
await storageManager?.createContext('persist')?.clearAll();
|
|
1221
|
+
await storageManager?.createContext('events')?.clearAll();
|
|
1222
|
+
await storageManager?.createContext('fabrics')?.clearAll();
|
|
1223
|
+
await storageManager?.createContext('root')?.clearAll();
|
|
1224
|
+
await storageManager?.createContext('sessions')?.clearAll();
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1205
1227
|
this.log.info('Matter storage reset done! Remove the bridge from the controller.');
|
|
1206
1228
|
}
|
|
1207
1229
|
if (message === 'unregistered all devices and shutting down...') {
|
|
@@ -24,6 +24,7 @@ import { ActivatedCarbonFilterMonitoring } from '@matter/types/clusters/activate
|
|
|
24
24
|
import { BooleanStateConfiguration } from '@matter/types/clusters/boolean-state-configuration';
|
|
25
25
|
import { ColorControl } from '@matter/types/clusters/color-control';
|
|
26
26
|
import { DeviceEnergyManagement } from '@matter/types/clusters/device-energy-management';
|
|
27
|
+
import { DoorLock } from '@matter/types/clusters/door-lock';
|
|
27
28
|
import { FanControl } from '@matter/types/clusters/fan-control';
|
|
28
29
|
import { HepaFilterMonitoring } from '@matter/types/clusters/hepa-filter-monitoring';
|
|
29
30
|
import { Identify } from '@matter/types/clusters/identify';
|
|
@@ -452,15 +453,17 @@ declare const MatterbridgeColorControlServer_base: import("@matter/node").Cluste
|
|
|
452
453
|
};
|
|
453
454
|
readonly component: false;
|
|
454
455
|
}];
|
|
455
|
-
}>, readonly [ColorControl.Feature.HueSaturation, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature]>, typeof ColorControlServer, import("@matter/node/behaviors/color-control").ColorControlInterface>;
|
|
456
|
+
}>, readonly [ColorControl.Feature.HueSaturation, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature, ColorControl.Feature.EnhancedHue]>, typeof ColorControlServer, import("@matter/node/behaviors/color-control").ColorControlInterface>;
|
|
456
457
|
export declare class MatterbridgeColorControlServer extends MatterbridgeColorControlServer_base {
|
|
457
458
|
moveToHue(request: ColorControl.MoveToHueRequest): Promise<void>;
|
|
459
|
+
enhancedMoveToHue(request: ColorControl.EnhancedMoveToHueRequest): Promise<void>;
|
|
458
460
|
moveToSaturation(request: ColorControl.MoveToSaturationRequest): Promise<void>;
|
|
459
461
|
moveToHueAndSaturation(request: ColorControl.MoveToHueAndSaturationRequest): Promise<void>;
|
|
462
|
+
enhancedMoveToHueAndSaturation(request: ColorControl.EnhancedMoveToHueAndSaturationRequest): Promise<void>;
|
|
460
463
|
moveToColor(request: ColorControl.MoveToColorRequest): Promise<void>;
|
|
461
464
|
moveToColorTemperature(request: ColorControl.MoveToColorTemperatureRequest): Promise<void>;
|
|
462
465
|
}
|
|
463
|
-
declare const MatterbridgeEnhancedColorControlServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
|
|
466
|
+
declare const MatterbridgeEnhancedColorControlServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
|
|
464
467
|
readonly id: 768;
|
|
465
468
|
readonly name: "ColorControl";
|
|
466
469
|
readonly revision: 7;
|
|
@@ -846,15 +849,8 @@ declare const MatterbridgeEnhancedColorControlServer_base: import("@matter/node"
|
|
|
846
849
|
};
|
|
847
850
|
readonly component: false;
|
|
848
851
|
}];
|
|
849
|
-
}>, readonly [ColorControl.Feature.HueSaturation, ColorControl.Feature.EnhancedHue, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature]>, typeof
|
|
852
|
+
}>, readonly [ColorControl.Feature.HueSaturation, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature, ColorControl.Feature.EnhancedHue]>, readonly [ColorControl.Feature.HueSaturation, ColorControl.Feature.EnhancedHue, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature]>, typeof MatterbridgeColorControlServer, import("@matter/node/behaviors/color-control").ColorControlInterface>;
|
|
850
853
|
export declare class MatterbridgeEnhancedColorControlServer extends MatterbridgeEnhancedColorControlServer_base {
|
|
851
|
-
moveToHue(request: ColorControl.MoveToHueRequest): Promise<void>;
|
|
852
|
-
enhancedMoveToHue(request: ColorControl.EnhancedMoveToHueRequest): Promise<void>;
|
|
853
|
-
moveToSaturation(request: ColorControl.MoveToSaturationRequest): Promise<void>;
|
|
854
|
-
moveToHueAndSaturation(request: ColorControl.MoveToHueAndSaturationRequest): Promise<void>;
|
|
855
|
-
enhancedMoveToHueAndSaturation(request: ColorControl.EnhancedMoveToHueAndSaturationRequest): Promise<void>;
|
|
856
|
-
moveToColor(request: ColorControl.MoveToColorRequest): Promise<void>;
|
|
857
|
-
moveToColorTemperature(request: ColorControl.MoveToColorTemperatureRequest): Promise<void>;
|
|
858
854
|
}
|
|
859
855
|
declare const MatterbridgeWindowCoveringServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
|
|
860
856
|
readonly id: 258;
|
|
@@ -1435,9 +1431,14 @@ declare const MatterbridgeLiftTiltWindowCoveringServer_base: import("@matter/nod
|
|
|
1435
1431
|
}>, readonly [WindowCovering.Feature.Lift, WindowCovering.Feature.PositionAwareLift, WindowCovering.Feature.Tilt, WindowCovering.Feature.PositionAwareTilt]>, readonly [WindowCovering.Feature.Lift, WindowCovering.Feature.PositionAwareLift, WindowCovering.Feature.Tilt, WindowCovering.Feature.PositionAwareTilt]>, typeof MatterbridgeWindowCoveringServer, import("@matter/node/behaviors/window-covering").WindowCoveringInterface>;
|
|
1436
1432
|
export declare class MatterbridgeLiftTiltWindowCoveringServer extends MatterbridgeLiftTiltWindowCoveringServer_base {
|
|
1437
1433
|
}
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1434
|
+
declare const MatterbridgeDoorLockServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<DoorLock.Cluster, readonly [DoorLock.Feature.PinCredential, DoorLock.Feature.CredentialOverTheAirAccess]>, typeof DoorLockServer, import("@matter/node/behaviors/door-lock").DoorLockInterface>;
|
|
1435
|
+
export declare class MatterbridgeDoorLockServer extends MatterbridgeDoorLockServer_base {
|
|
1436
|
+
lockDoor(request: DoorLock.LockDoorRequest): Promise<void>;
|
|
1437
|
+
unlockDoor(request: DoorLock.UnlockDoorRequest): Promise<void>;
|
|
1438
|
+
setPinCode(request: DoorLock.SetPinCodeRequest): Promise<void>;
|
|
1439
|
+
getPinCode(request: DoorLock.GetPinCodeRequest): Promise<DoorLock.GetPinCodeResponse>;
|
|
1440
|
+
clearPinCode(request: DoorLock.ClearPinCodeRequest): Promise<void>;
|
|
1441
|
+
clearAllPinCodes(): Promise<void>;
|
|
1441
1442
|
}
|
|
1442
1443
|
declare const MatterbridgeFanControlServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<FanControl.Cluster, readonly [FanControl.Feature.Auto, FanControl.Feature.Step]>, typeof FanControlServer, import("@matter/node/behaviors/fan-control").FanControlInterface>;
|
|
1443
1444
|
export declare class MatterbridgeFanControlServer extends MatterbridgeFanControlServer_base {
|
|
@@ -1803,10 +1804,11 @@ declare const MatterbridgeThermostatServer_base: import("@matter/node").ClusterB
|
|
|
1803
1804
|
};
|
|
1804
1805
|
readonly component: false;
|
|
1805
1806
|
}];
|
|
1806
|
-
}>, readonly [Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode]>, typeof ThermostatServer, import("@matter/node/behaviors/thermostat").ThermostatInterface>;
|
|
1807
|
+
}>, readonly [Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode, Thermostat.Feature.Presets]>, typeof ThermostatServer, import("@matter/node/behaviors/thermostat").ThermostatInterface>;
|
|
1807
1808
|
export declare class MatterbridgeThermostatServer extends MatterbridgeThermostatServer_base {
|
|
1808
1809
|
initialize(): Promise<void>;
|
|
1809
1810
|
setpointRaiseLower(request: Thermostat.SetpointRaiseLowerRequest): Promise<void>;
|
|
1811
|
+
setActivePresetRequest(request: Thermostat.SetActivePresetRequest): Promise<void>;
|
|
1810
1812
|
}
|
|
1811
1813
|
declare const MatterbridgePresetThermostatServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<import("@matter/types").ClusterType.Of<{
|
|
1812
1814
|
readonly id: 513;
|
|
@@ -2170,8 +2172,6 @@ declare const MatterbridgePresetThermostatServer_base: import("@matter/node").Cl
|
|
|
2170
2172
|
}];
|
|
2171
2173
|
}>, readonly [Thermostat.Feature.Presets, Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode]>, typeof ThermostatServer, import("@matter/node/behaviors/thermostat").ThermostatInterface>;
|
|
2172
2174
|
export declare class MatterbridgePresetThermostatServer extends MatterbridgePresetThermostatServer_base {
|
|
2173
|
-
setpointRaiseLower(request: Thermostat.SetpointRaiseLowerRequest): Promise<void>;
|
|
2174
|
-
setActivePresetRequest(request: Thermostat.SetActivePresetRequest): Promise<void>;
|
|
2175
2175
|
}
|
|
2176
2176
|
declare const MatterbridgeValveConfigurationAndControlServer_base: import("@matter/node").ClusterBehavior.Type<import("@matter/types").ClusterComposer.WithFeatures<ValveConfigurationAndControl.Cluster, readonly [ValveConfigurationAndControl.Feature.Level]>, typeof ValveConfigurationAndControlServer, import("@matter/node/behaviors/valve-configuration-and-control").ValveConfigurationAndControlInterface>;
|
|
2177
2177
|
export declare class MatterbridgeValveConfigurationAndControlServer extends MatterbridgeValveConfigurationAndControlServer_base {
|
|
@@ -23,15 +23,16 @@ import { BooleanStateConfiguration } from '@matter/types/clusters/boolean-state-
|
|
|
23
23
|
import { ColorControl } from '@matter/types/clusters/color-control';
|
|
24
24
|
import { DeviceEnergyManagement } from '@matter/types/clusters/device-energy-management';
|
|
25
25
|
import { DeviceEnergyManagementMode } from '@matter/types/clusters/device-energy-management-mode';
|
|
26
|
+
import { DoorLock } from '@matter/types/clusters/door-lock';
|
|
26
27
|
import { FanControl } from '@matter/types/clusters/fan-control';
|
|
27
28
|
import { ModeBase } from '@matter/types/clusters/mode-base';
|
|
28
29
|
import { OperationalState } from '@matter/types/clusters/operational-state';
|
|
29
30
|
import { ResourceMonitoring } from '@matter/types/clusters/resource-monitoring';
|
|
30
|
-
import { ServiceArea } from '@matter/types/clusters/service-area';
|
|
31
31
|
import { SmokeCoAlarm } from '@matter/types/clusters/smoke-co-alarm';
|
|
32
32
|
import { Thermostat } from '@matter/types/clusters/thermostat';
|
|
33
33
|
import { ValveConfigurationAndControl } from '@matter/types/clusters/valve-configuration-and-control';
|
|
34
34
|
import { WindowCovering } from '@matter/types/clusters/window-covering';
|
|
35
|
+
import { getEnumDescription } from '@matterbridge/utils';
|
|
35
36
|
export class MatterbridgeServer extends Behavior {
|
|
36
37
|
static id = 'matterbridge';
|
|
37
38
|
initialize() {
|
|
@@ -162,74 +163,7 @@ export class MatterbridgeLevelControlServer extends LevelControlServer {
|
|
|
162
163
|
await super.moveToLevelWithOnOff(request);
|
|
163
164
|
}
|
|
164
165
|
}
|
|
165
|
-
export class MatterbridgeColorControlServer extends ColorControlServer.with(ColorControl.Feature.HueSaturation, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature) {
|
|
166
|
-
async moveToHue(request) {
|
|
167
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
168
|
-
device.log.info(`Setting hue to ${request.hue} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
169
|
-
await device.commandHandler.executeHandler('ColorControl.moveToHue', {
|
|
170
|
-
command: 'moveToHue',
|
|
171
|
-
request,
|
|
172
|
-
cluster: ColorControlServer.id,
|
|
173
|
-
attributes: this.state,
|
|
174
|
-
endpoint: this.endpoint,
|
|
175
|
-
});
|
|
176
|
-
device.log.debug(`MatterbridgeColorControlServer: moveToHue called`);
|
|
177
|
-
await super.moveToHue(request);
|
|
178
|
-
}
|
|
179
|
-
async moveToSaturation(request) {
|
|
180
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
181
|
-
device.log.info(`Setting saturation to ${request.saturation} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
182
|
-
await device.commandHandler.executeHandler('ColorControl.moveToSaturation', {
|
|
183
|
-
command: 'moveToSaturation',
|
|
184
|
-
request,
|
|
185
|
-
cluster: ColorControlServer.id,
|
|
186
|
-
attributes: this.state,
|
|
187
|
-
endpoint: this.endpoint,
|
|
188
|
-
});
|
|
189
|
-
device.log.debug(`MatterbridgeColorControlServer: moveToSaturation called`);
|
|
190
|
-
await super.moveToSaturation(request);
|
|
191
|
-
}
|
|
192
|
-
async moveToHueAndSaturation(request) {
|
|
193
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
194
|
-
device.log.info(`Setting hue to ${request.hue} and saturation to ${request.saturation} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
195
|
-
await device.commandHandler.executeHandler('ColorControl.moveToHueAndSaturation', {
|
|
196
|
-
command: 'moveToHueAndSaturation',
|
|
197
|
-
request,
|
|
198
|
-
cluster: ColorControlServer.id,
|
|
199
|
-
attributes: this.state,
|
|
200
|
-
endpoint: this.endpoint,
|
|
201
|
-
});
|
|
202
|
-
device.log.debug(`MatterbridgeColorControlServer: moveToHueAndSaturation called`);
|
|
203
|
-
await super.moveToHueAndSaturation(request);
|
|
204
|
-
}
|
|
205
|
-
async moveToColor(request) {
|
|
206
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
207
|
-
device.log.info(`Setting color to ${request.colorX}, ${request.colorY} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
208
|
-
await device.commandHandler.executeHandler('ColorControl.moveToColor', {
|
|
209
|
-
command: 'moveToColor',
|
|
210
|
-
request,
|
|
211
|
-
cluster: ColorControlServer.id,
|
|
212
|
-
attributes: this.state,
|
|
213
|
-
endpoint: this.endpoint,
|
|
214
|
-
});
|
|
215
|
-
device.log.debug(`MatterbridgeColorControlServer: moveToColor called`);
|
|
216
|
-
await super.moveToColor(request);
|
|
217
|
-
}
|
|
218
|
-
async moveToColorTemperature(request) {
|
|
219
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
220
|
-
device.log.info(`Setting color temperature to ${request.colorTemperatureMireds} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
221
|
-
await device.commandHandler.executeHandler('ColorControl.moveToColorTemperature', {
|
|
222
|
-
command: 'moveToColorTemperature',
|
|
223
|
-
request,
|
|
224
|
-
cluster: ColorControlServer.id,
|
|
225
|
-
attributes: this.state,
|
|
226
|
-
endpoint: this.endpoint,
|
|
227
|
-
});
|
|
228
|
-
device.log.debug(`MatterbridgeColorControlServer: moveToColorTemperature called`);
|
|
229
|
-
await super.moveToColorTemperature(request);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
export class MatterbridgeEnhancedColorControlServer extends ColorControlServer.with(ColorControl.Feature.HueSaturation, ColorControl.Feature.EnhancedHue, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature) {
|
|
166
|
+
export class MatterbridgeColorControlServer extends ColorControlServer.with(ColorControl.Feature.HueSaturation, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature, ColorControl.Feature.EnhancedHue) {
|
|
233
167
|
async moveToHue(request) {
|
|
234
168
|
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
235
169
|
device.log.info(`Setting hue to ${request.hue} with transitionTime ${request.transitionTime} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
@@ -322,6 +256,8 @@ export class MatterbridgeEnhancedColorControlServer extends ColorControlServer.w
|
|
|
322
256
|
await super.moveToColorTemperature(request);
|
|
323
257
|
}
|
|
324
258
|
}
|
|
259
|
+
export class MatterbridgeEnhancedColorControlServer extends MatterbridgeColorControlServer.with(ColorControl.Feature.HueSaturation, ColorControl.Feature.EnhancedHue, ColorControl.Feature.Xy, ColorControl.Feature.ColorTemperature) {
|
|
260
|
+
}
|
|
325
261
|
export class MatterbridgeWindowCoveringServer extends WindowCoveringServer.with(WindowCovering.Feature.Lift, WindowCovering.Feature.PositionAwareLift, WindowCovering.Feature.Tilt, WindowCovering.Feature.PositionAwareTilt) {
|
|
326
262
|
lookupMovementStatus = ['Stopped', 'Opening', 'Closing', 'Unknown'];
|
|
327
263
|
async initialize() {
|
|
@@ -407,32 +343,85 @@ export class MatterbridgeLiftWindowCoveringServer extends MatterbridgeWindowCove
|
|
|
407
343
|
}
|
|
408
344
|
export class MatterbridgeLiftTiltWindowCoveringServer extends MatterbridgeWindowCoveringServer.with(WindowCovering.Feature.Lift, WindowCovering.Feature.PositionAwareLift, WindowCovering.Feature.Tilt, WindowCovering.Feature.PositionAwareTilt) {
|
|
409
345
|
}
|
|
410
|
-
export class MatterbridgeDoorLockServer extends DoorLockServer {
|
|
411
|
-
async lockDoor() {
|
|
346
|
+
export class MatterbridgeDoorLockServer extends DoorLockServer.with(DoorLock.Feature.PinCredential, DoorLock.Feature.CredentialOverTheAirAccess) {
|
|
347
|
+
async lockDoor(request) {
|
|
412
348
|
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
413
|
-
device.log.info(`Locking door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
349
|
+
device.log.info(`Locking door with pincode ${request.pinCode ? '0x' + Buffer.from(request.pinCode).toString('hex') : 'N/A'} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
414
350
|
await device.commandHandler.executeHandler('DoorLock.lockDoor', {
|
|
415
351
|
command: 'lockDoor',
|
|
416
|
-
request
|
|
352
|
+
request,
|
|
417
353
|
cluster: DoorLockServer.id,
|
|
418
354
|
attributes: this.state,
|
|
419
355
|
endpoint: this.endpoint,
|
|
420
356
|
});
|
|
421
357
|
device.log.debug(`MatterbridgeDoorLockServer: lockDoor called`);
|
|
422
|
-
await super.lockDoor();
|
|
358
|
+
await super.lockDoor(request);
|
|
423
359
|
}
|
|
424
|
-
async unlockDoor() {
|
|
360
|
+
async unlockDoor(request) {
|
|
425
361
|
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
426
|
-
device.log.info(`Unlocking door (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
362
|
+
device.log.info(`Unlocking door with pincode ${request.pinCode ? '0x' + Buffer.from(request.pinCode).toString('hex') : 'N/A'} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
427
363
|
await device.commandHandler.executeHandler('DoorLock.unlockDoor', {
|
|
428
364
|
command: 'unlockDoor',
|
|
429
|
-
request
|
|
365
|
+
request,
|
|
430
366
|
cluster: DoorLockServer.id,
|
|
431
367
|
attributes: this.state,
|
|
432
368
|
endpoint: this.endpoint,
|
|
433
369
|
});
|
|
434
370
|
device.log.debug(`MatterbridgeDoorLockServer: unlockDoor called`);
|
|
435
|
-
await super.unlockDoor();
|
|
371
|
+
await super.unlockDoor(request);
|
|
372
|
+
}
|
|
373
|
+
async setPinCode(request) {
|
|
374
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
375
|
+
device.log.info(`Setting pin code ${request.pin ? '0x' + Buffer.from(request.pin).toString('hex') : 'N/A'} for user ${request.userId} type ${getEnumDescription(DoorLock.UserType, request.userType)} status ${getEnumDescription(DoorLock.UserStatus, request.userStatus)} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
376
|
+
await device.commandHandler.executeHandler('DoorLock.setPinCode', {
|
|
377
|
+
command: 'setPinCode',
|
|
378
|
+
request,
|
|
379
|
+
cluster: DoorLockServer.id,
|
|
380
|
+
attributes: this.state,
|
|
381
|
+
endpoint: this.endpoint,
|
|
382
|
+
});
|
|
383
|
+
device.log.debug(`MatterbridgeDoorLockServer: setPinCode called for user ${request.userId}`);
|
|
384
|
+
}
|
|
385
|
+
async getPinCode(request) {
|
|
386
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
387
|
+
device.log.info(`Getting pin code for user ${request.userId} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
388
|
+
await device.commandHandler.executeHandler('DoorLock.getPinCode', {
|
|
389
|
+
command: 'getPinCode',
|
|
390
|
+
request,
|
|
391
|
+
cluster: DoorLockServer.id,
|
|
392
|
+
attributes: this.state,
|
|
393
|
+
endpoint: this.endpoint,
|
|
394
|
+
});
|
|
395
|
+
return {
|
|
396
|
+
userId: request.userId,
|
|
397
|
+
userStatus: DoorLock.UserStatus.Available,
|
|
398
|
+
userType: DoorLock.UserType.UnrestrictedUser,
|
|
399
|
+
pinCode: Buffer.from('1234'),
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
async clearPinCode(request) {
|
|
403
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
404
|
+
device.log.info(`Clearing pin code for ${request.pinSlotIndex === 0xfffe ? 'all slots' : 'slot ' + request.pinSlotIndex} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
405
|
+
await device.commandHandler.executeHandler('DoorLock.clearPinCode', {
|
|
406
|
+
command: 'clearPinCode',
|
|
407
|
+
request,
|
|
408
|
+
cluster: DoorLockServer.id,
|
|
409
|
+
attributes: this.state,
|
|
410
|
+
endpoint: this.endpoint,
|
|
411
|
+
});
|
|
412
|
+
device.log.debug(`MatterbridgeDoorLockServer: clearPinCode called for ${request.pinSlotIndex === 0xfffe ? 'all PIN slots' : 'PIN slot ' + request.pinSlotIndex}`);
|
|
413
|
+
}
|
|
414
|
+
async clearAllPinCodes() {
|
|
415
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
416
|
+
device.log.info(`Clearing all pin codes (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
417
|
+
await device.commandHandler.executeHandler('DoorLock.clearAllPinCodes', {
|
|
418
|
+
command: 'clearAllPinCodes',
|
|
419
|
+
request: {},
|
|
420
|
+
cluster: DoorLockServer.id,
|
|
421
|
+
attributes: this.state,
|
|
422
|
+
endpoint: this.endpoint,
|
|
423
|
+
});
|
|
424
|
+
device.log.debug('MatterbridgeDoorLockServer: clearAllPinCodes called');
|
|
436
425
|
}
|
|
437
426
|
}
|
|
438
427
|
export class MatterbridgeFanControlServer extends FanControlServer.with(FanControl.Feature.Auto, FanControl.Feature.Step) {
|
|
@@ -466,7 +455,7 @@ export class MatterbridgeFanControlServer extends FanControlServer.with(FanContr
|
|
|
466
455
|
device.log.debug('Set percentCurrent to:', this.state.percentCurrent);
|
|
467
456
|
}
|
|
468
457
|
}
|
|
469
|
-
export class MatterbridgeThermostatServer extends ThermostatServer.with(Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode) {
|
|
458
|
+
export class MatterbridgeThermostatServer extends ThermostatServer.with(Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode, Thermostat.Feature.Presets) {
|
|
470
459
|
async initialize() {
|
|
471
460
|
await super.initialize();
|
|
472
461
|
this.endpoint.construction.onSuccess(async () => {
|
|
@@ -492,22 +481,6 @@ export class MatterbridgeThermostatServer extends ThermostatServer.with(Thermost
|
|
|
492
481
|
device.log.debug(`MatterbridgeThermostatServer: setpointRaiseLower called with mode: ${lookupSetpointAdjustMode[request.mode]} amount: ${request.amount / 10}`);
|
|
493
482
|
await super.setpointRaiseLower(request);
|
|
494
483
|
}
|
|
495
|
-
}
|
|
496
|
-
export class MatterbridgePresetThermostatServer extends ThermostatServer.with(Thermostat.Feature.Presets, Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode) {
|
|
497
|
-
async setpointRaiseLower(request) {
|
|
498
|
-
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
499
|
-
device.log.info(`Setting setpoint by ${request.amount} in mode ${request.mode} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
500
|
-
await device.commandHandler.executeHandler('Thermostat.setpointRaiseLower', {
|
|
501
|
-
command: 'setpointRaiseLower',
|
|
502
|
-
request,
|
|
503
|
-
cluster: ThermostatServer.id,
|
|
504
|
-
attributes: this.state,
|
|
505
|
-
endpoint: this.endpoint,
|
|
506
|
-
});
|
|
507
|
-
const lookupSetpointAdjustMode = ['Heat', 'Cool', 'Both'];
|
|
508
|
-
device.log.debug(`MatterbridgePresetThermostatServer: setpointRaiseLower called with mode: ${lookupSetpointAdjustMode[request.mode]} amount: ${request.amount / 10}`);
|
|
509
|
-
await super.setpointRaiseLower(request);
|
|
510
|
-
}
|
|
511
484
|
async setActivePresetRequest(request) {
|
|
512
485
|
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
513
486
|
const presetHandle = request.presetHandle ? `0x${Buffer.from(request.presetHandle).toString('hex')}` : 'null';
|
|
@@ -519,12 +492,14 @@ export class MatterbridgePresetThermostatServer extends ThermostatServer.with(Th
|
|
|
519
492
|
attributes: this.state,
|
|
520
493
|
endpoint: this.endpoint,
|
|
521
494
|
});
|
|
522
|
-
device.log.debug(`
|
|
495
|
+
device.log.debug(`MatterbridgeThermostatServer: setActivePresetRequest called with presetHandle: ${presetHandle}`);
|
|
523
496
|
await super.setActivePresetRequest(request);
|
|
524
497
|
const activePresetHandle = this.state.activePresetHandle ? `0x${Buffer.from(this.state.activePresetHandle).toString('hex')}` : 'null';
|
|
525
|
-
device.log.debug(`
|
|
498
|
+
device.log.debug(`MatterbridgeThermostatServer: setActivePresetRequest completed with activePresetHandle: ${activePresetHandle} occupiedHeatingSetpoint: ${this.state.occupiedHeatingSetpoint} occupiedCoolingSetpoint: ${this.state.occupiedCoolingSetpoint}`);
|
|
526
499
|
}
|
|
527
500
|
}
|
|
501
|
+
export class MatterbridgePresetThermostatServer extends ThermostatServer.with(Thermostat.Feature.Presets, Thermostat.Feature.Cooling, Thermostat.Feature.Heating, Thermostat.Feature.AutoMode) {
|
|
502
|
+
}
|
|
528
503
|
export class MatterbridgeValveConfigurationAndControlServer extends ValveConfigurationAndControlServer.with(ValveConfigurationAndControl.Feature.Level) {
|
|
529
504
|
async open(request) {
|
|
530
505
|
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
@@ -676,7 +651,7 @@ export class MatterbridgeOperationalStateServer extends OperationalStateServer {
|
|
|
676
651
|
export class MatterbridgeServiceAreaServer extends ServiceAreaServer {
|
|
677
652
|
async selectAreas(request) {
|
|
678
653
|
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
679
|
-
device.log.info(`Selecting areas ${request.newAreas} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
654
|
+
device.log.info(`Selecting areas [${request.newAreas.join(', ')}] (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
680
655
|
await device.commandHandler.executeHandler('ServiceArea.selectAreas', {
|
|
681
656
|
command: 'selectAreas',
|
|
682
657
|
request,
|
|
@@ -684,15 +659,7 @@ export class MatterbridgeServiceAreaServer extends ServiceAreaServer {
|
|
|
684
659
|
attributes: this.state,
|
|
685
660
|
endpoint: this.endpoint,
|
|
686
661
|
});
|
|
687
|
-
|
|
688
|
-
const supportedArea = this.state.supportedAreas.find((supportedArea) => supportedArea.areaId === area);
|
|
689
|
-
if (!supportedArea) {
|
|
690
|
-
device.log.error(`MatterbridgeServiceAreaServer selectAreas called with unsupported area: ${area}`);
|
|
691
|
-
return { status: ServiceArea.SelectAreasStatus.UnsupportedArea, statusText: 'Unsupported areas' };
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
this.state.selectedAreas = request.newAreas;
|
|
695
|
-
device.log.debug(`MatterbridgeServiceAreaServer selectAreas called with: ${request.newAreas.map((area) => area.toString()).join(', ')}`);
|
|
662
|
+
device.log.debug(`MatterbridgeServiceAreaServer selectAreas called with: [${request.newAreas.join(', ')}]`);
|
|
696
663
|
return await super.selectAreas(request);
|
|
697
664
|
}
|
|
698
665
|
}
|
|
@@ -172,6 +172,7 @@ export declare class MatterbridgeEndpoint extends Endpoint {
|
|
|
172
172
|
createDefaultHepaFilterMonitoringClusterServer(condition?: number, changeIndication?: ResourceMonitoring.ChangeIndication, inPlaceIndicator?: boolean | undefined, lastChangedTime?: number | null | undefined, replacementProductList?: ResourceMonitoring.ReplacementProduct[]): this;
|
|
173
173
|
createDefaultActivatedCarbonFilterMonitoringClusterServer(condition?: number, changeIndication?: ResourceMonitoring.ChangeIndication, inPlaceIndicator?: boolean | undefined, lastChangedTime?: number | null | undefined, replacementProductList?: ResourceMonitoring.ReplacementProduct[]): this;
|
|
174
174
|
createDefaultDoorLockClusterServer(lockState?: DoorLock.LockState, lockType?: DoorLock.LockType): this;
|
|
175
|
+
createPinDoorLockClusterServer(lockState?: DoorLock.LockState, lockType?: DoorLock.LockType): this;
|
|
175
176
|
createDefaultModeSelectClusterServer(description: string, supportedModes: ModeSelect.ModeOption[], currentMode?: number, startUpMode?: number): this;
|
|
176
177
|
createDefaultValveConfigurationAndControlClusterServer(valveState?: ValveConfigurationAndControl.ValveState, valveLevel?: number): this;
|
|
177
178
|
createDefaultPumpConfigurationAndControlClusterServer(pumpMode?: PumpConfigurationAndControl.OperationMode): this;
|
|
@@ -62,7 +62,7 @@ import { VendorId } from '@matter/types/datatype';
|
|
|
62
62
|
import { inspectError } from '@matterbridge/utils/error';
|
|
63
63
|
import { isValidNumber, isValidObject, isValidString } from '@matterbridge/utils/validate';
|
|
64
64
|
import { AnsiLogger, CYAN, db, debugStringify, hk, or, YELLOW, zb } from 'node-ansi-logger';
|
|
65
|
-
import { MatterbridgeActivatedCarbonFilterMonitoringServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDoorLockServer,
|
|
65
|
+
import { MatterbridgeActivatedCarbonFilterMonitoringServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDoorLockServer, MatterbridgeFanControlServer, MatterbridgeHepaFilterMonitoringServer, MatterbridgeIdentifyServer, MatterbridgeLevelControlServer, MatterbridgeModeSelectServer, MatterbridgeOnOffServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer, MatterbridgeServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeSwitchServer, MatterbridgeThermostatServer, MatterbridgeValveConfigurationAndControlServer, MatterbridgeWindowCoveringServer, } from './matterbridgeBehaviorsServer.js';
|
|
66
66
|
import { CommandHandler } from './matterbridgeEndpointCommandHandler.js';
|
|
67
67
|
import { addClusterServers, addFixedLabel, addOptionalClusterServers, addRequiredClusterServers, addUserLabel, checkNotLatinCharacters, createUniqueId, featuresFor, generateUniqueId, getApparentElectricalPowerMeasurementClusterServer, getAttribute, getAttributeId, getBehavior, getBehaviourTypesFromClusterClientIds, getBehaviourTypesFromClusterServerIds, getCluster, getClusterId, getDefaultDeviceEnergyManagementClusterServer, getDefaultDeviceEnergyManagementModeClusterServer, getDefaultElectricalEnergyMeasurementClusterServer, getDefaultElectricalPowerMeasurementClusterServer, getDefaultFlowMeasurementClusterServer, getDefaultIlluminanceMeasurementClusterServer, getDefaultOccupancySensingClusterServer, getDefaultOperationalStateClusterServer, getDefaultPowerSourceBatteryClusterServer, getDefaultPowerSourceRechargeableBatteryClusterServer, getDefaultPowerSourceReplaceableBatteryClusterServer, getDefaultPowerSourceWiredClusterServer, getDefaultPressureMeasurementClusterServer, getDefaultRelativeHumidityMeasurementClusterServer, getDefaultTemperatureMeasurementClusterServer, invokeBehaviorCommand, lowercaseFirstLetter, setAttribute, setCluster, subscribeAttribute, triggerEvent, updateAttribute, } from './matterbridgeEndpointHelpers.js';
|
|
68
68
|
const MATTERBRIDGE_ENDPOINT_BRAND = Symbol('MatterbridgeEndpoint.brand');
|
|
@@ -639,7 +639,7 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
639
639
|
return this;
|
|
640
640
|
}
|
|
641
641
|
createEnhancedColorControlClusterServer(currentX = 0, currentY = 0, enhancedCurrentHue = 0, currentSaturation = 0, colorTemperatureMireds = 500, colorTempPhysicalMinMireds = 147, colorTempPhysicalMaxMireds = 500) {
|
|
642
|
-
this.behaviors.require(
|
|
642
|
+
this.behaviors.require(MatterbridgeColorControlServer.with(ColorControl.Feature.Xy, ColorControl.Feature.HueSaturation, ColorControl.Feature.EnhancedHue, ColorControl.Feature.ColorTemperature), {
|
|
643
643
|
colorMode: ColorControl.ColorMode.CurrentHueAndCurrentSaturation,
|
|
644
644
|
enhancedColorMode: ColorControl.EnhancedColorMode.EnhancedCurrentHueAndCurrentSaturation,
|
|
645
645
|
colorCapabilities: { xy: true, hueSaturation: true, colorLoop: false, enhancedHue: true, colorTemperature: true },
|
|
@@ -893,7 +893,7 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
893
893
|
return this;
|
|
894
894
|
}
|
|
895
895
|
createDefaultPresetsThermostatClusterServer(localTemperature = 23, occupiedHeatingSetpoint = 21, occupiedCoolingSetpoint = 25, minSetpointDeadBand = 0, minHeatSetpointLimit = 0, maxHeatSetpointLimit = 50, minCoolSetpointLimit = 0, maxCoolSetpointLimit = 50, unoccupiedHeatingSetpoint = undefined, unoccupiedCoolingSetpoint = undefined, occupied = undefined, outdoorTemperature = undefined, activePresetHandle = null, presetsList = undefined, presetTypes = undefined) {
|
|
896
|
-
this.behaviors.require(
|
|
896
|
+
this.behaviors.require(MatterbridgeThermostatServer.with(Thermostat.Feature.Heating, Thermostat.Feature.Cooling, Thermostat.Feature.AutoMode, ...(occupied !== undefined ? [Thermostat.Feature.Occupancy] : []), Thermostat.Feature.Presets), {
|
|
897
897
|
localTemperature: localTemperature * 100,
|
|
898
898
|
externalMeasuredIndoorTemperature: localTemperature * 100,
|
|
899
899
|
...(outdoorTemperature !== undefined ? { outdoorTemperature: outdoorTemperature !== null ? outdoorTemperature * 100 : outdoorTemperature } : {}),
|
|
@@ -1048,7 +1048,7 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
1048
1048
|
return this;
|
|
1049
1049
|
}
|
|
1050
1050
|
createDefaultDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt) {
|
|
1051
|
-
this.behaviors.require(MatterbridgeDoorLockServer.enable({ events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true } }), {
|
|
1051
|
+
this.behaviors.require(MatterbridgeDoorLockServer.with().enable({ events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true } }), {
|
|
1052
1052
|
lockState,
|
|
1053
1053
|
lockType,
|
|
1054
1054
|
actuatorEnabled: true,
|
|
@@ -1058,6 +1058,26 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
1058
1058
|
});
|
|
1059
1059
|
return this;
|
|
1060
1060
|
}
|
|
1061
|
+
createPinDoorLockClusterServer(lockState = DoorLock.LockState.Locked, lockType = DoorLock.LockType.DeadBolt) {
|
|
1062
|
+
this.behaviors.require(MatterbridgeDoorLockServer.with(DoorLock.Feature.PinCredential, DoorLock.Feature.CredentialOverTheAirAccess).enable({
|
|
1063
|
+
events: { doorLockAlarm: true, lockOperation: true, lockOperationError: true },
|
|
1064
|
+
}), {
|
|
1065
|
+
lockState,
|
|
1066
|
+
lockType,
|
|
1067
|
+
actuatorEnabled: true,
|
|
1068
|
+
operatingMode: DoorLock.OperatingMode.Normal,
|
|
1069
|
+
supportedOperatingModes: { normal: false, vacation: true, privacy: true, noRemoteLockUnlock: false, passage: true, alwaysSet: 2047 },
|
|
1070
|
+
autoRelockTime: 0,
|
|
1071
|
+
numberOfPinUsersSupported: 10,
|
|
1072
|
+
minPinCodeLength: 4,
|
|
1073
|
+
maxPinCodeLength: 10,
|
|
1074
|
+
sendPinOverTheAir: true,
|
|
1075
|
+
requirePinForRemoteOperation: true,
|
|
1076
|
+
wrongCodeEntryLimit: 5,
|
|
1077
|
+
userCodeTemporaryDisableTime: 60,
|
|
1078
|
+
});
|
|
1079
|
+
return this;
|
|
1080
|
+
}
|
|
1061
1081
|
createDefaultModeSelectClusterServer(description, supportedModes, currentMode = 0, startUpMode = 0) {
|
|
1062
1082
|
this.behaviors.require(MatterbridgeModeSelectServer, {
|
|
1063
1083
|
description: description,
|
|
@@ -71,6 +71,16 @@ export interface MatterbridgeEndpointCommands {
|
|
|
71
71
|
setTarget: HandlerFunction;
|
|
72
72
|
lockDoor: HandlerFunction;
|
|
73
73
|
unlockDoor: HandlerFunction;
|
|
74
|
+
setPinCode: HandlerFunction;
|
|
75
|
+
getPinCode: HandlerFunction;
|
|
76
|
+
clearPinCode: HandlerFunction;
|
|
77
|
+
clearAllPinCodes: HandlerFunction;
|
|
78
|
+
setUser: HandlerFunction;
|
|
79
|
+
getUser: HandlerFunction;
|
|
80
|
+
clearUser: HandlerFunction;
|
|
81
|
+
setCredential: HandlerFunction;
|
|
82
|
+
getCredentialStatus: HandlerFunction;
|
|
83
|
+
clearCredential: HandlerFunction;
|
|
74
84
|
setpointRaiseLower: HandlerFunction;
|
|
75
85
|
setActivePresetRequest: HandlerFunction;
|
|
76
86
|
step: HandlerFunction;
|
|
@@ -383,6 +393,16 @@ export type CommandHandlerDataMap = {
|
|
|
383
393
|
};
|
|
384
394
|
'lockDoor': CommandHandlerData<'DoorLock.lockDoor'>;
|
|
385
395
|
'unlockDoor': CommandHandlerData<'DoorLock.unlockDoor'>;
|
|
396
|
+
'setPinCode': CommandHandlerData<'DoorLock.setPinCode'>;
|
|
397
|
+
'getPinCode': CommandHandlerData<'DoorLock.getPinCode'>;
|
|
398
|
+
'clearPinCode': CommandHandlerData<'DoorLock.clearPinCode'>;
|
|
399
|
+
'clearAllPinCodes': CommandHandlerData<'DoorLock.clearAllPinCodes'>;
|
|
400
|
+
'setUser': CommandHandlerData<'DoorLock.setUser'>;
|
|
401
|
+
'getUser': CommandHandlerData<'DoorLock.getUser'>;
|
|
402
|
+
'clearUser': CommandHandlerData<'DoorLock.clearUser'>;
|
|
403
|
+
'setCredential': CommandHandlerData<'DoorLock.setCredential'>;
|
|
404
|
+
'getCredentialStatus': CommandHandlerData<'DoorLock.getCredentialStatus'>;
|
|
405
|
+
'clearCredential': CommandHandlerData<'DoorLock.clearCredential'>;
|
|
386
406
|
'DoorLock.lockDoor': {
|
|
387
407
|
command: 'lockDoor';
|
|
388
408
|
request: DoorLock.LockDoorRequest;
|
|
@@ -397,6 +417,76 @@ export type CommandHandlerDataMap = {
|
|
|
397
417
|
attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
|
|
398
418
|
endpoint: MatterbridgeEndpoint;
|
|
399
419
|
};
|
|
420
|
+
'DoorLock.setPinCode': {
|
|
421
|
+
command: 'setPinCode';
|
|
422
|
+
request: DoorLock.SetPinCodeRequest;
|
|
423
|
+
cluster: 'doorLock';
|
|
424
|
+
attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
|
|
425
|
+
endpoint: MatterbridgeEndpoint;
|
|
426
|
+
};
|
|
427
|
+
'DoorLock.getPinCode': {
|
|
428
|
+
command: 'getPinCode';
|
|
429
|
+
request: DoorLock.GetPinCodeRequest;
|
|
430
|
+
cluster: 'doorLock';
|
|
431
|
+
attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
|
|
432
|
+
endpoint: MatterbridgeEndpoint;
|
|
433
|
+
};
|
|
434
|
+
'DoorLock.clearPinCode': {
|
|
435
|
+
command: 'clearPinCode';
|
|
436
|
+
request: DoorLock.ClearPinCodeRequest;
|
|
437
|
+
cluster: 'doorLock';
|
|
438
|
+
attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
|
|
439
|
+
endpoint: MatterbridgeEndpoint;
|
|
440
|
+
};
|
|
441
|
+
'DoorLock.clearAllPinCodes': {
|
|
442
|
+
command: 'clearAllPinCodes';
|
|
443
|
+
request: {};
|
|
444
|
+
cluster: 'doorLock';
|
|
445
|
+
attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
|
|
446
|
+
endpoint: MatterbridgeEndpoint;
|
|
447
|
+
};
|
|
448
|
+
'DoorLock.setUser': {
|
|
449
|
+
command: 'setUser';
|
|
450
|
+
request: DoorLock.SetUserRequest;
|
|
451
|
+
cluster: 'doorLock';
|
|
452
|
+
attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
|
|
453
|
+
endpoint: MatterbridgeEndpoint;
|
|
454
|
+
};
|
|
455
|
+
'DoorLock.getUser': {
|
|
456
|
+
command: 'getUser';
|
|
457
|
+
request: DoorLock.GetUserRequest;
|
|
458
|
+
cluster: 'doorLock';
|
|
459
|
+
attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
|
|
460
|
+
endpoint: MatterbridgeEndpoint;
|
|
461
|
+
};
|
|
462
|
+
'DoorLock.clearUser': {
|
|
463
|
+
command: 'clearUser';
|
|
464
|
+
request: DoorLock.ClearUserRequest;
|
|
465
|
+
cluster: 'doorLock';
|
|
466
|
+
attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
|
|
467
|
+
endpoint: MatterbridgeEndpoint;
|
|
468
|
+
};
|
|
469
|
+
'DoorLock.setCredential': {
|
|
470
|
+
command: 'setCredential';
|
|
471
|
+
request: DoorLock.SetCredentialRequest;
|
|
472
|
+
cluster: 'doorLock';
|
|
473
|
+
attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
|
|
474
|
+
endpoint: MatterbridgeEndpoint;
|
|
475
|
+
};
|
|
476
|
+
'DoorLock.getCredentialStatus': {
|
|
477
|
+
command: 'getCredentialStatus';
|
|
478
|
+
request: DoorLock.GetCredentialStatusRequest;
|
|
479
|
+
cluster: 'doorLock';
|
|
480
|
+
attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
|
|
481
|
+
endpoint: MatterbridgeEndpoint;
|
|
482
|
+
};
|
|
483
|
+
'DoorLock.clearCredential': {
|
|
484
|
+
command: 'clearCredential';
|
|
485
|
+
request: DoorLock.ClearCredentialRequest;
|
|
486
|
+
cluster: 'doorLock';
|
|
487
|
+
attributes: ClusterAttributeValues<(typeof DoorLock.Complete)['attributes']>;
|
|
488
|
+
endpoint: MatterbridgeEndpoint;
|
|
489
|
+
};
|
|
400
490
|
'setpointRaiseLower': CommandHandlerData<'Thermostat.setpointRaiseLower'>;
|
|
401
491
|
'setActivePresetRequest': CommandHandlerData<'Thermostat.setActivePresetRequest'>;
|
|
402
492
|
'Thermostat.setpointRaiseLower': {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matterbridge/core",
|
|
3
|
-
"version": "3.7.1-dev-
|
|
3
|
+
"version": "3.7.1-dev-20260324-9c29691",
|
|
4
4
|
"description": "Matterbridge core library",
|
|
5
5
|
"author": "https://github.com/Luligu",
|
|
6
6
|
"homepage": "https://matterbridge.io/",
|
|
@@ -122,14 +122,14 @@
|
|
|
122
122
|
],
|
|
123
123
|
"dependencies": {
|
|
124
124
|
"@matter/main": "0.16.10",
|
|
125
|
-
"@matterbridge/dgram": "3.7.1-dev-
|
|
126
|
-
"@matterbridge/thread": "3.7.1-dev-
|
|
127
|
-
"@matterbridge/types": "3.7.1-dev-
|
|
128
|
-
"@matterbridge/utils": "3.7.1-dev-
|
|
125
|
+
"@matterbridge/dgram": "3.7.1-dev-20260324-9c29691",
|
|
126
|
+
"@matterbridge/thread": "3.7.1-dev-20260324-9c29691",
|
|
127
|
+
"@matterbridge/types": "3.7.1-dev-20260324-9c29691",
|
|
128
|
+
"@matterbridge/utils": "3.7.1-dev-20260324-9c29691",
|
|
129
129
|
"express": "5.2.1",
|
|
130
130
|
"multer": "2.1.1",
|
|
131
131
|
"node-ansi-logger": "3.2.0",
|
|
132
132
|
"node-persist-manager": "2.0.1",
|
|
133
|
-
"ws": "8.
|
|
133
|
+
"ws": "8.20.0"
|
|
134
134
|
}
|
|
135
135
|
}
|