matterbridge-example-dynamic-platform 2.0.12 → 2.0.13-dev-20260302-b418379

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
@@ -26,12 +26,41 @@ If you like this project and find it useful, please consider giving it a star on
26
26
 
27
27
  <a href="https://www.buymeacoffee.com/luligugithub"><img src="https://matterbridge.io/assets/bmc-button.svg" alt="Buy me a coffee" width="120"></a>
28
28
 
29
- ## [2.0.12] - 2026-02-27
29
+ ## [2.0.13] - Dev branch
30
+
31
+ ### Dev Breaking Changes
32
+
33
+ - [oven]: Refactor oven class to use TemperatureNumber for TemperatureControlledCabinet device type.
34
+ - [refrigerator]: Refactor refrigerator class to use TemperatureNumber for TemperatureControlledCabinet device type.
30
35
 
31
36
  ### Added
32
37
 
38
+ - [BridgedOutlet]: Add a bridged outlet with four individually controllable plugs.
39
+
40
+ ### Changed
41
+
42
+ - [matterbridge]: Require `matterbridge` v.3.5.7.
43
+ - [package]: Update dependencies.
44
+ - [package]: Bump package to `automator` v.3.1.1.
45
+ - [package]: Add `@eslint/json`.
46
+ - [package]: Add `@eslint/markdown`.
47
+ - [package]: Add `CONTRIBUTING.md`.
48
+ - [package]: Add `STYLEGUIDE.md`.
49
+
50
+ ### Fixed
51
+
52
+ - [matter]: Fix Climate to be a compound device (matter 1.4.2 conformance).
53
+ - [matter]: Fix AirPurifier to be a compound device (matter 1.4.2 conformance).
54
+
55
+ <a href="https://www.buymeacoffee.com/luligugithub"><img src="https://matterbridge.io/assets/bmc-button.svg" alt="Buy me a coffee" width="80"></a>
56
+
57
+ ## [2.0.12] - 2026-02-27
58
+
59
+ ### Dev Breaking Changes
60
+
33
61
  - [devContainer]: Add the new [dev container setup](https://matterbridge.io/reflector/MatterbridgeDevContainer.html).
34
62
  - [devContainer]: Add the new [reflector dev container setup](https://matterbridge.io/reflector/Reflector.html).
63
+ - [devContainer]: Add the guide to [pair Matterbridge with Dev Container](https://matterbridge.io/README-DEV.html#how-to-pair-matterbridge-in-dev-containers)
35
64
 
36
65
  ### Changed
37
66
 
package/README.md CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  Matterbridge dynamic platform example plugin is a template to develop your own plugin using the dynamic platform.
26
26
 
27
- It exposes 63 virtual devices:
27
+ It exposes 64 virtual devices:
28
28
 
29
29
  - a door contact sensor
30
30
  - a motion sensor
@@ -46,6 +46,7 @@ It exposes 63 virtual devices:
46
46
  - an outlet (plug) with onOff cluster, energy measurements and power measurements
47
47
  - an outlet (plug) with onOff cluster, apparent energy measurements and power measurements
48
48
  - a smart outlet with an energy meter and four individually controllable sockets (with tagList 1, 2, 3 and 4)
49
+ - a bridged outlet with four individually controllable plugs
49
50
  - a cover with windowCovering cluster and lift feature
50
51
  - a cover with windowCovering cluster and both lift and tilt features
51
52
  - a lock with doorLock cluster
package/dist/module.js CHANGED
@@ -1,8 +1,8 @@
1
- import { airPurifier, airQualitySensor, bridgedNode, colorTemperatureLight, contactSensor, coverDevice, dimmableLight, dimmableMountedSwitch, dimmableOutlet, doorLockDevice, electricalSensor, extendedColorLight, fanDevice, flowSensor, genericSwitch, humiditySensor, lightSensor, MatterbridgeDynamicPlatform, MatterbridgeEndpoint, modeSelect, occupancySensor, onOffLight, onOffMountedSwitch, onOffOutlet, onOffSwitch, powerSource, pressureSensor, pumpDevice, rainSensor, smokeCoAlarm, temperatureSensor, thermostatDevice, waterFreezeDetector, waterLeakDetector, waterValve, } from 'matterbridge';
1
+ import { aggregator, airPurifier, airQualitySensor, bridgedNode, colorTemperatureLight, contactSensor, coverDevice, dimmableLight, dimmableMountedSwitch, dimmableOutlet, doorLockDevice, electricalSensor, extendedColorLight, fanDevice, flowSensor, genericSwitch, humiditySensor, lightSensor, MatterbridgeDynamicPlatform, MatterbridgeEndpoint, modeSelect, occupancySensor, onOffLight, onOffMountedSwitch, onOffOutlet, onOffSwitch, powerSource, pressureSensor, pumpDevice, rainSensor, smokeCoAlarm, temperatureSensor, thermostatDevice, waterFreezeDetector, waterLeakDetector, waterValve, } from 'matterbridge';
2
2
  import { AirConditioner, BasicVideoPlayer, BatteryStorage, Cooktop, Dishwasher, Evse, ExtractorHood, HeatPump, LaundryDryer, LaundryWasher, MicrowaveOven, Oven, Refrigerator, RoboticVacuumCleaner, SolarPower, Speaker, WaterHeater, } from 'matterbridge/devices';
3
3
  import { debugStringify } from 'matterbridge/logger';
4
4
  import { AreaNamespaceTag, LocationTag, NumberTag, PositionTag, RefrigeratorTag, SwitchesTag, UINT16_MAX, UINT32_MAX } from 'matterbridge/matter';
5
- import { AirQuality, BooleanState, BridgedDeviceBasicInformation, CarbonDioxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurement, ColorControl, Descriptor, DeviceEnergyManagement, DoorLock, ElectricalEnergyMeasurement, ElectricalPowerMeasurement, EnergyEvse, EnergyEvseMode, FanControl, FlowMeasurement, FormaldehydeConcentrationMeasurement, IlluminanceMeasurement, LevelControl, NitrogenDioxideConcentrationMeasurement, OccupancySensing, OnOff, OnOffCluster, OperationalState, OvenMode, OzoneConcentrationMeasurement, Pm1ConcentrationMeasurement, Pm10ConcentrationMeasurement, Pm25ConcentrationMeasurement, PowerSource, PressureMeasurement, RadonConcentrationMeasurement, RefrigeratorAndTemperatureControlledCabinetMode, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, RvcCleanMode, RvcOperationalState, RvcRunMode, SmokeCoAlarm, TemperatureMeasurement, Thermostat, ThermostatCluster, TotalVolatileOrganicCompoundsConcentrationMeasurement, WindowCovering, } from 'matterbridge/matter/clusters';
5
+ import { AirQuality, BooleanState, BridgedDeviceBasicInformation, CarbonDioxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurement, ColorControl, Descriptor, DeviceEnergyManagement, DoorLock, ElectricalEnergyMeasurement, ElectricalPowerMeasurement, EnergyEvse, EnergyEvseMode, FanControl, FlowMeasurement, FormaldehydeConcentrationMeasurement, IlluminanceMeasurement, LevelControl, NitrogenDioxideConcentrationMeasurement, OccupancySensing, OnOff, OnOffCluster, OperationalState, OvenMode, OzoneConcentrationMeasurement, Pm1ConcentrationMeasurement, Pm10ConcentrationMeasurement, Pm25ConcentrationMeasurement, PowerSource, PressureMeasurement, RadonConcentrationMeasurement, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, RvcCleanMode, RvcOperationalState, RvcRunMode, SmokeCoAlarm, TemperatureMeasurement, Thermostat, ThermostatCluster, TotalVolatileOrganicCompoundsConcentrationMeasurement, WindowCovering, } from 'matterbridge/matter/clusters';
6
6
  import { isValidBoolean, isValidNumber, isValidObject, isValidString } from 'matterbridge/utils';
7
7
  function luxToMatter(lux) {
8
8
  if (!Number.isFinite(lux) || lux <= 0)
@@ -46,6 +46,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
46
46
  outletEnergy;
47
47
  outletEnergyApparent;
48
48
  smartOutlet;
49
+ smartBridgedOutlet;
49
50
  coverLift;
50
51
  coverLiftTilt;
51
52
  lock;
@@ -99,8 +100,8 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
99
100
  constructor(matterbridge, log, config) {
100
101
  super(matterbridge, log, config);
101
102
  this.config = config;
102
- if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('3.5.2')) {
103
- throw new Error(`This plugin requires Matterbridge version >= "3.5.2". Please update Matterbridge from ${this.matterbridge.matterbridgeVersion} to the latest version in the frontend.`);
103
+ if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('3.5.7')) {
104
+ throw new Error(`This plugin requires Matterbridge version >= "3.5.7". Please update Matterbridge from ${this.matterbridge.matterbridgeVersion} to the latest version in the frontend.`);
104
105
  }
105
106
  this.log.info('Initializing platform:', this.config.name);
106
107
  }
@@ -157,14 +158,14 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
157
158
  .createDefaultPowerSourceReplaceableBatteryClusterServer(80, PowerSource.BatChargeLevel.Ok, 3050, 'AA', 1, PowerSource.BatReplaceability.UserReplaceable)
158
159
  .addRequiredClusterServers();
159
160
  this.flow = await this.addDevice(this.flow);
160
- this.climate = new MatterbridgeEndpoint([temperatureSensor, humiditySensor, pressureSensor, bridgedNode, powerSource], { id: 'Climate' }, this.config.debug)
161
- .createDefaultIdentifyClusterServer()
161
+ this.climate = new MatterbridgeEndpoint([bridgedNode, powerSource], { id: 'Climate' }, this.config.debug)
162
162
  .createDefaultBridgedDeviceBasicInformationClusterServer('Climate', 'CLI00008', 0xfff1, 'Matterbridge', 'Matterbridge Climate')
163
- .createDefaultTemperatureMeasurementClusterServer(1000)
164
- .createDefaultRelativeHumidityMeasurementClusterServer(1000)
165
- .createDefaultPressureMeasurementClusterServer(9000)
166
163
  .createDefaultPowerSourceReplaceableBatteryClusterServer(90, PowerSource.BatChargeLevel.Ok, 2990, '2 x AA', 2, PowerSource.BatReplaceability.UserReplaceable)
167
164
  .addRequiredClusterServers();
165
+ this.climate.addFixedLabel('composed', 'Compound device');
166
+ this.climate.addChildDeviceType('Temperature', temperatureSensor).createDefaultTemperatureMeasurementClusterServer(2100, -5000, 10000).addRequiredClusterServers();
167
+ this.climate.addChildDeviceType('Humidity', humiditySensor).createDefaultRelativeHumidityMeasurementClusterServer(5000, 0, 10000).addRequiredClusterServers();
168
+ this.climate.addChildDeviceType('Pressure', pressureSensor).createDefaultPressureMeasurementClusterServer(9000).addRequiredClusterServers();
168
169
  this.climate = await this.addDevice(this.climate);
169
170
  this.select = new MatterbridgeEndpoint([modeSelect, bridgedNode, powerSource], { id: 'Select' }, this.config.debug)
170
171
  .createDefaultBridgedDeviceBasicInformationClusterServer('Select', 'SEL00009', 0xfff1, 'Matterbridge', 'Matterbridge Select')
@@ -486,6 +487,27 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
486
487
  })
487
488
  .addRequiredClusterServers();
488
489
  this.smartOutlet = await this.addDevice(this.smartOutlet);
490
+ this.smartBridgedOutlet = new MatterbridgeEndpoint([aggregator, bridgedNode, powerSource], { id: 'BridgedOutlet' }, this.config.debug)
491
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Bridged outlet', 'SOU00064', 0xfff1, 'Matterbridge', 'Matterbridge Bridged Outlet')
492
+ .createDefaultPowerSourceWiredClusterServer()
493
+ .addRequiredClusterServers();
494
+ this.smartBridgedOutlet
495
+ .addChildDeviceTypeWithClusterServer('Plug 1', [onOffOutlet, bridgedNode], [OnOffCluster.id])
496
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Plug 1', 'SOU00064-1', 0xfff1, 'Matterbridge', 'Matterbridge Bridged Outlet')
497
+ .addRequiredClusterServers();
498
+ this.smartBridgedOutlet
499
+ .addChildDeviceTypeWithClusterServer('Plug 2', [onOffOutlet, bridgedNode], [OnOffCluster.id])
500
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Plug 2', 'SOU00064-2', 0xfff1, 'Matterbridge', 'Matterbridge Bridged Outlet')
501
+ .addRequiredClusterServers();
502
+ this.smartBridgedOutlet
503
+ .addChildDeviceTypeWithClusterServer('Plug 3', [onOffOutlet, bridgedNode], [OnOffCluster.id])
504
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Plug 3', 'SOU00064-3', 0xfff1, 'Matterbridge', 'Matterbridge Bridged Outlet')
505
+ .addRequiredClusterServers();
506
+ this.smartBridgedOutlet
507
+ .addChildDeviceTypeWithClusterServer('Plug 4', [onOffOutlet, bridgedNode], [OnOffCluster.id])
508
+ .createDefaultBridgedDeviceBasicInformationClusterServer('Plug 4', 'SOU00064-4', 0xfff1, 'Matterbridge', 'Matterbridge Bridged Outlet')
509
+ .addRequiredClusterServers();
510
+ this.smartBridgedOutlet = await this.addDevice(this.smartBridgedOutlet);
489
511
  this.coverLift = new MatterbridgeEndpoint([coverDevice, bridgedNode, powerSource], { id: 'CoverLift' }, this.config.debug)
490
512
  .createDefaultIdentifyClusterServer()
491
513
  .createDefaultBridgedDeviceBasicInformationClusterServer('Cover lift', 'COV00020', 0xfff1, 'Matterbridge', 'Matterbridge Cover')
@@ -845,16 +867,24 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
845
867
  await this.thermoCool?.subscribeAttribute(ThermostatCluster.id, 'occupiedCoolingSetpoint', (value) => {
846
868
  this.thermoCool?.log.info('Subscribe occupiedCoolingSetpoint called with:', value / 100);
847
869
  }, this.thermoCool.log);
848
- this.airPurifier = new MatterbridgeEndpoint([airPurifier, temperatureSensor, humiditySensor, bridgedNode, powerSource], { id: 'Air purifier' }, this.config.debug)
870
+ this.airPurifier = new MatterbridgeEndpoint([airPurifier, bridgedNode, powerSource], { id: 'Air purifier' }, this.config.debug)
849
871
  .createDefaultBridgedDeviceBasicInformationClusterServer('Air purifier', 'AIR00026', 0xfff1, 'Matterbridge', 'Matterbridge Air purifier')
850
872
  .createDefaultIdentifyClusterServer()
851
873
  .createDefaultFanControlClusterServer()
852
- .createDefaultTemperatureMeasurementClusterServer(20 * 100)
853
- .createDefaultRelativeHumidityMeasurementClusterServer(50 * 100)
854
874
  .createDefaultPowerSourceWiredClusterServer()
855
875
  .createDefaultActivatedCarbonFilterMonitoringClusterServer()
856
876
  .createDefaultHepaFilterMonitoringClusterServer()
857
877
  .addRequiredClusterServers();
878
+ this.airPurifier.addFixedLabel('composed', 'Compound device');
879
+ this.airPurifier.addChildDeviceType('AirQuality', airQualitySensor).createDefaultAirQualityClusterServer(AirQuality.AirQualityEnum.Good).addRequiredClusterServers();
880
+ this.airPurifier
881
+ .addChildDeviceType('Temperature', temperatureSensor)
882
+ .createDefaultTemperatureMeasurementClusterServer(20 * 100)
883
+ .addRequiredClusterServers();
884
+ this.airPurifier
885
+ .addChildDeviceType('Humidity', humiditySensor)
886
+ .createDefaultRelativeHumidityMeasurementClusterServer(50 * 100)
887
+ .addRequiredClusterServers();
858
888
  this.airPurifier = await this.addDevice(this.airPurifier);
859
889
  this.airPurifier?.addCommandHandler('identify', async ({ request: { identifyTime } }) => {
860
890
  this.airPurifier?.log.info(`Command identify called identifyTime:${identifyTime}`);
@@ -1302,12 +1332,23 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1302
1332
  this.microwaveOven = new MicrowaveOven('Microwave Oven', 'MWO00053');
1303
1333
  this.microwaveOven = await this.addDevice(this.microwaveOven);
1304
1334
  this.oven = new Oven('Oven', 'OVN00054');
1305
- 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']);
1335
+ this.oven.addCabinet('Upper Cabinet', [{ mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: PositionTag.Top.label }], 2, [
1336
+ { label: 'Bake', mode: 1, modeTags: [{ value: OvenMode.ModeTag.Bake }] },
1337
+ { label: 'Convection', mode: 2, modeTags: [{ value: OvenMode.ModeTag.Convection }] },
1338
+ { label: 'Grill', mode: 3, modeTags: [{ value: OvenMode.ModeTag.Grill }] },
1339
+ { label: 'Roast', mode: 4, modeTags: [{ value: OvenMode.ModeTag.Roast }] },
1340
+ { label: 'Clean', mode: 5, modeTags: [{ value: OvenMode.ModeTag.Clean }] },
1341
+ { label: 'Convection Bake', mode: 6, modeTags: [{ value: OvenMode.ModeTag.ConvectionBake }] },
1342
+ { label: 'Convection Roast', mode: 7, modeTags: [{ value: OvenMode.ModeTag.ConvectionRoast }] },
1343
+ { label: 'Warming', mode: 8, modeTags: [{ value: OvenMode.ModeTag.Warming }] },
1344
+ { label: 'Proofing', mode: 9, modeTags: [{ value: OvenMode.ModeTag.Proofing }] },
1345
+ { label: 'Steam', mode: 10, modeTags: [{ value: OvenMode.ModeTag.Steam }] },
1346
+ ], 180 * 100, 100 * 100, 300 * 100, 10 * 100, 20 * 100, OperationalState.OperationalStateEnum.Stopped, 2, ['pre-heating', 'pre-heated', 'cooling down']);
1306
1347
  this.oven.addCabinet('Lower Cabinet', [{ mfgCode: null, namespaceId: PositionTag.Bottom.namespaceId, tag: PositionTag.Bottom.tag, label: PositionTag.Bottom.label }], 3, [
1307
1348
  { label: 'Convection', mode: 1, modeTags: [{ value: OvenMode.ModeTag.Convection }] },
1308
1349
  { label: 'Clean', mode: 2, modeTags: [{ value: OvenMode.ModeTag.Clean }] },
1309
1350
  { label: 'Steam', mode: 3, modeTags: [{ value: OvenMode.ModeTag.Steam }] },
1310
- ], 2, ['180°', '190°', '200°'], OperationalState.OperationalStateEnum.Running, undefined, ['pre-heating', 'pre-heated', 'cooling down']);
1351
+ ], 200 * 100, 100 * 100, 300 * 100, 10 * 100, 200 * 100, OperationalState.OperationalStateEnum.Running, 1, ['pre-heating', 'pre-heated', 'cooling down']);
1311
1352
  this.oven = (await this.addDevice(this.oven));
1312
1353
  this.cooktop = new Cooktop('Cooktop', 'CKT00055');
1313
1354
  this.cooktop.addSurface('Surface Top Left', [
@@ -1331,17 +1372,11 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1331
1372
  refrigerator.addCabinet('Refrigerator Top', [
1332
1373
  { mfgCode: null, namespaceId: PositionTag.Top.namespaceId, tag: PositionTag.Top.tag, label: 'Refrigerator Top' },
1333
1374
  { mfgCode: null, namespaceId: RefrigeratorTag.Refrigerator.namespaceId, tag: RefrigeratorTag.Refrigerator.tag, label: RefrigeratorTag.Refrigerator.label },
1334
- ], 1, [
1335
- { label: 'Auto', mode: 1, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.Auto }] },
1336
- { label: 'RapidCool', mode: 2, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidCool }] },
1337
- ], undefined, undefined, 1200);
1375
+ ], 12 * 100, 5 * 100, 20 * 100, 1 * 100, 1200);
1338
1376
  refrigerator.addCabinet('Freezer Bottom', [
1339
1377
  { mfgCode: null, namespaceId: PositionTag.Bottom.namespaceId, tag: PositionTag.Bottom.tag, label: 'Freezer Bottom' },
1340
1378
  { mfgCode: null, namespaceId: RefrigeratorTag.Freezer.namespaceId, tag: RefrigeratorTag.Freezer.tag, label: RefrigeratorTag.Freezer.label },
1341
- ], 1, [
1342
- { label: 'Auto', mode: 1, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.Auto }] },
1343
- { label: 'RapidFreeze', mode: 2, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidFreeze }] },
1344
- ], undefined, undefined, -1000);
1379
+ ], -18 * 100, -30 * 100, -10 * 100, 1 * 100, -1800);
1345
1380
  this.refrigerator = (await this.addDevice(refrigerator));
