matterbridge 1.2.22 → 1.3.1

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 +40 -0
  2. package/README.md +40 -8
  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 +9 -1
  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 +69 -6
  69. package/dist/matterbridge.d.ts.map +1 -1
  70. package/dist/matterbridge.js +131 -45
  71. package/dist/matterbridge.js.map +1 -1
  72. package/dist/matterbridgeDevice.d.ts +677 -34
  73. package/dist/matterbridgeDevice.d.ts.map +1 -1
  74. package/dist/matterbridgeDevice.js +442 -93
  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 +409 -139
  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
- optionalServerClusters: [],
115
+ optionalServerClusters: [PowerSource.Cluster.id],
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,16 +201,22 @@ 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.
205
+ * If the child endpoint is not already present in the childEndpoints, it will be added.
206
+ * If the child endpoint is already present in the childEndpoints, the device types and cluster servers will be added to the existing child endpoint.
143
207
  *
208
+ * @param {string} endpointName - The name of the new enpoint to add.
144
209
  * @param {AtLeastOne<DeviceTypeDefinition>} deviceTypes - The device types to add.
145
210
  * @param {ClusterId[]} includeServerList - The list of cluster IDs to include.
146
- * @returns {Endpoint} - The child endpoint that was added.
211
+ * @returns {Endpoint} - The child endpoint that was found or added.
147
212
  */
