matterbridge-zigbee2mqtt 3.0.0 → 3.0.1

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
@@ -8,6 +8,19 @@ If you like this project and find it useful, please consider giving it a star on
8
8
  <img src="bmc-button.svg" alt="Buy me a coffee" width="120">
9
9
  </a>
10
10
 
11
+ ## [3.0.1] - 2025-11-14
12
+
13
+ ### Changed
14
+
15
+ - [package]: Updated dependencies.
16
+ - [package]: Bumped package to automator v.2.0.12.
17
+ - [package]: Updated to the current Matterbridge signatures.
18
+ - [jest]: Updated jestHelpers to v.1.0.12.
19
+
20
+ <a href="https://www.buymeacoffee.com/luligugithub">
21
+ <img src="bmc-button.svg" alt="Buy me a coffee" width="80">
22
+ </a>
23
+
11
24
  ## [3.0.0] - 2025-11-08
12
25
 
13
26
  ### Added
package/dist/entity.js CHANGED
@@ -330,8 +330,8 @@ export class ZigbeeEntity extends EventEmitter {
330
330
  }
331
331
  this.log.debug(`Command on called for ${this.ien}${this.isGroup ? this.group?.friendly_name : this.device?.friendly_name}${rs}${db} endpoint: ${data.endpoint?.maybeId}:${data.endpoint?.maybeNumber}`);
332
332
  const isChildEndpoint = data.endpoint.deviceName !== this.entityName;