1346
1381
  this.airConditioner = new AirConditioner('Air Conditioner', 'ACO00027', {
1347
1382
  localTemperature: 20,
@@ -1567,52 +1602,52 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1567
1602
  await upperCabinet?.setAttribute('OvenMode', 'currentMode', 3, upperCabinet.log);
1568
1603
  await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, upperCabinet.log);
1569
1604
  await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, upperCabinet.log);
1570
- await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
1605
+ await upperCabinet?.setAttribute('TemperatureControl', 'temperatureSetpoint', 190 * 100, upperCabinet.log);
1571
1606
  await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 2000, upperCabinet.log);
1572
1607
  await lowerCabinet?.setAttribute('OvenMode', 'currentMode', 3, lowerCabinet.log);
1573
1608
  await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, lowerCabinet.log);
1574
1609
  await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, lowerCabinet.log);
1575
- await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
1610
+ await lowerCabinet?.setAttribute('TemperatureControl', 'temperatureSetpoint', 210 * 100, lowerCabinet.log);
1576
1611
  await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 2000, lowerCabinet.log);
1577
1612
  }
1578
1613
  if (this.phase === 1) {
1579
1614
  await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, upperCabinet.log);
1580
1615
  await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 0, upperCabinet.log);
1581
- await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
1616
+ await upperCabinet?.setAttribute('TemperatureControl', 'temperatureSetpoint', 200 * 100, upperCabinet.log);
1582
1617
  await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, upperCabinet.log);
