matterbridge 2.0.0-edge.3 → 2.0.0-edge.5

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
@@ -21,7 +21,7 @@ The legacy old api have been completely removed.
21
21
  The frontend has a new dark and light mode. The dark mode is now the default mode.
22
22
  It is possible to change the mode (Classic, Dark or Light) in Settings, Matterbridge settings.
23
23
 
24
- ## [2.0.0-edge.3] - 2025-01-16
24
+ ## [2.0.0-edge.5] - 2025-01-18
25
25
 
26
26
  ### Added
27
27
 
@@ -39,6 +39,8 @@ It is possible to change the mode (Classic, Dark or Light) in Settings, Matterbr
39
39
  - [frontend]: WebSocketProvider added a startTimeout of 300 sec. to start ping.
40
40
  - [frontend]: WebSocketProvider changed pingIntervalSeconds to 60 sec. and offlineTimeoutSeconds to 50 sec.
41
41
  - [frontend]: Search on select is no more case sensitive.
42
+ - [matterbridge]: Deferred memory intensive tasks after initialization.
43
+ - [package]: Optimized all imports from matter.js.
42
44
  - [package]: Update dependencies.
43
45
 
44
46
  ### Fixed
@@ -1,4 +1,4 @@
1
- import { AnsiLogger, BLUE, er } from 'node-ansi-logger';
1
+ import { AnsiLogger, BLUE, er } from './logger/export.js';
2
2
  import { dev } from './matterbridgeTypes.js';
3
3
  export class DeviceManager {
4
4
  _devices = new Map();
package/dist/frontend.js CHANGED
@@ -6,7 +6,7 @@ import WebSocket, { WebSocketServer } from 'ws';
6
6
  import os from 'os';
7
7
  import path from 'path';
8
8
  import { promises as fs } from 'fs';
9
- import { AnsiLogger, CYAN, db, debugStringify, er, nf, rs, stringify, UNDERLINE, UNDERLINEOFF, wr, YELLOW } from 'node-ansi-logger';
9
+ import { AnsiLogger, CYAN, db, debugStringify, er, nf, rs, stringify, UNDERLINE, UNDERLINEOFF, wr, YELLOW } from './logger/export.js';
10
10
  import { createZip, hasParameter, isValidNumber, isValidObject, isValidString } from './utils/utils.js';
11
11
  import { plg } from './matterbridgeTypes.js';
12
12
  import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
package/dist/index.js CHANGED
@@ -1,9 +1,8 @@
1
1
  import { Matterbridge } from './matterbridge.js';
2
+ export { SemanticNamespace, ClosureTag, CompassDirectionTag, CompassLocationTag, DirectionTag, ElectricalMeasurementTag, LaundryTag, LevelTag, LocationTag, NumberTag, PositionTag, PowerSourceTag, RefrigeratorTag, RoomAirConditionerTag, SwitchesTag, } from '@matter/main';
2
3
  export * from '@matter/main/clusters';
3
4
  export * from '@matter/main/types';
4
- export { SemanticNamespace, ClosureTag, CompassDirectionTag, CompassLocationTag, DirectionTag, ElectricalMeasurementTag, LaundryTag, LevelTag, LocationTag, NumberTag, PositionTag, PowerSourceTag, RefrigeratorTag, RoomAirConditionerTag, SwitchesTag, } from '@matter/node';
5
- export * from '@project-chip/matter.js/device';
6
- export * from '@project-chip/matter.js/cluster';
5
+ export { ClusterServer, ClusterClient } from '@project-chip/matter.js/cluster';
7
6
  export * from './matterbridge.js';
8
7
  export * from './matterbridgeTypes.js';
9
8
  export * from './matterbridgeEndpoint.js';
@@ -5,17 +5,17 @@ import EventEmitter from 'events';
5
5
  import os from 'os';
6
6
  import path from 'path';
7
7
  import { randomBytes } from 'crypto';
8
- import { NodeStorageManager } from 'node-persist-manager';
9
- import { AnsiLogger, UNDERLINE, UNDERLINEOFF, YELLOW, db, debugStringify, BRIGHT, RESET, er, nf, rs, wr, RED, GREEN, zb, CYAN, nt } from 'node-ansi-logger';
8
+ import { NodeStorageManager } from './storage/export.js';
9
+ import { AnsiLogger, UNDERLINE, UNDERLINEOFF, YELLOW, db, debugStringify, BRIGHT, RESET, er, nf, rs, wr, RED, GREEN, zb, CYAN, nt } from './logger/export.js';
10
10
  import { logInterfaces, wait, waiter, copyDirectory, getParameter, getIntParameter, hasParameter } from './utils/utils.js';
11
11
  import { PluginManager } from './pluginManager.js';
12
12
  import { DeviceManager } from './deviceManager.js';
13
13
  import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
14
14
  import { bridge } from './matterbridgeDeviceTypes.js';
15
+ import { Frontend } from './frontend.js';
15
16
  import { DeviceTypeId, Endpoint as EndpointNode, Logger, LogLevel as MatterLogLevel, LogFormat as MatterLogFormat, VendorId, StorageService, Environment, ServerNode } from '@matter/main';
16
17
  import { FabricAction, PaseClient } from '@matter/main/protocol';
17
18
  import { AggregatorEndpoint } from '@matter/main/endpoints';
18
- import { Frontend } from './frontend.js';
19
19
  const plg = '\u001B[38;5;33m';
20
20
  const dev = '\u001B[38;5;79m';
21
21
  const typ = '\u001B[38;5;207m';
@@ -545,7 +545,6 @@ export class Matterbridge extends EventEmitter {
545
545
  plugin.error = true;
546
546
  continue;
547
547
  }
548
- this.getPluginLatestVersion(plugin);
549
548
  if (!plugin.enabled) {
550
549
  this.log.info(`Plugin ${plg}${plugin.name}${nf} not enabled`);
551
550
  continue;
@@ -680,18 +679,8 @@ export class Matterbridge extends EventEmitter {
680
679
  this.log.error(`Error getting global node_modules directory: ${error}`);
681
680
  }
682
681
  }
683
- else {
684
- this.getGlobalNodeModules()
685
- .then(async (globalModulesDirectory) => {
686
- this.globalModulesDirectory = globalModulesDirectory;
687
- this.matterbridgeInformation.globalModulesDirectory = this.globalModulesDirectory;
688
- this.log.debug(`Global node_modules Directory: ${this.globalModulesDirectory}`);
689
- await this.nodeContext?.set('globalModulesDirectory', this.globalModulesDirectory);
690
- })
691
- .catch((error) => {
692
- this.log.error(`Error getting global node_modules directory: ${error}`);
693
- });
694
- }
682
+ else
683
+ this.log.debug(`Global node_modules Directory: ${this.globalModulesDirectory}`);
695
684
  this.matterbridgeDirectory = path.join(this.homeDirectory, '.matterbridge');
696
685
  this.matterbridgeInformation.matterbridgeDirectory = this.matterbridgeDirectory;
697
686
  try {
@@ -739,13 +728,12 @@ export class Matterbridge extends EventEmitter {
739
728
  }
740
729
  this.log.debug(`Matterbridge Plugin Directory: ${this.matterbridgePluginDirectory}`);
741
730
  const packageJson = JSON.parse(await fs.readFile(path.join(this.rootDirectory, 'package.json'), 'utf-8'));
742
- this.matterbridgeVersion = packageJson.version;
743
- this.matterbridgeInformation.matterbridgeVersion = this.matterbridgeVersion;
731
+ this.matterbridgeVersion = this.matterbridgeLatestVersion = packageJson.version;
732
+ this.matterbridgeInformation.matterbridgeVersion = this.matterbridgeInformation.matterbridgeLatestVersion = this.matterbridgeVersion;
744
733
  this.log.debug(`Matterbridge Version: ${this.matterbridgeVersion}`);
745
734
  if (this.nodeContext)
746
- this.matterbridgeLatestVersion = await this.nodeContext.get('matterbridgeLatestVersion', '');
735
+ this.matterbridgeLatestVersion = await this.nodeContext.get('matterbridgeLatestVersion', this.matterbridgeVersion);
747
736
  this.log.debug(`Matterbridge Latest Version: ${this.matterbridgeLatestVersion}`);
748
- this.getMatterbridgeLatestVersion();
749
737
  const currentDir = process.cwd();
750
738
  this.log.debug(`Current Working Directory: ${currentDir}`);
751
739
  const cmdArgs = process.argv.slice(2).join(' ');
@@ -1355,17 +1343,21 @@ export class Matterbridge extends EventEmitter {
1355
1343
  hardwareVersionString: await storageContext.get('hardwareVersionString'),
1356
1344
  },
1357
1345
  });
