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 +30 -1
- package/README.md +2 -1
- package/dist/module.js +86 -51
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
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.
|
|
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
|
|
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,
|
|
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.
|
|
103
|
-
throw new Error(`This plugin requires Matterbridge version >= "3.5.
|
|
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([
|
|
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,
|
|
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 }],
|
|
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
|
-
],
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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', '
|
|
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
|
|
1669
|
+
mode = this.refrigerator.getAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', this.refrigerator.log);
|
|
1635
1670
|
mode = mode === 1 ? 2 : 1;
|
|
1636
|
-
await refrigerator
|
|
1671
|
+
await this.refrigerator.setAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', mode, this.refrigerator.log);
|
|
1637
1672
|
if (mode === 1)
|
|
1638
|
-
await refrigerator?.setAttribute('TemperatureControl', '
|
|
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', '
|
|
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 =
|
|
1681
|
+
mode = this.refrigerator.getAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', this.refrigerator.log);
|
|
1647
1682
|
mode = mode === 1 ? 2 : 1;
|
|
1648
|
-
await
|
|
1683
|
+
await this.refrigerator.setAttribute('RefrigeratorAndTemperatureControlledCabinetMode', 'currentMode', mode, this.refrigerator.log);
|
|
1649
1684
|
if (mode === 1)
|
|
1650
|
-
await freezer?.setAttribute('TemperatureControl', '
|
|
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', '
|
|
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(
|
|
1694
|
+
await this.refrigerator.setDoorOpenState(true);
|
|
1660
1695
|
if (this.phase === 2)
|
|
1661
|
-
await this.refrigerator.triggerDoorOpenState(
|
|
1696
|
+
await this.refrigerator.triggerDoorOpenState(true);
|
|
1662
1697
|
if (this.phase === 4)
|
|
1663
|
-
await this.refrigerator.setDoorOpenState(
|
|
1698
|
+
await this.refrigerator.setDoorOpenState(false);
|
|
1664
1699
|
if (this.phase === 4)
|
|
1665
|
-
await this.refrigerator.triggerDoorOpenState(
|
|
1700
|
+
await this.refrigerator.triggerDoorOpenState(false);
|
|
1666
1701
|
if (this.phase === 6)
|
|
1667
|
-
await this.refrigerator.setDoorOpenState(
|
|
1702
|
+
await this.refrigerator.setDoorOpenState(true);
|
|
1668
1703
|
if (this.phase === 7)
|
|
1669
|
-
await this.refrigerator.triggerDoorOpenState(
|
|
1704
|
+
await this.refrigerator.triggerDoorOpenState(true);
|
|
1670
1705
|
if (this.phase === 9)
|
|
1671
|
-
await this.refrigerator.setDoorOpenState(
|
|
1706
|
+
await this.refrigerator.setDoorOpenState(false);
|
|
1672
1707
|
if (this.phase === 9)
|
|
1673
|
-
await this.refrigerator.triggerDoorOpenState(
|
|
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);
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge-example-dynamic-platform",
|
|
3
|
-
"version": "2.0.
|
|
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.
|
|
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",
|