@matterbridge/core 3.8.0-dev-20260531-fafe993 → 3.8.0-dev-20260602-c7525fb

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.
@@ -1,13 +1,13 @@
1
1
  import '@matter/nodejs';
2
2
  import EventEmitter from 'node:events';
3
- import { Diagnostic, StorageContext, StorageManager, StorageService } from '@matter/general';
4
- import { Endpoint, ServerNode, SessionsBehavior } from '@matter/node';
3
+ import { type Diagnostic, type StorageContext, type StorageManager, StorageService } from '@matter/general';
4
+ import { Endpoint, ServerNode, type SessionsBehavior } from '@matter/node';
5
5
  import { AggregatorEndpoint } from '@matter/node/endpoints/aggregator';
6
- import { DeviceCertification, ExposedFabricInformation, MdnsService } from '@matter/protocol';
6
+ import { type DeviceCertification, type ExposedFabricInformation, MdnsService } from '@matter/protocol';
7
7
  import { DeviceTypeId, VendorId } from '@matter/types';
8
8
  import type { ApiMatter, PluginName, SanitizedExposedFabricInformation, SanitizedSession, SharedMatterbridge, WorkerMessage } from '@matterbridge/types';
9
9
  import type { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
10
- import { Plugin, PluginManager } from './pluginManager.js';
10
+ import { type Plugin, PluginManager } from './pluginManager.js';
11
11
  interface MatterEvents {
12
12
  ready: [nodeId: string];
13
13
  online: [nodeId: string];
@@ -33,7 +33,7 @@ export declare class MatterNode extends EventEmitter<MatterEvents> {
33
33
  passcode: number | undefined;
34
34
  discriminator: number | undefined;
35
35
  certification: DeviceCertification.Configuration | undefined;
36
- serverNode: ServerNode<ServerNode.RootEndpoint> | undefined;
36
+ serverNode: ServerNode | undefined;
37
37
  aggregatorNode: Endpoint<AggregatorEndpoint> | undefined;
38
38
  aggregatorVendorId: VendorId;
39
39
  aggregatorVendorName: string;
@@ -59,15 +59,15 @@ export declare class MatterNode extends EventEmitter<MatterEvents> {
59
59
  backupMatterStorage(storageName: string, backupName: string): Promise<void>;
60
60
  stopMatterStorage(): Promise<void>;
61
61
  createServerNodeContext(storeId: string, deviceName: string, deviceType: DeviceTypeId, vendorId: VendorId, vendorName: string, productId: number, productName: string, serialNumber?: string, uniqueId?: string): Promise<StorageContext>;
62
- createServerNode(port?: number, passcode?: number, discriminator?: number): Promise<ServerNode<ServerNode.RootEndpoint>>;
63
- getServerNodeData(serverNode: ServerNode<ServerNode.RootEndpoint>): ApiMatter;
62
+ createServerNode(port?: number, passcode?: number, discriminator?: number): Promise<ServerNode>;
63
+ getServerNodeData(serverNode: ServerNode): ApiMatter;
64
64
  startServerNode(timeout?: number): Promise<void>;
65
65
  stopServerNode(timeout?: number): Promise<void>;
66
66
  createAggregatorNode(): Promise<Endpoint<AggregatorEndpoint>>;
67
- createMatterbridgeServerNode(): Promise<ServerNode<ServerNode.RootEndpoint>>;
68
- createAccessoryPlugin(plugin: Plugin | PluginName, device: MatterbridgeEndpoint): Promise<ServerNode<ServerNode.RootEndpoint> | undefined>;
69
- createDynamicPlugin(plugin: Plugin | PluginName): Promise<ServerNode<ServerNode.RootEndpoint> | undefined>;
70
- createDeviceServerNode(plugin: Plugin | PluginName, device: MatterbridgeEndpoint): Promise<ServerNode<ServerNode.RootEndpoint> | undefined>;
67
+ createMatterbridgeServerNode(): Promise<ServerNode>;
68
+ createAccessoryPlugin(plugin: Plugin | PluginName, device: MatterbridgeEndpoint): Promise<ServerNode | undefined>;
69
+ createDynamicPlugin(plugin: Plugin | PluginName): Promise<ServerNode | undefined>;
70
+ createDeviceServerNode(plugin: Plugin | PluginName, device: MatterbridgeEndpoint): Promise<ServerNode | undefined>;
71
71
  addBridgedEndpoint(pluginName: string, device: MatterbridgeEndpoint): Promise<MatterbridgeEndpoint | undefined>;
72
72
  removeBridgedEndpoint(pluginName: string, device: MatterbridgeEndpoint): Promise<MatterbridgeEndpoint | undefined>;
73
73
  removeAllBridgedEndpoints(pluginName: string, delay?: number): Promise<void>;
@@ -158,7 +158,7 @@ export class MatterNode extends EventEmitter {
158
158
  });
159
159
  this.pluginManager.matterbridge.nodeContext = await this.pluginManager.matterbridge.nodeStorage.createStorage('matterbridge');
160
160
  await this.pluginManager.loadFromStorage();
161
- if (this.pluginName && this.device && this.device.deviceName) {
161
+ if (this.pluginName && this.device?.deviceName) {
162
162
  this.log.debug(`Creating MatterNode instance for server node device ${CYAN}${this.device.deviceName}${db}...`);
163
163
  await this.createDeviceServerNode(this.pluginName, this.device);
164
164
  this.log.debug(`Created MatterNode instance for server node device ${CYAN}${this.device.deviceName}${db}`);
@@ -193,7 +193,7 @@ export class MatterNode extends EventEmitter {
193
193
  if (!this.serverNode && !this.pluginName)
194
194
  throw new Error('Matter server node not created yet. Call create() first.');
195
195
  this.log.info('Starting MatterNode...');
196
- if (this.pluginName && this.device && this.device.deviceName) {
196
+ if (this.pluginName && this.device?.deviceName) {
197
197
  this.log.debug(`Starting MatterNode for server device ${this.pluginName}:${this.device.deviceName}...`);
198
198
  await this.startServerNode();
199
199
  this.log.debug(`Started MatterNode for server device ${this.pluginName}:${this.device.deviceName}`);
@@ -237,7 +237,7 @@ export class MatterNode extends EventEmitter {
237
237
  if (!this.serverNode)
238
238
  throw new Error('Matter server node not created yet. Call create() first.');
239
239
  this.log.info('Stopping MatterNode...');
240
- if (this.pluginName && this.device && this.device.deviceName) {
240
+ if (this.pluginName && this.device?.deviceName) {
241
241
  this.log.debug(`Stopping MatterNode for server device ${this.pluginName}:${this.device.deviceName}...`);
242
242
  await this.stopServerNode();
243
243
  this.serverNode = undefined;
@@ -537,7 +537,7 @@ export class MatterNode extends EventEmitter {
537
537
  throw new Error('Matter server node context not created yet. Call createServerNodeContext() first.');
538
538
  }
539
539
  this.log.notice(`Creating ${await this.matterStorageContext.get('storeId')} aggregator...`);
540
- const aggregatorNode = new Endpoint(AggregatorEndpoint, { id: `${await this.matterStorageContext.get('storeId')}` });
540
+ const aggregatorNode = new Endpoint(AggregatorEndpoint, { id: await this.matterStorageContext.get('storeId') });
541
541
  this.log.info(`Created ${await this.matterStorageContext.get('storeId')} aggregator`);
542
542
  return aggregatorNode;
543
543
  }
@@ -785,7 +785,7 @@ export class MatterNode extends EventEmitter {
785
785
  return true;
786
786
  }
787
787
  async subscribeAttributeChanged(plugin, device) {
788
- if (!plugin || !device || !device.plugin || !device.serialNumber || !device.uniqueId || !device.maybeNumber)
788
+ if (!plugin || !device?.plugin || !device.serialNumber || !device.uniqueId || !device.maybeNumber)
789
789
  return;
790
790
  this.log.debug(`Subscribing attributes for endpoint ${plg}${plugin.name}${db}:${dev}${device.deviceName}${db}:${or}${device.id}${db}:${or}${device.number}${db} (${zb}${device.name}${db})`);
791
791
  if (this.matterbridge.bridgeMode === 'childbridge' && plugin.type === 'AccessoryPlatform' && this.serverNode) {
@@ -94,6 +94,8 @@ import { TemperatureControl } from '@matter/types/clusters/temperature-control';
94
94
  import { TemperatureMeasurement } from '@matter/types/clusters/temperature-measurement';
95
95
  import { Thermostat } from '@matter/types/clusters/thermostat';
96
96
  import { ThermostatUserInterfaceConfiguration } from '@matter/types/clusters/thermostat-user-interface-configuration';
97
+ import { TlsCertificateManagement } from '@matter/types/clusters/tls-certificate-management';
98
+ import { TlsClientManagement } from '@matter/types/clusters/tls-client-management';
97
99
  import { TotalVolatileOrganicCompoundsConcentrationMeasurement } from '@matter/types/clusters/total-volatile-organic-compounds-concentration-measurement';
98
100
  import { UserLabel } from '@matter/types/clusters/user-label';
99
101
  import { ValveConfigurationAndControl } from '@matter/types/clusters/valve-configuration-and-control';
@@ -169,8 +171,8 @@ export const OTAProvider = DeviceTypeDefinition({
169
171
  revision: 1,
170
172
  requiredServerClusters: [OtaSoftwareUpdateProvider.id],
171
173
  optionalServerClusters: [],
172
- requiredClientClusters: [OtaSoftwareUpdateRequestor.id],
173
- optionalClientClusters: [],
174
+ requiredClientClusters: [],
175
+ optionalClientClusters: [OtaSoftwareUpdateRequestor.id],
174
176
  });
175
177
  export const bridgedNode = DeviceTypeDefinition({
176
178
  name: 'MA-bridgedNode',
@@ -195,6 +197,8 @@ export const deviceEnergyManagement = DeviceTypeDefinition({
195
197
  revision: 3,
196
198
  requiredServerClusters: [DeviceEnergyManagement.id],
197
199
  optionalServerClusters: [DeviceEnergyManagementMode.id],
200
+ requiredClientClusters: [],
201
+ optionalClientClusters: [ElectricalGridConditions.id],
198
202
  });
199
203
  export const onOffLight = DeviceTypeDefinition({
200
204
  name: 'MA-onofflight',
@@ -203,6 +207,8 @@ export const onOffLight = DeviceTypeDefinition({
203
207
  revision: 3,
204
208
  requiredServerClusters: [Identify.id, Groups.id, ScenesManagement.id, OnOff.id],
205
209
  optionalServerClusters: [LevelControl.id],
210
+ requiredClientClusters: [],
211
+ optionalClientClusters: [OccupancySensing.id],
206
212
  });
207
213
  export const dimmableLight = DeviceTypeDefinition({
208
214
  name: 'MA-dimmablelight',
@@ -211,6 +217,8 @@ export const dimmableLight = DeviceTypeDefinition({
211
217
  revision: 3,
212
218
  requiredServerClusters: [Identify.id, Groups.id, ScenesManagement.id, OnOff.id, LevelControl.id],
213
219
  optionalServerClusters: [],
220
+ requiredClientClusters: [],
221
+ optionalClientClusters: [OccupancySensing.id],
214
222
  });
215
223
  export const colorTemperatureLight = DeviceTypeDefinition({
216
224
  name: 'MA-colortemperaturelight',
@@ -219,6 +227,8 @@ export const colorTemperatureLight = DeviceTypeDefinition({
219
227
  revision: 4,
220
228
  requiredServerClusters: [Identify.id, Groups.id, ScenesManagement.id, OnOff.id, LevelControl.id, ColorControl.id],
221
229
  optionalServerClusters: [],
230
+ requiredClientClusters: [],
231
+ optionalClientClusters: [OccupancySensing.id],
222
232
  });
223
233
  export const extendedColorLight = DeviceTypeDefinition({
224
234
  name: 'MA-extendedcolorlight',
@@ -227,6 +237,8 @@ export const extendedColorLight = DeviceTypeDefinition({
227
237
  revision: 4,
228
238
  requiredServerClusters: [Identify.id, Groups.id, ScenesManagement.id, OnOff.id, LevelControl.id, ColorControl.id],
229
239
  optionalServerClusters: [],
240
+ requiredClientClusters: [],
241
+ optionalClientClusters: [OccupancySensing.id],
230
242
  });
231
243
  export const onOffOutlet = DeviceTypeDefinition({
232
244
  name: 'MA-onoffpluginunit',
@@ -235,6 +247,8 @@ export const onOffOutlet = DeviceTypeDefinition({
235
247
  revision: 4,
236
248
  requiredServerClusters: [Identify.id, Groups.id, ScenesManagement.id, OnOff.id],
237
249
  optionalServerClusters: [LevelControl.id],
250
+ requiredClientClusters: [],
251
+ optionalClientClusters: [OccupancySensing.id],
238
252
  });
239
253
  export const dimmableOutlet = DeviceTypeDefinition({
240
254
  name: 'MA-dimmablepluginunit',
@@ -243,6 +257,8 @@ export const dimmableOutlet = DeviceTypeDefinition({
243
257
  revision: 5,
244
258
  requiredServerClusters: [Identify.id, Groups.id, ScenesManagement.id, OnOff.id, LevelControl.id],
245
259
  optionalServerClusters: [],
260
+ requiredClientClusters: [],
261
+ optionalClientClusters: [OccupancySensing.id],
246
262
  });
247
263
  export const onOffMountedSwitch = DeviceTypeDefinition({
248
264
  name: 'MA-onoffmountedswitch',
@@ -251,6 +267,8 @@ export const onOffMountedSwitch = DeviceTypeDefinition({
251
267
  revision: 2,
252
268
  requiredServerClusters: [Identify.id, Groups.id, ScenesManagement.id, OnOff.id],
253
269
  optionalServerClusters: [LevelControl.id],
270
+ requiredClientClusters: [],
271
+ optionalClientClusters: [OccupancySensing.id],
254
272
  });
255
273
  export const dimmableMountedSwitch = DeviceTypeDefinition({
256
274
  name: 'MA-dimmablemountedswitch',
@@ -259,6 +277,8 @@ export const dimmableMountedSwitch = DeviceTypeDefinition({
259
277
  revision: 2,
260
278
  requiredServerClusters: [Identify.id, Groups.id, ScenesManagement.id, OnOff.id, LevelControl.id],
261
279
  optionalServerClusters: [],
280
+ requiredClientClusters: [],
281
+ optionalClientClusters: [OccupancySensing.id],
262
282
  });
263
283
  export const pumpDevice = DeviceTypeDefinition({
264
284
  name: 'MA-pump',
@@ -267,6 +287,8 @@ export const pumpDevice = DeviceTypeDefinition({
267
287
  revision: 3,
268
288
  requiredServerClusters: [OnOff.id, PumpConfigurationAndControl.id, Identify.id],
269
289
  optionalServerClusters: [LevelControl.id, Groups.id, ScenesManagement.id, TemperatureMeasurement.id, PressureMeasurement.id, FlowMeasurement.id],
290
+ requiredClientClusters: [],
291
+ optionalClientClusters: [TemperatureMeasurement.id, PressureMeasurement.id, FlowMeasurement.id, OccupancySensing.id],
270
292
  });
271
293
  export const waterValve = DeviceTypeDefinition({
272
294
  name: 'MA-waterValve',
@@ -275,6 +297,8 @@ export const waterValve = DeviceTypeDefinition({
275
297
  revision: 1,
276
298
  requiredServerClusters: [Identify.id, ValveConfigurationAndControl.id],
277
299
  optionalServerClusters: [FlowMeasurement.id],
300
+ requiredClientClusters: [],
301
+ optionalClientClusters: [FlowMeasurement.id],
278
302
  });
279
303
  export const onOffSwitch = DeviceTypeDefinition({
280
304
  name: 'MA-onoffswitch',
@@ -282,7 +306,9 @@ export const onOffSwitch = DeviceTypeDefinition({
282
306
  deviceClass: DeviceClasses.Simple,
283
307
  revision: 3,
284
308
  requiredServerClusters: [Identify.id, OnOff.id],
285
- optionalServerClusters: [Groups.id, ScenesManagement.id],
309
+ optionalServerClusters: [],
310
+ requiredClientClusters: [Identify.id, OnOff.id],
311
+ optionalClientClusters: [Groups.id, ScenesManagement.id],
286
312
  });
287
313
  export const dimmableSwitch = DeviceTypeDefinition({
288
314
  name: 'MA-dimmableswitch',
@@ -290,7 +316,9 @@ export const dimmableSwitch = DeviceTypeDefinition({
290
316
  deviceClass: DeviceClasses.Simple,
291
317
  revision: 3,
292
318
  requiredServerClusters: [Identify.id, OnOff.id, LevelControl.id],
293
- optionalServerClusters: [Groups.id, ScenesManagement.id],
319
+ optionalServerClusters: [],
320
+ requiredClientClusters: [Identify.id, OnOff.id, LevelControl.id],
321
+ optionalClientClusters: [Groups.id, ScenesManagement.id],
294
322
  });
295
323
  export const colorTemperatureSwitch = DeviceTypeDefinition({
296
324
  name: 'MA-colortemperatureswitch',
@@ -298,7 +326,9 @@ export const colorTemperatureSwitch = DeviceTypeDefinition({
298
326
  deviceClass: DeviceClasses.Simple,
299
327
  revision: 3,
300
328
  requiredServerClusters: [Identify.id, OnOff.id, LevelControl.id, ColorControl.id],
301
- optionalServerClusters: [Groups.id, ScenesManagement.id],
329
+ optionalServerClusters: [],
330
+ requiredClientClusters: [Identify.id, OnOff.id, LevelControl.id, ColorControl.id],
331
+ optionalClientClusters: [Groups.id, ScenesManagement.id],
302
332
  });
303
333
  export const genericSwitch = DeviceTypeDefinition({
304
334
  name: 'MA-genericswitch',
@@ -436,6 +466,8 @@ export const thermostatDevice = DeviceTypeDefinition({
436
466
  revision: 5,
437
467
  requiredServerClusters: [Identify.id, Thermostat.id],
438
468
  optionalServerClusters: [Groups.id, ThermostatUserInterfaceConfiguration.id, EnergyPreference.id],
469
+ requiredClientClusters: [],
470
+ optionalClientClusters: [FanControl.id, TemperatureMeasurement.id, RelativeHumidityMeasurement.id, OccupancySensing.id],
439
471
  });
440
472
  export const fanDevice = DeviceTypeDefinition({
441
473
  name: 'MA-fan',
@@ -655,7 +687,9 @@ export const heatPump = DeviceTypeDefinition({
655
687
  deviceClass: DeviceClasses.Simple,
656
688
  revision: 1,
657
689
  requiredServerClusters: [],
658
- optionalServerClusters: [Identify.id, Thermostat.id],
690
+ optionalServerClusters: [Identify.id],
691
+ requiredClientClusters: [],
692
+ optionalClientClusters: [Thermostat.id],
659
693
  });
660
694
  export const soilSensor = DeviceTypeDefinition({
661
695
  name: 'MA-soilSensor',
@@ -810,8 +844,9 @@ export const cameraController = DeviceTypeDefinition({
810
844
  ZoneManagement.id,
811
845
  CameraAvStreamManagement.id,
812
846
  CameraAvSettingsUserLevelManagement.id,
813
- WebRtcTransportRequestor.id,
814
847
  PushAvStreamTransport.id,
848
+ TlsCertificateManagement.id,
849
+ TlsClientManagement.id,
815
850
  ],
816
851
  });
817
852
  export const doorbell = DeviceTypeDefinition({
@@ -117,6 +117,7 @@ export declare class MatterbridgeEndpoint extends Endpoint {
117
117
  invokeBehaviorCommand<T extends Behavior.Type, C extends BehaviorCommandName<T>>(cluster: T, command: C, params?: BehaviorCommandParams<T, C>): Promise<void>;
118
118
  invokeBehaviorCommand<T extends ClusterType, C extends ClusterCommandName<T>>(cluster: T, command: C, params?: ClusterCommandParams<T, C>): Promise<void>;
119
119
  invokeBehaviorCommand(cluster: ClusterId | string, command: CommandHandlers, params?: Record<string, boolean | number | bigint | string | object | null>): Promise<void>;
120
+ addRequiredClusters(): MatterbridgeEndpoint;
120
121
  addRequiredClusterServers(): MatterbridgeEndpoint;
121
122
  addOptionalClusterServers(): MatterbridgeEndpoint;
122
123
  addRequiredClusterClients(): MatterbridgeEndpoint;
@@ -268,6 +268,11 @@ export class MatterbridgeEndpoint extends Endpoint {
268
268
  async invokeBehaviorCommand(cluster, command, params) {
269
269
  await invokeBehaviorCommand(this, cluster, command, params);
270
270
  }
271
+ addRequiredClusters() {
272
+ addRequiredClusterServers(this);
273
+ addRequiredClusterClients(this);
274
+ return this;
275
+ }
271
276
  addRequiredClusterServers() {
272
277
  addRequiredClusterServers(this);
273
278
  return this;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/core",
3
- "version": "3.8.0-dev-20260531-fafe993",
3
+ "version": "3.8.0-dev-20260602-c7525fb",
4
4
  "description": "Matterbridge core library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -130,10 +130,10 @@
130
130
  ],
131
131
  "dependencies": {
132
132
  "@matter/main": "0.17.0",
133
- "@matterbridge/dgram": "3.8.0-dev-20260531-fafe993",
134
- "@matterbridge/thread": "3.8.0-dev-20260531-fafe993",
135
- "@matterbridge/types": "3.8.0-dev-20260531-fafe993",
136
- "@matterbridge/utils": "3.8.0-dev-20260531-fafe993",
133
+ "@matterbridge/dgram": "3.8.0-dev-20260602-c7525fb",
134
+ "@matterbridge/thread": "3.8.0-dev-20260602-c7525fb",
135
+ "@matterbridge/types": "3.8.0-dev-20260602-c7525fb",
136
+ "@matterbridge/utils": "3.8.0-dev-20260602-c7525fb",
137
137
  "escape-html": "1.0.3",
138
138
  "express": "5.2.1",
139
139
  "express-rate-limit": "8.5.2",