1358
- const sanitizeFabrics = (fabrics) => {
1346
+ const sanitizeFabrics = (fabrics, resetSessions = false) => {
1359
1347
  const sanitizedFabrics = this.sanitizeFabricInformations(Array.from(Object.values(fabrics)));
1360
1348
  this.log.info(`Fabrics: ${debugStringify(sanitizedFabrics)}`);
1361
1349
  if (this.bridgeMode === 'bridge') {
1362
1350
  this.matterbridgeFabricInformations = sanitizedFabrics;
1351
+ if (resetSessions)
1352
+ this.matterbridgeSessionInformations = [];
1363
1353
  this.matterbridgePaired = true;
1364
1354
  }
1365
1355
  if (this.bridgeMode === 'childbridge') {
1366
1356
  const plugin = this.plugins.get(storeId);
1367
1357
  if (plugin) {
1368
1358
  plugin.fabricInformations = sanitizedFabrics;
1359
+ if (resetSessions)
1360
+ plugin.sessionInformations = [];
1369
1361
  plugin.paired = true;
1370
1362
  }
1371
1363
  }
@@ -1401,7 +1393,7 @@ export class Matterbridge extends EventEmitter {
1401
1393
  }
1402
1394
  else {
1403
1395
  this.log.notice(`Server node for ${storeId} is already commissioned. Waiting for controllers to connect ...`);
1404
- sanitizeFabrics(serverNode.state.commissioning.fabrics);
1396
+ sanitizeFabrics(serverNode.state.commissioning.fabrics, true);
1405
1397
  }
1406
1398
  this.frontend.wssSendRefreshRequired();
1407
1399
  });
@@ -1,7 +1,20 @@
1
1
  import { Behavior } from '@matter/main';
