matterbridge 1.6.1 → 1.6.3-dev.1
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 +45 -1
- package/README-DEV.md +0 -4
- package/README-NGINX.md +63 -0
- package/README.md +7 -3
- package/dist/cli.js +15 -7
- package/dist/cli.js.map +1 -1
- package/dist/deviceManager.d.ts +1 -1
- package/dist/deviceManager.d.ts.map +1 -1
- package/dist/deviceManager.js +1 -1
- package/dist/deviceManager.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -10
- package/dist/index.js.map +1 -1
- package/dist/matter/export.d.ts +5 -0
- package/dist/matter/export.d.ts.map +1 -0
- package/dist/matter/export.js +5 -0
- package/dist/matter/export.js.map +1 -0
- package/dist/matterbridge.d.ts +12 -7
- package/dist/matterbridge.d.ts.map +1 -1
- package/dist/matterbridge.js +133 -83
- package/dist/matterbridge.js.map +1 -1
- package/dist/matterbridgeAccessoryPlatform.d.ts.map +1 -1
- package/dist/matterbridgeAccessoryPlatform.js.map +1 -1
- package/dist/matterbridgeBehaviors.d.ts +1123 -0
- package/dist/matterbridgeBehaviors.d.ts.map +1 -0
- package/dist/matterbridgeBehaviors.js +281 -0
- package/dist/matterbridgeBehaviors.js.map +1 -0
- package/dist/matterbridgeDevice.d.ts +2089 -1511
- package/dist/matterbridgeDevice.d.ts.map +1 -1
- package/dist/matterbridgeDevice.js +243 -209
- package/dist/matterbridgeDevice.js.map +1 -1
- package/dist/matterbridgeDeviceTypes.d.ts +65 -0
- package/dist/matterbridgeDeviceTypes.d.ts.map +1 -0
- package/dist/matterbridgeDeviceTypes.js +307 -0
- package/dist/matterbridgeDeviceTypes.js.map +1 -0
- package/dist/matterbridgeDynamicPlatform.d.ts.map +1 -1
- package/dist/matterbridgeDynamicPlatform.js.map +1 -1
- package/dist/matterbridgeEdge.d.ts +19 -20
- package/dist/matterbridgeEdge.d.ts.map +1 -1
- package/dist/matterbridgeEdge.js +505 -102
- package/dist/matterbridgeEdge.js.map +1 -1
- package/dist/matterbridgeEndpoint.d.ts +3554 -2297
- package/dist/matterbridgeEndpoint.d.ts.map +1 -1
- package/dist/matterbridgeEndpoint.js +709 -476
- package/dist/matterbridgeEndpoint.js.map +1 -1
- package/dist/matterbridgePlatform.d.ts +4 -3
- package/dist/matterbridgePlatform.d.ts.map +1 -1
- package/dist/matterbridgePlatform.js +10 -2
- package/dist/matterbridgePlatform.js.map +1 -1
- package/dist/matterbridgeTypes.d.ts +7 -8
- package/dist/matterbridgeTypes.d.ts.map +1 -1
- package/dist/matterbridgeTypes.js.map +1 -1
- package/dist/matterbridgeWebsocket.d.ts +1 -1
- package/dist/matterbridgeWebsocket.d.ts.map +1 -1
- package/dist/matterbridgeWebsocket.js +5 -3
- package/dist/matterbridgeWebsocket.js.map +1 -1
- package/dist/pluginManager.d.ts.map +1 -1
- package/dist/pluginManager.js +16 -7
- package/dist/pluginManager.js.map +1 -1
- package/dist/utils/colorUtils.js +1 -1
- package/dist/utils/colorUtils.js.map +1 -1
- package/dist/utils/utils.d.ts +21 -0
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +49 -3
- package/dist/utils/utils.js.map +1 -1
- package/frontend/build/asset-manifest.json +62 -6
- package/frontend/build/index.html +1 -1
- package/frontend/build/static/css/main.823e08b6.css +2 -0
- package/frontend/build/static/css/main.823e08b6.css.map +1 -0
- package/frontend/build/static/js/main.a14c87e7.js +115 -0
- package/frontend/build/static/js/{main.045d08f7.js.LICENSE.txt → main.a14c87e7.js.LICENSE.txt} +3 -3
- package/frontend/build/static/js/main.a14c87e7.js.map +1 -0
- package/frontend/build/static/media/roboto-cyrillic-300-normal.1b79538ccd585c259996.woff2 +0 -0
- package/frontend/build/static/media/roboto-cyrillic-300-normal.5f077fd7b977d1715acf.woff +0 -0
- package/frontend/build/static/media/roboto-cyrillic-400-normal.5d2930082227d172f62c.woff +0 -0
- package/frontend/build/static/media/roboto-cyrillic-400-normal.a9e19870cf6c4b973427.woff2 +0 -0
- package/frontend/build/static/media/roboto-cyrillic-500-normal.0ae2428323939af5e1ad.woff2 +0 -0
- package/frontend/build/static/media/roboto-cyrillic-500-normal.dd7bc8a52c6c70c5a3f5.woff +0 -0
- package/frontend/build/static/media/roboto-cyrillic-700-normal.3f6e1548bd5175a8c342.woff +0 -0
- package/frontend/build/static/media/roboto-cyrillic-700-normal.4fdfc29a10e7d4b7c527.woff2 +0 -0
- package/frontend/build/static/media/roboto-cyrillic-ext-300-normal.795dbc8140e3fef82983.woff +0 -0
- package/frontend/build/static/media/roboto-cyrillic-ext-300-normal.80947a31d23c70204b47.woff2 +0 -0
- package/frontend/build/static/media/roboto-cyrillic-ext-400-normal.135d076fa32aa0b4d105.woff +0 -0
- package/frontend/build/static/media/roboto-cyrillic-ext-400-normal.5cec61a21cc20180fbe1.woff2 +0 -0
- package/frontend/build/static/media/roboto-cyrillic-ext-500-normal.6de16332fda843a3dc3d.woff2 +0 -0
- package/frontend/build/static/media/roboto-cyrillic-ext-500-normal.c0a0638f90b31d6454ba.woff +0 -0
- package/frontend/build/static/media/roboto-cyrillic-ext-700-normal.4750292c47fa2bc6ac1a.woff2 +0 -0
- package/frontend/build/static/media/roboto-cyrillic-ext-700-normal.ca247189fc12d00de361.woff +0 -0
- package/frontend/build/static/media/roboto-greek-300-normal.285f3e6261d8eb20417d.woff2 +0 -0
- package/frontend/build/static/media/roboto-greek-300-normal.889beddda1c9bd9f97df.woff +0 -0
- package/frontend/build/static/media/roboto-greek-400-normal.160a791a8e4f46bca3cc.woff +0 -0
- package/frontend/build/static/media/roboto-greek-400-normal.2c32b1315be61477013a.woff2 +0 -0
- package/frontend/build/static/media/roboto-greek-500-normal.60810e07c7b0273013aa.woff +0 -0
- package/frontend/build/static/media/roboto-greek-500-normal.f95e757c5483310f9c11.woff2 +0 -0
- package/frontend/build/static/media/roboto-greek-700-normal.77dd370f2001e184ba0d.woff2 +0 -0
- package/frontend/build/static/media/roboto-greek-700-normal.df87b053fae3d7ad5f7a.woff +0 -0
- package/frontend/build/static/media/roboto-greek-ext-300-normal.b590dbe5c639944366d1.woff +0 -0
- package/frontend/build/static/media/roboto-greek-ext-300-normal.d6049cb54aa6fbe14c42.woff2 +0 -0
- package/frontend/build/static/media/roboto-greek-ext-400-normal.16eb83b4a3b1ea994243.woff +0 -0
- package/frontend/build/static/media/roboto-greek-ext-400-normal.1df4abad55796d11a0c8.woff2 +0 -0
- package/frontend/build/static/media/roboto-greek-ext-500-normal.4a96ba31abcce0f5d52b.woff2 +0 -0
- package/frontend/build/static/media/roboto-greek-ext-500-normal.fd28d9c008bf3af1bed7.woff +0 -0
- package/frontend/build/static/media/roboto-greek-ext-700-normal.2dd6febad11502dec6a6.woff2 +0 -0
- package/frontend/build/static/media/roboto-greek-ext-700-normal.4abdc9fff4507f17d726.woff +0 -0
- package/frontend/build/static/media/roboto-latin-300-normal.b850f1ff581ea232fac9.woff2 +0 -0
- package/frontend/build/static/media/roboto-latin-300-normal.c4bc0593c9954d79cb3a.woff +0 -0
- package/frontend/build/static/media/roboto-latin-400-normal.047a7839f69b209db815.woff +0 -0
- package/frontend/build/static/media/roboto-latin-400-normal.297d48e1b5a10c0831a9.woff2 +0 -0
- package/frontend/build/static/media/roboto-latin-500-normal.68d40d6d01c6f85d24ba.woff +0 -0
- package/frontend/build/static/media/roboto-latin-500-normal.7077203b1982951ecf76.woff2 +0 -0
- package/frontend/build/static/media/roboto-latin-700-normal.4535474e1cf8598695ad.woff2 +0 -0
- package/frontend/build/static/media/roboto-latin-700-normal.9f6a16a7770c87b2042b.woff +0 -0
- package/frontend/build/static/media/roboto-latin-ext-300-normal.14982a9e4857a93b6dce.woff +0 -0
- package/frontend/build/static/media/roboto-latin-ext-300-normal.97cbc447d4a8d41a9543.woff2 +0 -0
- package/frontend/build/static/media/roboto-latin-ext-400-normal.27da5b36b6d3a16f53f4.woff +0 -0
- package/frontend/build/static/media/roboto-latin-ext-400-normal.2eeae187764baf05867d.woff2 +0 -0
- package/frontend/build/static/media/roboto-latin-ext-500-normal.06c30711d588145a4541.woff +0 -0
- package/frontend/build/static/media/roboto-latin-ext-500-normal.9a18d7bb9ff7a6af7b32.woff2 +0 -0
- package/frontend/build/static/media/roboto-latin-ext-700-normal.18841836e391d39e83a8.woff2 +0 -0
- package/frontend/build/static/media/roboto-latin-ext-700-normal.3c5bcdd0e69c4c3ffafe.woff +0 -0
- package/frontend/build/static/media/roboto-vietnamese-300-normal.c96b16e5c05c7b7c3e89.woff2 +0 -0
- package/frontend/build/static/media/roboto-vietnamese-300-normal.f5e7cea32756dfe7af40.woff +0 -0
- package/frontend/build/static/media/roboto-vietnamese-400-normal.0dc97c66f9b542d6fa17.woff +0 -0
- package/frontend/build/static/media/roboto-vietnamese-400-normal.d3f8e26d6c27de8102b6.woff2 +0 -0
- package/frontend/build/static/media/roboto-vietnamese-500-normal.090fabef926bdc0e9b9f.woff2 +0 -0
- package/frontend/build/static/media/roboto-vietnamese-500-normal.23b7b8a2524d2d4b637b.woff +0 -0
- package/frontend/build/static/media/roboto-vietnamese-700-normal.0a79a9fabfc32e33f360.woff2 +0 -0
- package/frontend/build/static/media/roboto-vietnamese-700-normal.35ed0597568ff6f19c16.woff +0 -0
- package/npm-shrinkwrap.json +117 -36
- package/package.json +8 -3
- package/dist/matterbridgeController.d.ts +0 -24
- package/dist/matterbridgeController.d.ts.map +0 -1
- package/dist/matterbridgeController.js +0 -386
- package/dist/matterbridgeController.js.map +0 -1
- package/frontend/build/static/css/main.1cf003ae.css +0 -2
- package/frontend/build/static/css/main.1cf003ae.css.map +0 -1
- package/frontend/build/static/js/main.045d08f7.js +0 -3
- package/frontend/build/static/js/main.045d08f7.js.map +0 -1
package/dist/matterbridge.js
CHANGED
|
@@ -25,32 +25,32 @@ import { fileURLToPath } from 'url';
|
|
|
25
25
|
import { promises as fs } from 'fs';
|
|
26
26
|
import { exec, spawn } from 'child_process';
|
|
27
27
|
import { createServer } from 'http';
|
|
28
|
-
import https from 'https';
|
|
29
28
|
import EventEmitter from 'events';
|
|
30
|
-
import express from 'express';
|
|
31
29
|
import os from 'os';
|
|
32
30
|
import path from 'path';
|
|
31
|
+
import { randomBytes } from 'crypto';
|
|
32
|
+
// Package modules
|
|
33
|
+
import https from 'https';
|
|
34
|
+
import express from 'express';
|
|
33
35
|
import WebSocket, { WebSocketServer } from 'ws';
|
|
34
36
|
// NodeStorage and AnsiLogger modules
|
|
35
37
|
import { NodeStorageManager } from 'node-persist-manager';
|
|
36
|
-
import { AnsiLogger, UNDERLINE, UNDERLINEOFF, YELLOW, db, debugStringify, stringify, BRIGHT, RESET, er, nf, rs, wr, RED, GREEN, zb,
|
|
38
|
+
import { AnsiLogger, UNDERLINE, UNDERLINEOFF, YELLOW, db, debugStringify, stringify, BRIGHT, RESET, er, nf, rs, wr, RED, GREEN, zb, CYAN, nt, idn, or, hk, BLUE } from 'node-ansi-logger';
|
|
37
39
|
// Matterbridge
|
|
38
40
|
import { MatterbridgeDevice } from './matterbridgeDevice.js';
|
|
39
|
-
import {
|
|
41
|
+
import { WS_ID_LOG, WS_ID_REFRESH_NEEDED, WS_ID_RESTART_NEEDED, wsMessageHandler } from './matterbridgeWebsocket.js';
|
|
42
|
+
import { logInterfaces, wait, waiter, createZip, copyDirectory, getParameter, getIntParameter, hasParameter } from './utils/utils.js';
|
|
40
43
|
import { PluginManager } from './pluginManager.js';
|
|
41
44
|
import { DeviceManager } from './deviceManager.js';
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
47
|
-
import {
|
|
48
|
-
|
|
49
|
-
import {
|
|
50
|
-
import {
|
|
51
|
-
import { CryptoNode } from '@project-chip/matter-node.js/crypto';
|
|
52
|
-
import { Specification } from '@project-chip/matter-node.js/model';
|
|
53
|
-
import { WS_ID_LOG, WS_ID_REFRESH_NEEDED, WS_ID_RESTART_NEEDED, wsMessageHandler } from './matterbridgeWebsocket.js';
|
|
45
|
+
import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
|
|
46
|
+
// @matter
|
|
47
|
+
import { DeviceTypeId, Logger, LogLevel as MatterLogLevel, LogFormat as MatterLogFormat, VendorId, StorageManager } from '@matter/main';
|
|
48
|
+
import { BasicInformationCluster, BridgedDeviceBasicInformation, BridgedDeviceBasicInformationCluster, FixedLabelCluster, GeneralCommissioning, PowerSourceCluster, SwitchCluster, ThreadNetworkDiagnosticsCluster } from '@matter/main/clusters';
|
|
49
|
+
import { getClusterNameById, ManualPairingCodeCodec, QrCodeSchema } from '@matter/main/types';
|
|
50
|
+
import { StorageBackendDisk, StorageBackendJsonFile } from '@matter/nodejs';
|
|
51
|
+
// @project-chip
|
|
52
|
+
import { CommissioningController, CommissioningServer, MatterServer } from '@project-chip/matter.js';
|
|
53
|
+
import { Aggregator, DeviceTypes, NodeStateInformation } from '@project-chip/matter.js/device';
|
|
54
54
|
// Default colors
|
|
55
55
|
const plg = '\u001B[38;5;33m';
|
|
56
56
|
const dev = '\u001B[38;5;79m';
|
|
@@ -91,9 +91,11 @@ export class Matterbridge extends EventEmitter {
|
|
|
91
91
|
matterbridgeConnected: false,
|
|
92
92
|
bridgeMode: '',
|
|
93
93
|
restartMode: '',
|
|
94
|
+
edge: hasParameter('edge'),
|
|
95
|
+
profile: getParameter('profile'),
|
|
94
96
|
loggerLevel: "info" /* LogLevel.INFO */,
|
|
95
97
|
fileLogger: false,
|
|
96
|
-
matterLoggerLevel:
|
|
98
|
+
matterLoggerLevel: MatterLogLevel.INFO,
|
|
97
99
|
matterFileLogger: false,
|
|
98
100
|
mattermdnsinterface: undefined,
|
|
99
101
|
matteripv4address: undefined,
|
|
@@ -117,6 +119,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
117
119
|
bridgeMode = '';
|
|
118
120
|
restartMode = '';
|
|
119
121
|
profile = getParameter('profile');
|
|
122
|
+
edge = hasParameter('edge');
|
|
120
123
|
log;
|
|
121
124
|
matterbrideLoggerFile = 'matterbridge' + (getParameter('profile') ? '.' + getParameter('profile') : '') + '.log';
|
|
122
125
|
matterLoggerFile = 'matter' + (getParameter('profile') ? '.' + getParameter('profile') : '') + '.log';
|
|
@@ -157,8 +160,8 @@ export class Matterbridge extends EventEmitter {
|
|
|
157
160
|
matterAggregator;
|
|
158
161
|
commissioningServer;
|
|
159
162
|
commissioningController;
|
|
160
|
-
aggregatorVendorId = VendorId(0xfff1);
|
|
161
|
-
aggregatorProductId = 0x8000;
|
|
163
|
+
aggregatorVendorId = VendorId(getIntParameter('vendorId') ?? 0xfff1);
|
|
164
|
+
aggregatorProductId = getIntParameter('productId') ?? 0x8000;
|
|
162
165
|
static instance;
|
|
163
166
|
// We load asyncronously so is private
|
|
164
167
|
constructor() {
|
|
@@ -315,39 +318,39 @@ export class Matterbridge extends EventEmitter {
|
|
|
315
318
|
if (hasParameter('matterlogger')) {
|
|
316
319
|
const level = getParameter('matterlogger');
|
|
317
320
|
if (level === 'debug') {
|
|
318
|
-
Logger.defaultLogLevel =
|
|
321
|
+
Logger.defaultLogLevel = MatterLogLevel.DEBUG;
|
|
319
322
|
}
|
|
320
323
|
else if (level === 'info') {
|
|
321
|
-
Logger.defaultLogLevel =
|
|
324
|
+
Logger.defaultLogLevel = MatterLogLevel.INFO;
|
|
322
325
|
}
|
|
323
326
|
else if (level === 'notice') {
|
|
324
|
-
Logger.defaultLogLevel =
|
|
327
|
+
Logger.defaultLogLevel = MatterLogLevel.NOTICE;
|
|
325
328
|
}
|
|
326
329
|
else if (level === 'warn') {
|
|
327
|
-
Logger.defaultLogLevel =
|
|
330
|
+
Logger.defaultLogLevel = MatterLogLevel.WARN;
|
|
328
331
|
}
|
|
329
332
|
else if (level === 'error') {
|
|
330
|
-
Logger.defaultLogLevel =
|
|
333
|
+
Logger.defaultLogLevel = MatterLogLevel.ERROR;
|
|
331
334
|
}
|
|
332
335
|
else if (level === 'fatal') {
|
|
333
|
-
Logger.defaultLogLevel =
|
|
336
|
+
Logger.defaultLogLevel = MatterLogLevel.FATAL;
|
|
334
337
|
}
|
|
335
338
|
else {
|
|
336
339
|
this.log.warn(`Invalid matter.js logger level: ${level}. Using default level "info".`);
|
|
337
|
-
Logger.defaultLogLevel =
|
|
340
|
+
Logger.defaultLogLevel = MatterLogLevel.INFO;
|
|
338
341
|
}
|
|
339
342
|
}
|
|
340
343
|
else {
|
|
341
|
-
Logger.defaultLogLevel = await this.nodeContext.get('matterLogLevel',
|
|
344
|
+
Logger.defaultLogLevel = await this.nodeContext.get('matterLogLevel', MatterLogLevel.INFO);
|
|
342
345
|
}
|
|
343
|
-
Logger.format =
|
|
346
|
+
Logger.format = MatterLogFormat.ANSI;
|
|
344
347
|
Logger.setLogger('default', this.createMatterLogger());
|
|
345
348
|
// Create the file logger for matter.js (context: matterFileLog)
|
|
346
349
|
if (hasParameter('matterfilelogger') || (await this.nodeContext.get('matterFileLog', false))) {
|
|
347
350
|
this.matterbridgeInformation.matterFileLogger = true;
|
|
348
351
|
Logger.addLogger('matterfilelogger', await this.createMatterFileLogger(path.join(this.matterbridgeDirectory, this.matterLoggerFile), true), {
|
|
349
352
|
defaultLogLevel: Logger.defaultLogLevel,
|
|
350
|
-
logFormat:
|
|
353
|
+
logFormat: MatterLogFormat.PLAIN,
|
|
351
354
|
});
|
|
352
355
|
}
|
|
353
356
|
this.log.debug(`Matter logLevel: ${Logger.defaultLogLevel} fileLoger: ${this.matterbridgeInformation.matterFileLogger}.`);
|
|
@@ -500,6 +503,8 @@ export class Matterbridge extends EventEmitter {
|
|
|
500
503
|
this.log.info(` └─ endpoint ${RED}${device.endpoint}${nf} ${typ}${device.endpointName}${nf} ${debugStringify(device.clusterServersId)}`);
|
|
501
504
|
}
|
|
502
505
|
});
|
|
506
|
+
await this.cleanup('Exiting...');
|
|
507
|
+
process.exit(0);
|
|
503
508
|
this.emit('shutdown');
|
|
504
509
|
return;
|
|
505
510
|
}
|
|
@@ -510,36 +515,48 @@ export class Matterbridge extends EventEmitter {
|
|
|
510
515
|
this.log.info(`${plg}${plugin.name}${nf} storage log`);
|
|
511
516
|
await plugin.nodeContext?.logStorage();
|
|
512
517
|
}
|
|
518
|
+
await this.cleanup('Exiting...');
|
|
519
|
+
process.exit(0);
|
|
513
520
|
this.emit('shutdown');
|
|
514
521
|
return;
|
|
515
522
|
}
|
|
516
523
|
if (hasParameter('loginterfaces')) {
|
|
517
524
|
this.log.info(`${plg}Matterbridge${nf} network interfaces log`);
|
|
518
525
|
logInterfaces();
|
|
526
|
+
await this.cleanup('Exiting...');
|
|
527
|
+
process.exit(0);
|
|
519
528
|
this.emit('shutdown');
|
|
520
529
|
return;
|
|
521
530
|
}
|
|
522
531
|
if (getParameter('add')) {
|
|
523
532
|
this.log.debug(`Adding plugin ${getParameter('add')}`);
|
|
524
533
|
await this.plugins.add(getParameter('add'));
|
|
534
|
+
await this.cleanup('Exiting...');
|
|
535
|
+
process.exit(0);
|
|
525
536
|
this.emit('shutdown');
|
|
526
537
|
return;
|
|
527
538
|
}
|
|
528
539
|
if (getParameter('remove')) {
|
|
529
540
|
this.log.debug(`Removing plugin ${getParameter('remove')}`);
|
|
530
541
|
await this.plugins.remove(getParameter('remove'));
|
|
542
|
+
await this.cleanup('Exiting...');
|
|
543
|
+
process.exit(0);
|
|
531
544
|
this.emit('shutdown');
|
|
532
545
|
return;
|
|
533
546
|
}
|
|
534
547
|
if (getParameter('enable')) {
|
|
535
548
|
this.log.debug(`Enabling plugin ${getParameter('enable')}`);
|
|
536
549
|
await this.plugins.enable(getParameter('enable'));
|
|
550
|
+
await this.cleanup('Exiting...');
|
|
551
|
+
process.exit(0);
|
|
537
552
|
this.emit('shutdown');
|
|
538
553
|
return;
|
|
539
554
|
}
|
|
540
555
|
if (getParameter('disable')) {
|
|
541
556
|
this.log.debug(`Disabling plugin ${getParameter('disable')}`);
|
|
542
557
|
await this.plugins.disable(getParameter('disable'));
|
|
558
|
+
await this.cleanup('Exiting...');
|
|
559
|
+
process.exit(0);
|
|
543
560
|
this.emit('shutdown');
|
|
544
561
|
return;
|
|
545
562
|
}
|
|
@@ -563,6 +580,8 @@ export class Matterbridge extends EventEmitter {
|
|
|
563
580
|
this.nodeStorage = undefined;
|
|
564
581
|
this.plugins.clear();
|
|
565
582
|
this.devices.clear();
|
|
583
|
+
await this.cleanup('Exiting...');
|
|
584
|
+
process.exit(0);
|
|
566
585
|
this.emit('shutdown');
|
|
567
586
|
return;
|
|
568
587
|
}
|
|
@@ -579,6 +598,8 @@ export class Matterbridge extends EventEmitter {
|
|
|
579
598
|
await this.matterbridgeContext?.clearAll();
|
|
580
599
|
await this.stopMatterStorage();
|
|
581
600
|
this.log.info('Reset done! Remove the device from the controller.');
|
|
601
|
+
await this.cleanup('Exiting...');
|
|
602
|
+
process.exit(0);
|
|
582
603
|
this.emit('shutdown');
|
|
583
604
|
return;
|
|
584
605
|
}
|
|
@@ -598,6 +619,8 @@ export class Matterbridge extends EventEmitter {
|
|
|
598
619
|
this.log.warn(`Plugin ${plg}${getParameter('reset')}${wr} not registerd in matterbridge`);
|
|
599
620
|
}
|
|
600
621
|
await this.stopMatterStorage();
|
|
622
|
+
await this.cleanup('Exiting...');
|
|
623
|
+
process.exit(0);
|
|
601
624
|
this.emit('shutdown');
|
|
602
625
|
return;
|
|
603
626
|
}
|
|
@@ -632,6 +655,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
632
655
|
if (hasParameter('bridge') || (!hasParameter('childbridge') && (await this.nodeContext?.get('bridgeMode', '')) === 'bridge')) {
|
|
633
656
|
this.bridgeMode = 'bridge';
|
|
634
657
|
MatterbridgeDevice.bridgeMode = 'bridge';
|
|
658
|
+
MatterbridgeEndpoint.bridgeMode = 'bridge';
|
|
635
659
|
this.log.debug(`Starting matterbridge in mode ${this.bridgeMode}`);
|
|
636
660
|
await this.startBridge();
|
|
637
661
|
return;
|
|
@@ -640,6 +664,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
640
664
|
if (hasParameter('childbridge') || (!hasParameter('bridge') && (await this.nodeContext?.get('bridgeMode', '')) === 'childbridge')) {
|
|
641
665
|
this.bridgeMode = 'childbridge';
|
|
642
666
|
MatterbridgeDevice.bridgeMode = 'childbridge';
|
|
667
|
+
MatterbridgeEndpoint.bridgeMode = 'childbridge';
|
|
643
668
|
this.log.debug(`Starting matterbridge in mode ${this.bridgeMode}`);
|
|
644
669
|
await this.startChildbridge();
|
|
645
670
|
return;
|
|
@@ -695,12 +720,12 @@ export class Matterbridge extends EventEmitter {
|
|
|
695
720
|
process.removeAllListeners('unhandledRejection');
|
|
696
721
|
this.exceptionHandler = async (error) => {
|
|
697
722
|
this.log.fatal('Unhandled Exception detected at:', error.stack || error, rs);
|
|
698
|
-
await this.cleanup('Unhandled Exception detected, cleaning up...');
|
|
723
|
+
// await this.cleanup('Unhandled Exception detected, cleaning up...');
|
|
699
724
|
};
|
|
700
725
|
process.on('uncaughtException', this.exceptionHandler);
|
|
701
726
|
this.rejectionHandler = async (reason, promise) => {
|
|
702
727
|
this.log.fatal('Unhandled Rejection detected at:', promise, 'reason:', reason instanceof Error ? reason.stack : reason, rs);
|
|
703
|
-
await this.cleanup('Unhandled Rejection detected, cleaning up...');
|
|
728
|
+
// await this.cleanup('Unhandled Rejection detected, cleaning up...');
|
|
704
729
|
};
|
|
705
730
|
process.on('unhandledRejection', this.rejectionHandler);
|
|
706
731
|
this.log.debug(`Registering SIGINT and SIGTERM signal handlers...`);
|
|
@@ -993,22 +1018,22 @@ export class Matterbridge extends EventEmitter {
|
|
|
993
1018
|
const message = formattedLog.slice(65);
|
|
994
1019
|
matterLogger.logName = logger;
|
|
995
1020
|
switch (_level) {
|
|
996
|
-
case
|
|
1021
|
+
case MatterLogLevel.DEBUG:
|
|
997
1022
|
matterLogger.log("debug" /* LogLevel.DEBUG */, message);
|
|
998
1023
|
break;
|
|
999
|
-
case
|
|
1024
|
+
case MatterLogLevel.INFO:
|
|
1000
1025
|
matterLogger.log("info" /* LogLevel.INFO */, message);
|
|
1001
1026
|
break;
|
|
1002
|
-
case
|
|
1027
|
+
case MatterLogLevel.NOTICE:
|
|
1003
1028
|
matterLogger.log("notice" /* LogLevel.NOTICE */, message);
|
|
1004
1029
|
break;
|
|
1005
|
-
case
|
|
1030
|
+
case MatterLogLevel.WARN:
|
|
1006
1031
|
matterLogger.log("warn" /* LogLevel.WARN */, message);
|
|
1007
1032
|
break;
|
|
1008
|
-
case
|
|
1033
|
+
case MatterLogLevel.ERROR:
|
|
1009
1034
|
matterLogger.log("error" /* LogLevel.ERROR */, message);
|
|
1010
1035
|
break;
|
|
1011
|
-
case
|
|
1036
|
+
case MatterLogLevel.FATAL:
|
|
1012
1037
|
matterLogger.log("fatal" /* LogLevel.FATAL */, message);
|
|
1013
1038
|
break;
|
|
1014
1039
|
default:
|
|
@@ -1050,22 +1075,22 @@ export class Matterbridge extends EventEmitter {
|
|
|
1050
1075
|
const logger = parts[1];
|
|
1051
1076
|
const finalMessage = parts.slice(2).join(' ') + os.EOL;
|
|
1052
1077
|
switch (_level) {
|
|
1053
|
-
case
|
|
1078
|
+
case MatterLogLevel.DEBUG:
|
|
1054
1079
|
await fs.appendFile(filePath, `[${timestamp}] [${logger}] [debug] ${finalMessage}`);
|
|
1055
1080
|
break;
|
|
1056
|
-
case
|
|
1081
|
+
case MatterLogLevel.INFO:
|
|
1057
1082
|
await fs.appendFile(filePath, `[${timestamp}] [${logger}] [info] ${finalMessage}`);
|
|
1058
1083
|
break;
|
|
1059
|
-
case
|
|
1084
|
+
case MatterLogLevel.NOTICE:
|
|
1060
1085
|
await fs.appendFile(filePath, `[${timestamp}] [${logger}] [notice] ${finalMessage}`);
|
|
1061
1086
|
break;
|
|
1062
|
-
case
|
|
1087
|
+
case MatterLogLevel.WARN:
|
|
1063
1088
|
await fs.appendFile(filePath, `[${timestamp}] [${logger}] [warn] ${finalMessage}`);
|
|
1064
1089
|
break;
|
|
1065
|
-
case
|
|
1090
|
+
case MatterLogLevel.ERROR:
|
|
1066
1091
|
await fs.appendFile(filePath, `[${timestamp}] [${logger}] [error] ${finalMessage}`);
|
|
1067
1092
|
break;
|
|
1068
|
-
case
|
|
1093
|
+
case MatterLogLevel.FATAL:
|
|
1069
1094
|
await fs.appendFile(filePath, `[${timestamp}] [${logger}] [fatal] ${finalMessage}`);
|
|
1070
1095
|
break;
|
|
1071
1096
|
default:
|
|
@@ -1280,6 +1305,18 @@ export class Matterbridge extends EventEmitter {
|
|
|
1280
1305
|
this.initialized = false;
|
|
1281
1306
|
}
|
|
1282
1307
|
}
|
|
1308
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1309
|
+
async addBridgedEndpoint(pluginName, device) {
|
|
1310
|
+
// Nothing to do here
|
|
1311
|
+
}
|
|
1312
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1313
|
+
async removeBridgedEndpoint(pluginName, device) {
|
|
1314
|
+
// Nothing to do here
|
|
1315
|
+
}
|
|
1316
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1317
|
+
async removeAllBridgedEndpoints(pluginName) {
|
|
1318
|
+
// Nothing to do here
|
|
1319
|
+
}
|
|
1283
1320
|
/**
|
|
1284
1321
|
* Adds a bridged device to the Matterbridge.
|
|
1285
1322
|
* @param pluginName - The name of the plugin.
|
|
@@ -1955,39 +1992,52 @@ export class Matterbridge extends EventEmitter {
|
|
|
1955
1992
|
* @param {StorageContext} context - The storage context.
|
|
1956
1993
|
* @returns {Aggregator} - The created Matter Aggregator.
|
|
1957
1994
|
*/
|
|
1995
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1958
1996
|
async createMatterAggregator(context, pluginName) {
|
|
1959
|
-
|
|
1997
|
+
/*
|
|
1998
|
+
const random = randomBytes(8).toString('hex');
|
|
1960
1999
|
await context.set('aggregatorSerialNumber', await context.get('aggregatorSerialNumber', random));
|
|
1961
2000
|
await context.set('aggregatorUniqueId', await context.get('aggregatorUniqueId', random));
|
|
1962
|
-
|
|
1963
|
-
this.log.debug(`Creating matter aggregator for plugin ${plg}${pluginName}${db} with
|
|
1964
|
-
this.log.debug(`Creating matter aggregator for plugin ${plg}${pluginName}${db} with
|
|
2001
|
+
|
|
2002
|
+
this.log.debug(`Creating matter aggregator for plugin ${plg}${pluginName}${db} with uniqueId ${await context.get<string>('aggregatorUniqueId')} serialNumber ${await context.get<string>('aggregatorSerialNumber')}`);
|
|
2003
|
+
this.log.debug(`Creating matter aggregator for plugin ${plg}${pluginName}${db} with softwareVersion ${await context.get<number>('softwareVersion', 1)} softwareVersionString ${await context.get<string>('softwareVersionString', '1.0.0')}`);
|
|
2004
|
+
this.log.debug(`Creating matter aggregator for plugin ${plg}${pluginName}${db} with hardwareVersion ${await context.get<number>('hardwareVersion', 1)} hardwareVersionString ${await context.get<string>('hardwareVersionString', '1.0.0')}`);
|
|
2005
|
+
*/
|
|
1965
2006
|
const matterAggregator = new Aggregator();
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
2007
|
+
/*
|
|
2008
|
+
matterAggregator.addClusterServer(
|
|
2009
|
+
ClusterServer(
|
|
2010
|
+
BasicInformationCluster,
|
|
2011
|
+
{
|
|
2012
|
+
dataModelRevision: 1,
|
|
2013
|
+
location: 'FR',
|
|
2014
|
+
vendorId: VendorId(0xfff1),
|
|
2015
|
+
vendorName: 'Matterbridge',
|
|
2016
|
+
productId: 0x8000,
|
|
2017
|
+
productName: 'Matterbridge aggregator',
|
|
2018
|
+
productLabel: 'Matterbridge aggregator',
|
|
2019
|
+
nodeLabel: 'Matterbridge aggregator',
|
|
2020
|
+
serialNumber: await context.get<string>('aggregatorSerialNumber'),
|
|
2021
|
+
uniqueId: await context.get<string>('aggregatorUniqueId'),
|
|
2022
|
+
softwareVersion: await context.get<number>('softwareVersion', 1),
|
|
2023
|
+
softwareVersionString: await context.get<string>('softwareVersionString', '1.0.0'),
|
|
2024
|
+
hardwareVersion: await context.get<number>('hardwareVersion', 1),
|
|
2025
|
+
hardwareVersionString: await context.get<string>('hardwareVersionString', '1.0.0'),
|
|
2026
|
+
reachable: true,
|
|
2027
|
+
capabilityMinima: { caseSessionsPerFabric: 3, subscriptionsPerFabric: 3 },
|
|
2028
|
+
specificationVersion: Specification.SPECIFICATION_VERSION,
|
|
2029
|
+
maxPathsPerInvoke: 1,
|
|
2030
|
+
},
|
|
2031
|
+
{},
|
|
2032
|
+
{
|
|
2033
|
+
startUp: true,
|
|
2034
|
+
shutDown: true,
|
|
2035
|
+
leave: true,
|
|
2036
|
+
reachableChanged: true,
|
|
2037
|
+
},
|
|
2038
|
+
),
|
|
2039
|
+
);
|
|
2040
|
+
*/
|
|
1991
2041
|
return matterAggregator;
|
|
1992
2042
|
}
|
|
1993
2043
|
/**
|
|
@@ -2180,7 +2230,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
2180
2230
|
if (!this.storageManager)
|
|
2181
2231
|
throw new Error('No storage manager initialized');
|
|
2182
2232
|
this.log.debug(`Creating commissioning server storage context for ${plg}${pluginName}${db}`);
|
|
2183
|
-
const random =
|
|
2233
|
+
const random = randomBytes(8).toString('hex');
|
|
2184
2234
|
const storageContext = this.storageManager.createContext(pluginName);
|
|
2185
2235
|
await storageContext.set('deviceName', deviceName);
|
|
2186
2236
|
await storageContext.set('deviceType', deviceType);
|
|
@@ -3122,22 +3172,22 @@ export class Matterbridge extends EventEmitter {
|
|
|
3122
3172
|
if (command === 'setmjloglevel') {
|
|
3123
3173
|
this.log.debug('Matter.js log level:', param);
|
|
3124
3174
|
if (param === 'Debug') {
|
|
3125
|
-
Logger.defaultLogLevel =
|
|
3175
|
+
Logger.defaultLogLevel = MatterLogLevel.DEBUG;
|
|
3126
3176
|
}
|
|
3127
3177
|
else if (param === 'Info') {
|
|
3128
|
-
Logger.defaultLogLevel =
|
|
3178
|
+
Logger.defaultLogLevel = MatterLogLevel.INFO;
|
|
3129
3179
|
}
|
|
3130
3180
|
else if (param === 'Notice') {
|
|
3131
|
-
Logger.defaultLogLevel =
|
|
3181
|
+
Logger.defaultLogLevel = MatterLogLevel.NOTICE;
|
|
3132
3182
|
}
|
|
3133
3183
|
else if (param === 'Warn') {
|
|
3134
|
-
Logger.defaultLogLevel =
|
|
3184
|
+
Logger.defaultLogLevel = MatterLogLevel.WARN;
|
|
3135
3185
|
}
|
|
3136
3186
|
else if (param === 'Error') {
|
|
3137
|
-
Logger.defaultLogLevel =
|
|
3187
|
+
Logger.defaultLogLevel = MatterLogLevel.ERROR;
|
|
3138
3188
|
}
|
|
3139
3189
|
else if (param === 'Fatal') {
|
|
3140
|
-
Logger.defaultLogLevel =
|
|
3190
|
+
Logger.defaultLogLevel = MatterLogLevel.FATAL;
|
|
3141
3191
|
}
|
|
3142
3192
|
await this.nodeContext?.set('matterLogLevel', Logger.defaultLogLevel);
|
|
3143
3193
|
res.json({ message: 'Command received' });
|
|
@@ -3191,8 +3241,8 @@ export class Matterbridge extends EventEmitter {
|
|
|
3191
3241
|
if (param === 'true') {
|
|
3192
3242
|
try {
|
|
3193
3243
|
Logger.addLogger('matterfilelogger', await this.createMatterFileLogger(path.join(this.matterbridgeDirectory, this.matterLoggerFile), true), {
|
|
3194
|
-
defaultLogLevel:
|
|
3195
|
-
logFormat:
|
|
3244
|
+
defaultLogLevel: MatterLogLevel.DEBUG,
|
|
3245
|
+
logFormat: MatterLogFormat.PLAIN,
|
|
3196
3246
|
});
|
|
3197
3247
|
}
|
|
3198
3248
|
catch (error) {
|
|
@@ -3480,8 +3530,8 @@ export class Matterbridge extends EventEmitter {
|
|
|
3480
3530
|
await this.logNodeAndSystemInfo();
|
|
3481
3531
|
this.matterbridgeDirectory = dataPath;
|
|
3482
3532
|
// Set matter.js logger level and format
|
|
3483
|
-
Logger.defaultLogLevel =
|
|
3484
|
-
Logger.format =
|
|
3533
|
+
Logger.defaultLogLevel = MatterLogLevel.INFO;
|
|
3534
|
+
Logger.format = MatterLogFormat.ANSI;
|
|
3485
3535
|
// Start the storage and create matterbridgeContext
|
|
3486
3536
|
await this.startMatterStorage('json', path.join(this.matterbridgeDirectory, this.matterStorageName));
|
|
3487
3537
|
if (!this.storageManager)
|