1583
1618
  await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, lowerCabinet.log);
1584
1619
  await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 0, lowerCabinet.log);
1585
- await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
1620
+ await lowerCabinet?.setAttribute('TemperatureControl', 'temperatureSetpoint', 220 * 100, lowerCabinet.log);
1586
1621
  await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, lowerCabinet.log);
1587
1622
  }
1588
1623
  if (this.phase === 2) {
1589
1624
  await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, upperCabinet.log);
1590
1625
  await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 1, upperCabinet.log);
1591
- await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
1626
+ await upperCabinet?.setAttribute('TemperatureControl', 'temperatureSetpoint', 190 * 100, upperCabinet.log);
1592
1627
  await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 19000, upperCabinet.log);
1593
1628
  await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Running, lowerCabinet.log);
1594
1629
  await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 1, lowerCabinet.log);
1595
- await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
1630
+ await lowerCabinet?.setAttribute('TemperatureControl', 'temperatureSetpoint', 200 * 100, lowerCabinet.log);
1596
1631
  await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 20000, lowerCabinet.log);
1597
1632
  }
1598
1633
  if (this.phase === 8) {
1599
1634
  await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, upperCabinet.log);
1600
1635
  await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, upperCabinet.log);
1601
- await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
1636
+ await upperCabinet?.setAttribute('TemperatureControl', 'temperatureSetpoint', 190 * 100, upperCabinet.log);
1602
1637
  await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 10000, upperCabinet.log);
