matterbridge 3.1.5-dev-20250720-5a0b41e → 3.1.6-dev-20250720-88d6141

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,24 @@ 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.1.6] - 2025-07-??
12
+
13
+ ### Added
14
+
15
+ - [reset]: Improved reset all devices command. It will shutdown all the plugins and recreate the devices with new state and enpoint numbers even if the device is not selected.
16
+ - [enpoint]: Enhanced HEPA and Activated Carbon Filter Monitoring Cluster Server methods with additional features and improved default parameters.
17
+ - [enpoint]: Added resetCondition command for HEPA and Activated Carbon Filter Monitoring Cluster Server.
18
+ - [dishwasher]: Added Dishwasher class and Jest test. It is not supported by the Home app.
19
+ - [extractorHood]: Added ExtractorHood class and Jest test.
20
+
21
+ ### Changed
22
+
23
+ - [package]: Updated dependencies.
24
+
25
+ <a href="https://www.buymeacoffee.com/luligugithub">
26
+ <img src="bmc-button.svg" alt="Buy me a coffee" width="80">
27
+ </a>
28
+
11
29
  ## [3.1.5] - 2025-07-19
12
30
 
13
31
  ### Added
@@ -0,0 +1,90 @@
1
+ import { TemperatureControl } from '@matter/main/clusters/temperature-control';
2
+ import { ModeBase } from '@matter/main/clusters/mode-base';
3
+ import { DishwasherModeServer } from '@matter/main/behaviors/dishwasher-mode';
4
+ import { DishwasherAlarmServer } from '@matter/main/behaviors/dishwasher-alarm';
5
+ import { DishwasherMode } from '@matter/main/clusters/dishwasher-mode';
6
+ import { dishwasher, powerSource } from '../matterbridgeDeviceTypes.js';
7
+ import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
8
+ import { MatterbridgeOnOffServer, MatterbridgeServer } from '../matterbridgeBehaviors.js';
9
+ import { MatterbridgeLevelTemperatureControlServer, MatterbridgeNumberTemperatureControlServer } from './laundryWasher.js';
10
+ export class Dishwasher extends MatterbridgeEndpoint {
11
+ constructor(name, serial, currentMode, supportedModes, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
12
+ super([dishwasher, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
13
+ this.createDefaultIdentifyClusterServer();
14
+ this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Dishwasher');
15
+ this.createDefaultPowerSourceWiredClusterServer();
16
+ this.createDeadFrontOnOffClusterServer(true);
17
+ this.createDefaultDishwasherModeClusterServer(currentMode, supportedModes);
18
+ this.createDefaultDishwasherAlarmClusterServer();
19
+ if (temperatureSetpoint)
20
+ this.createNumberTemperatureControlClusterServer(temperatureSetpoint, minTemperature, maxTemperature, step);
21
+ else
22
+ this.createLevelTemperatureControlClusterServer(selectedTemperatureLevel, supportedTemperatureLevels);
23
+ this.createDefaultOperationalStateClusterServer(operationalState);
24
+ }
25
+ createLevelTemperatureControlClusterServer(selectedTemperatureLevel = 1, supportedTemperatureLevels = ['Cold', 'Warm', 'Hot', '30°', '40°', '60°', '80°']) {
26
+ this.behaviors.require(MatterbridgeLevelTemperatureControlServer.with(TemperatureControl.Feature.TemperatureLevel), {
27
+ selectedTemperatureLevel,
28
+ supportedTemperatureLevels,
29
+ });
30
+ return this;
31
+ }
32
+ createNumberTemperatureControlClusterServer(temperatureSetpoint = 40 * 100, minTemperature = 30 * 100, maxTemperature = 60 * 100, step = 10 * 100) {
33
+ this.behaviors.require(MatterbridgeNumberTemperatureControlServer.with(TemperatureControl.Feature.TemperatureNumber, TemperatureControl.Feature.TemperatureStep), {
34
+ temperatureSetpoint,
35
+ minTemperature,
36
+ maxTemperature,
37
+ step,
38
+ });
39
+ return this;
40
+ }
41
+ createDefaultDishwasherModeClusterServer(currentMode = 2, supportedModes = [
42
+ { label: 'Light', mode: 1, modeTags: [{ value: DishwasherMode.ModeTag.Light }] },
43
+ { label: 'Normal', mode: 2, modeTags: [{ value: DishwasherMode.ModeTag.Normal }] },
44
+ { label: 'Heavy', mode: 3, modeTags: [{ value: DishwasherMode.ModeTag.Heavy }] },
45
+ ]) {
46
+ this.behaviors.require(MatterbridgeDishwasherModeServer, {
47
+ supportedModes,
48
+ currentMode,
49
+ });
50
+ return this;
51
+ }
52
+ createDefaultDishwasherAlarmClusterServer() {
53
+ this.behaviors.require(DishwasherAlarmServer, {
54
+ mask: { inflowError: true, drainError: true, doorError: true, tempTooLow: true, tempTooHigh: true, waterLevelError: true },
55
+ state: { inflowError: false, drainError: false, doorError: false, tempTooLow: false, tempTooHigh: false, waterLevelError: false },
56
+ supported: { inflowError: true, drainError: true, doorError: true, tempTooLow: true, tempTooHigh: true, waterLevelError: true },
57
+ });
58
+ return this;
59
+ }
60
+ }
61
+ export class MatterbridgeDishwasherModeServer extends DishwasherModeServer {
62
+ initialize() {
63
+ const device = this.endpoint.stateOf(MatterbridgeServer);
64
+ device.log.info(`MatterbridgeDishwasherModeServer initialized: currentMode is ${this.state.currentMode}`);
65
+ this.state.currentMode = 2;
66
+ this.reactTo(this.agent.get(MatterbridgeOnOffServer).events.onOff$Changed, this.handleOnOffChange);
67
+ }
68
+ handleOnOffChange(onOff) {
69
+ const device = this.endpoint.stateOf(MatterbridgeServer);
70
+ if (onOff === false) {
71
+ device.log.info('OnOffServer changed to OFF: setting Dead Front state to Manufacturer Specific');
72
+ this.state.currentMode = 2;
73
+ }
74
+ }
75
+ changeToMode(request) {
76
+ const device = this.endpoint.stateOf(MatterbridgeServer);
77
+ device.log.info(`ChangeToMode (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
78
+ device.commandHandler.executeHandler('changeToMode', { request, cluster: DishwasherModeServer.id, attributes: this.state, endpoint: this.endpoint });
79
+ const supportedMode = this.state.supportedModes.find((supportedMode) => supportedMode.mode === request.newMode);
80
+ if (supportedMode) {
81
+ device.log.info(`DishwasherModeServer: changeToMode called with mode ${supportedMode.mode} => ${supportedMode.label}`);
82
+ this.state.currentMode = request.newMode;
83
+ return { status: ModeBase.ModeChangeStatus.Success, statusText: 'Success' };
84
+ }
85
+ else {
86
+ device.log.error(`DishwasherModeServer: changeToMode called with invalid mode ${request.newMode}`);
87
+ return { status: ModeBase.ModeChangeStatus.InvalidInMode, statusText: 'Invalid mode' };
88
+ }
89
+ }
90
+ }
@@ -6,3 +6,5 @@ export * from './evse.js';
6
6
  export * from './solarPower.js';
7
7
  export * from './batteryStorage.js';
8
8
  export * from './heatPump.js';
9
+ export * from './extractorHood.js';
10
+ export * from './dishwasher.js';
@@ -0,0 +1,35 @@
1
+ import { ResourceMonitoring } from '@matter/main/clusters/resource-monitoring';
2
+ import { extractorHood, powerSource } from '../matterbridgeDeviceTypes.js';
3
+ import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
4
+ export class ExtractorHood extends MatterbridgeEndpoint {
5
+ constructor(name, serial, hepaCondition = 100, hepaChangeIndication = ResourceMonitoring.ChangeIndication.Ok, hepaInPlaceIndicator = true, hepaLastChangedTime = null, hepaReplacementProductList = [], activatedCarbonCondition = 100, activatedCarbonChangeIndication = ResourceMonitoring.ChangeIndication.Ok, activatedCarbonInPlaceIndicator = true, activatedCarbonLastChangedTime = null, activatedCarbonReplacementProductList = []) {
6
+ super([extractorHood, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
7
+ this.createDefaultIdentifyClusterServer();
8
+ this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Extractor Hood');
9
+ this.createDefaultPowerSourceWiredClusterServer();
10
+ this.createBaseFanControlClusterServer();
11
+ this.createDefaultHepaFilterMonitoringClusterServer(hepaCondition, hepaChangeIndication, hepaInPlaceIndicator, hepaLastChangedTime, hepaReplacementProductList);
12
+ this.createDefaultActivatedCarbonFilterMonitoringClusterServer(activatedCarbonCondition, activatedCarbonChangeIndication, activatedCarbonInPlaceIndicator, activatedCarbonLastChangedTime, activatedCarbonReplacementProductList);
13
+ this.subscribeAttribute('fanControl', 'fanMode', (newValue, oldValue, context) => {
14
+ if (context.offline === true)
15
+ return;
16
+ this.log.info(`Fan control fanMode attribute changed: ${newValue}`);
17
+ });
18
+ this.subscribeAttribute('fanControl', 'percentSetting', (newValue, oldValue, context) => {
19
+ if (context.offline === true)
20
+ return;
21
+ this.log.info(`Fan control percentSetting attribute changed: ${newValue}`);
22
+ this.setAttribute('fanControl', 'percentCurrent', newValue, this.log);
23
+ });
24
+ this.subscribeAttribute('hepaFilterMonitoring', 'lastChangedTime', (newValue, oldValue, context) => {
25
+ if (context.offline === true)
26
+ return;
27
+ this.log.info(`Hepa filter monitoring lastChangedTime attribute changed: ${newValue}`);
28
+ });
29
+ this.subscribeAttribute('activatedCarbonFilterMonitoring', 'lastChangedTime', (newValue, oldValue, context) => {
30
+ if (context.offline === true)
31
+ return;
32
+ this.log.info(`Activated carbon filter monitoring lastChangedTime attribute changed: ${newValue}`);
33
+ });
34
+ }
35
+ }
@@ -10,7 +10,8 @@ import { DeviceCommissioner, FabricAction, MdnsService, PaseClient } from '@matt
10
10
  import { AggregatorEndpoint } from '@matter/main/endpoints';
11
11
  import { BasicInformationServer } from '@matter/main/behaviors/basic-information';
12
12
  import { BridgedDeviceBasicInformationServer } from '@matter/main/behaviors/bridged-device-basic-information';
13
- import { getParameter, getIntParameter, hasParameter, copyDirectory, withTimeout, waiter, isValidString, parseVersionString, isValidNumber, createDirectory, wait } from './utils/export.js';
13
+ import { getParameter, getIntParameter, hasParameter, copyDirectory, isValidString, parseVersionString, isValidNumber, createDirectory } from './utils/export.js';
14
+ import { withTimeout, waiter, wait } from './utils/wait.js';
14
15
  import { dev, plg, typ } from './matterbridgeTypes.js';
15
16
  import { PluginManager } from './pluginManager.js';
16
17
  import { DeviceManager } from './deviceManager.js';
@@ -199,9 +200,7 @@ export class Matterbridge extends EventEmitter {
199
200
  }
200
201
  }
201
202
  await Promise.resolve();
202
- await new Promise((resolve) => {
203
- setTimeout(resolve, pause);
204
- });
203
+ await wait(pause, 'destroyInstance start', true);
205
204
  await this.cleanup('destroying instance...', false, timeout);
206
205
  this.log.info(`Dispose ${servers.length} MdnsService...`);
207
206
  for (const server of servers) {
@@ -209,9 +208,7 @@ export class Matterbridge extends EventEmitter {
209
208
  this.log.info(`Closed ${server.id} MdnsService`);
210
209
  }
211
210
  await Promise.resolve();
212
- await new Promise((resolve) => {
213
- setTimeout(resolve, pause);
214
- });
211
+ await wait(pause, 'destroyInstance stop', true);
215
212
  }
216
213
  async initialize() {
217
214
  this.emit('initialize_started');
@@ -985,11 +982,14 @@ export class Matterbridge extends EventEmitter {
985
982
  }
986
983
  async unregisterAndShutdownProcess(timeout = 1000) {
987
984
  this.log.info('Unregistering all devices and shutting down...');
988
- for (const plugin of this.plugins) {
989
- await this.removeAllBridgedEndpoints(plugin.name, 250);
985
+ for (const plugin of this.plugins.array()) {
986
+ if (plugin.error || !plugin.enabled)
987
+ continue;
988
+ await this.plugins.shutdown(plugin, 'unregistering all devices and shutting down...', false, true);
989
+ await this.removeAllBridgedEndpoints(plugin.name, 100);
990
990
  }
991
991
  this.log.debug('Waiting for the MessageExchange to finish...');
992
- await new Promise((resolve) => setTimeout(resolve, timeout));
992
+ await wait(timeout);
993
993
  this.log.debug('Cleaning up and shutting down...');
994
994
  await this.cleanup('unregistered all devices and shutting down...', false, timeout);
995
995
  }
@@ -1041,7 +1041,7 @@ export class Matterbridge extends EventEmitter {
1041
1041
  }
1042
1042
  this.log.notice(`Stopping matter server nodes in ${this.bridgeMode} mode...`);
1043
1043
  this.log.debug('Waiting for the MessageExchange to finish...');
1044
- await new Promise((resolve) => setTimeout(resolve, timeout));
1044
+ await wait(timeout, 'Waiting for the MessageExchange to finish...', true);
1045
1045
  if (this.bridgeMode === 'bridge') {
1046
1046
  if (this.serverNode) {
1047
1047
  await this.stopServerNode(this.serverNode);
@@ -1072,6 +1072,23 @@ export class Matterbridge extends EventEmitter {
1072
1072
  await this.matterbridgeContext?.clearAll();
1073
1073
  this.log.info('Matter storage reset done! Remove the bridge from the controller.');
1074
1074
  }
1075
+ if (message === 'unregistered all devices and shutting down...') {
1076
+ if (this.bridgeMode === 'bridge') {
1077
+ await this.matterStorageManager?.createContext('root')?.createContext('parts')?.createContext('Matterbridge')?.createContext('parts')?.clearAll();
1078
+ await this.matterStorageManager?.createContext('root')?.createContext('subscription')?.clearAll();
1079
+ await this.matterStorageManager?.createContext('sessions')?.clearAll();
1080
+ }
1081
+ else if (this.bridgeMode === 'childbridge') {
1082
+ for (const plugin of this.plugins.array()) {
1083
+ if (plugin.type === 'DynamicPlatform') {
1084
+ await plugin.storageContext?.createContext('root')?.createContext('parts')?.createContext(plugin.name)?.createContext('parts')?.clearAll();
1085
+ }
1086
+ await plugin.storageContext?.createContext('root')?.createContext('subscription')?.clearAll();
1087
+ await plugin.storageContext?.createContext('sessions')?.clearAll();
1088
+ }
1089
+ }
1090
+ this.log.info('Matter storage reset done!');
1091
+ }
1075
1092
  await this.stopMatterStorage();
1076
1093
  await this.frontend.stop();
1077
1094
  try {
@@ -1727,10 +1744,10 @@ export class Matterbridge extends EventEmitter {
1727
1744
  for (const device of this.devices.array().filter((device) => device.plugin === pluginName)) {
1728
1745
  await this.removeBridgedEndpoint(pluginName, device);
1729
1746
  if (delay > 0)
1730
- await new Promise((resolve) => setTimeout(resolve, delay));
1747
+ await wait(delay);
1731
1748
  }
1732
1749
  if (delay > 0)
1733
- await new Promise((resolve) => setTimeout(resolve, 2000));
1750
+ await wait(2000);
1734
1751
  }
1735
1752
  async subscribeAttributeChanged(plugin, device) {
1736
1753
  this.log.info(`Subscribing attributes for endpoint ${dev}${device.deviceName}${nf} (${dev}${device.id}${nf}) plugin ${plg}${plugin.name}${nf}`);
@@ -26,6 +26,8 @@ import { OperationalStateServer } from '@matter/main/behaviors/operational-state
26
26
  import { ServiceAreaServer } from '@matter/main/behaviors/service-area';
27
27
  import { DeviceEnergyManagementServer } from '@matter/main/behaviors/device-energy-management';
28
28
  import { DeviceEnergyManagementModeServer } from '@matter/main/behaviors/device-energy-management-mode';
29
+ import { HepaFilterMonitoringServer } from '@matter/main/behaviors/hepa-filter-monitoring';
30
+ import { ActivatedCarbonFilterMonitoringServer } from '@matter/main/behaviors/activated-carbon-filter-monitoring';
29
31
  export class MatterbridgeServer extends Behavior {
30
32
  static id = 'matterbridge';
31
33
  initialize() {
@@ -393,6 +395,24 @@ export class MatterbridgeModeSelectServer extends ModeSelectServer {
393
395
  super.changeToMode(request);
394
396
  }
395
397
  }
398
+ export class MatterbridgeHepaFilterMonitoringServer extends HepaFilterMonitoringServer {
399
+ resetCondition() {
400
+ const device = this.endpoint.stateOf(MatterbridgeServer);
401
+ device.log.info(`Resetting condition (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
402
+ device.commandHandler.executeHandler('resetCondition', { cluster: MatterbridgeHepaFilterMonitoringServer.id, attributes: this.state, endpoint: this.endpoint });
403
+ this.state.lastChangedTime = Math.floor(new Date().getTime() / 1000);
404
+ device.log.debug(`MatterbridgeHepaFilterMonitoringServer: resetCondition called`);
405
+ }
406
+ }
407
+ export class MatterbridgeActivatedCarbonFilterMonitoringServer extends ActivatedCarbonFilterMonitoringServer {
408
+ resetCondition() {
409
+ const device = this.endpoint.stateOf(MatterbridgeServer);
410
+ device.log.info(`Resetting condition (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
411
+ device.commandHandler.executeHandler('resetCondition', { cluster: MatterbridgeActivatedCarbonFilterMonitoringServer.id, attributes: this.state, endpoint: this.endpoint });
412
+ this.state.lastChangedTime = Math.floor(new Date().getTime() / 1000);
413
+ device.log.debug(`MatterbridgeActivatedCarbonFilterMonitoringServer: resetCondition called`);
414
+ }
415
+ }
396
416
  export class MatterbridgeDeviceEnergyManagementServer extends DeviceEnergyManagementServer {
397
417
  powerAdjustRequest(request) {
398
418
  const device = this.endpoint.stateOf(MatterbridgeServer);
@@ -56,13 +56,11 @@ import { RadonConcentrationMeasurementServer } from '@matter/main/behaviors/rado
56
56
  import { TotalVolatileOrganicCompoundsConcentrationMeasurementServer } from '@matter/main/behaviors/total-volatile-organic-compounds-concentration-measurement';
57
57
  import { FanControlServer } from '@matter/main/behaviors/fan-control';
58
58
  import { ResourceMonitoring } from '@matter/main/clusters/resource-monitoring';
59
- import { HepaFilterMonitoringServer } from '@matter/main/behaviors/hepa-filter-monitoring';
60
- import { ActivatedCarbonFilterMonitoringServer } from '@matter/main/behaviors/activated-carbon-filter-monitoring';
61
59
  import { ThermostatUserInterfaceConfigurationServer } from '@matter/main/behaviors/thermostat-user-interface-configuration';
62
60
  import { AnsiLogger, CYAN, YELLOW, db, debugStringify, hk, or, zb } from './logger/export.js';
63
61
  import { bridgedNode } from './matterbridgeDeviceTypes.js';
64
62
  import { isValidNumber, isValidObject, isValidString } from './utils/export.js';
65
- import { MatterbridgeServer, MatterbridgeIdentifyServer, MatterbridgeOnOffServer, MatterbridgeLevelControlServer, MatterbridgeColorControlServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeLiftTiltWindowCoveringServer, MatterbridgeThermostatServer, MatterbridgeFanControlServer, MatterbridgeDoorLockServer, MatterbridgeModeSelectServer, MatterbridgeValveConfigurationAndControlServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeSwitchServer, MatterbridgeOperationalStateServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, } from './matterbridgeBehaviors.js';
63
+ import { MatterbridgeServer, MatterbridgeIdentifyServer, MatterbridgeOnOffServer, MatterbridgeLevelControlServer, MatterbridgeColorControlServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeLiftTiltWindowCoveringServer, MatterbridgeThermostatServer, MatterbridgeFanControlServer, MatterbridgeDoorLockServer, MatterbridgeModeSelectServer, MatterbridgeValveConfigurationAndControlServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeSwitchServer, MatterbridgeOperationalStateServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeActivatedCarbonFilterMonitoringServer, MatterbridgeHepaFilterMonitoringServer, } from './matterbridgeBehaviors.js';
66
64
  import { addClusterServers, addFixedLabel, addOptionalClusterServers, addRequiredClusterServers, addUserLabel, createUniqueId, getBehavior, getBehaviourTypesFromClusterClientIds, getBehaviourTypesFromClusterServerIds, getDefaultOperationalStateClusterServer, getDefaultFlowMeasurementClusterServer, getDefaultIlluminanceMeasurementClusterServer, getDefaultPressureMeasurementClusterServer, getDefaultRelativeHumidityMeasurementClusterServer, getDefaultTemperatureMeasurementClusterServer, getDefaultOccupancySensingClusterServer, lowercaseFirstLetter, updateAttribute, getClusterId, getAttributeId, setAttribute, getAttribute, checkNotLatinCharacters, generateUniqueId, subscribeAttribute, invokeBehaviorCommand, triggerEvent, } from './matterbridgeEndpointHelpers.js';
67
65
  export class MatterbridgeEndpoint extends Endpoint {
68
66
  static bridgeMode = '';
@@ -845,25 +843,25 @@ export class MatterbridgeEndpoint extends Endpoint {
845
843
  });
846
844
  return this;
847
845
  }
848
- createDefaultHepaFilterMonitoringClusterServer(changeIndication = ResourceMonitoring.ChangeIndication.Ok, inPlaceIndicator = undefined, lastChangedTime = undefined) {
849
- this.behaviors.require(HepaFilterMonitoringServer.with(ResourceMonitoring.Feature.Condition, ResourceMonitoring.Feature.ReplacementProductList), {
850
- condition: 100,
846
+ createDefaultHepaFilterMonitoringClusterServer(condition = 100, changeIndication = ResourceMonitoring.ChangeIndication.Ok, inPlaceIndicator = true, lastChangedTime = null, replacementProductList = []) {
847
+ this.behaviors.require(MatterbridgeHepaFilterMonitoringServer.with(ResourceMonitoring.Feature.Condition, ResourceMonitoring.Feature.Warning, ResourceMonitoring.Feature.ReplacementProductList), {
848
+ condition,
851
849
  degradationDirection: ResourceMonitoring.DegradationDirection.Down,
850
+ replacementProductList,
852
851
  changeIndication,
853
852
  inPlaceIndicator,
854
853
  lastChangedTime,
855
- replacementProductList: [],
856
854
  });
857
855
  return this;
858
856
  }
859
- createDefaultActivatedCarbonFilterMonitoringClusterServer(changeIndication = ResourceMonitoring.ChangeIndication.Ok, inPlaceIndicator = undefined, lastChangedTime = undefined) {
860
- this.behaviors.require(ActivatedCarbonFilterMonitoringServer.with(ResourceMonitoring.Feature.Condition, ResourceMonitoring.Feature.ReplacementProductList), {
861
- condition: 100,
857
+ createDefaultActivatedCarbonFilterMonitoringClusterServer(condition = 100, changeIndication = ResourceMonitoring.ChangeIndication.Ok, inPlaceIndicator = true, lastChangedTime = null, replacementProductList = []) {
858
+ this.behaviors.require(MatterbridgeActivatedCarbonFilterMonitoringServer.with(ResourceMonitoring.Feature.Condition, ResourceMonitoring.Feature.Warning, ResourceMonitoring.Feature.ReplacementProductList), {
859
+ condition,
862
860
  degradationDirection: ResourceMonitoring.DegradationDirection.Down,
861
+ replacementProductList,
863
862
  changeIndication,
864
863
  inPlaceIndicator,
865
864
  lastChangedTime,
866
- replacementProductList: [],
867
865
  });
868
866
  return this;
869
867
  }
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.1.5-dev-20250720-5a0b41e",
3
+ "version": "3.1.6-dev-20250720-88d6141",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge",
9
- "version": "3.1.5-dev-20250720-5a0b41e",
9
+ "version": "3.1.6-dev-20250720-88d6141",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@matter/main": "0.15.1",
13
13
  "archiver": "7.0.1",
14
14
  "express": "5.1.0",
15
15
  "glob": "11.0.3",
16
- "multer": "2.0.1",
16
+ "multer": "2.0.2",
17
17
  "node-ansi-logger": "3.1.1",
18
18
  "node-persist-manager": "2.0.0",
19
19
  "ws": "8.18.3"
@@ -151,9 +151,9 @@
151
151
  }
152
152
  },
153
153
  "node_modules/@noble/curves": {
154
- "version": "1.9.3",
155
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.3.tgz",
156
- "integrity": "sha512-NiHFh8qtZRREtY0Bpup+xpmLnB0bn9UAtj8CARBc2x1zjpVLDC84u+Bvy2+uaSgA3AmMP9zsacMZT1echgVAdQ==",
154
+ "version": "1.9.4",
155
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.4.tgz",
156
+ "integrity": "sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==",
157
157
  "license": "MIT",
158
158
  "dependencies": {
159
159
  "@noble/hashes": "1.8.0"
@@ -1279,9 +1279,9 @@
1279
1279
  "license": "MIT"
1280
1280
  },
1281
1281
  "node_modules/multer": {
1282
- "version": "2.0.1",
1283
- "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz",
1284
- "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==",
1282
+ "version": "2.0.2",
1283
+ "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz",
1284
+ "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==",
1285
1285
  "license": "MIT",
1286
1286
  "dependencies": {
1287
1287
  "append-field": "^1.0.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.1.5-dev-20250720-5a0b41e",
3
+ "version": "3.1.6-dev-20250720-88d6141",
4
4
  "description": "Matterbridge plugin manager for Matter",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",
@@ -102,7 +102,7 @@
102
102
  "archiver": "7.0.1",
103
103
  "express": "5.1.0",
104
104
  "glob": "11.0.3",
105
- "multer": "2.0.1",
105
+ "multer": "2.0.2",
106
106
  "node-ansi-logger": "3.1.1",
107
107
  "node-persist-manager": "2.0.0",
108
108
  "ws": "8.18.3"