matterbridge 3.0.5-dev-20250607-353b662 → 3.0.5-dev-20250609-a5046db

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
@@ -12,7 +12,7 @@ If you like this project and find it useful, please consider giving it a star on
12
12
 
13
13
  ### Added
14
14
 
15
- - [cli]: Added takeHeapSnapshot() and triggerGarbageCollection().
15
+ - [cli]: Added takeHeapSnapshot() and triggerGarbageCollection() for internal testing.
16
16
  - [LaundryWasher]: Added Evse class and Jest test. Thanks Ludovic BOUÉ.
17
17
  - [LaundryWasher]: Added LaundryWasher class and Jest test.
18
18
  - [WaterHeater]: Added WaterHeater class and Jest test. Thanks Ludovic BOUÉ.
package/dist/cli.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { Matterbridge } from './matterbridge.js';
3
3
  import { getIntParameter, hasParameter } from './utils/export.js';
4
4
  import { AnsiLogger, BRIGHT, CYAN, db, YELLOW } from './logger/export.js';
5
+ import os from 'node:os';
5
6
  import { EventEmitter } from 'node:events';
6
7
  import { inspect } from 'node:util';
7
8
  export const cliEmitter = new EventEmitter();
@@ -41,7 +42,6 @@ const formatOsUpTime = (seconds) => {
41
42
  return `${seconds} second${seconds !== 1 ? 's' : ''}`;
42
43
  };
43
44
  async function startCpuMemoryCheck() {
44
- const os = await import('node:os');
45
45
  log.debug(`Cpu memory check started`);
46
46
  prevCpus = os.cpus();
47
47
  clearInterval(memoryCheckInterval);
@@ -92,7 +92,8 @@ async function startCpuMemoryCheck() {
92
92
  log.debug(`***${YELLOW}${BRIGHT}Cpu usage:${db} ${CYAN}${cpuUsageLog.padStart(6, ' ')} %${db} ${YELLOW}${BRIGHT}Memory usage:${db} rss ${CYAN}${rss}${db} heapTotal ${CYAN}${heapTotal}${db} heapUsed ${CYAN}${heapUsed}${db} external ${external} arrayBuffers ${arrayBuffers}`);
93
93
  };
94
94
  interval();
95
- memoryCheckInterval = setInterval(interval, getIntParameter('memoryinterval') ?? 10 * 1000);
95
+ clearInterval(memoryCheckInterval);
96
+ memoryCheckInterval = setInterval(interval, getIntParameter('memoryinterval') ?? 10 * 1000).unref();
96
97
  }
97
98
  async function stopCpuMemoryCheck() {
98
99
  log.debug(`***Cpu memory check stopped. Peak cpu: ${CYAN}${peakCpu.toFixed(2)} %${db}. Peak rss: ${CYAN}${formatMemoryUsage(peakRss)}${db}.`);
@@ -113,9 +114,11 @@ async function startInspector() {
113
114
  const interval = getIntParameter('snapshotinterval');
114
115
  if (interval && interval >= 30000) {
115
116
  log.debug(`***Started heap snapshot interval of ${CYAN}${interval}${db} ms`);
117
+ clearInterval(snapshotInterval);
116
118
  snapshotInterval = setInterval(async () => {
119
+ log.debug(`Run heap snapshot interval`);
117
120
  await takeHeapSnapshot();
118
- }, interval);
121
+ }, interval).unref();
119
122
  }
120
123
  }
