matterbridge 1.0.6 → 1.1.2

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 (66) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/LICENSE +202 -21
  3. package/README.md +90 -5
  4. package/Screenshot devices page.png +0 -0
  5. package/Screenshot home page.png +0 -0
  6. package/dist/AirQualityCluster.d.ts +22 -0
  7. package/dist/AirQualityCluster.d.ts.map +1 -1
  8. package/dist/AirQualityCluster.js +23 -1
  9. package/dist/AirQualityCluster.js.map +1 -1
  10. package/dist/ColorControlServer.d.ts +20 -3
  11. package/dist/ColorControlServer.d.ts.map +1 -1
  12. package/dist/ColorControlServer.js +20 -3
  13. package/dist/ColorControlServer.js.map +1 -1
  14. package/dist/TvocCluster.d.ts +262 -0
  15. package/dist/TvocCluster.d.ts.map +1 -0
  16. package/dist/TvocCluster.js +114 -0
  17. package/dist/TvocCluster.js.map +1 -0
  18. package/dist/index.d.ts +30 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +37 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/matterbridge.d.ts +187 -17
  23. package/dist/matterbridge.d.ts.map +1 -1
  24. package/dist/matterbridge.js +721 -218
  25. package/dist/matterbridge.js.map +1 -1
  26. package/dist/matterbridgeAccessoryPlatform.d.ts +50 -11
  27. package/dist/matterbridgeAccessoryPlatform.d.ts.map +1 -1
  28. package/dist/matterbridgeAccessoryPlatform.js +56 -41
  29. package/dist/matterbridgeAccessoryPlatform.js.map +1 -1
  30. package/dist/matterbridgeComposed.d.ts +43 -0
  31. package/dist/matterbridgeComposed.d.ts.map +1 -0
  32. package/dist/matterbridgeComposed.js +58 -0
  33. package/dist/matterbridgeComposed.js.map +1 -0
  34. package/dist/matterbridgeDevice.d.ts +209 -4
  35. package/dist/matterbridgeDevice.d.ts.map +1 -1
  36. package/dist/matterbridgeDevice.js +587 -51
  37. package/dist/matterbridgeDevice.js.map +1 -1
  38. package/dist/matterbridgeDynamicPlatform.d.ts +50 -11
  39. package/dist/matterbridgeDynamicPlatform.d.ts.map +1 -1
  40. package/dist/matterbridgeDynamicPlatform.js +56 -41
  41. package/dist/matterbridgeDynamicPlatform.js.map +1 -1
  42. package/frontend/build/Matterbridge.jpg +0 -0
  43. package/frontend/build/asset-manifest.json +6 -6
  44. package/frontend/build/index.html +1 -1
  45. package/frontend/build/static/css/main.6d93e0db.css +2 -0
  46. package/frontend/build/static/css/main.6d93e0db.css.map +1 -0
  47. package/frontend/build/static/js/main.21c55a60.js +3 -0
  48. package/frontend/build/static/js/{main.a000062f.js.LICENSE.txt → main.21c55a60.js.LICENSE.txt} +2 -0
  49. package/frontend/build/static/js/main.21c55a60.js.map +1 -0
  50. package/package.json +8 -4
  51. package/.eslintrc.json +0 -45
  52. package/.gitattributes +0 -2
  53. package/.prettierignore +0 -2
  54. package/.prettierrc.json +0 -12
  55. package/frontend/README.md +0 -70
  56. package/frontend/build/static/css/main.8b969fd5.css +0 -2
  57. package/frontend/build/static/css/main.8b969fd5.css.map +0 -1
  58. package/frontend/build/static/js/main.a000062f.js +0 -3
  59. package/frontend/build/static/js/main.a000062f.js.map +0 -1
  60. package/frontend/package-lock.json +0 -18351
  61. package/frontend/package.json +0 -40
  62. package/frontend/public/favicon.ico +0 -0
  63. package/frontend/public/index.html +0 -15
  64. package/frontend/public/manifest.json +0 -15
  65. package/frontend/public/matter.png +0 -0
  66. package/frontend/public/robots.txt +0 -3
@@ -1,9 +1,33 @@
1
- /* eslint-disable no-console */
2
- import { BasicInformationCluster, BooleanStateCluster, BridgedDeviceBasicInformationCluster, ClusterServer, ColorControl, Groups, Identify, IdentifyCluster, IlluminanceMeasurementCluster, LevelControl, OccupancySensing, OccupancySensingCluster, OnOff, OnOffCluster, PowerSource, PowerSourceCluster, PowerSourceConfigurationCluster, PressureMeasurementCluster, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, Scenes, TemperatureMeasurement, TemperatureMeasurementCluster, ThreadNetworkDiagnostics, ThreadNetworkDiagnosticsCluster, WindowCovering, WindowCoveringCluster, createDefaultGroupsClusterServer, createDefaultScenesClusterServer, } from '@project-chip/matter-node.js/cluster';
1
+ /**
2
+ * This file contains the class MatterbridgeDevice.
3
+ *
4
+ * @file matterbridgeDevice.ts
5
+ * @author Luca Liguori
6
+ * @date 2023-12-29
7
+ * @version 1.0.15
8
+ *
9
+ * Copyright 2023, 2024 Luca Liguori.
10
+ *
11
+ * Licensed under the Apache License, Version 2.0 (the "License");
12
+ * you may not use this file except in compliance with the License.
13
+ * You may obtain a copy of the License at
14
+ *
15
+ * http://www.apache.org/licenses/LICENSE-2.0
16
+ *
17
+ * Unless required by applicable law or agreed to in writing, software
18
+ * distributed under the License is distributed on an "AS IS" BASIS,
19
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ * See the License for the specific language governing permissions and
21
+ * limitations under the License. *
22
+ */
23
+ import { BasicInformationCluster, BooleanStateCluster, BridgedDeviceBasicInformationCluster, ClusterServer, ColorControl, ElectricalMeasurementCluster, Groups, Identify, IdentifyCluster, IlluminanceMeasurementCluster, LevelControl, OccupancySensing, OccupancySensingCluster, OnOff, OnOffCluster, PowerSource, PowerSourceCluster, PowerSourceConfigurationCluster, PressureMeasurementCluster, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, Scenes, TemperatureMeasurement, TemperatureMeasurementCluster, ThreadNetworkDiagnostics, ThreadNetworkDiagnosticsCluster, WindowCovering, WindowCoveringCluster, createDefaultGroupsClusterServer, createDefaultScenesClusterServer, } from '@project-chip/matter-node.js/cluster';
3
24
  import { EndpointNumber, VendorId } from '@project-chip/matter-node.js/datatype';