2
- import { ColorControlServer, DoorLockServer, IdentifyServer, LevelControlServer, WindowCoveringServer, ThermostatServer, FanControlServer, BooleanStateConfigurationServer, ValveConfigurationAndControlServer, } from '@matter/main/behaviors';
3
- import { BooleanStateConfiguration, ColorControl, FanControl, Thermostat, ValveConfigurationAndControl, WindowCovering } from '@matter/main/clusters';
4
- import { OnOffServer } from '@matter/node/behaviors/on-off';
2
+ import { IdentifyServer } from '@matter/main/behaviors/identify';
3
+ import { OnOffServer } from '@matter/main/behaviors/on-off';
4
+ import { LevelControlServer } from '@matter/main/behaviors/level-control';
5
+ import { ColorControlServer } from '@matter/main/behaviors/color-control';
6
+ import { WindowCoveringServer } from '@matter/main/behaviors/window-covering';
7
+ import { DoorLockServer } from '@matter/main/behaviors/door-lock';
8
+ import { FanControlServer } from '@matter/main/behaviors/fan-control';
9
+ import { ThermostatServer } from '@matter/main/behaviors/thermostat';
10
+ import { ValveConfigurationAndControlServer } from '@matter/main/behaviors/valve-configuration-and-control';
11
+ import { BooleanStateConfigurationServer } from '@matter/main/behaviors/boolean-state-configuration';
12
+ import { BooleanStateConfiguration } from '@matter/main/clusters/boolean-state-configuration';
13
+ import { ColorControl } from '@matter/main/clusters/color-control';
14
+ import { FanControl } from '@matter/main/clusters/fan-control';
15
+ import { Thermostat } from '@matter/main/clusters/thermostat';
16
+ import { ValveConfigurationAndControl } from '@matter/main/clusters/valve-configuration-and-control';
17
+ import { WindowCovering } from '@matter/main/clusters/window-covering';
5
18
  export class MatterbridgeBehaviorDevice {
6
19
  log;
7
20
  commandHandler;
@@ -1,5 +1,82 @@
1
- import { AirQuality, BooleanState, BooleanStateConfiguration, BridgedDeviceBasicInformation, CarbonDioxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurement, ColorControl, DeviceEnergyManagement, DeviceEnergyManagementMode, DoorLock, ElectricalEnergyMeasurement, ElectricalPowerMeasurement, EnergyPreference, FanControl, FlowMeasurement, FormaldehydeConcentrationMeasurement, Groups, Identify, IlluminanceMeasurement, LevelControl, ModeSelect, NitrogenDioxideConcentrationMeasurement, OccupancySensing, OnOff, OzoneConcentrationMeasurement, Pm10ConcentrationMeasurement, Pm1ConcentrationMeasurement, Pm25ConcentrationMeasurement, PowerSource, PowerTopology, PressureMeasurement, RadonConcentrationMeasurement, RelativeHumidityMeasurement, SmokeCoAlarm, SwitchCluster, TemperatureMeasurement, Thermostat, ThermostatUserInterfaceConfiguration, TimeSynchronization, TotalVolatileOrganicCompoundsConcentrationMeasurement, WindowCovering, ValveConfigurationAndControl, HepaFilterMonitoring, ActivatedCarbonFilterMonitoring, Actions, FixedLabel, RvcRunMode, RvcOperationalState, RvcCleanMode, ScenesManagement, PumpConfigurationAndControl, } from '@matter/main/clusters';
2
- import { DeviceClasses, DeviceTypeDefinition } from '@project-chip/matter.js/device';
1
+ import { DeviceTypeId } from '@matter/main';
2
+ import { BooleanState } from '@matter/main/clusters/boolean-state';
3
+ import { BooleanStateConfiguration } from '@matter/main/clusters/boolean-state-configuration';
4
+ import { BridgedDeviceBasicInformation } from '@matter/main/clusters/bridged-device-basic-information';
5
+ import { CarbonDioxideConcentrationMeasurement } from '@matter/main/clusters/carbon-dioxide-concentration-measurement';
6
+ import { CarbonMonoxideConcentrationMeasurement } from '@matter/main/clusters/carbon-monoxide-concentration-measurement';
7
+ import { ColorControl } from '@matter/main/clusters/color-control';
8
+ import { DeviceEnergyManagement } from '@matter/main/clusters/device-energy-management';
9
+ import { DoorLock } from '@matter/main/clusters/door-lock';
10
+ import { ElectricalEnergyMeasurement } from '@matter/main/clusters/electrical-energy-measurement';
11
+ import { ElectricalPowerMeasurement } from '@matter/main/clusters/electrical-power-measurement';
12
+ import { FanControl } from '@matter/main/clusters/fan-control';
13
+ import { FixedLabel } from '@matter/main/clusters/fixed-label';
14
+ import { FlowMeasurement } from '@matter/main/clusters/flow-measurement';
15
+ import { FormaldehydeConcentrationMeasurement } from '@matter/main/clusters/formaldehyde-concentration-measurement';
16
+ import { Groups } from '@matter/main/clusters/groups';
17
+ import { Identify } from '@matter/main/clusters/identify';
18
+ import { IlluminanceMeasurement } from '@matter/main/clusters/illuminance-measurement';
19
+ import { LevelControl } from '@matter/main/clusters/level-control';
20
+ import { ModeSelect } from '@matter/main/clusters/mode-select';
21
+ import { NitrogenDioxideConcentrationMeasurement } from '@matter/main/clusters/nitrogen-dioxide-concentration-measurement';
22
+ import { OccupancySensing } from '@matter/main/clusters/occupancy-sensing';
23
+ import { OnOff } from '@matter/main/clusters/on-off';
24
+ import { OzoneConcentrationMeasurement } from '@matter/main/clusters/ozone-concentration-measurement';
25
+ import { Pm10ConcentrationMeasurement } from '@matter/main/clusters/pm10-concentration-measurement';
26
+ import { Pm1ConcentrationMeasurement } from '@matter/main/clusters/pm1-concentration-measurement';
27
+ import { Pm25ConcentrationMeasurement } from '@matter/main/clusters/pm25-concentration-measurement';
28
+ import { PowerSource } from '@matter/main/clusters/power-source';
29
+ import { PowerTopology } from '@matter/main/clusters/power-topology';
30
+ import { PressureMeasurement } from '@matter/main/clusters/pressure-measurement';
31
+ import { PumpConfigurationAndControl } from '@matter/main/clusters/pump-configuration-and-control';
32
+ import { RadonConcentrationMeasurement } from '@matter/main/clusters/radon-concentration-measurement';
33
+ import { RelativeHumidityMeasurement } from '@matter/main/clusters/relative-humidity-measurement';
34
+ import { SmokeCoAlarm } from '@matter/main/clusters/smoke-co-alarm';
35
+ import { SwitchCluster } from '@matter/main/clusters/switch';
36
+ import { TemperatureMeasurement } from '@matter/main/clusters/temperature-measurement';
37
+ import { Thermostat } from '@matter/main/clusters/thermostat';
38
+ import { TimeSynchronization } from '@matter/main/clusters/time-synchronization';
39
+ import { TotalVolatileOrganicCompoundsConcentrationMeasurement } from '@matter/main/clusters/total-volatile-organic-compounds-concentration-measurement';
40
+ import { ValveConfigurationAndControl } from '@matter/main/clusters/valve-configuration-and-control';
41
+ import { WindowCovering } from '@matter/main/clusters/window-covering';
42
+ import { AirQuality } from '@matter/main/clusters/air-quality';
43
+ import { Actions } from '@matter/main/clusters/actions';
44
+ import { ThermostatUserInterfaceConfiguration } from '@matter/main/clusters/thermostat-user-interface-configuration';
45
+ import { EnergyPreference } from '@matter/main/clusters/energy-preference';
46
+ import { RvcRunMode } from '@matter/main/clusters/rvc-run-mode';
47
+ import { RvcOperationalState } from '@matter/main/clusters/rvc-operational-state';
48
+ import { RvcCleanMode } from '@matter/main/clusters/rvc-clean-mode';
49
+ import { ScenesManagement } from '@matter/main/clusters/scenes-management';
50
+ import { HepaFilterMonitoring } from '@matter/main/clusters/hepa-filter-monitoring';
51
+ import { ActivatedCarbonFilterMonitoring } from '@matter/main/clusters/activated-carbon-filter-monitoring';
52
+ import { DeviceEnergyManagementMode } from '@matter/main/clusters/device-energy-management-mode';
53
+ export var DeviceClasses;
54
+ (function (DeviceClasses) {
55
+ DeviceClasses["Node"] = "Node";
56
+ DeviceClasses["Utility"] = "Utility";
57
+ DeviceClasses["App"] = "App";
58
+ DeviceClasses["Simple"] = "Simple";
59
+ DeviceClasses["Dynamic"] = "Dynamic";
60
+ DeviceClasses["Client"] = "Client";
61
+ DeviceClasses["Server"] = "Server";
62
+ DeviceClasses["Composed"] = "Composed";
63
+ DeviceClasses["Multiple"] = "Multiple";
64
+ DeviceClasses["EZInitiator"] = "EZ-Initiator";
65
+ DeviceClasses["EZTarget"] = "EZ-Target";
66
+ DeviceClasses["BridgedPowerSourceInfo"] = "BridgedPowerSourceInfo";
67
+ })(DeviceClasses || (DeviceClasses = {}));
68
+ export const DeviceTypeDefinition = ({ name, code, deviceClass, superSet, revision, requiredServerClusters = [], optionalServerClusters = [], requiredClientClusters = [], optionalClientClusters = [], unknown = false, }) => ({
69
+ name,
70
+ code: DeviceTypeId(code),
71
+ deviceClass,
72
+ superSet,
73
+ revision,
74
+ requiredServerClusters,
75
+ optionalServerClusters,
76
+ requiredClientClusters,
77
+ optionalClientClusters,
78
+ unknown,
79
+ });
3
80
  export const bridge = DeviceTypeDefinition({
4
81
  name: 'MA-aggregator',
5
82
  code: 0x000e,
@@ -1,13 +1,54 @@
1
1
  import { createHash } from 'crypto';
2
- import { AnsiLogger, BLUE, CYAN, YELLOW, db, debugStringify, er, hk, or, rs, zb } from 'node-ansi-logger';
2
+ import { AnsiLogger, BLUE, CYAN, YELLOW, db, debugStringify, er, hk, or, rs, zb } from './logger/export.js';
3
3
  import { MatterbridgeBehavior, MatterbridgeBehaviorDevice, MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDoorLockServer, MatterbridgeFanControlServer, MatterbridgeIdentifyServer, MatterbridgeLevelControlServer, MatterbridgeOnOffServer, MatterbridgeThermostatServer, MatterbridgeValveConfigurationAndControlServer, MatterbridgeWindowCoveringServer, } from './matterbridgeBehaviors.js';
4
4
  import { bridgedNode } from './matterbridgeDeviceTypes.js';
5
5
  import { deepCopy, isValidNumber } from './utils/utils.js';
6
- import { Endpoint, MutableEndpoint, SupportedBehaviors, NamedHandler, Lifecycle } from '@matter/main';
7
- import { EndpointNumber, VendorId } from '@matter/main';
8
- import { AirQuality, AirQualityCluster, BasicInformation, BasicInformationCluster, BooleanState, BooleanStateCluster, BooleanStateConfiguration, BooleanStateConfigurationCluster, BridgedDeviceBasicInformation, BridgedDeviceBasicInformationCluster, CarbonDioxideConcentrationMeasurement, CarbonDioxideConcentrationMeasurementCluster, CarbonMonoxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurementCluster, ColorControl, ColorControlCluster, ConcentrationMeasurement, Descriptor, DoorLock, DoorLockCluster, ElectricalEnergyMeasurement, ElectricalEnergyMeasurementCluster, ElectricalPowerMeasurement, ElectricalPowerMeasurementCluster, FanControl, FanControlCluster, FixedLabel, FixedLabelCluster, FlowMeasurement, FlowMeasurementCluster, FormaldehydeConcentrationMeasurement, FormaldehydeConcentrationMeasurementCluster, Groups, GroupsCluster, Identify, IdentifyCluster, IlluminanceMeasurement, IlluminanceMeasurementCluster, LevelControl, LevelControlCluster, ModeSelect, ModeSelectCluster, NitrogenDioxideConcentrationMeasurement, NitrogenDioxideConcentrationMeasurementCluster, OccupancySensing, OccupancySensingCluster, OnOff, OnOffCluster, OzoneConcentrationMeasurement, OzoneConcentrationMeasurementCluster, Pm10ConcentrationMeasurement, Pm10ConcentrationMeasurementCluster, Pm1ConcentrationMeasurement, Pm1ConcentrationMeasurementCluster, Pm25ConcentrationMeasurement, Pm25ConcentrationMeasurementCluster, PowerSource, PowerSourceCluster, PowerSourceConfigurationCluster, PowerTopology, PowerTopologyCluster, PressureMeasurement, PressureMeasurementCluster, PumpConfigurationAndControl, PumpConfigurationAndControlCluster, RadonConcentrationMeasurement, RadonConcentrationMeasurementCluster, RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster, SmokeCoAlarm, SmokeCoAlarmCluster, Switch, SwitchCluster, TemperatureMeasurement, TemperatureMeasurementCluster, Thermostat, ThermostatCluster, TotalVolatileOrganicCompoundsConcentrationMeasurement, TotalVolatileOrganicCompoundsConcentrationMeasurementCluster, UserLabel, UserLabelCluster, ValveConfigurationAndControl, ValveConfigurationAndControlCluster, WindowCovering, WindowCoveringCluster, } from '@matter/main/clusters';
6
+ import { Endpoint, MutableEndpoint, SupportedBehaviors, NamedHandler, Lifecycle, VendorId } from '@matter/main';
9
7
  import { MeasurementType, getClusterNameById } from '@matter/main/types';
10
8
  import { Specification } from '@matter/main/model';
9
+ import { BasicInformation, BasicInformationCluster } from '@matter/main/clusters/basic-information';
10
+ import { BooleanState, BooleanStateCluster } from '@matter/main/clusters/boolean-state';
11
+ import { BooleanStateConfiguration, BooleanStateConfigurationCluster } from '@matter/main/clusters/boolean-state-configuration';
12
+ import { BridgedDeviceBasicInformation, BridgedDeviceBasicInformationCluster } from '@matter/main/clusters/bridged-device-basic-information';
13
+ import { CarbonDioxideConcentrationMeasurement, CarbonDioxideConcentrationMeasurementCluster } from '@matter/main/clusters/carbon-dioxide-concentration-measurement';
14
+ import { CarbonMonoxideConcentrationMeasurement, CarbonMonoxideConcentrationMeasurementCluster } from '@matter/main/clusters/carbon-monoxide-concentration-measurement';
15
+ import { ColorControl, ColorControlCluster } from '@matter/main/clusters/color-control';
16
+ import { ConcentrationMeasurement } from '@matter/main/clusters/concentration-measurement';
17
+ import { Descriptor } from '@matter/main/clusters/descriptor';
18
+ import { DoorLock, DoorLockCluster } from '@matter/main/clusters/door-lock';
19
+ import { ElectricalEnergyMeasurement, ElectricalEnergyMeasurementCluster } from '@matter/main/clusters/electrical-energy-measurement';
20
+ import { ElectricalPowerMeasurement, ElectricalPowerMeasurementCluster } from '@matter/main/clusters/electrical-power-measurement';
21
+ import { FanControl, FanControlCluster } from '@matter/main/clusters/fan-control';
22
+ import { FixedLabel, FixedLabelCluster } from '@matter/main/clusters/fixed-label';
23
+ import { FlowMeasurement, FlowMeasurementCluster } from '@matter/main/clusters/flow-measurement';
24
+ import { FormaldehydeConcentrationMeasurement, FormaldehydeConcentrationMeasurementCluster } from '@matter/main/clusters/formaldehyde-concentration-measurement';
25
+ import { Groups, GroupsCluster } from '@matter/main/clusters/groups';
26
+ import { Identify, IdentifyCluster } from '@matter/main/clusters/identify';
27
+ import { IlluminanceMeasurement, IlluminanceMeasurementCluster } from '@matter/main/clusters/illuminance-measurement';
28
+ import { LevelControl, LevelControlCluster } from '@matter/main/clusters/level-control';
29
+ import { ModeSelect, ModeSelectCluster } from '@matter/main/clusters/mode-select';
30
+ import { NitrogenDioxideConcentrationMeasurement, NitrogenDioxideConcentrationMeasurementCluster } from '@matter/main/clusters/nitrogen-dioxide-concentration-measurement';
31
+ import { OccupancySensing, OccupancySensingCluster } from '@matter/main/clusters/occupancy-sensing';
32
+ import { OnOff, OnOffCluster } from '@matter/main/clusters/on-off';
33
+ import { OzoneConcentrationMeasurement, OzoneConcentrationMeasurementCluster } from '@matter/main/clusters/ozone-concentration-measurement';
34
+ import { Pm10ConcentrationMeasurement, Pm10ConcentrationMeasurementCluster } from '@matter/main/clusters/pm10-concentration-measurement';
35
+ import { Pm1ConcentrationMeasurement, Pm1ConcentrationMeasurementCluster } from '@matter/main/clusters/pm1-concentration-measurement';
36
+ import { Pm25ConcentrationMeasurement, Pm25ConcentrationMeasurementCluster } from '@matter/main/clusters/pm25-concentration-measurement';
37
+ import { PowerSource, PowerSourceCluster } from '@matter/main/clusters/power-source';
38
+ import { PowerTopology, PowerTopologyCluster } from '@matter/main/clusters/power-topology';
39
+ import { PressureMeasurement, PressureMeasurementCluster } from '@matter/main/clusters/pressure-measurement';
40
+ import { PumpConfigurationAndControl, PumpConfigurationAndControlCluster } from '@matter/main/clusters/pump-configuration-and-control';
41
+ import { RadonConcentrationMeasurement, RadonConcentrationMeasurementCluster } from '@matter/main/clusters/radon-concentration-measurement';
42
+ import { RelativeHumidityMeasurement, RelativeHumidityMeasurementCluster } from '@matter/main/clusters/relative-humidity-measurement';
43
+ import { SmokeCoAlarm, SmokeCoAlarmCluster } from '@matter/main/clusters/smoke-co-alarm';
44
+ import { Switch, SwitchCluster } from '@matter/main/clusters/switch';
45
+ import { TemperatureMeasurement, TemperatureMeasurementCluster } from '@matter/main/clusters/temperature-measurement';
46
+ import { Thermostat, ThermostatCluster } from '@matter/main/clusters/thermostat';
47
+ import { TotalVolatileOrganicCompoundsConcentrationMeasurement, TotalVolatileOrganicCompoundsConcentrationMeasurementCluster } from '@matter/main/clusters/total-volatile-organic-compounds-concentration-measurement';
48
+ import { UserLabel, UserLabelCluster } from '@matter/main/clusters/user-label';
49
+ import { ValveConfigurationAndControl, ValveConfigurationAndControlCluster } from '@matter/main/clusters/valve-configuration-and-control';
50
+ import { WindowCovering, WindowCoveringCluster } from '@matter/main/clusters/window-covering';
51
+ import { AirQuality, AirQualityCluster } from '@matter/main/clusters/air-quality';
11
52
  import { DescriptorServer } from '@matter/node/behaviors/descriptor';
12
53
  import { IdentifyBehavior } from '@matter/node/behaviors/identify';
13
54
  import { GroupsServer } from '@matter/node/behaviors/groups';
@@ -19,7 +60,27 @@ import { FlowMeasurementServer } from '@matter/node/behaviors/flow-measurement';
19
60
  import { IlluminanceMeasurementServer } from '@matter/node/behaviors/illuminance-measurement';
20
61
  import { BooleanStateServer } from '@matter/node/behaviors/boolean-state';
21
62
  import { OccupancySensingServer } from '@matter/node/behaviors/occupancy-sensing';
22
- import { AirQualityServer, BasicInformationServer, CarbonDioxideConcentrationMeasurementServer, CarbonMonoxideConcentrationMeasurementServer, ElectricalEnergyMeasurementServer, ElectricalPowerMeasurementServer, FixedLabelServer, FormaldehydeConcentrationMeasurementServer, ModeSelectServer, NitrogenDioxideConcentrationMeasurementServer, OzoneConcentrationMeasurementServer, Pm10ConcentrationMeasurementServer, Pm1ConcentrationMeasurementServer, Pm25ConcentrationMeasurementServer, PowerSourceServer, PowerTopologyServer, RadonConcentrationMeasurementServer, SmokeCoAlarmServer, SwitchServer, TotalVolatileOrganicCompoundsConcentrationMeasurementServer, UserLabelServer, } from '@matter/main/behaviors';
63
+ import { AirQualityServer } from '@matter/main/behaviors/air-quality';
64
+ import { BasicInformationServer } from '@matter/main/behaviors/basic-information';
65
+ import { CarbonDioxideConcentrationMeasurementServer } from '@matter/main/behaviors/carbon-dioxide-concentration-measurement';
66
+ import { CarbonMonoxideConcentrationMeasurementServer } from '@matter/main/behaviors/carbon-monoxide-concentration-measurement';
67
+ import { ElectricalEnergyMeasurementServer } from '@matter/main/behaviors/electrical-energy-measurement';
68
+ import { ElectricalPowerMeasurementServer } from '@matter/main/behaviors/electrical-power-measurement';
69
+ import { FixedLabelServer } from '@matter/main/behaviors/fixed-label';
70
+ import { FormaldehydeConcentrationMeasurementServer } from '@matter/main/behaviors/formaldehyde-concentration-measurement';
71
+ import { ModeSelectServer } from '@matter/main/behaviors/mode-select';
72
+ import { NitrogenDioxideConcentrationMeasurementServer } from '@matter/main/behaviors/nitrogen-dioxide-concentration-measurement';
73
+ import { OzoneConcentrationMeasurementServer } from '@matter/main/behaviors/ozone-concentration-measurement';
74
+ import { Pm10ConcentrationMeasurementServer } from '@matter/main/behaviors/pm10-concentration-measurement';
75
+ import { Pm1ConcentrationMeasurementServer } from '@matter/main/behaviors/pm1-concentration-measurement';
76
+ import { Pm25ConcentrationMeasurementServer } from '@matter/main/behaviors/pm25-concentration-measurement';
77
+ import { PowerSourceServer } from '@matter/main/behaviors/power-source';
78
+ import { PowerTopologyServer } from '@matter/main/behaviors/power-topology';
79
+ import { RadonConcentrationMeasurementServer } from '@matter/main/behaviors/radon-concentration-measurement';
80
+ import { SmokeCoAlarmServer } from '@matter/main/behaviors/smoke-co-alarm';
81
+ import { SwitchServer } from '@matter/main/behaviors/switch';
82
+ import { TotalVolatileOrganicCompoundsConcentrationMeasurementServer } from '@matter/main/behaviors/total-volatile-organic-compounds-concentration-measurement';
83
+ import { UserLabelServer } from '@matter/main/behaviors/user-label';
23
84
  import { ClusterServer, GroupsClusterHandler } from '@project-chip/matter.js/cluster';
24
85
  export class MatterbridgeEndpoint extends Endpoint {
25
86
  static bridgeMode = '';
@@ -418,12 +479,12 @@ export class MatterbridgeEndpoint extends Endpoint {
418
479
  return clusterServer;
419
480
  }
420
481
  }
421
- getAllClusterServers() {
422
- return [...this.clusterServers.values()];
423
- }
424
482
  getClusterServerById(clusterId) {
425
483
  return this.clusterServers.get(clusterId);
426
484
  }
485
+ getAllClusterServers() {
486
+ return [...this.clusterServers.values()];
487
+ }
427
488
  addTagList(endpoint, mfgCode, namespaceId, tag, label) {
428
489
  }
429
490
  addClusterServer(cluster) {
@@ -1514,11 +1575,6 @@ export class MatterbridgeEndpoint extends Endpoint {
1514
1575
  createDefaultPowerSourceWiredClusterServer(wiredCurrentType = PowerSource.WiredCurrentType.Ac) {
1515
1576
  this.addClusterServer(this.getDefaultPowerSourceWiredClusterServer(wiredCurrentType));
1516
1577
  }
1517
- createDefaultPowerSourceConfigurationClusterServer(endpointNumber) {
1518
- this.addClusterServer(ClusterServer(PowerSourceConfigurationCluster, {
1519
- sources: endpointNumber ? [EndpointNumber(endpointNumber)] : [],
1520
- }, {}, {}));
1521
- }
1522
1578
  getDefaultAirQualityClusterServer(airQuality = AirQuality.AirQualityEnum.Unknown) {
1523
1579
  return ClusterServer(AirQualityCluster.with(AirQuality.Feature.Fair, AirQuality.Feature.Moderate, AirQuality.Feature.VeryPoor, AirQuality.Feature.ExtremelyPoor), {
1524
1580
  airQuality,
@@ -0,0 +1,104 @@
1
+ import { Endpoint, MutableEndpoint, SupportedBehaviors } from '@matter/main';
2
+ import { Descriptor } from '@matter/main/clusters/descriptor';
3
+ import { Identify } from '@matter/main/clusters/identify';
4
+ import { OnOff } from '@matter/main/clusters/on-off';
5
+ import { LevelControl } from '@matter/main/clusters/level-control';
6
+ import { DescriptorServer } from '@matter/node/behaviors/descriptor';
7
+ import { IdentifyServer } from '@matter/node/behaviors/identify';
8
+ import { GroupsServer } from '@matter/node/behaviors/groups';
9
+ import { ScenesManagementServer } from '@matter/node/behaviors/scenes-management';
10
+ import { OnOffServer } from '@matter/main/behaviors/on-off';
11
+ import { LevelControlServer } from '@matter/main/behaviors/level-control';
12
+ class MatterbridgeEndpoint extends Endpoint {
13
+ constructor(definition, options = {}, debug = false) {
14
+ let deviceTypeList = [];
15
+ let firstDefinition;
16
+ if (Array.isArray(definition)) {
17
+ firstDefinition = definition[0];
18
+ deviceTypeList = Array.from(definition.values()).map((dt) => ({
19
+ deviceType: dt.code,
20
+ revision: dt.revision,
21
+ }));
22
+ }
23
+ else {
24
+ firstDefinition = definition;
25
+ deviceTypeList = [{ deviceType: firstDefinition.code, revision: firstDefinition.revision }];
26
+ }
27
+ const deviceTypeDefinitionV8 = {
28
+ name: firstDefinition.name.replace('-', '_'),
29
+ deviceType: firstDefinition.code,
30
+ deviceRevision: firstDefinition.revision,
31
+ deviceClass: firstDefinition.deviceClass.toLowerCase(),
32
+ requirements: {
33
+ server: {
34
+ mandatory: {},
35
+ optional: {},
36
+ },
37
+ client: {
38
+ mandatory: {},
39
+ optional: {},
40
+ },
41
+ },
42
+ behaviors: options.tagList ? SupportedBehaviors(DescriptorServer.with(Descriptor.Feature.TagList)) : {},
43
+ };
44
+ const endpointV8 = MutableEndpoint(deviceTypeDefinitionV8);
45
+ const optionsV8 = {
46
+ id: options.uniqueStorageKey?.replace(/[ .]/g, ''),
47
+ number: options.endpointId,
48
+ descriptor: options.tagList ? { tagList: options.tagList, deviceTypeList } : { deviceTypeList },
49
+ };
50
+ super(endpointV8, optionsV8);
51
+ }
52
+ createDefaultIdentifyClusterServer(identifyTime = 0, identifyType = Identify.IdentifyType.None) {
53
+ this.behaviors.require(IdentifyServer, {
54
+ identifyTime,
55
+ identifyType,
56
+ });
57
+ return this;
58
+ }
59
+ createDefaultGroupsClusterServer() {
60
+ this.behaviors.require(GroupsServer);
61
+ return this;
62
+ }
63
+ createDefaultScenesClusterServer() {
64
+ this.behaviors.require(ScenesManagementServer);
65
+ return this;
66
+ }
67
+ createDefaultOnOffClusterServer(onOff = false, globalSceneControl = false, onTime = 0, offWaitTime = 0, startUpOnOff = null) {
68
+ this.behaviors.require(OnOffServer.with(OnOff.Feature.Lighting), {
69
+ onOff,
70
+ globalSceneControl,
71
+ onTime,
72
+ offWaitTime,
73
+ startUpOnOff,
74
+ });
75
+ return this;
76
+ }
77
+ createOnOffClusterServer(onOff = false) {
78
+ this.behaviors.require(OnOffServer, {
79
+ onOff,
80
+ });
81
+ return this;
82
+ }
83
+ createDeadFrontOnOffClusterServer(onOff = false) {
84
+ this.behaviors.require(OnOffServer.with(OnOff.Feature.DeadFrontBehavior), {
85
+ onOff,
86
+ });
87
+ return this;
88
+ }
89
+ createDefaultLevelControlClusterServer(currentLevel = 254, minLevel = 1, maxLevel = 254, onLevel = null, startUpCurrentLevel = null) {
90
+ this.behaviors.require(LevelControlServer.with(LevelControl.Feature.OnOff, LevelControl.Feature.Lighting), {
91
+ currentLevel,
92
+ minLevel,
93
+ maxLevel,
94
+ onLevel,
95
+ remainingTime: 0,
96
+ startUpCurrentLevel,
97
+ options: {
98
+ executeIfOff: false,
99
+ coupleColorTempToLevel: false,
100
+ },
101
+ });
102
+ return this;
103
+ }
104
+ }
@@ -1,7 +1,6 @@
1
- import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
2
1
  import { isValidArray, isValidObject, isValidString } from './utils/utils.js';
3
- import { CYAN, db, nf, wr } from 'node-ansi-logger';
4
- import { NodeStorageManager } from 'node-persist-manager';
2
+ import { CYAN, db, nf, wr } from './logger/export.js';
3
+ import { NodeStorageManager } from './storage/export.js';
5
4
  import path from 'path';
6
5
  export class MatterbridgePlatform {
7
6
  matterbridge;
@@ -175,7 +174,4 @@ export class MatterbridgePlatform {
175
174
  this.log.debug('Endpoint numbers check completed.');
176
175
  return endpointMap.size;
177
176
  }
178
- async _createMutableDevice(definition, options = {}, debug = false) {
179
- return new MatterbridgeEndpoint(definition, options, debug);
180
- }
181
177
  }
@@ -1,4 +1,4 @@
1
- import { AnsiLogger, BLUE, db, er, nf, nt, rs, UNDERLINE, UNDERLINEOFF, wr } from 'node-ansi-logger';
1
+ import { AnsiLogger, BLUE, db, er, nf, nt, rs, UNDERLINE, UNDERLINEOFF, wr } from './logger/export.js';
2
2
  import path from 'path';
3
3
  import { promises as fs } from 'fs';
4
4
  import { pathToFileURL } from 'url';
@@ -650,7 +650,7 @@ export class PluginManager {
650
650
  }
651
651
  }
652
652
  async loadSchema(plugin) {
653
- let schemaFile = plugin.path.replace('package.json', `${plugin.name}.schema.json`);
653
+ const schemaFile = plugin.path.replace('package.json', `${plugin.name}.schema.json`);
654
654
  try {
655
655
  await fs.access(schemaFile);
656
656
  const data = await fs.readFile(schemaFile, 'utf8');
@@ -658,18 +658,10 @@ export class PluginManager {
658
658
  schema.title = plugin.description;
659
659
  schema.description = plugin.name + ' v. ' + plugin.version + ' by ' + plugin.author;
660
660
  this.log.debug(`Loaded schema file ${schemaFile} for plugin ${plg}${plugin.name}${db}.`);
661
- schemaFile = path.join(this.matterbridge.matterbridgeDirectory, `${plugin.name}.schema.json`);
662
- try {
663
- await fs.unlink(schemaFile);
664
- this.log.debug(`Schema file ${schemaFile} deleted.`);
665
- }
666
- catch (err) {
667
- this.log.debug(`Schema file ${schemaFile} to delete not found.`);
668
- }
669
661
  return schema;
670
662
  }
671
- catch (err) {
672
- this.log.debug(`Schema file ${schemaFile} for plugin ${plg}${plugin.name}${db} not found. Loading default schema.`);
663
+ catch (error) {
664
+ this.log.debug(`Schema file ${schemaFile} for plugin ${plg}${plugin.name}${db} not found. Loading default schema. Error: ${error instanceof Error ? error.message : error}`);
673
665
  return this.getDefaultSchema(plugin);
674
666
  }
675
667
  }
@@ -1,16 +1,15 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "2.0.0-edge.3",
3
+ "version": "2.0.0-edge.5",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge",
9
- "version": "2.0.0-edge.3",
9
+ "version": "2.0.0-edge.5",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@matter/main": "0.11.9",
13
- "@matter/nodejs": "0.11.9",
14
13
  "@project-chip/matter.js": "0.11.9",
15
14
  "archiver": "7.0.1",
16
15
  "express": "4.21.2",
@@ -102,6 +101,7 @@
102
101
  "resolved": "https://registry.npmjs.org/@matter/nodejs/-/nodejs-0.11.9.tgz",
103
102
  "integrity": "sha512-NJR2lKElalnjljl+KXgmXcLrdoaK4MH/BA57RYJ2KC3e5ZD+oxhFXfIxCUm37p7anlvv6GcK9ELkJyNaB0zg8A==",
104
103
  "license": "Apache-2.0",
104
+ "optional": true,
105
105
  "dependencies": {
106
106
  "@matter/general": "0.11.9",
107
107
  "@matter/node": "0.11.9",
@@ -137,12 +137,12 @@
137
137
  }
138
138
  },
139
139
  "node_modules/@noble/curves": {
140
- "version": "1.8.0",
141
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.0.tgz",
142
- "integrity": "sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==",
140
+ "version": "1.8.1",
141
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz",
142
+ "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==",
143
143
  "license": "MIT",
144
144
  "dependencies": {
145
- "@noble/hashes": "1.7.0"
145
+ "@noble/hashes": "1.7.1"
146
146
  },
147
147
  "engines": {
148
148
  "node": "^14.21.3 || >=16"
@@ -152,9 +152,9 @@
152
152
  }
153
153
  },
154
154
  "node_modules/@noble/hashes": {
155
- "version": "1.7.0",
156
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.0.tgz",
157
- "integrity": "sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==",
155
+ "version": "1.7.1",
156
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz",
157
+ "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==",
158
158
  "license": "MIT",
159
159
  "engines": {
160
160
  "node": "^14.21.3 || >=16"
@@ -1083,6 +1083,7 @@
1083
1083
  "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1084
1084
  "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
1085
1085
  "license": "MIT",
1086
+ "optional": true,
1086
1087
  "engines": {
1087
1088
  "node": ">=0.8.19"
1088
1089
  }
@@ -1309,6 +1310,7 @@
1309
1310
  "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-3.0.5.tgz",
1310
1311
  "integrity": "sha512-GCwtK33iwVXboZWYcqQHu3aRvXEBwmPkAMRBLeaX86ufhqslyUkLGsi4aW3INEfdQYpUB5M9qtYf3eHvAk2VBg==",
1311
1312
  "license": "MIT",
1313
+ "optional": true,
1312
1314
  "dependencies": {
1313
1315
  "write-file-atomic": "^5.0.1"
1314
1316
  },
@@ -1321,6 +1323,7 @@
1321
1323
  "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
1322
1324
  "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
1323
1325
  "license": "ISC",
1326
+ "optional": true,
1324
1327
  "dependencies": {
1325
1328
  "imurmurhash": "^0.1.4",
1326
1329
  "signal-exit": "^4.0.1"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "2.0.0-edge.3",
3
+ "version": "2.0.0-edge.5",
4
4
  "description": "Matterbridge plugin manager for Matter",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",
@@ -75,7 +75,6 @@
75
75
  },
76
76
  "dependencies": {
77
77
  "@matter/main": "0.11.9",
78
- "@matter/nodejs": "0.11.9",
79
78
  "@project-chip/matter.js": "0.11.9",
80
79
  "archiver": "7.0.1",
81
80
  "express": "4.21.2",