matterbridge 1.2.21 → 1.3.0
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/CHANGELOG.md +39 -0
- package/README.md +48 -9
- package/dist/cluster/AirQualityCluster.d.ts.map +1 -0
- package/dist/cluster/AirQualityCluster.js.map +1 -0
- package/dist/cluster/BooleanStateConfigurationCluster.d.ts +2200 -0
- package/dist/cluster/BooleanStateConfigurationCluster.d.ts.map +1 -0
- package/dist/cluster/BooleanStateConfigurationCluster.js +388 -0
- package/dist/cluster/BooleanStateConfigurationCluster.js.map +1 -0
- package/dist/cluster/BridgedDeviceBasicInformationCluster.d.ts.map +1 -0
- package/dist/cluster/BridgedDeviceBasicInformationCluster.js.map +1 -0
- package/dist/cluster/CarbonMonoxideConcentrationMeasurementCluster.d.ts +396 -0
- package/dist/cluster/CarbonMonoxideConcentrationMeasurementCluster.d.ts.map +1 -0
- package/dist/cluster/CarbonMonoxideConcentrationMeasurementCluster.js +30 -0
- package/dist/cluster/CarbonMonoxideConcentrationMeasurementCluster.js.map +1 -0
- package/dist/cluster/ConcentrationMeasurementCluster.d.ts +524 -0
- package/dist/cluster/ConcentrationMeasurementCluster.d.ts.map +1 -0
- package/dist/cluster/ConcentrationMeasurementCluster.js +282 -0
- package/dist/cluster/ConcentrationMeasurementCluster.js.map +1 -0
- package/dist/cluster/DeviceEnergyManagementCluster.d.ts +7851 -0
- package/dist/cluster/DeviceEnergyManagementCluster.d.ts.map +1 -0
- package/dist/cluster/DeviceEnergyManagementCluster.js +1634 -0
- package/dist/cluster/DeviceEnergyManagementCluster.js.map +1 -0
- package/dist/cluster/DeviceEnergyManagementModeCluster.d.ts +68 -0
- package/dist/cluster/DeviceEnergyManagementModeCluster.d.ts.map +1 -0
- package/dist/cluster/DeviceEnergyManagementModeCluster.js +49 -0
- package/dist/cluster/DeviceEnergyManagementModeCluster.js.map +1 -0
- package/dist/cluster/ElectricalEnergyMeasurementCluster.d.ts +4978 -0
- package/dist/cluster/ElectricalEnergyMeasurementCluster.d.ts.map +1 -0
- package/dist/cluster/ElectricalEnergyMeasurementCluster.js +510 -0
- package/dist/cluster/ElectricalEnergyMeasurementCluster.js.map +1 -0
- package/dist/cluster/ElectricalPowerMeasurementCluster.d.ts +3250 -0
- package/dist/cluster/ElectricalPowerMeasurementCluster.d.ts.map +1 -0
- package/dist/cluster/ElectricalPowerMeasurementCluster.js +675 -0
- package/dist/cluster/ElectricalPowerMeasurementCluster.js.map +1 -0
- package/dist/cluster/FanControlCluster.d.ts +1583 -0
- package/dist/cluster/FanControlCluster.d.ts.map +1 -0
- package/dist/cluster/FanControlCluster.js +492 -0
- package/dist/cluster/FanControlCluster.js.map +1 -0
- package/dist/cluster/MeasurementAccuracy.d.ts +63 -0
- package/dist/cluster/MeasurementAccuracy.d.ts.map +1 -0
- package/dist/cluster/MeasurementAccuracy.js +47 -0
- package/dist/cluster/MeasurementAccuracy.js.map +1 -0
- package/dist/cluster/MeasurementAccuracyRange.d.ts +134 -0
- package/dist/cluster/MeasurementAccuracyRange.d.ts.map +1 -0
- package/dist/cluster/MeasurementAccuracyRange.js +103 -0
- package/dist/cluster/MeasurementAccuracyRange.js.map +1 -0
- package/dist/cluster/MeasurementType.d.ts +68 -0
- package/dist/cluster/MeasurementType.d.ts.map +1 -0
- package/dist/cluster/MeasurementType.js +69 -0
- package/dist/cluster/MeasurementType.js.map +1 -0
- package/dist/cluster/PowerTopologyCluster.d.ts +355 -0
- package/dist/cluster/PowerTopologyCluster.d.ts.map +1 -0
- package/dist/cluster/PowerTopologyCluster.js +138 -0
- package/dist/cluster/PowerTopologyCluster.js.map +1 -0
- package/dist/cluster/SmokeCoAlarmCluster.d.ts +1599 -0
- package/dist/cluster/SmokeCoAlarmCluster.d.ts.map +1 -0
- package/dist/cluster/SmokeCoAlarmCluster.js +603 -0
- package/dist/cluster/SmokeCoAlarmCluster.js.map +1 -0
- package/dist/cluster/TvocCluster.d.ts.map +1 -0
- package/dist/cluster/TvocCluster.js.map +1 -0
- package/dist/defaultConfigSchema.d.ts.map +1 -1
- package/dist/defaultConfigSchema.js +26 -12
- package/dist/defaultConfigSchema.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/matterbridge.d.ts +63 -1
- package/dist/matterbridge.d.ts.map +1 -1
- package/dist/matterbridge.js +72 -26
- package/dist/matterbridge.js.map +1 -1
- package/dist/matterbridgeDevice.d.ts +692 -30
- package/dist/matterbridgeDevice.d.ts.map +1 -1
- package/dist/matterbridgeDevice.js +429 -73
- package/dist/matterbridgeDevice.js.map +1 -1
- package/dist/matterbridgeDeviceV8.d.ts +3 -5
- package/dist/matterbridgeDeviceV8.d.ts.map +1 -1
- package/dist/matterbridgeDeviceV8.js +62 -14
- package/dist/matterbridgeDeviceV8.js.map +1 -1
- package/dist/matterbridgeV8.d.ts +69 -5
- package/dist/matterbridgeV8.d.ts.map +1 -1
- package/dist/matterbridgeV8.js +413 -99
- package/dist/matterbridgeV8.js.map +1 -1
- package/frontend/build/asset-manifest.json +3 -3
- package/frontend/build/index.html +1 -1
- package/frontend/build/static/js/{main.23829a0f.js → main.cbfc6c9b.js} +3 -3
- package/frontend/build/static/js/{main.23829a0f.js.map → main.cbfc6c9b.js.map} +1 -1
- package/package.json +6 -6
- package/dist/AirQualityCluster.d.ts.map +0 -1
- package/dist/AirQualityCluster.js.map +0 -1
- package/dist/BridgedDeviceBasicInformationCluster.d.ts.map +0 -1
- package/dist/BridgedDeviceBasicInformationCluster.js.map +0 -1
- package/dist/TvocCluster.d.ts.map +0 -1
- package/dist/TvocCluster.js.map +0 -1
- /package/dist/{AirQualityCluster.d.ts → cluster/AirQualityCluster.d.ts} +0 -0
- /package/dist/{AirQualityCluster.js → cluster/AirQualityCluster.js} +0 -0
- /package/dist/{BridgedDeviceBasicInformationCluster.d.ts → cluster/BridgedDeviceBasicInformationCluster.d.ts} +0 -0
- /package/dist/{BridgedDeviceBasicInformationCluster.js → cluster/BridgedDeviceBasicInformationCluster.js} +0 -0
- /package/dist/{TvocCluster.d.ts → cluster/TvocCluster.d.ts} +0 -0
- /package/dist/{TvocCluster.js → cluster/TvocCluster.js} +0 -0
- /package/frontend/build/static/js/{main.23829a0f.js.LICENSE.txt → main.cbfc6c9b.js.LICENSE.txt} +0 -0
|
@@ -20,21 +20,88 @@
|
|
|
20
20
|
* See the License for the specific language governing permissions and
|
|
21
21
|
* limitations under the License. *
|
|
22
22
|
*/
|
|
23
|
-
import { BasicInformationCluster, BooleanState, BooleanStateCluster, ClusterServer, ColorControl, ColorControlCluster, DoorLock, DoorLockCluster, ElectricalMeasurement, ElectricalMeasurementCluster, FixedLabelCluster, FlowMeasurement, FlowMeasurementCluster, Groups, Identify, IdentifyCluster, IlluminanceMeasurement, IlluminanceMeasurementCluster, LevelControl, LevelControlCluster, ModeSelectCluster, OccupancySensing, OccupancySensingCluster, OnOff, OnOffCluster, PowerSource, PowerSourceCluster, PowerSourceConfigurationCluster, PressureMeasurement, PressureMeasurementCluster, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, Scenes, Switch, SwitchCluster, TemperatureMeasurement, TemperatureMeasurementCluster, Thermostat, ThermostatCluster, ThreadNetworkDiagnostics, ThreadNetworkDiagnosticsCluster, TimeSync, TimeSyncCluster, WindowCovering, WindowCoveringCluster, createDefaultGroupsClusterServer, createDefaultScenesClusterServer, getClusterNameById, } from '@project-chip/matter-node.js/cluster';
|
|
23
|
+
import { BasicInformationCluster, BooleanState, BooleanStateCluster, ClusterServer, ColorControl, ColorControlCluster, DoorLock, DoorLockCluster, ElectricalMeasurement, ElectricalMeasurementCluster, FanControl, FanControlCluster, FixedLabelCluster, FlowMeasurement, FlowMeasurementCluster, Groups, Identify, IdentifyCluster, IlluminanceMeasurement, IlluminanceMeasurementCluster, LevelControl, LevelControlCluster, ModeSelectCluster, OccupancySensing, OccupancySensingCluster, OnOff, OnOffCluster, PowerSource, PowerSourceCluster, PowerSourceConfigurationCluster, PressureMeasurement, PressureMeasurementCluster, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, Scenes, Switch, SwitchCluster, TemperatureMeasurement, TemperatureMeasurementCluster, Thermostat, ThermostatCluster, ThreadNetworkDiagnostics, ThreadNetworkDiagnosticsCluster, TimeSync, TimeSyncCluster, WindowCovering, WindowCoveringCluster, createDefaultGroupsClusterServer, createDefaultScenesClusterServer, getClusterNameById, } from '@project-chip/matter-node.js/cluster';
|
|
24
24
|
import { EndpointNumber, VendorId } from '@project-chip/matter-node.js/datatype';
|
|
25
25
|
import { Device, DeviceClasses, DeviceTypeDefinition, Endpoint } from '@project-chip/matter-node.js/device';
|
|
26
26
|
import { extendPublicHandlerMethods } from '@project-chip/matter-node.js/util';
|
|
27
27
|
import { EveHistory, EveHistoryCluster } from 'matter-history';
|
|
28
|
-
import { AirQuality, AirQualityCluster } from './AirQualityCluster.js';
|
|
29
|
-
import { AnsiLogger, db, hk, zb } from 'node-ansi-logger';
|
|
28
|
+
import { AirQuality, AirQualityCluster } from './cluster/AirQualityCluster.js';
|
|
29
|
+
import { AnsiLogger, CYAN, db, hk, zb } from 'node-ansi-logger';
|
|
30
30
|
import { createHash } from 'crypto';
|
|
31
|
-
import { TvocMeasurement, TvocMeasurementCluster } from './TvocCluster.js';
|
|
32
|
-
import { BridgedDeviceBasicInformation, BridgedDeviceBasicInformationCluster } from './BridgedDeviceBasicInformationCluster.js';
|
|
33
|
-
|
|
31
|
+
import { TvocMeasurement, TvocMeasurementCluster } from './cluster/TvocCluster.js';
|
|
32
|
+
import { BridgedDeviceBasicInformation, BridgedDeviceBasicInformationCluster } from './cluster/BridgedDeviceBasicInformationCluster.js';
|
|
33
|
+
import { PowerTopology, PowerTopologyCluster } from './cluster/PowerTopologyCluster.js';
|
|
34
|
+
import { ElectricalPowerMeasurement, ElectricalPowerMeasurementCluster } from './cluster/ElectricalPowerMeasurementCluster.js';
|
|
35
|
+
import { ElectricalEnergyMeasurement, ElectricalEnergyMeasurementCluster } from './cluster/ElectricalEnergyMeasurementCluster.js';
|
|
36
|
+
import { MeasurementType } from './cluster/MeasurementType.js';
|
|
37
|
+
import { CarbonMonoxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurementCluster } from './cluster/CarbonMonoxideConcentrationMeasurementCluster.js';
|
|
38
|
+
import { SmokeCoAlarm, SmokeCoAlarmCluster } from './cluster/SmokeCoAlarmCluster.js';
|
|
39
|
+
import { BooleanStateConfiguration, BooleanStateConfigurationCluster } from './cluster/BooleanStateConfigurationCluster.js';
|
|
40
|
+
import { DeviceEnergyManagement, DeviceEnergyManagementCluster } from './cluster/DeviceEnergyManagementCluster.js';
|
|
41
|
+
import { DeviceEnergyManagementMode, DeviceEnergyManagementModeCluster } from './cluster/DeviceEnergyManagementModeCluster.js';
|
|
42
|
+
// import { FanControl, FanControlCluster } from './cluster/FanControlCluster.js';
|
|
43
|
+
import { ConcentrationMeasurement } from './cluster/ConcentrationMeasurementCluster.js';
|
|
44
|
+
// Matter 1.2 and 1.3 device types
|
|
45
|
+
export const airQualitySensor = DeviceTypeDefinition({
|
|
46
|
+
name: 'MA-airQualitySensor',
|
|
47
|
+
code: 0x002c,
|
|
48
|
+
deviceClass: DeviceClasses.Simple,
|
|
49
|
+
revision: 1,
|
|
50
|
+
requiredServerClusters: [Identify.Cluster.id, AirQuality.Cluster.id],
|
|
51
|
+
optionalServerClusters: [TemperatureMeasurement.Cluster.id, RelativeHumidityMeasurement.Cluster.id, TvocMeasurement.Cluster.id],
|
|
52
|
+
});
|
|
53
|
+
export const waterFreezeDetector = DeviceTypeDefinition({
|
|
54
|
+
name: 'MA-waterFreezeDetector',
|
|
55
|
+
code: 0x0041,
|
|
56
|
+
deviceClass: DeviceClasses.Simple,
|
|
57
|
+
revision: 1,
|
|
58
|
+
requiredServerClusters: [Identify.Cluster.id, BooleanState.Cluster.id],
|
|
59
|
+
optionalServerClusters: [BooleanStateConfiguration.Cluster.id],
|
|
60
|
+
});
|
|
61
|
+
export const waterLeakDetector = DeviceTypeDefinition({
|
|
62
|
+
name: 'MA-waterLeakDetector',
|
|
63
|
+
code: 0x0043,
|
|
64
|
+
deviceClass: DeviceClasses.Simple,
|
|
65
|
+
revision: 1,
|
|
66
|
+
requiredServerClusters: [Identify.Cluster.id, BooleanState.Cluster.id],
|
|
67
|
+
optionalServerClusters: [BooleanStateConfiguration.Cluster.id],
|
|
68
|
+
});
|
|
69
|
+
export const rainSensor = DeviceTypeDefinition({
|
|
70
|
+
name: 'MA-rainSensor',
|
|
71
|
+
code: 0x0044,
|
|
72
|
+
deviceClass: DeviceClasses.Simple,
|
|
73
|
+
revision: 1,
|
|
74
|
+
requiredServerClusters: [Identify.Cluster.id, BooleanState.Cluster.id],
|
|
75
|
+
optionalServerClusters: [BooleanStateConfiguration.Cluster.id],
|
|
76
|
+
});
|
|
77
|
+
export const smokeCoAlarm = DeviceTypeDefinition({
|
|
78
|
+
name: 'MA-smokeCoAlarm',
|
|
79
|
+
code: 0x0076,
|
|
80
|
+
deviceClass: DeviceClasses.Simple,
|
|
81
|
+
revision: 1,
|
|
82
|
+
requiredServerClusters: [Identify.Cluster.id, SmokeCoAlarm.Cluster.id],
|
|
83
|
+
optionalServerClusters: [Groups.Cluster.id, TemperatureMeasurement.Cluster.id, RelativeHumidityMeasurement.Cluster.id, CarbonMonoxideConcentrationMeasurement.Cluster.id],
|
|
84
|
+
});
|
|
85
|
+
export const electricalSensor = DeviceTypeDefinition({
|
|
86
|
+
name: 'MA-electricalSensor',
|
|
87
|
+
code: 0x0510,
|
|
88
|
+
deviceClass: DeviceClasses.Utility,
|
|
89
|
+
revision: 1,
|
|
90
|
+
requiredServerClusters: [PowerTopology.Cluster.id],
|
|
91
|
+
optionalServerClusters: [ElectricalPowerMeasurement.Cluster.id, ElectricalEnergyMeasurement.Cluster.id],
|
|
92
|
+
});
|
|
93
|
+
export const deviceEnergyManagement = DeviceTypeDefinition({
|
|
94
|
+
name: 'MA-deviceEnergyManagement',
|
|
95
|
+
code: 0x050d,
|
|
96
|
+
deviceClass: DeviceClasses.Utility,
|
|
97
|
+
revision: 1,
|
|
98
|
+
requiredServerClusters: [DeviceEnergyManagement.Cluster.id, DeviceEnergyManagementMode.Cluster.id],
|
|
99
|
+
optionalServerClusters: [],
|
|
100
|
+
});
|
|
34
101
|
export const powerSource = DeviceTypeDefinition({
|
|
35
|
-
name: 'MA-
|
|
102
|
+
name: 'MA-powerSource',
|
|
36
103
|
code: 0x0011,
|
|
37
|
-
deviceClass: DeviceClasses.
|
|
104
|
+
deviceClass: DeviceClasses.Utility,
|
|
38
105
|
revision: 1,
|
|
39
106
|
requiredServerClusters: [PowerSource.Cluster.id],
|
|
40
107
|
optionalServerClusters: [],
|
|
@@ -42,18 +109,19 @@ export const powerSource = DeviceTypeDefinition({
|
|
|
42
109
|
export const bridgedNode = DeviceTypeDefinition({
|
|
43
110
|
name: 'MA-bridgedNode',
|
|
44
111
|
code: 0x0013,
|
|
45
|
-
deviceClass: DeviceClasses.
|
|
112
|
+
deviceClass: DeviceClasses.Utility,
|
|
46
113
|
revision: 2,
|
|
47
114
|
requiredServerClusters: [BridgedDeviceBasicInformation.Cluster.id],
|
|
48
115
|
optionalServerClusters: [],
|
|
49
116
|
});
|
|
117
|
+
// Custom device types: switch without ClientClusters
|
|
50
118
|
export const onOffSwitch = DeviceTypeDefinition({
|
|
51
119
|
name: 'MA-onoffswitch',
|
|
52
120
|
code: 0x0103,
|
|
53
121
|
deviceClass: DeviceClasses.Simple,
|
|
54
122
|
revision: 2,
|
|
55
123
|
requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, Scenes.Cluster.id, OnOff.Cluster.id],
|
|
56
|
-
optionalServerClusters: [LevelControl.Cluster.id],
|
|
124
|
+
optionalServerClusters: [LevelControl.Cluster.id, ColorControl.Cluster.id],
|
|
57
125
|
});
|
|
58
126
|
export const dimmableSwitch = DeviceTypeDefinition({
|
|
59
127
|
name: 'MA-dimmableswitch',
|
|
@@ -61,7 +129,7 @@ export const dimmableSwitch = DeviceTypeDefinition({
|
|
|
61
129
|
deviceClass: DeviceClasses.Simple,
|
|
62
130
|
revision: 2,
|
|
63
131
|
requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, Scenes.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id],
|
|
64
|
-
optionalServerClusters: [],
|
|
132
|
+
optionalServerClusters: [ColorControl.Cluster.id],
|
|
65
133
|
});
|
|
66
134
|
export const colorTemperatureSwitch = DeviceTypeDefinition({
|
|
67
135
|
name: 'MA-colortemperatureswitch',
|
|
@@ -71,14 +139,6 @@ export const colorTemperatureSwitch = DeviceTypeDefinition({
|
|
|
71
139
|
requiredServerClusters: [Identify.Cluster.id, Groups.Cluster.id, Scenes.Cluster.id, OnOff.Cluster.id, LevelControl.Cluster.id, ColorControl.Cluster.id],
|
|
72
140
|
optionalServerClusters: [],
|
|
73
141
|
});
|
|
74
|
-
export const airQualitySensor = DeviceTypeDefinition({
|
|
75
|
-
name: 'MA-airqualitysensor',
|
|
76
|
-
code: 0x002c,
|
|
77
|
-
deviceClass: DeviceClasses.Simple,
|
|
78
|
-
revision: 1,
|
|
79
|
-
requiredServerClusters: [Identify.Cluster.id, AirQuality.Cluster.id],
|
|
80
|
-
optionalServerClusters: [TemperatureMeasurement.Cluster.id, RelativeHumidityMeasurement.Cluster.id, TvocMeasurement.Cluster.id],
|
|
81
|
-
});
|
|
82
142
|
export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
83
143
|
static bridgeMode = '';
|
|
84
144
|
log;
|
|
@@ -86,14 +146,15 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
86
146
|
deviceName = undefined;
|
|
87
147
|
uniqueId = undefined;
|
|
88
148
|
/**
|
|
89
|
-
*
|
|
149
|
+
* Create a Matterbridge device.
|
|
90
150
|
* @constructor
|
|
91
151
|
* @param {DeviceTypeDefinition} definition - The definition of the device.
|
|
92
152
|
* @param {EndpointOptions} [options={}] - The options for the device.
|
|
93
153
|
*/
|
|
94
|
-
constructor(definition, options = {}) {
|
|
154
|
+
constructor(definition, options = {}, debug = false) {
|
|
95
155
|
super(definition, options);
|
|
96
|
-
this.log = new AnsiLogger({ logName: 'MatterbridgeDevice', logTimestampFormat: 4 /* TimestampFormat.TIME_MILLIS */, logDebug:
|
|
156
|
+
this.log = new AnsiLogger({ logName: 'MatterbridgeDevice', logTimestampFormat: 4 /* TimestampFormat.TIME_MILLIS */, logDebug: debug });
|
|
157
|
+
this.log.debug(`MatterbridgeDevice with deviceType: ${zb}${definition.code}${db}-${zb}${definition.name}${db}`);
|
|
97
158
|
}
|
|
98
159
|
/**
|
|
99
160
|
* Loads an instance of the MatterbridgeDevice class.
|
|
@@ -101,11 +162,11 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
101
162
|
* @param {DeviceTypeDefinition} definition - The DeviceTypeDefinition of the device.
|
|
102
163
|
* @returns MatterbridgeDevice instance.
|
|
103
164
|
*/
|
|
104
|
-
static async loadInstance(definition, options) {
|
|
105
|
-
return new MatterbridgeDevice(definition, options);
|
|
165
|
+
static async loadInstance(definition, options = {}, debug = false) {
|
|
166
|
+
return new MatterbridgeDevice(definition, options, debug);
|
|
106
167
|
}
|
|
107
168
|
/**
|
|
108
|
-
* Adds a device type to the list of device types.
|
|
169
|
+
* Adds a device type to the list of device types of the MatterbridgeDevice endpoint.
|
|
109
170
|
* If the device type is not already present in the list, it will be added.
|
|
110
171
|
*
|
|
111
172
|
* @param {DeviceTypeDefinition} deviceType - The device type to add.
|
|
@@ -113,6 +174,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
113
174
|
addDeviceType(deviceType) {
|
|
114
175
|
const deviceTypes = this.getDeviceTypes();
|
|
115
176
|
if (!deviceTypes.includes(deviceType)) {
|
|
177
|
+
this.log.debug(`addDeviceType: ${zb}${deviceType.code}${db}-${zb}${deviceType.name}${db}`);
|
|
116
178
|
deviceTypes.push(deviceType);
|
|
117
179
|
this.setDeviceTypes(deviceTypes);
|
|
118
180
|
}
|
|
@@ -139,14 +201,15 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
139
201
|
this.addClusterServerFromList(this, includeServerList);
|
|
140
202
|
}
|
|
141
203
|
/**
|
|
142
|
-
* Adds a child device
|
|
204
|
+
* Adds a child endpoint with one or more device types with the required cluster servers and the specified cluster servers.
|
|
143
205
|
*
|
|
206
|
+
* @param {string} endpointName - The name of the new enpoint to add.
|
|
144
207
|
* @param {AtLeastOne<DeviceTypeDefinition>} deviceTypes - The device types to add.
|
|
145
208
|
* @param {ClusterId[]} includeServerList - The list of cluster IDs to include.
|
|
146
209
|
* @returns {Endpoint} - The child endpoint that was added.
|
|
147
210
|
*/
|
|
148
211
|
addChildDeviceTypeWithClusterServer(endpointName, deviceTypes, includeServerList) {
|
|
149
|
-
this.log.debug(
|
|
212
|
+
this.log.debug(`addChildDeviceTypeWithClusterServer: ${CYAN}${endpointName}${db}`);
|
|
150
213
|
const child = new Endpoint(deviceTypes);
|
|
151
214
|
child.addFixedLabel('endpointName', endpointName);
|
|
152
215
|
deviceTypes.forEach((deviceType) => {
|
|
@@ -203,10 +266,14 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
203
266
|
endpoint.addClusterServer(this.getDefaultFlowMeasurementClusterServer());
|
|
204
267
|
if (includeServerList.includes(BooleanState.Cluster.id))
|
|
205
268
|
endpoint.addClusterServer(this.getDefaultBooleanStateClusterServer());
|
|
269
|
+
if (includeServerList.includes(BooleanStateConfiguration.Cluster.id))
|
|
270
|
+
endpoint.addClusterServer(this.getDefaultBooleanStateConfigurationClusterServer());
|
|
206
271
|
if (includeServerList.includes(OccupancySensing.Cluster.id))
|
|
207
272
|
endpoint.addClusterServer(this.getDefaultOccupancySensingClusterServer());
|
|
208
273
|
if (includeServerList.includes(IlluminanceMeasurement.Cluster.id))
|
|
209
274
|
endpoint.addClusterServer(this.getDefaultIlluminanceMeasurementClusterServer());
|
|
275
|
+
if (includeServerList.includes(PowerSource.Cluster.id))
|
|
276
|
+
endpoint.addClusterServer(this.getDefaultPowerSourceWiredClusterServer());
|
|
210
277
|
if (includeServerList.includes(EveHistory.Cluster.id))
|
|
211
278
|
endpoint.addClusterServer(this.getDefaultStaticEveHistoryClusterServer());
|
|
212
279
|
if (includeServerList.includes(ElectricalMeasurement.Cluster.id))
|
|
@@ -215,6 +282,22 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
215
282
|
endpoint.addClusterServer(this.getDefaultAirQualityClusterServer());
|
|
216
283
|
if (includeServerList.includes(TvocMeasurement.Cluster.id))
|
|
217
284
|
endpoint.addClusterServer(this.getDefaultTvocMeasurementClusterServer());
|
|
285
|
+
if (includeServerList.includes(PowerTopology.Cluster.id))
|
|
286
|
+
endpoint.addClusterServer(this.getDefaultPowerTopologyClusterServer());
|
|
287
|
+
if (includeServerList.includes(ElectricalPowerMeasurement.Cluster.id))
|
|
288
|
+
endpoint.addClusterServer(this.getDefaultElectricalPowerMeasurementClusterServer());
|
|
289
|
+
if (includeServerList.includes(ElectricalEnergyMeasurement.Cluster.id))
|
|
290
|
+
endpoint.addClusterServer(this.getDefaultElectricalEnergyMeasurementClusterServer());
|
|
291
|
+
if (includeServerList.includes(SmokeCoAlarm.Cluster.id))
|
|
292
|
+
endpoint.addClusterServer(this.getDefaultSmokeCOAlarmClusterServer());
|
|
293
|
+
if (includeServerList.includes(CarbonMonoxideConcentrationMeasurement.Cluster.id))
|
|
294
|
+
endpoint.addClusterServer(this.getDefaultCarbonMonoxideConcentrationMeasurementClusterServer());
|
|
295
|
+
if (includeServerList.includes(FanControl.Cluster.id))
|
|
296
|
+
endpoint.addClusterServer(this.getDefaultFanControlClusterServer());
|
|
297
|
+
if (includeServerList.includes(DeviceEnergyManagement.Cluster.id))
|
|
298
|
+
endpoint.addClusterServer(this.getDefaultDeviceEnergyManagementClusterServer());
|
|
299
|
+
if (includeServerList.includes(DeviceEnergyManagementMode.Cluster.id))
|
|
300
|
+
endpoint.addClusterServer(this.getDefaultDeviceEnergyManagementModeClusterServer());
|
|
218
301
|
}
|
|
219
302
|
/**
|
|
220
303
|
* Retrieves a child endpoint by its name.
|
|
@@ -259,6 +342,43 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
259
342
|
setChildEndpointName(child, endpointName) {
|
|
260
343
|
child.addFixedLabel('endpointName', endpointName);
|
|
261
344
|
}
|
|
345
|
+
/**
|
|
346
|
+
* Retrieves the label associated with the specified endpoint number.
|
|
347
|
+
* @param {EndpointNumber} endpointNumber - The number of the endpoint.
|
|
348
|
+
* @returns {string | undefined} The label associated with the endpoint number, or undefined if not found.
|
|
349
|
+
*/
|
|
350
|
+
getEndpointLabel(endpointNumber) {
|
|
351
|
+
const labelList = this.getChildEndpoint(endpointNumber)?.getClusterServer(FixedLabelCluster)?.getLabelListAttribute();
|
|
352
|
+
if (!labelList)
|
|
353
|
+
return undefined;
|
|
354
|
+
for (const entry of labelList) {
|
|
355
|
+
if (entry.label === 'endpointName')
|
|
356
|
+
return entry.value;
|
|
357
|
+
}
|
|
358
|
+
return undefined;
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Retrieves the child endpoint with the specified label.
|
|
362
|
+
*
|
|
363
|
+
* @param {string} label - The label of the child endpoint to retrieve.
|
|
364
|
+
* @returns {Endpoint | undefined} The child endpoint with the specified label, or undefined if not found.
|
|
365
|
+
*/
|
|
366
|
+
getChildEndpointWithLabel(label) {
|
|
367
|
+
const endpoints = this.getChildEndpoints();
|
|
368
|
+
for (const endpoint of endpoints) {
|
|
369
|
+
const labelList = endpoint.getClusterServer(FixedLabelCluster)?.getLabelListAttribute();
|
|
370
|
+
if (!labelList)
|
|
371
|
+
return undefined;
|
|
372
|
+
let endpointName = '';
|
|
373
|
+
for (const entry of labelList) {
|
|
374
|
+
if (entry.label === 'endpointName')
|
|
375
|
+
endpointName = entry.value;
|
|
376
|
+
}
|
|
377
|
+
if (endpointName === label)
|
|
378
|
+
return endpoint;
|
|
379
|
+
}
|
|
380
|
+
return undefined;
|
|
381
|
+
}
|
|
262
382
|
/**
|
|
263
383
|
* Serializes the Matterbridge device into a serialized object.
|
|
264
384
|
*
|
|
@@ -657,8 +777,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
657
777
|
identifyType: Identify.IdentifyType.None,
|
|
658
778
|
}, {
|
|
659
779
|
identify: async (data) => {
|
|
660
|
-
|
|
661
|
-
console.log('Identify');
|
|
780
|
+
this.log.debug('Matter command: Identify');
|
|
662
781
|
await this.commandHandler.executeHandler('identify', data);
|
|
663
782
|
},
|
|
664
783
|
});
|
|
@@ -821,6 +940,72 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
821
940
|
this.addClusterServer(this.getDefaultBridgedDeviceBasicInformationClusterServer(deviceName, serialNumber, vendorId, vendorName, productName, softwareVersion, softwareVersionString, hardwareVersion, hardwareVersionString));
|
|
822
941
|
}
|
|
823
942
|
/**
|
|
943
|
+
* Get a default Electrical Energy Measurement Cluster Server.
|
|
944
|
+
*
|
|
945
|
+
* @param energy - The total consumption value.
|
|
946
|
+
*/
|
|
947
|
+
getDefaultPowerTopologyClusterServer() {
|
|
948
|
+
return ClusterServer(PowerTopologyCluster.with(PowerTopology.Feature.TreeTopology), {}, {}, {});
|
|
949
|
+
}
|
|
950
|
+
/**
|
|
951
|
+
* Get a default Electrical Energy Measurement Cluster Server.
|
|
952
|
+
*
|
|
953
|
+
* @param energy - The total consumption value.
|
|
954
|
+
*/
|
|
955
|
+
getDefaultElectricalEnergyMeasurementClusterServer(energy = 0) {
|
|
956
|
+
return ClusterServer(ElectricalEnergyMeasurementCluster.with(ElectricalEnergyMeasurement.Feature.ImportedEnergy, ElectricalEnergyMeasurement.Feature.ExportedEnergy, ElectricalEnergyMeasurement.Feature.CumulativeEnergy), {
|
|
957
|
+
accuracy: {
|
|
958
|
+
measurementType: MeasurementType.ElectricalEnergy,
|
|
959
|
+
measured: true,
|
|
960
|
+
minMeasuredValue: 0,
|
|
961
|
+
maxMeasuredValue: 0,
|
|
962
|
+
accuracyRanges: [{ rangeMin: 0, rangeMax: 2 ** 62, fixedMax: 10, fixedMin: 10, fixedTypical: 0 }],
|
|
963
|
+
},
|
|
964
|
+
cumulativeEnergyImported: { energy },
|
|
965
|
+
cumulativeEnergyExported: null,
|
|
966
|
+
}, {}, {
|
|
967
|
+
cumulativeEnergyMeasured: true,
|
|
968
|
+
});
|
|
969
|
+
}
|
|
970
|
+
/**
|
|
971
|
+
* Get a default Electrical Power Measurement Cluster Server.
|
|
972
|
+
*
|
|
973
|
+
* @param energy - The total consumption value.
|
|
974
|
+
*/
|
|
975
|
+
getDefaultElectricalPowerMeasurementClusterServer(voltage = 0, current = 0, power = 0) {
|
|
976
|
+
return ClusterServer(ElectricalPowerMeasurementCluster.with(ElectricalPowerMeasurement.Feature.AlternatingCurrent), {
|
|
977
|
+
powerMode: ElectricalPowerMeasurement.PowerMode.Ac,
|
|
978
|
+
numberOfMeasurementTypes: 3,
|
|
979
|
+
accuracy: [
|
|
980
|
+
{
|
|
981
|
+
measurementType: MeasurementType.Voltage,
|
|
982
|
+
measured: true,
|
|
983
|
+
minMeasuredValue: 0,
|
|
984
|
+
maxMeasuredValue: 100,
|
|
985
|
+
accuracyRanges: [{ rangeMin: 0, rangeMax: 2 ** 62, fixedMax: 10, fixedMin: 10, fixedTypical: 0 }],
|
|
986
|
+
},
|
|
987
|
+
{
|
|
988
|
+
measurementType: MeasurementType.ActiveCurrent,
|
|
989
|
+
measured: true,
|
|
990
|
+
minMeasuredValue: 0,
|
|
991
|
+
maxMeasuredValue: 100,
|
|
992
|
+
accuracyRanges: [{ rangeMin: 0, rangeMax: 2 ** 62, fixedMax: 10, fixedMin: 10, fixedTypical: 0 }],
|
|
993
|
+
},
|
|
994
|
+
{
|
|
995
|
+
measurementType: MeasurementType.ActivePower,
|
|
996
|
+
measured: true,
|
|
997
|
+
minMeasuredValue: 0,
|
|
998
|
+
maxMeasuredValue: 100,
|
|
999
|
+
accuracyRanges: [{ rangeMin: 0, rangeMax: 2 ** 62, fixedMax: 10, fixedMin: 10, fixedTypical: 0 }],
|
|
1000
|
+
},
|
|
1001
|
+
],
|
|
1002
|
+
voltage: voltage,
|
|
1003
|
+
activeCurrent: current,
|
|
1004
|
+
activePower: power,
|
|
1005
|
+
}, {}, {});
|
|
1006
|
+
}
|
|
1007
|
+
/**
|
|
1008
|
+
* @deprecated This method is deprecated and will be removed in a future version.
|
|
824
1009
|
* Get a default Electrical Measurement Cluster Server.
|
|
825
1010
|
*
|
|
826
1011
|
* @param voltage - The RMS voltage value.
|
|
@@ -837,6 +1022,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
837
1022
|
}, {}, {});
|
|
838
1023
|
}
|
|
839
1024
|
/**
|
|
1025
|
+
* @deprecated This method is deprecated and will be removed in a future version.
|
|
840
1026
|
* Creates a default Electrical Measurement Cluster Server.
|
|
841
1027
|
*
|
|
842
1028
|
* @param voltage - The RMS voltage value.
|
|
@@ -878,7 +1064,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
878
1064
|
}, {
|
|
879
1065
|
resetCounts: async (data) => {
|
|
880
1066
|
// eslint-disable-next-line no-console
|
|
881
|
-
|
|
1067
|
+
this.log.debug('Matter command: resetCounts');
|
|
882
1068
|
await this.commandHandler.executeHandler('resetCounts', data);
|
|
883
1069
|
},
|
|
884
1070
|
}, {}));
|
|
@@ -894,17 +1080,17 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
894
1080
|
}, {
|
|
895
1081
|
on: async (data) => {
|
|
896
1082
|
// eslint-disable-next-line no-console
|
|
897
|
-
|
|
1083
|
+
this.log.debug('Matter command: on onOff:', data.attributes.onOff.getLocal());
|
|
898
1084
|
await this.commandHandler.executeHandler('on', data);
|
|
899
1085
|
},
|
|
900
1086
|
off: async (data) => {
|
|
901
1087
|
// eslint-disable-next-line no-console
|
|
902
|
-
|
|
1088
|
+
this.log.debug('Matter command: off onOff:', data.attributes.onOff.getLocal());
|
|
903
1089
|
await this.commandHandler.executeHandler('off', data);
|
|
904
1090
|
},
|
|
905
1091
|
toggle: async (data) => {
|
|
906
1092
|
// eslint-disable-next-line no-console
|
|
907
|
-
|
|
1093
|
+
this.log.debug('Matter command: toggle onOff:', data.attributes.onOff.getLocal());
|
|
908
1094
|
await this.commandHandler.executeHandler('toggle', data);
|
|
909
1095
|
},
|
|
910
1096
|
}, {});
|
|
@@ -933,39 +1119,39 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
933
1119
|
}, {
|
|
934
1120
|
moveToLevel: async ({ request, attributes, endpoint }) => {
|
|
935
1121
|
// eslint-disable-next-line no-console
|
|
936
|
-
|
|
1122
|
+
this.log.debug('Matter command: moveToLevel request:', request, 'attributes.currentLevel:', attributes.currentLevel.getLocal());
|
|
937
1123
|
// attributes.currentLevel.setLocal(request.level);
|
|
938
1124
|
await this.commandHandler.executeHandler('moveToLevel', { request: request, attributes: attributes, endpoint: endpoint });
|
|
939
1125
|
},
|
|
940
1126
|
move: async () => {
|
|
941
1127
|
// eslint-disable-next-line no-console
|
|
942
|
-
|
|
1128
|
+
this.log.error('Matter command: move not implemented');
|
|
943
1129
|
},
|
|
944
1130
|
step: async () => {
|
|
945
1131
|
// eslint-disable-next-line no-console
|
|
946
|
-
|
|
1132
|
+
this.log.error('Matter command: step not implemented');
|
|
947
1133
|
},
|
|
948
1134
|
stop: async () => {
|
|
949
1135
|
// eslint-disable-next-line no-console
|
|
950
|
-
|
|
1136
|
+
this.log.error('Matter command: stop not implemented');
|
|
951
1137
|
},
|
|
952
1138
|
moveToLevelWithOnOff: async ({ request, attributes, endpoint }) => {
|
|
953
1139
|
// eslint-disable-next-line no-console
|
|
954
|
-
|
|
1140
|
+
this.log.debug('Matter command: moveToLevelWithOnOff request:', request, 'attributes.currentLevel:', attributes.currentLevel.getLocal());
|
|
955
1141
|
// attributes.currentLevel.setLocal(request.level);
|
|
956
1142
|
await this.commandHandler.executeHandler('moveToLevelWithOnOff', { request: request, attributes: attributes, endpoint: endpoint });
|
|
957
1143
|
},
|
|
958
1144
|
moveWithOnOff: async () => {
|
|
959
1145
|
// eslint-disable-next-line no-console
|
|
960
|
-
|
|
1146
|
+
this.log.error('Matter command: moveWithOnOff not implemented');
|
|
961
1147
|
},
|
|
962
1148
|
stepWithOnOff: async () => {
|
|
963
1149
|
// eslint-disable-next-line no-console
|
|
964
|
-
|
|
1150
|
+
this.log.error('Matter command: stepWithOnOff not implemented');
|
|
965
1151
|
},
|
|
966
1152
|
stopWithOnOff: async () => {
|
|
967
1153
|
// eslint-disable-next-line no-console
|
|
968
|
-
|
|
1154
|
+
this.log.error('Matter command: stopWithOnOff not implemented');
|
|
969
1155
|
},
|
|
970
1156
|
});
|
|
971
1157
|
}
|
|
@@ -1003,56 +1189,56 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
1003
1189
|
}, {
|
|
1004
1190
|
moveToHue: async ({ request: request, attributes: attributes }) => {
|
|
1005
1191
|
// eslint-disable-next-line no-console
|
|
1006
|
-
|
|
1192
|
+
this.log.debug('Matter command: moveToHue request:', request, 'attributes.currentHue:', attributes.currentHue.getLocal());
|
|
1007
1193
|
// attributes.currentHue.setLocal(request.hue);
|
|
1008
1194
|
this.commandHandler.executeHandler('moveToHue', { request: request, attributes: attributes });
|
|
1009
1195
|
},
|
|
1010
1196
|
moveHue: async () => {
|
|
1011
1197
|
// eslint-disable-next-line no-console
|
|
1012
|
-
|
|
1198
|
+
this.log.error('Matter command: moveHue not implemented');
|
|
1013
1199
|
},
|
|
1014
1200
|
stepHue: async () => {
|
|
1015
1201
|
// eslint-disable-next-line no-console
|
|
1016
|
-
|
|
1202
|
+
this.log.error('Matter command: stepHue not implemented');
|
|
1017
1203
|
},
|
|
1018
1204
|
moveToSaturation: async ({ request: request, attributes: attributes }) => {
|
|
1019
1205
|
// eslint-disable-next-line no-console
|
|
1020
|
-
|
|
1206
|
+
this.log.debug('Matter command: moveToSaturation request:', request, 'attributes.currentSaturation:', attributes.currentSaturation.getLocal());
|
|
1021
1207
|
// attributes.currentSaturation.setLocal(request.saturation);
|
|
1022
1208
|
this.commandHandler.executeHandler('moveToSaturation', { request: request, attributes: attributes });
|
|
1023
1209
|
},
|
|
1024
1210
|
moveSaturation: async () => {
|
|
1025
1211
|
// eslint-disable-next-line no-console
|
|
1026
|
-
|
|
1212
|
+
this.log.error('Matter command: moveSaturation not implemented');
|
|
1027
1213
|
},
|
|
1028
1214
|
stepSaturation: async () => {
|
|
1029
1215
|
// eslint-disable-next-line no-console
|
|
1030
|
-
|
|
1216
|
+
this.log.error('Matter command: stepSaturation not implemented');
|
|
1031
1217
|
},
|
|
1032
1218
|
moveToHueAndSaturation: async ({ request: request, attributes: attributes }) => {
|
|
1033
1219
|
// eslint-disable-next-line no-console
|
|
1034
|
-
|
|
1220
|
+
this.log.debug('Matter command: moveToHueAndSaturation request:', request, 'attributes.currentHue:', attributes.currentHue.getLocal(), 'attributes.currentSaturation:', attributes.currentSaturation.getLocal());
|
|
1035
1221
|
// attributes.currentHue.setLocal(request.hue);
|
|
1036
1222
|
// attributes.currentSaturation.setLocal(request.saturation);
|
|
1037
1223
|
this.commandHandler.executeHandler('moveToHueAndSaturation', { request: request, attributes: attributes });
|
|
1038
1224
|
},
|
|
1039
1225
|
stopMoveStep: async () => {
|
|
1040
1226
|
// eslint-disable-next-line no-console
|
|
1041
|
-
|
|
1227
|
+
this.log.error('Matter command: stopMoveStep not implemented');
|
|
1042
1228
|
},
|
|
1043
1229
|
moveToColorTemperature: async ({ request: request, attributes: attributes }) => {
|
|
1044
1230
|
// eslint-disable-next-line no-console
|
|
1045
|
-
|
|
1231
|
+
this.log.debug('Matter command: moveToColorTemperature request:', request, 'attributes.colorTemperatureMireds:', attributes.colorTemperatureMireds.getLocal());
|
|
1046
1232
|
// attributes.colorTemperatureMireds.setLocal(request.colorTemperatureMireds);
|
|
1047
1233
|
this.commandHandler.executeHandler('moveToColorTemperature', { request: request, attributes: attributes });
|
|
1048
1234
|
},
|
|
1049
1235
|
moveColorTemperature: async () => {
|
|
1050
1236
|
// eslint-disable-next-line no-console
|
|
1051
|
-
|
|
1237
|
+
this.log.error('Matter command: moveColorTemperature not implemented');
|
|
1052
1238
|
},
|
|
1053
1239
|
stepColorTemperature: async () => {
|
|
1054
1240
|
// eslint-disable-next-line no-console
|
|
1055
|
-
|
|
1241
|
+
this.log.error('Matter command: stepColorTemperature not implemented');
|
|
1056
1242
|
},
|
|
1057
1243
|
}, {});
|
|
1058
1244
|
}
|
|
@@ -1095,22 +1281,22 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
1095
1281
|
}, {
|
|
1096
1282
|
upOrOpen: async (data) => {
|
|
1097
1283
|
// eslint-disable-next-line no-console
|
|
1098
|
-
|
|
1284
|
+
this.log.debug('Matter command: upOrOpen');
|
|
1099
1285
|
await this.commandHandler.executeHandler('upOrOpen', data);
|
|
1100
1286
|
},
|
|
1101
1287
|
downOrClose: async (data) => {
|
|
1102
1288
|
// eslint-disable-next-line no-console
|
|
1103
|
-
|
|
1289
|
+
this.log.debug('Matter command: downOrClose');
|
|
1104
1290
|
await this.commandHandler.executeHandler('downOrClose', data);
|
|
1105
1291
|
},
|
|
1106
1292
|
stopMotion: async (data) => {
|
|
1107
1293
|
// eslint-disable-next-line no-console
|
|
1108
|
-
|
|
1294
|
+
this.log.debug('Matter command: stopMotion');
|
|
1109
1295
|
await this.commandHandler.executeHandler('stopMotion', data);
|
|
1110
1296
|
},
|
|
1111
1297
|
goToLiftPercentage: async (data) => {
|
|
1112
1298
|
// eslint-disable-next-line no-console
|
|
1113
|
-
|
|
1299
|
+
this.log.debug(`Matter command: goToLiftPercentage: ${data.request.liftPercent100thsValue} current: ${data.attributes.currentPositionLiftPercent100ths?.getLocal()} ` +
|
|
1114
1300
|
`target: ${data.attributes.targetPositionLiftPercent100ths?.getLocal()} status: ${data.attributes.operationalStatus.getLocal().lift}`);
|
|
1115
1301
|
await this.commandHandler.executeHandler('goToLiftPercentage', data);
|
|
1116
1302
|
},
|
|
@@ -1229,12 +1415,12 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
1229
1415
|
}, {
|
|
1230
1416
|
lockDoor: async (data) => {
|
|
1231
1417
|
// eslint-disable-next-line no-console
|
|
1232
|
-
|
|
1418
|
+
this.log.debug('Matter command: lockDoor', data.request);
|
|
1233
1419
|
await this.commandHandler.executeHandler('lockDoor', data);
|
|
1234
1420
|
},
|
|
1235
1421
|
unlockDoor: async (data) => {
|
|
1236
1422
|
// eslint-disable-next-line no-console
|
|
1237
|
-
|
|
1423
|
+
this.log.debug('Matter command: unlockDoor', data.request);
|
|
1238
1424
|
await this.commandHandler.executeHandler('unlockDoor', data);
|
|
1239
1425
|
},
|
|
1240
1426
|
}, {
|
|
@@ -1294,7 +1480,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
1294
1480
|
}, {
|
|
1295
1481
|
changeToMode: async (data) => {
|
|
1296
1482
|
// eslint-disable-next-line no-console
|
|
1297
|
-
|
|
1483
|
+
this.log.debug('Matter command: changeToMode', data.request);
|
|
1298
1484
|
await this.commandHandler.executeHandler('changeToMode', data);
|
|
1299
1485
|
},
|
|
1300
1486
|
});
|
|
@@ -1446,13 +1632,47 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
1446
1632
|
});
|
|
1447
1633
|
}
|
|
1448
1634
|
/**
|
|
1449
|
-
* Creates a default boolean state cluster server.
|
|
1635
|
+
* Creates a default boolean state configuration cluster server.
|
|
1450
1636
|
*
|
|
1451
1637
|
* @param contact - Optional boolean value indicating the contact state. Defaults to `true` if not provided.
|
|
1452
1638
|
*/
|
|
1453
1639
|
createDefaultBooleanStateClusterServer(contact) {
|
|
1454
1640
|
this.addClusterServer(this.getDefaultBooleanStateClusterServer(contact));
|
|
1455
1641
|
}
|
|
1642
|
+
/**
|
|
1643
|
+
* Get a default boolean state configuration cluster server.
|
|
1644
|
+
*
|
|
1645
|
+
* @param contact - Optional boolean value indicating the sensor fault state. Defaults to `false` if not provided.
|
|
1646
|
+
*/
|
|
1647
|
+
getDefaultBooleanStateConfigurationClusterServer(sensorFault = false) {
|
|
1648
|
+
return ClusterServer(BooleanStateConfigurationCluster.with(BooleanStateConfiguration.Feature.Visual, BooleanStateConfiguration.Feature.Audible, BooleanStateConfiguration.Feature.SensitivityLevel), {
|
|
1649
|
+
currentSensitivityLevel: 0,
|
|
1650
|
+
supportedSensitivityLevels: 2,
|
|
1651
|
+
defaultSensitivityLevel: 0,
|
|
1652
|
+
alarmsActive: { visual: false, audible: false },
|
|
1653
|
+
alarmsEnabled: { visual: false, audible: false },
|
|
1654
|
+
alarmsSupported: { visual: true, audible: true },
|
|
1655
|
+
// alarmsSuppressed: { visual: false, audible: false },
|
|
1656
|
+
sensorFault: { generalFault: sensorFault },
|
|
1657
|
+
}, {
|
|
1658
|
+
enableDisableAlarm: async ({ request, attributes }) => {
|
|
1659
|
+
// eslint-disable-next-line no-console
|
|
1660
|
+
this.log.debug('Matter command: enableDisableAlarm', request);
|
|
1661
|
+
await this.commandHandler.executeHandler('enableDisableAlarm', { request, attributes });
|
|
1662
|
+
},
|
|
1663
|
+
}, {
|
|
1664
|
+
alarmsStateChanged: true,
|
|
1665
|
+
sensorFault: true,
|
|
1666
|
+
});
|
|
1667
|
+
}
|
|
1668
|
+
/**
|
|
1669
|
+
* Creates a default boolean state configuration cluster server.
|
|
1670
|
+
*
|
|
1671
|
+
* @param contact - Optional boolean value indicating the sensor fault state. Defaults to `false` if not provided.
|
|
1672
|
+
*/
|
|
1673
|
+
createDefaultBooleanStateConfigurationClusterServer(sensorFault = false) {
|
|
1674
|
+
this.addClusterServer(this.getDefaultBooleanStateConfigurationClusterServer(sensorFault));
|
|
1675
|
+
}
|
|
1456
1676
|
/**
|
|
1457
1677
|
* Get a default power source replaceable battery cluster server.
|
|
1458
1678
|
*
|
|
@@ -1544,14 +1764,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
1544
1764
|
this.addClusterServer(this.getDefaultPowerSourceWiredClusterServer(wiredCurrentType));
|
|
1545
1765
|
}
|
|
1546
1766
|
/**
|
|
1547
|
-
*
|
|
1548
|
-
*
|
|
1549
|
-
* @remarks
|
|
1550
|
-
* The endpoint at this time is only known for Accessory Platforms.
|
|
1551
|
-
* Don't use it in Dynamic Platforms.
|
|
1552
|
-
*
|
|
1553
|
-
*
|
|
1554
|
-
* @param endpointNumber - The endpoint number where to find the PowerSourceCluster.
|
|
1767
|
+
* @deprecated This function is deprecated by Matter 1.3 spec and will be removed in a future version.
|
|
1555
1768
|
*/
|
|
1556
1769
|
createDefaultPowerSourceConfigurationClusterServer(endpointNumber) {
|
|
1557
1770
|
this.addClusterServer(ClusterServer(PowerSourceConfigurationCluster, {
|
|
@@ -1624,7 +1837,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
1624
1837
|
}, {
|
|
1625
1838
|
setpointRaiseLower: async ({ request, attributes }) => {
|
|
1626
1839
|
// eslint-disable-next-line no-console
|
|
1627
|
-
|
|
1840
|
+
this.log.debug('Matter command: setpointRaiseLower', request);
|
|
1628
1841
|
await this.commandHandler.executeHandler('setpointRaiseLower', { request, attributes });
|
|
1629
1842
|
},
|
|
1630
1843
|
}, {});
|
|
@@ -1641,7 +1854,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
1641
1854
|
this.addClusterServer(this.getDefaultThermostatClusterServer(localTemperature, occupiedHeatingSetpoint, occupiedCoolingSetpoint, minSetpointDeadBand));
|
|
1642
1855
|
}
|
|
1643
1856
|
/**
|
|
1644
|
-
* Get a default time sync cluster server. Only needed to create a thermostat.
|
|
1857
|
+
* Get a default dummy time sync cluster server. Only needed to create a thermostat.
|
|
1645
1858
|
*/
|
|
1646
1859
|
getDefaultTimeSyncClusterServer() {
|
|
1647
1860
|
return ClusterServer(TimeSyncCluster.with(TimeSync.Feature.TimeZone), {
|
|
@@ -1654,8 +1867,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
1654
1867
|
timeZoneDatabase: true,
|
|
1655
1868
|
}, {
|
|
1656
1869
|
setUtcTime: async ({ request, attributes }) => {
|
|
1657
|
-
|
|
1658
|
-
console.log('setUtcTime', request);
|
|
1870
|
+
this.log.debug('Matter command: setUtcTime', request);
|
|
1659
1871
|
await this.commandHandler.executeHandler('setUtcTime', { request, attributes });
|
|
1660
1872
|
},
|
|
1661
1873
|
}, {
|
|
@@ -1665,10 +1877,154 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
|
|
|
1665
1877
|
});
|
|
1666
1878
|
}
|
|
1667
1879
|
/**
|
|
1668
|
-
* Creates a default time sync cluster server. Only needed to create a thermostat.
|
|
1880
|
+
* Creates a default dummy time sync cluster server. Only needed to create a thermostat.
|
|
1669
1881
|
*/
|
|
1670
1882
|
createDefaultTimeSyncClusterServer() {
|
|
1671
1883
|
this.addClusterServer(this.getDefaultTimeSyncClusterServer());
|
|
1672
1884
|
}
|
|
1885
|
+
/**
|
|
1886
|
+
* Returns the default SmokeCOAlarmClusterServer.
|
|
1887
|
+
*
|
|
1888
|
+
* @param smokeState - The state of the smoke alarm. Defaults to SmokeCoAlarm.AlarmState.Normal.
|
|
1889
|
+
* @param coState - The state of the CO alarm. Defaults to SmokeCoAlarm.AlarmState.Normal.
|
|
1890
|
+
* @returns The default SmokeCOAlarmClusterServer.
|
|
1891
|
+
*/
|
|
1892
|
+
getDefaultSmokeCOAlarmClusterServer(smokeState = SmokeCoAlarm.AlarmState.Normal, coState = SmokeCoAlarm.AlarmState.Normal) {
|
|
1893
|
+
return ClusterServer(SmokeCoAlarmCluster.with(SmokeCoAlarm.Feature.SmokeAlarm, SmokeCoAlarm.Feature.CoAlarm), {
|
|
1894
|
+
smokeState,
|
|
1895
|
+
coState,
|
|
1896
|
+
expressedState: SmokeCoAlarm.ExpressedState.Normal,
|
|
1897
|
+
batteryAlert: SmokeCoAlarm.AlarmState.Normal,
|
|
1898
|
+
deviceMuted: SmokeCoAlarm.MuteState.NotMuted,
|
|
1899
|
+
testInProgress: false,
|
|
1900
|
+
hardwareFaultAlert: false,
|
|
1901
|
+
endOfServiceAlert: SmokeCoAlarm.EndOfService.Normal,
|
|
1902
|
+
interconnectSmokeAlarm: SmokeCoAlarm.AlarmState.Normal,
|
|
1903
|
+
interconnectCoAlarm: SmokeCoAlarm.AlarmState.Normal,
|
|
1904
|
+
}, {
|
|
1905
|
+
selfTestRequest: async ({ request, attributes }) => {
|
|
1906
|
+
this.log.debug('Matter command: selfTestRequest');
|
|
1907
|
+
await this.commandHandler.executeHandler('selfTestRequest', { request, attributes });
|
|
1908
|
+
},
|
|
1909
|
+
}, {
|
|
1910
|
+
smokeAlarm: true,
|
|
1911
|
+
interconnectSmokeAlarm: true,
|
|
1912
|
+
coAlarm: true,
|
|
1913
|
+
interconnectCoAlarm: true,
|
|
1914
|
+
lowBattery: true,
|
|
1915
|
+
hardwareFault: true,
|
|
1916
|
+
endOfService: true,
|
|
1917
|
+
selfTestComplete: true,
|
|
1918
|
+
alarmMuted: true,
|
|
1919
|
+
muteEnded: true,
|
|
1920
|
+
allClear: true,
|
|
1921
|
+
});
|
|
1922
|
+
}
|
|
1923
|
+
/**
|
|
1924
|
+
* Create the default SmokeCOAlarmClusterServer.
|
|
1925
|
+
*
|
|
1926
|
+
* @param smokeState - The state of the smoke alarm. Defaults to SmokeCoAlarm.AlarmState.Normal.
|
|
1927
|
+
* @param coState - The state of the CO alarm. Defaults to SmokeCoAlarm.AlarmState.Normal.
|
|
1928
|
+
* @returns The default SmokeCOAlarmClusterServer.
|
|
1929
|
+
*/
|
|
1930
|
+
createDefaultSmokeCOAlarmClusterServer(smokeState = SmokeCoAlarm.AlarmState.Normal, coState = SmokeCoAlarm.AlarmState.Normal) {
|
|
1931
|
+
this.addClusterServer(this.getDefaultSmokeCOAlarmClusterServer(smokeState, coState));
|
|
1932
|
+
}
|
|
1933
|
+
/**
|
|
1934
|
+
* Returns the default Carbon Monoxide Concentration Measurement Cluster Server.
|
|
1935
|
+
*
|
|
1936
|
+
* @param {number} measuredValue - The measured value of the concentration.
|
|
1937
|
+
* @param {ConcentrationMeasurement.MeasurementUnit} measurementUnit - The unit of measurement.
|
|
1938
|
+
* @param {ConcentrationMeasurement.MeasurementMedium} measurementMedium - The medium of measurement.
|
|
1939
|
+
* @returns {ClusterServer} - The default Carbon Monoxide Concentration Measurement Cluster Server.
|
|
1940
|
+
*/
|
|
1941
|
+
getDefaultCarbonMonoxideConcentrationMeasurementClusterServer(measuredValue = 0, measurementUnit = ConcentrationMeasurement.MeasurementUnit.Ppm, measurementMedium = ConcentrationMeasurement.MeasurementMedium.Air) {
|
|
1942
|
+
return ClusterServer(CarbonMonoxideConcentrationMeasurementCluster.with('NumericMeasurement'), {
|
|
1943
|
+
measuredValue,
|
|
1944
|
+
minMeasuredValue: null,
|
|
1945
|
+
maxMeasuredValue: null,
|
|
1946
|
+
uncertainty: 0,
|
|
1947
|
+
measurementUnit,
|
|
1948
|
+
measurementMedium,
|
|
1949
|
+
}, {}, {});
|
|
1950
|
+
}
|
|
1951
|
+
/**
|
|
1952
|
+
* Create the default Carbon Monoxide Concentration Measurement Cluster Server.
|
|
1953
|
+
*
|
|
1954
|
+
* @param {number} measuredValue - The measured value of the concentration.
|
|
1955
|
+
* @param {ConcentrationMeasurement.MeasurementUnit} measurementUnit - The unit of measurement.
|
|
1956
|
+
* @param {ConcentrationMeasurement.MeasurementMedium} measurementMedium - The medium of measurement.
|
|
1957
|
+
*/
|
|
1958
|
+
createDefaultCarbonMonoxideConcentrationMeasurementClusterServer(measuredValue = 0, measurementUnit = ConcentrationMeasurement.MeasurementUnit.Ppm, measurementMedium = ConcentrationMeasurement.MeasurementMedium.Air) {
|
|
1959
|
+
this.addClusterServer(this.getDefaultCarbonMonoxideConcentrationMeasurementClusterServer(measuredValue, measurementUnit, measurementMedium));
|
|
1960
|
+
}
|
|
1961
|
+
/**
|
|
1962
|
+
* Returns the default fan control cluster server rev 2.
|
|
1963
|
+
*
|
|
1964
|
+
* @param fanMode The fan mode to set. Defaults to `FanControl.FanMode.Off`.
|
|
1965
|
+
* @returns The default fan control cluster server.
|
|
1966
|
+
*/
|
|
1967
|
+
getDefaultFanControlClusterServer(fanMode = FanControl.FanMode.Off) {
|
|
1968
|
+
return ClusterServer(FanControlCluster.with(FanControl.Feature.MultiSpeed, FanControl.Feature.Auto /* , FanControl.Feature.Step*/), {
|
|
1969
|
+
fanMode,
|
|
1970
|
+
fanModeSequence: FanControl.FanModeSequence.OffLowMedHighAuto,
|
|
1971
|
+
percentSetting: 0,
|
|
1972
|
+
percentCurrent: 0,
|
|
1973
|
+
speedMax: 100,
|
|
1974
|
+
speedSetting: 0,
|
|
1975
|
+
speedCurrent: 0,
|
|
1976
|
+
}, {
|
|
1977
|
+
/*
|
|
1978
|
+
step: async ({ request, attributes }) => {
|
|
1979
|
+
this.log.debug('Matter command: step', request);
|
|
1980
|
+
await this.commandHandler.executeHandler('step', { request, attributes });
|
|
1981
|
+
},
|
|
1982
|
+
*/
|
|
1983
|
+
}, {});
|
|
1984
|
+
}
|
|
1985
|
+
/**
|
|
1986
|
+
* Create the default fan control cluster server rev 2.
|
|
1987
|
+
*
|
|
1988
|
+
* @param fanMode The fan mode to set. Defaults to `FanControl.FanMode.Off`.
|
|
1989
|
+
* @returns The default fan control cluster server.
|
|
1990
|
+
*/
|
|
1991
|
+
createDefaultFanControlClusterServer(fanMode = FanControl.FanMode.Off) {
|
|
1992
|
+
this.addClusterServer(this.getDefaultFanControlClusterServer(fanMode));
|
|
1993
|
+
}
|
|
1994
|
+
// NOTE Support of Device Energy Management Cluster is provisional.
|
|
1995
|
+
getDefaultDeviceEnergyManagementClusterServer() {
|
|
1996
|
+
return ClusterServer(DeviceEnergyManagementCluster.with(DeviceEnergyManagement.Feature.Pausable, DeviceEnergyManagement.Feature.PowerForecastReporting, DeviceEnergyManagement.Feature.StateForecastReporting), {
|
|
1997
|
+
esaType: DeviceEnergyManagement.EsaType.Other,
|
|
1998
|
+
esaCanGenerate: false,
|
|
1999
|
+
esaState: DeviceEnergyManagement.EsaState.Online,
|
|
2000
|
+
absMinPower: 0,
|
|
2001
|
+
absMaxPower: 0,
|
|
2002
|
+
optOutState: DeviceEnergyManagement.OptOutState.NoOptOut,
|
|
2003
|
+
forecast: null,
|
|
2004
|
+
}, {
|
|
2005
|
+
pauseRequest: async ({ request, attributes }) => {
|
|
2006
|
+
this.log.debug('Matter command: pauseRequest', request);
|
|
2007
|
+
await this.commandHandler.executeHandler('pauseRequest', { request, attributes });
|
|
2008
|
+
},
|
|
2009
|
+
resumeRequest: async () => {
|
|
2010
|
+
this.log.debug('Matter command: resumeRequest');
|
|
2011
|
+
await this.commandHandler.executeHandler('resumeRequest');
|
|
2012
|
+
},
|
|
2013
|
+
}, {
|
|
2014
|
+
paused: true,
|
|
2015
|
+
resumed: true,
|
|
2016
|
+
});
|
|
2017
|
+
}
|
|
2018
|
+
// NOTE Support of Device Energy Management Mode Cluster is provisional.
|
|
2019
|
+
getDefaultDeviceEnergyManagementModeClusterServer() {
|
|
2020
|
+
return ClusterServer(DeviceEnergyManagementModeCluster, {
|
|
2021
|
+
esaType: DeviceEnergyManagement.EsaType.Other,
|
|
2022
|
+
esaCanGenerate: false,
|
|
2023
|
+
esaState: DeviceEnergyManagement.EsaState.Online,
|
|
2024
|
+
absMinPower: 0,
|
|
2025
|
+
absMaxPower: 0,
|
|
2026
|
+
optOutState: DeviceEnergyManagement.OptOutState.NoOptOut,
|
|
2027
|
+
}, {}, {});
|
|
2028
|
+
}
|
|
1673
2029
|
}
|
|
1674
2030
|
//# sourceMappingURL=matterbridgeDevice.js.map
|