matterbridge-example-dynamic-platform 1.3.8 → 1.3.9-dev-20250901-ccc8cd6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -23,6 +23,34 @@ If you like this project and find it useful, please consider giving it a star on
23
23
  <img src="bmc-button.svg" alt="Buy me a coffee" width="120">
24
24
  </a>
25
25
 
26
+ ## [1.3.9] - 2025-08-30
27
+
28
+ ### Added
29
+
30
+ - [platform]: Added a door contact sensor
31
+ - [platform]: Added a motion sensor
32
+ - [platform]: Added an illuminance sensor
33
+ - [platform]: Added a temperature sensor
34
+ - [platform]: Added an humidity sensor
35
+ - [platform]: Added a pressure sensor
36
+ - [platform]: Added a flow sensor
37
+ - [platform]: Added a climate sensor with temperature, humidity and pressure
38
+ - [platform]: Added a mode select device
39
+ - [platform]: Added animation in 10 phases for refrigerator
40
+ - [platform]: Added animation in 10 phases for oven
41
+ - [platform]: Added animation in 10 phases for rvc
42
+
43
+ ### Changed
44
+
45
+ - [package]: Updated dependencies.
46
+ - [package]: Updated to Automator v. 2.0.5.
47
+ - [devContainer]: Updated devContainer with repository name for the container and shallow clone matterbridge for speed and memory optimization.
48
+ - [package]: Required matterbridge 3.2.5.
49
+
50
+ <a href="https://www.buymeacoffee.com/luligugithub">
51
+ <img src="bmc-button.svg" alt="Buy me a coffee" width="80">
52
+ </a>
53
+
26
54
  ## [1.3.8] - 2025-08-20
27
55
 
28
56
  ### Added
package/README.md CHANGED
@@ -17,8 +17,17 @@
17
17
 
18
18
  Matterbridge dynamic platform example plugin is a template to develop your own plugin using the dynamic platform.
19
19
 
20
- It exposes 47 virtual devices:
20
+ It exposes 56 virtual devices:
21
21
 
22
+ - a door contact sensor
23
+ - a motion sensor
24
+ - an illuminance sensor
25
+ - a temperature sensor
26
+ - an humidity sensor
27
+ - a pressure sensor
28
+ - a flow sensor
29
+ - a climate sensor with temperature, humidity and pressure
30
+ - a mode select device
22
31
  - a switch with onOff cluster
23
32
  - a light with onOff
24
33
  - a light with onOff and levelControl (dimmer)
@@ -83,3 +92,7 @@ If you like this project and find it useful, please consider giving it a star on
83
92
  ### Matterbridge
84
93
 
