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.
Files changed (101) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +48 -9
  3. package/dist/cluster/AirQualityCluster.d.ts.map +1 -0
  4. package/dist/cluster/AirQualityCluster.js.map +1 -0
  5. package/dist/cluster/BooleanStateConfigurationCluster.d.ts +2200 -0
  6. package/dist/cluster/BooleanStateConfigurationCluster.d.ts.map +1 -0
  7. package/dist/cluster/BooleanStateConfigurationCluster.js +388 -0
  8. package/dist/cluster/BooleanStateConfigurationCluster.js.map +1 -0
  9. package/dist/cluster/BridgedDeviceBasicInformationCluster.d.ts.map +1 -0
  10. package/dist/cluster/BridgedDeviceBasicInformationCluster.js.map +1 -0
  11. package/dist/cluster/CarbonMonoxideConcentrationMeasurementCluster.d.ts +396 -0
  12. package/dist/cluster/CarbonMonoxideConcentrationMeasurementCluster.d.ts.map +1 -0
  13. package/dist/cluster/CarbonMonoxideConcentrationMeasurementCluster.js +30 -0
  14. package/dist/cluster/CarbonMonoxideConcentrationMeasurementCluster.js.map +1 -0
  15. package/dist/cluster/ConcentrationMeasurementCluster.d.ts +524 -0
  16. package/dist/cluster/ConcentrationMeasurementCluster.d.ts.map +1 -0
  17. package/dist/cluster/ConcentrationMeasurementCluster.js +282 -0
  18. package/dist/cluster/ConcentrationMeasurementCluster.js.map +1 -0
  19. package/dist/cluster/DeviceEnergyManagementCluster.d.ts +7851 -0
  20. package/dist/cluster/DeviceEnergyManagementCluster.d.ts.map +1 -0
  21. package/dist/cluster/DeviceEnergyManagementCluster.js +1634 -0
  22. package/dist/cluster/DeviceEnergyManagementCluster.js.map +1 -0
  23. package/dist/cluster/DeviceEnergyManagementModeCluster.d.ts +68 -0
  24. package/dist/cluster/DeviceEnergyManagementModeCluster.d.ts.map +1 -0
  25. package/dist/cluster/DeviceEnergyManagementModeCluster.js +49 -0
  26. package/dist/cluster/DeviceEnergyManagementModeCluster.js.map +1 -0
  27. package/dist/cluster/ElectricalEnergyMeasurementCluster.d.ts +4978 -0
  28. package/dist/cluster/ElectricalEnergyMeasurementCluster.d.ts.map +1 -0
  29. package/dist/cluster/ElectricalEnergyMeasurementCluster.js +510 -0
  30. package/dist/cluster/ElectricalEnergyMeasurementCluster.js.map +1 -0
  31. package/dist/cluster/ElectricalPowerMeasurementCluster.d.ts +3250 -0
  32. package/dist/cluster/ElectricalPowerMeasurementCluster.d.ts.map +1 -0
  33. package/dist/cluster/ElectricalPowerMeasurementCluster.js +675 -0
  34. package/dist/cluster/ElectricalPowerMeasurementCluster.js.map +1 -0
  35. package/dist/cluster/FanControlCluster.d.ts +1583 -0
  36. package/dist/cluster/FanControlCluster.d.ts.map +1 -0
  37. package/dist/cluster/FanControlCluster.js +492 -0
  38. package/dist/cluster/FanControlCluster.js.map +1 -0
  39. package/dist/cluster/MeasurementAccuracy.d.ts +63 -0
  40. package/dist/cluster/MeasurementAccuracy.d.ts.map +1 -0
  41. package/dist/cluster/MeasurementAccuracy.js +47 -0
  42. package/dist/cluster/MeasurementAccuracy.js.map +1 -0
  43. package/dist/cluster/MeasurementAccuracyRange.d.ts +134 -0
  44. package/dist/cluster/MeasurementAccuracyRange.d.ts.map +1 -0
  45. package/dist/cluster/MeasurementAccuracyRange.js +103 -0
  46. package/dist/cluster/MeasurementAccuracyRange.js.map +1 -0
  47. package/dist/cluster/MeasurementType.d.ts +68 -0
  48. package/dist/cluster/MeasurementType.d.ts.map +1 -0
  49. package/dist/cluster/MeasurementType.js +69 -0
  50. package/dist/cluster/MeasurementType.js.map +1 -0
  51. package/dist/cluster/PowerTopologyCluster.d.ts +355 -0
  52. package/dist/cluster/PowerTopologyCluster.d.ts.map +1 -0
  53. package/dist/cluster/PowerTopologyCluster.js +138 -0
  54. package/dist/cluster/PowerTopologyCluster.js.map +1 -0
  55. package/dist/cluster/SmokeCoAlarmCluster.d.ts +1599 -0
  56. package/dist/cluster/SmokeCoAlarmCluster.d.ts.map +1 -0
  57. package/dist/cluster/SmokeCoAlarmCluster.js +603 -0
  58. package/dist/cluster/SmokeCoAlarmCluster.js.map +1 -0
  59. package/dist/cluster/TvocCluster.d.ts.map +1 -0
  60. package/dist/cluster/TvocCluster.js.map +1 -0
  61. package/dist/defaultConfigSchema.d.ts.map +1 -1
  62. package/dist/defaultConfigSchema.js +26 -12
  63. package/dist/defaultConfigSchema.js.map +1 -1
  64. package/dist/index.d.ts +7 -2
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +8 -2
  67. package/dist/index.js.map +1 -1
  68. package/dist/matterbridge.d.ts +63 -1
  69. package/dist/matterbridge.d.ts.map +1 -1
  70. package/dist/matterbridge.js +72 -26
  71. package/dist/matterbridge.js.map +1 -1
  72. package/dist/matterbridgeDevice.d.ts +692 -30
  73. package/dist/matterbridgeDevice.d.ts.map +1 -1
  74. package/dist/matterbridgeDevice.js +429 -73
  75. package/dist/matterbridgeDevice.js.map +1 -1
  76. package/dist/matterbridgeDeviceV8.d.ts +3 -5
  77. package/dist/matterbridgeDeviceV8.d.ts.map +1 -1
  78. package/dist/matterbridgeDeviceV8.js +62 -14
  79. package/dist/matterbridgeDeviceV8.js.map +1 -1
  80. package/dist/matterbridgeV8.d.ts +69 -5
  81. package/dist/matterbridgeV8.d.ts.map +1 -1
  82. package/dist/matterbridgeV8.js +413 -99
  83. package/dist/matterbridgeV8.js.map +1 -1
  84. package/frontend/build/asset-manifest.json +3 -3
  85. package/frontend/build/index.html +1 -1
  86. package/frontend/build/static/js/{main.23829a0f.js → main.cbfc6c9b.js} +3 -3
  87. package/frontend/build/static/js/{main.23829a0f.js.map → main.cbfc6c9b.js.map} +1 -1
  88. package/package.json +6 -6
  89. package/dist/AirQualityCluster.d.ts.map +0 -1
  90. package/dist/AirQualityCluster.js.map +0 -1
  91. package/dist/BridgedDeviceBasicInformationCluster.d.ts.map +0 -1
  92. package/dist/BridgedDeviceBasicInformationCluster.js.map +0 -1
  93. package/dist/TvocCluster.d.ts.map +0 -1
  94. package/dist/TvocCluster.js.map +0 -1
  95. /package/dist/{AirQualityCluster.d.ts → cluster/AirQualityCluster.d.ts} +0 -0
  96. /package/dist/{AirQualityCluster.js → cluster/AirQualityCluster.js} +0 -0
  97. /package/dist/{BridgedDeviceBasicInformationCluster.d.ts → cluster/BridgedDeviceBasicInformationCluster.d.ts} +0 -0
  98. /package/dist/{BridgedDeviceBasicInformationCluster.js → cluster/BridgedDeviceBasicInformationCluster.js} +0 -0
  99. /package/dist/{TvocCluster.d.ts → cluster/TvocCluster.d.ts} +0 -0
  100. /package/dist/{TvocCluster.js → cluster/TvocCluster.js} +0 -0
  101. /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