1603
1638
  await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, lowerCabinet.log);
1604
1639
  await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, lowerCabinet.log);
1605
- await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
1640
+ await lowerCabinet?.setAttribute('TemperatureControl', 'temperatureSetpoint', 200 * 100, lowerCabinet.log);
1606
1641
  await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 10000, lowerCabinet.log);
1607
1642
  }
1608
1643
  if (this.phase === 9) {
1609
1644
  await upperCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, upperCabinet.log);
1610
1645
  await upperCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, upperCabinet.log);
1611
- await upperCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, upperCabinet.log);
1646
+ await upperCabinet?.setAttribute('TemperatureControl', 'temperatureSetpoint', 190 * 100, upperCabinet.log);
1612
1647
  await upperCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, upperCabinet.log);
1613
1648
  await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'operationalState', OperationalState.OperationalStateEnum.Stopped, lowerCabinet.log);
1614
1649
  await lowerCabinet?.setAttribute('OvenCavityOperationalState', 'currentPhase', 2, lowerCabinet.log);
1615
- await lowerCabinet?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, lowerCabinet.log);
1650
+ await lowerCabinet?.setAttribute('TemperatureControl', 'temperatureSetpoint', 200 * 100, lowerCabinet.log);
1616
1651
  await lowerCabinet?.setAttribute('TemperatureMeasurement', 'measuredValue', 5000, lowerCabinet.log);