85
94
  See the guidelines on [Matterbridge](https://github.com/Luligu/matterbridge/blob/main/README.md) for more information.
95
+
96
+ ## Style guide
97
+
98
+ See also the [Style Guide](./STYLE_GUIDE.md) for JSDoc, naming and logging conventions used in this repository.
package/dist/platform.js CHANGED
@@ -1,10 +1,34 @@
1
- import { MatterbridgeEndpoint, MatterbridgeDynamicPlatform, airQualitySensor, bridgedNode, colorTemperatureLight, coverDevice, dimmableLight, doorLockDevice, fanDevice, flowSensor, humiditySensor, onOffLight, onOffOutlet, onOffSwitch, powerSource, rainSensor, smokeCoAlarm, temperatureSensor, thermostatDevice, waterFreezeDetector, waterLeakDetector, airPurifier, pumpDevice, waterValve, genericSwitch, airConditioner, onOffMountedSwitch, dimmableMountedSwitch, extendedColorLight, } from 'matterbridge';
1
+ import { MatterbridgeEndpoint, MatterbridgeDynamicPlatform, airQualitySensor, bridgedNode, colorTemperatureLight, coverDevice, dimmableLight, doorLockDevice, fanDevice, flowSensor, humiditySensor, onOffLight, onOffOutlet, onOffSwitch, powerSource, rainSensor, smokeCoAlarm, temperatureSensor, thermostatDevice, waterFreezeDetector, waterLeakDetector, airPurifier, pumpDevice, waterValve, genericSwitch, airConditioner, onOffMountedSwitch, dimmableMountedSwitch, extendedColorLight, pressureSensor, contactSensor, occupancySensor, lightSensor, modeSelect, } from 'matterbridge';
2
2
  import { RoboticVacuumCleaner, LaundryWasher, WaterHeater, Evse, SolarPower, BatteryStorage, LaundryDryer, HeatPump, Dishwasher, ExtractorHood, MicrowaveOven, Oven, Cooktop, Refrigerator, } from 'matterbridge/devices';
3
- import { isValidBoolean, isValidNumber, isValidString } from 'matterbridge/utils';
3
+ import { isValidBoolean, isValidNumber, isValidObject, isValidString } from 'matterbridge/utils';
4
4
  import { debugStringify } from 'matterbridge/logger';
5
5
  import { AreaNamespaceTag, LocationTag, NumberTag, PositionTag, RefrigeratorTag, SwitchesTag, UINT16_MAX, UINT32_MAX } from 'matterbridge/matter';
6
- import { PowerSource, BooleanState, OnOff, LevelControl, AirQuality, CarbonDioxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurement, FlowMeasurement, ColorControl, DoorLock, FanControl, FormaldehydeConcentrationMeasurement, NitrogenDioxideConcentrationMeasurement, OzoneConcentrationMeasurement, Pm10ConcentrationMeasurement, Pm1ConcentrationMeasurement, Pm25ConcentrationMeasurement, RadonConcentrationMeasurement, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, SmokeCoAlarm, TemperatureMeasurement, Thermostat, ThermostatCluster, TotalVolatileOrganicCompoundsConcentrationMeasurement, WindowCovering, EnergyEvseMode, EnergyEvse, RvcRunMode, RvcCleanMode, ConcentrationMeasurement, Descriptor, BridgedDeviceBasicInformation, OvenMode, OperationalState, } from 'matterbridge/matter/clusters';
6
+ import { PowerSource, BooleanState, OnOff, LevelControl, AirQuality, CarbonDioxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurement, FlowMeasurement, ColorControl, DoorLock, FanControl, FormaldehydeConcentrationMeasurement, NitrogenDioxideConcentrationMeasurement, OzoneConcentrationMeasurement, Pm10ConcentrationMeasurement, Pm1ConcentrationMeasurement, Pm25ConcentrationMeasurement, RadonConcentrationMeasurement, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, SmokeCoAlarm, TemperatureMeasurement, Thermostat, ThermostatCluster, TotalVolatileOrganicCompoundsConcentrationMeasurement, WindowCovering, EnergyEvseMode, EnergyEvse, RvcRunMode, RvcCleanMode, ConcentrationMeasurement, Descriptor, BridgedDeviceBasicInformation, OvenMode, OperationalState, OccupancySensing, IlluminanceMeasurement, PressureMeasurement, RefrigeratorAndTemperatureControlledCabinetMode, RvcOperationalState, } from 'matterbridge/matter/clusters';
7
+ function luxToMatter(lux) {
8
+ if (!Number.isFinite(lux) || lux <= 0)
9
+ return 0;
10
+ const encoded = 10000 * Math.log10(lux);
11
+ if (!Number.isFinite(encoded) || encoded < 0)
12
+ return 0;
13
+ return Math.round(Math.min(encoded, 0xfffe));
14
+ }
15
+ function matterToLux(value) {
16
+ if (!Number.isFinite(value) || value <= 0)
17
+ return 0;
18
+ const v = Math.min(value, 0xfffe);
19
+ const lux = Math.pow(10, v / 10000);
20
+ return Math.round(lux < 0 ? 0 : lux);
21
+ }
7
22
  export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatform {
23
+ door;
24
+ occupancy;
25
+ illuminance;
26
+ temperature;
27
+ humidity;
28
+ pressure;
29
+ flow;
30
+ select;
31
+ climate;
8
32
  switch;
9
33
  mountedOnOffSwitch;
10
34
  mountedDimmerSwitch;
@@ -53,6 +77,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
53
77
  oven;
54
78
  cooktop;
55
79
  refrigerator;
80
+ phaseInterval;
81
+ phase = -1;
82
+ sensorInterval;
56
83
  switchInterval;
57
84
  lightInterval;
58
85
  outletInterval;
@@ -69,15 +96,15 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
69
96
  genericSwitchInterval;
70
97
  genericSwitchLastEvent = 'Release';
71
98
  intervalOnOff = false;
72
- intervalLevel = 0;
99
+ intervalLevel = 1;
73
100
  intervalColorTemperature = 147;
74
101
  bridgedDevices = new Map();
75
102
  fanModeLookup = ['Off', 'Low', 'Medium', 'High', 'On', 'Auto', 'Smart'];
76
103
  fanDirectionLookup = ['Forward', 'Reverse'];
77
104
  constructor(matterbridge, log, config) {
78
105
  super(matterbridge, log, config);
79
- if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('3.2.3')) {
80
- throw new Error(`This plugin requires Matterbridge version >= "3.2.3". Please update Matterbridge from ${this.matterbridge.matterbridgeVersion} to the latest version in the frontend.`);
106
+ if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('3.2.5')) {
107
+ throw new Error(`This plugin requires Matterbridge version >= "3.2.5". Please update Matterbridge from ${this.matterbridge.matterbridgeVersion} to the latest version in the frontend.`);
81
108
  }
82
109
  this.log.info('Initializing platform:', this.config.name);
83
110
  if (config.whiteList === undefined)
@@ -93,12 +120,82 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
93
120
  this.log.info('onStart called with reason:', reason ?? 'none');
94
121
  await this.ready;
95
122
  await this.clearSelect();
123
+ this.door = new MatterbridgeEndpoint([contactSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Door' }, this.config.debug)
124
+ .createDefaultIdentifyClusterServer()
125
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Door', 'DOO00001', 0xfff1, 'Matterbridge', 'Matterbridge Door')
126
+ .createDefaultBooleanStateClusterServer(true)
127
+ .createDefaultPowerSourceReplaceableBatteryClusterServer(90, PowerSource.BatChargeLevel.Ok, 2990, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
128
+ .addRequiredClusterServers();
129
+ this.door = await this.addDevice(this.door);
130
+ this.occupancy = new MatterbridgeEndpoint([occupancySensor, bridgedNode, powerSource], { uniqueStorageKey: 'Occupancy' }, this.config.debug)
131
+ .createDefaultIdentifyClusterServer()
132
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Occupancy', 'OCC00002', 0xfff1, 'Matterbridge', 'Matterbridge Occupancy')
133
+ .createDefaultOccupancySensingClusterServer(false)
134
+ .createDefaultPowerSourceReplaceableBatteryClusterServer(70, PowerSource.BatChargeLevel.Ok, 2950, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
135
+ .addRequiredClusterServers();
136
+ this.occupancy = await this.addDevice(this.occupancy);
137
+ this.illuminance = new MatterbridgeEndpoint([lightSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Illuminance' }, this.config.debug)
138
+ .createDefaultIdentifyClusterServer()
139
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Illuminance', 'ILL00003', 0xfff1, 'Matterbridge', 'Matterbridge Illuminance')
140
+ .createDefaultIlluminanceMeasurementClusterServer(luxToMatter(1))
141
+ .createDefaultPowerSourceReplaceableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 3100, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
142
+ .addRequiredClusterServers();
143
+ this.illuminance = await this.addDevice(this.illuminance);
144
+ this.temperature = new MatterbridgeEndpoint([temperatureSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Temperature' }, this.config.debug)
145
+ .createDefaultIdentifyClusterServer()
146
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Temperature', 'TEM00004', 0xfff1, 'Matterbridge', 'Matterbridge Temperature')
147
+ .createDefaultTemperatureMeasurementClusterServer(1000)
148
+ .createDefaultPowerSourceReplaceableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 3100, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
149
+ .addRequiredClusterServers();
150
+ this.temperature = await this.addDevice(this.temperature);
151
+ this.humidity = new MatterbridgeEndpoint([humiditySensor, bridgedNode, powerSource], { uniqueStorageKey: 'Humidity' }, this.config.debug)
152
+ .createDefaultIdentifyClusterServer()
153
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Humidity', 'HUM00005', 0xfff1, 'Matterbridge', 'Matterbridge Humidity')
154
+ .createDefaultRelativeHumidityMeasurementClusterServer(1000)
155
+ .createDefaultPowerSourceReplaceableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 3100, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
156
+ .addRequiredClusterServers();
157
+ this.humidity = await this.addDevice(this.humidity);
158
+ this.pressure = new MatterbridgeEndpoint([pressureSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Pressure' }, this.config.debug)
159
+ .createDefaultIdentifyClusterServer()
160
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Pressure', 'PRE00006', 0xfff1, 'Matterbridge', 'Matterbridge Pressure')
161
+ .createDefaultPressureMeasurementClusterServer(9000)
162
+ .createDefaultPowerSourceReplaceableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 3050, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
163
+ .addRequiredClusterServers();
164
+ this.pressure = await this.addDevice(this.pressure);
165
+ this.flow = new MatterbridgeEndpoint([flowSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Flow' }, this.config.debug)
166
+ .createDefaultIdentifyClusterServer()
167
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Flow', 'FLO00007', 0xfff1, 'Matterbridge', 'Matterbridge Flow')
168
+ .createDefaultFlowMeasurementClusterServer(10)
169
+ .createDefaultPowerSourceReplaceableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 3050, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
170
+ .addRequiredClusterServers();
171
+ this.flow = await this.addDevice(this.flow);
172
+ this.climate = new MatterbridgeEndpoint([temperatureSensor, humiditySensor, pressureSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Climate' }, this.config.debug)
173
+ .createDefaultIdentifyClusterServer()
174
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Climate', 'CLI00008', 0xfff1, 'Matterbridge', 'Matterbridge Climate')
175
+ .createDefaultTemperatureMeasurementClusterServer(1000)
176
+ .createDefaultRelativeHumidityMeasurementClusterServer(1000)
177
+ .createDefaultPressureMeasurementClusterServer(9000)
178
+ .createDefaultPowerSourceReplaceableBatteryClusterServer(90, PowerSource.BatChargeLevel.Ok, 2990, '2 x AA', 2, PowerSource.BatReplaceability.UserReplaceable)
179
+ .addRequiredClusterServers();
180
+ this.climate = await this.addDevice(this.climate);
181
+ this.select = new MatterbridgeEndpoint([modeSelect, bridgedNode, powerSource], { uniqueStorageKey: 'Select' }, this.config.debug)
182
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Select', 'SEL00009', 0xfff1, 'Matterbridge', 'Matterbridge Select')
183
+ .createDefaultModeSelectClusterServer('Night mode', [
184
+ { label: 'Led ON', mode: 1, semanticTags: [] },
185
+ { label: 'Led OFF', mode: 2, semanticTags: [] },
186
+ ], 1, 1)
187
+ .createDefaultPowerSourceWiredClusterServer()
188
+ .addRequiredClusterServers();
189
+ this.select = await this.addDevice(this.select);
190
+ this.select?.addCommandHandler('changeToMode', async ({ request: { newMode } }) => {
191
+ this.log.info(`Command changeToMode called newMode:${newMode}`);
192
+ });
96
193
  this.switch = new MatterbridgeEndpoint([onOffSwitch, bridgedNode, powerSource], { uniqueStorageKey: 'Switch' }, this.config.debug)
97
194
  .createDefaultIdentifyClusterServer()
98
195
  .createDefaultGroupsClusterServer()
99
- .createDefaultBridgedDeviceBasicInformationClusterServer('Switch', '0x23452164', 0xfff1, 'Matterbridge', 'Matterbridge Switch')
196
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Switch', 'SWI00010', 0xfff1, 'Matterbridge', 'Matterbridge Switch')
100
197
  .createDefaultOnOffClusterServer()
101
- .createDefaultPowerSourceRechargeableBatteryClusterServer(70);
198
+ .createDefaultPowerSourceWiredClusterServer();
102
199
  this.switch = await this.addDevice(this.switch);
103
200
  this.switch?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
104
201
  this.log.info(`Command identify called identifyTime:${identifyTime}`);
@@ -114,9 +211,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
114
211
  this.mountedOnOffSwitch = new MatterbridgeEndpoint([onOffMountedSwitch, bridgedNode, powerSource], { uniqueStorageKey: 'OnOffMountedSwitch' }, this.config.debug)
115
212
  .createDefaultIdentifyClusterServer()
116
213
  .createDefaultGroupsClusterServer()
117
- .createDefaultBridgedDeviceBasicInformationClusterServer('OnOff Mounted Switch', '0x298242164', 0xfff1, 'Matterbridge', 'Matterbridge OnOff Mounted Switch')
214
+ .createDefaultBridgedDeviceBasicInformationClusterServer('OnOff Mounted Switch', 'OMS00011', 0xfff1, 'Matterbridge', 'Matterbridge OnOff Mounted Switch')
118
215
  .createDefaultOnOffClusterServer()
119
- .createDefaultPowerSourceRechargeableBatteryClusterServer(70);
216
+ .createDefaultPowerSourceWiredClusterServer();
120
217
  this.mountedOnOffSwitch = await this.addDevice(this.mountedOnOffSwitch);
121
218
  this.mountedOnOffSwitch?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
122
219
  this.mountedOnOffSwitch?.log.info(`Command identify called identifyTime:${identifyTime}`);
@@ -132,7 +229,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
132
229
  this.mountedDimmerSwitch = new MatterbridgeEndpoint([dimmableMountedSwitch, bridgedNode, powerSource], { uniqueStorageKey: 'DimmerMountedSwitch' }, this.config.debug)
133
230
  .createDefaultIdentifyClusterServer()
134
231
  .createDefaultGroupsClusterServer()
135
- .createDefaultBridgedDeviceBasicInformationClusterServer('Dimmer Mounted Switch', '0x22145578864', 0xfff1, 'Matterbridge', 'Matterbridge Dimmer Mounted Switch')
232
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Dimmer Mounted Switch', 'DMS00012', 0xfff1, 'Matterbridge', 'Matterbridge Dimmer Mounted Switch')
136
233
  .createDefaultOnOffClusterServer()
137
234
  .createDefaultLevelControlClusterServer()
138
235
  .createDefaultPowerSourceWiredClusterServer()
@@ -160,7 +257,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
160
257
  this.lightOnOff = new MatterbridgeEndpoint([onOffLight, bridgedNode, powerSource], { uniqueStorageKey: 'Light (on/off)' }, this.config.debug)
161
258
  .createDefaultIdentifyClusterServer()
162
259
  .createDefaultGroupsClusterServer()
163
- .createDefaultBridgedDeviceBasicInformationClusterServer('Light (on/off)', '0x2342375564', 0xfff1, 'Matterbridge', 'Matterbridge Light on/off')
260
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Light (on/off)', 'LON00013', 0xfff1, 'Matterbridge', 'Matterbridge Light on/off')
164
261
  .createDefaultOnOffClusterServer()
165
262
  .createDefaultPowerSourceWiredClusterServer();
166
263
  this.lightOnOff = await this.addDevice(this.lightOnOff);
@@ -178,10 +275,10 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
178
275
  this.dimmer = new MatterbridgeEndpoint([dimmableLight, bridgedNode, powerSource], { uniqueStorageKey: 'Dimmer' }, this.config.debug)
179
276
  .createDefaultIdentifyClusterServer()
180
277
  .createDefaultGroupsClusterServer()
181
- .createDefaultBridgedDeviceBasicInformationClusterServer('Dimmer', '0x234554564', 0xfff1, 'Matterbridge', 'Matterbridge Dimmer')
278
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Dimmer', 'DMR00014', 0xfff1, 'Matterbridge', 'Matterbridge Dimmer')
182
279
  .createDefaultOnOffClusterServer()
183
280
  .createDefaultLevelControlClusterServer()
184
- .createDefaultPowerSourceReplaceableBatteryClusterServer(70, PowerSource.BatChargeLevel.Ok, 2990, '2 x AA', 2);
281
+ .createDefaultPowerSourceWiredClusterServer();
185
282
  this.dimmer = await this.addDevice(this.dimmer);
186
283
  this.dimmer?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
187
284
  this.dimmer?.log.info(`Command identify called identifyTime:${identifyTime}`);
@@ -205,11 +302,11 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
205
302
  this.light = new MatterbridgeEndpoint([extendedColorLight, bridgedNode, powerSource], { uniqueStorageKey: 'Light (XY, HS and CT)' }, this.config.debug)
206
303
  .createDefaultIdentifyClusterServer()
207
304
  .createDefaultGroupsClusterServer()
208
- .createDefaultBridgedDeviceBasicInformationClusterServer('Light (XY, HS and CT)', '0x23480564', 0xfff1, 'Matterbridge', 'Matterbridge Light')
305
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Light (XY, HS and CT)', 'LXC00015', 0xfff1, 'Matterbridge', 'Matterbridge Light')
209
306
  .createDefaultOnOffClusterServer()
210
307
  .createDefaultLevelControlClusterServer()
211
308
  .createDefaultColorControlClusterServer()
212
- .createDefaultPowerSourceReplaceableBatteryClusterServer(70);
309
+ .createDefaultPowerSourceWiredClusterServer();
213
310
  this.light = await this.addDevice(this.light);
214
311
  this.light?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
215
312
  this.light?.log.info(`Command identify called identifyTime:${identifyTime}`);
@@ -255,7 +352,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
255
352
  this.lightHS = new MatterbridgeEndpoint([colorTemperatureLight, bridgedNode, powerSource], { uniqueStorageKey: 'Light (HS, CT)' }, this.config.debug)
256
353
  .createDefaultIdentifyClusterServer()
257
354
  .createDefaultGroupsClusterServer()
258
- .createDefaultBridgedDeviceBasicInformationClusterServer('Light (HS, CT)', '0x25097564', 0xfff1, 'Matterbridge', 'Matterbridge Light')
355
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Light (HS, CT)', 'LHC00016', 0xfff1, 'Matterbridge', 'Matterbridge Light')
259
356
  .createDefaultOnOffClusterServer()
260
357
  .createDefaultLevelControlClusterServer()
261
358
  .createHsColorControlClusterServer()
@@ -300,7 +397,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
300
397
  this.lightXY = new MatterbridgeEndpoint([extendedColorLight, bridgedNode, powerSource], { uniqueStorageKey: 'Light (XY, CT)' }, this.config.debug)
301
398
  .createDefaultIdentifyClusterServer()
302
399
  .createDefaultGroupsClusterServer()
303
- .createDefaultBridgedDeviceBasicInformationClusterServer('Light (XY, CT)', '0x23497564', 0xfff1, 'Matterbridge', 'Matterbridge Light')
400
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Light (XY, CT)', 'LXT00017', 0xfff1, 'Matterbridge', 'Matterbridge Light')
304
401
  .createDefaultOnOffClusterServer()
305
402
  .createDefaultLevelControlClusterServer()
306
403
  .createXyColorControlClusterServer()
@@ -337,11 +434,11 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
337
434
  this.lightCT = new MatterbridgeEndpoint([colorTemperatureLight, bridgedNode, powerSource], { uniqueStorageKey: 'Light (CT)' }, this.config.debug)
338
435
  .createDefaultIdentifyClusterServer()
339
436
  .createDefaultGroupsClusterServer()
340
- .createDefaultBridgedDeviceBasicInformationClusterServer('Light (CT)', '0x23480749', 0xfff1, 'Matterbridge', 'Matterbridge Light')
437
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Light (CT)', 'LCT00018', 0xfff1, 'Matterbridge', 'Matterbridge Light')
341
438
  .createDefaultOnOffClusterServer()
342
439
  .createDefaultLevelControlClusterServer()
343
440
  .createCtColorControlClusterServer()
344
- .createDefaultPowerSourceReplaceableBatteryClusterServer(70);
441
+ .createDefaultPowerSourceWiredClusterServer();
345
442
  this.lightCT = await this.addDevice(this.lightCT);
346
443
  this.lightCT?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
347
444
  this.lightCT?.log.info(`Command identify called identifyTime:${identifyTime}`);
@@ -369,7 +466,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
369
466
  this.outlet = new MatterbridgeEndpoint([onOffOutlet, bridgedNode, powerSource], { uniqueStorageKey: 'Outlet' }, this.config.debug)
370
467
  .createDefaultIdentifyClusterServer()
371
468
  .createDefaultGroupsClusterServer()
372
- .createDefaultBridgedDeviceBasicInformationClusterServer('Outlet', '0x29252164', 0xfff1, 'Matterbridge', 'Matterbridge Outlet')
469
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Outlet', 'OUT00019', 0xfff1, 'Matterbridge', 'Matterbridge Outlet')
373
470
  .createDefaultOnOffClusterServer()
374
471
  .createDefaultPowerSourceWiredClusterServer();
375
472
  this.outlet = await this.addDevice(this.outlet);
@@ -387,9 +484,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
387
484
  this.coverLift = new MatterbridgeEndpoint([coverDevice, bridgedNode, powerSource], { uniqueStorageKey: 'CoverLift' }, this.config.debug)
388
485
  .createDefaultIdentifyClusterServer()
389
486
  .createDefaultGroupsClusterServer()
390
- .createDefaultBridgedDeviceBasicInformationClusterServer('Cover lift', 'CL01020564', 0xfff1, 'Matterbridge', 'Matterbridge Cover')
487
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Cover lift', 'COV00020', 0xfff1, 'Matterbridge', 'Matterbridge Cover')
391
488
  .createDefaultWindowCoveringClusterServer()
392
- .createDefaultPowerSourceRechargeableBatteryClusterServer(86);
489
+ .createDefaultPowerSourceWiredClusterServer();
393
490
  this.coverLift = await this.addDevice(this.coverLift);
394
491
  this.coverLift?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
395
492
  this.coverLift?.log.info(`Command identify called identifyTime:${identifyTime}`);
@@ -413,9 +510,9 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
413
510
  this.coverLiftTilt = new MatterbridgeEndpoint([coverDevice, bridgedNode, powerSource], { uniqueStorageKey: 'CoverLiftTilt' }, this.config.debug)
414
511
  .createDefaultIdentifyClusterServer()
415
512
  .createDefaultGroupsClusterServer()
416
- .createDefaultBridgedDeviceBasicInformationClusterServer('Cover lift and tilt', 'CLT01020554', 0xfff1, 'Matterbridge', 'Matterbridge Cover')
513
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Cover lift and tilt', 'CLT00021', 0xfff1, 'Matterbridge', 'Matterbridge Cover')
417
514
  .createDefaultLiftTiltWindowCoveringClusterServer()
418
- .createDefaultPowerSourceRechargeableBatteryClusterServer(86);
515
+ .createDefaultPowerSourceWiredClusterServer();
419
516
  this.coverLiftTilt = await this.addDevice(this.coverLiftTilt);
420
517
  this.coverLiftTilt?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
421
518
  this.coverLiftTilt?.log.info(`Command identify called identifyTime:${identifyTime}`);
@@ -443,7 +540,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
443
540
  });
444
541
  this.lock = new MatterbridgeEndpoint([doorLockDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Lock' }, this.config.debug)
445
542
  .createDefaultIdentifyClusterServer()
446
- .createDefaultBridgedDeviceBasicInformationClusterServer('Lock', '0x96352164', 0xfff1, 'Matterbridge', 'Matterbridge Lock')
543
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Lock', 'LOC00022', 0xfff1, 'Matterbridge', 'Matterbridge Lock')
447
544
  .createDefaultDoorLockClusterServer()
448
545
  .createDefaultPowerSourceRechargeableBatteryClusterServer(30);
449
546
  this.lock = await this.addDevice(this.lock);
@@ -461,7 +558,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
461
558
  this.thermoAuto = new MatterbridgeEndpoint([thermostatDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Thermostat (AutoMode)' }, this.config.debug)
462
559
  .createDefaultIdentifyClusterServer()
463
560
  .createDefaultGroupsClusterServer()
464
- .createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (AutoMode)', '0x96382164A', 0xfff1, 'Matterbridge', 'Matterbridge Thermostat')
561
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (AutoMode)', 'TAU00023', 0xfff1, 'Matterbridge', 'Matterbridge Thermostat')
465
562
  .createDefaultThermostatClusterServer(20, 18, 22)
466
563
  .createDefaultPowerSourceRechargeableBatteryClusterServer(70, PowerSource.BatChargeLevel.Ok, 4700);
467
564
  this.thermoAuto
@@ -510,7 +607,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
510
607
  this.thermoHeat = new MatterbridgeEndpoint([thermostatDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Thermostat (Heat)' }, this.config.debug)
511
608
  .createDefaultIdentifyClusterServer()
512
609
  .createDefaultGroupsClusterServer()
513
- .createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (Heat)', '0x96382164H', 0xfff1, 'Matterbridge', 'Matterbridge Thermostat')
610
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (Heat)', 'THE00024', 0xfff1, 'Matterbridge', 'Matterbridge Thermostat')
514
611
  .createDefaultHeatingThermostatClusterServer(20, 18, 5, 35)
515
612
  .createDefaultPowerSourceReplaceableBatteryClusterServer(70, PowerSource.BatChargeLevel.Ok, 6010, 'AA 1.5V', 4);
516
613
  this.thermoHeat
@@ -548,7 +645,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
548
645
  this.thermoCool = new MatterbridgeEndpoint([thermostatDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Thermostat (Cool)' }, this.config.debug)
549
646
  .createDefaultIdentifyClusterServer()
550
647
  .createDefaultGroupsClusterServer()
551
- .createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (Cool)', '0x96382164C', 0xfff1, 'Matterbridge', 'Matterbridge Thermostat')
648
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Thermostat (Cool)', 'TCO00025', 0xfff1, 'Matterbridge', 'Matterbridge Thermostat')
552
649
  .createDefaultCoolingThermostatClusterServer(20, 18, 5, 35)
553
650
  .createDefaultPowerSourceReplaceableBatteryClusterServer(40, PowerSource.BatChargeLevel.Ok, 5080, 'AA 1.5V', 4);
554
651
  this.thermoCool = await this.addDevice(this.thermoCool);
@@ -566,7 +663,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
566
663
  this.thermoCool?.log.info('Subscribe occupiedCoolingSetpoint called with:', value / 100);
567
664
  }, this.thermoCool.log);
568
665
  this.airPurifier = new MatterbridgeEndpoint([airPurifier, temperatureSensor, humiditySensor, bridgedNode, powerSource], { uniqueStorageKey: 'Air purifier' }, this.config.debug)
569
- .createDefaultBridgedDeviceBasicInformationClusterServer('Air purifier', '0x96584864AP', 0xfff1, 'Matterbridge', 'Matterbridge Air purifier')
666
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Air purifier', 'AIR00026', 0xfff1, 'Matterbridge', 'Matterbridge Air purifier')
570
667
  .createDefaultIdentifyClusterServer()
571
668
  .createDefaultFanControlClusterServer()
572
669
  .createDefaultTemperatureMeasurementClusterServer(20 * 100)
@@ -611,7 +708,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
611
708
  this.airPurifier?.setAttribute(FanControl.Cluster.id, 'percentCurrent', newValue, this.airPurifier?.log);
612
709
  }, this.airPurifier.log);
613
710
  this.airConditioner = new MatterbridgeEndpoint([airConditioner, bridgedNode, powerSource], { uniqueStorageKey: 'Air Conditioner' }, this.config.debug)
614
- .createDefaultBridgedDeviceBasicInformationClusterServer('Air Conditioner', '0x96382864AC', 0xfff1, 'Matterbridge', 'Matterbridge Air Conditioner')
711
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Air Conditioner', 'ACO00027', 0xfff1, 'Matterbridge', 'Matterbridge Air Conditioner')
615
712
  .createDefaultIdentifyClusterServer()
616
713
  .createDeadFrontOnOffClusterServer(true)
617
714
  .createDefaultThermostatClusterServer(20, 18, 22)
@@ -640,7 +737,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
640
737
  await this.airConditioner?.setAttribute(FanControl.Cluster.id, 'percentSetting', null, this.airConditioner?.log);
641
738
  });
642
739
  this.pump = new MatterbridgeEndpoint([pumpDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Pump' }, this.config.debug)
643
- .createDefaultBridgedDeviceBasicInformationClusterServer('Pump', '0x96382864PUMP', 0xfff1, 'Matterbridge', 'Matterbridge Pump')
740
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Pump', 'PUM00028', 0xfff1, 'Matterbridge', 'Matterbridge Pump')
644
741
  .createDefaultIdentifyClusterServer()
645
742
  .createOnOffClusterServer()
646
743
  .createLevelControlClusterServer()
@@ -663,7 +760,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
663
760
  this.pump?.log.info(`Command moveToLevelWithOnOff called request: ${level}`);
664
761
  });
665
762
  this.valve = new MatterbridgeEndpoint([waterValve, bridgedNode, powerSource], { uniqueStorageKey: 'Water valve' }, this.config.debug)
666
- .createDefaultBridgedDeviceBasicInformationClusterServer('Water valve', '0x96382864WV', 0xfff1, 'Matterbridge', 'Matterbridge Water valve')
763
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Water valve', 'WAV00029', 0xfff1, 'Matterbridge', 'Matterbridge Water valve')
667
764
  .createDefaultIdentifyClusterServer()
668
765
  .createDefaultValveConfigurationAndControlClusterServer()
669
766
  .createDefaultPowerSourceWiredClusterServer();
@@ -672,7 +769,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
672
769
  this.valve?.log.info(`Command identify called identifyTime:${identifyTime}`);
673
770
  });
674
771
  this.fanDefault = new MatterbridgeEndpoint([fanDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Fan off low medium high auto' }, this.config.debug)
675
- .createDefaultBridgedDeviceBasicInformationClusterServer('Fan', 'FAN_980545631228', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
772
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Fan', 'FAN00030', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
676
773
  .createDefaultPowerSourceWiredClusterServer()
677
774
  .addRequiredClusterServers();
678
775
  this.fanDefault = await this.addDevice(this.fanDefault);
@@ -713,7 +810,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
713
810
  this.fanDefault?.setAttribute(FanControl.Cluster.id, 'percentCurrent', newValue, this.fanDefault?.log);
714
811
  }, this.fanDefault.log);
715
812
  this.fanBase = new MatterbridgeEndpoint([fanDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Fan off low medium high' }, this.config.debug)
716
- .createDefaultBridgedDeviceBasicInformationClusterServer('Fan base', 'FANB_980545631228', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
813
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Fan base', 'FBA00031', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
717
814
  .createDefaultPowerSourceWiredClusterServer()
718
815
  .createBaseFanControlClusterServer()
719
816
  .addRequiredClusterServers();
@@ -755,7 +852,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
755
852
  this.fanBase?.setAttribute(FanControl.Cluster.id, 'percentCurrent', newValue, this.fanBase?.log);
756
853
  }, this.fanBase.log);
757
854
  this.fanOnHigh = new MatterbridgeEndpoint([fanDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Fan off high' }, this.config.debug)
758
- .createDefaultBridgedDeviceBasicInformationClusterServer('Fan off high', 'FANOH_980545631228', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
855
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Fan off high', 'FOH00032', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
759
856
  .createDefaultPowerSourceWiredClusterServer()
760
857
  .createOnOffFanControlClusterServer()
761
858
  .addRequiredClusterServers();
@@ -785,7 +882,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
785
882
  }
786
883
  }, this.fanOnHigh.log);
787
884
  this.fanComplete = new MatterbridgeEndpoint([fanDevice, bridgedNode, powerSource], { uniqueStorageKey: 'Fan complete' }, this.config.debug)
788
- .createDefaultBridgedDeviceBasicInformationClusterServer('Fan complete', 'FANC_980995631228', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
885
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Fan complete', 'FCO00033', 0xfff1, 'Matterbridge', 'Matterbridge Fan')
789
886
  .createDefaultPowerSourceWiredClusterServer()
790
887
  .createCompleteFanControlClusterServer()
791
888
  .addRequiredClusterServers();
@@ -836,48 +933,48 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
836
933
  this.fanComplete?.log.info(`Airflow direction changed from ${this.fanDirectionLookup[oldValue]} to ${this.fanDirectionLookup[newValue]} context: ${context.offline === true ? 'offline' : 'online'}`);
837
934
  }, this.fanComplete?.log);
838
935
  this.waterLeak = new MatterbridgeEndpoint([waterLeakDetector, bridgedNode, powerSource], { uniqueStorageKey: 'Water leak detector' }, this.config.debug)
839
- .createDefaultBridgedDeviceBasicInformationClusterServer('Water leak detector', 'serial_98745631222', 0xfff1, 'Matterbridge', 'Matterbridge WaterLeakDetector')
936
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Water leak detector', 'WLD00034', 0xfff1, 'Matterbridge', 'Matterbridge WaterLeakDetector')
840
937
  .createDefaultPowerSourceRechargeableBatteryClusterServer()
841
938
  .createDefaultBooleanStateClusterServer(false)
842
939
  .addRequiredClusterServers()
843
940
  .addOptionalClusterServers();
844
941
  this.waterLeak = await this.addDevice(this.waterLeak);
845
942
  this.waterFreeze = new MatterbridgeEndpoint([waterFreezeDetector, bridgedNode, powerSource], { uniqueStorageKey: 'Water freeze detector' }, this.config.debug)
846
- .createDefaultBridgedDeviceBasicInformationClusterServer('Water freeze detector', 'serial_98745631223', 0xfff1, 'Matterbridge', 'Matterbridge WaterFreezeDetector')
943
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Water freeze detector', 'WFD00035', 0xfff1, 'Matterbridge', 'Matterbridge WaterFreezeDetector')
847
944
  .createDefaultPowerSourceRechargeableBatteryClusterServer()
848
945
  .createDefaultBooleanStateClusterServer(false)
849
946
  .addRequiredClusterServers()
850
947
  .addOptionalClusterServers();
851
948
  this.waterFreeze = await this.addDevice(this.waterFreeze);
852
949
  this.rain = new MatterbridgeEndpoint([rainSensor, bridgedNode, powerSource], { uniqueStorageKey: 'Rain sensor' }, this.config.debug)
853
- .createDefaultBridgedDeviceBasicInformationClusterServer('Rain sensor', 'serial_98745631224', 0xfff1, 'Matterbridge', 'Matterbridge RainSensor')
950
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Rain sensor', 'RAI00036', 0xfff1, 'Matterbridge', 'Matterbridge RainSensor')
854
951
  .createDefaultPowerSourceRechargeableBatteryClusterServer()
855
952
  .createDefaultIdentifyClusterServer()
856
953
  .createDefaultBooleanStateClusterServer(false)
857
954
  .createDefaultBooleanStateConfigurationClusterServer();
858
955
  this.rain = await this.addDevice(this.rain);
859
956
  this.smokeCo = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode, powerSource], { uniqueStorageKey: 'SmokeCo alarm sensor' }, this.config.debug)
860
- .createDefaultBridgedDeviceBasicInformationClusterServer('SmokeCo alarm sensor', 'serial_94745631225', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm')
957
+ .createDefaultBridgedDeviceBasicInformationClusterServer('SmokeCo alarm sensor', 'SCA00037', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm')
861
958
  .createDefaultIdentifyClusterServer()
862
959
  .createDefaultSmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal, SmokeCoAlarm.AlarmState.Normal)
863
960
  .createDefaultPowerSourceReplaceableBatteryClusterServer()
864
961
  .createDefaultCarbonMonoxideConcentrationMeasurementClusterServer(100);
865
962
  this.smokeCo = await this.addDevice(this.smokeCo);
866
963
  this.smokeOnly = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode, powerSource], { uniqueStorageKey: 'Smoke alarm sensor' }, this.config.debug)
867
- .createDefaultBridgedDeviceBasicInformationClusterServer('Smoke alarm sensor', 'serial_94755661225', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm')
964
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Smoke alarm sensor', 'SAL00038', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm')
868
965
  .createDefaultIdentifyClusterServer()
869
966
  .createSmokeOnlySmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal)
870
967
  .createDefaultPowerSourceReplaceableBatteryClusterServer();
871
968
  this.smokeOnly = await this.addDevice(this.smokeOnly);
872
969
  this.coOnly = new MatterbridgeEndpoint([smokeCoAlarm, bridgedNode, powerSource], { uniqueStorageKey: 'Co alarm sensor' }, this.config.debug)
873
- .createDefaultBridgedDeviceBasicInformationClusterServer('Co alarm sensor', 'serial_947456317488', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm')
970
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Co alarm sensor', 'COA00039', 0xfff1, 'Matterbridge', 'Matterbridge SmokeCoAlarm')
874
971
  .createDefaultIdentifyClusterServer()
875
972
  .createCoOnlySmokeCOAlarmClusterServer(SmokeCoAlarm.AlarmState.Normal)
876
973
  .createDefaultPowerSourceReplaceableBatteryClusterServer()
877
974
  .createDefaultCarbonMonoxideConcentrationMeasurementClusterServer(100);
878
975
  this.coOnly = await this.addDevice(this.coOnly);
879
976
  this.airQuality = new MatterbridgeEndpoint([airQualitySensor, bridgedNode, powerSource], { uniqueStorageKey: 'Air quality sensor' }, this.config.debug)
880
- .createDefaultBridgedDeviceBasicInformationClusterServer('Air quality sensor', 'serial_987484318322', 0xfff1, 'Matterbridge', 'Matterbridge Air Quality Sensor')
977
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Air quality sensor', 'AQS00040', 0xfff1, 'Matterbridge', 'Matterbridge Air Quality Sensor')
881
978
  .createDefaultPowerSourceReplaceableBatteryClusterServer(50, PowerSource.BatChargeLevel.Warning, 2900, 'CR2450', 1)
882
979
  .addRequiredClusterServers()
883
980
  .addClusterServers([TemperatureMeasurement.Cluster.id, RelativeHumidityMeasurement.Cluster.id])
@@ -893,7 +990,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
893
990
  .createDefaultTvocMeasurementClusterServer(100, ConcentrationMeasurement.MeasurementUnit.Ugm3);
894
991
  this.airQuality = await this.addDevice(this.airQuality);
895
992
  this.momentarySwitch = new MatterbridgeEndpoint([bridgedNode, powerSource], { uniqueStorageKey: 'Momentary switch composed' }, this.config.debug)
896
- .createDefaultBridgedDeviceBasicInformationClusterServer('Momentary switch (Top-1 Middle-2 Bottom-3)', 'serial_947942331225', 0xfff1, 'Matterbridge', 'Matterbridge MomentarySwitch')
993
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Momentary switch', 'MOS00041', 0xfff1, 'Matterbridge', 'Matterbridge MomentarySwitch')
897
994
  .createDefaultIdentifyClusterServer()
898
995
  .createDefaultPowerSourceReplaceableBatteryClusterServer(50, PowerSource.BatChargeLevel.Ok, 2900, 'CR2450', 1);
899
996
  this.momentarySwitch
@@ -975,12 +1072,12 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
975
1072
  await switch6.addFixedLabel('button', 'Button 6');
976
1073
  }
977
1074
  this.latchingSwitch = new MatterbridgeEndpoint([genericSwitch, bridgedNode, powerSource], { uniqueStorageKey: 'Latching switch' }, this.config.debug)
978
- .createDefaultBridgedDeviceBasicInformationClusterServer('Latching switch', 'serial_947442331225', 0xfff1, 'Matterbridge', 'Matterbridge LatchingSwitch')
1075
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Latching switch', 'LAS00042', 0xfff1, 'Matterbridge', 'Matterbridge LatchingSwitch')
979
1076
  .createDefaultIdentifyClusterServer()
980
1077
  .createDefaultLatchingSwitchClusterServer()
981
1078
  .createDefaultPowerSourceReplaceableBatteryClusterServer(10, PowerSource.BatChargeLevel.Critical, 2850, 'CR2032', 1);
982
1079
  this.latchingSwitch = await this.addDevice(this.latchingSwitch);
983
- this.roboticVacuum = new RoboticVacuumCleaner('Robot Vacuum', 'RVC1238777820', this.config.enableServerRvc === true ? 'server' : undefined, 1, [
1080
+ this.roboticVacuum = new RoboticVacuumCleaner('Robot Vacuum', 'RVC00043', this.config.enableServerRvc === true ? 'server' : undefined, 1, [
984
1081
  { label: 'Idle', mode: 1, modeTags: [{ value: RvcRunMode.ModeTag.Idle }] },
985
1082
  { label: 'Cleaning', mode: 2, modeTags: [{ value: RvcRunMode.ModeTag.Cleaning }] },
986
1083
  { label: 'Mapping', mode: 3, modeTags: [{ value: RvcRunMode.ModeTag.Mapping }] },
@@ -1021,43 +1118,43 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1021
1118
  },
1022
1119
  ]);
1023
1120
  if (this.config.enableServerRvc === true) {
1024
- this.log.notice('RVC is in server mode');
1121
+ this.log.notice('RVC is in server mode so it has its own QR code (it shows in the "Devices" panel of the Home page)');
1025
1122
  }
1026
1123
  this.roboticVacuum = await this.addDevice(this.roboticVacuum);
1027
- this.waterHeater = new WaterHeater('Water Heater', 'WH3456177820', 50, 60, 20, 80, undefined, 85, 220_000, 1_000, 220_000, 12_000_000, 500_000, 3_000_000);
1124
+ this.waterHeater = new WaterHeater('Water Heater', 'WHT00044', 50, 60, 20, 80, undefined, 85, 220_000, 1_000, 220_000, 12_000_000, 500_000, 3_000_000);
1028
1125
  this.waterHeater = await this.addDevice(this.waterHeater);
1029
- this.evse = new Evse('Evse', 'EV3456127820', 1, [
1126
+ this.evse = new Evse('Evse', 'EVS00045', 1, [
1030
1127
  { label: 'On demand', mode: 1, modeTags: [{ value: EnergyEvseMode.ModeTag.Manual }] },
1031
1128
  { label: 'Scheduled', mode: 2, modeTags: [{ value: EnergyEvseMode.ModeTag.TimeOfUse }] },
1032
1129
  { label: 'Solar Charging', mode: 3, modeTags: [{ value: EnergyEvseMode.ModeTag.SolarCharging }] },
1033
1130
  { label: 'Solar Charging Scheduled', mode: 4, modeTags: [{ value: EnergyEvseMode.ModeTag.SolarCharging }, { value: EnergyEvseMode.ModeTag.TimeOfUse }] },
1034
1131
  ], EnergyEvse.State.PluggedInCharging, EnergyEvse.SupplyState.ChargingEnabled, EnergyEvse.FaultState.NoError, 220_000, 10_000, 2_200_000, 1_000_000, 500_000, 32_000_000);
1035
1132
  this.evse = await this.addDevice(this.evse);
1036
- this.solarPower = new SolarPower('Solar Power', 'SP3456127821', 220_000, 10_000, 2200_000, 2_200_000, -10_000_000, 500_000);
1133
+ this.solarPower = new SolarPower('Solar Power', 'SOL00046', 220_000, 10_000, 2200_000, 2_200_000, -10_000_000, 500_000);
1037
1134
  this.solarPower = await this.addDevice(this.solarPower);
1038
- this.batteryStorage = new BatteryStorage('Battery Storage', 'BS3456127822', 75, PowerSource.BatChargeLevel.Ok, 220_000, 10_000, 2_200_000, 1_000_000, 2_000_000, -2_000_000, 3_000_000);
1135
+ this.batteryStorage = new BatteryStorage('Battery Storage', 'BST00047', 75, PowerSource.BatChargeLevel.Ok, 220_000, 10_000, 2_200_000, 1_000_000, 2_000_000, -2_000_000, 3_000_000);
1039
1136
  this.batteryStorage = await this.addDevice(this.batteryStorage);
1040
- this.heatPump = new HeatPump('Heat Pump', 'HP1234567890', 220_000, 10_000, 2_200_000, 1_000_000, 500_000, 3_000_000);
1137
+ this.heatPump = new HeatPump('Heat Pump', 'HPU00048', 220_000, 10_000, 2_200_000, 1_000_000, 500_000, 3_000_000);
1041
1138
  this.heatPump = await this.addDevice(this.heatPump);
1042
- this.laundryWasher = new LaundryWasher('Laundry Washer', 'LW1234567890');
1139
+ this.laundryWasher = new LaundryWasher('Laundry Washer', 'LWA00049');
1043
1140
  this.laundryWasher = await this.addDevice(this.laundryWasher);
1044
- this.laundryDryer = new LaundryDryer('Laundry Dryer', 'LDW1235227890');
1141
+ this.laundryDryer = new LaundryDryer('Laundry Dryer', 'LDR00050');
1045
1142
  this.laundryDryer = await this.addDevice(this.laundryDryer);
1046
- this.dishwasher = new Dishwasher('Dishwasher', 'DW1234567890');
1143
+ this.dishwasher = new Dishwasher('Dishwasher', 'DSW00051');
1047
1144
  this.dishwasher = await this.addDevice(this.dishwasher);
1048
- this.extractorHood = new ExtractorHood('Extractor Hood', 'EH1234567893');
1145
+ this.extractorHood = new ExtractorHood('Extractor Hood', 'EXH00052');
1049
1146
  this.extractorHood = await this.addDevice(this.extractorHood);
1050
- this.microwaveOven = new MicrowaveOven('Microwave Oven', 'MO1234567893');
1147
+ this.microwaveOven = new MicrowaveOven('Microwave Oven', 'MWO00053');
1051
1148
  this.microwaveOven = await this.addDevice(this.microwaveOven);
1052
- this.oven = new Oven('Oven', 'OV1234567890');
1053
- this.oven.addCabinet('Upper Cabinet', [{ mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: PositionTag.Top.label }]);
1149
+ this.oven = new Oven('Oven', 'OVN00054');
1150
+ this.oven.addCabinet('Upper Cabinet', [{ mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: PositionTag.Top.label }], undefined, undefined, undefined, undefined, undefined, undefined, ['pre-heating', 'pre-heated', 'cooling down']);
1054
1151
  this.oven.addCabinet('Lower Cabinet', [{ mfgCode: null, namespaceId: PositionTag.Bottom.namespaceId, tag: PositionTag.Bottom.tag, label: PositionTag.Bottom.label }], 3, [
1055
1152
  { label: 'Convection', mode: 1, modeTags: [{ value: OvenMode.ModeTag.Convection }] },
1056
1153
  { label: 'Clean', mode: 2, modeTags: [{ value: OvenMode.ModeTag.Clean }] },
1057
1154
  { label: 'Steam', mode: 3, modeTags: [{ value: OvenMode.ModeTag.Steam }] },
1058
- ], 2, ['180°', '190°', '200°'], OperationalState.OperationalStateEnum.Running, 1, ['pre-heating', 'pre-heated', 'cooling down']);
1155
+ ], 2, ['180°', '190°', '200°'], OperationalState.OperationalStateEnum.Running, undefined, ['pre-heating', 'pre-heated', 'cooling down']);
1059
1156
  this.oven = (await this.addDevice(this.oven));
1060
- this.cooktop = new Cooktop('Cooktop', 'CT1234567890');
1157
+ this.cooktop = new Cooktop('Cooktop', 'CKT00055');
1061
1158
  this.cooktop.addSurface('Surface Top Left', [
1062
1159
  { mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: PositionTag.Top.label },
1063
1160
  { mfgCode: null, namespaceId: PositionTag.Left.namespaceId, tag: PositionTag.Left.tag, label: PositionTag.Left.label },
@@ -1075,20 +1172,260 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1075
1172
  { mfgCode: null, namespaceId: PositionTag.Right.namespaceId, tag: PositionTag.Right.tag, label: PositionTag.Right.label },
1076
1173
  ]);
1077
1174
  this.cooktop = (await this.addDevice(this.cooktop));
1078
- const refrigerator = new Refrigerator('Refrigerator', 'RE1234567890');
1175
+ const refrigerator = new Refrigerator('Refrigerator', 'REF00056');
1079
1176
  refrigerator.addCabinet('Refrigerator Top', [
1080
1177
  { mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: 'Refrigerator Top' },
1081
1178
  { mfgCode: null, namespaceId: RefrigeratorTag.Refrigerator.namespaceId, tag: RefrigeratorTag.Refrigerator.tag, label: RefrigeratorTag.Refrigerator.label },
1082
- ]);
1179
+ ], 1, [
1180
+ { label: 'Auto', mode: 1, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.Auto }] },
1181
+ { label: 'RapidCool', mode: 2, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidCool }] },
1182
+ ], undefined, undefined, 1200);
1083
1183
  refrigerator.addCabinet('Freezer Bottom', [
1084
1184
  { mfgCode: null, namespaceId: PositionTag.Bottom.namespaceId, tag: PositionTag.Bottom.tag, label: 'Freezer Bottom' },
1085
1185
  { mfgCode: null, namespaceId: RefrigeratorTag.Freezer.namespaceId, tag: RefrigeratorTag.Freezer.tag, label: RefrigeratorTag.Freezer.label },
1086
- ]);
1186
+ ], 1, [
1187
+ { label: 'Auto', mode: 1, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.Auto }] },
1188
+ { label: 'RapidFreeze', mode: 2, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidFreeze }] },
1189
+ ], undefined, undefined, -1000);
1087
1190
  this.refrigerator = (await this.addDevice(refrigerator));