4
25
  import { Device, DeviceClasses, DeviceTypeDefinition } from '@project-chip/matter-node.js/device';
5
26
  import { extendPublicHandlerMethods } from '@project-chip/matter-node.js/util';
27
+ import { EveHistoryCluster } from 'matter-history';
6
28
  import { AirQuality, AirQualityCluster } from './AirQualityCluster.js';
29
+ import { createHash } from 'crypto';
30
+ import { TvocMeasurement, TvocMeasurementCluster } from './TvocCluster.js';
7
31
  // Custom device types
8
32
  export const onOffSwitch = DeviceTypeDefinition({
9
33
  name: 'MA-onoffswitch',
@@ -35,66 +59,431 @@ export const airQualitySensor = DeviceTypeDefinition({
35
59
  deviceClass: DeviceClasses.Simple,
36
60
  revision: 1,
37
61
  requiredServerClusters: [Identify.Cluster.id, AirQuality.Cluster.id],
38
- optionalServerClusters: [TemperatureMeasurement.Cluster.id, RelativeHumidityMeasurement.Cluster.id],
62
+ optionalServerClusters: [TemperatureMeasurement.Cluster.id, RelativeHumidityMeasurement.Cluster.id, TvocMeasurement.Cluster.id],
39
63
  });
40
64
  export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
41
- constructor(definition,
42
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
- // attributeInitialValues?: { [key: ClusterId]: AttributeInitialValues<any> },
44
- options = {}) {
65
+ constructor(definition, options = {}) {
45
66
  super(definition, options);
46
67
  }
68
+ addDeviceType(deviceType) {
69
+ const deviceTypes = this.getDeviceTypes();
70
+ deviceTypes.push(deviceType);
71
+ this.setDeviceTypes(deviceTypes);
72
+ }
73
+ /*
74
+ removeClusterServer<A extends Attributes, E extends Events>(cluster: ClusterServerObj<A, E>) {
75
+ const currentCluster = this.clusterServers.get(cluster.id);
76
+ if (currentCluster !== undefined) {
77
+ asClusterServerInternal(currentCluster)._destroy();
78
+ }
79
+ }
80
+ */
81
+ /**
82
+ * Creates a room Eve History Cluster Server.
83
+ *
84
+ * @param history - The MatterHistory object.
85
+ * @param log - The AnsiLogger object.
86
+ */
87
+ createRoomEveHistoryClusterServer(history, log) {
88
+ history.setMatterHystoryType('room');
89
+ this.addClusterServer(ClusterServer(EveHistoryCluster, {
90
+ // Dynamic attributes
91
+ ConfigDataGet: Uint8Array.fromHex(''),
92
+ ConfigDataSet: Uint8Array.fromHex(''),
93
+ HistoryStatus: Uint8Array.fromHex(''),
94
+ HistoryEntries: Uint8Array.fromHex(''),
95
+ HistoryRequest: Uint8Array.fromHex(''),
96
+ HistorySetTime: Uint8Array.fromHex(''),
97
+ // Normal attributes
98
+ TemperatureDisplayUnits: 0 /* TemperatureDisplayUnits.CELSIUS */,
99
+ RLoc: 46080,
100
+ }, {
101
+ ConfigDataGetAttributeGetter: ({ session, isFabricFiltered }) => {
102
+ log.debug(`ConfigDataGetAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
103
+ return history.OnGetConfigData(isFabricFiltered);
104
+ },
105
+ ConfigDataSetAttributeGetter: ({ session, isFabricFiltered }) => {
106
+ log.debug(`ConfigDataSetAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
107
+ return Uint8Array.fromHex('');
108
+ },
109
+ ConfigDataSetAttributeSetter: (value, { attributes, endpoint, session }) => {
110
+ log.debug(`ConfigDataSetAttributeSetter [${value.toHex()}] ${attributes.ConfigDataSet} endpoint: ${endpoint?.name} session: ${session?.name}`);
111
+ return history.OnSetConfigData(value);
112
+ },
113
+ HistoryStatusAttributeGetter: ({ session, isFabricFiltered }) => {
114
+ log.debug(`HistoryStatusAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
115
+ return history.OnGetHistoryStatus(isFabricFiltered);
116
+ },
117
+ HistoryEntriesAttributeGetter: ({ session, isFabricFiltered }) => {
118
+ log.debug(`HistoryEntriesAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
119
+ return history.OnGetHistoryEntries();
120
+ },
121
+ HistorySetTimeAttributeGetter: ({ session, isFabricFiltered }) => {
122
+ log.debug(`HistorySetTimeAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
123
+ return Uint8Array.fromHex('');
124
+ },
125
+ HistorySetTimeAttributeSetter: (value, { attributes, endpoint, session }) => {
126
+ log.debug(`HistorySetTimeAttributeSetter ${value.toHex()} ${attributes.HistorySetTime} endpoint: ${endpoint?.name} session: ${session?.name}`);
127
+ return history.OnSetHistorySetTime(value);
128
+ },
129
+ HistoryRequestAttributeGetter: ({ session, isFabricFiltered }) => {
130
+ log.debug(`HistoryRequestAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
131
+ return Uint8Array.fromHex('');
132
+ },
133
+ HistoryRequestAttributeSetter: (value, { attributes, endpoint, session }) => {
134
+ log.debug(`HistoryRequestAttributeSetter ${value.toHex()} ${attributes.HistoryRequest} endpoint: ${endpoint?.name} session: ${session?.name}`);
135
+ return history.OnSetHistoryRequest(value);
136
+ },
137
+ }, {}));
138
+ }
139
+ /**
140
+ * Creates a Weather Eve History Cluster Server.
141
+ *
142
+ * @param history - The MatterHistory instance.
143
+ * @param log - The AnsiLogger instance.
144
+ */
145
+ createWeatherEveHistoryClusterServer(history, log) {
146
+ history.setMatterHystoryType('weather');
147
+ this.addClusterServer(ClusterServer(EveHistoryCluster, {
148
+ // Dynamic attributes
149
+ ConfigDataGet: Uint8Array.fromHex(''),
150
+ ConfigDataSet: Uint8Array.fromHex(''),
151
+ HistoryStatus: Uint8Array.fromHex(''),
152
+ HistoryEntries: Uint8Array.fromHex(''),
153
+ HistoryRequest: Uint8Array.fromHex(''),
154
+ HistorySetTime: Uint8Array.fromHex(''),
155
+ // Normal attributes
156
+ Elevation: 0,
157
+ LastPressure: 1000,
158
+ WeatherTrend: 1 /* WeatherTrend.SUN */,
159
+ TemperatureDisplayUnits: 0 /* TemperatureDisplayUnits.CELSIUS */,
160
+ RLoc: 46080,
161
+ }, {
162
+ ConfigDataGetAttributeGetter: ({ session, isFabricFiltered }) => {
163
+ log.debug(`ConfigDataGetAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
164
+ return history.OnGetConfigData(isFabricFiltered);
165
+ },
166
+ ConfigDataSetAttributeGetter: ({ session, isFabricFiltered }) => {
167
+ log.debug(`ConfigDataSetAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
168
+ return Uint8Array.fromHex('');
169
+ },
170
+ ConfigDataSetAttributeSetter: (value, { attributes, endpoint, session }) => {
171
+ log.debug(`ConfigDataSetAttributeSetter [${value.toHex()}] ${attributes.ConfigDataSet} endpoint: ${endpoint?.name} session: ${session?.name}`);
172
+ return history.OnSetConfigData(value);
173
+ },
174
+ HistoryStatusAttributeGetter: ({ session, isFabricFiltered }) => {
175
+ log.debug(`HistoryStatusAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
176
+ return history.OnGetHistoryStatus(isFabricFiltered);
177
+ },
178
+ HistoryEntriesAttributeGetter: ({ session, isFabricFiltered }) => {
179
+ log.debug(`HistoryEntriesAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
180
+ return history.OnGetHistoryEntries();
181
+ },
182
+ HistorySetTimeAttributeGetter: ({ session, isFabricFiltered }) => {
183
+ log.debug(`HistorySetTimeAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
184
+ return Uint8Array.fromHex('');
185
+ },
186
+ HistorySetTimeAttributeSetter: (value, { attributes, endpoint, session }) => {
187
+ log.debug(`HistorySetTimeAttributeSetter ${value.toHex()} ${attributes.HistorySetTime} endpoint: ${endpoint?.name} session: ${session?.name}`);
188
+ return history.OnSetHistorySetTime(value);
189
+ },
190
+ HistoryRequestAttributeGetter: ({ session, isFabricFiltered }) => {
191
+ log.debug(`HistoryRequestAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
192
+ return Uint8Array.fromHex('');
193
+ },
194
+ HistoryRequestAttributeSetter: (value, { attributes, endpoint, session }) => {
195
+ log.debug(`HistoryRequestAttributeSetter ${value.toHex()} ${attributes.HistoryRequest} endpoint: ${endpoint?.name} session: ${session?.name}`);
196
+ return history.OnSetHistoryRequest(value);
197
+ },
198
+ }, {}));
199
+ }
200
+ /**
201
+ * Creates an Energy Eve History Cluster Server.
202
+ *
203
+ * @param history - The MatterHistory object.
204
+ * @param log - The AnsiLogger object.
205
+ */
206
+ createEnergyEveHistoryClusterServer(history, log) {
207
+ history.setMatterHystoryType('energy');
208
+ this.addClusterServer(ClusterServer(EveHistoryCluster, {
209
+ // Dynamic attributes
210
+ ConfigDataGet: Uint8Array.fromHex(''),
211
+ ConfigDataSet: Uint8Array.fromHex(''),
212
+ HistoryStatus: Uint8Array.fromHex(''),
213
+ HistoryEntries: Uint8Array.fromHex(''),
214
+ HistoryRequest: Uint8Array.fromHex(''),
215
+ HistorySetTime: Uint8Array.fromHex(''),
216
+ LastEvent: 0,
217
+ ResetTotal: 0,
218
+ // Normal attributes
219
+ Voltage: 0,
220
+ Current: 0,
221
+ Consumption: 0,
222
+ TotalConsumption: 0,
223
+ EnergyUnknown: 1,
224
+ ChildLock: false,
225
+ RLoc: 46080,
226
+ }, {
227
+ ConfigDataGetAttributeGetter: ({ session, isFabricFiltered }) => {
228
+ log.debug(`ConfigDataGetAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
229
+ return history.OnGetConfigData(isFabricFiltered);
230
+ },
231
+ ConfigDataSetAttributeGetter: ({ session, isFabricFiltered }) => {
232
+ log.debug(`ConfigDataSetAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
233
+ return Uint8Array.fromHex('');
234
+ },
235
+ ConfigDataSetAttributeSetter: (value, { attributes, endpoint, session }) => {
236
+ log.debug(`ConfigDataSetAttributeSetter [${value.toHex()}] ${attributes.ConfigDataSet} endpoint: ${endpoint?.name} session: ${session?.name}`);
237
+ return history.OnSetConfigData(value);
238
+ },
239
+ HistoryStatusAttributeGetter: ({ session, isFabricFiltered }) => {
240
+ log.debug(`HistoryStatusAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
241
+ return history.OnGetHistoryStatus(isFabricFiltered);
242
+ },
243
+ HistoryEntriesAttributeGetter: ({ session, isFabricFiltered }) => {
244
+ log.debug(`HistoryEntriesAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
245
+ return history.OnGetHistoryEntries();
246
+ },
247
+ HistorySetTimeAttributeGetter: ({ session, isFabricFiltered }) => {
248
+ log.debug(`HistorySetTimeAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
249
+ return Uint8Array.fromHex('');
250
+ },
251
+ HistorySetTimeAttributeSetter: (value, { attributes, endpoint, session }) => {
252
+ log.debug(`HistorySetTimeAttributeSetter ${value.toHex()} ${attributes.HistorySetTime} endpoint: ${endpoint?.name} session: ${session?.name}`);
253
+ return history.OnSetHistorySetTime(value);
254
+ },
255
+ HistoryRequestAttributeGetter: ({ session, isFabricFiltered }) => {
256
+ log.debug(`HistoryRequestAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
257
+ return Uint8Array.fromHex('');
258
+ },
259
+ HistoryRequestAttributeSetter: (value, { attributes, endpoint, session }) => {
260
+ log.debug(`HistoryRequestAttributeSetter ${value.toHex()} ${attributes.HistoryRequest} endpoint: ${endpoint?.name} session: ${session?.name}`);
261
+ return history.OnSetHistoryRequest(value);
262
+ },
263
+ LastEventAttributeGetter: ({ session, isFabricFiltered }) => {
264
+ log.debug(`LastEventAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
265
+ return history.OnGetLastEvent();
266
+ },
267
+ ResetTotalAttributeGetter: ({ session, isFabricFiltered }) => {
268
+ log.debug(`LastResetTotalAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
269
+ return history.OnGetLastReset();
270
+ },
271
+ ResetTotalAttributeSetter: (value, { attributes, endpoint, session }) => {
272
+ log.debug(`LastResetTotalAttributeSetter ${value} ${attributes.ResetTotal} endpoint: ${endpoint?.name} session: ${session?.name}`);
273
+ return history.OnSetLastReset(value);
274
+ },
275
+ }, {}));
276
+ }
277
+ /**
278
+ * Creates a Motion Eve History Cluster Server.
279
+ *
280
+ * @param history - The MatterHistory object.
281
+ * @param log - The AnsiLogger object.
282
+ */
283
+ createMotionEveHistoryClusterServer(history, log) {
284
+ history.setMatterHystoryType('motion');
285
+ this.addClusterServer(ClusterServer(EveHistoryCluster, {
286
+ // Dynamic attributes
287
+ ConfigDataGet: Uint8Array.fromHex(''),
288
+ ConfigDataSet: Uint8Array.fromHex(''),
289
+ HistoryStatus: Uint8Array.fromHex(''),
290
+ HistoryEntries: Uint8Array.fromHex(''),
291
+ HistoryRequest: Uint8Array.fromHex(''),
292
+ HistorySetTime: Uint8Array.fromHex(''),
293
+ LastEvent: 0,
294
+ // Normal attributes
295
+ MotionSensitivity: 0 /* Sensitivity.HIGH */,
296
+ RLoc: 46080,
297
+ }, {
298
+ ConfigDataGetAttributeGetter: ({ session, isFabricFiltered }) => {
299
+ log.debug(`ConfigDataGetAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
300
+ return history.OnGetConfigData(isFabricFiltered);
301
+ },
302
+ ConfigDataSetAttributeGetter: ({ session, isFabricFiltered }) => {
303
+ log.debug(`ConfigDataSetAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
304
+ return Uint8Array.fromHex('');
305
+ },
306
+ ConfigDataSetAttributeSetter: (value, { attributes, endpoint, session }) => {
307
+ log.debug(`ConfigDataSetAttributeSetter [${value.toHex()}] ${attributes.ConfigDataSet} endpoint: ${endpoint?.name} session: ${session?.name}`);
308
+ return history.OnSetConfigData(value);
309
+ },
310
+ HistoryStatusAttributeGetter: ({ session, isFabricFiltered }) => {
311
+ log.debug(`HistoryStatusAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
312
+ return history.OnGetHistoryStatus(isFabricFiltered);
313
+ },
314
+ HistoryEntriesAttributeGetter: ({ session, isFabricFiltered }) => {
315
+ log.debug(`HistoryEntriesAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
316
+ return history.OnGetHistoryEntries();
317
+ },
318
+ HistorySetTimeAttributeGetter: ({ session, isFabricFiltered }) => {
319
+ log.debug(`HistorySetTimeAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
320
+ return Uint8Array.fromHex('');
321
+ },
322
+ HistorySetTimeAttributeSetter: (value, { attributes, endpoint, session }) => {
323
+ log.debug(`HistorySetTimeAttributeSetter ${value.toHex()} ${attributes.HistorySetTime} endpoint: ${endpoint?.name} session: ${session?.name}`);
324
+ return history.OnSetHistorySetTime(value);
325
+ },
326
+ HistoryRequestAttributeGetter: ({ session, isFabricFiltered }) => {
327
+ log.debug(`HistoryRequestAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
328
+ return Uint8Array.fromHex('');
329
+ },
330
+ HistoryRequestAttributeSetter: (value, { attributes, endpoint, session }) => {
331
+ log.debug(`HistoryRequestAttributeSetter ${value.toHex()} ${attributes.HistoryRequest} endpoint: ${endpoint?.name} session: ${session?.name}`);
332
+ return history.OnSetHistoryRequest(value);
333
+ },
334
+ LastEventAttributeGetter: ({ session, isFabricFiltered }) => {
335
+ log.debug(`LastEventAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
336
+ return history.OnGetLastEvent();
337
+ },
338
+ }, {}));
339
+ }
340
+ /**
341
+ * Creates a door EveHistoryCluster server.
342
+ *
343
+ * @param history - The MatterHistory instance.
344
+ * @param log - The AnsiLogger instance.
345
+ */
346
+ createDoorEveHistoryClusterServer(history, log) {
347
+ history.setMatterHystoryType('door');
348
+ this.addClusterServer(ClusterServer(EveHistoryCluster, {
349
+ // Dynamic attributes
350
+ ConfigDataGet: Uint8Array.fromHex(''),
351
+ ConfigDataSet: Uint8Array.fromHex(''),
352
+ HistoryStatus: Uint8Array.fromHex(''),
353
+ HistoryEntries: Uint8Array.fromHex(''),
354
+ HistoryRequest: Uint8Array.fromHex(''),
355
+ HistorySetTime: Uint8Array.fromHex(''),
356
+ TimesOpened: 0,
357
+ LastEvent: 0,
358
+ ResetTotal: 0,
359
+ // Normal attributes
360
+ RLoc: 46080,
361
+ }, {
362
+ ConfigDataGetAttributeGetter: ({ session, isFabricFiltered }) => {
363
+ log.debug(`ConfigDataGetAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
364
+ return history.OnGetConfigData(isFabricFiltered);
365
+ },
366
+ ConfigDataSetAttributeGetter: ({ session, isFabricFiltered }) => {
367
+ log.debug(`ConfigDataSetAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
368
+ return Uint8Array.fromHex('');
369
+ },
370
+ ConfigDataSetAttributeSetter: (value, { attributes, endpoint, session }) => {
371
+ log.debug(`ConfigDataSetAttributeSetter [${value.toHex()}] ${attributes.ConfigDataSet} endpoint: ${endpoint?.name} session: ${session?.name}`);
372
+ return history.OnSetConfigData(value);
373
+ },
374
+ HistoryStatusAttributeGetter: ({ session, isFabricFiltered }) => {
375
+ log.debug(`HistoryStatusAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
376
+ return history.OnGetHistoryStatus(isFabricFiltered);
377
+ },
378
+ HistoryEntriesAttributeGetter: ({ session, isFabricFiltered }) => {
379
+ log.debug(`HistoryEntriesAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
380
+ return history.OnGetHistoryEntries();
381
+ },
382
+ HistorySetTimeAttributeGetter: ({ session, isFabricFiltered }) => {
383
+ log.debug(`HistorySetTimeAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
384
+ return Uint8Array.fromHex('');
385
+ },
386
+ HistorySetTimeAttributeSetter: (value, { attributes, endpoint, session }) => {
387
+ log.debug(`HistorySetTimeAttributeSetter ${value.toHex()} ${attributes.HistorySetTime} endpoint: ${endpoint?.name} session: ${session?.name}`);
388
+ return history.OnSetHistorySetTime(value);
389
+ },
390
+ HistoryRequestAttributeGetter: ({ session, isFabricFiltered }) => {
391
+ log.debug(`HistoryRequestAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
392
+ return Uint8Array.fromHex('');
393
+ },
394
+ HistoryRequestAttributeSetter: (value, { attributes, endpoint, session }) => {
395
+ log.debug(`HistoryRequestAttributeSetter ${value.toHex()} ${attributes.HistoryRequest} endpoint: ${endpoint?.name} session: ${session?.name}`);
396
+ return history.OnSetHistoryRequest(value);
397
+ },
398
+ LastEventAttributeGetter: ({ session, isFabricFiltered }) => {
399
+ log.debug(`LastEventAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
400
+ return history.OnGetLastEvent();
401
+ },
402
+ TimesOpenedAttributeGetter: ({ session, isFabricFiltered }) => {
403
+ log.debug(`TimesOpenedAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
404
+ return history.OnGetimesOpened();
405
+ },
406
+ ResetTotalAttributeGetter: ({ session, isFabricFiltered }) => {
407
+ log.debug(`LastResetTotalAttributeGetter session: ${session?.name} ${isFabricFiltered?.valueOf()}`);
408
+ return history.OnGetLastReset();
409
+ },
410
+ ResetTotalAttributeSetter: (value, { attributes, endpoint, session }) => {
411
+ log.debug(`LastResetTotalAttributeSetter ${value} ${attributes.ResetTotal} endpoint: ${endpoint?.name} session: ${session?.name}`);
412
+ return history.OnSetLastReset(value);
413
+ },
414
+ }, {}));
415
+ }
416
+ /**
417
+ * Creates a default IdentifyCluster server.
418
+ */
47
419
  createDefaultIdentifyClusterServer() {
48
420
  this.addClusterServer(ClusterServer(IdentifyCluster, {
49
421
  identifyTime: 0,
50
422
  identifyType: Identify.IdentifyType.None,
51
423
  }, {
52
424
  identify: async (data) => {
53
- console.log('*Identify');
425
+ // eslint-disable-next-line no-console
426
+ console.log('Identify');
54
427
  await this.commandHandler.executeHandler('identify', data);
55
428
  },
56
429
  }));
57
430
  }
431
+ /**
432
+ * Creates a default groups cluster server and adds it to the device.
433
+ */
58
434
  createDefaultGroupsClusterServer() {
59
435
  this.addClusterServer(createDefaultGroupsClusterServer());
60
436
  }
437
+ /**
438
+ * Creates a default scenes cluster server and adds it to the current instance.
439
+ */
61
440
  createDefaultScenesClusterServer() {
62
441
  this.addClusterServer(createDefaultScenesClusterServer());
63
442
  }
64
- createDefaultBridgedDeviceBasicInformationClusterServer(deviceName, uniqueId, vendorId, vendorName, productName) {
65
- this.addClusterServer(ClusterServer(BridgedDeviceBasicInformationCluster, {
66
- vendorId: vendorId !== undefined ? VendorId(vendorId) : undefined, // 4874
67
- vendorName: vendorName,
68
- productName: productName,
69
- productLabel: deviceName,
70
- nodeLabel: deviceName,
71
- serialNumber: uniqueId,
72
- uniqueId: uniqueId,
73
- softwareVersion: 1,
74
- softwareVersionString: 'v.1.0',
75
- hardwareVersion: 1,
76
- hardwareVersionString: 'v.1.0',
77
- reachable: true,
78
- }, {}, {
79
- reachableChanged: true,
80
- }));
443
+ /**
444
+ * Creates a unique identifier based on the provided parameters.
445
+ * @param param1 - The first parameter.
446
+ * @param param2 - The second parameter.
447
+ * @param param3 - The third parameter.
448
+ * @param param4 - The fourth parameter.
449
+ * @returns A unique identifier generated using the MD5 hash algorithm.
450
+ */
451
+ createUniqueId(param1, param2, param3, param4) {
452
+ const hash = createHash('md5');
453
+ hash.update(param1 + param2 + param3 + param4);
454
+ return hash.digest('hex');
81
455
  }
82
- createDefaultBasicInformationClusterServer(deviceName, uniqueId, vendorId, vendorName, productId, productName) {
456
+ /**
457
+ * Creates a default Basic Information Cluster Server.
458
+ *
459
+ * @param deviceName - The name of the device.
460
+ * @param serialNumber - The serial number of the device.
461
+ * @param vendorId - The vendor ID of the device.
462
+ * @param vendorName - The vendor name of the device.
463
+ * @param productId - The product ID of the device.
464
+ * @param productName - The product name of the device.
465
+ * @param softwareVersion - The software version of the device. Default is 1.
466
+ * @param softwareVersionString - The software version string of the device. Default is 'v.1.0.0'.
467
+ * @param hardwareVersion - The hardware version of the device. Default is 1.
468
+ * @param hardwareVersionString - The hardware version string of the device. Default is 'v.1.0.0'.
469
+ */
470
+ createDefaultBasicInformationClusterServer(deviceName, serialNumber, vendorId, vendorName, productId, productName, softwareVersion = 1, softwareVersionString = 'v.1.0.0', hardwareVersion = 1, hardwareVersionString = 'v.1.0.0') {
83
471
  this.addClusterServer(ClusterServer(BasicInformationCluster, {
84
472
  dataModelRevision: 1,
473
+ location: 'XX',
85
474
  vendorId: VendorId(vendorId),
86
475
  vendorName: vendorName,
87
476
  productId: productId,
88
477
  productName: productName,
89
478
  productLabel: deviceName,
90
479
  nodeLabel: deviceName,
91
- location: 'XX',
92
- hardwareVersion: 1,
93
- hardwareVersionString: 'v.1.0',
94
- softwareVersion: 1,
95
- softwareVersionString: 'v.1.0',
96
- serialNumber: uniqueId,
97
- uniqueId: uniqueId,
480
+ serialNumber,
481
+ uniqueId: this.createUniqueId(deviceName, serialNumber, vendorName, productName),
482
+ softwareVersion,
483
+ softwareVersionString,
484
+ hardwareVersion,
485
+ hardwareVersionString,
486
+ reachable: true,
98
487
  capabilityMinima: { caseSessionsPerFabric: 3, subscriptionsPerFabric: 3 },
99
488
  }, {}, {
100
489
  startUp: true,
@@ -103,6 +492,61 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
103
492
  reachableChanged: true,
104
493
  }));
105
494
  }
495
+ /**
496
+ * Creates a default BridgedDeviceBasicInformationClusterServer.
497
+ *
498
+ * @param deviceName - The name of the device.
499
+ * @param serialNumber - The serial number of the device.
500
+ * @param vendorId - The vendor ID of the device.
501
+ * @param vendorName - The name of the vendor.
502
+ * @param productName - The name of the product.
503
+ * @param softwareVersion - The software version of the device. Default is 1.
504
+ * @param softwareVersionString - The software version string of the device. Default is 'v.1.0.0'.
505
+ * @param hardwareVersion - The hardware version of the device. Default is 1.
506
+ * @param hardwareVersionString - The hardware version string of the device. Default is 'v.1.0.0'.
507
+ */
508
+ createDefaultBridgedDeviceBasicInformationClusterServer(deviceName, serialNumber, vendorId, vendorName, productName, softwareVersion = 1, softwareVersionString = 'v.1.0.0', hardwareVersion = 1, hardwareVersionString = 'v.1.0.0') {
509
+ this.addClusterServer(ClusterServer(BridgedDeviceBasicInformationCluster, {
510
+ vendorId: vendorId !== undefined ? VendorId(vendorId) : undefined, // 4874
511
+ vendorName: vendorName,
512
+ productName: productName,
513
+ productLabel: deviceName,
514
+ nodeLabel: deviceName,
515
+ serialNumber,
516
+ uniqueId: this.createUniqueId(deviceName, serialNumber, vendorName, productName),
517
+ softwareVersion,
518
+ softwareVersionString,
519
+ hardwareVersion,
520
+ hardwareVersionString,
521
+ reachable: true,
522
+ }, {}, {
523
+ reachableChanged: true,
524
+ }));
525
+ }
526
+ /**
527
+ * Creates a default Electrical Measurement Cluster Server.
528
+ *
529
+ * @param voltage - The RMS voltage value.
530
+ * @param current - The RMS current value.
531
+ * @param power - The active power value.
532
+ * @param consumption - The total active power consumption value.
533
+ */
534
+ createDefaultElectricalMeasurementClusterServer(voltage = 0, current = 0, power = 0, consumption = 0) {
535
+ this.addClusterServer(ClusterServer(ElectricalMeasurementCluster, {
536
+ rmsVoltage: voltage,
537
+ rmsCurrent: current,
538
+ activePower: power,
539
+ totalActivePower: consumption,
540
+ }, {}, {}));
541
+ }
542
+ /**
543
+ * Creates a default Thread Network Diagnostics Cluster server.
544
+ *
545
+ * @remarks
546
+ * This method adds a cluster server used only to give the networkName to Eve app.
547
+ *
548
+ * @returns void
549
+ */
106
550
  createDefaultThreadNetworkDiagnosticsClusterServer() {
107
551
  this.addClusterServer(ClusterServer(ThreadNetworkDiagnosticsCluster.with(ThreadNetworkDiagnostics.Feature.PacketCounts, ThreadNetworkDiagnostics.Feature.ErrorCounts), {
108
552
  channel: 1,
@@ -125,36 +569,50 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
125
569
  activeNetworkFaults: [],
126
570
  }, {
127
571
  resetCounts: async (data) => {
572
+ // eslint-disable-next-line no-console
128
573
  console.log('resetCounts');
129
574
  await this.commandHandler.executeHandler('resetCounts', data);
130
575
  },
131
576
  }, {}));
132
577
  }
578
+ /**
579
+ * Creates a default OnOff cluster server.
580
+ *
581
+ * @param onOff - The initial state of the OnOff cluster (default: false).
582
+ */
133
583
  createDefaultOnOffClusterServer(onOff = false) {
134
584
  this.addClusterServer(ClusterServer(OnOffCluster, {
135
585
  onOff,
136
586
  }, {
137
587
  on: async (data) => {
138
- console.log('*on');
588
+ // eslint-disable-next-line no-console
589
+ console.log('on');
139
590
  await this.commandHandler.executeHandler('on', data);
140
591
  },
141
592
  off: async (data) => {
142
- console.log('*off');
593
+ // eslint-disable-next-line no-console
594
+ console.log('off');
143
595
  await this.commandHandler.executeHandler('off', data);
144
596
  },
145
597
  toggle: async (data) => {
146
- console.log('*toggle');
598
+ // eslint-disable-next-line no-console
599
+ console.log('toggle');
147
600
  await this.commandHandler.executeHandler('toggle', data);
148
601
  },
149
602
  }, {}));
150
603
  }
604
+ /**
605
+ * Creates a default window covering cluster server.
606
+ *
607
+ * @param positionPercent100ths - The position percentage in 100ths (0-10000). Defaults to 0.
608
+ */
151
609
  createDefaultWindowCoveringClusterServer(positionPercent100ths) {
152
610
  this.addClusterServer(ClusterServer(WindowCoveringCluster.with(WindowCovering.Feature.Lift, WindowCovering.Feature.PositionAwareLift), {
153
611
  type: WindowCovering.WindowCoveringType.Shutter,
154
612
  configStatus: {
155
613
  operational: true,
156
614
  onlineReserved: false,
157
- liftMovementReversed: true,
615
+ liftMovementReversed: false,
158
616
  liftPositionAware: true,
159
617
  tiltPositionAware: false,
160
618
  liftEncoderControlled: false,
@@ -167,28 +625,33 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
167
625
  currentPositionLiftPercent100ths: positionPercent100ths ?? 0, // 0 Fully open 10000 fully closed
168
626
  }, {
169
627
  upOrOpen: async (data) => {
170
- console.log('*upOrOpen');
628
+ // eslint-disable-next-line no-console
629
+ console.log('upOrOpen');
171
630
  await this.commandHandler.executeHandler('upOrOpen', data);
172
631
  },
173
632
  downOrClose: async (data) => {
174
- console.log('*downOrClose');
633
+ // eslint-disable-next-line no-console
634
+ console.log('downOrClose');
175
635
  await this.commandHandler.executeHandler('downOrClose', data);
176
636
  },
177
637
  stopMotion: async (data) => {
178
- console.log('*stopMotion');
638
+ // eslint-disable-next-line no-console
639
+ console.log('stopMotion');
179
640
  await this.commandHandler.executeHandler('stopMotion', data);
180
641
  },
181
642
  goToLiftPercentage: async (data) => {
182
- console.log(`*goToLiftPercentage: ${data.request.liftPercent100thsValue} current: ${data.attributes.currentPositionLiftPercent100ths?.getLocal()} ` +
183
- `target: ${data.attributes.targetPositionLiftPercent100ths?.getLocal()}`);
184
- data.attributes.currentPositionLiftPercent100ths?.setLocal(data.request.liftPercent100thsValue);
185
- data.attributes.targetPositionLiftPercent100ths?.setLocal(data.request.liftPercent100thsValue);
186
- console.log(`*goToLiftPercentage: ${data.request.liftPercent100thsValue} current: ${data.attributes.currentPositionLiftPercent100ths?.getLocal()} ` +
643
+ // eslint-disable-next-line no-console
644
+ console.log(`goToLiftPercentage: ${data.request.liftPercent100thsValue} current: ${data.attributes.currentPositionLiftPercent100ths?.getLocal()} ` +
187
645
  `target: ${data.attributes.targetPositionLiftPercent100ths?.getLocal()}`);
188
646
  await this.commandHandler.executeHandler('goToLiftPercentage', data);
189
647
  },
190
648
  }, {}));
191
649
  }
650
+ /**
651
+ * Creates a default occupancy sensing cluster server.
652
+ *
653
+ * @param occupied - A boolean indicating whether the occupancy is occupied or not. Default is false.
654
+ */
192
655
  createDefaultOccupancySensingClusterServer(occupied = false) {
193
656
  this.addClusterServer(ClusterServer(OccupancySensingCluster, {
194
657
  occupancy: { occupied },
@@ -197,6 +660,11 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
197
660
  pirOccupiedToUnoccupiedDelay: 30,
198
661
  }, {}));
199
662
  }
663
+ /**
664
+ * Creates a default Illuminance Measurement Cluster Server.
665
+ *
666
+ * @param measuredValue - The measured value of illuminance.
667
+ */
200
668
  createDefaultIlluminanceMeasurementClusterServer(measuredValue = 0) {
201
669
  this.addClusterServer(ClusterServer(IlluminanceMeasurementCluster, {
202
670
  measuredValue,
@@ -205,6 +673,11 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
205
673
  tolerance: 0,
206
674
  }, {}, {}));
207
675
  }
676
+ /**
677
+ * Creates a default temperature measurement cluster server.
678
+ *
679
+ * @param measuredValue - The measured value of the temperature.
680
+ */
208
681
  createDefaultTemperatureMeasurementClusterServer(measuredValue = 0) {
209
682
  this.addClusterServer(ClusterServer(TemperatureMeasurementCluster, {
210
683
  measuredValue,
@@ -213,6 +686,11 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
213
686
  tolerance: 0,
214
687
  }, {}, {}));
215
688
  }
689
+ /**
690
+ * Creates a default RelativeHumidityMeasurementCluster server.
691
+ *
692
+ * @param measuredValue - The measured value of the relative humidity.
693
+ */
216
694
  createDefaultRelativeHumidityMeasurementClusterServer(measuredValue = 0) {
217
695
  this.addClusterServer(ClusterServer(RelativeHumidityMeasurementCluster, {
218
696
  measuredValue,
@@ -221,7 +699,12 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
221
699
  tolerance: 0,
222
700
  }, {}, {}));
223
701
  }
224
- createDefaultPressureMeasurementClusterServer(measuredValue = 0) {
702
+ /**
703
+ * Creates a default Pressure Measurement Cluster Server.
704
+ *
705
+ * @param measuredValue - The measured value for the pressure.
706
+ */
707
+ createDefaultPressureMeasurementClusterServer(measuredValue = 1000) {
225
708
  this.addClusterServer(ClusterServer(PressureMeasurementCluster, {
226
709
  measuredValue,
227
710
  minMeasuredValue: null,
@@ -229,6 +712,11 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
229
712
  tolerance: 0,
230
713
  }, {}, {}));
231
714
  }
715
+ /**
716
+ * Creates a default boolean state cluster server.
717
+ *
718
+ * @param contact - Optional boolean value indicating the contact state. Defaults to `true` if not provided.
719
+ */
232
720
  createDefaultBooleanStateClusterServer(contact) {
233
721
  this.addClusterServer(ClusterServer(BooleanStateCluster, {
234
722
  stateValue: contact ?? true, // true=contact false=no_contact
@@ -236,7 +724,16 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
236
724
  stateChange: true,
237
725
  }));
238
726
  }
239
- createDefaultPowerSourceReplaceableBatteryClusterServer(batPercentRemaining = 100, batChargeLevel = PowerSource.BatChargeLevel.Ok, batVoltage = 1500) {
727
+ /**
728
+ * Creates a default power source replaceable battery cluster server.
729
+ *
730
+ * @param batPercentRemaining - The remaining battery percentage (default: 100).
731
+ * @param batChargeLevel - The battery charge level (default: PowerSource.BatChargeLevel.Ok).
732
+ * @param batVoltage - The battery voltage (default: 1500).
733
+ * @param batReplacementDescription - The battery replacement description (default: 'Battery type').
734
+ * @param batQuantity - The battery quantity (default: 1).
735
+ */
736
+ createDefaultPowerSourceReplaceableBatteryClusterServer(batPercentRemaining = 100, batChargeLevel = PowerSource.BatChargeLevel.Ok, batVoltage = 1500, batReplacementDescription = 'Battery type', batQuantity = 1) {
240
737
  this.addClusterServer(ClusterServer(PowerSourceCluster.with(PowerSource.Feature.Battery, PowerSource.Feature.Replaceable), {
241
738
  status: PowerSource.PowerSourceStatus.Active,
242
739
  order: 0,
@@ -247,10 +744,17 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
247
744
  batReplacementNeeded: false,
248
745
  batReplaceability: PowerSource.BatReplaceability.UserReplaceable,
249
746
  activeBatFaults: undefined,
250
- batReplacementDescription: 'AA battery',
251
- batQuantity: 1,
747
+ batReplacementDescription,
748
+ batQuantity,
252
749
  }, {}, {}));
253
750
  }
751
+ /**
752
+ * Creates a default power source rechargeable battery cluster server.
753
+ *
754
+ * @param batPercentRemaining - The remaining battery percentage (default: 100).
755
+ * @param batChargeLevel - The battery charge level (default: PowerSource.BatChargeLevel.Ok).
756
+ * @param batVoltage - The battery voltage (default: 1500).
757
+ */
254
758
  createDefaultPowerSourceRechargableBatteryClusterServer(batPercentRemaining = 100, batChargeLevel = PowerSource.BatChargeLevel.Ok, batVoltage = 1500) {
255
759
  this.addClusterServer(ClusterServer(PowerSourceCluster.with(PowerSource.Feature.Battery, PowerSource.Feature.Rechargeable), {
256
760
  status: PowerSource.PowerSourceStatus.Active,
@@ -267,6 +771,11 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
267
771
  batFunctionalWhileCharging: true,
268
772
  }, {}, {}));
269
773
  }
774
+ /**
775
+ * Creates a default power source wired cluster server.
776
+ *
777
+ * @param wiredCurrentType - The type of wired current (default: PowerSource.WiredCurrentType.Ac)
778
+ */
270
779
  createDefaultPowerSourceWiredClusterServer(wiredCurrentType = PowerSource.WiredCurrentType.Ac) {
271
780
  this.addClusterServer(ClusterServer(PowerSourceCluster.with(PowerSource.Feature.Wired), {
272
781
  wiredCurrentType,
@@ -275,14 +784,41 @@ export class MatterbridgeDevice extends extendPublicHandlerMethods(Device) {
275
784
  order: 0,
276
785
  }, {}, {}));
277
786
  }
787
+ /**
788
+ * Creates a default power source configuration cluster server.
789
+ *
790
+ * @remarks
791
+ * The endpoint at this time is only known for Accessory Platforms.
792
+ * Don't use it in Dynamic Platforms.
793
+ *
794
+ *
795
+ * @param endpointNumber - The endpoint number where to find the PowerSourceCluster.
796
+ */
278
797
  createDefaultPowerSourceConfigurationClusterServer(endpointNumber) {
279
798
  this.addClusterServer(ClusterServer(PowerSourceConfigurationCluster, {
280
799
  sources: [EndpointNumber(endpointNumber)],
281
800
  }, {}, {}));
282
801
  }
283
- createDefaultAirQualityClusterServer() {
802
+ /**
803
+ * Creates a default air quality cluster server.
804
+ *
805
+ * @param airQuality The air quality type. Defaults to `AirQuality.AirQualityType.Unknown`.
806
+ */
807
+ createDefaultAirQualityClusterServer(airQuality = AirQuality.AirQualityType.Unknown) {
284
808
  this.addClusterServer(ClusterServer(AirQualityCluster.with(AirQuality.Feature.FairAirQuality, AirQuality.Feature.ModerateAirQuality, AirQuality.Feature.VeryPoorAirQuality), {
285
- airQuality: AirQuality.AirQualityType.Good,
809
+ airQuality,
810
+ }, {}, {}));
811
+ }
812
+ /**
813
+ * Creates a default TVOC measurement cluster server.
814
+ *
815
+ * @param measuredValue - The measured value for TVOC.
816
+ */
817
+ createDefaultTvocMeasurementClusterServer(measuredValue = 0) {
818
+ this.addClusterServer(ClusterServer(TvocMeasurementCluster.with(TvocMeasurement.Feature.NumericMeasurement), {
819
+ measuredValue,
820
+ minMeasuredValue: null,
821
+ maxMeasuredValue: null,
286
822
  }, {}, {}));
287
823
  }
288
824
  }