matterbridge 3.1.5-dev-20250720-5a0b41e → 3.1.6-dev-20250720-88d6141
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 +18 -0
- package/dist/devices/dishwasher.js +90 -0
- package/dist/devices/export.js +2 -0
- package/dist/devices/extractorHood.js +35 -0
- package/dist/matterbridge.js +30 -13
- package/dist/matterbridgeBehaviors.js +20 -0
- package/dist/matterbridgeEndpoint.js +9 -11
- package/npm-shrinkwrap.json +9 -9
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,24 @@ If you like this project and find it useful, please consider giving it a star on
|
|
|
8
8
|
<img src="bmc-button.svg" alt="Buy me a coffee" width="120">
|
|
9
9
|
</a>
|
|
10
10
|
|
|
11
|
+
## [3.1.6] - 2025-07-??
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- [reset]: Improved reset all devices command. It will shutdown all the plugins and recreate the devices with new state and enpoint numbers even if the device is not selected.
|
|
16
|
+
- [enpoint]: Enhanced HEPA and Activated Carbon Filter Monitoring Cluster Server methods with additional features and improved default parameters.
|
|
17
|
+
- [enpoint]: Added resetCondition command for HEPA and Activated Carbon Filter Monitoring Cluster Server.
|
|
18
|
+
- [dishwasher]: Added Dishwasher class and Jest test. It is not supported by the Home app.
|
|
19
|
+
- [extractorHood]: Added ExtractorHood class and Jest test.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- [package]: Updated dependencies.
|
|
24
|
+
|
|
25
|
+
<a href="https://www.buymeacoffee.com/luligugithub">
|
|
26
|
+
<img src="bmc-button.svg" alt="Buy me a coffee" width="80">
|
|
27
|
+
</a>
|
|
28
|
+
|
|
11
29
|
## [3.1.5] - 2025-07-19
|
|
12
30
|
|
|
13
31
|
### Added
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { TemperatureControl } from '@matter/main/clusters/temperature-control';
|
|
2
|
+
import { ModeBase } from '@matter/main/clusters/mode-base';
|
|
3
|
+
import { DishwasherModeServer } from '@matter/main/behaviors/dishwasher-mode';
|
|
4
|
+
import { DishwasherAlarmServer } from '@matter/main/behaviors/dishwasher-alarm';
|
|
5
|
+
import { DishwasherMode } from '@matter/main/clusters/dishwasher-mode';
|
|
6
|
+
import { dishwasher, powerSource } from '../matterbridgeDeviceTypes.js';
|
|
7
|
+
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
8
|
+
import { MatterbridgeOnOffServer, MatterbridgeServer } from '../matterbridgeBehaviors.js';
|
|
9
|
+
import { MatterbridgeLevelTemperatureControlServer, MatterbridgeNumberTemperatureControlServer } from './laundryWasher.js';
|
|
10
|
+
export class Dishwasher extends MatterbridgeEndpoint {
|
|
11
|
+
constructor(name, serial, currentMode, supportedModes, selectedTemperatureLevel, supportedTemperatureLevels, temperatureSetpoint, minTemperature, maxTemperature, step, operationalState) {
|
|
12
|
+
super([dishwasher, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
|
|
13
|
+
this.createDefaultIdentifyClusterServer();
|
|
14
|
+
this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Matterbridge Dishwasher');
|
|
15
|
+
this.createDefaultPowerSourceWiredClusterServer();
|
|
16
|
+
this.createDeadFrontOnOffClusterServer(true);
|
|
17
|
+
this.createDefaultDishwasherModeClusterServer(currentMode, supportedModes);
|
|
18
|
+
this.createDefaultDishwasherAlarmClusterServer();
|
|
19
|
+
if (temperatureSetpoint)
|
|
20
|
+
this.createNumberTemperatureControlClusterServer(temperatureSetpoint, minTemperature, maxTemperature, step);
|
|
21
|
+
else
|
|
22
|
+
this.createLevelTemperatureControlClusterServer(selectedTemperatureLevel, supportedTemperatureLevels);
|
|
23
|
+
this.createDefaultOperationalStateClusterServer(operationalState);
|
|
24
|
+
}
|
|
25
|
+
createLevelTemperatureControlClusterServer(selectedTemperatureLevel = 1, supportedTemperatureLevels = ['Cold', 'Warm', 'Hot', '30°', '40°', '60°', '80°']) {
|
|
26
|
+
this.behaviors.require(MatterbridgeLevelTemperatureControlServer.with(TemperatureControl.Feature.TemperatureLevel), {
|
|
27
|
+
selectedTemperatureLevel,
|
|
28
|
+
supportedTemperatureLevels,
|
|
29
|
+
});
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
createNumberTemperatureControlClusterServer(temperatureSetpoint = 40 * 100, minTemperature = 30 * 100, maxTemperature = 60 * 100, step = 10 * 100) {
|
|
33
|
+
this.behaviors.require(MatterbridgeNumberTemperatureControlServer.with(TemperatureControl.Feature.TemperatureNumber, TemperatureControl.Feature.TemperatureStep), {
|
|
34
|
+
temperatureSetpoint,
|
|
35
|
+
minTemperature,
|
|
36
|
+
maxTemperature,
|
|
37
|
+
step,
|
|
38
|
+
});
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
createDefaultDishwasherModeClusterServer(currentMode = 2, supportedModes = [
|
|
42
|
+
{ label: 'Light', mode: 1, modeTags: [{ value: DishwasherMode.ModeTag.Light }] },
|
|
43
|
+
{ label: 'Normal', mode: 2, modeTags: [{ value: DishwasherMode.ModeTag.Normal }] },
|
|
44
|
+
{ label: 'Heavy', mode: 3, modeTags: [{ value: DishwasherMode.ModeTag.Heavy }] },
|
|
45
|
+
]) {
|
|
46
|
+
this.behaviors.require(MatterbridgeDishwasherModeServer, {
|
|
47
|
+
supportedModes,
|
|
48
|
+
currentMode,
|
|
49
|
+
});
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
createDefaultDishwasherAlarmClusterServer() {
|
|
53
|
+
this.behaviors.require(DishwasherAlarmServer, {
|
|
54
|
+
mask: { inflowError: true, drainError: true, doorError: true, tempTooLow: true, tempTooHigh: true, waterLevelError: true },
|
|
55
|
+
state: { inflowError: false, drainError: false, doorError: false, tempTooLow: false, tempTooHigh: false, waterLevelError: false },
|
|
56
|
+
supported: { inflowError: true, drainError: true, doorError: true, tempTooLow: true, tempTooHigh: true, waterLevelError: true },
|
|
57
|
+
});
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class MatterbridgeDishwasherModeServer extends DishwasherModeServer {
|
|
62
|
+
initialize() {
|
|
63
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
64
|
+
device.log.info(`MatterbridgeDishwasherModeServer initialized: currentMode is ${this.state.currentMode}`);
|
|
65
|
+
this.state.currentMode = 2;
|
|
66
|
+
this.reactTo(this.agent.get(MatterbridgeOnOffServer).events.onOff$Changed, this.handleOnOffChange);
|
|
67
|
+
}
|
|
68
|
+
handleOnOffChange(onOff) {
|
|
69
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
70
|
+
if (onOff === false) {
|
|
71
|
+
device.log.info('OnOffServer changed to OFF: setting Dead Front state to Manufacturer Specific');
|
|
72
|
+
this.state.currentMode = 2;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
changeToMode(request) {
|
|
76
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
77
|
+
device.log.info(`ChangeToMode (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
78
|
+
device.commandHandler.executeHandler('changeToMode', { request, cluster: DishwasherModeServer.id, attributes: this.state, endpoint: this.endpoint });
|
|
79
|
+
const supportedMode = this.state.supportedModes.find((supportedMode) => supportedMode.mode === request.newMode);
|
|
80
|
+
if (supportedMode) {
|
|
81
|
+
device.log.info(`DishwasherModeServer: changeToMode called with mode ${supportedMode.mode} => ${supportedMode.label}`);
|
|
82
|
+
this.state.currentMode = request.newMode;
|
|
83
|
+
return { status: ModeBase.ModeChangeStatus.Success, statusText: 'Success' };
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
device.log.error(`DishwasherModeServer: changeToMode called with invalid mode ${request.newMode}`);
|
|
87
|
+
return { status: ModeBase.ModeChangeStatus.InvalidInMode, statusText: 'Invalid mode' };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
package/dist/devices/export.js
CHANGED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ResourceMonitoring } from '@matter/main/clusters/resource-monitoring';
|
|
2
|
+
import { extractorHood, powerSource } from '../matterbridgeDeviceTypes.js';
|
|
3
|
+
import { MatterbridgeEndpoint } from '../matterbridgeEndpoint.js';
|
|
4
|
+
export class ExtractorHood extends MatterbridgeEndpoint {
|
|
5
|
+
constructor(name, serial, hepaCondition = 100, hepaChangeIndication = ResourceMonitoring.ChangeIndication.Ok, hepaInPlaceIndicator = true, hepaLastChangedTime = null, hepaReplacementProductList = [], activatedCarbonCondition = 100, activatedCarbonChangeIndication = ResourceMonitoring.ChangeIndication.Ok, activatedCarbonInPlaceIndicator = true, activatedCarbonLastChangedTime = null, activatedCarbonReplacementProductList = []) {
|
|
6
|
+
super([extractorHood, powerSource], { uniqueStorageKey: `${name.replaceAll(' ', '')}-${serial.replaceAll(' ', '')}` }, true);
|
|
7
|
+
this.createDefaultIdentifyClusterServer();
|
|
8
|
+
this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Extractor Hood');
|
|
9
|
+
this.createDefaultPowerSourceWiredClusterServer();
|
|
10
|
+
this.createBaseFanControlClusterServer();
|
|
11
|
+
this.createDefaultHepaFilterMonitoringClusterServer(hepaCondition, hepaChangeIndication, hepaInPlaceIndicator, hepaLastChangedTime, hepaReplacementProductList);
|
|
12
|
+
this.createDefaultActivatedCarbonFilterMonitoringClusterServer(activatedCarbonCondition, activatedCarbonChangeIndication, activatedCarbonInPlaceIndicator, activatedCarbonLastChangedTime, activatedCarbonReplacementProductList);
|
|
13
|
+
this.subscribeAttribute('fanControl', 'fanMode', (newValue, oldValue, context) => {
|
|
14
|
+
if (context.offline === true)
|
|
15
|
+
return;
|
|
16
|
+
this.log.info(`Fan control fanMode attribute changed: ${newValue}`);
|
|
17
|
+
});
|
|
18
|
+
this.subscribeAttribute('fanControl', 'percentSetting', (newValue, oldValue, context) => {
|
|
19
|
+
if (context.offline === true)
|
|
20
|
+
return;
|
|
21
|
+
this.log.info(`Fan control percentSetting attribute changed: ${newValue}`);
|
|
22
|
+
this.setAttribute('fanControl', 'percentCurrent', newValue, this.log);
|
|
23
|
+
});
|
|
24
|
+
this.subscribeAttribute('hepaFilterMonitoring', 'lastChangedTime', (newValue, oldValue, context) => {
|
|
25
|
+
if (context.offline === true)
|
|
26
|
+
return;
|
|
27
|
+
this.log.info(`Hepa filter monitoring lastChangedTime attribute changed: ${newValue}`);
|
|
28
|
+
});
|
|
29
|
+
this.subscribeAttribute('activatedCarbonFilterMonitoring', 'lastChangedTime', (newValue, oldValue, context) => {
|
|
30
|
+
if (context.offline === true)
|
|
31
|
+
return;
|
|
32
|
+
this.log.info(`Activated carbon filter monitoring lastChangedTime attribute changed: ${newValue}`);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
package/dist/matterbridge.js
CHANGED
|
@@ -10,7 +10,8 @@ import { DeviceCommissioner, FabricAction, MdnsService, PaseClient } from '@matt
|
|
|
10
10
|
import { AggregatorEndpoint } from '@matter/main/endpoints';
|
|
11
11
|
import { BasicInformationServer } from '@matter/main/behaviors/basic-information';
|
|
12
12
|
import { BridgedDeviceBasicInformationServer } from '@matter/main/behaviors/bridged-device-basic-information';
|
|
13
|
-
import { getParameter, getIntParameter, hasParameter, copyDirectory,
|
|
13
|
+
import { getParameter, getIntParameter, hasParameter, copyDirectory, isValidString, parseVersionString, isValidNumber, createDirectory } from './utils/export.js';
|
|
14
|
+
import { withTimeout, waiter, wait } from './utils/wait.js';
|
|
14
15
|
import { dev, plg, typ } from './matterbridgeTypes.js';
|
|
15
16
|
import { PluginManager } from './pluginManager.js';
|
|
16
17
|
import { DeviceManager } from './deviceManager.js';
|
|
@@ -199,9 +200,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
199
200
|
}
|
|
200
201
|
}
|
|
201
202
|
await Promise.resolve();
|
|
202
|
-
await
|
|
203
|
-
setTimeout(resolve, pause);
|
|
204
|
-
});
|
|
203
|
+
await wait(pause, 'destroyInstance start', true);
|
|
205
204
|
await this.cleanup('destroying instance...', false, timeout);
|
|
206
205
|
this.log.info(`Dispose ${servers.length} MdnsService...`);
|
|
207
206
|
for (const server of servers) {
|
|
@@ -209,9 +208,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
209
208
|
this.log.info(`Closed ${server.id} MdnsService`);
|
|
210
209
|
}
|
|
211
210
|
await Promise.resolve();
|
|
212
|
-
await
|
|
213
|
-
setTimeout(resolve, pause);
|
|
214
|
-
});
|
|
211
|
+
await wait(pause, 'destroyInstance stop', true);
|
|
215
212
|
}
|
|
216
213
|
async initialize() {
|
|
217
214
|
this.emit('initialize_started');
|
|
@@ -985,11 +982,14 @@ export class Matterbridge extends EventEmitter {
|
|
|
985
982
|
}
|
|
986
983
|
async unregisterAndShutdownProcess(timeout = 1000) {
|
|
987
984
|
this.log.info('Unregistering all devices and shutting down...');
|
|
988
|
-
for (const plugin of this.plugins) {
|
|
989
|
-
|
|
985
|
+
for (const plugin of this.plugins.array()) {
|
|
986
|
+
if (plugin.error || !plugin.enabled)
|
|
987
|
+
continue;
|
|
988
|
+
await this.plugins.shutdown(plugin, 'unregistering all devices and shutting down...', false, true);
|
|
989
|
+
await this.removeAllBridgedEndpoints(plugin.name, 100);
|
|
990
990
|
}
|
|
991
991
|
this.log.debug('Waiting for the MessageExchange to finish...');
|
|
992
|
-
await
|
|
992
|
+
await wait(timeout);
|
|
993
993
|
this.log.debug('Cleaning up and shutting down...');
|
|
994
994
|
await this.cleanup('unregistered all devices and shutting down...', false, timeout);
|
|
995
995
|
}
|
|
@@ -1041,7 +1041,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
1041
1041
|
}
|
|
1042
1042
|
this.log.notice(`Stopping matter server nodes in ${this.bridgeMode} mode...`);
|
|
1043
1043
|
this.log.debug('Waiting for the MessageExchange to finish...');
|
|
1044
|
-
await
|
|
1044
|
+
await wait(timeout, 'Waiting for the MessageExchange to finish...', true);
|
|
1045
1045
|
if (this.bridgeMode === 'bridge') {
|
|
1046
1046
|
if (this.serverNode) {
|
|
1047
1047
|
await this.stopServerNode(this.serverNode);
|
|
@@ -1072,6 +1072,23 @@ export class Matterbridge extends EventEmitter {
|
|
|
1072
1072
|
await this.matterbridgeContext?.clearAll();
|
|
1073
1073
|
this.log.info('Matter storage reset done! Remove the bridge from the controller.');
|
|
1074
1074
|
}
|
|
1075
|
+
if (message === 'unregistered all devices and shutting down...') {
|
|
1076
|
+
if (this.bridgeMode === 'bridge') {
|
|
1077
|
+
await this.matterStorageManager?.createContext('root')?.createContext('parts')?.createContext('Matterbridge')?.createContext('parts')?.clearAll();
|
|
1078
|
+
await this.matterStorageManager?.createContext('root')?.createContext('subscription')?.clearAll();
|
|
1079
|
+
await this.matterStorageManager?.createContext('sessions')?.clearAll();
|
|
1080
|
+
}
|
|
1081
|
+
else if (this.bridgeMode === 'childbridge') {
|
|
1082
|
+
for (const plugin of this.plugins.array()) {
|
|
1083
|
+
if (plugin.type === 'DynamicPlatform') {
|
|
1084
|
+
await plugin.storageContext?.createContext('root')?.createContext('parts')?.createContext(plugin.name)?.createContext('parts')?.clearAll();
|
|
1085
|
+
}
|
|
1086
|
+
await plugin.storageContext?.createContext('root')?.createContext('subscription')?.clearAll();
|
|
1087
|
+
await plugin.storageContext?.createContext('sessions')?.clearAll();
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
this.log.info('Matter storage reset done!');
|
|
1091
|
+
}
|
|
1075
1092
|
await this.stopMatterStorage();
|
|
1076
1093
|
await this.frontend.stop();
|
|
1077
1094
|
try {
|
|
@@ -1727,10 +1744,10 @@ export class Matterbridge extends EventEmitter {
|
|
|
1727
1744
|
for (const device of this.devices.array().filter((device) => device.plugin === pluginName)) {
|
|
1728
1745
|
await this.removeBridgedEndpoint(pluginName, device);
|
|
1729
1746
|
if (delay > 0)
|
|
1730
|
-
await
|
|
1747
|
+
await wait(delay);
|
|
1731
1748
|
}
|
|
1732
1749
|
if (delay > 0)
|
|
1733
|
-
await
|
|
1750
|
+
await wait(2000);
|
|
1734
1751
|
}
|
|
1735
1752
|
async subscribeAttributeChanged(plugin, device) {
|
|
1736
1753
|
this.log.info(`Subscribing attributes for endpoint ${dev}${device.deviceName}${nf} (${dev}${device.id}${nf}) plugin ${plg}${plugin.name}${nf}`);
|
|
@@ -26,6 +26,8 @@ import { OperationalStateServer } from '@matter/main/behaviors/operational-state
|
|
|
26
26
|
import { ServiceAreaServer } from '@matter/main/behaviors/service-area';
|
|
27
27
|
import { DeviceEnergyManagementServer } from '@matter/main/behaviors/device-energy-management';
|
|
28
28
|
import { DeviceEnergyManagementModeServer } from '@matter/main/behaviors/device-energy-management-mode';
|
|
29
|
+
import { HepaFilterMonitoringServer } from '@matter/main/behaviors/hepa-filter-monitoring';
|
|
30
|
+
import { ActivatedCarbonFilterMonitoringServer } from '@matter/main/behaviors/activated-carbon-filter-monitoring';
|
|
29
31
|
export class MatterbridgeServer extends Behavior {
|
|
30
32
|
static id = 'matterbridge';
|
|
31
33
|
initialize() {
|
|
@@ -393,6 +395,24 @@ export class MatterbridgeModeSelectServer extends ModeSelectServer {
|
|
|
393
395
|
super.changeToMode(request);
|
|
394
396
|
}
|
|
395
397
|
}
|
|
398
|
+
export class MatterbridgeHepaFilterMonitoringServer extends HepaFilterMonitoringServer {
|
|
399
|
+
resetCondition() {
|
|
400
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
401
|
+
device.log.info(`Resetting condition (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
402
|
+
device.commandHandler.executeHandler('resetCondition', { cluster: MatterbridgeHepaFilterMonitoringServer.id, attributes: this.state, endpoint: this.endpoint });
|
|
403
|
+
this.state.lastChangedTime = Math.floor(new Date().getTime() / 1000);
|
|
404
|
+
device.log.debug(`MatterbridgeHepaFilterMonitoringServer: resetCondition called`);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
export class MatterbridgeActivatedCarbonFilterMonitoringServer extends ActivatedCarbonFilterMonitoringServer {
|
|
408
|
+
resetCondition() {
|
|
409
|
+
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
410
|
+
device.log.info(`Resetting condition (endpoint ${this.endpoint.maybeId}.${this.endpoint.maybeNumber})`);
|
|
411
|
+
device.commandHandler.executeHandler('resetCondition', { cluster: MatterbridgeActivatedCarbonFilterMonitoringServer.id, attributes: this.state, endpoint: this.endpoint });
|
|
412
|
+
this.state.lastChangedTime = Math.floor(new Date().getTime() / 1000);
|
|
413
|
+
device.log.debug(`MatterbridgeActivatedCarbonFilterMonitoringServer: resetCondition called`);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
396
416
|
export class MatterbridgeDeviceEnergyManagementServer extends DeviceEnergyManagementServer {
|
|
397
417
|
powerAdjustRequest(request) {
|
|
398
418
|
const device = this.endpoint.stateOf(MatterbridgeServer);
|
|
@@ -56,13 +56,11 @@ import { RadonConcentrationMeasurementServer } from '@matter/main/behaviors/rado
|
|
|
56
56
|
import { TotalVolatileOrganicCompoundsConcentrationMeasurementServer } from '@matter/main/behaviors/total-volatile-organic-compounds-concentration-measurement';
|
|
57
57
|
import { FanControlServer } from '@matter/main/behaviors/fan-control';
|
|
58
58
|
import { ResourceMonitoring } from '@matter/main/clusters/resource-monitoring';
|
|
59
|
-
import { HepaFilterMonitoringServer } from '@matter/main/behaviors/hepa-filter-monitoring';
|
|
60
|
-
import { ActivatedCarbonFilterMonitoringServer } from '@matter/main/behaviors/activated-carbon-filter-monitoring';
|
|
61
59
|
import { ThermostatUserInterfaceConfigurationServer } from '@matter/main/behaviors/thermostat-user-interface-configuration';
|
|
62
60
|
import { AnsiLogger, CYAN, YELLOW, db, debugStringify, hk, or, zb } from './logger/export.js';
|
|
63
61
|
import { bridgedNode } from './matterbridgeDeviceTypes.js';
|
|
64
62
|
import { isValidNumber, isValidObject, isValidString } from './utils/export.js';
|
|
65
|
-
import { MatterbridgeServer, MatterbridgeIdentifyServer, MatterbridgeOnOffServer, MatterbridgeLevelControlServer, MatterbridgeColorControlServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeLiftTiltWindowCoveringServer, MatterbridgeThermostatServer, MatterbridgeFanControlServer, MatterbridgeDoorLockServer, MatterbridgeModeSelectServer, MatterbridgeValveConfigurationAndControlServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeSwitchServer, MatterbridgeOperationalStateServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, } from './matterbridgeBehaviors.js';
|
|
63
|
+
import { MatterbridgeServer, MatterbridgeIdentifyServer, MatterbridgeOnOffServer, MatterbridgeLevelControlServer, MatterbridgeColorControlServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeLiftTiltWindowCoveringServer, MatterbridgeThermostatServer, MatterbridgeFanControlServer, MatterbridgeDoorLockServer, MatterbridgeModeSelectServer, MatterbridgeValveConfigurationAndControlServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeSwitchServer, MatterbridgeOperationalStateServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeActivatedCarbonFilterMonitoringServer, MatterbridgeHepaFilterMonitoringServer, } from './matterbridgeBehaviors.js';
|
|
66
64
|
import { addClusterServers, addFixedLabel, addOptionalClusterServers, addRequiredClusterServers, addUserLabel, createUniqueId, getBehavior, getBehaviourTypesFromClusterClientIds, getBehaviourTypesFromClusterServerIds, getDefaultOperationalStateClusterServer, getDefaultFlowMeasurementClusterServer, getDefaultIlluminanceMeasurementClusterServer, getDefaultPressureMeasurementClusterServer, getDefaultRelativeHumidityMeasurementClusterServer, getDefaultTemperatureMeasurementClusterServer, getDefaultOccupancySensingClusterServer, lowercaseFirstLetter, updateAttribute, getClusterId, getAttributeId, setAttribute, getAttribute, checkNotLatinCharacters, generateUniqueId, subscribeAttribute, invokeBehaviorCommand, triggerEvent, } from './matterbridgeEndpointHelpers.js';
|
|
67
65
|
export class MatterbridgeEndpoint extends Endpoint {
|
|
68
66
|
static bridgeMode = '';
|
|
@@ -845,25 +843,25 @@ export class MatterbridgeEndpoint extends Endpoint {
|
|
|
845
843
|
});
|
|
846
844
|
return this;
|
|
847
845
|
}
|
|
848
|
-
createDefaultHepaFilterMonitoringClusterServer(changeIndication = ResourceMonitoring.ChangeIndication.Ok, inPlaceIndicator =
|
|
849
|
-
this.behaviors.require(
|
|
850
|
-
condition
|
|
846
|
+
createDefaultHepaFilterMonitoringClusterServer(condition = 100, changeIndication = ResourceMonitoring.ChangeIndication.Ok, inPlaceIndicator = true, lastChangedTime = null, replacementProductList = []) {
|
|
847
|
+
this.behaviors.require(MatterbridgeHepaFilterMonitoringServer.with(ResourceMonitoring.Feature.Condition, ResourceMonitoring.Feature.Warning, ResourceMonitoring.Feature.ReplacementProductList), {
|
|
848
|
+
condition,
|
|
851
849
|
degradationDirection: ResourceMonitoring.DegradationDirection.Down,
|
|
850
|
+
replacementProductList,
|
|
852
851
|
changeIndication,
|
|
853
852
|
inPlaceIndicator,
|
|
854
853
|
lastChangedTime,
|
|
855
|
-
replacementProductList: [],
|
|
856
854
|
});
|
|
857
855
|
return this;
|
|
858
856
|
}
|
|
859
|
-
createDefaultActivatedCarbonFilterMonitoringClusterServer(changeIndication = ResourceMonitoring.ChangeIndication.Ok, inPlaceIndicator =
|
|
860
|
-
this.behaviors.require(
|
|
861
|
-
condition
|
|
857
|
+
createDefaultActivatedCarbonFilterMonitoringClusterServer(condition = 100, changeIndication = ResourceMonitoring.ChangeIndication.Ok, inPlaceIndicator = true, lastChangedTime = null, replacementProductList = []) {
|
|
858
|
+
this.behaviors.require(MatterbridgeActivatedCarbonFilterMonitoringServer.with(ResourceMonitoring.Feature.Condition, ResourceMonitoring.Feature.Warning, ResourceMonitoring.Feature.ReplacementProductList), {
|
|
859
|
+
condition,
|
|
862
860
|
degradationDirection: ResourceMonitoring.DegradationDirection.Down,
|
|
861
|
+
replacementProductList,
|
|
863
862
|
changeIndication,
|
|
864
863
|
inPlaceIndicator,
|
|
865
864
|
lastChangedTime,
|
|
866
|
-
replacementProductList: [],
|
|
867
865
|
});
|
|
868
866
|
return this;
|
|
869
867
|
}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.6-dev-20250720-88d6141",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "matterbridge",
|
|
9
|
-
"version": "3.1.
|
|
9
|
+
"version": "3.1.6-dev-20250720-88d6141",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@matter/main": "0.15.1",
|
|
13
13
|
"archiver": "7.0.1",
|
|
14
14
|
"express": "5.1.0",
|
|
15
15
|
"glob": "11.0.3",
|
|
16
|
-
"multer": "2.0.
|
|
16
|
+
"multer": "2.0.2",
|
|
17
17
|
"node-ansi-logger": "3.1.1",
|
|
18
18
|
"node-persist-manager": "2.0.0",
|
|
19
19
|
"ws": "8.18.3"
|
|
@@ -151,9 +151,9 @@
|
|
|
151
151
|
}
|
|
152
152
|
},
|
|
153
153
|
"node_modules/@noble/curves": {
|
|
154
|
-
"version": "1.9.
|
|
155
|
-
"resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.
|
|
156
|
-
"integrity": "sha512-
|
|
154
|
+
"version": "1.9.4",
|
|
155
|
+
"resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.4.tgz",
|
|
156
|
+
"integrity": "sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==",
|
|
157
157
|
"license": "MIT",
|
|
158
158
|
"dependencies": {
|
|
159
159
|
"@noble/hashes": "1.8.0"
|
|
@@ -1279,9 +1279,9 @@
|
|
|
1279
1279
|
"license": "MIT"
|
|
1280
1280
|
},
|
|
1281
1281
|
"node_modules/multer": {
|
|
1282
|
-
"version": "2.0.
|
|
1283
|
-
"resolved": "https://registry.npmjs.org/multer/-/multer-2.0.
|
|
1284
|
-
"integrity": "sha512-
|
|
1282
|
+
"version": "2.0.2",
|
|
1283
|
+
"resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz",
|
|
1284
|
+
"integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==",
|
|
1285
1285
|
"license": "MIT",
|
|
1286
1286
|
"dependencies": {
|
|
1287
1287
|
"append-field": "^1.0.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.6-dev-20250720-88d6141",
|
|
4
4
|
"description": "Matterbridge plugin manager for Matter",
|
|
5
5
|
"author": "https://github.com/Luligu",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"archiver": "7.0.1",
|
|
103
103
|
"express": "5.1.0",
|
|
104
104
|
"glob": "11.0.3",
|
|
105
|
-
"multer": "2.0.
|
|
105
|
+
"multer": "2.0.2",
|
|
106
106
|
"node-ansi-logger": "3.1.1",
|
|
107
107
|
"node-persist-manager": "2.0.0",
|
|
108
108
|
"ws": "8.18.3"
|