@matterbridge/core 3.8.1-dev-20260608-9dc483f → 3.8.1-dev-20260609-37884d6

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.
@@ -1,6 +1,4 @@
1
- import { SoilMeasurementServer } from '@matter/node/behaviors/soil-measurement';
2
1
  import { SoilMeasurement } from '@matter/types/clusters/soil-measurement';
3
- import { MeasurementType } from '@matter/types/globals';
4
2
  import { powerSource, soilSensor } from '../matterbridgeDeviceTypes.js';
5
3
  import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
6
4
  export class SoilSensor extends MatterbridgeEndpoint {
@@ -14,16 +12,7 @@ export class SoilSensor extends MatterbridgeEndpoint {
14
12
  else {
15
13
  this.createDefaultPowerSourceWiredClusterServer();
16
14
  }
17
- this.behaviors.require(SoilMeasurementServer, {
18
- soilMoistureMeasurementLimits: options.soilMoistureMeasurementLimits ?? {
19
- measurementType: MeasurementType.SoilMoisture,
20
- measured: true,
21
- minMeasuredValue: 0,
22
- maxMeasuredValue: 100,
23
- accuracyRanges: [{ rangeMin: 0, rangeMax: 100, fixedMax: 1 }],
24
- },
25
- soilMoistureMeasuredValue: options.soilMoistureMeasuredValue ?? null,
26
- });
15
+ this.createDefaultSoilMeasurementClusterServer(options.soilMoistureMeasuredValue, options.soilMoistureMeasurementLimits);
27
16
  if (options.temperatureMeasuredValue !== undefined)
28
17
  this.createDefaultTemperatureMeasurementClusterServer(options.temperatureMeasuredValue);
29
18
  }
@@ -26,8 +26,11 @@ export interface DeviceTypeDefinition {
26
26
  optionalServerClusters: ClusterId[];
27
27
  requiredClientClusters: ClusterId[];
28
28
  optionalClientClusters: ClusterId[];
29
+ requiredDeviceTypes?: DeviceTypeDefinition[];
30
+ requiredServerClustersOneOf?: ClusterId[];
31
+ composedOf?: DeviceTypeDefinition[];
29
32
  }
30
- export declare const DeviceTypeDefinition: ({ name, deviceName, code, deviceClass, deviceScope, revision, requiredServerClusters, optionalServerClusters, requiredClientClusters, optionalClientClusters, }: {
33
+ export declare const DeviceTypeDefinition: ({ name, deviceName, code, deviceClass, deviceScope, revision, requiredServerClusters, optionalServerClusters, requiredClientClusters, optionalClientClusters, requiredDeviceTypes, requiredServerClustersOneOf, composedOf, }: {
31
34
  name: string;
32
35
  deviceName: string;
33
36
  code: number;
@@ -38,12 +41,15 @@ export declare const DeviceTypeDefinition: ({ name, deviceName, code, deviceClas
38
41
  optionalServerClusters?: ClusterId[];
39
42
  requiredClientClusters?: ClusterId[];
40
43
  optionalClientClusters?: ClusterId[];
44
+ requiredDeviceTypes?: DeviceTypeDefinition[];
45
+ requiredServerClustersOneOf?: ClusterId[];
46
+ composedOf?: DeviceTypeDefinition[];
41
47
  }) => DeviceTypeDefinition;
42
- export declare const baseDevice: DeviceTypeDefinition;
48
+ export declare const baseDeviceType: DeviceTypeDefinition;
43
49
  export declare const rootNode: DeviceTypeDefinition;
44
50
  export declare const powerSource: DeviceTypeDefinition;
45
- export declare const OTARequestor: DeviceTypeDefinition;
46
- export declare const OTAProvider: DeviceTypeDefinition;
51
+ export declare const otaRequestor: DeviceTypeDefinition;
52
+ export declare const otaProvider: DeviceTypeDefinition;
47
53
  export declare const bridgedNode: DeviceTypeDefinition;
48
54
  export declare const electricalSensor: DeviceTypeDefinition;
49
55
  export declare const deviceEnergyManagement: DeviceTypeDefinition;
@@ -51,16 +57,26 @@ export declare const onOffLight: DeviceTypeDefinition;
51
57
  export declare const dimmableLight: DeviceTypeDefinition;
52
58
  export declare const colorTemperatureLight: DeviceTypeDefinition;
53
59
  export declare const extendedColorLight: DeviceTypeDefinition;
60
+ export declare const onOffPluginUnit: DeviceTypeDefinition;
54
61
  export declare const onOffOutlet: DeviceTypeDefinition;
62
+ export declare const dimmablePluginUnit: DeviceTypeDefinition;
55
63
  export declare const dimmableOutlet: DeviceTypeDefinition;
64
+ export declare const mountedOnOffControl: DeviceTypeDefinition;
56
65
  export declare const onOffMountedSwitch: DeviceTypeDefinition;
66
+ export declare const mountedDimmableLoadControl: DeviceTypeDefinition;
57
67
  export declare const dimmableMountedSwitch: DeviceTypeDefinition;
68
+ export declare const pump: DeviceTypeDefinition;
58
69
  export declare const pumpDevice: DeviceTypeDefinition;
59
70
  export declare const waterValve: DeviceTypeDefinition;
60
71
  export declare const irrigationSystem: DeviceTypeDefinition;
72
+ export declare const onOffLightSwitch: DeviceTypeDefinition;
61
73
  export declare const onOffSwitch: DeviceTypeDefinition;
74
+ export declare const dimmerSwitch: DeviceTypeDefinition;
62
75
  export declare const dimmableSwitch: DeviceTypeDefinition;
76
+ export declare const colorDimmerSwitch: DeviceTypeDefinition;
63
77
  export declare const colorTemperatureSwitch: DeviceTypeDefinition;
78
+ export declare const controlBridge: DeviceTypeDefinition;
79
+ export declare const pumpController: DeviceTypeDefinition;
64
80
  export declare const genericSwitch: DeviceTypeDefinition;
65
81
  export declare const contactSensor: DeviceTypeDefinition;
66
82
  export declare const lightSensor: DeviceTypeDefinition;
@@ -69,29 +85,42 @@ export declare const temperatureSensor: DeviceTypeDefinition;
69
85
  export declare const pressureSensor: DeviceTypeDefinition;
70
86
  export declare const flowSensor: DeviceTypeDefinition;
71
87
  export declare const humiditySensor: DeviceTypeDefinition;
88
+ export declare const onOffSensor: DeviceTypeDefinition;
72
89
  export declare const smokeCoAlarm: DeviceTypeDefinition;
73
90
  export declare const airQualitySensor: DeviceTypeDefinition;
74
91
  export declare const waterFreezeDetector: DeviceTypeDefinition;
75
92
  export declare const waterLeakDetector: DeviceTypeDefinition;
76
93
  export declare const rainSensor: DeviceTypeDefinition;
77
94
  export declare const soilSensor: DeviceTypeDefinition;
95
+ export declare const doorLock: DeviceTypeDefinition;
78
96
  export declare const doorLockDevice: DeviceTypeDefinition;
97
+ export declare const doorLockController: DeviceTypeDefinition;
98
+ export declare const windowCovering: DeviceTypeDefinition;
79
99
  export declare const coverDevice: DeviceTypeDefinition;
100
+ export declare const windowCoveringController: DeviceTypeDefinition;
80
101
  export declare const closure: DeviceTypeDefinition;
81
102
  export declare const closurePanel: DeviceTypeDefinition;
82
103
  export declare const closureController: DeviceTypeDefinition;
104
+ export declare const thermostat: DeviceTypeDefinition;
83
105
  export declare const thermostatDevice: DeviceTypeDefinition;
106
+ export declare const fan: DeviceTypeDefinition;
84
107
  export declare const fanDevice: DeviceTypeDefinition;
85
108
  export declare const airPurifier: DeviceTypeDefinition;
109
+ export declare const thermostatController: DeviceTypeDefinition;
86
110
  export declare const basicVideoPlayer: DeviceTypeDefinition;
87
111
  export declare const castingVideoPlayer: DeviceTypeDefinition;
112
+ export declare const speaker: DeviceTypeDefinition;
88
113
  export declare const speakerDevice: DeviceTypeDefinition;
114
+ export declare const contentApp: DeviceTypeDefinition;
115
+ export declare const castingVideoClient: DeviceTypeDefinition;
116
+ export declare const videoRemoteControl: DeviceTypeDefinition;
89
117
  export declare const modeSelect: DeviceTypeDefinition;
90
118
  export declare const aggregator: DeviceTypeDefinition;
91
119
  export declare const bridge: DeviceTypeDefinition;
92
120
  export declare const roboticVacuumCleaner: DeviceTypeDefinition;
93
121
  export declare const laundryWasher: DeviceTypeDefinition;
94
122
  export declare const refrigerator: DeviceTypeDefinition;
123
+ export declare const roomAirConditioner: DeviceTypeDefinition;
95
124
  export declare const airConditioner: DeviceTypeDefinition;
96
125
  export declare const temperatureControlledCabinetCooler: DeviceTypeDefinition;
97
126
  export declare const temperatureControlledCabinetHeater: DeviceTypeDefinition;
@@ -5,6 +5,7 @@ import { Actions } from '@matter/types/clusters/actions';
5
5
  import { ActivatedCarbonFilterMonitoring } from '@matter/types/clusters/activated-carbon-filter-monitoring';
6
6
  import { AdministratorCommissioning } from '@matter/types/clusters/administrator-commissioning';
7
7
  import { AirQuality } from '@matter/types/clusters/air-quality';
8
+ import { ApplicationBasic } from '@matter/types/clusters/application-basic';
8
9
  import { ApplicationLauncher } from '@matter/types/clusters/application-launcher';
9
10
  import { AudioOutput } from '@matter/types/clusters/audio-output';
10
11
  import { Binding } from '@matter/types/clusters/binding';
@@ -24,6 +25,7 @@ import { CommissionerControl } from '@matter/types/clusters/commissioner-control
24
25
  import { CommodityMetering } from '@matter/types/clusters/commodity-metering';
25
26
  import { CommodityPrice } from '@matter/types/clusters/commodity-price';
26
27
  import { CommodityTariff } from '@matter/types/clusters/commodity-tariff';
28
+ import { ContentAppObserver } from '@matter/types/clusters/content-app-observer';
27
29
  import { ContentControl } from '@matter/types/clusters/content-control';
28
30
  import { ContentLauncher } from '@matter/types/clusters/content-launcher';
29
31
  import { Descriptor } from '@matter/types/clusters/descriptor';
@@ -125,7 +127,7 @@ export var DeviceScopes;
125
127
  DeviceScopes["Endpoint"] = "endpoint";
126
128
  DeviceScopes["Node"] = "node";
127
129
  })(DeviceScopes || (DeviceScopes = {}));
128
- export const DeviceTypeDefinition = ({ name, deviceName, code, deviceClass, deviceScope, revision, requiredServerClusters = [], optionalServerClusters = [], requiredClientClusters = [], optionalClientClusters = [], }) => ({
130
+ export const DeviceTypeDefinition = ({ name, deviceName, code, deviceClass, deviceScope, revision, requiredServerClusters = [], optionalServerClusters = [], requiredClientClusters = [], optionalClientClusters = [], requiredDeviceTypes = [], requiredServerClustersOneOf = [], composedOf = [], }) => ({
129
131
  name,
130
132
  deviceName,
131
133
  code: DeviceTypeId(code),
@@ -136,9 +138,12 @@ export const DeviceTypeDefinition = ({ name, deviceName, code, deviceClass, devi
136
138
  optionalServerClusters,
137
139
  requiredClientClusters,
138
140
  optionalClientClusters,
141
+ requiredDeviceTypes,
142
+ requiredServerClustersOneOf,
143
+ composedOf,
139
144
  });
140
- export const baseDevice = DeviceTypeDefinition({
141
- name: 'MA-baseDevice',
145
+ export const baseDeviceType = DeviceTypeDefinition({
146
+ name: 'MA-baseDeviceType',
142
147
  deviceName: 'Base Device Type',
143
148
  code: 0x0000,
144
149
  deviceClass: DeviceClasses.Simple,
@@ -156,6 +161,8 @@ export const rootNode = DeviceTypeDefinition({
156
161
  revision: 4,
157
162
  requiredServerClusters: [],
158
163
  optionalServerClusters: [],
164
+ requiredClientClusters: [],
165
+ optionalClientClusters: [],
159
166
  });
160
167
  export const powerSource = DeviceTypeDefinition({
161
168
  name: 'MA-powerSource',
@@ -167,8 +174,8 @@ export const powerSource = DeviceTypeDefinition({
167
174
  requiredServerClusters: [PowerSource.id],
168
175
  optionalServerClusters: [],
169
176
  });
170
- export const OTARequestor = DeviceTypeDefinition({
171
- name: 'MA-OTARequestor',
177
+ export const otaRequestor = DeviceTypeDefinition({
178
+ name: 'MA-otaRequestor',
172
179
  deviceName: 'OTA Requestor',
173
180
  code: 0x0012,
174
181
  deviceClass: DeviceClasses.Utility,
@@ -179,8 +186,8 @@ export const OTARequestor = DeviceTypeDefinition({
179
186
  requiredClientClusters: [OtaSoftwareUpdateProvider.id],
180
187
  optionalClientClusters: [],
181
188
  });
182
- export const OTAProvider = DeviceTypeDefinition({
183
- name: 'MA-OTAProvider',
189
+ export const otaProvider = DeviceTypeDefinition({
190
+ name: 'MA-otaProvider',
184
191
  deviceName: 'OTA Provider',
185
192
  code: 0x0014,
186
193
  deviceClass: DeviceClasses.Utility,
@@ -210,6 +217,7 @@ export const electricalSensor = DeviceTypeDefinition({
210
217
  revision: 1,
211
218
  requiredServerClusters: [PowerTopology.id],
212
219
  optionalServerClusters: [ElectricalPowerMeasurement.id, ElectricalEnergyMeasurement.id],
220
+ requiredServerClustersOneOf: [ElectricalPowerMeasurement.id, ElectricalEnergyMeasurement.id],
213
221
  });
214
222
  export const deviceEnergyManagement = DeviceTypeDefinition({
215
223
  name: 'MA-deviceEnergyManagement',
@@ -224,7 +232,7 @@ export const deviceEnergyManagement = DeviceTypeDefinition({
224
232
  optionalClientClusters: [ElectricalGridConditions.id],
225
233
  });
226
234
  export const onOffLight = DeviceTypeDefinition({
227
- name: 'MA-onofflight',
235
+ name: 'MA-onOffLight',
228
236
  deviceName: 'OnOff Light',
229
237
  code: 0x0100,
230
238
  deviceClass: DeviceClasses.Simple,
@@ -236,7 +244,7 @@ export const onOffLight = DeviceTypeDefinition({
236
244
  optionalClientClusters: [OccupancySensing.id],
237
245
  });
238
246
  export const dimmableLight = DeviceTypeDefinition({
239
- name: 'MA-dimmablelight',
247
+ name: 'MA-dimmableLight',
240
248
  deviceName: 'Dimmable Light',
241
249
  code: 0x0101,
242
250
  deviceClass: DeviceClasses.Simple,
@@ -248,7 +256,7 @@ export const dimmableLight = DeviceTypeDefinition({
248
256
  optionalClientClusters: [OccupancySensing.id],
249
257
  });
250
258
  export const colorTemperatureLight = DeviceTypeDefinition({
251
- name: 'MA-colortemperaturelight',
259
+ name: 'MA-colorTemperatureLight',
252
260
  deviceName: 'Color Temperature Light',
253
261
  code: 0x010c,
254
262
  deviceClass: DeviceClasses.Simple,
@@ -260,7 +268,7 @@ export const colorTemperatureLight = DeviceTypeDefinition({
260
268
  optionalClientClusters: [OccupancySensing.id],
261
269
  });
262
270
  export const extendedColorLight = DeviceTypeDefinition({
263
- name: 'MA-extendedcolorlight',
271
+ name: 'MA-extendedColorLight',
264
272
  deviceName: 'Extended Color Light',
265
273
  code: 0x010d,
266
274
  deviceClass: DeviceClasses.Simple,
@@ -271,8 +279,8 @@ export const extendedColorLight = DeviceTypeDefinition({
271
279
  requiredClientClusters: [],
272
280
  optionalClientClusters: [OccupancySensing.id],
273
281
  });
274
- export const onOffOutlet = DeviceTypeDefinition({
275
- name: 'MA-onoffpluginunit',
282
+ export const onOffPluginUnit = DeviceTypeDefinition({
283
+ name: 'MA-onOffPluginUnit',
276
284
  deviceName: 'OnOff Plugin Unit',
277
285
  code: 0x010a,
278
286
  deviceClass: DeviceClasses.Simple,
@@ -283,9 +291,10 @@ export const onOffOutlet = DeviceTypeDefinition({
283
291
  requiredClientClusters: [],
284
292
  optionalClientClusters: [OccupancySensing.id],
285
293
  });
286
- export const dimmableOutlet = DeviceTypeDefinition({
287
- name: 'MA-dimmablepluginunit',
288
- deviceName: 'Dimmable PlugIn Unit',
294
+ export const onOffOutlet = onOffPluginUnit;
295
+ export const dimmablePluginUnit = DeviceTypeDefinition({
296
+ name: 'MA-dimmablePluginUnit',
297
+ deviceName: 'Dimmable Plugin Unit',
289
298
  code: 0x010b,
290
299
  deviceClass: DeviceClasses.Simple,
291
300
  deviceScope: DeviceScopes.Endpoint,
@@ -295,8 +304,9 @@ export const dimmableOutlet = DeviceTypeDefinition({
295
304
  requiredClientClusters: [],
296
305
  optionalClientClusters: [OccupancySensing.id],
297
306
  });
298
- export const onOffMountedSwitch = DeviceTypeDefinition({
299
- name: 'MA-onoffmountedswitch',
307
+ export const dimmableOutlet = dimmablePluginUnit;
308
+ export const mountedOnOffControl = DeviceTypeDefinition({
309
+ name: 'MA-mountedOnOffControl',
300
310
  deviceName: 'Mounted OnOff Control',
301
311
  code: 0x010f,
302
312
  deviceClass: DeviceClasses.Simple,
@@ -307,8 +317,9 @@ export const onOffMountedSwitch = DeviceTypeDefinition({
307
317
  requiredClientClusters: [],
308
318
  optionalClientClusters: [OccupancySensing.id],
309
319
  });
310
- export const dimmableMountedSwitch = DeviceTypeDefinition({
311
- name: 'MA-dimmablemountedswitch',
320
+ export const onOffMountedSwitch = mountedOnOffControl;
321
+ export const mountedDimmableLoadControl = DeviceTypeDefinition({
322
+ name: 'MA-mountedDimmableLoadControl',
312
323
  deviceName: 'Mounted Dimmable Load Control',
313
324
  code: 0x0110,
314
325
  deviceClass: DeviceClasses.Simple,
@@ -319,7 +330,8 @@ export const dimmableMountedSwitch = DeviceTypeDefinition({
319
330
  requiredClientClusters: [],
320
331
  optionalClientClusters: [OccupancySensing.id],
321
332
  });
322
- export const pumpDevice = DeviceTypeDefinition({
333
+ export const dimmableMountedSwitch = mountedDimmableLoadControl;
334
+ export const pump = DeviceTypeDefinition({
323
335
  name: 'MA-pump',
324
336
  deviceName: 'Pump',
325
337
  code: 0x303,
@@ -331,6 +343,7 @@ export const pumpDevice = DeviceTypeDefinition({
331
343
  requiredClientClusters: [],
332
344
  optionalClientClusters: [TemperatureMeasurement.id, PressureMeasurement.id, FlowMeasurement.id, OccupancySensing.id],
333
345
  });
346
+ export const pumpDevice = pump;
334
347
  export const waterValve = DeviceTypeDefinition({
335
348
  name: 'MA-waterValve',
336
349
  deviceName: 'Water Valve',
@@ -354,45 +367,73 @@ export const irrigationSystem = DeviceTypeDefinition({
354
367
  optionalServerClusters: [Identify.id, OperationalState.id, FlowMeasurement.id],
355
368
  requiredClientClusters: [],
356
369
  optionalClientClusters: [FlowMeasurement.id],
370
+ composedOf: [waterValve],
357
371
  });
358
- export const onOffSwitch = DeviceTypeDefinition({
359
- name: 'MA-onoffswitch',
372
+ export const onOffLightSwitch = DeviceTypeDefinition({
373
+ name: 'MA-onOffLightSwitch',
360
374
  deviceName: 'OnOff Light Switch',
361
375
  code: 0x0103,
362
376
  deviceClass: DeviceClasses.Simple,
363
377
  deviceScope: DeviceScopes.Endpoint,
364
378
  revision: 3,
365
- requiredServerClusters: [Identify.id, OnOff.id],
379
+ requiredServerClusters: [Identify.id],
366
380
  optionalServerClusters: [],
367
381
  requiredClientClusters: [Identify.id, OnOff.id],
368
382
  optionalClientClusters: [Groups.id, ScenesManagement.id],
369
383
  });
370
- export const dimmableSwitch = DeviceTypeDefinition({
371
- name: 'MA-dimmableswitch',
384
+ export const onOffSwitch = onOffLightSwitch;
385
+ export const dimmerSwitch = DeviceTypeDefinition({
386
+ name: 'MA-dimmerSwitch',
372
387
  deviceName: 'Dimmer Switch',
373
388
  code: 0x0104,
374
389
  deviceClass: DeviceClasses.Simple,
375
390
  deviceScope: DeviceScopes.Endpoint,
376
391
  revision: 3,
377
- requiredServerClusters: [Identify.id, OnOff.id, LevelControl.id],
392
+ requiredServerClusters: [Identify.id],
378
393
  optionalServerClusters: [],
379
394
  requiredClientClusters: [Identify.id, OnOff.id, LevelControl.id],
380
395
  optionalClientClusters: [Groups.id, ScenesManagement.id],
381
396
  });
382
- export const colorTemperatureSwitch = DeviceTypeDefinition({
383
- name: 'MA-colortemperatureswitch',
397
+ export const dimmableSwitch = dimmerSwitch;
398
+ export const colorDimmerSwitch = DeviceTypeDefinition({
399
+ name: 'MA-colorDimmerSwitch',
384
400
  deviceName: 'Color Dimmer Switch',
385
401
  code: 0x0105,
386
402
  deviceClass: DeviceClasses.Simple,
387
403
  deviceScope: DeviceScopes.Endpoint,
388
404
  revision: 3,
389
- requiredServerClusters: [Identify.id, OnOff.id, LevelControl.id, ColorControl.id],
405
+ requiredServerClusters: [Identify.id],
390
406
  optionalServerClusters: [],
391
407
  requiredClientClusters: [Identify.id, OnOff.id, LevelControl.id, ColorControl.id],
392
408
  optionalClientClusters: [Groups.id, ScenesManagement.id],
393
409
  });
410
+ export const colorTemperatureSwitch = colorDimmerSwitch;
411
+ export const controlBridge = DeviceTypeDefinition({
412
+ name: 'MA-controlBridge',
413
+ deviceName: 'Control Bridge',
414
+ code: 0x0840,
415
+ deviceClass: DeviceClasses.Simple,
416
+ deviceScope: DeviceScopes.Endpoint,
417
+ revision: 3,
418
+ requiredServerClusters: [Identify.id],
419
+ optionalServerClusters: [],
420
+ requiredClientClusters: [Identify.id, Groups.id, ScenesManagement.id, OnOff.id, LevelControl.id, ColorControl.id],
421
+ optionalClientClusters: [IlluminanceMeasurement.id, OccupancySensing.id],
422
+ });
423
+ export const pumpController = DeviceTypeDefinition({
424
+ name: 'MA-pumpController',
425
+ deviceName: 'Pump Controller',
426
+ code: 0x0304,
427
+ deviceClass: DeviceClasses.Simple,
428
+ deviceScope: DeviceScopes.Endpoint,
429
+ revision: 4,
430
+ requiredServerClusters: [Identify.id],
431
+ optionalServerClusters: [],
432
+ requiredClientClusters: [OnOff.id, PumpConfigurationAndControl.id],
433
+ optionalClientClusters: [Identify.id, Groups.id, LevelControl.id, ScenesManagement.id, TemperatureMeasurement.id, PressureMeasurement.id, FlowMeasurement.id],
434
+ });
394
435
  export const genericSwitch = DeviceTypeDefinition({
395
- name: 'MA-genericswitch',
436
+ name: 'MA-genericSwitch',
396
437
  deviceName: 'Generic Switch',
397
438
  code: 0x000f,
398
439
  deviceClass: DeviceClasses.Simple,
@@ -402,7 +443,7 @@ export const genericSwitch = DeviceTypeDefinition({
402
443
  optionalServerClusters: [],
403
444
  });
404
445
  export const contactSensor = DeviceTypeDefinition({
405
- name: 'MA-contactsensor',
446
+ name: 'MA-contactSensor',
406
447
  deviceName: 'Contact Sensor',
407
448
  code: 0x0015,
408
449
  deviceClass: DeviceClasses.Simple,
@@ -412,7 +453,7 @@ export const contactSensor = DeviceTypeDefinition({
412
453
  optionalServerClusters: [BooleanStateConfiguration.id],
413
454
  });
414
455
  export const lightSensor = DeviceTypeDefinition({
415
- name: 'MA-lightsensor',
456
+ name: 'MA-lightSensor',
416
457
  deviceName: 'Light Sensor',
417
458
  code: 0x0106,
418
459
  deviceClass: DeviceClasses.Simple,
@@ -421,7 +462,7 @@ export const lightSensor = DeviceTypeDefinition({
421
462
  requiredServerClusters: [Identify.id, IlluminanceMeasurement.id],
422
463
  });
423
464
  export const occupancySensor = DeviceTypeDefinition({
424
- name: 'MA-occupancysensor',
465
+ name: 'MA-occupancySensor',
425
466
  deviceName: 'Occupancy Sensor',
426
467
  code: 0x0107,
427
468
  deviceClass: DeviceClasses.Simple,
@@ -431,7 +472,7 @@ export const occupancySensor = DeviceTypeDefinition({
431
472
  optionalServerClusters: [BooleanStateConfiguration.id],
432
473
  });
433
474
  export const temperatureSensor = DeviceTypeDefinition({
434
- name: 'MA-tempsensor',
475
+ name: 'MA-temperatureSensor',
435
476
  deviceName: 'Temperature Sensor',
436
477
  code: 0x0302,
437
478
  deviceClass: DeviceClasses.Simple,
@@ -441,7 +482,7 @@ export const temperatureSensor = DeviceTypeDefinition({
441
482
  optionalServerClusters: [ThermostatUserInterfaceConfiguration.id],
442
483
  });
443
484
  export const pressureSensor = DeviceTypeDefinition({
444
- name: 'MA-pressuresensor',
485
+ name: 'MA-pressureSensor',
445
486
  deviceName: 'Pressure Sensor',
446
487
  code: 0x0305,
447
488
  deviceClass: DeviceClasses.Simple,
@@ -450,7 +491,7 @@ export const pressureSensor = DeviceTypeDefinition({
450
491
  requiredServerClusters: [Identify.id, PressureMeasurement.id],
451
492
  });
452
493
  export const flowSensor = DeviceTypeDefinition({
453
- name: 'MA-flowsensor',
494
+ name: 'MA-flowSensor',
454
495
  deviceName: 'Flow Sensor',
455
496
  code: 0x0306,
456
497
  deviceClass: DeviceClasses.Simple,
@@ -459,7 +500,7 @@ export const flowSensor = DeviceTypeDefinition({
459
500
  requiredServerClusters: [Identify.id, FlowMeasurement.id],
460
501
  });
461
502
  export const humiditySensor = DeviceTypeDefinition({
462
- name: 'MA-humiditysensor',
503
+ name: 'MA-humiditySensor',
463
504
  deviceName: 'Humidity Sensor',
464
505
  code: 0x0307,
465
506
  deviceClass: DeviceClasses.Simple,
@@ -467,6 +508,17 @@ export const humiditySensor = DeviceTypeDefinition({
467
508
  revision: 3,
468
509
  requiredServerClusters: [Identify.id, RelativeHumidityMeasurement.id],
469
510
  });
511
+ export const onOffSensor = DeviceTypeDefinition({
512
+ name: 'MA-onOffSensor',
513
+ deviceName: 'OnOff Sensor',
514
+ code: 0x0850,
515
+ deviceClass: DeviceClasses.Simple,
516
+ deviceScope: DeviceScopes.Endpoint,
517
+ revision: 3,
518
+ requiredServerClusters: [Identify.id],
519
+ requiredClientClusters: [Identify.id, OnOff.id],
520
+ optionalClientClusters: [Groups.id, LevelControl.id, ColorControl.id, ScenesManagement.id],
521
+ });
470
522
  export const smokeCoAlarm = DeviceTypeDefinition({
471
523
  name: 'MA-smokeCoAlarm',
472
524
  deviceName: 'Smoke CO Alarm',
@@ -476,6 +528,7 @@ export const smokeCoAlarm = DeviceTypeDefinition({
476
528
  revision: 1,
477
529
  requiredServerClusters: [Identify.id, SmokeCoAlarm.id],
478
530
  optionalServerClusters: [Groups.id, TemperatureMeasurement.id, RelativeHumidityMeasurement.id, CarbonMonoxideConcentrationMeasurement.id],
531
+ requiredDeviceTypes: [powerSource],
479
532
  });
480
533
  export const airQualitySensor = DeviceTypeDefinition({
481
534
  name: 'MA-airQualitySensor',
@@ -540,7 +593,7 @@ export const soilSensor = DeviceTypeDefinition({
540
593
  requiredServerClusters: [Identify.id, SoilMeasurement.id],
541
594
  optionalServerClusters: [TemperatureMeasurement.id],
542
595
  });
543
- export const doorLockDevice = DeviceTypeDefinition({
596
+ export const doorLock = DeviceTypeDefinition({
544
597
  name: 'MA-doorLock',
545
598
  deviceName: 'Door Lock',
546
599
  code: 0xa,
@@ -550,7 +603,20 @@ export const doorLockDevice = DeviceTypeDefinition({
550
603
  requiredServerClusters: [Identify.id, DoorLock.id],
551
604
  optionalServerClusters: [],
552
605
  });
553
- export const coverDevice = DeviceTypeDefinition({
606
+ export const doorLockDevice = doorLock;
607
+ export const doorLockController = DeviceTypeDefinition({
608
+ name: 'MA-doorLockController',
609
+ deviceName: 'Door Lock Controller',
610
+ code: 0x00b,
611
+ deviceClass: DeviceClasses.Simple,
612
+ deviceScope: DeviceScopes.Endpoint,
613
+ revision: 3,
614
+ requiredServerClusters: [],
615
+ optionalServerClusters: [],
616
+ requiredClientClusters: [DoorLock.id],
617
+ optionalClientClusters: [Groups.id, ScenesManagement.id],
618
+ });
619
+ export const windowCovering = DeviceTypeDefinition({
554
620
  name: 'MA-windowCovering',
555
621
  deviceName: 'Window Covering',
556
622
  code: 0x202,
@@ -560,6 +626,19 @@ export const coverDevice = DeviceTypeDefinition({
560
626
  requiredServerClusters: [Identify.id, WindowCovering.id],
561
627
  optionalServerClusters: [Groups.id],
562
628
  });
629
+ export const coverDevice = windowCovering;
630
+ export const windowCoveringController = DeviceTypeDefinition({
631
+ name: 'MA-windowCoveringController',
632
+ deviceName: 'Window Covering Controller',
633
+ code: 0x203,
634
+ deviceClass: DeviceClasses.Simple,
635
+ deviceScope: DeviceScopes.Endpoint,
636
+ revision: 4,
637
+ requiredServerClusters: [],
638
+ optionalServerClusters: [Identify.id],
639
+ requiredClientClusters: [WindowCovering.id],
640
+ optionalClientClusters: [Identify.id, Groups.id],
641
+ });
563
642
  export const closure = DeviceTypeDefinition({
564
643
  name: 'MA-closure',
565
644
  deviceName: 'Closure',
@@ -592,7 +671,7 @@ export const closureController = DeviceTypeDefinition({
592
671
  requiredClientClusters: [ClosureControl.id],
593
672
  optionalClientClusters: [Identify.id, Groups.id, ClosureDimension.id],
594
673
  });
595
- export const thermostatDevice = DeviceTypeDefinition({
674
+ export const thermostat = DeviceTypeDefinition({
596
675
  name: 'MA-thermostat',
597
676
  deviceName: 'Thermostat',
598
677
  code: 0x301,
@@ -604,7 +683,8 @@ export const thermostatDevice = DeviceTypeDefinition({
604
683
  requiredClientClusters: [],
605
684
  optionalClientClusters: [FanControl.id, TemperatureMeasurement.id, RelativeHumidityMeasurement.id, OccupancySensing.id],
606
685
  });
607
- export const fanDevice = DeviceTypeDefinition({
686
+ export const thermostatDevice = thermostat;
687
+ export const fan = DeviceTypeDefinition({
608
688
  name: 'MA-fan',
609
689
  deviceName: 'Fan',
610
690
  code: 0x2b,
@@ -614,6 +694,7 @@ export const fanDevice = DeviceTypeDefinition({
614
694
  requiredServerClusters: [Identify.id, Groups.id, FanControl.id],
615
695
  optionalServerClusters: [OnOff.id],
616
696
  });
697
+ export const fanDevice = fan;
617
698
  export const airPurifier = DeviceTypeDefinition({
618
699
  name: 'MA-airPurifier',
619
700
  deviceName: 'Air Purifier',
@@ -624,6 +705,18 @@ export const airPurifier = DeviceTypeDefinition({
624
705
  requiredServerClusters: [Identify.id, FanControl.id],
625
706
  optionalServerClusters: [Groups.id, OnOff.id, HepaFilterMonitoring.id, ActivatedCarbonFilterMonitoring.id],
626
707
  });
708
+ export const thermostatController = DeviceTypeDefinition({
709
+ name: 'MA-thermostatController',
710
+ deviceName: 'Thermostat Controller',
711
+ code: 0x030a,
712
+ deviceClass: DeviceClasses.Simple,
713
+ deviceScope: DeviceScopes.Endpoint,
714
+ revision: 1,
715
+ requiredServerClusters: [],
716
+ optionalServerClusters: [],
717
+ requiredClientClusters: [Thermostat.id],
718
+ optionalClientClusters: [Identify.id, Groups.id, ScenesManagement.id],
719
+ });
627
720
  export const basicVideoPlayer = DeviceTypeDefinition({
628
721
  name: 'MA-basicVideoPlayer',
629
722
  deviceName: 'Basic Video Player',
@@ -655,7 +748,7 @@ export const castingVideoPlayer = DeviceTypeDefinition({
655
748
  Messages.id,
656
749
  ],
657
750
  });
658
- export const speakerDevice = DeviceTypeDefinition({
751
+ export const speaker = DeviceTypeDefinition({
659
752
  name: 'MA-speaker',
660
753
  deviceName: 'Speaker',
661
754
  code: 0x0022,
@@ -665,8 +758,70 @@ export const speakerDevice = DeviceTypeDefinition({
665
758
  requiredServerClusters: [OnOff.id, LevelControl.id],
666
759
  optionalServerClusters: [],
667
760
  });
761
+ export const speakerDevice = speaker;
762
+ export const contentApp = DeviceTypeDefinition({
763
+ name: 'MA-contentApp',
764
+ deviceName: 'Content App',
765
+ code: 0x0024,
766
+ deviceClass: DeviceClasses.Simple,
767
+ deviceScope: DeviceScopes.Endpoint,
768
+ revision: 2,
769
+ requiredServerClusters: [KeypadInput.id, ApplicationLauncher.id, ApplicationBasic.id],
770
+ optionalServerClusters: [Channel.id, TargetNavigator.id, MediaPlayback.id, ContentLauncher.id, AccountLogin.id],
771
+ requiredClientClusters: [],
772
+ optionalClientClusters: [ContentAppObserver.id],
773
+ });
774
+ export const castingVideoClient = DeviceTypeDefinition({
775
+ name: 'MA-castingVideoClient',
776
+ deviceName: 'Casting Video Client',
777
+ code: 0x0029,
778
+ deviceClass: DeviceClasses.Simple,
779
+ deviceScope: DeviceScopes.Endpoint,
780
+ revision: 2,
781
+ requiredServerClusters: [],
782
+ optionalServerClusters: [ContentAppObserver.id],
783
+ requiredClientClusters: [OnOff.id, KeypadInput.id, ContentLauncher.id, ApplicationBasic.id],
784
+ optionalClientClusters: [
785
+ LevelControl.id,
786
+ Messages.id,
787
+ WakeOnLan.id,
788
+ Channel.id,
789
+ TargetNavigator.id,
790
+ MediaPlayback.id,
791
+ MediaInput.id,
792
+ LowPower.id,
793
+ AudioOutput.id,
794
+ ApplicationLauncher.id,
795
+ AccountLogin.id,
796
+ ContentControl.id,
797
+ ],
798
+ });
799
+ export const videoRemoteControl = DeviceTypeDefinition({
800
+ name: 'MA-videoRemoteControl',
801
+ deviceName: 'Video Remote Control',
802
+ code: 0x002a,
803
+ deviceClass: DeviceClasses.Simple,
804
+ deviceScope: DeviceScopes.Endpoint,
805
+ revision: 2,
806
+ requiredServerClusters: [],
807
+ optionalServerClusters: [],
808
+ requiredClientClusters: [OnOff.id, MediaPlayback.id, KeypadInput.id],
809
+ optionalClientClusters: [
810
+ LevelControl.id,
811
+ WakeOnLan.id,
812
+ Channel.id,
813
+ TargetNavigator.id,
814
+ MediaInput.id,
815
+ LowPower.id,
816
+ ContentLauncher.id,
817
+ AudioOutput.id,
818
+ ApplicationLauncher.id,
819
+ AccountLogin.id,
820
+ ContentControl.id,
821
+ ],
822
+ });
668
823
  export const modeSelect = DeviceTypeDefinition({
669
- name: 'MA-modeselect',
824
+ name: 'MA-modeSelect',
670
825
  deviceName: 'Mode Select',
671
826
  code: 0x27,
672
827
  deviceClass: DeviceClasses.Simple,
@@ -686,7 +841,7 @@ export const aggregator = DeviceTypeDefinition({
686
841
  });
687
842
  export const bridge = aggregator;
688
843
  export const roboticVacuumCleaner = DeviceTypeDefinition({
689
- name: 'MA-roboticvacuumcleaner',
844
+ name: 'MA-roboticVacuumCleaner',
690
845
  deviceName: 'Robotic Vacuum Cleaner',
691
846
  code: 0x74,
692
847
  deviceClass: DeviceClasses.Simple,
@@ -696,7 +851,7 @@ export const roboticVacuumCleaner = DeviceTypeDefinition({
696
851
  optionalServerClusters: [RvcCleanMode.id, ServiceArea.id],
697
852
  });
698
853
  export const laundryWasher = DeviceTypeDefinition({
699
- name: 'MA-laundrywasher',
854
+ name: 'MA-laundryWasher',
700
855
  deviceName: 'Laundry Washer',
701
856
  code: 0x73,
702
857
  deviceClass: DeviceClasses.Simple,
@@ -715,8 +870,8 @@ export const refrigerator = DeviceTypeDefinition({
715
870
  requiredServerClusters: [],
716
871
  optionalServerClusters: [Identify.id, RefrigeratorAndTemperatureControlledCabinetMode.id, RefrigeratorAlarm.id],
717
872
  });
718
- export const airConditioner = DeviceTypeDefinition({
719
- name: 'MA-airConditioner',
873
+ export const roomAirConditioner = DeviceTypeDefinition({
874
+ name: 'MA-roomAirConditioner',
720
875
  deviceName: 'Room Air Conditioner',
721
876
  code: 0x72,
722
877
  deviceClass: DeviceClasses.Simple,
@@ -734,8 +889,9 @@ export const airConditioner = DeviceTypeDefinition({
734
889
  ActivatedCarbonFilterMonitoring.id,
735
890
  ],
736
891
  });
892
+ export const airConditioner = roomAirConditioner;
737
893
  export const temperatureControlledCabinetCooler = DeviceTypeDefinition({
738
- name: 'MA-temperaturecontrolledcabinetcooler',
894
+ name: 'MA-temperatureControlledCabinetCooler',
739
895
  deviceName: 'Temperature Controlled Cabinet',
740
896
  code: 0x71,
741
897
  deviceClass: DeviceClasses.Simple,
@@ -745,7 +901,7 @@ export const temperatureControlledCabinetCooler = DeviceTypeDefinition({
745
901
  optionalServerClusters: [TemperatureMeasurement.id],
746
902
  });
747
903
  export const temperatureControlledCabinetHeater = DeviceTypeDefinition({
748
- name: 'MA-temperaturecontrolledcabinetheater',
904
+ name: 'MA-temperatureControlledCabinetHeater',
749
905
  deviceName: 'Temperature Controlled Cabinet',
750
906
  code: 0x71,
751
907
  deviceClass: DeviceClasses.Simple,
@@ -765,7 +921,7 @@ export const dishwasher = DeviceTypeDefinition({
765
921
  optionalServerClusters: [Identify.id, OnOff.id, TemperatureControl.id, DishwasherMode.id, DishwasherAlarm.id],
766
922
  });
767
923
  export const laundryDryer = DeviceTypeDefinition({
768
- name: 'MA-laundrydryer',
924
+ name: 'MA-laundryDryer',
769
925
  deviceName: 'Laundry Dryer',
770
926
  code: 0x7c,
771
927
  deviceClass: DeviceClasses.Simple,
@@ -775,7 +931,7 @@ export const laundryDryer = DeviceTypeDefinition({
775
931
  optionalServerClusters: [Identify.id, LaundryWasherMode.id, OnOff.id, LaundryDryerControls.id, TemperatureControl.id],
776
932
  });
777
933
  export const cookSurface = DeviceTypeDefinition({
778
- name: 'MA-cooksurface',
934
+ name: 'MA-cookSurface',
779
935
  deviceName: 'Cook Surface',
780
936
  code: 0x77,
781
937
  deviceClass: DeviceClasses.Simple,
@@ -805,7 +961,7 @@ export const oven = DeviceTypeDefinition({
805
961
  optionalServerClusters: [Identify.id],
806
962
  });
807
963
  export const extractorHood = DeviceTypeDefinition({
808
- name: 'MA-extractorhood',
964
+ name: 'MA-extractorHood',
809
965
  deviceName: 'Extractor Hood',
810
966
  code: 0x7a,
811
967
  deviceClass: DeviceClasses.Simple,
@@ -815,7 +971,7 @@ export const extractorHood = DeviceTypeDefinition({
815
971
  optionalServerClusters: [Identify.id, HepaFilterMonitoring.id, ActivatedCarbonFilterMonitoring.id],
816
972
  });
817
973
  export const microwaveOven = DeviceTypeDefinition({
818
- name: 'MA-microwaveoven',
974
+ name: 'MA-microwaveOven',
819
975
  deviceName: 'Microwave Oven',
820
976
  code: 0x79,
821
977
  deviceClass: DeviceClasses.Simple,
@@ -835,7 +991,7 @@ export const evse = DeviceTypeDefinition({
835
991
  optionalServerClusters: [Identify.id, TemperatureMeasurement.id],
836
992
  });
837
993
  export const waterHeater = DeviceTypeDefinition({
838
- name: 'MA-waterheater',
994
+ name: 'MA-waterHeater',
839
995
  deviceName: 'Water Heater',
840
996
  code: 0x050f,
841
997
  deviceClass: DeviceClasses.Simple,
@@ -845,7 +1001,7 @@ export const waterHeater = DeviceTypeDefinition({
845
1001
  optionalServerClusters: [Identify.id],
846
1002
  });
847
1003
  export const solarPower = DeviceTypeDefinition({
848
- name: 'MA-solarpower',
1004
+ name: 'MA-solarPower',
849
1005
  deviceName: 'Solar Power',
850
1006
  code: 0x0017,
851
1007
  deviceClass: DeviceClasses.Simple,
@@ -855,7 +1011,7 @@ export const solarPower = DeviceTypeDefinition({
855
1011
  optionalServerClusters: [Identify.id],
856
1012
  });
857
1013
  export const batteryStorage = DeviceTypeDefinition({
858
- name: 'MA-batterystorage',
1014
+ name: 'MA-batteryStorage',
859
1015
  deviceName: 'Battery Storage',
860
1016
  code: 0x0018,
861
1017
  deviceClass: DeviceClasses.Simple,
@@ -865,7 +1021,7 @@ export const batteryStorage = DeviceTypeDefinition({
865
1021
  optionalServerClusters: [Identify.id],
866
1022
  });
867
1023
  export const heatPump = DeviceTypeDefinition({
868
- name: 'MA-heatpump',
1024
+ name: 'MA-heatPump',
869
1025
  deviceName: 'Heat Pump',
870
1026
  code: 0x0309,
871
1027
  deviceClass: DeviceClasses.Simple,
@@ -21,7 +21,7 @@ import { ThermostatUserInterfaceConfiguration } from '@matter/types/clusters/the
21
21
  import { ValveConfigurationAndControl } from '@matter/types/clusters/valve-configuration-and-control';
22
22
  import { WindowCovering } from '@matter/types/clusters/window-covering';
23
23
  import { ClusterId, EndpointNumber } from '@matter/types/datatype';
24
- import { Semtag } from '@matter/types/globals';
24
+ import { MeasurementAccuracy, Semtag } from '@matter/types/globals';
25
25
  import { AnsiLogger, LogLevel } from 'node-ansi-logger';
26
26
  import { DeviceTypeDefinition } from './matterbridgeDeviceTypes.js';
27
27
  import { CommandHandler, CommandHandlerData, CommandHandlerExecutionResult, CommandHandlerFunction, CommandHandlers } from './matterbridgeEndpointCommandHandler.js';
@@ -137,8 +137,8 @@ export declare class MatterbridgeEndpoint extends Endpoint {
137
137
  static deserialize(serializedDevice: SerializedMatterbridgeEndpoint): MatterbridgeEndpoint | undefined;
138
138
  createDefaultPowerSourceWiredClusterServer(wiredCurrentType?: PowerSource.WiredCurrentType): this;
139
139
  createDefaultPowerSourceBatteryClusterServer(batPercentRemaining?: null | number, batChargeLevel?: PowerSource.BatChargeLevel, batVoltage?: null | number, batReplaceability?: PowerSource.BatReplaceability): this;
140
- createDefaultPowerSourceReplaceableBatteryClusterServer(batPercentRemaining?: number, batChargeLevel?: PowerSource.BatChargeLevel, batVoltage?: number, batReplacementDescription?: string, batQuantity?: number, batReplaceability?: PowerSource.BatReplaceability): this;
141
- createDefaultPowerSourceRechargeableBatteryClusterServer(batPercentRemaining?: number, batChargeLevel?: PowerSource.BatChargeLevel, batVoltage?: number, batReplaceability?: PowerSource.BatReplaceability): this;
140
+ createDefaultPowerSourceReplaceableBatteryClusterServer(batPercentRemaining?: number | null, batChargeLevel?: PowerSource.BatChargeLevel, batVoltage?: number | null, batReplacementDescription?: string, batQuantity?: number, batReplaceability?: PowerSource.BatReplaceability): this;
141
+ createDefaultPowerSourceRechargeableBatteryClusterServer(batPercentRemaining?: number | null, batChargeLevel?: PowerSource.BatChargeLevel, batVoltage?: number | null, batReplaceability?: PowerSource.BatReplaceability): this;
142
142
  createDefaultBasicInformationClusterServer(deviceName: string, serialNumber: string, vendorId?: number, vendorName?: string, productId?: number, productName?: string, softwareVersion?: number, softwareVersionString?: string, hardwareVersion?: number, hardwareVersionString?: string): this;
143
143
  createDefaultBridgedDeviceBasicInformationClusterServer(deviceName: string, serialNumber: string, vendorId?: number, vendorName?: string, productName?: string, softwareVersion?: number, softwareVersionString?: string, hardwareVersion?: number, hardwareVersionString?: string): this;
144
144
  createDefaultPowerTopologyClusterServer(): this;
@@ -218,6 +218,7 @@ export declare class MatterbridgeEndpoint extends Endpoint {
218
218
  createDefaultIlluminanceMeasurementClusterServer(measuredValue?: number | null, minMeasuredValue?: number | null, maxMeasuredValue?: number | null): this;
219
219
  createDefaultFlowMeasurementClusterServer(measuredValue?: number | null, minMeasuredValue?: number | null, maxMeasuredValue?: number | null): this;
220
220
  createDefaultOccupancySensingClusterServer(occupied?: boolean, holdTime?: number, holdTimeMin?: number, holdTimeMax?: number): this;
221
+ createDefaultSoilMeasurementClusterServer(soilMoistureMeasuredValue?: number | null, soilMoistureMeasurementLimits?: MeasurementAccuracy): this;
221
222
  createDefaultAirQualityClusterServer(airQuality?: AirQuality.AirQualityEnum): this;
222
223
  createDefaultTvocMeasurementClusterServer(measuredValue?: number | null, measurementUnit?: ConcentrationMeasurement.MeasurementUnit, measurementMedium?: ConcentrationMeasurement.MeasurementMedium, uncertainty?: number): this;
223
224
  createLevelTvocMeasurementClusterServer(levelValue?: ConcentrationMeasurement.LevelValue, measurementMedium?: ConcentrationMeasurement.MeasurementMedium): this;
@@ -27,6 +27,7 @@ import { PumpConfigurationAndControlServer } from '@matter/node/behaviors/pump-c
27
27
  import { RadonConcentrationMeasurementServer } from '@matter/node/behaviors/radon-concentration-measurement';
28
28
  import { RelativeHumidityMeasurementServer } from '@matter/node/behaviors/relative-humidity-measurement';
29
29
  import { ScenesManagementServer } from '@matter/node/behaviors/scenes-management';
30
+ import { SoilMeasurementServer } from '@matter/node/behaviors/soil-measurement';
30
31
  import { SwitchServer } from '@matter/node/behaviors/switch';
31
32
  import { TemperatureMeasurementServer } from '@matter/node/behaviors/temperature-measurement';
32
33
  import { ThermostatUserInterfaceConfigurationServer } from '@matter/node/behaviors/thermostat-user-interface-configuration';
@@ -83,7 +84,7 @@ import { MatterbridgeThermostatServer } from './behaviors/thermostatServer.js';
83
84
  import { MatterbridgeValveConfigurationAndControlServer } from './behaviors/valveConfigurationAndControlServer.js';
84
85
  import { MatterbridgeWindowCoveringServer } from './behaviors/windowCoveringServer.js';
85
86
  import { CommandHandler } from './matterbridgeEndpointCommandHandler.js';
86
- import { addClusterClients, addClusterServers, addFixedLabel, addOptionalClusterClients, addOptionalClusterServers, addRequiredClusterClients, addRequiredClusterServers, addUserLabel, checkNotLatinCharacters, createUniqueId, defaultFor, featuresFor, generateUniqueId, getApparentElectricalPowerMeasurementClusterServer, getAttribute, getAttributeId, getBehavior, getBehaviourTypesFromClusterClientIds, getBehaviourTypesFromClusterServerIds, getCluster, getClusterId, getDefaultDeviceEnergyManagementClusterServer, getDefaultDeviceEnergyManagementModeClusterServer, getDefaultElectricalEnergyMeasurementClusterServer, getDefaultElectricalPowerMeasurementClusterServer, getDefaultFlowMeasurementClusterServer, getDefaultIlluminanceMeasurementClusterServer, getDefaultOccupancySensingClusterServer, getDefaultOperationalStateClusterServer, getDefaultPowerSourceBatteryClusterServer, getDefaultPowerSourceRechargeableBatteryClusterServer, getDefaultPowerSourceReplaceableBatteryClusterServer, getDefaultPowerSourceWiredClusterServer, getDefaultPressureMeasurementClusterServer, getDefaultRelativeHumidityMeasurementClusterServer, getDefaultTemperatureMeasurementClusterServer, invokeBehaviorCommand, lowercaseFirstLetter, setAttribute, setCluster, subscribeAttribute, triggerEvent, updateAttribute, } from './matterbridgeEndpointHelpers.js';
87
+ import { addClusterClients, addClusterServers, addFixedLabel, addOptionalClusterClients, addOptionalClusterServers, addRequiredClusterClients, addRequiredClusterServers, addUserLabel, checkNotLatinCharacters, createUniqueId, defaultFor, featuresFor, generateUniqueId, getApparentElectricalPowerMeasurementClusterServer, getAttribute, getAttributeId, getBehavior, getBehaviourTypesFromClusterClientIds, getBehaviourTypesFromClusterServerIds, getCluster, getClusterId, getDefaultDeviceEnergyManagementClusterServer, getDefaultDeviceEnergyManagementModeClusterServer, getDefaultElectricalEnergyMeasurementClusterServer, getDefaultElectricalPowerMeasurementClusterServer, getDefaultFlowMeasurementClusterServer, getDefaultIlluminanceMeasurementClusterServer, getDefaultOccupancySensingClusterServer, getDefaultOperationalStateClusterServer, getDefaultPowerSourceBatteryClusterServer, getDefaultPowerSourceRechargeableBatteryClusterServer, getDefaultPowerSourceReplaceableBatteryClusterServer, getDefaultPowerSourceWiredClusterServer, getDefaultPressureMeasurementClusterServer, getDefaultRelativeHumidityMeasurementClusterServer, getDefaultSoilMeasurementClusterServer, getDefaultTemperatureMeasurementClusterServer, invokeBehaviorCommand, lowercaseFirstLetter, setAttribute, setCluster, subscribeAttribute, triggerEvent, updateAttribute, } from './matterbridgeEndpointHelpers.js';
87
88
  const MATTERBRIDGE_ENDPOINT_BRAND = Symbol('MatterbridgeEndpoint.brand');
88
89
  export function isMatterbridgeEndpoint(value) {
89
90
  if (!value || typeof value !== 'object')
@@ -1379,6 +1380,10 @@ export class MatterbridgeEndpoint extends Endpoint {
1379
1380
  this.behaviors.require(OccupancySensingServer.with(OccupancySensing.Feature.PassiveInfrared), getDefaultOccupancySensingClusterServer(occupied, holdTime, holdTimeMin, holdTimeMax));
1380
1381
  return this;
1381
1382
  }
1383
+ createDefaultSoilMeasurementClusterServer(soilMoistureMeasuredValue = null, soilMoistureMeasurementLimits) {
1384
+ this.behaviors.require(SoilMeasurementServer, getDefaultSoilMeasurementClusterServer(soilMoistureMeasuredValue, soilMoistureMeasurementLimits));
1385
+ return this;
1386
+ }
1382
1387
  createDefaultAirQualityClusterServer(airQuality = AirQuality.AirQualityEnum.Unknown) {
1383
1388
  this.behaviors.require(AirQualityServer.with(AirQuality.Feature.Fair, AirQuality.Feature.Moderate, AirQuality.Feature.VeryPoor, AirQuality.Feature.ExtremelyPoor), {
1384
1389
  airQuality,
@@ -14,9 +14,10 @@ import { OperationalState } from '@matter/types/clusters/operational-state';
14
14
  import { PowerSource } from '@matter/types/clusters/power-source';
15
15
  import { PressureMeasurement } from '@matter/types/clusters/pressure-measurement';
16
16
  import { RelativeHumidityMeasurement } from '@matter/types/clusters/relative-humidity-measurement';
17
+ import { SoilMeasurement } from '@matter/types/clusters/soil-measurement';
17
18
  import { TemperatureMeasurement } from '@matter/types/clusters/temperature-measurement';
18
19
  import { ClusterId, VendorId } from '@matter/types/datatype';
19
- import { Semtag } from '@matter/types/globals';
20
+ import { MeasurementAccuracy, Semtag } from '@matter/types/globals';
20
21
  import { AnsiLogger } from 'node-ansi-logger';
21
22
  import { MatterbridgeDeviceEnergyManagementModeServer } from './behaviors/deviceEnergyManagementModeServer.js';
22
23
  import { MatterbridgeDeviceEnergyManagementServer } from './behaviors/deviceEnergyManagementServer.js';
@@ -72,13 +73,13 @@ export declare function getDefaultPowerSourceBatteryClusterServer(batPercentRema
72
73
  rechargeable: false;
73
74
  replaceable: false;
74
75
  }>, typeof MatterbridgePowerSourceServer>>;
75
- export declare function getDefaultPowerSourceReplaceableBatteryClusterServer(batPercentRemaining?: number, batChargeLevel?: PowerSource.BatChargeLevel, batVoltage?: number, batReplacementDescription?: string, batQuantity?: number, batReplaceability?: PowerSource.BatReplaceability): Partial<import("@matter/node").ClusterState.Type<ClusterType.WithSupportedFeatures<PowerSource, {
76
+ export declare function getDefaultPowerSourceReplaceableBatteryClusterServer(batPercentRemaining?: number | null, batChargeLevel?: PowerSource.BatChargeLevel, batVoltage?: number | null, batReplacementDescription?: string, batQuantity?: number, batReplaceability?: PowerSource.BatReplaceability): Partial<import("@matter/node").ClusterState.Type<ClusterType.WithSupportedFeatures<PowerSource, {
76
77
  wired: false;
77
78
  battery: true;
78
79
  rechargeable: false;
79
80
  replaceable: true;
80
81
  }>, typeof MatterbridgePowerSourceServer>>;
81
- export declare function getDefaultPowerSourceRechargeableBatteryClusterServer(batPercentRemaining?: number, batChargeLevel?: PowerSource.BatChargeLevel, batVoltage?: number, batReplaceability?: PowerSource.BatReplaceability): Partial<import("@matter/node").ClusterState.Type<ClusterType.WithSupportedFeatures<PowerSource, {
82
+ export declare function getDefaultPowerSourceRechargeableBatteryClusterServer(batPercentRemaining?: number | null, batChargeLevel?: PowerSource.BatChargeLevel, batVoltage?: number | null, batReplaceability?: PowerSource.BatReplaceability): Partial<import("@matter/node").ClusterState.Type<ClusterType.WithSupportedFeatures<PowerSource, {
82
83
  wired: false;
83
84
  battery: true;
84
85
  rechargeable: true;
@@ -142,3 +143,4 @@ export declare function getDefaultOccupancySensingClusterServer(occupied?: boole
142
143
  rfSensing: false;
143
144
  vision: false;
144
145
  }>, typeof OccupancySensingServer>>;
146
+ export declare function getDefaultSoilMeasurementClusterServer(soilMoistureMeasuredValue?: number | null, soilMoistureMeasurementLimits?: MeasurementAccuracy): Partial<import("@matter/node").ClusterState.Type<SoilMeasurement, typeof ClusterBehavior>>;
@@ -38,6 +38,7 @@ import { PumpConfigurationAndControlClient, PumpConfigurationAndControlServer }
38
38
  import { RadonConcentrationMeasurementServer } from '@matter/node/behaviors/radon-concentration-measurement';
39
39
  import { RelativeHumidityMeasurementClient, RelativeHumidityMeasurementServer } from '@matter/node/behaviors/relative-humidity-measurement';
40
40
  import { ScenesManagementClient, ScenesManagementServer } from '@matter/node/behaviors/scenes-management';
41
+ import { SoilMeasurementServer } from '@matter/node/behaviors/soil-measurement';
41
42
  import { SwitchServer } from '@matter/node/behaviors/switch';
42
43
  import { TemperatureMeasurementClient, TemperatureMeasurementServer } from '@matter/node/behaviors/temperature-measurement';
43
44
  import { ThermostatClient } from '@matter/node/behaviors/thermostat';
@@ -86,6 +87,7 @@ import { RadonConcentrationMeasurement } from '@matter/types/clusters/radon-conc
86
87
  import { RelativeHumidityMeasurement } from '@matter/types/clusters/relative-humidity-measurement';
87
88
  import { ScenesManagement } from '@matter/types/clusters/scenes-management';
88
89
  import { SmokeCoAlarm } from '@matter/types/clusters/smoke-co-alarm';
90
+ import { SoilMeasurement } from '@matter/types/clusters/soil-measurement';
89
91
  import { Switch } from '@matter/types/clusters/switch';
90
92
  import { TemperatureMeasurement } from '@matter/types/clusters/temperature-measurement';
91
93
  import { Thermostat } from '@matter/types/clusters/thermostat';
@@ -240,95 +242,97 @@ export function getBehaviourTypesFromClusterClientIds(clusterClientList) {
240
242
  return behaviorTypes;
241
243
  }
242
244
  export function getBehaviourTypeFromClusterServerId(clusterId) {
243
- if (clusterId === PowerSource.Cluster.id)
245
+ if (clusterId === PowerSource.id)
244
246
  return PowerSourceServer.with(PowerSource.Feature.Wired);
245
- if (clusterId === UserLabel.Cluster.id)
247
+ if (clusterId === UserLabel.id)
246
248
  return UserLabelServer;
247
- if (clusterId === FixedLabel.Cluster.id)
249
+ if (clusterId === FixedLabel.id)
248
250
  return FixedLabelServer;
249
- if (clusterId === BasicInformation.Cluster.id)
251
+ if (clusterId === BasicInformation.id)
250
252
  return BasicInformationServer;
251
- if (clusterId === BridgedDeviceBasicInformation.Cluster.id)
253
+ if (clusterId === BridgedDeviceBasicInformation.id)
252
254
  return BridgedDeviceBasicInformationServer;
253
- if (clusterId === Identify.Cluster.id)
255
+ if (clusterId === Identify.id)
254
256
  return MatterbridgeIdentifyServer;
255
- if (clusterId === Groups.Cluster.id)
257
+ if (clusterId === Groups.id)
256
258
  return GroupsServer;
257
- if (clusterId === ScenesManagement.Cluster.id)
259
+ if (clusterId === ScenesManagement.id)
258
260
  return ScenesManagementServer;
259
- if (clusterId === OnOff.Cluster.id)
261
+ if (clusterId === OnOff.id)
260
262
  return MatterbridgeOnOffServer.with('Lighting');
261
- if (clusterId === LevelControl.Cluster.id)
263
+ if (clusterId === LevelControl.id)
262
264
  return MatterbridgeLevelControlServer.with('OnOff', 'Lighting');
263
- if (clusterId === ColorControl.Cluster.id)
265
+ if (clusterId === ColorControl.id)
264
266
  return MatterbridgeColorControlServer;
265
- if (clusterId === WindowCovering.Cluster.id)
267
+ if (clusterId === WindowCovering.id)
266
268
  return MatterbridgeWindowCoveringServer.with('Lift', 'PositionAwareLift');
267
- if (clusterId === Thermostat.Cluster.id)
269
+ if (clusterId === Thermostat.id)
268
270
  return MatterbridgeThermostatServer.with('AutoMode', 'Heating', 'Cooling');
269
- if (clusterId === FanControl.Cluster.id)
271
+ if (clusterId === FanControl.id)
270
272
  return MatterbridgeFanControlServer;
271
- if (clusterId === DoorLock.Cluster.id)
273
+ if (clusterId === DoorLock.id)
272
274
  return MatterbridgeDoorLockServer;
273
- if (clusterId === ModeSelect.Cluster.id)
275
+ if (clusterId === ModeSelect.id)
274
276
  return MatterbridgeModeSelectServer;
275
- if (clusterId === ValveConfigurationAndControl.Cluster.id)
277
+ if (clusterId === ValveConfigurationAndControl.id)
276
278
  return MatterbridgeValveConfigurationAndControlServer.with('Level');
277
- if (clusterId === PumpConfigurationAndControl.Cluster.id)
279
+ if (clusterId === PumpConfigurationAndControl.id)
278
280
  return PumpConfigurationAndControlServer.with('ConstantSpeed');
279
- if (clusterId === SmokeCoAlarm.Cluster.id)
281
+ if (clusterId === SmokeCoAlarm.id)
280
282
  return MatterbridgeSmokeCoAlarmServer.with('SmokeAlarm', 'CoAlarm');
281
- if (clusterId === Switch.Cluster.id)
283
+ if (clusterId === Switch.id)
282
284
  return SwitchServer.with('MomentarySwitch', 'MomentarySwitchRelease', 'MomentarySwitchLongPress', 'MomentarySwitchMultiPress');
283
- if (clusterId === OperationalState.Cluster.id)
285
+ if (clusterId === OperationalState.id)
284
286
  return MatterbridgeOperationalStateServer;
285
- if (clusterId === BooleanState.Cluster.id)
287
+ if (clusterId === BooleanState.id)
286
288
  return BooleanStateServer.enable({ events: { stateChange: true } });
287
- if (clusterId === BooleanStateConfiguration.Cluster.id)
289
+ if (clusterId === BooleanStateConfiguration.id)
288
290
  return MatterbridgeBooleanStateConfigurationServer;
289
- if (clusterId === PowerTopology.Cluster.id)
291
+ if (clusterId === PowerTopology.id)
290
292
  return PowerTopologyServer.with('TreeTopology');
291
- if (clusterId === ElectricalPowerMeasurement.Cluster.id)
293
+ if (clusterId === ElectricalPowerMeasurement.id)
292
294
  return ElectricalPowerMeasurementServer.with('AlternatingCurrent');
293
- if (clusterId === ElectricalEnergyMeasurement.Cluster.id)
295
+ if (clusterId === ElectricalEnergyMeasurement.id)
294
296
  return ElectricalEnergyMeasurementServer.with('ImportedEnergy', 'ExportedEnergy', 'CumulativeEnergy');
295
- if (clusterId === TemperatureMeasurement.Cluster.id)
297
+ if (clusterId === TemperatureMeasurement.id)
296
298
  return TemperatureMeasurementServer;
297
- if (clusterId === RelativeHumidityMeasurement.Cluster.id)
299
+ if (clusterId === RelativeHumidityMeasurement.id)
298
300
  return RelativeHumidityMeasurementServer;
299
- if (clusterId === PressureMeasurement.Cluster.id)
301
+ if (clusterId === PressureMeasurement.id)
300
302
  return PressureMeasurementServer;
301
- if (clusterId === FlowMeasurement.Cluster.id)
303
+ if (clusterId === FlowMeasurement.id)
302
304
  return FlowMeasurementServer;
303
- if (clusterId === IlluminanceMeasurement.Cluster.id)
305
+ if (clusterId === IlluminanceMeasurement.id)
304
306
  return IlluminanceMeasurementServer;
305
- if (clusterId === OccupancySensing.Cluster.id)
307
+ if (clusterId === OccupancySensing.id)
306
308
  return OccupancySensingServer;
307
- if (clusterId === AirQuality.Cluster.id)
309
+ if (clusterId === SoilMeasurement.id)
310
+ return SoilMeasurementServer;
311
+ if (clusterId === AirQuality.id)
308
312
  return AirQualityServer.with('Fair', 'Moderate', 'VeryPoor', 'ExtremelyPoor');
309
- if (clusterId === CarbonMonoxideConcentrationMeasurement.Cluster.id)
313
+ if (clusterId === CarbonMonoxideConcentrationMeasurement.id)
310
314
  return CarbonMonoxideConcentrationMeasurementServer.with('NumericMeasurement');
311
- if (clusterId === CarbonDioxideConcentrationMeasurement.Cluster.id)
315
+ if (clusterId === CarbonDioxideConcentrationMeasurement.id)
312
316
  return CarbonDioxideConcentrationMeasurementServer.with('NumericMeasurement');
313
- if (clusterId === NitrogenDioxideConcentrationMeasurement.Cluster.id)
317
+ if (clusterId === NitrogenDioxideConcentrationMeasurement.id)
314
318
  return NitrogenDioxideConcentrationMeasurementServer.with('NumericMeasurement');
315
- if (clusterId === OzoneConcentrationMeasurement.Cluster.id)
319
+ if (clusterId === OzoneConcentrationMeasurement.id)
316
320
  return OzoneConcentrationMeasurementServer.with('NumericMeasurement');
317
- if (clusterId === FormaldehydeConcentrationMeasurement.Cluster.id)
321
+ if (clusterId === FormaldehydeConcentrationMeasurement.id)
318
322
  return FormaldehydeConcentrationMeasurementServer.with('NumericMeasurement');
319
- if (clusterId === Pm1ConcentrationMeasurement.Cluster.id)
323
+ if (clusterId === Pm1ConcentrationMeasurement.id)
320
324
  return Pm1ConcentrationMeasurementServer.with('NumericMeasurement');
321
- if (clusterId === Pm25ConcentrationMeasurement.Cluster.id)
325
+ if (clusterId === Pm25ConcentrationMeasurement.id)
322
326
  return Pm25ConcentrationMeasurementServer.with('NumericMeasurement');
323
- if (clusterId === Pm10ConcentrationMeasurement.Cluster.id)
327
+ if (clusterId === Pm10ConcentrationMeasurement.id)
324
328
  return Pm10ConcentrationMeasurementServer.with('NumericMeasurement');
325
- if (clusterId === RadonConcentrationMeasurement.Cluster.id)
329
+ if (clusterId === RadonConcentrationMeasurement.id)
326
330
  return RadonConcentrationMeasurementServer.with('NumericMeasurement');
327
- if (clusterId === TotalVolatileOrganicCompoundsConcentrationMeasurement.Cluster.id)
331
+ if (clusterId === TotalVolatileOrganicCompoundsConcentrationMeasurement.id)
328
332
  return TotalVolatileOrganicCompoundsConcentrationMeasurementServer.with('NumericMeasurement');
329
- if (clusterId === DeviceEnergyManagement.Cluster.id)
333
+ if (clusterId === DeviceEnergyManagement.id)
330
334
  return MatterbridgeDeviceEnergyManagementServer.with('PowerForecastReporting');
331
- if (clusterId === DeviceEnergyManagementMode.Cluster.id)
335
+ if (clusterId === DeviceEnergyManagementMode.id)
332
336
  return MatterbridgeDeviceEnergyManagementModeServer;
333
337
  return MatterbridgeIdentifyServer;
334
338
  }
@@ -469,85 +473,87 @@ export function addOptionalClusterServers(endpoint) {
469
473
  addClusterServers(endpoint, optionalServerList);
470
474
  }
471
475
  export function addClusterServers(endpoint, serverList) {
472
- if (serverList.includes(PowerSource.Cluster.id))
476
+ if (serverList.includes(PowerSource.id))
473
477
  endpoint.createDefaultPowerSourceWiredClusterServer();
474
- if (serverList.includes(Identify.Cluster.id))
478
+ if (serverList.includes(Identify.id))
475
479
  endpoint.createDefaultIdentifyClusterServer();
476
- if (serverList.includes(Groups.Cluster.id))
480
+ if (serverList.includes(Groups.id))
477
481
  endpoint.createDefaultGroupsClusterServer();
478
- if (serverList.includes(ScenesManagement.Cluster.id))
482
+ if (serverList.includes(ScenesManagement.id))
479
483
  endpoint.createDefaultScenesManagementClusterServer();
480
- if (serverList.includes(OnOff.Cluster.id))
484
+ if (serverList.includes(OnOff.id))
481
485
  endpoint.createDefaultOnOffClusterServer();
482
- if (serverList.includes(LevelControl.Cluster.id))
486
+ if (serverList.includes(LevelControl.id))
483
487
  endpoint.createDefaultLevelControlClusterServer();
484
- if (serverList.includes(ColorControl.Cluster.id))
488
+ if (serverList.includes(ColorControl.id))
485
489
  endpoint.createDefaultColorControlClusterServer();
486
- if (serverList.includes(WindowCovering.Cluster.id))
490
+ if (serverList.includes(WindowCovering.id))
487
491
  endpoint.createDefaultWindowCoveringClusterServer();
488
- if (serverList.includes(Thermostat.Cluster.id))
492
+ if (serverList.includes(Thermostat.id))
489
493
  endpoint.createDefaultThermostatClusterServer();
490
- if (serverList.includes(FanControl.Cluster.id))
494
+ if (serverList.includes(FanControl.id))
491
495
  endpoint.createDefaultFanControlClusterServer();
492
- if (serverList.includes(DoorLock.Cluster.id))
496
+ if (serverList.includes(DoorLock.id))
493
497
  endpoint.createDefaultDoorLockClusterServer();
494
- if (serverList.includes(ValveConfigurationAndControl.Cluster.id))
498
+ if (serverList.includes(ValveConfigurationAndControl.id))
495
499
  endpoint.createDefaultValveConfigurationAndControlClusterServer();
496
- if (serverList.includes(PumpConfigurationAndControl.Cluster.id))
500
+ if (serverList.includes(PumpConfigurationAndControl.id))
497
501
  endpoint.createDefaultPumpConfigurationAndControlClusterServer();
498
- if (serverList.includes(SmokeCoAlarm.Cluster.id))
502
+ if (serverList.includes(SmokeCoAlarm.id))
499
503
  endpoint.createDefaultSmokeCOAlarmClusterServer();
500
- if (serverList.includes(Switch.Cluster.id))
504
+ if (serverList.includes(Switch.id))
501
505
  endpoint.createDefaultSwitchClusterServer();
502
- if (serverList.includes(OperationalState.Cluster.id))
506
+ if (serverList.includes(OperationalState.id))
503
507
  endpoint.createDefaultOperationalStateClusterServer();
504
- if (serverList.includes(BooleanState.Cluster.id))
508
+ if (serverList.includes(BooleanState.id))
505
509
  endpoint.createDefaultBooleanStateClusterServer();
506
- if (serverList.includes(BooleanStateConfiguration.Cluster.id))
510
+ if (serverList.includes(BooleanStateConfiguration.id))
507
511
  endpoint.createDefaultBooleanStateConfigurationClusterServer();
508
- if (serverList.includes(PowerTopology.Cluster.id))
512
+ if (serverList.includes(PowerTopology.id))
509
513
  endpoint.createDefaultPowerTopologyClusterServer();
510
- if (serverList.includes(ElectricalPowerMeasurement.Cluster.id))
514
+ if (serverList.includes(ElectricalPowerMeasurement.id))
511
515
  endpoint.createDefaultElectricalPowerMeasurementClusterServer();
512
- if (serverList.includes(ElectricalEnergyMeasurement.Cluster.id))
516
+ if (serverList.includes(ElectricalEnergyMeasurement.id))
513
517
  endpoint.createDefaultElectricalEnergyMeasurementClusterServer();
514
- if (serverList.includes(TemperatureMeasurement.Cluster.id))
518
+ if (serverList.includes(TemperatureMeasurement.id))
515
519
  endpoint.createDefaultTemperatureMeasurementClusterServer();
516
- if (serverList.includes(RelativeHumidityMeasurement.Cluster.id))
520
+ if (serverList.includes(RelativeHumidityMeasurement.id))
517
521
  endpoint.createDefaultRelativeHumidityMeasurementClusterServer();
518
- if (serverList.includes(PressureMeasurement.Cluster.id))
522
+ if (serverList.includes(PressureMeasurement.id))
519
523
  endpoint.createDefaultPressureMeasurementClusterServer();
520
- if (serverList.includes(FlowMeasurement.Cluster.id))
524
+ if (serverList.includes(FlowMeasurement.id))
521
525
  endpoint.createDefaultFlowMeasurementClusterServer();
522
- if (serverList.includes(IlluminanceMeasurement.Cluster.id))
526
+ if (serverList.includes(IlluminanceMeasurement.id))
523
527
  endpoint.createDefaultIlluminanceMeasurementClusterServer();
524
- if (serverList.includes(OccupancySensing.Cluster.id))
528
+ if (serverList.includes(OccupancySensing.id))
525
529
  endpoint.createDefaultOccupancySensingClusterServer();
526
- if (serverList.includes(AirQuality.Cluster.id))
530
+ if (serverList.includes(SoilMeasurement.id))
531
+ endpoint.createDefaultSoilMeasurementClusterServer();
532
+ if (serverList.includes(AirQuality.id))
527
533
  endpoint.createDefaultAirQualityClusterServer();
528
- if (serverList.includes(CarbonMonoxideConcentrationMeasurement.Cluster.id))
534
+ if (serverList.includes(CarbonMonoxideConcentrationMeasurement.id))
529
535
  endpoint.createDefaultCarbonMonoxideConcentrationMeasurementClusterServer();
530
- if (serverList.includes(CarbonDioxideConcentrationMeasurement.Cluster.id))
536
+ if (serverList.includes(CarbonDioxideConcentrationMeasurement.id))
531
537
  endpoint.createDefaultCarbonDioxideConcentrationMeasurementClusterServer();
532
- if (serverList.includes(NitrogenDioxideConcentrationMeasurement.Cluster.id))
538
+ if (serverList.includes(NitrogenDioxideConcentrationMeasurement.id))
533
539
  endpoint.createDefaultNitrogenDioxideConcentrationMeasurementClusterServer();
534
- if (serverList.includes(OzoneConcentrationMeasurement.Cluster.id))
540
+ if (serverList.includes(OzoneConcentrationMeasurement.id))
535
541
  endpoint.createDefaultOzoneConcentrationMeasurementClusterServer();
536
- if (serverList.includes(FormaldehydeConcentrationMeasurement.Cluster.id))
542
+ if (serverList.includes(FormaldehydeConcentrationMeasurement.id))
537
543
  endpoint.createDefaultFormaldehydeConcentrationMeasurementClusterServer();
538
- if (serverList.includes(Pm1ConcentrationMeasurement.Cluster.id))
544
+ if (serverList.includes(Pm1ConcentrationMeasurement.id))
539
545
  endpoint.createDefaultPm1ConcentrationMeasurementClusterServer();
540
- if (serverList.includes(Pm25ConcentrationMeasurement.Cluster.id))
546
+ if (serverList.includes(Pm25ConcentrationMeasurement.id))
541
547
  endpoint.createDefaultPm25ConcentrationMeasurementClusterServer();
542
- if (serverList.includes(Pm10ConcentrationMeasurement.Cluster.id))
548
+ if (serverList.includes(Pm10ConcentrationMeasurement.id))
543
549
  endpoint.createDefaultPm10ConcentrationMeasurementClusterServer();
544
- if (serverList.includes(RadonConcentrationMeasurement.Cluster.id))
550
+ if (serverList.includes(RadonConcentrationMeasurement.id))
545
551
  endpoint.createDefaultRadonConcentrationMeasurementClusterServer();
546
- if (serverList.includes(TotalVolatileOrganicCompoundsConcentrationMeasurement.Cluster.id))
552
+ if (serverList.includes(TotalVolatileOrganicCompoundsConcentrationMeasurement.id))
547
553
  endpoint.createDefaultTvocMeasurementClusterServer();
548
- if (serverList.includes(DeviceEnergyManagement.Cluster.id))
554
+ if (serverList.includes(DeviceEnergyManagement.id))
549
555
  endpoint.createDefaultDeviceEnergyManagementClusterServer();
550
- if (serverList.includes(DeviceEnergyManagementMode.Cluster.id))
556
+ if (serverList.includes(DeviceEnergyManagementMode.id))
551
557
  endpoint.createDefaultDeviceEnergyManagementModeClusterServer();
552
558
  }
553
559
  export function addClusterClients(endpoint, clientList) {
@@ -602,7 +608,7 @@ export function addOptionalClusterClients(endpoint) {
602
608
  addClusterClients(endpoint, optionalClientList);
603
609
  }
604
610
  export async function addFixedLabel(endpoint, label, value) {
605
- if (!endpoint.hasClusterServer(FixedLabel.Cluster.id)) {
611
+ if (!endpoint.hasClusterServer(FixedLabel.id)) {
606
612
  endpoint.log.debug(`addFixedLabel: add cluster ${hk}FixedLabel${db}:${hk}fixedLabel${db} with label ${CYAN}${label}${db} value ${CYAN}${value}${db}`);
607
613
  endpoint.behaviors.require(FixedLabelServer, {
608
614
  labelList: [{ label: label.substring(0, 16), value: value.substring(0, 16) }],
@@ -610,15 +616,15 @@ export async function addFixedLabel(endpoint, label, value) {
610
616
  return;
611
617
  }
612
618
  endpoint.log.debug(`addFixedLabel: add label ${CYAN}${label}${db} value ${CYAN}${value}${db}`);
613
- let labelList = endpoint.getAttribute(FixedLabel.Cluster.id, 'labelList', endpoint.log);
619
+ let labelList = endpoint.getAttribute(FixedLabel.id, 'labelList', endpoint.log);
614
620
  if (isValidArray(labelList)) {
615
621
  labelList = labelList.filter((entry) => entry.label !== label.substring(0, 16));
616
622
  labelList.push({ label: label.substring(0, 16), value: value.substring(0, 16) });
617
- await endpoint.setAttribute(FixedLabel.Cluster.id, 'labelList', labelList, endpoint.log);
623
+ await endpoint.setAttribute(FixedLabel.id, 'labelList', labelList, endpoint.log);
618
624
  }
619
625
  }
620
626
  export async function addUserLabel(endpoint, label, value) {
621
- if (!endpoint.hasClusterServer(UserLabel.Cluster.id)) {
627
+ if (!endpoint.hasClusterServer(UserLabel.id)) {
622
628
  endpoint.log.debug(`addUserLabel: add cluster ${hk}UserLabel${db}:${hk}userLabel${db} with label ${CYAN}${label}${db} value ${CYAN}${value}${db}`);
623
629
  endpoint.behaviors.require(UserLabelServer, {
624
630
  labelList: [{ label: label.substring(0, 16), value: value.substring(0, 16) }],
@@ -626,11 +632,11 @@ export async function addUserLabel(endpoint, label, value) {
626
632
  return;
627
633
  }
628
634
  endpoint.log.debug(`addUserLabel: add label ${CYAN}${label}${db} value ${CYAN}${value}${db}`);
629
- let labelList = endpoint.getAttribute(UserLabel.Cluster.id, 'labelList', endpoint.log);
635
+ let labelList = endpoint.getAttribute(UserLabel.id, 'labelList', endpoint.log);
630
636
  if (isValidArray(labelList)) {
631
637
  labelList = labelList.filter((entry) => entry.label !== label.substring(0, 16));
632
638
  labelList.push({ label: label.substring(0, 16), value: value.substring(0, 16) });
633
- await endpoint.setAttribute(UserLabel.Cluster.id, 'labelList', labelList, endpoint.log);
639
+ await endpoint.setAttribute(UserLabel.id, 'labelList', labelList, endpoint.log);
634
640
  }
635
641
  }
636
642
  export function getClusterId(endpoint, cluster) {
@@ -812,7 +818,7 @@ export function getDefaultPowerSourceReplaceableBatteryClusterServer(batPercentR
812
818
  description: 'Primary battery',
813
819
  endpointList: [],
814
820
  batVoltage,
815
- batPercentRemaining: Math.min(Math.max(batPercentRemaining * 2, 0), 200),
821
+ batPercentRemaining: batPercentRemaining !== null ? Math.min(Math.max(batPercentRemaining * 2, 0), 200) : null,
816
822
  batChargeLevel,
817
823
  batReplacementNeeded: false,
818
824
  batReplaceability,
@@ -828,7 +834,7 @@ export function getDefaultPowerSourceRechargeableBatteryClusterServer(batPercent
828
834
  description: 'Primary battery',
829
835
  endpointList: [],
830
836
  batVoltage,
831
- batPercentRemaining: Math.min(Math.max(batPercentRemaining * 2, 0), 200),
837
+ batPercentRemaining: batPercentRemaining !== null ? Math.min(Math.max(batPercentRemaining * 2, 0), 200) : null,
832
838
  batTimeRemaining: null,
833
839
  batChargeLevel,
834
840
  batReplacementNeeded: false,
@@ -1040,3 +1046,15 @@ export function getDefaultOccupancySensingClusterServer(occupied = false, holdTi
1040
1046
  holdTimeLimits: { holdTimeMin, holdTimeMax, holdTimeDefault: holdTime },
1041
1047
  });
1042
1048
  }
1049
+ export function getDefaultSoilMeasurementClusterServer(soilMoistureMeasuredValue = null, soilMoistureMeasurementLimits) {
1050
+ return optionsFor(SoilMeasurementServer, {
1051
+ soilMoistureMeasuredValue,
1052
+ soilMoistureMeasurementLimits: soilMoistureMeasurementLimits ?? {
1053
+ measurementType: MeasurementType.SoilMoisture,
1054
+ measured: true,
1055
+ minMeasuredValue: 0,
1056
+ maxMeasuredValue: 100,
1057
+ accuracyRanges: [{ rangeMin: 0, rangeMax: 100, fixedMax: 1 }],
1058
+ },
1059
+ });
1060
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/core",
3
- "version": "3.8.1-dev-20260608-9dc483f",
3
+ "version": "3.8.1-dev-20260609-37884d6",
4
4
  "description": "Matterbridge core library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -130,10 +130,10 @@
130
130
  ],
131
131
  "dependencies": {
132
132
  "@matter/main": "0.17.2-alpha.0-20260606-610f30128",
133
- "@matterbridge/dgram": "3.8.1-dev-20260608-9dc483f",
134
- "@matterbridge/thread": "3.8.1-dev-20260608-9dc483f",
135
- "@matterbridge/types": "3.8.1-dev-20260608-9dc483f",
136
- "@matterbridge/utils": "3.8.1-dev-20260608-9dc483f",
133
+ "@matterbridge/dgram": "3.8.1-dev-20260609-37884d6",
134
+ "@matterbridge/thread": "3.8.1-dev-20260609-37884d6",
135
+ "@matterbridge/types": "3.8.1-dev-20260609-37884d6",
136
+ "@matterbridge/utils": "3.8.1-dev-20260609-37884d6",
137
137
  "escape-html": "1.0.3",
138
138
  "express": "5.2.1",
139
139
  "express-rate-limit": "8.5.2",