matterbridge-example-dynamic-platform 3.0.3-dev-20260829-d83e6fe → 3.0.3

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
@@ -29,12 +29,12 @@ If you like this project and find it useful, please consider giving it a star on
29
29
 
30
30
  <a href="https://www.buymeacoffee.com/luligugithub"><img src="https://matterbridge.io/assets/bmc-button.svg" alt="Buy me a coffee" width="120"></a>
31
31
 
32
- ## [3.0.3] - Dev branch
32
+ ## [3.0.3] - 2026-08-30
33
33
 
34
34
  ### Breaking changes
35
35
 
36
36
  - [matterbridge]: Require matterbridge v.3.10.7 with matter v.1.6.0.
37
- - [fanControl]: Matterbridge v.3.10.6 now manages the compliant FanControl `fanMode` and `percentSetting` synchronization; plugin examples now only update `percentCurrent` as physical device feedback.
37
+ - [fanControl]: Matterbridge v.3.10.7 now manages the compliant FanControl `fanMode` and `percentSetting` synchronization; plugins now only update `percentCurrent` as physical device feedback from `fanMode` and `percentSetting`.
38
38
 
39
39
  ### Added
40
40
 
@@ -48,6 +48,8 @@ If you like this project and find it useful, please consider giving it a star on
48
48
  - [package]: Bump `@types/node` to v.26.4.0.
49
49
  - [package]: Bump `oxfmt` to v.0.65.0.
50
50
  - [package]: Bump `oxlint` to v.1.80.0.
51
+ - [package]: Bump `node-ansi-logger` to v.3.3.1.
52
+ - [package]: Bump `node-persist-manager` to v.2.1.1.
51
53
 
52
54
  ### Fixed
53
55
 
@@ -57,6 +59,7 @@ If you like this project and find it useful, please consider giving it a star on
57
59
  - [devices]: Update `RoboticVacuumCleaner`, `Oven.addCabinet`, `Cooktop.addSurface`, and `Refrigerator.addCabinet` to the options object form, removing the last `typescript/no-deprecated` oxlint suppressions in the platform.
58
60
  - [platform]: Make the local `addDevice` helper generic (`addDevice<T extends MatterbridgeEndpoint>`) so it returns the same subclass it was given, removing 9 `typescript/no-unsafe-type-assertion` oxlint suppressions at its call sites.
59
61
  - [platform]: Type `initializePlugin`'s `config` parameter directly as `DynamicPlatformConfig`, matching the pattern used in production plugins, removing the last `typescript/no-unsafe-type-assertion` cast on plugin startup.
62
+ - [illuminance]: `luxToMatter`/`matterToLux` were missing the `+ 1` offset required by the Matter spec's `MeasuredValue = 10,000 x log10(illuminance) + 1` formula (Matter 1.6.0 § 2.2.5.1); every encoded illuminance value was off by 1. Fixed and aligned with the corrected implementation in matterbridge's `packages/utils`.
60
63
 
61
64
  <a href="https://www.buymeacoffee.com/luligugithub"><img src="https://matterbridge.io/assets/bmc-button.svg" alt="Buy me a coffee" width="80"></a>
62
65
 
