matterbridge 2.1.1-dev.2 → 2.1.2-dev.2

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
@@ -31,11 +31,27 @@ matterbridge-zigbee2mqtt v. 2.4.4
31
31
  matterbridge-somfy-tahoma v. 1.2.3
32
32
  matterbridge-hass v. 0.0.8
33
33
 
34
- ## [2.1.1-dev.2] - 2025-02-02
34
+ ## [2.1.2] - 2025-02-03
35
+
36
+ ### Added
37
+
38
+ - [frotnend]: Add rss and heap to SystemInformation.
39
+ - [memorydump]: Add cpu to memoryDump.
40
+
41
+ ### Fixed
42
+
43
+ - [frontend]: Fixed update matterbridge.
44
+
45
+ <a href="https://www.buymeacoffee.com/luligugithub">
46
+ <img src="./yellow-button.png" alt="Buy me a coffee" width="120">
47
+ </a>
48
+
49
+ ## [2.1.1] - 2025-02-02
35
50
 
36
51
  ### Fixed
37
52
 
38
- - [matter.js]: Fix
53
+ - [matter.js]: Fix close server nodes.
54
+
39
55
  <a href="https://www.buymeacoffee.com/luligugithub">
40
56
  <img src="./yellow-button.png" alt="Buy me a coffee" width="120">
41
57
  </a>
@@ -48,6 +48,8 @@ export class DeviceManager {
48
48
  return this._devices.values();
49
49
  }
