matterbridge 1.5.10 → 1.6.0
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 +23 -3
- package/README-SERVICE.md +1 -1
- package/README.md +7 -7
- package/dist/cluster/export.js +1 -1
- package/dist/cluster/export.js.map +1 -1
- package/dist/defaultConfigSchema.d.ts.map +1 -1
- package/dist/defaultConfigSchema.js +9 -1
- package/dist/defaultConfigSchema.js.map +1 -1
- package/dist/matterbridge.d.ts +72 -47
- package/dist/matterbridge.d.ts.map +1 -1
- package/dist/matterbridge.js +144 -118
- package/dist/matterbridge.js.map +1 -1
- package/dist/matterbridgeDevice.d.ts +137 -1029
- package/dist/matterbridgeDevice.d.ts.map +1 -1
- package/dist/matterbridgeDevice.js +55 -361
- package/dist/matterbridgeDevice.js.map +1 -1
- package/dist/matterbridgeEdge.d.ts +90 -0
- package/dist/matterbridgeEdge.d.ts.map +1 -0
- package/dist/matterbridgeEdge.js +555 -0
- package/dist/matterbridgeEdge.js.map +1 -0
- package/dist/matterbridgeEndpoint.d.ts +5195 -0
- package/dist/matterbridgeEndpoint.d.ts.map +1 -0
- package/dist/matterbridgeEndpoint.js +2196 -0
- package/dist/matterbridgeEndpoint.js.map +1 -0
- package/dist/matterbridgeTypes.d.ts +5 -0
- package/dist/matterbridgeTypes.d.ts.map +1 -1
- package/dist/matterbridgeTypes.js.map +1 -1
- package/dist/matterbridgeWebsocket.d.ts +49 -0
- package/dist/matterbridgeWebsocket.d.ts.map +1 -0
- package/dist/matterbridgeWebsocket.js +145 -0
- package/dist/matterbridgeWebsocket.js.map +1 -0
- package/dist/pluginManager.d.ts +134 -1
- package/dist/pluginManager.d.ts.map +1 -1
- package/dist/pluginManager.js +145 -12
- package/dist/pluginManager.js.map +1 -1
- package/frontend/build/asset-manifest.json +3 -3
- package/frontend/build/index.html +1 -1
- package/frontend/build/static/js/{main.96d6324b.js → main.045d08f7.js} +3 -3
- package/frontend/build/static/js/main.045d08f7.js.map +1 -0
- package/npm-shrinkwrap.json +813 -6207
- package/package.json +2 -78
- package/dist/history/export.d.ts +0 -2
- package/dist/history/export.d.ts.map +0 -1
- package/dist/history/export.js +0 -2
- package/dist/history/export.js.map +0 -1
- package/frontend/build/static/js/main.96d6324b.js.map +0 -1
- /package/frontend/build/static/js/{main.96d6324b.js.LICENSE.txt → main.045d08f7.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file contains the class MatterbridgeEdge that extends the Matterbridge class.
|
|
3
|
+
*
|
|
4
|
+
* @file matterbridgeEdge.ts
|
|
5
|
+
* @author Luca Liguori
|
|
6
|
+
* @date 2024-10-01
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
*
|
|
9
|
+
* Copyright 2024 Luca Liguori.
|
|
10
|
+
*
|
|
11
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
12
|
+
* you may not use this file except in compliance with the License.
|
|
13
|
+
* You may obtain a copy of the License at
|
|
14
|
+
*
|
|
15
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
*
|
|
17
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
18
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
19
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
20
|
+
* See the License for the specific language governing permissions and
|
|
21
|
+
* limitations under the License. *
|
|
22
|
+
*/
|
|
23
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
24
|
+
/**
|
|
25
|
+
* Import needed modules from @project-chip/matter-node.js
|
|
26
|
+
*/
|
|
27
|
+
// Include this first to auto-register Crypto, Network and Time Node.js implementations
|
|
28
|
+
import '@project-chip/matter-node.js';
|
|
29
|
+
import { CryptoNode } from '@project-chip/matter-node.js/crypto';
|
|
30
|
+
import { DeviceTypeId, FabricIndex, VendorId } from '@project-chip/matter-node.js/datatype';
|
|
31
|
+
import { Format, Level } from '@project-chip/matter-node.js/log';
|
|
32
|
+
import { getParameter, hasParameter } from '@project-chip/matter-node.js/util';
|
|
33
|
+
import { Environment, StorageService } from '@project-chip/matter.js/environment';
|
|
34
|
+
import { ServerNode } from '@project-chip/matter.js/node';
|
|
35
|
+
import { FabricAction } from '@project-chip/matter-node.js/fabric';
|
|
36
|
+
import { Endpoint } from '@project-chip/matter.js/endpoint';
|
|
37
|
+
import { AggregatorEndpoint } from '@project-chip/matter.js/endpoints/AggregatorEndpoint';
|
|
38
|
+
// Other imports
|
|
39
|
+
import { Matterbridge } from './matterbridge.js';
|
|
40
|
+
import { rs, GREEN } from 'node-ansi-logger';
|
|
41
|
+
import path from 'path';
|
|
42
|
+
import os from 'os';
|
|
43
|
+
import { BasicInformationCluster } from '@project-chip/matter-node.js/cluster';
|
|
44
|
+
import { Aggregator, Device } from '@project-chip/matter-node.js/device';
|
|
45
|
+
const verbose = hasParameter('verbose');
|
|
46
|
+
/**
|
|
47
|
+
* Represents the MatterbridgeEdge application.
|
|
48
|
+
*/
|
|
49
|
+
export class MatterbridgeEdge extends Matterbridge {
|
|
50
|
+
static instance;
|
|
51
|
+
// Matter environment
|
|
52
|
+
environment = Environment.default;
|
|
53
|
+
// Matter storage
|
|
54
|
+
matterStorageService;
|
|
55
|
+
// Mapping of CommissioningServer to ServerNode
|
|
56
|
+
csToMatterNode = new Map();
|
|
57
|
+
// Mapping of Aggregator to AggregatorEndpoint
|
|
58
|
+
agToMatterNode = new Map();
|
|
59
|
+
constructor() {
|
|
60
|
+
super();
|
|
61
|
+
}
|
|
62
|
+
static async loadInstance(initialize = false) {
|
|
63
|
+
if (!MatterbridgeEdge.instance) {
|
|
64
|
+
// eslint-disable-next-line no-console
|
|
65
|
+
if (hasParameter('debug'))
|
|
66
|
+
console.log(GREEN + 'Creating a new instance of MatterbridgeEdge.', initialize ? 'Initializing...' : 'Not initializing...', rs);
|
|
67
|
+
MatterbridgeEdge.instance = new MatterbridgeEdge();
|
|
68
|
+
if (initialize)
|
|
69
|
+
await MatterbridgeEdge.instance.initialize();
|
|
70
|
+
}
|
|
71
|
+
return MatterbridgeEdge.instance;
|
|
72
|
+
}
|
|
73
|
+
async initialize() {
|
|
74
|
+
// eslint-disable-next-line no-console
|
|
75
|
+
if (hasParameter('debug'))
|
|
76
|
+
console.log('Initializing MatterbridgeEdge...');
|
|
77
|
+
// Set the matterbridge directory
|
|
78
|
+
this.homeDirectory = getParameter('homedir') ?? os.homedir();
|
|
79
|
+
this.matterbridgeDirectory = path.join(this.homeDirectory, '.matterbridge');
|
|
80
|
+
// Setup matter environment
|
|
81
|
+
this.environment.vars.set('log.level', Level.INFO);
|
|
82
|
+
this.environment.vars.set('log.format', Format.ANSI);
|
|
83
|
+
this.environment.vars.set('path.root', path.join(this.matterbridgeDirectory, 'matterstorage'));
|
|
84
|
+
this.environment.vars.set('runtime.signals', false);
|
|
85
|
+
this.environment.vars.set('runtime.exitcode', false);
|
|
86
|
+
// Initialize the base Matterbridge class
|
|
87
|
+
await super.initialize();
|
|
88
|
+
// Setup Matter commissioning server
|
|
89
|
+
this.port = 5540;
|
|
90
|
+
this.passcode = 20242025;
|
|
91
|
+
this.discriminator = 3840;
|
|
92
|
+
}
|
|
93
|
+
async startMatterStorage(storageType, storageName) {
|
|
94
|
+
// Setup Matter storage
|
|
95
|
+
this.log.info(`Starting matter node storage...`);
|
|
96
|
+
this.matterStorageService = this.environment.get(StorageService);
|
|
97
|
+
this.log.info(`Matter node storage service created: ${this.matterStorageService.location}`);
|
|
98
|
+
this.storageManager = await this.matterStorageService.open('Matterbridge');
|
|
99
|
+
this.matterbridgeContext = this.storageManager.createContext('persist');
|
|
100
|
+
this.log.info('Matter node storage manager "Matterbridge" created');
|
|
101
|
+
this.log.info('Matter node storage started');
|
|
102
|
+
}
|
|
103
|
+
async backupMatterStorage(storageName, backupName) {
|
|
104
|
+
// TODO: Implement backupMatterStorage
|
|
105
|
+
}
|
|
106
|
+
async stopMatterStorage() {
|
|
107
|
+
this.log.info('Closing matter node storage...');
|
|
108
|
+
this.storageManager?.close();
|
|
109
|
+
this.matterStorageService = undefined;
|
|
110
|
+
this.storageManager = undefined;
|
|
111
|
+
this.matterbridgeContext = undefined;
|
|
112
|
+
this.log.info('Matter node storage closed');
|
|
113
|
+
}
|
|
114
|
+
createMatterServer(storageManager) {
|
|
115
|
+
if (hasParameter('debug'))
|
|
116
|
+
this.log.warn('createMatterServer() => mock matterServer');
|
|
117
|
+
const matterServer = {
|
|
118
|
+
addCommissioningServer: (commissioningServer, nodeOptions) => {
|
|
119
|
+
if (hasParameter('debug'))
|
|
120
|
+
this.log.warn('MatterServer.addCommissioningServer() => do nothing');
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
return matterServer;
|
|
124
|
+
}
|
|
125
|
+
async startMatterServer() {
|
|
126
|
+
if (hasParameter('debug'))
|
|
127
|
+
this.log.warn('createMatterServer() => do nothing');
|
|
128
|
+
}
|
|
129
|
+
async stopMatterServer() {
|
|
130
|
+
this.log.info(`Stopping matter server nodes in ${this.bridgeMode} mode...`);
|
|
131
|
+
if (this.bridgeMode === 'bridge') {
|
|
132
|
+
const serverNode = this.csToMatterNode.get('Matterbridge')?.serverNode;
|
|
133
|
+
if (serverNode)
|
|
134
|
+
await this.stopServerNode(serverNode);
|
|
135
|
+
}
|
|
136
|
+
if (this.bridgeMode === 'childbridge') {
|
|
137
|
+
this.plugins.forEach(async (plugin) => {
|
|
138
|
+
const serverNode = this.csToMatterNode.get(plugin.name)?.serverNode;
|
|
139
|
+
if (serverNode)
|
|
140
|
+
await this.stopServerNode(serverNode);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
this.log.info('Stopped matter server nodes');
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Creates a server node storage context.
|
|
147
|
+
*
|
|
148
|
+
* @param pluginName - The name of the plugin.
|
|
149
|
+
* @param deviceName - The name of the device.
|
|
150
|
+
* @param deviceType - The deviceType of the device.
|
|
151
|
+
* @param vendorId - The vendor ID.
|
|
152
|
+
* @param vendorName - The vendor name.
|
|
153
|
+
* @param productId - The product ID.
|
|
154
|
+
* @param productName - The product name.
|
|
155
|
+
* @param serialNumber - The serial number of the device (optional).
|
|
156
|
+
* @param uniqueId - The unique ID of the device (optional).
|
|
157
|
+
* @param softwareVersion - The software version of the device (optional).
|
|
158
|
+
* @param softwareVersionString - The software version string of the device (optional).
|
|
159
|
+
* @param hardwareVersion - The hardware version of the device (optional).
|
|
160
|
+
* @param hardwareVersionString - The hardware version string of the device (optional).
|
|
161
|
+
* @returns The storage context for the commissioning server.
|
|
162
|
+
*/
|
|
163
|
+
async createServerNodeContext(pluginName, deviceName, deviceType, vendorId, vendorName, productId, productName, serialNumber) {
|
|
164
|
+
if (!this.matterStorageService)
|
|
165
|
+
throw new Error('No storage service initialized');
|
|
166
|
+
this.log.notice(`Creating server node storage context "${pluginName}.persist" for ${pluginName}...`);
|
|
167
|
+
const storageManager = await this.matterStorageService.open(pluginName);
|
|
168
|
+
const storageContext = storageManager.createContext('persist');
|
|
169
|
+
const random = CryptoNode.getRandomData(8).toHex();
|
|
170
|
+
await storageContext.set('storeId', pluginName);
|
|
171
|
+
await storageContext.set('deviceName', deviceName);
|
|
172
|
+
await storageContext.set('deviceType', deviceType);
|
|
173
|
+
await storageContext.set('vendorId', vendorId);
|
|
174
|
+
await storageContext.set('vendorName', vendorName.slice(0, 32));
|
|
175
|
+
await storageContext.set('productId', productId);
|
|
176
|
+
await storageContext.set('productName', productName.slice(0, 32));
|
|
177
|
+
await storageContext.set('nodeLabel', productName.slice(0, 32));
|
|
178
|
+
await storageContext.set('productLabel', productName.slice(0, 32));
|
|
179
|
+
await storageContext.set('serialNumber', await storageContext.get('serialNumber', serialNumber ? serialNumber.slice(0, 32) : 'SN' + random));
|
|
180
|
+
await storageContext.set('uniqueId', await storageContext.get('uniqueId', random));
|
|
181
|
+
await storageContext.set('softwareVersion', this.matterbridgeVersion !== '' && this.matterbridgeVersion.includes('.') ? parseInt(this.matterbridgeVersion.split('.')[0], 10) : 1);
|
|
182
|
+
await storageContext.set('softwareVersionString', this.matterbridgeVersion !== '' ? this.matterbridgeVersion : '1.0.0');
|
|
183
|
+
await storageContext.set('hardwareVersion', this.systemInformation.osRelease !== '' && this.systemInformation.osRelease.includes('.') ? parseInt(this.systemInformation.osRelease.split('.')[0], 10) : 1);
|
|
184
|
+
await storageContext.set('hardwareVersionString', this.systemInformation.osRelease !== '' ? this.systemInformation.osRelease : '1.0.0');
|
|
185
|
+
this.log.debug(`Created server node storage context "${pluginName}.persist" for ${pluginName}:`);
|
|
186
|
+
this.log.debug(`- deviceName: ${await storageContext.get('deviceName')} deviceType: ${await storageContext.get('deviceType')}(0x${(await storageContext.get('deviceType'))?.toString(16).padStart(4, '0')})`);
|
|
187
|
+
this.log.debug(`- serialNumber: ${await storageContext.get('serialNumber')} uniqueId: ${await storageContext.get('uniqueId')}`);
|
|
188
|
+
this.log.debug(`- softwareVersion: ${await storageContext.get('softwareVersion')} softwareVersionString: ${await storageContext.get('softwareVersionString')}`);
|
|
189
|
+
this.log.debug(`- hardwareVersion: ${await storageContext.get('hardwareVersion')} hardwareVersionString: ${await storageContext.get('hardwareVersionString')}`);
|
|
190
|
+
return storageContext;
|
|
191
|
+
}
|
|
192
|
+
async createServerNode(storageContext, port = 5540, passcode = 20242025, discriminator = 3850) {
|
|
193
|
+
this.log.notice(`Creating server node for ${await storageContext.get('storeId')} with:`);
|
|
194
|
+
this.log.debug(`- deviceName: ${await storageContext.get('deviceName')} deviceType: ${await storageContext.get('deviceType')}(0x${(await storageContext.get('deviceType'))?.toString(16).padStart(4, '0')})`);
|
|
195
|
+
this.log.debug(`- serialNumber: ${await storageContext.get('serialNumber')} uniqueId: ${await storageContext.get('uniqueId')}`);
|
|
196
|
+
this.log.debug(`- softwareVersion: ${await storageContext.get('softwareVersion')} softwareVersionString: ${await storageContext.get('softwareVersionString')}`);
|
|
197
|
+
this.log.debug(`- hardwareVersion: ${await storageContext.get('hardwareVersion')} hardwareVersionString: ${await storageContext.get('hardwareVersionString')}`);
|
|
198
|
+
/**
|
|
199
|
+
* Create a Matter ServerNode, which contains the Root Endpoint and all relevant data and configuration
|
|
200
|
+
*/
|
|
201
|
+
const serverNode = await ServerNode.create({
|
|
202
|
+
// Required: Give the Node a unique ID which is used to store the state of this node
|
|
203
|
+
id: await storageContext.get('storeId'),
|
|
204
|
+
// Provide Network relevant configuration like the port
|
|
205
|
+
// Optional when operating only one device on a host, Default port is 5540
|
|
206
|
+
network: {
|
|
207
|
+
listeningAddressIpv4: this.ipv4address,
|
|
208
|
+
listeningAddressIpv6: this.ipv6address,
|
|
209
|
+
port,
|
|
210
|
+
},
|
|
211
|
+
// Provide Commissioning relevant settings
|
|
212
|
+
// Optional for development/testing purposes
|
|
213
|
+
commissioning: {
|
|
214
|
+
passcode,
|
|
215
|
+
discriminator,
|
|
216
|
+
},
|
|
217
|
+
// Provide Node announcement settings
|
|
218
|
+
// Optional: If Ommitted some development defaults are used
|
|
219
|
+
productDescription: {
|
|
220
|
+
name: await storageContext.get('deviceName'),
|
|
221
|
+
deviceType: DeviceTypeId(await storageContext.get('deviceType')),
|
|
222
|
+
},
|
|
223
|
+
// Provide defaults for the BasicInformation cluster on the Root endpoint
|
|
224
|
+
// Optional: If Omitted some development defaults are used
|
|
225
|
+
basicInformation: {
|
|
226
|
+
vendorId: VendorId(await storageContext.get('vendorId')),
|
|
227
|
+
vendorName: await storageContext.get('vendorName'),
|
|
228
|
+
productId: await storageContext.get('productId'),
|
|
229
|
+
productName: await storageContext.get('productName'),
|
|
230
|
+
productLabel: await storageContext.get('productName'),
|
|
231
|
+
nodeLabel: await storageContext.get('productName'),
|
|
232
|
+
serialNumber: await storageContext.get('serialNumber'),
|
|
233
|
+
uniqueId: await storageContext.get('uniqueId'),
|
|
234
|
+
softwareVersion: await storageContext.get('softwareVersion'),
|
|
235
|
+
softwareVersionString: await storageContext.get('softwareVersionString'),
|
|
236
|
+
hardwareVersion: await storageContext.get('hardwareVersion'),
|
|
237
|
+
hardwareVersionString: await storageContext.get('hardwareVersionString'),
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
/**
|
|
241
|
+
* This event is triggered when the device is initially commissioned successfully.
|
|
242
|
+
* This means: It is added to the first fabric.
|
|
243
|
+
*/
|
|
244
|
+
serverNode.lifecycle.commissioned.on(() => this.log.notice('Server was initially commissioned successfully!'));
|
|
245
|
+
/** This event is triggered when all fabrics are removed from the device, usually it also does a factory reset then. */
|
|
246
|
+
serverNode.lifecycle.decommissioned.on(() => this.log.notice('Server was fully decommissioned successfully!'));
|
|
247
|
+
/** This event is triggered when the device went online. This means that it is discoverable in the network. */
|
|
248
|
+
serverNode.lifecycle.online.on(() => this.log.notice('Server is online'));
|
|
249
|
+
/** This event is triggered when the device went offline. it is not longer discoverable or connectable in the network. */
|
|
250
|
+
serverNode.lifecycle.offline.on(() => this.log.notice('Server is offline'));
|
|
251
|
+
/**
|
|
252
|
+
* This event is triggered when a fabric is added, removed or updated on the device. Use this if more granular
|
|
253
|
+
* information is needed.
|
|
254
|
+
*/
|
|
255
|
+
serverNode.events.commissioning.fabricsChanged.on((fabricIndex, fabricAction) => {
|
|
256
|
+
let action = '';
|
|
257
|
+
switch (fabricAction) {
|
|
258
|
+
case FabricAction.Added:
|
|
259
|
+
action = 'added';
|
|
260
|
+
break;
|
|
261
|
+
case FabricAction.Removed:
|
|
262
|
+
action = 'removed';
|
|
263
|
+
break;
|
|
264
|
+
case FabricAction.Updated:
|
|
265
|
+
action = 'updated';
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
this.log.notice(`Commissioned fabric index ${fabricIndex} ${action}`, serverNode.state.commissioning.fabrics[fabricIndex]);
|
|
269
|
+
});
|
|
270
|
+
/**
|
|
271
|
+
* This event is triggered when an operative new session was opened by a Controller.
|
|
272
|
+
* It is not triggered for the initial commissioning process, just afterwards for real connections.
|
|
273
|
+
*/
|
|
274
|
+
serverNode.events.sessions.opened.on((session) => this.log.notice('Session opened', session));
|
|
275
|
+
/**
|
|
276
|
+
* This event is triggered when an operative session is closed by a Controller or because the Device goes offline.
|
|
277
|
+
*/
|
|
278
|
+
serverNode.events.sessions.closed.on((session) => this.log.notice('Session closed', session));
|
|
279
|
+
/** This event is triggered when a subscription gets added or removed on an operative session. */
|
|
280
|
+
serverNode.events.sessions.subscriptionsChanged.on((session) => {
|
|
281
|
+
this.log.notice('Session subscriptions changed', session);
|
|
282
|
+
this.log.notice('Status of all sessions', serverNode.state.sessions.sessions);
|
|
283
|
+
});
|
|
284
|
+
return serverNode;
|
|
285
|
+
}
|
|
286
|
+
async showServerNodeQR(matterServerNode, storageContext) {
|
|
287
|
+
if (!matterServerNode || !storageContext)
|
|
288
|
+
return;
|
|
289
|
+
const node = await storageContext.get('storeId');
|
|
290
|
+
if (!matterServerNode.lifecycle.isCommissioned) {
|
|
291
|
+
this.log.notice(`${node} is not commissioned. Pair to commission ...`);
|
|
292
|
+
const { qrPairingCode, manualPairingCode } = matterServerNode.state.commissioning.pairingCodes;
|
|
293
|
+
// console.log(QrCode.get(qrPairingCode));
|
|
294
|
+
this.log.notice(`QR Code URL: https://project-chip.github.io/connectedhomeip/qrcode.html?data=${qrPairingCode}`);
|
|
295
|
+
this.log.notice(`Manual pairing code: ${manualPairingCode}`);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
this.log.notice(`${node} is already commissioned. Waiting for controllers to connect ...`);
|
|
299
|
+
this.log.notice('Fabrics:', matterServerNode.state.commissioning.fabrics);
|
|
300
|
+
for (const key in matterServerNode.state.commissioning.fabrics) {
|
|
301
|
+
const fabric = matterServerNode.state.commissioning.fabrics[FabricIndex(Number(key))];
|
|
302
|
+
this.log.notice(`- index ${fabric.fabricIndex} id ${fabric.fabricId} nodeId ${fabric.nodeId} rootVendor ${fabric.rootVendorId} rootNodeId ${fabric.rootNodeId}`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async startServerNode(matterServerNode) {
|
|
307
|
+
if (!matterServerNode)
|
|
308
|
+
return;
|
|
309
|
+
this.log.notice(`Starting ${matterServerNode.id} server node`);
|
|
310
|
+
await matterServerNode.start();
|
|
311
|
+
}
|
|
312
|
+
async stopServerNode(matterServerNode) {
|
|
313
|
+
if (!matterServerNode)
|
|
314
|
+
return;
|
|
315
|
+
this.log.notice(`Stopping ${matterServerNode.id} server node`);
|
|
316
|
+
await matterServerNode.close();
|
|
317
|
+
}
|
|
318
|
+
async createAggregatorNode(storageContext) {
|
|
319
|
+
this.log.notice(`Creating ${await storageContext.get('storeId')} aggregator `);
|
|
320
|
+
const aggregator = new Endpoint(AggregatorEndpoint, { id: `${await storageContext.get('storeId')} aggregator` });
|
|
321
|
+
return aggregator;
|
|
322
|
+
}
|
|
323
|
+
async createCommissioningServerContext(pluginName, deviceName, deviceType, vendorId, vendorName, productId, productName) {
|
|
324
|
+
if (hasParameter('debug'))
|
|
325
|
+
this.log.warn(`createCommissioningServerContext: ${pluginName} => createServerNodeContext`);
|
|
326
|
+
const storageContext = this.createServerNodeContext(pluginName, deviceName, deviceType, vendorId, vendorName, productId, productName);
|
|
327
|
+
return storageContext;
|
|
328
|
+
}
|
|
329
|
+
async importCommissioningServerContext(pluginName, device) {
|
|
330
|
+
if (hasParameter('debug'))
|
|
331
|
+
this.log.warn(`importCommissioningServerContext: ${pluginName} => createServerNodeContext`);
|
|
332
|
+
const basic = device.getClusterServer(BasicInformationCluster);
|
|
333
|
+
if (!basic)
|
|
334
|
+
throw new Error('BasicInformationCluster not found');
|
|
335
|
+
const storageContext = this.createServerNodeContext(pluginName, basic.getNodeLabelAttribute(), DeviceTypeId(device.deviceType), basic.getVendorIdAttribute(), basic.getVendorNameAttribute(), basic.getProductIdAttribute(), basic.getProductNameAttribute(), basic.attributes.serialNumber?.getLocal());
|
|
336
|
+
return storageContext;
|
|
337
|
+
}
|
|
338
|
+
async createCommisioningServer(context, pluginName) {
|
|
339
|
+
if (hasParameter('debug'))
|
|
340
|
+
this.log.warn(`createCommisioningServer: ${pluginName} => createServerNode`);
|
|
341
|
+
const port = this.port;
|
|
342
|
+
const serverNode = await this.createServerNode(context, this.port++, this.passcode ? this.passcode++ : 20242025, this.discriminator ? this.discriminator++ : 3840);
|
|
343
|
+
const commissioningServer = {
|
|
344
|
+
getPort: () => port,
|
|
345
|
+
addDevice: (device) => {
|
|
346
|
+
if (device instanceof Device) {
|
|
347
|
+
if (hasParameter('debug'))
|
|
348
|
+
this.log.warn('CommissioningServer.addDevice() => Device');
|
|
349
|
+
}
|
|
350
|
+
else if (device instanceof Aggregator) {
|
|
351
|
+
if (hasParameter('debug'))
|
|
352
|
+
this.log.warn('CommissioningServer.addDevice() => Aggregator');
|
|
353
|
+
const serverNode = this.csToMatterNode.get(pluginName)?.serverNode;
|
|
354
|
+
const aggregatorNode = this.agToMatterNode.get(pluginName)?.aggregatorNode;
|
|
355
|
+
if (!serverNode || !aggregatorNode)
|
|
356
|
+
return;
|
|
357
|
+
serverNode.add(aggregatorNode);
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
};
|
|
361
|
+
this.csToMatterNode.set(pluginName, { commissioningServer, serverNode });
|
|
362
|
+
return commissioningServer;
|
|
363
|
+
}
|
|
364
|
+
async createMatterAggregator(context, pluginName) {
|
|
365
|
+
if (hasParameter('debug'))
|
|
366
|
+
this.log.warn(`createMatterAggregator: ${pluginName} => createAggregatorNode`);
|
|
367
|
+
const aggregatorNode = await this.createAggregatorNode(context);
|
|
368
|
+
const aggregator = {
|
|
369
|
+
addBridgedDevice: (device) => {
|
|
370
|
+
if (hasParameter('debug'))
|
|
371
|
+
this.log.warn('Aggregator.addBridgedDevice() => not inplemented');
|
|
372
|
+
},
|
|
373
|
+
removeBridgedDevice: (device) => {
|
|
374
|
+
if (hasParameter('debug'))
|
|
375
|
+
this.log.warn('Aggregator.removeBridgedDevice() => not inplemented');
|
|
376
|
+
},
|
|
377
|
+
};
|
|
378
|
+
this.agToMatterNode.set(pluginName, { aggregator, aggregatorNode });
|
|
379
|
+
return aggregator;
|
|
380
|
+
}
|
|
381
|
+
async showCommissioningQRCode(commissioningServer, storageContext, nodeContext, pluginName) {
|
|
382
|
+
if (hasParameter('debug'))
|
|
383
|
+
this.log.warn(`showCommissioningQRCode: ${pluginName} => startServerNode`);
|
|
384
|
+
const serverNode = this.csToMatterNode.get(pluginName)?.serverNode;
|
|
385
|
+
if (!commissioningServer || !storageContext || !serverNode)
|
|
386
|
+
return;
|
|
387
|
+
await this.startServerNode(serverNode);
|
|
388
|
+
}
|
|
389
|
+
setCommissioningServerReachability(commissioningServer, reachable) {
|
|
390
|
+
if (hasParameter('debug'))
|
|
391
|
+
this.log.warn(`setCommissioningServerReachability() => do nothing`);
|
|
392
|
+
}
|
|
393
|
+
setAggregatorReachability(matterAggregator, reachable) {
|
|
394
|
+
if (hasParameter('debug'))
|
|
395
|
+
this.log.warn(`setAggregatorReachability() => do nothing`);
|
|
396
|
+
}
|
|
397
|
+
setDeviceReachability(device, reachable) {
|
|
398
|
+
if (hasParameter('debug'))
|
|
399
|
+
this.log.warn(`setDeviceReachability() => do nothing`);
|
|
400
|
+
}
|
|
401
|
+
async startController() {
|
|
402
|
+
if (hasParameter('debug'))
|
|
403
|
+
this.log.warn(`setDeviceReachability() => not inplemented`);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
// node dist/matterbridgeEdge.js MatterbridgeEdge -debug -ssl -frontend 443
|
|
407
|
+
if (process.argv.includes('MatterbridgeEdge')) {
|
|
408
|
+
const matterbridge = await MatterbridgeEdge.loadInstance(true);
|
|
409
|
+
process.on('SIGINT', async function () {
|
|
410
|
+
// eslint-disable-next-line no-console
|
|
411
|
+
console.log('Caught interrupt signal');
|
|
412
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
413
|
+
if (matterbridge)
|
|
414
|
+
await matterbridge.cleanup('shutting down...', false);
|
|
415
|
+
// if (matterbridge && matterbridge.matterServerNode && matterbridge.matterServerNodeContext) await matterbridge.stopServerNode(matterbridge.matterServerNode, matterbridge.matterServerNodeContext);
|
|
416
|
+
const exit = setTimeout(() => {
|
|
417
|
+
// eslint-disable-next-line no-console
|
|
418
|
+
console.log('Exiting after caught interrupt signal');
|
|
419
|
+
process.exit();
|
|
420
|
+
}, 10000);
|
|
421
|
+
exit.unref();
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
/*
|
|
425
|
+
async startBridgeNode(): Promise<void> {
|
|
426
|
+
this.log.notice(`Creating lightEndpoint1`);
|
|
427
|
+
const lightEndpoint1 = new Endpoint(OnOffLightDevice.with(BridgedDeviceBasicInformationServer), {
|
|
428
|
+
id: 'OnOffLight',
|
|
429
|
+
bridgedDeviceBasicInformation: {
|
|
430
|
+
vendorId: VendorId(await storageContext.get<number>('vendorId')),
|
|
431
|
+
vendorName: await storageContext.get<string>('vendorName'),
|
|
432
|
+
|
|
433
|
+
productName: 'Light',
|
|
434
|
+
productLabel: 'Light',
|
|
435
|
+
nodeLabel: 'Light',
|
|
436
|
+
|
|
437
|
+
serialNumber: 'SN 0x123456789',
|
|
438
|
+
uniqueId: '0x123456789',
|
|
439
|
+
reachable: true,
|
|
440
|
+
},
|
|
441
|
+
});
|
|
442
|
+
this.log.notice(`Adding lightEndpoint1 to ${await storageContext.get<string>('storeId')} aggregator`);
|
|
443
|
+
await this.matterAggregatorNode.add(lightEndpoint1);
|
|
444
|
+
// logEndpoint(EndpointServer.forEndpoint(lightEndpoint1));
|
|
445
|
+
|
|
446
|
+
this.log.notice(`Creating switchEnpoint2`);
|
|
447
|
+
const switchEnpoint2 = new Endpoint(GenericSwitchDevice.with(BridgedDeviceBasicInformationServer, SwitchServer.with('MomentarySwitch', 'MomentarySwitchLongPress', 'MomentarySwitchMultiPress', 'MomentarySwitchRelease')), {
|
|
448
|
+
id: 'GenericSwitch',
|
|
449
|
+
bridgedDeviceBasicInformation: {
|
|
450
|
+
vendorId: VendorId(await storageContext.get<number>('vendorId')),
|
|
451
|
+
vendorName: await storageContext.get<string>('vendorName'),
|
|
452
|
+
|
|
453
|
+
productName: 'GenericSwitch',
|
|
454
|
+
productLabel: 'GenericSwitch',
|
|
455
|
+
nodeLabel: 'GenericSwitch',
|
|
456
|
+
|
|
457
|
+
serialNumber: 'SN 0x123456739',
|
|
458
|
+
uniqueId: '0x123456739',
|
|
459
|
+
reachable: true,
|
|
460
|
+
},
|
|
461
|
+
switch: {
|
|
462
|
+
numberOfPositions: 2,
|
|
463
|
+
currentPosition: 0,
|
|
464
|
+
multiPressMax: 2,
|
|
465
|
+
},
|
|
466
|
+
});
|
|
467
|
+
this.log.notice(`Adding switchEnpoint2 to ${await storageContext.get<string>('storeId')} aggregator`);
|
|
468
|
+
await this.matterAggregatorNode.add(switchEnpoint2);
|
|
469
|
+
// logEndpoint(EndpointServer.forEndpoint(switchEnpoint2));
|
|
470
|
+
|
|
471
|
+
// switchEnpoint2.events.identify.startIdentifying.on(() => this.log.notice('GenericSwitch.identify logic, ideally blink a light every 0.5s ...'));
|
|
472
|
+
// switchEnpoint2.events.switch.currentPosition$Changed.on(() => this.log.notice('GenericSwitch.currentPosition changed ...'));
|
|
473
|
+
// switchEnpoint2.act((agent) => agent.switch.events.initialPress.emit({ newPosition: 1 }, agent.context));
|
|
474
|
+
// switchEnpoint2.events.switch.emit('initialPress', { newPosition: 1 }, switchEnpoint2.events.switch.context);
|
|
475
|
+
*/
|
|
476
|
+
/*
|
|
477
|
+
log.notice(`Creating matterbridge device ClimateSensor`);
|
|
478
|
+
const matterbridgeDevice3 = new MatterbridgeDeviceV8(DeviceTypes.TEMPERATURE_SENSOR, { uniqueStorageKey: 'ClimateSensor' });
|
|
479
|
+
matterbridgeDevice3.addDeviceTypeWithClusterServer([DeviceTypes.TEMPERATURE_SENSOR], [TemperatureMeasurement.Cluster.id]);
|
|
480
|
+
matterbridgeDevice3.addDeviceTypeWithClusterServer([DeviceTypes.HUMIDITY_SENSOR], [RelativeHumidityMeasurement.Cluster.id]);
|
|
481
|
+
matterbridgeDevice3.addDeviceTypeWithClusterServer([DeviceTypes.PRESSURE_SENSOR], [PressureMeasurement.Cluster.id]);
|
|
482
|
+
matterbridgeDevice3.behaviors.require(IdentifyServer, {
|
|
483
|
+
identifyTime: 5,
|
|
484
|
+
});
|
|
485
|
+
matterbridgeDevice3.behaviors.require(TemperatureMeasurementServer, {
|
|
486
|
+
measuredValue: 25.0,
|
|
487
|
+
minMeasuredValue: null,
|
|
488
|
+
maxMeasuredValue: null,
|
|
489
|
+
});
|
|
490
|
+
*/
|
|
491
|
+
/*
|
|
492
|
+
log.notice(`Adding BridgedDeviceBasicInformationServer to ClimateSensor`);
|
|
493
|
+
matterbridgeDevice3.behaviors.require(BridgedDeviceBasicInformationServer, {
|
|
494
|
+
vendorId: VendorId(await storageContext.get<number>('vendorId')),
|
|
495
|
+
vendorName: await storageContext.get<string>('vendorName'),
|
|
496
|
+
|
|
497
|
+
productName: 'ClimateSensor',
|
|
498
|
+
productLabel: 'ClimateSensor',
|
|
499
|
+
nodeLabel: 'ClimateSensor',
|
|
500
|
+
|
|
501
|
+
serialNumber: '0x145433356739',
|
|
502
|
+
uniqueId: '0x1254446739',
|
|
503
|
+
reachable: true,
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
log.notice(`Adding DescriptorServer to ClimateSensor`);
|
|
507
|
+
matterbridgeDevice3.behaviors.require(DescriptorServer, {
|
|
508
|
+
deviceTypeList: [
|
|
509
|
+
{ deviceType: 0x0302, revision: 2 },
|
|
510
|
+
{ deviceType: 0x0307, revision: 2 },
|
|
511
|
+
{ deviceType: 0x0305, revision: 2 },
|
|
512
|
+
],
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
this.log.notice(`Adding ClimateSensor to ${await storageContext.get<string>('storeId')} aggregator`);
|
|
516
|
+
await this.matterAggregator.add(matterbridgeDevice3);
|
|
517
|
+
logEndpoint(EndpointServer.forEndpoint(matterbridgeDevice3));
|
|
518
|
+
*/
|
|
519
|
+
/*
|
|
520
|
+
await lightEndpoint1.set({
|
|
521
|
+
onOff: {
|
|
522
|
+
onOff: true,
|
|
523
|
+
},
|
|
524
|
+
});
|
|
525
|
+
await switchEnpoint2.set({
|
|
526
|
+
switch: {
|
|
527
|
+
currentPosition: 1,
|
|
528
|
+
},
|
|
529
|
+
});
|
|
530
|
+
switchEnpoint2.act((agent) => agent.switch.events.initialPress.emit({ newPosition: 1 }, agent.context));
|
|
531
|
+
*/
|
|
532
|
+
/*
|
|
533
|
+
await matterbridgeDevice3.set({
|
|
534
|
+
temperatureMeasurement: {
|
|
535
|
+
measuredValue: 20 * 100,
|
|
536
|
+
},
|
|
537
|
+
relativeHumidityMeasurement: {
|
|
538
|
+
measuredValue: 50 * 100,
|
|
539
|
+
},
|
|
540
|
+
});
|
|
541
|
+
*/
|
|
542
|
+
// logEndpoint(EndpointServer.forEndpoint(this.matterServerNode));
|
|
543
|
+
/*
|
|
544
|
+
logEndpoint(EndpointServer.forEndpoint(this.matterServerNode));
|
|
545
|
+
logEndpoint(EndpointServer.forEndpoint(matterbridgeDevice3));
|
|
546
|
+
console.log('matterbridgeDevice3\n', matterbridgeDevice3);
|
|
547
|
+
console.log('matterbridgeDevice3.events\n', matterbridgeDevice3.events);
|
|
548
|
+
console.log('matterbridgeDevice3.events.identify\n', matterbridgeDevice3.eventsOf(IdentifyServer));
|
|
549
|
+
console.log('matterbridgeDevice3.state\n', matterbridgeDevice3.state);
|
|
550
|
+
console.log('matterbridgeDevice3.state.temperatureMeasurement\n', matterbridgeDevice3.stateOf(TemperatureMeasurementServer));
|
|
551
|
+
// matterbridgeDevice3.eventsOf(IdentifyServer);
|
|
552
|
+
// matterbridgeDevice3.events.identify.startIdentifying.on(() => log.notice('Run identify logic, ideally blink a light every 0.5s ...'));
|
|
553
|
+
}
|
|
554
|
+
*/
|
|
555
|
+
//# sourceMappingURL=matterbridgeEdge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matterbridgeEdge.js","sourceRoot":"","sources":["../src/matterbridgeEdge.ts"],"names":[],"mappings":"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"}
|