1617
1652
  }
1618
1653
  }
@@ -1631,46 +1666,46 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1631
1666
  if (this.phase === 0) {
1632
1667
  let mode;
1633
1668
  const refrigerator = this.refrigerator.getChildEndpointByName('RefrigeratorTop');
1634
- mode = refrigerator?.getAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', refrigerator.log);
1669
+ mode = this.refrigerator.getAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', this.refrigerator.log);
1635
1670
  mode = mode === 1 ? 2 : 1;
1636
- await refrigerator?.setAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', mode, refrigerator.log);
1671
+ await this.refrigerator.setAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', mode, this.refrigerator.log);
1637
1672
  if (mode === 1)
1638
- await refrigerator?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, refrigerator.log);
1673
+ await refrigerator?.setAttribute('TemperatureControl', 'temperatureSetpoint', 9 * 100, refrigerator.log);
1639
1674
  if (mode === 1)
1640
1675
  await refrigerator?.setAttribute('TemperatureMeasurement', 'measuredValue', 1200, refrigerator.log);
1641
1676
  if (mode === 2)
1642
- await refrigerator?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 0, refrigerator.log);
1677
+ await refrigerator?.setAttribute('TemperatureControl', 'temperatureSetpoint', 10 * 100, refrigerator.log);
1643
1678
  if (mode === 2)
