@matterbridge/core 3.10.6-dev-20260819-1fbaf31 → 3.10.6-dev-20260820-36b52be

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.
@@ -3,6 +3,8 @@ import { Status, StatusResponseError } from '@matter/types';
3
3
  import { FanControl } from '@matter/types/clusters/fan-control';
4
4
  import { getEnumDescription } from '@matterbridge/utils/enum';
5
5
  import { MatterbridgeServer } from './matterbridgeServer.js';
6
+ const lookupStepDirection = ['Increase', 'Decrease'];
7
+ const lookupFanMode = ['Off', 'Low', 'Medium', 'High', 'On', 'Auto', 'Auto', 'Smart'];
6
8
  const supportedFanModesBySequence = {
7
9
  [FanControl.FanModeSequence.OffLowMedHigh]: new Set([FanControl.FanMode.Off, FanControl.FanMode.Low, FanControl.FanMode.Medium, FanControl.FanMode.High]),
8
10
  [FanControl.FanModeSequence.OffLowHigh]: new Set([FanControl.FanMode.Off, FanControl.FanMode.Low, FanControl.FanMode.High]),
@@ -67,12 +69,15 @@ export class MatterbridgeFanControlServer extends FanControlServer.with(FanContr
67
69
  return result;
68
70
  }
69
71
  #handleFanModeChanging(fanMode) {
72
+ const device = this.endpoint.stateOf(MatterbridgeServer);
70
73
  if (fanMode === FanControl.FanMode.On) {
71
74
  this.state.fanMode = FanControl.FanMode.High;
75
+ device.log.debug(`handleFanModeChanging fanMode changed to ${lookupFanMode[fanMode]} >>> fanMode ${lookupFanMode[this.state.fanMode]} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
72
76
  return;
73
77
  }
74
78
  if (fanMode === FanControl.FanMode.Smart) {
75
79
  this.state.fanMode = this.features.auto ? FanControl.FanMode.Auto : FanControl.FanMode.High;
80
+ device.log.debug(`handleFanModeChanging fanMode changed to ${lookupFanMode[fanMode]} >>> fanMode ${lookupFanMode[this.state.fanMode]} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
76
81
  return;
77
82
  }
78
83
  if (!supportedFanModesBySequence[this.state.fanModeSequence].has(fanMode)) {
@@ -89,24 +94,33 @@ export class MatterbridgeFanControlServer extends FanControlServer.with(FanContr
89
94
  this.state.speedCurrent = 0;
90
95
  }
91
96
  });
97
+ device.log.debug(`handleFanModeChanging fanMode changed to ${lookupFanMode[fanMode]} >>> percentSetting ${this.state.percentSetting} percentCurrent ${this.state.percentCurrent} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
98
+ if (this.features.multiSpeed) {
99
+ device.log.debug(`handleFanModeChanging fanMode changed to ${lookupFanMode[fanMode]} >>> speedSetting ${this.state.speedSetting} speedCurrent ${this.state.speedCurrent} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
100
+ }
92
101
  }