package/dist/module.js CHANGED
@@ -2,26 +2,20 @@ import { aggregator, airPurifier, airQualitySensor, bridgedNode, closure, colorT
2
2
  import { AirConditioner, BasicVideoPlayer, BatteryStorage, Closure, Cooktop, Dishwasher, Evse, ExtractorHood, HeatPump, IrrigationSystem, LaundryDryer, LaundryWasher, MatterbridgeClosureControlServer, MicrowaveOven, Oven, Refrigerator, RoboticVacuumCleaner, SoilSensor, SolarPower, Speaker, WaterHeater, } from 'matterbridge/devices';
3
3
  import { debugStringify } from 'matterbridge/logger';
4
4
  import { ClosureCoveringTag, ClosurePanelTag, ClosureTag, ClosureWindowTag, CommonAreaNamespaceTag, CommonLocationTag, CommonNumberTag, CommonPositionTag, RefrigeratorTag, SwitchesTag, UINT16_MAX, UINT32_MAX, } from 'matterbridge/matter';
5
- import { AirQuality, BooleanState, BridgedDeviceBasicInformation, CarbonDioxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurement, ClosureControl, ClosureDimension, ColorControl, Descriptor, DeviceEnergyManagement, DoorLock, ElectricalEnergyMeasurement, ElectricalPowerMeasurement, EnergyEvse, EnergyEvseMode, FanControl, FlowMeasurement, FormaldehydeConcentrationMeasurement, Identify, IlluminanceMeasurement, LevelControl, NitrogenDioxideConcentrationMeasurement, OccupancySensing, OnOff, OperationalState, OvenMode, OzoneConcentrationMeasurement, Pm1ConcentrationMeasurement, Pm10ConcentrationMeasurement, Pm25ConcentrationMeasurement, PowerSource, PressureMeasurement, RadonConcentrationMeasurement, RelativeHumidityMeasurement, RvcCleanMode, RvcOperationalState, RvcRunMode, SmokeCoAlarm, TemperatureMeasurement, Thermostat, TotalVolatileOrganicCompoundsConcentrationMeasurement, WindowCovering, } from 'matterbridge/matter/clusters';
5
+ import { AirQuality, BooleanState, BridgedDeviceBasicInformation, CarbonDioxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurement, ClosureControl, ClosureDimension, ColorControl, DeviceEnergyManagement, DoorLock, ElectricalEnergyMeasurement, ElectricalPowerMeasurement, EnergyEvse, EnergyEvseMode, FanControl, FlowMeasurement, FormaldehydeConcentrationMeasurement, Identify, IlluminanceMeasurement, LevelControl, NitrogenDioxideConcentrationMeasurement, OccupancySensing, OnOff, OperationalState, OvenMode, OzoneConcentrationMeasurement, Pm1ConcentrationMeasurement, Pm10ConcentrationMeasurement, Pm25ConcentrationMeasurement, PowerSource, PressureMeasurement, RadonConcentrationMeasurement, RelativeHumidityMeasurement, RvcCleanMode, RvcOperationalState, RvcRunMode, SmokeCoAlarm, TemperatureMeasurement, Thermostat, TotalVolatileOrganicCompoundsConcentrationMeasurement, WindowCovering, } from 'matterbridge/matter/clusters';
6
6
  import { ThreeLevelAuto } from 'matterbridge/matter/types';
7
- import { fireAndForget, getEnumDescription, isValidBoolean, isValidNumber, isValidObject, isValidString } from 'matterbridge/utils';
7
+ import { fireAndForget, getEnumDescription, isValidBoolean, isValidNumber, isValidObject, isValidString, parseVersionString } from 'matterbridge/utils';
8
8
  function luxToMatter(lux) {
9
- if (!Number.isFinite(lux) || lux <= 0)
9
+ if (!Number.isFinite(lux) || lux < 1)
10
10
  return 0;
11
- const encoded = 10000 * Math.log10(lux);
12
- if (!Number.isFinite(encoded) || encoded < 0)
13
- return 0;
14
- return Math.round(Math.min(encoded, 0xfffe));
11
+ const encoded = Math.round(10000 * Math.log10(lux) + 1);
12
+ return Math.min(encoded, 0xfffe);
15
13
  }
16
14
  function matterToLux(value) {
17
15
  if (!Number.isFinite(value) || value <= 0)
18
16
  return 0;
19
17
  const v = Math.min(value, 0xfffe);
20
- const lux = Math.pow(10, v / 10000);
21
- return Math.round(lux < 0 ? 0 : lux);
22
- }
23
- function isDeviceTypeList(value) {
24
- return Array.isArray(value);
18
+ return Math.round(Math.pow(10, (v - 1) / 10000));
25
19
  }
26
20
  export default function initializePlugin(matterbridge, log, config) {
27
21
  return new ExampleMatterbridgeDynamicPlatform(matterbridge, log, config);
@@ -1319,16 +1313,16 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1319
1313
  const lookupSystemMode = ['Off', 'Auto', '', 'Cool', 'Heat', 'EmergencyHeat', 'Precooling', 'FanOnly', 'Dry', 'Sleep'];
1320
1314
  this.thermoAutoSchedules?.log.info(`Subscribe systemMode called with: ${lookupSystemMode[newValue]} (old value: ${lookupSystemMode[oldValue]})`);
1321
1315
  }, this.thermoAutoSchedules.log);