1644
1679
  await refrigerator?.setAttribute('TemperatureMeasurement', 'measuredValue', 1000, refrigerator.log);
1645
1680
  const freezer = this.refrigerator.getChildEndpointByName('FreezerBottom');
1646
- mode = freezer?.getAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', freezer.log);
1681
+ mode = this.refrigerator.getAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', this.refrigerator.log);
1647
1682
  mode = mode === 1 ? 2 : 1;
1648
- await freezer?.setAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', mode, freezer.log);
1683
+ await this.refrigerator.setAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', mode, this.refrigerator.log);
1649
1684
  if (mode === 1)
1650
- await freezer?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 2, freezer.log);
1685
+ await freezer?.setAttribute('TemperatureControl', 'temperatureSetpoint', -18 * 100, freezer.log);
1651
1686
  if (mode === 1)
1652
1687
  await freezer?.setAttribute('TemperatureMeasurement', 'measuredValue', -1000, freezer.log);
1653
1688
  if (mode === 2)
1654
- await freezer?.setAttribute('TemperatureControl', 'selectedTemperatureLevel', 0, freezer.log);
1689
+ await freezer?.setAttribute('TemperatureControl', 'temperatureSetpoint', -24 * 100, freezer.log);
1655
1690
  if (mode === 2)
1656
1691
  await freezer?.setAttribute('TemperatureMeasurement', 'measuredValue', -1500, freezer.log);