50
50
  async forEach(callback) {
51
+ if (this.size === 0)
52
+ return;
51
53
  const tasks = Array.from(this._devices.values()).map(async (device) => {
52
54
  try {
53
55
  await callback(device);
@@ -58,9 +60,6 @@ export class DeviceManager {
58
60
  });
59
61
  await Promise.all(tasks);
60
62
  }
61
- get logLevel() {
62
- return this.log.logLevel;
63
- }
64
63
  set logLevel(logLevel) {
65
64
  this.log.logLevel = logLevel;
66
65
  }
package/dist/frontend.js CHANGED
@@ -22,6 +22,7 @@ export class Frontend {
22
22
  httpServer;
23
23
  httpsServer;
24
24
  webSocketServer;
25
+ prevCpus = os.cpus();
25
26
  memoryData = [];
26
27
  memoryInterval;
27
28
  memoryTimeout;
@@ -162,7 +163,7 @@ export class Frontend {
162
163
  this.log.error(`WebSocketServer error: ${error}`);
163
164
  });
164
165
  if (hasParameter('memorydump')) {
165
- this.startMemoryDump();
166
+ this.startCpuMemoryDump();
166
167
  }
167
168
  this.expressApp.post('/api/login', express.json(), async (req, res) => {
168
169
  const { password } = req.body;
@@ -630,14 +631,6 @@ export class Frontend {
630
631
  return;
631
632
  }
632
633
  if (command === 'update') {
633
- this.log.info('Updating matterbridge...');
634
- try {
635
- await this.matterbridge.spawnCommand('npm', ['install', '-g', 'matterbridge', '--omit=dev', '--verbose']);
636
- this.log.info('Matterbridge has been updated. Full restart required.');
637
- }
638
- catch (error) {
639
- this.log.error('Error updating matterbridge');
640
- }
641
634
  await this.matterbridge.updateProcess();
642
635
  this.wssSendRestartRequired();
643
636
  res.json({ message: 'Command received' });
@@ -786,7 +779,7 @@ export class Frontend {
786
779
  this.webSocketServer = undefined;
787
780
  }
788
781
  if (hasParameter('memorydump')) {
789
- this.stopMemoryDump();
782
+ this.stopCpuMemoryDump();
790
783
  }
791
784
  }
792
785
  formatMemoryUsage = (bytes) => {
@@ -794,12 +787,26 @@ export class Frontend {
794
787
  const mb = kb / 1024;
795
788
  return mb >= 1 ? `${mb.toFixed(2)} MB` : `${kb.toFixed(2)} KB`;
796
789
  };
797
- startMemoryDump() {
790
+ startCpuMemoryDump() {
798
791
  clearInterval(this.memoryInterval);
799
792
  clearTimeout(this.memoryTimeout);
800
793
  const interval = () => {
794
+ const currCpus = os.cpus();
795
+ if (currCpus.length !== this.prevCpus.length) {
796
+ this.prevCpus = currCpus;
797
+ }
798
+ let totalIdle = 0, totalTick = 0;
799
+ this.prevCpus.forEach((prevCpu, i) => {
800
+ const currCpu = currCpus[i];
801
+ const idleDiff = currCpu.times.idle - prevCpu.times.idle;
802
+ const totalDiff = Object.keys(currCpu.times).reduce((acc, key) => acc + (currCpu.times[key] - prevCpu.times[key]), 0);
803
+ totalIdle += idleDiff;
804
+ totalTick += totalDiff;
805
+ });
806
+ const cpuUsage = (100 - (totalIdle / totalTick) * 100).toFixed(2);
807
+ this.prevCpus = currCpus;
801
808
  const memoryUsageRaw = process.memoryUsage();
802
- this.memoryData.push(memoryUsageRaw);
809
+ this.memoryData.push({ ...memoryUsageRaw, cpu: cpuUsage });
803
810
  const memoryUsage = {
804
811
  rss: this.formatMemoryUsage(memoryUsageRaw.rss),
805
812
  heapTotal: this.formatMemoryUsage(memoryUsageRaw.heapTotal),
@@ -807,17 +814,17 @@ export class Frontend {
807
814
  external: this.formatMemoryUsage(memoryUsageRaw.external),
808
815
  arrayBuffers: this.formatMemoryUsage(memoryUsageRaw.arrayBuffers),
809
816
  };
810
- this.log.debug(`***Memory usage rss ${CYAN}${memoryUsage.rss}${db} heapTotal ${CYAN}${memoryUsage.heapTotal}${db} heapUsed ${CYAN}${memoryUsage.heapUsed}${db} external ${memoryUsage.external} arrayBuffers ${memoryUsage.arrayBuffers}`);
817
+ this.log.debug(`***Cpu usage ${CYAN}${cpuUsage.padStart(6, ' ')} %${db} - Memory usage rss ${CYAN}${memoryUsage.rss}${db} heapTotal ${CYAN}${memoryUsage.heapTotal}${db} heapUsed ${CYAN}${memoryUsage.heapUsed}${db} external ${memoryUsage.external} arrayBuffers ${memoryUsage.arrayBuffers}`);
811
818
  };
812
819
  interval();
813
820
  this.memoryInterval = setInterval(interval, getIntParameter('memorydump') ?? 1000);
814
821
  this.memoryInterval.unref();
815
822
  this.memoryTimeout = setTimeout(() => {
816
- this.stopMemoryDump();
823
+ this.stopCpuMemoryDump();
817
824
  }, 360000);
818
825
  this.memoryTimeout.unref();
819
826
  }
820
- stopMemoryDump() {
827
+ stopCpuMemoryDump() {
821
828
  clearInterval(this.memoryInterval);
822
829
  this.memoryInterval = undefined;
823
830
  clearTimeout(this.memoryTimeout);
@@ -830,10 +837,14 @@ export class Frontend {
830
837
  external: this.formatMemoryUsage(memory.external),
831
838
  arrayBuffers: this.formatMemoryUsage(memory.arrayBuffers),
832
839
  };
833
- console.log(`${YELLOW}Memory usage${db} rss ${CYAN}${memoryUsage.rss}${db} heapTotal ${CYAN}${memoryUsage.heapTotal}${db} heapUsed ${CYAN}${memoryUsage.heapUsed}${db} external ${memoryUsage.external} arrayBuffers ${memoryUsage.arrayBuffers}${rs}`);
840
+ console.log(`${YELLOW}Cpu usage${db} ${CYAN}${memory.cpu.padStart(6, ' ')} %${db} - ${YELLOW}Memory usage${db} rss ${CYAN}${memoryUsage.rss}${db} heapTotal ${CYAN}${memoryUsage.heapTotal}${db} heapUsed ${CYAN}${memoryUsage.heapUsed}${db} external ${memoryUsage.external} arrayBuffers ${memoryUsage.arrayBuffers}${rs}`);
834
841
  }
842
+ this.memoryData = [];
843
+ this.prevCpus = [];
835
844
  }
836
845
  async getApiSettings() {
846
+ this.matterbridge.systemInformation.rss = this.formatMemoryUsage(process.memoryUsage().rss);
847
+ this.matterbridge.systemInformation.heap = this.formatMemoryUsage(process.memoryUsage().heapUsed) + ' / ' + this.formatMemoryUsage(process.memoryUsage().heapTotal);
837
848
  this.matterbridge.matterbridgeInformation.bridgeMode = this.matterbridge.bridgeMode;
838
849
  this.matterbridge.matterbridgeInformation.restartMode = this.matterbridge.restartMode;
839
850
  this.matterbridge.matterbridgeInformation.loggerLevel = this.matterbridge.log.logLevel;
@@ -1,3 +1,4 @@
1
1
  export * from '@matter/main';
2
2
  export { SemanticNamespace, ClosureTag, CompassDirectionTag, CompassLocationTag, DirectionTag, ElectricalMeasurementTag, LaundryTag, LevelTag, LocationTag, NumberTag, PositionTag, PowerSourceTag, RefrigeratorTag, RoomAirConditionerTag, SwitchesTag, } from '@matter/main';
3
3
  export { AttributeElement, ClusterElement, ClusterModel, CommandElement, EventElement, FieldElement } from '@matter/main/model';
4
+ export { logEndpoint, MdnsService } from '@matter/main/protocol';
@@ -35,6 +35,8 @@ export class Matterbridge extends EventEmitter {
35
35
  totalMemory: '',
36
36
  freeMemory: '',
37
37
  systemUptime: '',
38
+ rss: '',
39
+ heap: '',
38
40
  };
39
41
  matterbridgeInformation = {
40
42
  homeDirectory: '',
@@ -995,12 +997,11 @@ export class Matterbridge extends EventEmitter {
995
997
  }
996
998
  }
997
999
  this.frontend.stop();
998
- this.log.info(`Stopping matter server nodes in ${this.bridgeMode} mode...`);
1000
+ this.log.notice(`Stopping matter server nodes in ${this.bridgeMode} mode...`);
999
1001
  if (this.bridgeMode === 'bridge') {
1000
1002
  if (this.serverNode) {
1001
1003
  await this.stopServerNode(this.serverNode);
1002
1004
  this.serverNode = undefined;
1003
- this.log.info(`Stopped matter server node for Matterbridge`);
1004
1005
  }
1005
1006
  }
1006
1007
  if (this.bridgeMode === 'childbridge') {
@@ -1008,11 +1009,10 @@ export class Matterbridge extends EventEmitter {
1008
1009
  if (plugin.serverNode) {
1009
1010
  await this.stopServerNode(plugin.serverNode);
1010
1011
  plugin.serverNode = undefined;
1011
- this.log.info(`Stopped matter server node for ${plugin.name}`);
1012
1012
  }
1013
1013
  }
1014
1014
  }
1015
- this.log.info('Stopped matter server nodes');
1015
+ this.log.notice('Stopped matter server nodes');
1016
1016
  await this.stopMatterStorage();
1017
1017
  try {
1018
1018
  Logger.removeLogger('matterfilelogger');
@@ -83,10 +83,10 @@ export class MatterbridgePlatform {
83
83
  return false;
84
84
  return true;
85
85
  }
86
- validateDevice(device, log = true) {
87
- return this.validateDeviceWhiteBlackList(device, log);
88
- }
89
86
  validateDeviceWhiteBlackList(device, log = true) {
87
+ return this.validateDevice(device, log);
88
+ }
89
+ validateDevice(device, log = true) {
90
90
  if (!Array.isArray(device))
91
91
  device = [device];
92
92
  let blackListBlocked = 0;
@@ -115,10 +115,10 @@ export class MatterbridgePlatform {
115
115
  this.log.info(`Skipping device ${CYAN}${device.join(', ')}${nf} because not in whitelist`);
116
116
  return false;
117
117
  }
118
- validateEntity(device, entity, log = true) {
119
- return this.validateEntityBlackList(device, entity, log);
120
- }
121
118
  validateEntityBlackList(device, entity, log = true) {
119
+ return this.validateEntity(device, entity, log);
120
+ }
121
+ validateEntity(device, entity, log = true) {
122
122
  if (isValidArray(this.config.entityBlackList, 1) && this.config.entityBlackList.find((e) => e === entity)) {
123
123
  if (log)
124
124
  this.log.info(`Skipping entity ${CYAN}${entity}${nf} because in entityBlackList`);
@@ -42,6 +42,8 @@ export class PluginManager {
42
42
  return this._plugins.values();
43
43
  }
44
44
  async forEach(callback) {
45
+ if (this.size === 0)
46
+ return;
45
47
  const tasks = Array.from(this._plugins.values()).map(async (plugin) => {
46
48
  try {
47
49
  await callback(plugin);
@@ -52,9 +54,6 @@ export class PluginManager {
52
54
  });
53
55
  await Promise.all(tasks);
54
56
  }
55
- get logLevel() {
56
- return this.log.logLevel;
57
- }
58
57
  set logLevel(logLevel) {
59
58
  this.log.logLevel = logLevel;
60
59
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "2.1.1-dev.2",
3
+ "version": "2.1.2-dev.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge",
9
- "version": "2.1.1-dev.2",
9
+ "version": "2.1.2-dev.2",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@matter/main": "0.12.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "2.1.1-dev.2",
3
+ "version": "2.1.2-dev.2",
4
4
  "description": "Matterbridge plugin manager for Matter",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",