1322
- this.thermoAutoSchedules?.subscribeAttribute(Thermostat.id, 'occupiedHeatingSetpoint', (newValue, oldValue) => {
1316
+ this.thermoAutoSchedules?.subscribeAttribute(Thermostat, 'occupiedHeatingSetpoint', (newValue, oldValue) => {
1323
1317
  this.thermoAutoSchedules?.log.info(`Subscribe occupiedHeatingSetpoint called with: ${newValue / 100} (old value: ${oldValue / 100})`);
1324
1318
  }, this.thermoAutoSchedules.log);
1325
- this.thermoAutoSchedules?.subscribeAttribute(Thermostat.id, 'occupiedCoolingSetpoint', (newValue, oldValue) => {
1319
+ this.thermoAutoSchedules?.subscribeAttribute(Thermostat, 'occupiedCoolingSetpoint', (newValue, oldValue) => {
1326
1320
  this.thermoAutoSchedules?.log.info(`Subscribe occupiedCoolingSetpoint called with: ${newValue / 100} (old value: ${oldValue / 100})`);
1327
1321
  }, this.thermoAutoSchedules.log);
1328
- this.thermoAutoSchedules?.subscribeAttribute(Thermostat.id, 'activeScheduleHandle', (newValue, oldValue) => {
1322
+ this.thermoAutoSchedules?.subscribeAttribute(Thermostat, 'activeScheduleHandle', (newValue, oldValue) => {
1329
1323
  this.thermoAutoSchedules?.log.info(`Subscribe activeScheduleHandle called with: ${newValue ? `0x${Buffer.from(newValue).toString('hex')}` : 'null'} (old value: ${oldValue ? `0x${Buffer.from(oldValue).toString('hex')}` : 'null'})`);
1330
1324
  }, this.thermoAutoSchedules.log);
1331
- this.thermoAutoSchedules?.subscribeAttribute(Thermostat.id, 'schedules', (newValue, oldValue) => {
1325
+ this.thermoAutoSchedules?.subscribeAttribute(Thermostat, 'schedules', (newValue, oldValue) => {
1332
1326
  this.thermoAutoSchedules?.log.info(`Subscribe schedules called with: ${debugStringify(newValue)} (old value: ${debugStringify(oldValue)})`);
1333
1327
  }, this.thermoAutoSchedules.log);
1334
1328
  this.thermoHeat = new MatterbridgeEndpoint([thermostat, bridgedNode, powerSource], { id: 'Thermostat (Heat)' }, this.config.debug)
@@ -1366,7 +1360,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1366
1360
  const lookupSystemMode = ['Off', 'Auto', '', 'Cool', 'Heat', 'EmergencyHeat', 'Precooling', 'FanOnly', 'Dry', 'Sleep'];
1367
1361
  this.thermoHeat?.log.info('Subscribe systemMode called with:', lookupSystemMode[value]);
1368
1362
  }, this.thermoHeat.log);
1369
- this.thermoHeat?.subscribeAttribute(Thermostat.id, 'occupiedHeatingSetpoint', (value) => {
1363
+ this.thermoHeat?.subscribeAttribute(Thermostat, 'occupiedHeatingSetpoint', (value) => {
1370
1364
  this.thermoHeat?.log.info('Subscribe occupiedHeatingSetpoint called with:', value / 100);
1371
1365
  }, this.thermoHeat.log);
1372
1366
  this.thermoCool = new MatterbridgeEndpoint([thermostat, bridgedNode, powerSource], { id: 'Thermostat (Cool)' }, this.config.debug)
@@ -1386,7 +1380,7 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1386
1380
  const lookupSystemMode = ['Off', 'Auto', '', 'Cool', 'Heat', 'EmergencyHeat', 'Precooling', 'FanOnly', 'Dry', 'Sleep'];
1387
1381
  this.thermoCool?.log.info('Subscribe systemMode called with:', lookupSystemMode[value]);
1388
1382
  }, this.thermoCool.log);
1389
- this.thermoCool?.subscribeAttribute(Thermostat.id, 'occupiedCoolingSetpoint', (value) => {
1383
+ this.thermoCool?.subscribeAttribute(Thermostat, 'occupiedCoolingSetpoint', (value) => {
1390
1384
  this.thermoCool?.log.info('Subscribe occupiedCoolingSetpoint called with:', value / 100);
1391
1385
  }, this.thermoCool.log);
1392
1386
  this.airPurifier = new MatterbridgeEndpoint([airPurifier, bridgedNode, powerSource], { id: 'Air purifier' }, this.config.debug)
@@ -1411,10 +1405,10 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1411
1405
  this.airPurifier?.addCommandHandler('identify', ({ request: { identifyTime } }) => {
1412
1406
  this.airPurifier?.log.info(`Command identify called identifyTime:${identifyTime}`);
1413
1407
  });
1414
- this.airPurifier?.subscribeAttribute(FanControl.id, 'fanMode', (newValue, oldValue, context) => {
1408
+ this.airPurifier?.subscribeAttribute(FanControl, 'fanMode', (newValue, oldValue, context) => {
1415
1409
  this.airPurifier?.log.info(`Fan mode changed from ${this.fanModeLookup[oldValue]} to ${this.fanModeLookup[newValue]} context: ${context.fabric === undefined ? 'offline' : 'online'}`);
1416
1410
  }, this.airPurifier.log);
1417
- this.airPurifier?.subscribeAttribute(FanControl.id, 'percentSetting', (newValue, oldValue, context) => void (async () => {
1411
+ this.airPurifier?.subscribeAttribute(FanControl, 'percentSetting', (newValue, oldValue, context) => void (async () => {
1418
1412
  this.airPurifier?.log.info(`Percent setting changed from ${oldValue} to ${newValue} context: ${context.fabric === undefined ? 'offline' : 'online'}`);
1419
1413
  if (context.fabric === undefined)
1420
1414
  return;
@@ -1941,10 +1935,10 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
1941
1935
  await this.airConditioner?.setAttribute(RelativeHumidityMeasurement.id, 'measuredValue', null, this.airConditioner?.log);
1942
1936
  await this.airConditioner?.setAttribute(FanControl.id, 'percentSetting', 0, this.airConditioner?.log);
1943
1937
  });
1944
- this.airConditioner?.subscribeAttribute(FanControl.id, 'fanMode', (newValue, oldValue, context) => {
1938
+ this.airConditioner?.subscribeAttribute(FanControl, 'fanMode', (newValue, oldValue, context) => {
1945
1939
  this.airConditioner?.log.info(`Fan mode changed from ${this.fanModeLookup[oldValue]} to ${this.fanModeLookup[newValue]} context: ${context.fabric === undefined ? 'offline' : 'online'}`);
1946
1940
  }, this.airConditioner?.log);
1947
- this.airConditioner?.subscribeAttribute(FanControl.id, 'percentSetting', (newValue, oldValue, context) => void (async () => {
1941
+ this.airConditioner?.subscribeAttribute(FanControl, 'percentSetting', (newValue, oldValue, context) => void (async () => {
1948
1942
  this.airConditioner?.log.info(`Percent setting changed from ${oldValue} to ${newValue} context: ${context.fabric === undefined ? 'offline' : 'online'}`);
1949
1943
  if (context.fabric === undefined)
1950
1944
  return;
@@ -2564,18 +2558,18 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
2564
2558
  if (this.config.useInterval) {
2565
2559
  this.addInterval(async () => {
2566
2560
  let mode = this.fanDefault?.getAttribute(FanControl, 'fanMode', this.fanDefault.log);
2567
- let value = this.fanDefault?.getAttribute(FanControl, 'percentCurrent', this.fanDefault.log);
2568
- if (isValidNumber(mode, FanControl.FanMode.Off, FanControl.FanMode.Auto) && mode === FanControl.FanMode.Auto && isValidNumber(value, 0, 100)) {
2569
- value = value + 10 >= 100 ? 0 : value + 10;
2570
- await this.fanDefault?.setAttribute(FanControl, 'percentCurrent', value, this.fanDefault.log);
2571
- this.fanDefault?.log.info(`Set fan percentCurrent to ${value}`);
2561
+ let current = this.fanDefault?.getAttribute(FanControl, 'percentCurrent', this.fanDefault.log);
2562
+ if (isValidNumber(mode, FanControl.FanMode.Off, FanControl.FanMode.Auto) && mode === FanControl.FanMode.Auto && isValidNumber(current, 0, 100)) {
2563
+ current = current + 10 >= 100 ? 0 : current + 10;
2564
+ await this.fanDefault?.setAttribute(FanControl, 'percentCurrent', current, this.fanDefault.log);
2565
+ this.fanDefault?.log.info(`Set fan percentCurrent to ${current}`);
2572
2566
  }
2573
2567
  mode = this.fanComplete?.getAttribute(FanControl, 'fanMode', this.fanComplete.log);
2574
- value = this.fanComplete?.getAttribute(FanControl, 'percentCurrent', this.fanComplete.log);
2575
- if (isValidNumber(mode, FanControl.FanMode.Off, FanControl.FanMode.Auto) && mode === FanControl.FanMode.Auto && isValidNumber(value, 0, 100)) {
2576
- value = value + 10 >= 100 ? 0 : value + 10;
2577
- await this.fanComplete?.setAttribute(FanControl, 'percentCurrent', value, this.fanComplete.log);
2578
- this.fanComplete?.log.info(`Set fan percentCurrent to ${value}`);
2568
+ current = this.fanComplete?.getAttribute(FanControl, 'percentCurrent', this.fanComplete.log);
2569
+ if (isValidNumber(mode, FanControl.FanMode.Off, FanControl.FanMode.Auto) && mode === FanControl.FanMode.Auto && isValidNumber(current, 0, 100)) {
2570
+ current = current + 10 >= 100 ? 0 : current + 10;
2571
+ await this.fanComplete?.setAttribute(FanControl, 'percentCurrent', current, this.fanComplete.log);
2572
+ this.fanComplete?.log.info(`Set fan percentCurrent to ${current}`);
2579
2573
  }
2580
2574
  }, 60 * 1000 + 700);
2581
2575
  }
@@ -2699,14 +2693,14 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
2699
2693
  return undefined;
2700
2694
  this.setSelectDevice(device.serialNumber, device.deviceName, undefined, 'hub');
2701
2695
  if (this.validateDevice(device.deviceName)) {
2702
- device.softwareVersion = Number.parseInt(this.version.replace(/\D/g, ''));
2696
+ device.softwareVersion = parseVersionString(this.version);
2703
2697
  device.softwareVersionString = this.version === '' ? 'Unknown' : this.version;
2704
- device.hardwareVersion = Number.parseInt(this.matterbridge.matterbridgeVersion.replace(/\D/g, ''));
2698
+ device.hardwareVersion = parseVersionString(this.matterbridge.matterbridgeVersion);
2705
2699
  device.hardwareVersionString = this.matterbridge.matterbridgeVersion;
2706
2700
  device.softwareVersion = isValidNumber(device.softwareVersion, 0, UINT32_MAX) ? device.softwareVersion : undefined;
2707
- device.softwareVersionString = isValidString(device.softwareVersionString) ? device.softwareVersionString.slice(0, 64) : undefined;
2701
+ device.softwareVersionString = isValidString(device.softwareVersionString, 1) ? device.softwareVersionString.slice(0, 64) : undefined;
2708
2702
  device.hardwareVersion = isValidNumber(device.hardwareVersion, 0, UINT16_MAX) ? device.hardwareVersion : undefined;
2709
- device.hardwareVersionString = isValidString(device.hardwareVersionString) ? device.hardwareVersionString.slice(0, 64) : undefined;
2703
+ device.hardwareVersionString = isValidString(device.hardwareVersionString, 1) ? device.hardwareVersionString.slice(0, 64) : undefined;
2710
2704
  const options = device.getClusterServerOptions(BridgedDeviceBasicInformation.id);
2711
2705
  if (options) {
2712
2706
  options.softwareVersion = device.softwareVersion ?? 1;
@@ -2714,17 +2708,6 @@ export class ExampleMatterbridgeDynamicPlatform extends MatterbridgeDynamicPlatf
2714
2708
  options.hardwareVersion = device.hardwareVersion ?? 1;
2715
2709
  options.hardwareVersionString = device.hardwareVersionString ?? '1.0.0';
2716
2710
  }
2717
- if (device.mode === undefined && !device.deviceTypes.has(bridgedNode.code)) {
2718
- device.deviceTypes.set(bridgedNode.code, bridgedNode);
2719
- const options = device.getClusterServerOptions(Descriptor);
2720
- const deviceTypeList = options?.deviceTypeList;
2721
- if (isDeviceTypeList(deviceTypeList)) {
2722
- if (!deviceTypeList.find((dt) => dt.deviceType === bridgedNode.code)) {
2723
- deviceTypeList.push({ deviceType: bridgedNode.code, revision: bridgedNode.revision });
2724
- }
2725
- }
2726
- device.createDefaultBridgedDeviceBasicInformationClusterServer(device.deviceName, device.serialNumber, device.vendorId, device.vendorName, device.productName, device.softwareVersion, device.softwareVersionString, device.hardwareVersion, device.hardwareVersionString);
2727
- }
2728
2711
  await this.registerDevice(device);
2729
2712
  return device;
2730
2713
  }
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "matterbridge-example-dynamic-platform",
3
- "version": "3.0.3-dev-20260829-d83e6fe",
3
+ "version": "3.0.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge-example-dynamic-platform",
9
- "version": "3.0.3-dev-20260829-d83e6fe",
9
+ "version": "3.0.3",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
- "node-ansi-logger": "3.3.0",
13
- "node-persist-manager": "2.1.0"
12
+ "node-ansi-logger": "3.3.1",
13
+ "node-persist-manager": "2.1.1"
14
14
  },
15
15
  "engines": {
16
16
  "node": ">=20.19.0 <21.0.0 || >=22.13.0 <23.0.0 || >=24.0.0 <25.0.0 || >=26.0.0 <27.0.0"
@@ -21,9 +21,9 @@
21
21
  }
22
22
  },
23
23
  "node_modules/node-ansi-logger": {
24
- "version": "3.3.0",
25
- "resolved": "https://registry.npmjs.org/node-ansi-logger/-/node-ansi-logger-3.3.0.tgz",
26
- "integrity": "sha512-ZW77lbZkA8h3r2HA2rcE5RjTIcwRDNB072RkZVyimGQpmEorJT8ajZ7UDhkHGoh0JRrCJL0iUKBE8q4oU8MHMg==",
24
+ "version": "3.3.1",
25
+ "resolved": "https://registry.npmjs.org/node-ansi-logger/-/node-ansi-logger-3.3.1.tgz",
26
+ "integrity": "sha512-JjkQHtVKgyd5Ua4AkYCFsZZiUYMrPsj/S9k2VY8/FjYuFJFRjDawsuxMwaThhWu4oU7zwuqvDG2uoDnjUyApVw==",
27
27
  "hasShrinkwrap": true,
28
28
  "license": "Apache-2.0",
29
29
  "engines": {
@@ -35,9 +35,9 @@
35
35
  }
36
36
  },
37
37
  "node_modules/node-persist-manager": {
38
- "version": "2.1.0",
39
- "resolved": "https://registry.npmjs.org/node-persist-manager/-/node-persist-manager-2.1.0.tgz",
40
- "integrity": "sha512-LJze/Fcd8LijM4OMPnp0AQ+Z1e9mFMkjOEDw08xHA2HSRd2+N5s0uyH5ogYmXPC68f0sc4GrdKMpAcsHuO3PKA==",
38
+ "version": "2.1.1",
39
+ "resolved": "https://registry.npmjs.org/node-persist-manager/-/node-persist-manager-2.1.1.tgz",
40
+ "integrity": "sha512-cAqF2spTnzDSAQeORHy/OYdD1VROGZ6UiLjmq/gVxQ4EglB0Ro0QX83U+xHEh2G6b7HTvGFqjS/R9LTOGkcayw==",
41
41
  "hasShrinkwrap": true,
42
42
  "license": "Apache-2.0",
43
43
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge-example-dynamic-platform",
3
- "version": "3.0.3-dev-20260829-d83e6fe",
3
+ "version": "3.0.3",
4
4
  "description": "Matterbridge dynamic plugin",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",
@@ -68,7 +68,7 @@
68
68
  "*.schema.json"
69
69
  ],
70
70
  "dependencies": {
71
- "node-ansi-logger": "3.3.0",
72
- "node-persist-manager": "2.1.0"
71
+ "node-ansi-logger": "3.3.1",
72
+ "node-persist-manager": "2.1.1"
73
73
  }
74
74
  }