1657
1692
  }
1658
1693
  if (this.phase === 1)
1659
- await this.refrigerator.setDoorOpenState('RefrigeratorTop', true);
1694
+ await this.refrigerator.setDoorOpenState(true);
1660
1695
  if (this.phase === 2)
1661
- await this.refrigerator.triggerDoorOpenState('RefrigeratorTop', true);
1696
+ await this.refrigerator.triggerDoorOpenState(true);
1662
1697
  if (this.phase === 4)
1663
- await this.refrigerator.setDoorOpenState('RefrigeratorTop', false);
1698
+ await this.refrigerator.setDoorOpenState(false);
1664
1699
  if (this.phase === 4)
1665
- await this.refrigerator.triggerDoorOpenState('RefrigeratorTop', false);
1700
+ await this.refrigerator.triggerDoorOpenState(false);
1666
1701
  if (this.phase === 6)
1667
- await this.refrigerator.setDoorOpenState('FreezerBottom', true);
1702
+ await this.refrigerator.setDoorOpenState(true);
1668
1703
  if (this.phase === 7)
1669
- await this.refrigerator.triggerDoorOpenState('FreezerBottom', true);
1704
+ await this.refrigerator.triggerDoorOpenState(true);
1670
1705
  if (this.phase === 9)
1671
- await this.refrigerator.setDoorOpenState('FreezerBottom', false);
1706
+ await this.refrigerator.setDoorOpenState(false);
1672
1707
  if (this.phase === 9)
