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 +1 -1
- package/dist/cli.js +17 -3
- package/dist/evse.js +19 -17
- package/npm-shrinkwrap.json +17 -8
- package/package.json +1 -1
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
|
|
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: '
|
|
41
|
-
{ label: '
|
|
42
|
-
{ label: '
|
|
43
|
-
{ label: '
|
|
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 {
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge",
|
|
3
|
-
"version": "3.0.5-dev-
|
|
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-
|
|
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.
|
|
134
|
-
"resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.
|
|
135
|
-
"integrity": "sha512-
|
|
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.
|
|
1800
|
-
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.
|
|
1801
|
-
"integrity": "sha512-
|
|
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