93
102
  else if (fanMode === FanControl.FanMode.Auto) {
94
103
  this.state.percentSetting = null;
95
104
  if (this.features.multiSpeed) {
96
105
  this.state.speedSetting = null;
106
+ device.log.debug(`handleFanModeChanging fanMode changed to ${lookupFanMode[fanMode]} >>> speedSetting ${this.state.speedSetting} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
97
107
  }
108
+ device.log.debug(`handleFanModeChanging fanMode changed to ${lookupFanMode[fanMode]} >>> percentSetting ${this.state.percentSetting} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
98
109
  }
99
110
  else {
100
111
  const resolved = resolvePercentSettingForFanMode(fanMode, this.state.percentSetting, this.state.fanModeSequence);
101
112
  if (resolved !== this.state.percentSetting)
102
113
  this.state.percentSetting = resolved;
114
+ device.log.debug(`handleFanModeChanging fanMode changed to ${lookupFanMode[fanMode]} >>> percentSetting ${this.state.percentSetting} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
103
115
  }
104
116
  }
105
117
  #handlePercentSettingChanging(percentSetting, oldPercentSetting) {
118
+ const device = this.endpoint.stateOf(MatterbridgeServer);
106
119
  if (percentSetting === null) {
107
120
  if (this.state.fanMode === FanControl.FanMode.Auto)
108
121
  return;
109
122
  this.state.percentSetting = oldPercentSetting;
123
+ device.log.debug(`handlePercentSettingChanging percentSetting changed to ${percentSetting} >>> fanMode ${lookupFanMode[this.state.fanMode]} percentSetting ${this.state.percentSetting} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
110
124
  return;
111
125
  }
112
126
  const fanMode = percentSetting === 0 ? FanControl.FanMode.Off : percentToFanMode(percentSetting, this.state.fanModeSequence);
@@ -116,13 +130,16 @@ export class MatterbridgeFanControlServer extends FanControlServer.with(FanContr
116
130
  const state = this.state;
117
131
  state.speedSetting = speedSettingForPercent(state.speedMax, percentSetting);
118
132
  }
133
+ device.log.debug(`handlePercentSettingChanging percentSetting changed to ${percentSetting} >>> fanMode ${lookupFanMode[this.state.fanMode]} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
119
134
  }
120
135
  #handleSpeedSettingChanging(speedSetting, oldSpeedSetting) {
136
+ const device = this.endpoint.stateOf(MatterbridgeServer);
121
137
  const state = this.state;
122
138
  if (speedSetting === null) {
123
139
  if (this.state.fanMode === FanControl.FanMode.Auto)
124
140
  return;
125
141
  state.speedSetting = oldSpeedSetting;
142
+ device.log.debug(`handleSpeedSettingChanging speedSetting changed to ${speedSetting} >>> fanMode ${lookupFanMode[this.state.fanMode]} speedSetting ${state.speedSetting} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
126
143
  return;
127
144
  }
128
145
  const { percentSetting } = this.state;
@@ -134,9 +151,9 @@ export class MatterbridgeFanControlServer extends FanControlServer.with(FanContr
134
151
  this.state.fanMode = fanMode;
135
152
  if (percent !== this.state.percentSetting)
136
153
  this.state.percentSetting = percent;
154
+ device.log.debug(`handleSpeedSettingChanging speedSetting changed to ${speedSetting} >>> fanMode ${lookupFanMode[this.state.fanMode]} percentSetting ${this.state.percentSetting} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
137
155
  }
138
156
  async step(request) {
139
- const lookupStepDirection = ['Increase', 'Decrease'];
140
157
  const device = this.endpoint.stateOf(MatterbridgeServer);
141
158
  device.log.info(`Stepping fan with direction ${lookupStepDirection[request.direction]} wrap: ${request.wrap} lowestOff: ${request.lowestOff} (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
142
159
  await device.commandHandler.executeHandler('FanControl.step', {
@@ -176,7 +193,7 @@ export class MatterbridgeFanControlServer extends FanControlServer.with(FanContr
176
193
  const state = this.state;
177
194
  state.speedCurrent = speedSettingForPercent(state.speedMax, resolvedPercentSetting);
178
195
  }
179
- device.log.debug(`MatterbridgeFanControlServer: step applied fanMode ${getEnumDescription(FanControl.FanMode, targetFanMode)}, percentCurrent ${this.state.percentCurrent}` +
196
+ device.log.debug(`MatterbridgeFanControlServer: step applied fanMode ${lookupFanMode[this.state.fanMode]}, percentCurrent ${this.state.percentCurrent}` +
180
197
  (this.features.multiSpeed ? `, speedCurrent ${this.state.speedCurrent}` : ''));
181
198
  }
182
199
  }
package/dist/cli.js CHANGED
@@ -141,6 +141,7 @@ function help() {
141
141
  --loginterfaces: log the network interfaces (usefull for finding the name of the interface to use with -mdnsinterface option)
142
142
  --logstorage: log the node storage
143
143
  --systemcheck: perform a system check (check Node.js version and network interfaces)
144
+ --demo-devices: create demo devices (only in bridge mode)
144
145
 
145
146
  Reset Commands:
146
147
  --reset: remove the commissioning for Matterbridge (bridge mode and childbridge mode). Shutdown Matterbridge before using it!
@@ -0,0 +1,2 @@
1
+ import type { Matterbridge } from './matterbridge.js';
2
+ export declare function createDemoDevices(matterbridge: Matterbridge): Promise<void>;
@@ -8,22 +8,22 @@ import { IrrigationSystem } from './devices/irrigationSystem.js';
8
8
  import { getSupportedDeviceType } from './matterbridgeDeviceTypes.js';
9
9
  import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
10
10
  import { getSemtag } from './matterbridgeEndpointHelpers.js';
11
- export async function createChipTestDevices(matterbridge) {
12
- if (!process.env.MATTERBRIDGE_DEMO_DEVICES || matterbridge.bridgeMode !== 'bridge' || !matterbridge.aggregatorNode)
11
+ export async function createDemoDevices(matterbridge) {
12
+ if (matterbridge.bridgeMode !== 'bridge' || !matterbridge.serverNode || !matterbridge.aggregatorNode)
13
13
  return;
14
14
  const serverNode = matterbridge.serverNode;
15
15
  const aggregator = matterbridge.aggregatorNode;
16
16
  if (!serverNode || !aggregator) {
17
- matterbridge.log.error('CHIP test devices can only be created when the server node and aggregator node are available');
17
+ matterbridge.log.error('Demo devices can only be created when the server node and aggregator node are available');
18
18
  return;
19
19
  }
20
20
  let ep;
21
21
  matterbridge.plugins.set({
22
- name: 'matterbridge-chip',
22
+ name: 'matterbridge-demo-devices',
23
23
  path: '',
24
24
  type: 'DynamicPlatform',
25
25
  version: '1.0.0',
26
- description: 'Chip test plugin',
26
+ description: 'Matterbridge demo devices',
27
27
  author: 'Matterbridge',
28
28
  enabled: false,
29
29
  private: false,
@@ -32,8 +32,8 @@ export async function createChipTestDevices(matterbridge) {
32
32
  const registerDevice = async (device, deviceName, serialNumber) => {
33
33
  device.createDefaultBridgedDeviceBasicInformationClusterServer(deviceName, serialNumber);
34
34
  device.addRequiredClusters();
35
- device.plugin = 'matterbridge-chip';
36
- await matterbridge.addBridgedEndpoint('matterbridge-chip', device);
35
+ device.plugin = 'matterbridge-demo-devices';
36
+ await matterbridge.addBridgedEndpoint('matterbridge-demo-devices', device);
37
37
  };
38
38
  const bridgedNode = getSupportedDeviceType('BridgedNode');
39
39
  const powerSource = getSupportedDeviceType('PowerSource');
@@ -1569,11 +1569,17 @@ export class Matterbridge extends EventEmitter {
1569
1569
  this.aggregatorNode = await this.createAggregatorNode(this.matterbridgeContext);
1570
1570
  await this.serverNode.add(this.aggregatorNode);
1571
1571
  await addVirtualDevices(this, this.aggregatorNode);
1572
- if (process.env.MATTERBRIDGE_DEMO_DEVICES) {
1573
- const { createChipTestDevices } = await import('./chipTestDevices.js');
1574
- await createChipTestDevices(this);
1572
+ if (process.env.MATTERBRIDGE_DEMO_DEVICES || hasParameter('demo-devices')) {
1573
+ this.log.warn(' *********************************************************************************');
1574
+ this.log.warn(' * MATTERBRIDGE_DEMO_DEVICES environment variable is set. Creating demo devices. *');
1575
+ this.log.warn(' *********************************************************************************');
1576
+ const { createDemoDevices } = await import('./demoDevices.js');
1577
+ await createDemoDevices(this);
1575
1578
  }
1576
1579
  if (process.env.MATTERBRIDGE_CHIP_TEST && fs.existsSync(path.join(path.dirname(fileURLToPath(import.meta.url)), 'chipTests.js'))) {
1580
+ this.log.warn(' ***********************************************************************************');
1581
+ this.log.warn(' * MATTERBRIDGE_CHIP_TEST environment variable is set. Running chip test app pipe. *');
1582
+ this.log.warn(' ***********************************************************************************');
1577
1583
  const { createChipTestAppPipe } = await import('./chipTests.js');
1578
1584
  createChipTestAppPipe(this);
1579
1585
  }
@@ -1888,6 +1894,9 @@ export class Matterbridge extends EventEmitter {
1888
1894
  }
1889
1895
  let rootEndpoint = ServerNode.RootEndpoint.with(PowerSourceServer.with(PowerSource.Feature.Wired));
1890
1896
  if (process.env.MATTERBRIDGE_CHIP_TEST && fs.existsSync(path.join(path.dirname(fileURLToPath(import.meta.url)), 'chipTests.js'))) {
1897
+ this.log.warn(' ****************************************************************************************');
1898
+ this.log.warn(' * MATTERBRIDGE_CHIP_TEST environment variable is set. Running TestEventTrigger server. *');
1899
+ this.log.warn(' ****************************************************************************************');
1891
1900
  const { MatterbridgeGeneralDiagnosticsServer } = await import('./chipTests.js');
1892
1901
  rootEndpoint = rootEndpoint.with(MatterbridgeGeneralDiagnosticsServer);
1893
1902
  }
@@ -1487,7 +1487,7 @@ export class MatterbridgeEndpoint extends Endpoint {
1487
1487
  });
1488
1488
  return this;
1489
1489
  }
1490
- createDefaultBooleanStateConfigurationClusterServer(sensorFault = false, currentSensitivityLevel = 0, supportedSensitivityLevels = 2, defaultSensitivityLevel = 0) {
1490
+ createDefaultBooleanStateConfigurationClusterServer(sensorFault = false, currentSensitivityLevel = 1, supportedSensitivityLevels = 3, defaultSensitivityLevel = 1) {
1491
1491
  this.behaviors.require(MatterbridgeBooleanStateConfigurationServer.with(BooleanStateConfiguration.Feature.Visual, BooleanStateConfiguration.Feature.Audible, BooleanStateConfiguration.Feature.AlarmSuppress, BooleanStateConfiguration.Feature.SensitivityLevel, BooleanStateConfiguration.Feature.FaultEvents).enable({
1492
1492
  events: { alarmsStateChanged: true, sensorFault: true },
1493
1493
  }), {
@@ -428,7 +428,7 @@ export class PluginManager extends EventEmitter {
428
428
  }
429
429
  async loadFromStorage() {
430
430
  if (!this.matterbridge.nodeContext) {
431
- throw new Error('loadFromStorage: node context is not available.');
431
+ throw new Error('PluginManager.loadFromStorage: node context is not available.');
432
432
  }
433
433
  const pluginsArray = await this.matterbridge.nodeContext.get('plugins', []);
434
434
  for (const plugin of pluginsArray)
@@ -438,11 +438,11 @@ export class PluginManager extends EventEmitter {
438
438
  }
439
439
  async saveToStorage() {
440
440
  if (!this.matterbridge.nodeContext) {
441
- throw new Error('loadFromStorage: node context is not available.');
441
+ throw new Error('PluginManager.saveToStorage: node context is not available.');
442
442
  }
443
443
  const plugins = [];
444
444
  for (const plugin of this.array()) {
445
- if (process.env.MATTERBRIDGE_DEMO_DEVICES && plugin.name === 'matterbridge-chip')
445
+ if (process.env.MATTERBRIDGE_DEMO_DEVICES && plugin.name === 'matterbridge-demo-devices')
446
446
  continue;
447
447
  plugins.push({
448
448
  name: plugin.name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/core",
3
- "version": "3.10.6-dev-20260819-1fbaf31",
3
+ "version": "3.10.6-dev-20260820-36b52be",
4
4
  "description": "Matterbridge core library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -132,10 +132,10 @@
132
132
  },
133
133
  "dependencies": {
134
134
  "@matter/main": "0.17.9",
135
- "@matterbridge/dgram": "3.10.6-dev-20260819-1fbaf31",
136
- "@matterbridge/thread": "3.10.6-dev-20260819-1fbaf31",
137
- "@matterbridge/types": "3.10.6-dev-20260819-1fbaf31",
138
- "@matterbridge/utils": "3.10.6-dev-20260819-1fbaf31",
135
+ "@matterbridge/dgram": "3.10.6-dev-20260820-36b52be",
136
+ "@matterbridge/thread": "3.10.6-dev-20260820-36b52be",
137
+ "@matterbridge/types": "3.10.6-dev-20260820-36b52be",
138
+ "@matterbridge/utils": "3.10.6-dev-20260820-36b52be",
139
139
  "escape-html": "1.0.3",
140
140
  "express": "5.2.1",
141
141
  "express-rate-limit": "8.6.2",
@@ -1,2 +0,0 @@
1
- import type { Matterbridge } from './matterbridge.js';
2
- export declare function createChipTestDevices(matterbridge: Matterbridge): Promise<void>;