1673
- await this.refrigerator.triggerDoorOpenState('FreezerBottom', false);
1708
+ await this.refrigerator.triggerDoorOpenState(false);
1674
1709
  }
1675
1710
  this.phase++;
1676
1711
  this.phase = this.phase >= 10 ? 0 : this.phase;
@@ -1701,21 +1736,21 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1701
1736
  if (isValidNumber(value, 0, 0xfffe)) {
1702
1737
  value = value + 100 < 3000 ? value + 100 : 1000;
1703
1738
  await this.temperature?.setAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', value, this.temperature.log);
1704
- await this.climate?.setAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
1739
+ await this.climate?.getChildEndpointById('Temperature')?.setAttribute(TemperatureMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
1705
1740
  this.temperature?.log.info(`Set temperature measuredValue to ${value}`);
1706
1741
  }
1707
1742
  value = this.humidity?.getAttribute(RelativeHumidityMeasurement.Cluster.id, 'measuredValue', this.humidity.log);
1708
1743
  if (isValidNumber(value, 0, 0xfffe)) {
1709
1744
  value = value + 100 < 10000 ? value + 100 : 100;
1710
1745
  await this.humidity?.setAttribute(RelativeHumidityMeasurement.Cluster.id, 'measuredValue', value, this.humidity.log);
1711
- await this.climate?.setAttribute(RelativeHumidityMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
1746
+ await this.climate?.getChildEndpointById('Humidity')?.setAttribute(RelativeHumidityMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
1712
1747
  this.humidity?.log.info(`Set humidity measuredValue to ${value}`);
1713
1748
  }
1714
1749
  value = this.pressure?.getAttribute(PressureMeasurement.Cluster.id, 'measuredValue', this.pressure.log);
1715
1750
  if (isValidNumber(value, 0, 0xfffe)) {
1716
1751
  value = value + 10 < 9900 ? value + 10 : 8600;
1717
1752
  await this.pressure?.setAttribute(PressureMeasurement.Cluster.id, 'measuredValue', value, this.pressure.log);
1718
- await this.climate?.setAttribute(PressureMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
1753
+ await this.climate?.getChildEndpointById('Pressure')?.setAttribute(PressureMeasurement.Cluster.id, 'measuredValue', value, this.climate.log);
1719
1754
  this.pressure?.log.info(`Set pressure measuredValue to ${value}`);
1720
1755
  }
1721
1756
  value = this.flow?.getAttribute(FlowMeasurement.Cluster.id, 'measuredValue', this.flow.log);
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "matterbridge-example-dynamic-platform",
3
- "version": "2.0.12",
3
+ "version": "2.0.13-dev-20260302-b418379",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge-example-dynamic-platform",
9
- "version": "2.0.12",
9
+ "version": "2.0.13-dev-20260302-b418379",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "node-ansi-logger": "3.2.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge-example-dynamic-platform",
3
- "version": "2.0.12",
3
+ "version": "2.0.13-dev-20260302-b418379",
4
4
  "description": "Matterbridge dynamic plugin",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",