148
213
  addChildDeviceTypeWithClusterServer(endpointName, deviceTypes, includeServerList) {
149
- this.log.debug('addChildDeviceTypeWithClusterServer:');
150
- const child = new Endpoint(deviceTypes);
151
- child.addFixedLabel('endpointName', endpointName);
214
+ this.log.debug(`addChildDeviceTypeWithClusterServer: ${CYAN}${endpointName}${db}`);
215
+ let child = this.getChildEndpoints().find((endpoint) => endpoint.uniqueStorageKey === endpointName);
216
+ if (!child) {
217
+ child = new Endpoint(deviceTypes, { uniqueStorageKey: endpointName });
218
+ child.addFixedLabel('endpointName', endpointName);
219
+ }
152
220
  deviceTypes.forEach((deviceType) => {
153
221
  this.log.debug(`- with deviceType: ${zb}${deviceType.code}${db}-${zb}${deviceType.name}${db}`);
154
222
  deviceType.requiredServerClusters.forEach((clusterId) => {
@@ -203,10 +271,14 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
203
271
  endpoint.addClusterServer(this.getDefaultFlowMeasurementClusterServer());
204
272
  if (includeServerList.includes(BooleanState.Cluster.id))
205
273
  endpoint.addClusterServer(this.getDefaultBooleanStateClusterServer());
274
+ if (includeServerList.includes(BooleanStateConfiguration.Cluster.id))
275
+ endpoint.addClusterServer(this.getDefaultBooleanStateConfigurationClusterServer());
206
276
  if (includeServerList.includes(OccupancySensing.Cluster.id))
207
277
  endpoint.addClusterServer(this.getDefaultOccupancySensingClusterServer());
208
278
  if (includeServerList.includes(IlluminanceMeasurement.Cluster.id))
209
279
  endpoint.addClusterServer(this.getDefaultIlluminanceMeasurementClusterServer());
280
+ if (includeServerList.includes(PowerSource.Cluster.id))
281
+ endpoint.addClusterServer(this.getDefaultPowerSourceWiredClusterServer());
210
282
  if (includeServerList.includes(EveHistory.Cluster.id))
211
283
  endpoint.addClusterServer(this.getDefaultStaticEveHistoryClusterServer());
212
284
  if (includeServerList.includes(ElectricalMeasurement.Cluster.id))
@@ -215,6 +287,22 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
215
287
  endpoint.addClusterServer(this.getDefaultAirQualityClusterServer());
216
288
  if (includeServerList.includes(TvocMeasurement.Cluster.id))
217
289
  endpoint.addClusterServer(this.getDefaultTvocMeasurementClusterServer());
290
+ if (includeServerList.includes(PowerTopology.Cluster.id))
291
+ endpoint.addClusterServer(this.getDefaultPowerTopologyClusterServer());
292
+ if (includeServerList.includes(ElectricalPowerMeasurement.Cluster.id))
293
+ endpoint.addClusterServer(this.getDefaultElectricalPowerMeasurementClusterServer());
294
+ if (includeServerList.includes(ElectricalEnergyMeasurement.Cluster.id))
295
+ endpoint.addClusterServer(this.getDefaultElectricalEnergyMeasurementClusterServer());
296
+ if (includeServerList.includes(SmokeCoAlarm.Cluster.id))
297
+ endpoint.addClusterServer(this.getDefaultSmokeCOAlarmClusterServer());
298
+ if (includeServerList.includes(CarbonMonoxideConcentrationMeasurement.Cluster.id))
299
+ endpoint.addClusterServer(this.getDefaultCarbonMonoxideConcentrationMeasurementClusterServer());
300
+ if (includeServerList.includes(FanControl.Cluster.id))
301
+ endpoint.addClusterServer(this.getDefaultFanControlClusterServer());
302
+ if (includeServerList.includes(DeviceEnergyManagement.Cluster.id))
303
+ endpoint.addClusterServer(this.getDefaultDeviceEnergyManagementClusterServer());
304
+ if (includeServerList.includes(DeviceEnergyManagementMode.Cluster.id))
305
+ endpoint.addClusterServer(this.getDefaultDeviceEnergyManagementModeClusterServer());
218
306
  }
219
307
  /**
220
308
  * Retrieves a child endpoint by its name.
@@ -259,6 +347,45 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
259
347
  setChildEndpointName(child, endpointName) {
260
348
  child.addFixedLabel('endpointName', endpointName);
261
349
  }
350
+ /**
351
+ * Retrieves the label associated with the specified endpoint number.
352
+ * @param {EndpointNumber | undefined} endpointNumber - The number of the endpoint.
353
+ * @returns {string | undefined} The label associated with the endpoint number, or undefined if not found.
354
+ */
355
+ getEndpointLabel(endpointNumber) {
356
+ if (!endpointNumber)
357
+ return undefined;
358
+ const labelList = this.getChildEndpoint(endpointNumber)?.getClusterServer(FixedLabelCluster)?.getLabelListAttribute();
359
+ if (!labelList)
360
+ return undefined;
361
+ for (const entry of labelList) {
362
+ if (entry.label === 'endpointName')
363
+ return entry.value;
364
+ }
365
+ return undefined;
366
+ }
367
+ /**
368
+ * Retrieves the child endpoint with the specified label.
369
+ *
370
+ * @param {string} label - The label of the child endpoint to retrieve.
371
+ * @returns {Endpoint | undefined} The child endpoint with the specified label, or undefined if not found.
372
+ */
373
+ getChildEndpointWithLabel(label) {
374
+ const endpoints = this.getChildEndpoints();
375
+ for (const endpoint of endpoints) {
376
+ const labelList = endpoint.getClusterServer(FixedLabelCluster)?.getLabelListAttribute();
377
+ if (!labelList)
378
+ return undefined;
379
+ let endpointName = '';
380
+ for (const entry of labelList) {
381
+ if (entry.label === 'endpointName')
382
+ endpointName = entry.value;
383
+ }
384
+ if (endpointName === label)
385
+ return endpoint;
386
+ }
387
+ return undefined;
388
+ }
262
389
  /**
263
390
  * Serializes the Matterbridge device into a serialized object.
264
391
  *
@@ -657,8 +784,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
657
784
  identifyType: Identify.IdentifyType.None,
658
785
  }, {
659
786
  identify: async (data) => {
660
- // eslint-disable-next-line no-console
661
- console.log('Identify');
787
+ this.log.debug('Matter command: Identify');
662
788
  await this.commandHandler.executeHandler('identify', data);
663
789
  },
664
790
  });
@@ -821,6 +947,72 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
821
947
  this.addClusterServer(this.getDefaultBridgedDeviceBasicInformationClusterServer(deviceName, serialNumber, vendorId, vendorName, productName, softwareVersion, softwareVersionString, hardwareVersion, hardwareVersionString));
822
948
  }
823
949
  /**
950
+ * Get a default Electrical Energy Measurement Cluster Server.
951
+ *
952
+ * @param energy - The total consumption value.
953
+ */
954
+ getDefaultPowerTopologyClusterServer() {
955
+ return ClusterServer(PowerTopologyCluster.with(PowerTopology.Feature.TreeTopology), {}, {}, {});
956
+ }
957
+ /**
958
+ * Get a default Electrical Energy Measurement Cluster Server.
959
+ *
960
+ * @param energy - The total consumption value.
961
+ */
962
+ getDefaultElectricalEnergyMeasurementClusterServer(energy = 0) {
963
+ return ClusterServer(ElectricalEnergyMeasurementCluster.with(ElectricalEnergyMeasurement.Feature.ImportedEnergy, ElectricalEnergyMeasurement.Feature.ExportedEnergy, ElectricalEnergyMeasurement.Feature.CumulativeEnergy), {
964
+ accuracy: {
965
+ measurementType: MeasurementType.ElectricalEnergy,
966
+ measured: true,
967
+ minMeasuredValue: 0,
968
+ maxMeasuredValue: 0,
969
+ accuracyRanges: [{ rangeMin: 0, rangeMax: 2 ** 62, fixedMax: 10, fixedMin: 10, fixedTypical: 0 }],
970
+ },
971
+ cumulativeEnergyImported: { energy },
972
+ cumulativeEnergyExported: null,
973
+ }, {}, {
974
+ cumulativeEnergyMeasured: true,
975
+ });
976
+ }
977
+ /**
978
+ * Get a default Electrical Power Measurement Cluster Server.
979
+ *
980
+ * @param energy - The total consumption value.
981
+ */
982
+ getDefaultElectricalPowerMeasurementClusterServer(voltage = 0, current = 0, power = 0) {
983
+ return ClusterServer(ElectricalPowerMeasurementCluster.with(ElectricalPowerMeasurement.Feature.AlternatingCurrent), {
984
+ powerMode: ElectricalPowerMeasurement.PowerMode.Ac,
985
+ numberOfMeasurementTypes: 3,
986
+ accuracy: [
987
+ {
988
+ measurementType: MeasurementType.Voltage,
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.ActiveCurrent,
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
+ measurementType: MeasurementType.ActivePower,
1003
+ measured: true,
1004
+ minMeasuredValue: 0,
1005
+ maxMeasuredValue: 100,
1006
+ accuracyRanges: [{ rangeMin: 0, rangeMax: 2 ** 62, fixedMax: 10, fixedMin: 10, fixedTypical: 0 }],
1007
+ },
1008
+ ],
1009
+ voltage: voltage,
1010
+ activeCurrent: current,
1011
+ activePower: power,
1012
+ }, {}, {});
1013
+ }
1014
+ /**
1015
+ * @deprecated This method is deprecated and will be removed in a future version.
824
1016
  * Get a default Electrical Measurement Cluster Server.
825
1017
  *
826
1018
  * @param voltage - The RMS voltage value.
@@ -837,6 +1029,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
837
1029
  }, {}, {});
838
1030
  }
839
1031
  /**
1032
+ * @deprecated This method is deprecated and will be removed in a future version.
840
1033
  * Creates a default Electrical Measurement Cluster Server.
841
1034
  *
842
1035
  * @param voltage - The RMS voltage value.
@@ -848,7 +1041,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
848
1041
  this.addClusterServer(this.getDefaultElectricalMeasurementClusterServer(voltage, current, power, consumption));
849
1042
  }
850
1043
  /**
851
- * Creates a default Thread Network Diagnostics Cluster server.
1044
+ * Creates a default Dummy Thread Network Diagnostics Cluster server.
852
1045
  *
853
1046
  * @remarks
854
1047
  * This method adds a cluster server used only to give the networkName to Eve app.
@@ -878,7 +1071,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
878
1071
  }, {
879
1072
  resetCounts: async (data) => {
880
1073
  // eslint-disable-next-line no-console
881
- console.log('resetCounts');
1074
+ this.log.debug('Matter command: resetCounts');
882
1075
  await this.commandHandler.executeHandler('resetCounts', data);
883
1076
  },
884
1077
  }, {}));
@@ -893,18 +1086,15 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
893
1086
  onOff,
894
1087
  }, {
895
1088
  on: async (data) => {
896
- // eslint-disable-next-line no-console
897
- console.log('on onOff:', data.attributes.onOff.getLocal());
1089
+ this.log.debug('Matter command: on onOff:', data.attributes.onOff.getLocal());
898
1090
  await this.commandHandler.executeHandler('on', data);
899
1091
  },
900
1092
  off: async (data) => {
901
- // eslint-disable-next-line no-console
902
- console.log('off onOff:', data.attributes.onOff.getLocal());
1093
+ this.log.debug('Matter command: off onOff:', data.attributes.onOff.getLocal());
903
1094
  await this.commandHandler.executeHandler('off', data);
904
1095
  },
905
1096
  toggle: async (data) => {
906
- // eslint-disable-next-line no-console
907
- console.log('toggle onOff:', data.attributes.onOff.getLocal());
1097
+ this.log.debug('Matter command: toggle onOff:', data.attributes.onOff.getLocal());
908
1098
  await this.commandHandler.executeHandler('toggle', data);
909
1099
  },
910
1100
  }, {});
@@ -932,40 +1122,30 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
932
1122
  },
933
1123
  }, {
934
1124
  moveToLevel: async ({ request, attributes, endpoint }) => {
935
- // eslint-disable-next-line no-console
936
- console.log('moveToLevel request:', request, 'attributes.currentLevel:', attributes.currentLevel.getLocal());
937
- // attributes.currentLevel.setLocal(request.level);
1125
+ this.log.debug('Matter command: moveToLevel request:', request, 'attributes.currentLevel:', attributes.currentLevel.getLocal());
938
1126
  await this.commandHandler.executeHandler('moveToLevel', { request: request, attributes: attributes, endpoint: endpoint });
939
1127
  },
940
1128
  move: async () => {
941
- // eslint-disable-next-line no-console
942
- console.error('Not implemented');
1129
+ this.log.error('Matter command: move not implemented');
943
1130
  },
944
1131
  step: async () => {
945
- // 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
- // eslint-disable-next-line no-console
950
- console.error('Not implemented');
1135
+ this.log.error('Matter command: stop not implemented');
951
1136
  },
952
1137
  moveToLevelWithOnOff: async ({ request, attributes, endpoint }) => {
953
- // eslint-disable-next-line no-console
954
- console.log('moveToLevelWithOnOff request:', request, 'attributes.currentLevel:', attributes.currentLevel.getLocal());
955
- // attributes.currentLevel.setLocal(request.level);
1138
+ this.log.debug('Matter command: moveToLevelWithOnOff request:', request, 'attributes.currentLevel:', attributes.currentLevel.getLocal());
956
1139
  await this.commandHandler.executeHandler('moveToLevelWithOnOff', { request: request, attributes: attributes, endpoint: endpoint });
957
1140
  },
958
1141
  moveWithOnOff: async () => {
959
- // eslint-disable-next-line no-console
960
- console.error('Not implemented');
1142
+ this.log.error('Matter command: moveWithOnOff not implemented');
961
1143
  },
962
1144
  stepWithOnOff: async () => {
963
- // eslint-disable-next-line no-console
964
- console.error('Not implemented');
1145
+ this.log.error('Matter command: stepWithOnOff not implemented');
965
1146
  },
966
1147
  stopWithOnOff: async () => {
967
- // eslint-disable-next-line no-console
968
- console.error('Not implemented');
1148
+ this.log.error('Matter command: stopWithOnOff not implemented');
969
1149
  },
970
1150
  });
971
1151
  }
@@ -1003,56 +1183,56 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1003
1183
  }, {
1004
1184
  moveToHue: async ({ request: request, attributes: attributes }) => {
1005
1185
  // eslint-disable-next-line no-console
1006
- console.log('Command moveToHue request:', request, 'attributes.currentHue:', attributes.currentHue.getLocal());
1186
+ this.log.debug('Matter command: moveToHue request:', request, 'attributes.currentHue:', attributes.currentHue.getLocal());
1007
1187
  // attributes.currentHue.setLocal(request.hue);
1008
1188
  this.commandHandler.executeHandler('moveToHue', { request: request, attributes: attributes });
1009
1189
  },
1010
1190
  moveHue: async () => {
1011
1191
  // eslint-disable-next-line no-console
1012
- console.error('Not implemented');
1192
+ this.log.error('Matter command: moveHue not implemented');
1013
1193
  },
1014
1194
  stepHue: async () => {
1015
1195
  // eslint-disable-next-line no-console
1016
- console.error('Not implemented');
1196
+ this.log.error('Matter command: stepHue not implemented');
1017
1197
  },
1018
1198
  moveToSaturation: async ({ request: request, attributes: attributes }) => {
1019
1199
  // eslint-disable-next-line no-console
1020
- console.log('Command moveToSaturation request:', request, 'attributes.currentSaturation:', attributes.currentSaturation.getLocal());
1200
+ this.log.debug('Matter command: moveToSaturation request:', request, 'attributes.currentSaturation:', attributes.currentSaturation.getLocal());
1021
1201
  // attributes.currentSaturation.setLocal(request.saturation);
1022
1202
  this.commandHandler.executeHandler('moveToSaturation', { request: request, attributes: attributes });
1023
1203
  },
1024
1204
  moveSaturation: async () => {
1025
1205
  // eslint-disable-next-line no-console
1026
- console.error('Not implemented');
1206
+ this.log.error('Matter command: moveSaturation not implemented');
1027
1207
  },
1028
1208
  stepSaturation: async () => {
1029
1209
  // eslint-disable-next-line no-console
1030
- console.error('Not implemented');
1210
+ this.log.error('Matter command: stepSaturation not implemented');
1031
1211
  },
1032
1212
  moveToHueAndSaturation: async ({ request: request, attributes: attributes }) => {
1033
1213
  // eslint-disable-next-line no-console
1034
- console.log('Command moveToHueAndSaturation request:', request, 'attributes.currentHue:', attributes.currentHue.getLocal(), 'attributes.currentSaturation:', attributes.currentSaturation.getLocal());
1214
+ this.log.debug('Matter command: moveToHueAndSaturation request:', request, 'attributes.currentHue:', attributes.currentHue.getLocal(), 'attributes.currentSaturation:', attributes.currentSaturation.getLocal());
1035
1215
  // attributes.currentHue.setLocal(request.hue);
1036
1216
  // attributes.currentSaturation.setLocal(request.saturation);
1037
1217
  this.commandHandler.executeHandler('moveToHueAndSaturation', { request: request, attributes: attributes });
1038
1218
  },
1039
1219
  stopMoveStep: async () => {
1040
1220
  // eslint-disable-next-line no-console
1041
- console.error('Not implemented');
1221
+ this.log.error('Matter command: stopMoveStep not implemented');
1042
1222
  },
1043
1223
  moveToColorTemperature: async ({ request: request, attributes: attributes }) => {
1044
1224
  // eslint-disable-next-line no-console
1045
- console.log('Command moveToColorTemperature request:', request, 'attributes.colorTemperatureMireds:', attributes.colorTemperatureMireds.getLocal());
1225
+ this.log.debug('Matter command: moveToColorTemperature request:', request, 'attributes.colorTemperatureMireds:', attributes.colorTemperatureMireds.getLocal());
1046
1226
  // attributes.colorTemperatureMireds.setLocal(request.colorTemperatureMireds);
1047
1227
  this.commandHandler.executeHandler('moveToColorTemperature', { request: request, attributes: attributes });
1048
1228
  },
1049
1229
  moveColorTemperature: async () => {
1050
1230
  // eslint-disable-next-line no-console
1051
- console.error('Not implemented');
1231
+ this.log.error('Matter command: moveColorTemperature not implemented');
1052
1232
  },
1053
1233
  stepColorTemperature: async () => {
1054
1234
  // eslint-disable-next-line no-console
1055
- console.error('Not implemented');
1235
+ this.log.error('Matter command: stepColorTemperature not implemented');
1056
1236
  },
1057
1237
  }, {});
1058
1238
  }
@@ -1095,22 +1275,22 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1095
1275
  }, {
1096
1276
  upOrOpen: async (data) => {
1097
1277
  // eslint-disable-next-line no-console
1098
- console.log('upOrOpen');
1278
+ this.log.debug('Matter command: upOrOpen');
1099
1279
  await this.commandHandler.executeHandler('upOrOpen', data);
1100
1280
  },
1101
1281
  downOrClose: async (data) => {
1102
1282
  // eslint-disable-next-line no-console
1103
- console.log('downOrClose');
1283
+ this.log.debug('Matter command: downOrClose');
1104
1284
  await this.commandHandler.executeHandler('downOrClose', data);
1105
1285
  },
1106
1286
  stopMotion: async (data) => {
1107
1287
  // eslint-disable-next-line no-console
1108
- console.log('stopMotion');
1288
+ this.log.debug('Matter command: stopMotion');
1109
1289
  await this.commandHandler.executeHandler('stopMotion', data);
1110
1290
  },
1111
1291
  goToLiftPercentage: async (data) => {
1112
1292
  // eslint-disable-next-line no-console
1113
- console.log(`goToLiftPercentage: ${data.request.liftPercent100thsValue} current: ${data.attributes.currentPositionLiftPercent100ths?.getLocal()} ` +
1293
+ this.log.debug(`Matter command: goToLiftPercentage: ${data.request.liftPercent100thsValue} current: ${data.attributes.currentPositionLiftPercent100ths?.getLocal()} ` +
1114
1294
  `target: ${data.attributes.targetPositionLiftPercent100ths?.getLocal()} status: ${data.attributes.operationalStatus.getLocal().lift}`);
1115
1295
  await this.commandHandler.executeHandler('goToLiftPercentage', data);
1116
1296
  },
@@ -1229,12 +1409,12 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1229
1409
  }, {
1230
1410
  lockDoor: async (data) => {
1231
1411
  // eslint-disable-next-line no-console
1232
- console.log('lockDoor', data.request);
1412
+ this.log.debug('Matter command: lockDoor', data.request);
1233
1413
  await this.commandHandler.executeHandler('lockDoor', data);
1234
1414
  },
1235
1415
  unlockDoor: async (data) => {
1236
1416
  // eslint-disable-next-line no-console
1237
- console.log('unlockDoor', data.request);
1417
+ this.log.debug('Matter command: unlockDoor', data.request);
1238
1418
  await this.commandHandler.executeHandler('unlockDoor', data);
1239
1419
  },
1240
1420
  }, {
@@ -1257,7 +1437,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1257
1437
  * Get a default switch cluster server.
1258
1438
  *
1259
1439
  * @remarks
1260
- * This method adds a cluster server with default switch features and configurations.
1440
+ * This method adds a cluster server with default momentary switch features and configurations suitable for (AppleHome) Single Double Long automations.
1261
1441
  */
1262
1442
  getDefaultSwitchClusterServer() {
1263
1443
  return ClusterServer(SwitchCluster.with(Switch.Feature.MomentarySwitch, Switch.Feature.MomentarySwitchRelease, Switch.Feature.MomentarySwitchLongPress, Switch.Feature.MomentarySwitchMultiPress), {
@@ -1293,8 +1473,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1293
1473
  startUpMode: startUpMode,
1294
1474
  }, {
1295
1475
  changeToMode: async (data) => {
1296
- // eslint-disable-next-line no-console
1297
- console.log('changeToMode', data.request);
1476
+ this.log.debug('Matter command: changeToMode', data.request);
1298
1477
  await this.commandHandler.executeHandler('changeToMode', data);
1299
1478
  },
1300
1479
  });
@@ -1446,13 +1625,47 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1446
1625
  });
1447
1626
  }
1448
1627
  /**
1449
- * Creates a default boolean state cluster server.
1628
+ * Creates a default boolean state configuration cluster server.
1450
1629
  *
1451
1630
  * @param contact - Optional boolean value indicating the contact state. Defaults to `true` if not provided.
1452
1631
  */
1453
1632
  createDefaultBooleanStateClusterServer(contact) {
1454
1633
  this.addClusterServer(this.getDefaultBooleanStateClusterServer(contact));
1455
1634
  }
1635
+ /**
1636
+ * Get a default boolean state configuration cluster server.
1637
+ *
1638
+ * @param contact - Optional boolean value indicating the sensor fault state. Defaults to `false` if not provided.
1639
+ */
1640
+ getDefaultBooleanStateConfigurationClusterServer(sensorFault = false) {
1641
+ return ClusterServer(BooleanStateConfigurationCluster.with(BooleanStateConfiguration.Feature.Visual, BooleanStateConfiguration.Feature.Audible, BooleanStateConfiguration.Feature.SensitivityLevel), {
1642
+ currentSensitivityLevel: 0,
1643
+ supportedSensitivityLevels: 2,
1644
+ defaultSensitivityLevel: 0,
1645
+ alarmsActive: { visual: false, audible: false },
1646
+ alarmsEnabled: { visual: false, audible: false },
1647
+ alarmsSupported: { visual: true, audible: true },
1648
+ // alarmsSuppressed: { visual: false, audible: false },
1649
+ sensorFault: { generalFault: sensorFault },
1650
+ }, {
1651
+ enableDisableAlarm: async ({ request, attributes }) => {
1652
+ // eslint-disable-next-line no-console
1653
+ this.log.debug('Matter command: enableDisableAlarm', request);
1654
+ await this.commandHandler.executeHandler('enableDisableAlarm', { request, attributes });
1655
+ },
1656
+ }, {
1657
+ alarmsStateChanged: true,
1658
+ sensorFault: true,
1659
+ });
1660
+ }
1661
+ /**
1662
+ * Creates a default boolean state configuration cluster server.
1663
+ *
1664
+ * @param contact - Optional boolean value indicating the sensor fault state. Defaults to `false` if not provided.
1665
+ */
1666
+ createDefaultBooleanStateConfigurationClusterServer(sensorFault = false) {
1667
+ this.addClusterServer(this.getDefaultBooleanStateConfigurationClusterServer(sensorFault));
1668
+ }
1456
1669
  /**
1457
1670
  * Get a default power source replaceable battery cluster server.
1458
1671
  *
@@ -1544,14 +1757,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1544
1757
  this.addClusterServer(this.getDefaultPowerSourceWiredClusterServer(wiredCurrentType));
1545
1758
  }
1546
1759
  /**
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.
1760
+ * @deprecated This function is deprecated by Matter 1.3 spec and will be removed in a future version.
1555
1761
  */
1556
1762
  createDefaultPowerSourceConfigurationClusterServer(endpointNumber) {
1557
1763
  this.addClusterServer(ClusterServer(PowerSourceConfigurationCluster, {
@@ -1624,7 +1830,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1624
1830
  }, {
1625
1831
  setpointRaiseLower: async ({ request, attributes }) => {
1626
1832
  // eslint-disable-next-line no-console
1627
- console.log('setpointRaiseLower', request);
1833
+ this.log.debug('Matter command: setpointRaiseLower', request);
1628
1834
  await this.commandHandler.executeHandler('setpointRaiseLower', { request, attributes });
1629
1835
  },
1630
1836
  }, {});
@@ -1641,7 +1847,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1641
1847
  this.addClusterServer(this.getDefaultThermostatClusterServer(localTemperature, occupiedHeatingSetpoint, occupiedCoolingSetpoint, minSetpointDeadBand));
1642
1848
  }
1643
1849
  /**
1644
- * Get a default time sync cluster server. Only needed to create a thermostat.
1850
+ * Get a default dummy time sync cluster server. Only needed to create a thermostat.
1645
1851
  */
1646
1852
  getDefaultTimeSyncClusterServer() {
1647
1853
  return ClusterServer(TimeSyncCluster.with(TimeSync.Feature.TimeZone), {
@@ -1654,8 +1860,7 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1654
1860
  timeZoneDatabase: true,
1655
1861
  }, {
1656
1862
  setUtcTime: async ({ request, attributes }) => {
1657
- // eslint-disable-next-line no-console
1658
- console.log('setUtcTime', request);
1863
+ this.log.debug('Matter command: setUtcTime', request);
1659
1864
  await this.commandHandler.executeHandler('setUtcTime', { request, attributes });
1660
1865
  },
1661
1866
  }, {
@@ -1665,10 +1870,154 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
1665
1870
  });
1666
1871
  }
1667
1872
  /**
1668
- * Creates a default time sync cluster server. Only needed to create a thermostat.
1873
+ * Creates a default dummy time sync cluster server. Only needed to create a thermostat.
1669
1874
  */
1670
1875
  createDefaultTimeSyncClusterServer() {
1671
1876
  this.addClusterServer(this.getDefaultTimeSyncClusterServer());
1672
1877
  }
1878
+ /**
1879
+ * Returns the default SmokeCOAlarmClusterServer.
1880
+ *
1881
+ * @param smokeState - The state of the smoke alarm. Defaults to SmokeCoAlarm.AlarmState.Normal.
1882
+ * @param coState - The state of the CO alarm. Defaults to SmokeCoAlarm.AlarmState.Normal.
1883
+ * @returns The default SmokeCOAlarmClusterServer.
1884
+ */
1885
+ getDefaultSmokeCOAlarmClusterServer(smokeState = SmokeCoAlarm.AlarmState.Normal, coState = SmokeCoAlarm.AlarmState.Normal) {
1886
+ return ClusterServer(SmokeCoAlarmCluster.with(SmokeCoAlarm.Feature.SmokeAlarm, SmokeCoAlarm.Feature.CoAlarm), {
1887
+ smokeState,
1888
+ coState,
1889
+ expressedState: SmokeCoAlarm.ExpressedState.Normal,
1890
+ batteryAlert: SmokeCoAlarm.AlarmState.Normal,
1891
+ deviceMuted: SmokeCoAlarm.MuteState.NotMuted,
1892
+ testInProgress: false,
1893
+ hardwareFaultAlert: false,
1894
+ endOfServiceAlert: SmokeCoAlarm.EndOfService.Normal,
1895
+ interconnectSmokeAlarm: SmokeCoAlarm.AlarmState.Normal,
1896
+ interconnectCoAlarm: SmokeCoAlarm.AlarmState.Normal,
1897
+ }, {
1898
+ selfTestRequest: async ({ request, attributes }) => {
1899
+ this.log.debug('Matter command: selfTestRequest');
1900
+ await this.commandHandler.executeHandler('selfTestRequest', { request, attributes });
1901
+ },
1902
+ }, {
1903
+ smokeAlarm: true,
1904
+ interconnectSmokeAlarm: true,
1905
+ coAlarm: true,
1906
+ interconnectCoAlarm: true,
1907
+ lowBattery: true,
1908
+ hardwareFault: true,
1909
+ endOfService: true,
1910
+ selfTestComplete: true,
1911
+ alarmMuted: true,
1912
+ muteEnded: true,
1913
+ allClear: true,
1914
+ });
1915
+ }
1916
+ /**
1917
+ * Create the default SmokeCOAlarmClusterServer.
1918
+ *
1919
+ * @param smokeState - The state of the smoke alarm. Defaults to SmokeCoAlarm.AlarmState.Normal.
1920
+ * @param coState - The state of the CO alarm. Defaults to SmokeCoAlarm.AlarmState.Normal.
1921
+ * @returns The default SmokeCOAlarmClusterServer.
1922
+ */
1923
+ createDefaultSmokeCOAlarmClusterServer(smokeState = SmokeCoAlarm.AlarmState.Normal, coState = SmokeCoAlarm.AlarmState.Normal) {
1924
+ this.addClusterServer(this.getDefaultSmokeCOAlarmClusterServer(smokeState, coState));
1925
+ }
1926
+ /**
1927
+ * Returns the default Carbon Monoxide Concentration Measurement Cluster Server.
1928
+ *
1929
+ * @param {number} measuredValue - The measured value of the concentration.
1930
+ * @param {ConcentrationMeasurement.MeasurementUnit} measurementUnit - The unit of measurement.
1931
+ * @param {ConcentrationMeasurement.MeasurementMedium} measurementMedium - The medium of measurement.
1932
+ * @returns {ClusterServer} - The default Carbon Monoxide Concentration Measurement Cluster Server.
1933
+ */
1934
+ getDefaultCarbonMonoxideConcentrationMeasurementClusterServer(measuredValue = 0, measurementUnit = ConcentrationMeasurement.MeasurementUnit.Ppm, measurementMedium = ConcentrationMeasurement.MeasurementMedium.Air) {
1935
+ return ClusterServer(CarbonMonoxideConcentrationMeasurementCluster.with('NumericMeasurement'), {
1936
+ measuredValue,
1937
+ minMeasuredValue: null,
1938
+ maxMeasuredValue: null,
1939
+ uncertainty: 0,
1940
+ measurementUnit,
1941
+ measurementMedium,
1942
+ }, {}, {});
1943
+ }
1944
+ /**
1945
+ * Create the default Carbon Monoxide Concentration Measurement Cluster Server.
1946
+ *
1947
+ * @param {number} measuredValue - The measured value of the concentration.
1948
+ * @param {ConcentrationMeasurement.MeasurementUnit} measurementUnit - The unit of measurement.
1949
+ * @param {ConcentrationMeasurement.MeasurementMedium} measurementMedium - The medium of measurement.
1950
+ */
1951
+ createDefaultCarbonMonoxideConcentrationMeasurementClusterServer(measuredValue = 0, measurementUnit = ConcentrationMeasurement.MeasurementUnit.Ppm, measurementMedium = ConcentrationMeasurement.MeasurementMedium.Air) {
1952
+ this.addClusterServer(this.getDefaultCarbonMonoxideConcentrationMeasurementClusterServer(measuredValue, measurementUnit, measurementMedium));
1953
+ }
1954
+ /**
1955
+ * Returns the default fan control cluster server rev 2.
1956
+ *
1957
+ * @param fanMode The fan mode to set. Defaults to `FanControl.FanMode.Off`.
1958
+ * @returns The default fan control cluster server.
1959
+ */
1960
+ getDefaultFanControlClusterServer(fanMode = FanControl.FanMode.Off) {
1961
+ return ClusterServer(FanControlCluster.with(FanControl.Feature.MultiSpeed, FanControl.Feature.Auto /* , FanControl.Feature.Step*/), {
1962
+ fanMode,
1963
+ fanModeSequence: FanControl.FanModeSequence.OffLowMedHighAuto,
1964
+ percentSetting: 0,
1965
+ percentCurrent: 0,
1966
+ speedMax: 100,
1967
+ speedSetting: 0,
1968
+ speedCurrent: 0,
1969
+ }, {
1970
+ /*
1971
+ step: async ({ request, attributes }) => {
1972
+ this.log.debug('Matter command: step', request);
1973
+ await this.commandHandler.executeHandler('step', { request, attributes });
1974
+ },
1975
+ */
1976
+ }, {});
1977
+ }
1978
+ /**
1979
+ * Create the default fan control cluster server rev 2.
1980
+ *
1981
+ * @param fanMode The fan mode to set. Defaults to `FanControl.FanMode.Off`.
1982
+ * @returns The default fan control cluster server.
1983
+ */
1984
+ createDefaultFanControlClusterServer(fanMode = FanControl.FanMode.Off) {
1985
+ this.addClusterServer(this.getDefaultFanControlClusterServer(fanMode));
1986
+ }
1987
+ // NOTE Support of Device Energy Management Cluster is provisional.
1988
+ getDefaultDeviceEnergyManagementClusterServer() {
1989
+ return ClusterServer(DeviceEnergyManagementCluster.with(DeviceEnergyManagement.Feature.Pausable, DeviceEnergyManagement.Feature.PowerForecastReporting, DeviceEnergyManagement.Feature.StateForecastReporting), {
1990
+ esaType: DeviceEnergyManagement.EsaType.Other,
1991
+ esaCanGenerate: false,
1992
+ esaState: DeviceEnergyManagement.EsaState.Online,
1993
+ absMinPower: 0,
1994
+ absMaxPower: 0,
1995
+ optOutState: DeviceEnergyManagement.OptOutState.NoOptOut,
1996
+ forecast: null,
1997
+ }, {
1998
+ pauseRequest: async ({ request, attributes }) => {
1999
+ this.log.debug('Matter command: pauseRequest', request);
2000
+ await this.commandHandler.executeHandler('pauseRequest', { request, attributes });
2001
+ },
2002
+ resumeRequest: async () => {
2003
+ this.log.debug('Matter command: resumeRequest');
2004
+ await this.commandHandler.executeHandler('resumeRequest');
2005
+ },
2006
+ }, {
2007
+ paused: true,
2008
+ resumed: true,
2009
+ });
2010
+ }
2011
+ // NOTE Support of Device Energy Management Mode Cluster is provisional.
2012
+ getDefaultDeviceEnergyManagementModeClusterServer() {
2013
+ return ClusterServer(DeviceEnergyManagementModeCluster, {
2014
+ esaType: DeviceEnergyManagement.EsaType.Other,
2015
+ esaCanGenerate: false,
2016
+ esaState: DeviceEnergyManagement.EsaState.Online,
2017
+ absMinPower: 0,
2018
+ absMaxPower: 0,
2019
+ optOutState: DeviceEnergyManagement.OptOutState.NoOptOut,
2020
+ }, {}, {});
2021
+ }
1673
2022
  }
1674
2023
  //# sourceMappingURL=matterbridgeDevice.js.map