1088
1191
  }
1089
1192
  async onConfigure() {
1090
1193
  await super.onConfigure();
1091
1194
  this.log.info('onConfigure called');
1195
+ if (this.config.useInterval) {
1196
+ this.phaseInterval = setInterval(async () => {
1197
+ this.phase = this.phase + 1 > 10 ? 0 : this.phase + 1;
1198
+ this.log.info(`Appliances animation phase ${this.phase}`);
1199
+ if (this.roboticVacuum) {
1200
+ if (this.phase === 0) {
1201
+ this.roboticVacuum.log.info(`RVC: Reset to Idle, Vacuum, Docked`);
1202
+ await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 200, this.roboticVacuum.log);
1203
+ await this.roboticVacuum.setAttribute('PowerSource', 'batChargeState', PowerSource.BatChargeState.IsAtFullCharge, this.roboticVacuum.log);
1204
+ await this.roboticVacuum.setAttribute('PowerSource', 'batVoltage', 6000, this.roboticVacuum.log);
1205
+ await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
1206
+ await this.roboticVacuum.setAttribute('RvcCleanMode', 'currentMode', 1, this.roboticVacuum.log);
1207
+ await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Docked, this.roboticVacuum.log);
1208
+ }
1209
+ if (this.phase === 1) {
1210
+ this.roboticVacuum.log.info(`RVC: start cleaning...`);
1211
+ await this.roboticVacuum.setAttribute('PowerSource', 'batChargeState', PowerSource.BatChargeState.IsNotCharging, this.roboticVacuum.log);
1212
+ await this.roboticVacuum.setAttribute('PowerSource', 'batVoltage', 5900, this.roboticVacuum.log);
1213
+ await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 2, this.roboticVacuum.log);
1214
+ await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Running, this.roboticVacuum.log);
1215
+ await this.roboticVacuum.setAttribute('ServiceArea', 'currentArea', 1, this.roboticVacuum.log);
1216
+ }
1217
+ if (this.phase === 2) {
1218
+ this.roboticVacuum.log.info(`RVC: pause cleaning...`);
1219
+ await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 180, this.roboticVacuum.log);
1220
+ await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 2, this.roboticVacuum.log);
1221
+ await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Paused, this.roboticVacuum.log);
1222
+ }
1223
+ if (this.phase === 3) {
1224
+ this.roboticVacuum.log.info(`RVC: resume cleaning...`);
1225
+ await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 2, this.roboticVacuum.log);
1226
+ await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Running, this.roboticVacuum.log);
1227
+ await this.roboticVacuum.setAttribute('ServiceArea', 'currentArea', 2, this.roboticVacuum.log);
1228
+ }
1229
+ if (this.phase === 4) {
1230
+ this.roboticVacuum.log.info(`RVC: stop cleaning...`);
1231
+ await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 160, this.roboticVacuum.log);
1232
+ await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
1233
+ await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Stopped, this.roboticVacuum.log);
1234
+ }
1235
+ if (this.phase === 5) {
1236
+ this.roboticVacuum.log.info(`RVC: going home...`);
1237
+ await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
1238
+ await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.SeekingCharger, this.roboticVacuum.log);
1239
+ }
1240
+ if (this.phase === 6) {
1241
+ this.roboticVacuum.log.info(`RVC: charging...`);
1242
+ await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 180, this.roboticVacuum.log);
1243
+ await this.roboticVacuum.setAttribute('PowerSource', 'batChargeState', PowerSource.BatChargeState.IsCharging, this.roboticVacuum.log);
1244
+ await this.roboticVacuum.setAttribute('PowerSource', 'batVoltage', 6100, this.roboticVacuum.log);
1245
+ await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
1246
+ await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Charging, this.roboticVacuum.log);
1247
+ await this.roboticVacuum.setAttribute('ServiceArea', 'currentArea', 1, this.roboticVacuum.log);
1248
+ }
1249
+ if (this.phase === 7) {
1250
+ this.roboticVacuum.log.info(`RVC: charging...`);
1251
+ await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 190, this.roboticVacuum.log);
1252
+ await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
1253
+ await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Charging, this.roboticVacuum.log);
1254
+ }
1255
+ if (this.phase === 8) {
1256
+ this.roboticVacuum.log.info(`RVC: docked...`);
1257
+ await this.roboticVacuum.setAttribute('PowerSource', 'batPercentRemaining', 200, this.roboticVacuum.log);
1258
+ await this.roboticVacuum.setAttribute('PowerSource', 'batChargeState', PowerSource.BatChargeState.IsAtFullCharge, this.roboticVacuum.log);
1259
+ await this.roboticVacuum.setAttribute('PowerSource', 'batVoltage', 6000, this.roboticVacuum.log);
1260
+ await this.roboticVacuum.setAttribute('RvcRunMode', 'currentMode', 1, this.roboticVacuum.log);
1261
+ await this.roboticVacuum.setAttribute('RvcOperationalState', 'operationalState', RvcOperationalState.OperationalState.Docked, this.roboticVacuum.log);
1262
+ }
1263
+ }
1264
+ if (this.phase === 0) {
1265
+ if (this.airConditioner || this.laundryWasher || this.laundryDryer || this.dishwasher)
1266
+ this.log.info(`Set appliances dead front OnOff to true`);
1267
+ await this.airConditioner?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.airConditioner.log);
1268
+ await this.laundryWasher?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.laundryWasher.log);
1269
+ await this.laundryDryer?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.laundryDryer.log);
1270
+ await this.dishwasher?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.dishwasher.log);
1271
+ this.cooktop?.log.info(`Set Cooktop offOnly onOff clusters to on`);
1272
+ await this.cooktop?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop.log);
1273
+ await this.cooktop?.getChildEndpointByName('SurfaceTopLeft')?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop?.log);
1274
+ await this.cooktop?.getChildEndpointByName('SurfaceTopRight')?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop?.log);
1275
+ }
1276
+ if (this.oven) {
1277
+ const upperCabinet = this.oven.getChildEndpointByName('UpperCabinet');
1278
+ const lowerCabinet = this.oven.getChildEndpointByName('LowerCabinet');
1279
+ if (this.phase === 0) {
1280
+ await upperCabinet?.setAttribute('OvenMode', 'currentMode', 3, upperCabinet.log);
1281
+ await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, upperCabinet.log);
1282
+ await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, upperCabinet.log);
1283
+ await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
1284
+ await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 2000, upperCabinet.log);
1285
+ await lowerCabinet?.setAttribute('OvenMode', 'currentMode', 3, lowerCabinet.log);
1286
+ await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, lowerCabinet.log);
1287
+ await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, lowerCabinet.log);
1288
+ await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
1289
+ await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 2000, lowerCabinet.log);
1290
+ }
1291
+ if (this.phase === 1) {
1292
+ await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, upperCabinet.log);
1293
+ await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 0, upperCabinet.log);
1294
+ await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
1295
+ await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, upperCabinet.log);
1296
+ await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, lowerCabinet.log);
1297
+ await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 0, lowerCabinet.log);
1298
+ await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
1299
+ await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, lowerCabinet.log);
1300
+ }
1301
+ if (this.phase === 2) {
1302
+ await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, upperCabinet.log);
1303
+ await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 1, upperCabinet.log);
1304
+ await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
1305
+ await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 19000, upperCabinet.log);
1306
+ await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, lowerCabinet.log);
1307
+ await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 1, lowerCabinet.log);
1308
+ await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
1309
+ await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 20000, lowerCabinet.log);
1310
+ }
1311
+ if (this.phase === 8) {
1312
+ await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, upperCabinet.log);
1313
+ await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, upperCabinet.log);
1314
+ await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
1315
+ await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 10000, upperCabinet.log);
1316
+ await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, lowerCabinet.log);
1317
+ await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, lowerCabinet.log);
1318
+ await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
1319
+ await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 10000, lowerCabinet.log);
1320
+ }
1321
+ if (this.phase === 9) {
1322
+ await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, upperCabinet.log);
1323
+ await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, upperCabinet.log);
1324
+ await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
1325
+ await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, upperCabinet.log);
1326
+ await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, lowerCabinet.log);
1327
+ await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, lowerCabinet.log);
1328
+ await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
1329
+ await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, lowerCabinet.log);
1330
+ }
1331
+ }
1332
+ if (this.refrigerator) {
1333
+ if (this.phase === 0) {
1334
+ let mode;
1335
+ const refrigerator = this.refrigerator.getChildEndpointByName('RefrigeratorTop');
1336
+ mode = refrigerator?.getAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', refrigerator.log);
1337
+ mode = mode === 1 ? 2 : 1;
1338
+ await refrigerator?.setAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', mode, refrigerator.log);
1339
+ if (mode === 1)
1340
+ await refrigerator?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, refrigerator.log);
1341
+ if (mode === 1)
1342
+ await refrigerator?.setAttribute('TemperatureMeasurement', 'measuredValue', 1200, refrigerator.log);
1343
+ if (mode === 2)
1344
+ await refrigerator?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 0, refrigerator.log);
1345
+ if (mode === 2)
1346
+ await refrigerator?.setAttribute('TemperatureMeasurement', 'measuredValue', 1000, refrigerator.log);
1347
+ const freezer = this.refrigerator.getChildEndpointByName('FreezerBottom');
1348
+ mode = freezer?.getAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', freezer.log);
1349
+ mode = mode === 1 ? 2 : 1;
1350
+ await freezer?.setAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', mode, freezer.log);
1351
+ if (mode === 1)
1352
+ await freezer?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, freezer.log);
1353
+ if (mode === 1)
1354
+ await freezer?.setAttribute('TemperatureMeasurement', 'measuredValue', -1000, freezer.log);
1355
+ if (mode === 2)
1356
+ await freezer?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 0, freezer.log);
1357
+ if (mode === 2)
1358
+ await freezer?.setAttribute('TemperatureMeasurement', 'measuredValue', -1500, freezer.log);
1359
+ }
1360
+ if (this.phase === 1)
1361
+ await this.refrigerator.setDoorOpenState('RefrigeratorTop', true);
1362
+ if (this.phase === 2)
1363
+ await this.refrigerator.triggerDoorOpenState('RefrigeratorTop', true);
1364
+ if (this.phase === 4)
1365
+ await this.refrigerator.setDoorOpenState('RefrigeratorTop', false);
1366
+ if (this.phase === 4)
1367
+ await this.refrigerator.triggerDoorOpenState('RefrigeratorTop', false);
1368
+ if (this.phase === 6)
1369
+ await this.refrigerator.setDoorOpenState('FreezerBottom', true);
1370
+ if (this.phase === 7)
1371
+ await this.refrigerator.triggerDoorOpenState('FreezerBottom', true);
1372
+ if (this.phase === 9)
1373
+ await this.refrigerator.setDoorOpenState('FreezerBottom', false);
1374
+ if (this.phase === 9)
1375
+ await this.refrigerator.triggerDoorOpenState('FreezerBottom', false);
1376
+ }
1377
+ }, 10 * 1000);
1378
+ }
1379
+ if (this.config.useInterval) {
1380
+ this.sensorInterval = setInterval(async () => {
1381
+ let value = this.door?.getAttribute(BooleanState.Cluster.id, 'stateValue', this.door.log);
1382
+ if (isValidBoolean(value)) {
1383
+ value = !value;
1384
+ await this.door?.setAttribute(BooleanState.Cluster.id, 'stateValue', value, this.door.log);
1385
+ this.door?.log.info(`Set door stateValue to ${value}`);
1386
+ }
1387
+ const occupancyValue = this.occupancy?.getAttribute(OccupancySensing.Cluster.id, 'occupancy', this.occupancy.log);
1388
+ if (isValidObject(occupancyValue, 1)) {
1389
+ occupancyValue.occupied = !occupancyValue.occupied;
1390
+ await this.occupancy?.setAttribute(OccupancySensing.Cluster.id, 'occupancy', occupancyValue, this.occupancy.log);
1391
+ this.occupancy?.log.info(`Set occupancy to ${occupancyValue.occupied}`);
1392
+ }
1393
+ value = this.illuminance?.getAttribute(IlluminanceMeasurement.Cluster.id, 'measuredValue', this.illuminance.log);
1394
+ if (isValidNumber(value, 0, 0xfffe)) {
1395
+ value = matterToLux(value);
1396
+ value = value + 10 < 500 ? value + 10 : 1;
1397
+ await this.illuminance?.setAttribute(IlluminanceMeasurement.Cluster.id, 'measuredValue', luxToMatter(value), this.illuminance.log);
1398
+ this.illuminance?.log.info(`Set illuminance measuredValue to ${value}`);
1399
+ }
1400
+ value = this.temperature?.getAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', this.temperature.log);
1401
+ if (isValidNumber(value, 0, 0xfffe)) {
1402
+ value = value + 100 < 3000 ? value + 100 : 1000;
1403
+ await this.temperature?.setAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', value, this.temperature.log);
1404
+ await this.climate?.setAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
1405
+ this.temperature?.log.info(`Set temperature measuredValue to ${value}`);
1406
+ }
1407
+ value = this.humidity?.getAttribute(RelativeHumidityMeasurement.Cluster.id, 'measuredValue', this.humidity.log);
1408
+ if (isValidNumber(value, 0, 0xfffe)) {
1409
+ value = value + 100 < 10000 ? value + 100 : 100;
1410
+ await this.humidity?.setAttribute(RelativeHumidityMeasurement.Cluster.id, 'measuredValue', value, this.humidity.log);
1411
+ await this.climate?.setAttribute(RelativeHumidityMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
1412
+ this.humidity?.log.info(`Set humidity measuredValue to ${value}`);
1413
+ }
1414
+ value = this.pressure?.getAttribute(PressureMeasurement.Cluster.id, 'measuredValue', this.pressure.log);
1415
+ if (isValidNumber(value, 0, 0xfffe)) {
1416
+ value = value + 10 < 9900 ? value + 10 : 8600;
1417
+ await this.pressure?.setAttribute(PressureMeasurement.Cluster.id, 'measuredValue', value, this.pressure.log);
1418
+ await this.climate?.setAttribute(PressureMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
1419
+ this.pressure?.log.info(`Set pressure measuredValue to ${value}`);
1420
+ }
1421
+ value = this.flow?.getAttribute(FlowMeasurement.Cluster.id, 'measuredValue', this.flow.log);
1422
+ if (isValidNumber(value, 0, 0xfffe)) {
1423
+ value = value + 1 < 50 ? value + 1 : 1;
1424
+ await this.flow?.setAttribute(FlowMeasurement.Cluster.id, 'measuredValue', value, this.flow.log);
1425
+ this.flow?.log.info(`Set flow measuredValue to ${value}`);
1426
+ }
1427
+ }, 60 * 1000 + 900);
1428
+ }
1092
1429
  await this.switch?.setAttribute(OnOff.Cluster.id, 'onOff', this.intervalOnOff, this.switch.log);
1093
1430
  await this.mountedOnOffSwitch?.setAttribute(OnOff.Cluster.id, 'onOff', this.intervalOnOff, this.mountedOnOffSwitch.log);
1094
1431
  this.switch?.log.info(`Set switch initial onOff to ${this.intervalOnOff}`);
@@ -1134,7 +1471,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1134
1471
  this.lightInterval = setInterval(async () => {
1135
1472
  this.intervalLevel += 10;
1136
1473
  if (this.intervalLevel >= 250) {
1137
- this.intervalLevel = 0;
1474
+ this.intervalLevel = 1;
1138
1475
  await this.lightOnOff?.setAttribute(OnOff.Cluster.id, 'onOff', false, this.lightOnOff.log);
1139
1476
  await this.dimmer?.setAttribute(OnOff.Cluster.id, 'onOff', false, this.dimmer.log);
1140
1477
  await this.mountedDimmerSwitch?.setAttribute(OnOff.Cluster.id, 'onOff', false, this.mountedDimmerSwitch.log);
@@ -1365,17 +1702,6 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1365
1702
  }
1366
1703
  }, 60 * 1000 + 1100);
1367
1704
  }
1368
- await this.airConditioner?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.airConditioner.log);
1369
- await this.laundryWasher?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.laundryWasher.log);
1370
- await this.laundryDryer?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.laundryDryer.log);
1371
- await this.dishwasher?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.dishwasher.log);
1372
- this.log.info(`Set appliances dead front OnOff to on`);
1373
- this.cooktop?.log.info(`Set Cooktop offOnly onOff clusters to on`);
1374
- await this.cooktop?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop.log);
1375
- await this.cooktop?.getChildEndpointByName('SurfaceTopLeft')?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop?.log);
1376
- await this.cooktop?.getChildEndpointByName('SurfaceTopRight')?.setAttribute(OnOff.Cluster.id, 'onOff', true, this.cooktop?.log);
1377
- await this.refrigerator?.getChildEndpointByName('RefrigeratorTop')?.setAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', 1200, this.refrigerator?.log);
1378
- await this.refrigerator?.getChildEndpointByName('FreezerBottom')?.setAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', -1000, this.refrigerator?.log);
1379
1705
  if (this.config.useInterval) {
1380
1706
  this.genericSwitchLastEvent = 'Release';
1381
1707
  this.genericSwitchInterval = setInterval(async () => {
@@ -1412,6 +1738,8 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1412
1738
  }
1413
1739
  }
1414
1740
  async onShutdown(reason) {
1741
+ clearInterval(this.phaseInterval);
1742
+ clearInterval(this.sensorInterval);
1415
1743
  clearInterval(this.switchInterval);
1416
1744
  clearInterval(this.lightInterval);
1417
1745
  clearInterval(this.outletInterval);
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "matterbridge-example-dynamic-platform",
3
- "version": "1.3.8",
3
+ "version": "1.3.9-dev-20250901-ccc8cd6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge-example-dynamic-platform",
9
- "version": "1.3.8",
9
+ "version": "1.3.9-dev-20250901-ccc8cd6",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "node-ansi-logger": "3.1.1",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge-example-dynamic-platform",
3
- "version": "1.3.8",
3
+ "version": "1.3.9-dev-20250901-ccc8cd6",
4
4
  "description": "Matterbridge dynamic plugin",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",