- // Custom device types
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-powersource',
102
+ name: 'MA-powerSource',
36
103
  code: 0x0011,
37
- deviceClass: DeviceClasses.Simple,
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.Simple,
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
- * Represents a Matterbridge device.
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: true });
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 type with cluster server.
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('addChildDeviceTypeWithClusterServer:');
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
- // eslint-disable-next-line no-console
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
- console.log('resetCounts');
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
- console.log('on onOff:', data.attributes.onOff.getLocal());
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
- console.log('off onOff:', data.attributes.onOff.getLocal());
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
- console.log('toggle onOff:', data.attributes.onOff.getLocal());
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
- console.log('moveToLevel request:', request, 'attributes.currentLevel:', attributes.currentLevel.getLocal());
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
- console.error('Not implemented');
1128
+ this.log.error('Matter command: move not implemented');
943
1129
  },
944
1130
  step: async () => {
945
1131
  // eslint-disable-next-line no-console
946
- console.error('Not implemented');
1132
+ this.log.error('Matter command: step not implemented');
947
1133
  },
948
1134
  stop: async () => {
949
1135
  // eslint-disable-next-line no-console
950
- console.error('Not implemented');
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
- console.log('moveToLevelWithOnOff request:', request, 'attributes.currentLevel:', attributes.currentLevel.getLocal());
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
- console.error('Not implemented');
1146
+ this.log.error('Matter command: moveWithOnOff not implemented');
961
1147
  },