333
- this.setCachePublishAttributes(data.endpoint, isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : undefined);
334
- this.cachePublish('on', { ['state' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: 'ON' });
333
+ this.setCachePublishAttributes(data.endpoint, isChildEndpoint ? '_' + data.endpoint.id : undefined);
334
+ this.cachePublish('on', { ['state' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: 'ON' });
335
335
  }
336
336
  async offCommandHandler(data) {
337
337
  if (data.endpoint.getAttribute(OnOff.Cluster.id, 'onOff') === false) {
@@ -340,17 +340,17 @@ export class ZigbeeEntity extends EventEmitter {
340
340
  }
341
341
  this.log.debug(`Command off called for ${this.ien}${this.isGroup ? this.group?.friendly_name : this.device?.friendly_name}${rs}${db} endpoint: ${data.endpoint?.maybeId}:${data.endpoint?.maybeNumber}`);
342
342
  const isChildEndpoint = data.endpoint.deviceName !== this.entityName;
343
- this.cachePublish('off', { ['state' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: 'OFF' });
343
+ this.cachePublish('off', { ['state' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: 'OFF' });
344
344
  }
345
345
  async toggleCommandHandler(data) {
346
346
  this.log.debug(`Command toggle called for ${this.ien}${this.isGroup ? this.group?.friendly_name : this.device?.friendly_name}${rs}${db} endpoint: ${data.endpoint?.maybeId}:${data.endpoint?.maybeNumber}`);
347
347
  const isChildEndpoint = data.endpoint.deviceName !== this.entityName;
348
348
  if (data.endpoint.getAttribute(OnOff.Cluster.id, 'onOff') === false) {
349
- this.setCachePublishAttributes(data.endpoint, isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : undefined);
350
- this.cachePublish('toggle', { ['state' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: 'ON' });
349
+ this.setCachePublishAttributes(data.endpoint, isChildEndpoint ? '_' + data.endpoint.id : undefined);
350
+ this.cachePublish('toggle', { ['state' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: 'ON' });
351
351
  }
352
352
  else {
353
- this.cachePublish('toggle', { ['state' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: 'OFF' });
353
+ this.cachePublish('toggle', { ['state' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: 'OFF' });
354
354
  }
355
355
  }
356
356
  async moveToLevelCommandHandler(data) {
@@ -360,7 +360,7 @@ export class ZigbeeEntity extends EventEmitter {
360
360
  }
361
361
  this.log.debug(`Command moveToLevel called for ${this.ien}${this.isGroup ? this.group?.friendly_name : this.device?.friendly_name}${rs}${db} endpoint: ${data.endpoint?.maybeId}:${data.endpoint?.maybeNumber} request: ${data.request.level} transition: ${data.request.transitionTime}`);
362
362
  const isChildEndpoint = data.endpoint.deviceName !== this.entityName;
363
- this.cachePublish('moveToLevel', { ['brightness' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: data.request.level }, data.request.transitionTime);
363
+ this.cachePublish('moveToLevel', { ['brightness' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: data.request.level }, data.request.transitionTime);
364
364
  }
365
365
  async moveToLevelWithOnOffCommandHandler(data) {
366
366
  this.log.debug(`Command moveToLevelWithOnOff called for ${this.ien}${this.isGroup ? this.group?.friendly_name : this.device?.friendly_name}${rs}${db} endpoint: ${data.endpoint?.maybeId}:${data.endpoint?.maybeNumber} request: ${data.request.level} transition: ${data.request.transitionTime}`);
@@ -371,15 +371,15 @@ export class ZigbeeEntity extends EventEmitter {
371
371
  return;
372
372
  }
373
373
  data.endpoint.log.debug(`Command moveToLevelWithOnOff received with level <= minLevel(${data.endpoint.getAttribute(LevelControl.Cluster.id, 'minLevel')}) => turn off the light`);
374
- this.cachePublish('moveToLevelWithOnOff', { ['state' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: 'OFF' }, data.request.transitionTime);
374
+ this.cachePublish('moveToLevelWithOnOff', { ['state' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: 'OFF' }, data.request.transitionTime);
375
375
  }
376
376
  else {
377
377
  if (data.endpoint.getAttribute(OnOff.Cluster.id, 'onOff') === false) {
378
378
  data.endpoint.log.debug(`Command moveToLevelWithOnOff received with level > minLevel(${data.endpoint.getAttribute(LevelControl.Cluster.id, 'minLevel')}) and light is off => turn on the light with attributes`);
379
- this.cachePayload['state' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')] = 'ON';
380
- this.setCachePublishAttributes(data.endpoint, isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '');
379
+ this.cachePayload['state' + (isChildEndpoint ? '_' + data.endpoint.id : '')] = 'ON';
380
+ this.setCachePublishAttributes(data.endpoint, isChildEndpoint ? '_' + data.endpoint.id : '');
381
381
  }
382
- this.cachePublish('moveToLevelWithOnOff', { ['brightness' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: data.request.level }, data.request.transitionTime);
382
+ this.cachePublish('moveToLevelWithOnOff', { ['brightness' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: data.request.level }, data.request.transitionTime);
383
383
  }
384
384
  }
385
385
  async moveToColorTemperatureCommandHandler(data) {
@@ -391,11 +391,11 @@ export class ZigbeeEntity extends EventEmitter {
391
391
  this.log.debug(`Command moveToColorTemperature called for ${this.ien}${this.isGroup ? this.group?.friendly_name : this.device?.friendly_name}${rs}${db} endpoint: ${data.endpoint?.maybeId}:${data.endpoint?.maybeNumber} request: ${data.request.colorTemperatureMireds} transition: ${data.request.transitionTime}`);
392
392
  const isChildEndpoint = data.endpoint.deviceName !== this.entityName;
393
393
  if (this.propertyMap.get('color_temp')) {
394
- this.cachePublish('moveToColorTemperature', { ['color_temp' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: data.request.colorTemperatureMireds }, data.request.transitionTime);
394
+ this.cachePublish('moveToColorTemperature', { ['color_temp' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: data.request.colorTemperatureMireds }, data.request.transitionTime);
395
395
  }
396
396
  else {
397
397
  const rgb = kelvinToRGB(miredToKelvin(data.request.colorTemperatureMireds));
398
- this.cachePublish('moveToColorTemperature', { ['color' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: { r: rgb.r, g: rgb.g, b: rgb.b } }, data.request.transitionTime);
398
+ this.cachePublish('moveToColorTemperature', { ['color' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: { r: rgb.r, g: rgb.g, b: rgb.b } }, data.request.transitionTime);
399
399
  this.log.debug(`Command moveToColorTemperature called for ${this.ien}${this.isGroup ? this.group?.friendly_name : this.device?.friendly_name}${rs}${db} but color_temp property is not available. Converting ${data.request.colorTemperatureMireds} to RGB ${debugStringify(rgb)}.`);
400
400
  }
401
401
  }
@@ -407,7 +407,7 @@ export class ZigbeeEntity extends EventEmitter {
407
407
  }
408
408
  this.log.debug(`Command moveToColor called for ${this.ien}${this.isGroup ? this.group?.friendly_name : this.device?.friendly_name}${rs}${db} endpoint: ${data.endpoint?.maybeId}:${data.endpoint?.maybeNumber} request: X: ${data.request.colorX} Y: ${data.request.colorY} transition: ${data.request.transitionTime}`);
409
409
  const isChildEndpoint = data.endpoint.deviceName !== this.entityName;
410
- this.cachePublish('moveToColor', { ['color' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: { x: Math.round(data.request.colorX / 65536 * 10000) / 10000, y: Math.round(data.request.colorY / 65536 * 10000) / 10000 } }, data.request.transitionTime);
410
+ this.cachePublish('moveToColor', { ['color' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: { x: Math.round(data.request.colorX / 65536 * 10000) / 10000, y: Math.round(data.request.colorY / 65536 * 10000) / 10000 } }, data.request.transitionTime);
411
411
  }
412
412
  async moveToHueCommandHandler(data) {
413
413
  delete this.cachePayload['color_temp'];
@@ -417,7 +417,7 @@ export class ZigbeeEntity extends EventEmitter {
417
417
  }
418
418
  this.log.debug(`Command moveToHue called for ${this.ien}${this.isGroup ? this.group?.friendly_name : this.device?.friendly_name}${rs}${db} endpoint: ${data.endpoint?.maybeId}:${data.endpoint?.maybeNumber} request: ${data.request.hue} transition: ${data.request.transitionTime}`);
419
419
  const isChildEndpoint = data.endpoint.deviceName !== this.entityName;
420
- this.cachePublish('moveToHue', { ['color' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: { h: Math.round(data.request.hue / 254 * 360), s: Math.round(data.endpoint.getAttribute(ColorControlCluster.id, 'currentSaturation') / 254 * 100) } }, data.request.transitionTime);
420
+ this.cachePublish('moveToHue', { ['color' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: { h: Math.round(data.request.hue / 254 * 360), s: Math.round(data.endpoint.getAttribute(ColorControlCluster.id, 'currentSaturation') / 254 * 100) } }, data.request.transitionTime);
421
421
  }
422
422
  async moveToSaturationCommandHandler(data) {
423
423
  delete this.cachePayload['color_temp'];
@@ -427,7 +427,7 @@ export class ZigbeeEntity extends EventEmitter {
427
427
  }
428
428
  this.log.debug(`Command moveToSaturation called for ${this.ien}${this.isGroup ? this.group?.friendly_name : this.device?.friendly_name}${rs}${db} endpoint: ${data.endpoint?.maybeId}:${data.endpoint?.maybeNumber} request: ${data.request.saturation} transition: ${data.request.transitionTime}`);
429
429
  const isChildEndpoint = data.endpoint.deviceName !== this.entityName;
430
- this.cachePublish('moveToSaturation', { ['color' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: { h: Math.round(data.endpoint.getAttribute(ColorControlCluster.id, 'currentHue') / 254 * 360), s: Math.round(data.request.saturation / 254 * 100) } }, data.request.transitionTime);
430
+ this.cachePublish('moveToSaturation', { ['color' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: { h: Math.round(data.endpoint.getAttribute(ColorControlCluster.id, 'currentHue') / 254 * 360), s: Math.round(data.request.saturation / 254 * 100) } }, data.request.transitionTime);
431
431
  }
432
432
  async moveToHueAndSaturationCommandHandler(data) {
433
433
  delete this.cachePayload['color_temp'];
@@ -437,7 +437,7 @@ export class ZigbeeEntity extends EventEmitter {
437
437
  }
438
438
  this.log.debug(`Command moveToHueAndSaturation called for ${this.ien}${this.isGroup ? this.group?.friendly_name : this.device?.friendly_name}${rs}${db} endpoint: ${data.endpoint?.maybeId}:${data.endpoint?.maybeNumber} request: ${data.request.hue} - ${data.request.saturation} transition: ${data.request.transitionTime}`);
439
439
  const isChildEndpoint = data.endpoint.deviceName !== this.entityName;
440
- this.cachePublish('moveToHueAndSaturation', { ['color' + (isChildEndpoint ? '_' + data.endpoint.uniqueStorageKey : '')]: { h: Math.round(data.request.hue / 254 * 360), s: Math.round(data.request.saturation / 254 * 100) } }, data.request.transitionTime);
440
+ this.cachePublish('moveToHueAndSaturation', { ['color' + (isChildEndpoint ? '_' + data.endpoint.id : '')]: { h: Math.round(data.request.hue / 254 * 360), s: Math.round(data.request.saturation / 254 * 100) } }, data.request.transitionTime);
441
441
  }
442
442
  addBridgedDeviceBasicInformation() {
443
443
  if (!this.bridgedDevice)
@@ -599,7 +599,7 @@ export class ZigbeeGroup extends ZigbeeEntity {
599
599
  let isThermostat = false;
600
600
  if (group.members.length === 0) {
601
601
  zigbeeGroup.log.debug(`Group: ${gn}${group.friendly_name}${rs}${db} is a ${CYAN}virtual${db} group`);
602
- zigbeeGroup.bridgedDevice = new MatterbridgeEndpoint([onOffSwitch, bridgedNode, powerSource], { uniqueStorageKey: group.friendly_name }, zigbeeGroup.log.logLevel === "debug");
602
+ zigbeeGroup.bridgedDevice = new MatterbridgeEndpoint([onOffSwitch, bridgedNode, powerSource], { id: group.friendly_name }, zigbeeGroup.log.logLevel === "debug");
603
603
  isSwitch = true;
604
604
  zigbeeGroup.propertyMap.set('state', { name: 'state', type: 'switch', endpoint: '' });
605
605
  }
@@ -685,7 +685,7 @@ export class ZigbeeGroup extends ZigbeeEntity {
685
685
  }
686
686
  if (!deviceType)
687
687
  return zigbeeGroup;
688
- zigbeeGroup.bridgedDevice = new MatterbridgeEndpoint([deviceType, bridgedNode, powerSource], { uniqueStorageKey: group.friendly_name }, zigbeeGroup.log.logLevel === "debug");
688
+ zigbeeGroup.bridgedDevice = new MatterbridgeEndpoint([deviceType, bridgedNode, powerSource], { id: group.friendly_name }, zigbeeGroup.log.logLevel === "debug");
689
689
  }
690
690
  if (!platform.featureBlackList?.includes('scenes') && !platform.deviceFeatureBlackList[group.friendly_name]?.includes('scenes')) {
691
691
  group.scenes.forEach((scene) => {
@@ -884,7 +884,7 @@ export class ZigbeeDevice extends ZigbeeEntity {
884
884
  (device.model_id.startsWith('SLZB-') && device.manufacturer === 'SMLIGHT')) {
885
885
  zigbeeDevice.isRouter = true;
886
886
  platform.setSelectDevice(device.ieee_address, device.friendly_name, 'wifi');
887
- zigbeeDevice.bridgedDevice = new MatterbridgeEndpoint([doorLockDevice, bridgedNode, powerSource], { uniqueStorageKey: device.friendly_name }, zigbeeDevice.log.logLevel === "debug");
887
+ zigbeeDevice.bridgedDevice = new MatterbridgeEndpoint([doorLockDevice, bridgedNode, powerSource], { id: device.friendly_name }, zigbeeDevice.log.logLevel === "debug");
888
888
  zigbeeDevice.addBridgedDeviceBasicInformation();
889
889
  zigbeeDevice.addPowerSource();
890
890
  zigbeeDevice.bridgedDevice.addRequiredClusterServers();
@@ -1076,7 +1076,7 @@ export class ZigbeeDevice extends ZigbeeEntity {
1076
1076
  zigbeeDevice.log.info(`Device ${zigbeeDevice.ien}${device.friendly_name}${rs}${nf} has actions mapped to these switches on sub endpoints:`);
1077
1077
  zigbeeDevice.log.info(' controller events <=> zigbee2mqtt actions');
1078
1078
  if (!zigbeeDevice.bridgedDevice)
1079
- zigbeeDevice.bridgedDevice = new MatterbridgeEndpoint([bridgedNode], { uniqueStorageKey: device.friendly_name }, zigbeeDevice.log.logLevel === "debug");
1079
+ zigbeeDevice.bridgedDevice = new MatterbridgeEndpoint([bridgedNode], { id: device.friendly_name }, zigbeeDevice.log.logLevel === "debug");
1080
1080
  zigbeeDevice.hasEndpoints = true;
1081
1081
  const switchMap = ['Single Press', 'Double Press', 'Long Press '];
1082
1082
  const triggerMap = ['Single', 'Double', 'Long'];
@@ -1164,7 +1164,7 @@ export class ZigbeeDevice extends ZigbeeEntity {
1164
1164
  deviceTypesMap.delete(powerSource.code);
1165
1165
  device.deviceTypes = Array.from(deviceTypesMap.values());
1166
1166
  }
1167
- zigbeeDevice.bridgedDevice = new MatterbridgeEndpoint([...mainEndpoint.deviceTypes, bridgedNode, powerSource], { uniqueStorageKey: device.friendly_name }, zigbeeDevice.log.logLevel === "debug");
1167
+ zigbeeDevice.bridgedDevice = new MatterbridgeEndpoint([...mainEndpoint.deviceTypes, bridgedNode, powerSource], { id: device.friendly_name }, zigbeeDevice.log.logLevel === "debug");
1168
1168
  zigbeeDevice.addBridgedDeviceBasicInformation();
1169
1169
  zigbeeDevice.addPowerSource();
1170
1170
  if (mainEndpoint.clusterServersIds.includes(PowerSource.Cluster.id)) {
package/dist/module.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import path from 'node:path';
2
- import { addVirtualDevice, MatterbridgeDynamicPlatform } from 'matterbridge';
2
+ import { MatterbridgeDynamicPlatform } from 'matterbridge';
3
3
  import { dn, gn, db, wr, zb, payloadStringify, rs, debugStringify, CYAN, er, nf } from 'matterbridge/logger';
4
4
  import { isValidNumber, isValidString, waiter } from 'matterbridge/utils';
5
5
  import { BridgedDeviceBasicInformation, DoorLock } from 'matterbridge/matter/clusters';
@@ -9,6 +9,7 @@ export default function initializePlugin(matterbridge, log, config) {
9
9
  return new ZigbeePlatform(matterbridge, log, config);
10
10
  }
11
11
  export class ZigbeePlatform extends MatterbridgeDynamicPlatform {
12
+ config;
12
13
  bridgedDevices = [];
13
14
  zigbeeEntities = [];
14
15
  namePostfix = 1;
@@ -41,6 +42,7 @@ export class ZigbeePlatform extends MatterbridgeDynamicPlatform {
41
42
  availabilityTimer;
42
43
  constructor(matterbridge, log, config) {
43
44
  super(matterbridge, log, config);
45
+ this.config = config;
44
46
  if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('3.3.0')) {
45
47
  throw new Error(`This plugin requires Matterbridge version >= "3.3.0". Please update Matterbridge from ${this.matterbridge.matterbridgeVersion} to the latest version in the frontend."`);
46
48
  }
@@ -486,20 +488,7 @@ export class ZigbeePlatform extends MatterbridgeDynamicPlatform {
486
488
  return matterGroup;
487
489
  }
488
490
  _registerVirtualDevice(name, callback) {
489
- let aggregator;
490
- if (this.matterbridge.bridgeMode === 'bridge') {
491
- aggregator = this.matterbridge.aggregatorNode;
492
- }
493
- else if (this.matterbridge.bridgeMode === 'childbridge') {
494
- aggregator = this.matterbridge.plugins.get(this.name)?.aggregatorNode;
495
- }
496
- if (aggregator) {
497
- if (aggregator.parts.has(name.replaceAll(' ', '') + ':' + this.config.scenesType)) {
498
- this.log.warn(`Scene name ${name} already registered. Please use a different name. Changed to ${name + ' ' + this.namePostfix}`);
499
- name = name + ' ' + this.namePostfix++;
500
- }
501
- addVirtualDevice(aggregator, name.slice(0, 32), this.config.scenesType, callback);
502
- }
491
+ this.registerVirtualDevice(name, this.config.scenesType, callback);
503
492
  }
504
493
  async unregisterZigbeeEntity(friendly_name) {
505
494
  const entity = this.zigbeeEntities.find((entity) => entity.entityName === friendly_name);
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "matterbridge-zigbee2mqtt",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge-zigbee2mqtt",
9
- "version": "3.0.0",
9
+ "version": "3.0.1",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
+ "moment": "2.30.1",
12
13
  "mqtt": "5.14.1",
13
14
  "node-ansi-logger": "3.1.1",
14
15
  "node-persist-manager": "2.0.0"
@@ -31,9 +32,9 @@
31
32
  }
32
33
  },
33
34
  "node_modules/@types/node": {
34
- "version": "24.9.2",
35
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz",
36
- "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==",
35
+ "version": "24.10.1",
36
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
37
+ "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==",
37
38
  "license": "MIT",
38
39
  "dependencies": {
39
40
  "undici-types": "~7.16.0"
@@ -259,9 +260,9 @@
259
260
  "license": "ISC"
260
261
  },
261
262
  "node_modules/ip-address": {
262
- "version": "10.0.1",
263
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
264
- "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
263
+ "version": "10.1.0",
264
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
265
+ "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
265
266
  "license": "MIT",
266
267
  "engines": {
267
268
  "node": ">= 12"
@@ -286,6 +287,15 @@
286
287
  "url": "https://github.com/sponsors/ljharb"
287
288
  }
288
289
  },
290
+ "node_modules/moment": {
291
+ "version": "2.30.1",
292
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
293
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
294
+ "license": "MIT",
295
+ "engines": {
296
+ "node": "*"
297
+ }
298
+ },
289
299
  "node_modules/mqtt": {
290
300
  "version": "5.14.1",
291
301
  "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.14.1.tgz",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge-zigbee2mqtt",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "description": "Matterbridge zigbee2mqtt plugin",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",
@@ -41,6 +41,7 @@
41
41
  "node": ">=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
42
42
  },
43
43
  "dependencies": {
44
+ "moment": "2.30.1",
44
45
  "mqtt": "5.14.1",
45
46
  "node-ansi-logger": "3.1.1",
46
47
  "node-persist-manager": "2.0.0"