121
124
  catch (err) {
@@ -164,6 +167,7 @@ async function takeHeapSnapshot() {
164
167
  log.error('No active inspector session.');
165
168
  return;
166
169
  }
170
+ log.debug(`Taking heap snapshot...`);
167
171
  const chunks = [];
168
172
  const chunksListener = (notification) => {
169
173
  chunks.push(Buffer.from(notification.params.chunk));
@@ -207,6 +211,14 @@ function registerHandlers() {
207
211
  instance.on('startmemorycheck', async () => start());
208
212
  if (instance)
209
213
  instance.on('stopmemorycheck', async () => stop());
214
+ if (instance)
215
+ instance.on('startinspector', async () => startInspector());
216
+ if (instance)
217
+ instance.on('stopinspector', async () => stopInspector());
218
+ if (instance)
219
+ instance.on('takeheapsnapshot', async () => takeHeapSnapshot());
220
+ if (instance)
221
+ instance.on('triggergarbagecollection', async () => triggerGarbageCollection());
210
222
  log.debug('Registered event handlers');
211
223
  }
212
224
  async function shutdown() {
@@ -214,6 +226,7 @@ async function shutdown() {
214
226
  if (hasParameter('inspect'))
215
227
  await stopInspector();
216
228
  await stopCpuMemoryCheck();
229
+ cliEmitter.emit('shutdown');
217
230
  process.exit(0);
218
231
  }
219
232
  async function restart() {
@@ -247,6 +260,7 @@ async function main() {
247
260
  }
248
261
  else {
249
262
  registerHandlers();
263
+ cliEmitter.emit('ready');
250
264
  }
251
265
  }
252
266
  process.title = 'matterbridge';
package/dist/evse.js CHANGED
@@ -6,7 +6,7 @@ import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
6
6
  import { MatterbridgeServer } from './matterbridgeBehaviors.js';
7
7
  import { deviceEnergyManagement, electricalSensor, evse, powerSource } from './matterbridgeDeviceTypes.js';
8
8
  export class Evse extends MatterbridgeEndpoint {
9
- constructor(name, serial, state, supplyState, faultState) {
9
+ constructor(name, serial, currentMode, supportedModes, state, supplyState, faultState) {
10
10
  super([evse, powerSource, electricalSensor, deviceEnergyManagement], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
11
11
  this.createDefaultIdentifyClusterServer()
12
12
  .createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge EVSE')
@@ -16,7 +16,7 @@ export class Evse extends MatterbridgeEndpoint {
16
16
  .createDefaultElectricalEnergyMeasurementClusterServer()
17
17
  .createDefaultDeviceEnergyManagementCluster()
18
18
  .createDefaultEnergyEvseClusterServer(state, supplyState, faultState)
19
- .createDefaultEnergyEvseModeClusterServer()
19
+ .createDefaultEnergyEvseModeClusterServer(currentMode, supportedModes)
20
20
  .addRequiredClusterServers();
21
21
  }
22
22
  createDefaultEnergyEvseClusterServer(state, supplyState, faultState) {
@@ -37,20 +37,10 @@ export class Evse extends MatterbridgeEndpoint {
37
37
  createDefaultEnergyEvseModeClusterServer(currentMode, supportedModes) {
38
38
  this.behaviors.require(MatterbridgeEnergyEvseModeServer, {
39
39
  supportedModes: supportedModes ?? [
40
- { label: 'Auto', mode: 1, modeTags: [{ value: EnergyEvseMode.ModeTag.Auto }] },
41
- { label: 'Quick', mode: 2, modeTags: [{ value: EnergyEvseMode.ModeTag.Quick }] },
42
- { label: 'Quiet', mode: 3, modeTags: [{ value: EnergyEvseMode.ModeTag.Quiet }] },
43
- { label: 'LowNoise', mode: 4, modeTags: [{ value: EnergyEvseMode.ModeTag.LowNoise }] },
44
- { label: 'LowEnergy', mode: 5, modeTags: [{ value: EnergyEvseMode.ModeTag.LowEnergy }] },
45
- { label: 'Vacation', mode: 6, modeTags: [{ value: EnergyEvseMode.ModeTag.Vacation }] },
46
- { label: 'Min', mode: 7, modeTags: [{ value: EnergyEvseMode.ModeTag.Min }] },
47
- { label: 'Max', mode: 8, modeTags: [{ value: EnergyEvseMode.ModeTag.Max }] },
48
- { label: 'Night', mode: 9, modeTags: [{ value: EnergyEvseMode.ModeTag.Night }] },
49
- { label: 'Day', mode: 10, modeTags: [{ value: EnergyEvseMode.ModeTag.Day }] },
50
- { label: 'Manual', mode: 11, modeTags: [{ value: EnergyEvseMode.ModeTag.Manual }] },
51
- { label: 'TimeOfUse', mode: 12, modeTags: [{ value: EnergyEvseMode.ModeTag.TimeOfUse }] },
52
- { label: 'SolarCharging', mode: 13, modeTags: [{ value: EnergyEvseMode.ModeTag.SolarCharging }] },
53
- { label: 'V2X', mode: 14, modeTags: [{ value: EnergyEvseMode.ModeTag.V2X }] },
40
+ { label: 'Manual', mode: 1, modeTags: [{ value: EnergyEvseMode.ModeTag.Manual }] },
41
+ { label: 'TimeOfUse', mode: 2, modeTags: [{ value: EnergyEvseMode.ModeTag.TimeOfUse }] },
42
+ { label: 'SolarCharging', mode: 3, modeTags: [{ value: EnergyEvseMode.ModeTag.SolarCharging }] },
43
+ { label: 'Home-to-vehicle and Vehicle-to-home', mode: 4, modeTags: [{ value: EnergyEvseMode.ModeTag.V2X }] },
54
44
  ],
55
45
  currentMode: currentMode ?? 1,
56
46
  });
@@ -62,11 +52,23 @@ export class MatterbridgeEnergyEvseServer extends EnergyEvseServer {
62
52
  const device = this.endpoint.stateOf(MatterbridgeServer).deviceCommand;
63
53
  device.disable();
64
54
  device.log.info(`MatterbridgeEnergyEvseServer disable called`);
55
+ this.state.supplyState = EnergyEvse.SupplyState.Disabled;
56
+ if (this.state.state === EnergyEvse.State.PluggedInCharging) {
57
+ this.state.state = EnergyEvse.State.PluggedInDemand;
58
+ }
59
+ this.state.chargingEnabledUntil = 0;
65
60
  }
66
- enableCharging() {
61
+ enableCharging({ chargingEnabledUntil, minimumChargeCurrent, maximumChargeCurrent }) {
67
62
  const device = this.endpoint.stateOf(MatterbridgeServer).deviceCommand;
68
63
  device.enableCharging();
69
64
  device.log.info(`MatterbridgeEnergyEvseServer enableCharging called`);
65
+ this.state.supplyState = EnergyEvse.SupplyState.ChargingEnabled;
66
+ if (this.state.state === EnergyEvse.State.PluggedInDemand) {
67
+ this.state.state = EnergyEvse.State.PluggedInCharging;
68
+ }
69
+ this.state.chargingEnabledUntil = chargingEnabledUntil;
70
+ this.state.minimumChargeCurrent = minimumChargeCurrent;
71
+ this.state.maximumChargeCurrent = maximumChargeCurrent;
70
72
  }
71
73
  }
72
74
  export class MatterbridgeEnergyEvseModeServer extends EnergyEvseModeServer {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.0.5-dev-20250607-353b662",
3
+ "version": "3.0.5-dev-20250609-a5046db",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge",
9
- "version": "3.0.5-dev-20250607-353b662",
9
+ "version": "3.0.5-dev-20250609-a5046db",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@matter/main": "0.14.0",
@@ -130,9 +130,9 @@
130
130
  }
131
131
  },
132
132
  "node_modules/@noble/curves": {
133
- "version": "1.9.1",
134
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz",
135
- "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==",
133
+ "version": "1.9.2",
134
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz",
135
+ "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==",
136
136
  "license": "MIT",
137
137
  "dependencies": {
138
138
  "@noble/hashes": "1.8.0"
@@ -1021,6 +1021,15 @@
1021
1021
  "node": ">= 0.8"
1022
1022
  }
1023
1023
  },
1024
+ "node_modules/http-errors/node_modules/statuses": {
1025
+ "version": "2.0.1",
1026
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1027
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1028
+ "license": "MIT",
1029
+ "engines": {
1030
+ "node": ">= 0.8"
1031
+ }
1032
+ },
1024
1033
  "node_modules/iconv-lite": {
1025
1034
  "version": "0.6.3",
1026
1035
  "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@@ -1796,9 +1805,9 @@
1796
1805
  }
1797
1806
  },
1798
1807
  "node_modules/statuses": {
1799
- "version": "2.0.1",
1800
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1801
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1808
+ "version": "2.0.2",
1809
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
1810
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1802
1811
  "license": "MIT",
1803
1812
  "engines": {
1804
1813
  "node": ">= 0.8"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.0.5-dev-20250607-353b662",
3
+ "version": "3.0.5-dev-20250609-a5046db",
4
4
  "description": "Matterbridge plugin manager for Matter",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",