@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.
- package/dist/behaviors/fanControlServer.js +19 -2
- package/dist/cli.js +1 -0
- package/dist/demoDevices.d.ts +2 -0
- package/dist/{chipTestDevices.js → demoDevices.js} +7 -7
- package/dist/matterbridge.js +12 -3
- package/dist/matterbridgeEndpoint.js +1 -1
- package/dist/pluginManager.js +3 -3
- package/package.json +5 -5
- package/dist/chipTestDevices.d.ts +0 -2
|
@@ -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 ${
|
|
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!
|
|
@@ -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
|
|
12
|
-
if (
|
|
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('
|
|
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-
|
|
22
|
+
name: 'matterbridge-demo-devices',
|
|
23
23
|
path: '',
|
|
24
24
|
type: 'DynamicPlatform',
|
|
25
25
|
version: '1.0.0',
|
|
26
|
-
description: '
|
|
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-
|
|
36
|
-
await matterbridge.addBridgedEndpoint('matterbridge-
|
|
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');
|
package/dist/matterbridge.js
CHANGED
|
@@ -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
|
-
|
|
1574
|
-
|
|
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 =
|
|
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
|
}), {
|
package/dist/pluginManager.js
CHANGED
|
@@ -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('
|
|
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-
|
|
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-
|
|
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-
|
|
136
|
-
"@matterbridge/thread": "3.10.6-dev-
|
|
137
|
-
"@matterbridge/types": "3.10.6-dev-
|
|
138
|
-
"@matterbridge/utils": "3.10.6-dev-
|
|
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",
|