962
1148
  stepWithOnOff: async () => {
963
1149
  // eslint-disable-next-line no-console
964
- console.error('Not implemented');
1150
+ this.log.error('Matter command: stepWithOnOff not implemented');
965
1151
  },
966
1152
  stopWithOnOff: async () => {
967
1153
  // eslint-disable-next-line no-console
968
- console.error('Not implemented');
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
- console.log('Command moveToHue request:', request, 'attributes.currentHue:', attributes.currentHue.getLocal());
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
- console.error('Not implemented');
1198
+ this.log.error('Matter command: moveHue not implemented');
1013
1199
  },
1014
1200
  stepHue: async () => {
1015
1201
  // eslint-disable-next-line no-console
1016
- console.error('Not implemented');
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
- console.log('Command moveToSaturation request:', request, 'attributes.currentSaturation:', attributes.currentSaturation.getLocal());
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
- console.error('Not implemented');
1212
+ this.log.error('Matter command: moveSaturation not implemented');
1027
1213
  },
1028
1214
  stepSaturation: async () => {
1029
1215
  // eslint-disable-next-line no-console
1030
- console.error('Not implemented');
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
- console.log('Command moveToHueAndSaturation request:', request, 'attributes.currentHue:', attributes.currentHue.getLocal(), 'attributes.currentSaturation:', attributes.currentSaturation.getLocal());
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
- console.error('Not implemented');
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
- console.log('Command moveToColorTemperature request:', request, 'attributes.colorTemperatureMireds:', attributes.colorTemperatureMireds.getLocal());
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
- console.error('Not implemented');
1237
+ this.log.error('Matter command: moveColorTemperature not implemented');
1052
1238
  },
1053
1239
  stepColorTemperature: async () => {
1054
1240
  // eslint-disable-next-line no-console
1055
- console.error('Not implemented');
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
- console.log('upOrOpen');
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
- console.log('downOrClose');
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
- console.log('stopMotion');
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
- console.log(`goToLiftPercentage: ${data.request.liftPercent100thsValue} current: ${data.attributes.currentPositionLiftPercent100ths?.getLocal()} ` +
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
- console.log('lockDoor', data.request);
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
- console.log('unlockDoor', data.request);
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
- console.log('changeToMode', data.request);
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
- * Creates a default power source configuration cluster server.
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
- console.log('setpointRaiseLower', request);
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
- // eslint-disable-next-line no-console
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