matterbridge 3.2.6 → 3.2.7-dev-20250908-3bb699e
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 +20 -0
- package/dist/cli.js +2 -91
- package/dist/cliEmitter.js +0 -30
- package/dist/clusters/export.js +0 -2
- package/dist/defaultConfigSchema.js +3 -24
- package/dist/deviceManager.js +1 -94
- package/dist/devices/airConditioner.js +0 -57
- package/dist/devices/batteryStorage.js +1 -48
- package/dist/devices/cooktop.js +0 -55
- package/dist/devices/dishwasher.js +0 -57
- package/dist/devices/evse.js +10 -74
- package/dist/devices/export.js +0 -5
- package/dist/devices/extractorHood.js +0 -42
- package/dist/devices/heatPump.js +2 -50
- package/dist/devices/laundryDryer.js +3 -62
- package/dist/devices/laundryWasher.js +4 -70
- package/dist/devices/microwaveOven.js +5 -88
- package/dist/devices/oven.js +0 -85
- package/dist/devices/refrigerator.js +0 -102
- package/dist/devices/roboticVacuumCleaner.js +9 -100
- package/dist/devices/solarPower.js +0 -38
- package/dist/devices/speaker.js +0 -80
- package/dist/devices/temperatureControl.js +3 -25
- package/dist/devices/waterHeater.js +2 -82
- package/dist/dgram/coap.js +13 -126
- package/dist/dgram/dgram.js +2 -114
- package/dist/dgram/mb_coap.js +3 -41
- package/dist/dgram/mb_mdns.js +15 -80
- package/dist/dgram/mdns.js +137 -299
- package/dist/dgram/multicast.js +1 -62
- package/dist/dgram/unicast.js +0 -54
- package/dist/frontend.js +24 -450
- package/dist/globalMatterbridge.js +0 -47
- package/dist/helpers.js +0 -53
- package/dist/index.js +1 -30
- package/dist/jest-utils/jestHelpers.js +2 -124
- package/dist/logger/export.js +0 -1
- package/dist/matter/behaviors.js +0 -2
- package/dist/matter/clusters.js +0 -2
- package/dist/matter/devices.js +0 -2
- package/dist/matter/endpoints.js +0 -2
- package/dist/matter/export.js +0 -3
- package/dist/matter/types.js +0 -3
- package/dist/matterbridge.js +49 -780
- package/dist/matterbridgeAccessoryPlatform.js +0 -36
- package/dist/matterbridgeBehaviors.js +5 -65
- package/dist/matterbridgeDeviceTypes.js +17 -630
- package/dist/matterbridgeDynamicPlatform.js +0 -36
- package/dist/matterbridgeEndpoint.js +54 -1301
- package/dist/matterbridgeEndpointHelpers.js +12 -345
- package/dist/matterbridgePlatform.js +1 -305
- package/dist/matterbridgeTypes.js +0 -25
- package/dist/pluginManager.js +5 -251
- package/dist/shelly.js +7 -168
- package/dist/storage/export.js +0 -1
- package/dist/update.js +0 -69
- package/dist/utils/colorUtils.js +2 -97
- package/dist/utils/commandLine.js +0 -54
- package/dist/utils/copyDirectory.js +1 -38
- package/dist/utils/createDirectory.js +0 -33
- package/dist/utils/createZip.js +2 -47
- package/dist/utils/deepCopy.js +0 -39
- package/dist/utils/deepEqual.js +1 -72
- package/dist/utils/error.js +0 -41
- package/dist/utils/export.js +0 -1
- package/dist/utils/hex.js +0 -124
- package/dist/utils/isvalid.js +0 -101
- package/dist/utils/network.js +6 -92
- package/dist/utils/spawn.js +0 -40
- package/dist/utils/wait.js +8 -60
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -2
- package/dist/cli.d.ts +0 -26
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/cliEmitter.d.ts +0 -34
- package/dist/cliEmitter.d.ts.map +0 -1
- package/dist/cliEmitter.js.map +0 -1
- package/dist/clusters/export.d.ts +0 -2
- package/dist/clusters/export.d.ts.map +0 -1
- package/dist/clusters/export.js.map +0 -1
- package/dist/defaultConfigSchema.d.ts +0 -28
- package/dist/defaultConfigSchema.d.ts.map +0 -1
- package/dist/defaultConfigSchema.js.map +0 -1
- package/dist/deviceManager.d.ts +0 -112
- package/dist/deviceManager.d.ts.map +0 -1
- package/dist/deviceManager.js.map +0 -1
- package/dist/devices/airConditioner.d.ts +0 -98
- package/dist/devices/airConditioner.d.ts.map +0 -1
- package/dist/devices/airConditioner.js.map +0 -1
- package/dist/devices/batteryStorage.d.ts +0 -48
- package/dist/devices/batteryStorage.d.ts.map +0 -1
- package/dist/devices/batteryStorage.js.map +0 -1
- package/dist/devices/cooktop.d.ts +0 -60
- package/dist/devices/cooktop.d.ts.map +0 -1
- package/dist/devices/cooktop.js.map +0 -1
- package/dist/devices/dishwasher.d.ts +0 -71
- package/dist/devices/dishwasher.d.ts.map +0 -1
- package/dist/devices/dishwasher.js.map +0 -1
- package/dist/devices/evse.d.ts +0 -75
- package/dist/devices/evse.d.ts.map +0 -1
- package/dist/devices/evse.js.map +0 -1
- package/dist/devices/export.d.ts +0 -17
- package/dist/devices/export.d.ts.map +0 -1
- package/dist/devices/export.js.map +0 -1
- package/dist/devices/extractorHood.d.ts +0 -46
- package/dist/devices/extractorHood.d.ts.map +0 -1
- package/dist/devices/extractorHood.js.map +0 -1
- package/dist/devices/heatPump.d.ts +0 -47
- package/dist/devices/heatPump.d.ts.map +0 -1
- package/dist/devices/heatPump.js.map +0 -1
- package/dist/devices/laundryDryer.d.ts +0 -67
- package/dist/devices/laundryDryer.d.ts.map +0 -1
- package/dist/devices/laundryDryer.js.map +0 -1
- package/dist/devices/laundryWasher.d.ts +0 -81
- package/dist/devices/laundryWasher.d.ts.map +0 -1
- package/dist/devices/laundryWasher.js.map +0 -1
- package/dist/devices/microwaveOven.d.ts +0 -168
- package/dist/devices/microwaveOven.d.ts.map +0 -1
- package/dist/devices/microwaveOven.js.map +0 -1
- package/dist/devices/oven.d.ts +0 -105
- package/dist/devices/oven.d.ts.map +0 -1
- package/dist/devices/oven.js.map +0 -1
- package/dist/devices/refrigerator.d.ts +0 -118
- package/dist/devices/refrigerator.d.ts.map +0 -1
- package/dist/devices/refrigerator.js.map +0 -1
- package/dist/devices/roboticVacuumCleaner.d.ts +0 -112
- package/dist/devices/roboticVacuumCleaner.d.ts.map +0 -1
- package/dist/devices/roboticVacuumCleaner.js.map +0 -1
- package/dist/devices/solarPower.d.ts +0 -40
- package/dist/devices/solarPower.d.ts.map +0 -1
- package/dist/devices/solarPower.js.map +0 -1
- package/dist/devices/speaker.d.ts +0 -83
- package/dist/devices/speaker.d.ts.map +0 -1
- package/dist/devices/speaker.js.map +0 -1
- package/dist/devices/temperatureControl.d.ts +0 -166
- package/dist/devices/temperatureControl.d.ts.map +0 -1
- package/dist/devices/temperatureControl.js.map +0 -1
- package/dist/devices/waterHeater.d.ts +0 -111
- package/dist/devices/waterHeater.d.ts.map +0 -1
- package/dist/devices/waterHeater.js.map +0 -1
- package/dist/dgram/coap.d.ts +0 -205
- package/dist/dgram/coap.d.ts.map +0 -1
- package/dist/dgram/coap.js.map +0 -1
- package/dist/dgram/dgram.d.ts +0 -141
- package/dist/dgram/dgram.d.ts.map +0 -1
- package/dist/dgram/dgram.js.map +0 -1
- package/dist/dgram/mb_coap.d.ts +0 -24
- package/dist/dgram/mb_coap.d.ts.map +0 -1
- package/dist/dgram/mb_coap.js.map +0 -1
- package/dist/dgram/mb_mdns.d.ts +0 -24
- package/dist/dgram/mb_mdns.d.ts.map +0 -1
- package/dist/dgram/mb_mdns.js.map +0 -1
- package/dist/dgram/mdns.d.ts +0 -290
- package/dist/dgram/mdns.d.ts.map +0 -1
- package/dist/dgram/mdns.js.map +0 -1
- package/dist/dgram/multicast.d.ts +0 -67
- package/dist/dgram/multicast.d.ts.map +0 -1
- package/dist/dgram/multicast.js.map +0 -1
- package/dist/dgram/unicast.d.ts +0 -56
- package/dist/dgram/unicast.d.ts.map +0 -1
- package/dist/dgram/unicast.js.map +0 -1
- package/dist/frontend.d.ts +0 -313
- package/dist/frontend.d.ts.map +0 -1
- package/dist/frontend.js.map +0 -1
- package/dist/globalMatterbridge.d.ts +0 -59
- package/dist/globalMatterbridge.d.ts.map +0 -1
- package/dist/globalMatterbridge.js.map +0 -1
- package/dist/helpers.d.ts +0 -48
- package/dist/helpers.d.ts.map +0 -1
- package/dist/helpers.js.map +0 -1
- package/dist/index.d.ts +0 -33
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/jest-utils/jestHelpers.d.ts +0 -103
- package/dist/jest-utils/jestHelpers.d.ts.map +0 -1
- package/dist/jest-utils/jestHelpers.js.map +0 -1
- package/dist/logger/export.d.ts +0 -2
- package/dist/logger/export.d.ts.map +0 -1
- package/dist/logger/export.js.map +0 -1
- package/dist/matter/behaviors.d.ts +0 -2
- package/dist/matter/behaviors.d.ts.map +0 -1
- package/dist/matter/behaviors.js.map +0 -1
- package/dist/matter/clusters.d.ts +0 -2
- package/dist/matter/clusters.d.ts.map +0 -1
- package/dist/matter/clusters.js.map +0 -1
- package/dist/matter/devices.d.ts +0 -2
- package/dist/matter/devices.d.ts.map +0 -1
- package/dist/matter/devices.js.map +0 -1
- package/dist/matter/endpoints.d.ts +0 -2
- package/dist/matter/endpoints.d.ts.map +0 -1
- package/dist/matter/endpoints.js.map +0 -1
- package/dist/matter/export.d.ts +0 -5
- package/dist/matter/export.d.ts.map +0 -1
- package/dist/matter/export.js.map +0 -1
- package/dist/matter/types.d.ts +0 -3
- package/dist/matter/types.d.ts.map +0 -1
- package/dist/matter/types.js.map +0 -1
- package/dist/matterbridge.d.ts +0 -457
- package/dist/matterbridge.d.ts.map +0 -1
- package/dist/matterbridge.js.map +0 -1
- package/dist/matterbridgeAccessoryPlatform.d.ts +0 -42
- package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
- package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
- package/dist/matterbridgeBehaviors.d.ts +0 -1351
- package/dist/matterbridgeBehaviors.d.ts.map +0 -1
- package/dist/matterbridgeBehaviors.js.map +0 -1
- package/dist/matterbridgeDeviceTypes.d.ts +0 -761
- package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
- package/dist/matterbridgeDeviceTypes.js.map +0 -1
- package/dist/matterbridgeDynamicPlatform.d.ts +0 -42
- package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
- package/dist/matterbridgeDynamicPlatform.js.map +0 -1
- package/dist/matterbridgeEndpoint.d.ts +0 -1438
- package/dist/matterbridgeEndpoint.d.ts.map +0 -1
- package/dist/matterbridgeEndpoint.js.map +0 -1
- package/dist/matterbridgeEndpointHelpers.d.ts +0 -407
- package/dist/matterbridgeEndpointHelpers.d.ts.map +0 -1
- package/dist/matterbridgeEndpointHelpers.js.map +0 -1
- package/dist/matterbridgePlatform.d.ts +0 -379
- package/dist/matterbridgePlatform.d.ts.map +0 -1
- package/dist/matterbridgePlatform.js.map +0 -1
- package/dist/matterbridgeTypes.d.ts +0 -198
- package/dist/matterbridgeTypes.d.ts.map +0 -1
- package/dist/matterbridgeTypes.js.map +0 -1
- package/dist/pluginManager.d.ts +0 -270
- package/dist/pluginManager.d.ts.map +0 -1
- package/dist/pluginManager.js.map +0 -1
- package/dist/shelly.d.ts +0 -174
- package/dist/shelly.d.ts.map +0 -1
- package/dist/shelly.js.map +0 -1
- package/dist/storage/export.d.ts +0 -2
- package/dist/storage/export.d.ts.map +0 -1
- package/dist/storage/export.js.map +0 -1
- package/dist/update.d.ts +0 -75
- package/dist/update.d.ts.map +0 -1
- package/dist/update.js.map +0 -1
- package/dist/utils/colorUtils.d.ts +0 -99
- package/dist/utils/colorUtils.d.ts.map +0 -1
- package/dist/utils/colorUtils.js.map +0 -1
- package/dist/utils/commandLine.d.ts +0 -59
- package/dist/utils/commandLine.d.ts.map +0 -1
- package/dist/utils/commandLine.js.map +0 -1
- package/dist/utils/copyDirectory.d.ts +0 -33
- package/dist/utils/copyDirectory.d.ts.map +0 -1
- package/dist/utils/copyDirectory.js.map +0 -1
- package/dist/utils/createDirectory.d.ts +0 -34
- package/dist/utils/createDirectory.d.ts.map +0 -1
- package/dist/utils/createDirectory.js.map +0 -1
- package/dist/utils/createZip.d.ts +0 -39
- package/dist/utils/createZip.d.ts.map +0 -1
- package/dist/utils/createZip.js.map +0 -1
- package/dist/utils/deepCopy.d.ts +0 -32
- package/dist/utils/deepCopy.d.ts.map +0 -1
- package/dist/utils/deepCopy.js.map +0 -1
- package/dist/utils/deepEqual.d.ts +0 -54
- package/dist/utils/deepEqual.d.ts.map +0 -1
- package/dist/utils/deepEqual.js.map +0 -1
- package/dist/utils/error.d.ts +0 -44
- package/dist/utils/error.d.ts.map +0 -1
- package/dist/utils/error.js.map +0 -1
- package/dist/utils/export.d.ts +0 -13
- package/dist/utils/export.d.ts.map +0 -1
- package/dist/utils/export.js.map +0 -1
- package/dist/utils/hex.d.ts +0 -89
- package/dist/utils/hex.d.ts.map +0 -1
- package/dist/utils/hex.js.map +0 -1
- package/dist/utils/isvalid.d.ts +0 -103
- package/dist/utils/isvalid.d.ts.map +0 -1
- package/dist/utils/isvalid.js.map +0 -1
- package/dist/utils/network.d.ts +0 -84
- package/dist/utils/network.d.ts.map +0 -1
- package/dist/utils/network.js.map +0 -1
- package/dist/utils/spawn.d.ts +0 -33
- package/dist/utils/spawn.d.ts.map +0 -1
- package/dist/utils/spawn.js.map +0 -1
- package/dist/utils/wait.d.ts +0 -54
- package/dist/utils/wait.d.ts.map +0 -1
- package/dist/utils/wait.js.map +0 -1
|
@@ -1,70 +1,23 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This file contains functions to set and get global instances of Matterbridge, Frontend, and Logger.
|
|
3
|
-
*
|
|
4
|
-
* @file globalMatterbridge.ts
|
|
5
|
-
* @author Luca Liguori
|
|
6
|
-
* @created 2025-06-01
|
|
7
|
-
* @version 1.0.0
|
|
8
|
-
* @license Apache-2.0
|
|
9
|
-
*
|
|
10
|
-
* Copyright 2025, 2026, 2027 Luca Liguori.
|
|
11
|
-
*
|
|
12
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
-
* you may not use this file except in compliance with the License.
|
|
14
|
-
* You may obtain a copy of the License at
|
|
15
|
-
*
|
|
16
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
-
*
|
|
18
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
19
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
-
* See the License for the specific language governing permissions and
|
|
22
|
-
* limitations under the License.
|
|
23
|
-
*/
|
|
24
|
-
/**
|
|
25
|
-
* Store the Matterbridge instance globally for later retrieval.
|
|
26
|
-
*
|
|
27
|
-
* @param {Matterbridge} matterbridge An initialized Matterbridge instance
|
|
28
|
-
*/
|
|
29
1
|
export function setGlobalMatterbridge(matterbridge) {
|
|
30
2
|
globalThis.__matterbridge__ = matterbridge;
|
|
31
3
|
globalThis.__frontend__ = matterbridge.frontend;
|
|
32
4
|
globalThis.__log__ = matterbridge.log;
|
|
33
5
|
}
|
|
34
|
-
/**
|
|
35
|
-
* Retrieve the globally stored Matterbridge instance.
|
|
36
|
-
*
|
|
37
|
-
* @returns {Matterbridge} The Matterbridge instance.
|
|
38
|
-
* @throws {Error} If the Matterbridge instance is not set.
|
|
39
|
-
*/
|
|
40
6
|
export function getGlobalMatterbridge() {
|
|
41
7
|
if (!globalThis.__matterbridge__) {
|
|
42
8
|
throw new Error('Global Matterbridge instance is not set.');
|
|
43
9
|
}
|
|
44
10
|
return globalThis.__matterbridge__;
|
|
45
11
|
}
|
|
46
|
-
/**
|
|
47
|
-
* Retrieve the globally stored Frontend instance.
|
|
48
|
-
*
|
|
49
|
-
* @returns {Frontend} The Frontend instance.
|
|
50
|
-
* @throws {Error} If the Frontend instance is not set.
|
|
51
|
-
*/
|
|
52
12
|
export function getGlobalFrontend() {
|
|
53
13
|
if (!globalThis.__frontend__) {
|
|
54
14
|
throw new Error('Global Frontend instance is not set.');
|
|
55
15
|
}
|
|
56
16
|
return globalThis.__frontend__;
|
|
57
17
|
}
|
|
58
|
-
/**
|
|
59
|
-
* Retrieve the globally stored Logger instance.
|
|
60
|
-
*
|
|
61
|
-
* @returns {AnsiLogger} The AnsiLogger instance.
|
|
62
|
-
* @throws {Error} If the Logger instance is not set.
|
|
63
|
-
*/
|
|
64
18
|
export function getGlobalLog() {
|
|
65
19
|
if (!globalThis.__log__) {
|
|
66
20
|
throw new Error('Global Logger instance is not set.');
|
|
67
21
|
}
|
|
68
22
|
return globalThis.__log__;
|
|
69
23
|
}
|
|
70
|
-
//# sourceMappingURL=globalMatterbridge.js.map
|
package/dist/helpers.js
CHANGED
|
@@ -1,27 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This file contains the helpers functions of Matterbridge.
|
|
3
|
-
*
|
|
4
|
-
* @file helpers.ts
|
|
5
|
-
* @author Luca Liguori
|
|
6
|
-
* @created 2025-05-12
|
|
7
|
-
* @version 1.0.0
|
|
8
|
-
* @license Apache-2.0
|
|
9
|
-
*
|
|
10
|
-
* Copyright 2025, 2026, 2027 Luca Liguori.
|
|
11
|
-
*
|
|
12
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
-
* you may not use this file except in compliance with the License.
|
|
14
|
-
* You may obtain a copy of the License at
|
|
15
|
-
*
|
|
16
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
-
*
|
|
18
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
19
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
-
* See the License for the specific language governing permissions and
|
|
22
|
-
* limitations under the License.
|
|
23
|
-
*/
|
|
24
|
-
// @matter module
|
|
25
1
|
import { OnOff } from '@matter/main/clusters/on-off';
|
|
26
2
|
import { Endpoint } from '@matter/node';
|
|
27
3
|
import { BridgedDeviceBasicInformationServer } from '@matter/node/behaviors/bridged-device-basic-information';
|
|
@@ -30,24 +6,8 @@ import { OnOffPlugInUnitDevice } from '@matter/node/devices/on-off-plug-in-unit'
|
|
|
30
6
|
import { MountedOnOffControlDevice } from '@matter/node/devices/mounted-on-off-control';
|
|
31
7
|
import { OnOffLightDevice } from '@matter/node/devices/on-off-light';
|
|
32
8
|
import { OnOffLightSwitchDevice } from '@matter/node/devices/on-off-light-switch';
|
|
33
|
-
// Matterbridge
|
|
34
9
|
import { hasParameter } from './utils/commandLine.js';
|
|
35
|
-
/**
|
|
36
|
-
* Adds a virtual device to the provided endpoint, sets up an event listener for device state changes,
|
|
37
|
-
* and ensures the device is initialized in the off state.
|
|
38
|
-
*
|
|
39
|
-
* @param {Endpoint<AggregatorEndpoint>} aggregatorEndpoint - The aggragator endpoint to which the virtual device will be added.
|
|
40
|
-
* @param {string} name - The name of the virtual device. Spaces in the name are removed to form the device ID.
|
|
41
|
-
* @param {'light' | 'outlet' | 'switch' | 'mounted_switch'} type - The type of the virtual device. Can be 'light', 'outlet', 'switch', or 'mounted_switch'.
|
|
42
|
-
* @param {() => Promise<void>} callback - A callback function that gets executed when the device's on/off state changes to true.
|
|
43
|
-
* @returns {Promise<Endpoint>} A promise that resolves with the created virtual device.
|
|
44
|
-
* @remarks The virtual device is created as an instance of `Endpoint` with the `OnOffPlugInUnitDevice` device type.
|
|
45
|
-
* The onOff state always reverts to false when the device is turned on.
|
|
46
|
-
*/
|
|
47
10
|
export async function addVirtualDevice(aggregatorEndpoint, name, type, callback) {
|
|
48
|
-
// Create a new virtual device by instantiating `Endpoint` with device information.
|
|
49
|
-
// The device ID is created by replacing all spaces in the name with an empty string.
|
|
50
|
-
// The node label of the bridged device basic information is set to the given name.
|
|
51
11
|
let deviceType;
|
|
52
12
|
switch (type) {
|
|
53
13
|
case 'light':
|
|
@@ -68,9 +28,7 @@ export async function addVirtualDevice(aggregatorEndpoint, name, type, callback)
|
|
|
68
28
|
bridgedDeviceBasicInformation: { nodeLabel: name.slice(0, 32) },
|
|
69
29
|
onOff: { onOff: false, startUpOnOff: OnOff.StartUpOnOff.Off },
|
|
70
30
|
});
|
|
71
|
-
// Set up an event listener for when the `onOff` state changes.
|
|
72
31
|
device.events.onOff.onOff$Changed.on((value) => {
|
|
73
|
-
// If the `onOff` state becomes true, turn off the virtual device and execute the callback.
|
|
74
32
|
if (value) {
|
|
75
33
|
callback();
|
|
76
34
|
process.nextTick(async () => {
|
|
@@ -78,24 +36,14 @@ export async function addVirtualDevice(aggregatorEndpoint, name, type, callback)
|
|
|
78
36
|
await device.setStateOf(OnOffBaseServer, { onOff: false });
|
|
79
37
|
}
|
|
80
38
|
catch (_error) {
|
|
81
|
-
// Not necessary to handle the error
|
|
82
39
|
}
|
|
83
40
|
});
|
|
84
41
|
}
|
|
85
42
|
});
|
|
86
|
-
// Add the created device to the given endpoint.
|
|
87
43
|
await aggregatorEndpoint.add(device);
|
|
88
|
-
// Initially set the state of the virtual device's `OnOffBaseServer` to false (off).
|
|
89
44
|
await device.setStateOf(OnOffBaseServer, { onOff: false });
|
|
90
45
|
return device;
|
|
91
46
|
}
|
|
92
|
-
/**
|
|
93
|
-
* Creates and add the virtual devices to the aggregator.
|
|
94
|
-
*
|
|
95
|
-
* @param {Matterbridge} matterbridge - The Matterbridge instance.
|
|
96
|
-
* @param {Endpoint<AggregatorEndpoint>} aggregatorEndpoint - The aggregator node to add the virtual devices to.
|
|
97
|
-
* @returns {Promise<void>} A promise that resolves when the virtual devices are added.
|
|
98
|
-
*/
|
|
99
47
|
export async function addVirtualDevices(matterbridge, aggregatorEndpoint) {
|
|
100
48
|
if (matterbridge.matterbridgeInformation.virtualMode !== 'disabled' && matterbridge.bridgeMode === 'bridge' && aggregatorEndpoint) {
|
|
101
49
|
matterbridge.log.notice(`Creating virtual devices for Matterbridge server node...`);
|
|
@@ -144,4 +92,3 @@ export async function addVirtualDevices(matterbridge, aggregatorEndpoint) {
|
|
|
144
92
|
}
|
|
145
93
|
}
|
|
146
94
|
}
|
|
147
|
-
//# sourceMappingURL=helpers.js.map
|
package/dist/index.js
CHANGED
|
@@ -1,31 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description This file contains the entry point of Matterbridge.
|
|
3
|
-
* @file index.ts
|
|
4
|
-
* @author Luca Liguori
|
|
5
|
-
* @created 2023-12-29
|
|
6
|
-
* @version 1.0.7
|
|
7
|
-
* @license Apache-2.0
|
|
8
|
-
*
|
|
9
|
-
* Copyright 2023, 2024, 2025 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
|
-
// AnsiLogger module
|
|
24
1
|
import { AnsiLogger } from 'node-ansi-logger';
|
|
25
|
-
// Matterbridge
|
|
26
2
|
import { Matterbridge } from './matterbridge.js';
|
|
27
3
|
import { hasParameter } from './utils/export.js';
|
|
28
|
-
// Matterbridge
|
|
29
4
|
export * from './matterbridge.js';
|
|
30
5
|
export * from './matterbridgeTypes.js';
|
|
31
6
|
export * from './matterbridgeEndpoint.js';
|
|
@@ -36,10 +11,7 @@ export * from './matterbridgePlatform.js';
|
|
|
36
11
|
export * from './matterbridgeAccessoryPlatform.js';
|
|
37
12
|
export * from './matterbridgeDynamicPlatform.js';
|
|
38
13
|
export { addVirtualDevice } from './helpers.js';
|
|
39
|
-
const log = new AnsiLogger({ logName: 'Main', logTimestampFormat: 4
|
|
40
|
-
/**
|
|
41
|
-
* Main function to load the Matterbridge instance.
|
|
42
|
-
*/
|
|
14
|
+
const log = new AnsiLogger({ logName: 'Main', logTimestampFormat: 4, logLevel: hasParameter('debug') ? "debug" : "info" });
|
|
43
15
|
async function main() {
|
|
44
16
|
log.debug('***Matterbridge.loadInstance() called');
|
|
45
17
|
await Matterbridge.loadInstance();
|
|
@@ -48,4 +20,3 @@ async function main() {
|
|
|
48
20
|
main().catch((error) => {
|
|
49
21
|
log.error(`Matterbridge.loadInstance() failed with error: ${error instanceof Error ? error.message : error}`);
|
|
50
22
|
});
|
|
51
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,48 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description This file contains the Jest helpers.
|
|
3
|
-
* @file src/jest/helpers.test.ts
|
|
4
|
-
* @author Luca Liguori
|
|
5
|
-
* @created 2025-09-03
|
|
6
|
-
* @version 1.0.1
|
|
7
|
-
* @license Apache-2.0
|
|
8
|
-
*
|
|
9
|
-
* Copyright 2025, 2026, 2027 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
1
|
import { rmSync } from 'node:fs';
|
|
24
2
|
import { inspect } from 'node:util';
|
|
25
|
-
// Matterbridge imports
|
|
26
3
|
import { DeviceTypeId, Endpoint, Environment, ServerNode, ServerNodeStore, VendorId, LogFormat as MatterLogFormat, LogLevel as MatterLogLevel, Lifecycle } from '@matter/main';
|
|
27
4
|
import { AggregatorEndpoint, RootEndpoint } from '@matter/main/endpoints';
|
|
28
5
|
import { MdnsService } from '@matter/main/protocol';
|
|
29
|
-
// Plugins imports
|
|
30
|
-
/*
|
|
31
|
-
import { DeviceTypeId, Endpoint, Environment, MdnsService, ServerNode, ServerNodeStore, VendorId, LogFormat as MatterLogFormat, LogLevel as MatterLogLevel } from 'matterbridge/matter';
|
|
32
|
-
import { RootEndpoint, AggregatorEndpoint } from 'matterbridge/matter/endpoints';
|
|
33
|
-
*/
|
|
34
|
-
/**
|
|
35
|
-
* Advance the Node.js event loop deterministically to allow chained asynchronous work (Promises scheduled in
|
|
36
|
-
* microtasks and follow‑up macrotasks) to complete inside tests without adding arbitrary long timeouts.
|
|
37
|
-
*
|
|
38
|
-
* NOTE: This does not guarantee OS level network IO completion—only JavaScript task queue progression inside the
|
|
39
|
-
* current process.
|
|
40
|
-
*
|
|
41
|
-
* @param {number} ticks Number of macrotask (setImmediate) turns to yield (default 3).
|
|
42
|
-
* @param {number} microTurns Number of microtask drains (Promise.resolve chains) after macrotask yielding (default 10).
|
|
43
|
-
* @param {number} pause Final timer delay in ms; set 0 to disable (default 100ms).
|
|
44
|
-
* @returns {Promise<void>} Resolves after the requested event loop advancement has completed.
|
|
45
|
-
*/
|
|
46
6
|
export async function flushAsync(ticks = 3, microTurns = 10, pause = 100) {
|
|
47
7
|
for (let i = 0; i < ticks; i++)
|
|
48
8
|
await new Promise((resolve) => setImmediate(resolve));
|
|
@@ -51,19 +11,6 @@ export async function flushAsync(ticks = 3, microTurns = 10, pause = 100) {
|
|
|
51
11
|
if (pause)
|
|
52
12
|
await new Promise((resolve) => setTimeout(resolve, pause));
|
|
53
13
|
}
|
|
54
|
-
/**
|
|
55
|
-
* Flush (await) the lazy endpoint number persistence mechanism used by matter.js.
|
|
56
|
-
*
|
|
57
|
-
* Background:
|
|
58
|
-
* assignNumber() batches persistence (store.saveNumber + updating __nextNumber__) via an internal promise (#numbersPersisted).
|
|
59
|
-
* Calling endpointStores.close() waits for the current batch only. If new endpoints were added in the same macrotask
|
|
60
|
-
* cycle additional micro/macro turns might be needed to ensure the batch started. We defensively yield macrotasks
|
|
61
|
-
* (setImmediate) and then await close() multiple rounds.
|
|
62
|
-
*
|
|
63
|
-
* @param {ServerNode} targetServer The server whose endpoint numbering persistence should be flushed.
|
|
64
|
-
* @param {number} rounds Number of macrotask + close cycles to run (2 is usually sufficient; 1 often works).
|
|
65
|
-
* @returns {Promise<void>} Resolves when pending number persistence batches have completed.
|
|
66
|
-
*/
|
|
67
14
|
export async function flushAllEndpointNumberPersistence(targetServer, rounds = 2) {
|
|
68
15
|
const nodeStore = targetServer.env.get(ServerNodeStore);
|
|
69
16
|
for (let i = 0; i < rounds; i++) {
|
|
@@ -71,12 +18,6 @@ export async function flushAllEndpointNumberPersistence(targetServer, rounds = 2
|
|
|
71
18
|
await nodeStore.endpointStores.close();
|
|
72
19
|
}
|
|
73
20
|
}
|
|
74
|
-
/**
|
|
75
|
-
* Collect all endpoints in the server endpoint tree (root -> descendants).
|
|
76
|
-
*
|
|
77
|
-
* @param {Endpoint} root Root endpoint (typically the ServerNode root endpoint cast as Endpoint).
|
|
78
|
-
* @returns {Endpoint[]} Flat array including the root and every descendant once.
|
|
79
|
-
*/
|
|
80
21
|
function collectAllEndpoints(root) {
|
|
81
22
|
const list = [];
|
|
82
23
|
const walk = (ep) => {
|
|
@@ -90,26 +31,14 @@ function collectAllEndpoints(root) {
|
|
|
90
31
|
walk(root);
|
|
91
32
|
return list;
|
|
92
33
|
}
|
|
93
|
-
/**
|
|
94
|
-
* Assert that every endpoint attached to the server has an assigned and (batch-)persisted endpoint number.
|
|
95
|
-
*
|
|
96
|
-
* This waits for any outstanding number persistence batch (endpointStores.close()), then traverses the endpoint
|
|
97
|
-
* graph and asserts:
|
|
98
|
-
* - Root endpoint: number is 0 (allowing undefined to coerce to 0 via nullish coalescing check).
|
|
99
|
-
* - All other endpoints: number > 0.
|
|
100
|
-
*
|
|
101
|
-
* @param {ServerNode} targetServer The server whose endpoint numbers are verified.
|
|
102
|
-
* @returns {Promise<void>} Resolves when assertions complete.
|
|
103
|
-
*/
|
|
104
34
|
export async function assertAllEndpointNumbersPersisted(targetServer) {
|
|
105
35
|
const nodeStore = targetServer.env.get(ServerNodeStore);
|
|
106
|
-
// Ensure any pending persistence finished (flush any in-flight batch promise)
|
|
107
36
|
await nodeStore.endpointStores.close();
|
|
108
37
|
const all = collectAllEndpoints(targetServer);
|
|
109
38
|
for (const ep of all) {
|
|
110
39
|
const store = nodeStore.storeForEndpoint(ep);
|
|
111
40
|
if (ep.maybeNumber === 0) {
|
|
112
|
-
expect(store.number ?? 0).toBe(0);
|
|
41
|
+
expect(store.number ?? 0).toBe(0);
|
|
113
42
|
}
|
|
114
43
|
else {
|
|
115
44
|
expect(store.number).toBeGreaterThan(0);
|
|
@@ -117,20 +46,11 @@ export async function assertAllEndpointNumbersPersisted(targetServer) {
|
|
|
117
46
|
}
|
|
118
47
|
return all.length;
|
|
119
48
|
}
|
|
120
|
-
/**
|
|
121
|
-
* Create a Matterbridge Environment for testing.
|
|
122
|
-
* It will remove any existing home directory.
|
|
123
|
-
*
|
|
124
|
-
* @param {string} homeDir Home directory for the environment.
|
|
125
|
-
* @returns {Environment} The created environment.
|
|
126
|
-
*/
|
|
127
49
|
export function createTestEnvironment(homeDir) {
|
|
128
50
|
expect(homeDir).toBeDefined();
|
|
129
51
|
expect(typeof homeDir).toBe('string');
|
|
130
|
-
expect(homeDir.length).toBeGreaterThan(5);
|
|
131
|
-
// Cleanup any existing home directory
|
|
52
|
+
expect(homeDir.length).toBeGreaterThan(5);
|
|
132
53
|
rmSync(homeDir, { recursive: true, force: true });
|
|
133
|
-
// Setup the matter environment
|
|
134
54
|
const environment = Environment.default;
|
|
135
55
|
environment.vars.set('log.level', MatterLogLevel.DEBUG);
|
|
136
56
|
environment.vars.set('log.format', MatterLogFormat.ANSI);
|
|
@@ -139,15 +59,7 @@ export function createTestEnvironment(homeDir) {
|
|
|
139
59
|
environment.vars.set('runtime.exitcode', false);
|
|
140
60
|
return environment;
|
|
141
61
|
}
|
|
142
|
-
/**
|
|
143
|
-
* Start a Matterbridge ServerNode for testing.
|
|
144
|
-
*
|
|
145
|
-
* @param {string} name Name of the server (used for logging and product description).
|
|
146
|
-
* @param {number} port TCP port to listen on.
|
|
147
|
-
* @returns {Promise<[ServerNode<ServerNode.RootEndpoint>, Endpoint<AggregatorEndpoint>]>} Resolves to an array containing the created ServerNode and its AggregatorNode.
|
|
148
|
-
*/
|
|
149
62
|
export async function startServerNode(name, port) {
|
|
150
|
-
// Create the server node
|
|
151
63
|
const server = await ServerNode.create({
|
|
152
64
|
id: name + 'ServerNode',
|
|
153
65
|
productDescription: {
|
|
@@ -156,7 +68,6 @@ export async function startServerNode(name, port) {
|
|
|
156
68
|
vendorId: VendorId(0xfff1),
|
|
157
69
|
productId: 0x8000,
|
|
158
70
|
},
|
|
159
|
-
// Provide defaults for the BasicInformation cluster on the Root endpoint
|
|
160
71
|
basicInformation: {
|
|
161
72
|
vendorId: VendorId(0xfff1),
|
|
162
73
|
vendorName: 'Matterbridge',
|
|
@@ -173,26 +84,21 @@ export async function startServerNode(name, port) {
|
|
|
173
84
|
});
|
|
174
85
|
expect(server).toBeDefined();
|
|
175
86
|
expect(server.lifecycle.isReady).toBeTruthy();
|
|
176
|
-
// Create the aggregator node
|
|
177
87
|
const aggregator = new Endpoint(AggregatorEndpoint, {
|
|
178
88
|
id: name + 'AggregatorNode',
|
|
179
89
|
});
|
|
180
90
|
expect(aggregator).toBeDefined();
|
|
181
|
-
// Add the aggregator to the server
|
|
182
91
|
await server.add(aggregator);
|
|
183
92
|
expect(server.parts.has(aggregator.id)).toBeTruthy();
|
|
184
93
|
expect(server.parts.has(aggregator)).toBeTruthy();
|
|
185
94
|
expect(aggregator.lifecycle.isReady).toBeTruthy();
|
|
186
|
-
// Run the server
|
|
187
95
|
expect(server.lifecycle.isOnline).toBeFalsy();
|
|
188
|
-
// Wait for the server to be online
|
|
189
96
|
await new Promise((resolve) => {
|
|
190
97
|
server.lifecycle.online.on(async () => {
|
|
191
98
|
resolve();
|
|
192
99
|
});
|
|
193
100
|
server.start();
|
|
194
101
|
});
|
|
195
|
-
// Check if the server is online
|
|
196
102
|
expect(server.lifecycle.isReady).toBeTruthy();
|
|
197
103
|
expect(server.lifecycle.isOnline).toBeTruthy();
|
|
198
104
|
expect(server.lifecycle.isCommissioned).toBeFalsy();
|
|
@@ -206,36 +112,18 @@ export async function startServerNode(name, port) {
|
|
|
206
112
|
expect(aggregator.lifecycle.hasNumber).toBeTruthy();
|
|
207
113
|
return [server, aggregator];
|
|
208
114
|
}
|
|
209
|
-
/**
|
|
210
|
-
* Stop a Matterbridge ServerNode.
|
|
211
|
-
*
|
|
212
|
-
* @param {ServerNode<ServerNode.RootEndpoint>} server The server to stop.
|
|
213
|
-
* @returns {Promise<void>} Resolves when the server has stopped.
|
|
214
|
-
*/
|
|
215
115
|
export async function stopServerNode(server) {
|
|
216
|
-
// Flush any pending endpoint number persistence
|
|
217
116
|
await flushAllEndpointNumberPersistence(server);
|
|
218
|
-
// Ensure all endpoint numbers are persisted
|
|
219
117
|
await assertAllEndpointNumbersPersisted(server);
|
|
220
|
-
// Stop the server
|
|
221
118
|
expect(server).toBeDefined();
|
|
222
119
|
expect(server.lifecycle.isReady).toBeTruthy();
|
|
223
120
|
expect(server.lifecycle.isOnline).toBeTruthy();
|
|
224
121
|
await server.close();
|
|
225
122
|
expect(server.lifecycle.isReady).toBeTruthy();
|
|
226
123
|
expect(server.lifecycle.isOnline).toBeFalsy();
|
|
227
|
-
// stop the mDNS service
|
|
228
124
|
await server.env.get(MdnsService)[Symbol.asyncDispose]();
|
|
229
|
-
// Ensure the queue is empty and pause 100ms
|
|
230
125
|
await flushAsync();
|
|
231
126
|
}
|
|
232
|
-
/**
|
|
233
|
-
* Add a device (endpoint) to a server or aggregator.
|
|
234
|
-
*
|
|
235
|
-
* @param {ServerNode<ServerNode.RootEndpoint> | Endpoint<AggregatorEndpoint>} owner The server or aggregator to add the device to.
|
|
236
|
-
* @param {Endpoint} device The device to add.
|
|
237
|
-
* @returns {Promise<void>} Resolves when the device has been added and is ready.
|
|
238
|
-
*/
|
|
239
127
|
export async function addDevice(owner, device) {
|
|
240
128
|
expect(owner).toBeDefined();
|
|
241
129
|
expect(device).toBeDefined();
|
|
@@ -248,7 +136,6 @@ export async function addDevice(owner, device) {
|
|
|
248
136
|
catch (error) {
|
|
249
137
|
const errorMessage = error instanceof Error ? error.message : error;
|
|
250
138
|
const errorInspect = inspect(error, { depth: 10 });
|
|
251
|
-
// eslint-disable-next-line no-console
|
|
252
139
|
console.error(`Error adding device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}\nstack: ${errorInspect}`);
|
|
253
140
|
return false;
|
|
254
141
|
}
|
|
@@ -261,13 +148,6 @@ export async function addDevice(owner, device) {
|
|
|
261
148
|
expect(device.construction.status).toBe(Lifecycle.Status.Active);
|
|
262
149
|
return true;
|
|
263
150
|
}
|
|
264
|
-
/**
|
|
265
|
-
* Add a device (endpoint) to a server or aggregator.
|
|
266
|
-
*
|
|
267
|
-
* @param {ServerNode<ServerNode.RootEndpoint> | Endpoint<AggregatorEndpoint>} owner The server or aggregator to add the device to.
|
|
268
|
-
* @param {Endpoint} device The device to add.
|
|
269
|
-
* @returns {Promise<void>} Resolves when the device has been added and is ready.
|
|
270
|
-
*/
|
|
271
151
|
export async function deleteDevice(owner, device) {
|
|
272
152
|
expect(owner).toBeDefined();
|
|
273
153
|
expect(device).toBeDefined();
|
|
@@ -280,7 +160,6 @@ export async function deleteDevice(owner, device) {
|
|
|
280
160
|
catch (error) {
|
|
281
161
|
const errorMessage = error instanceof Error ? error.message : error;
|
|
282
162
|
const errorInspect = inspect(error, { depth: 10 });
|
|
283
|
-
// eslint-disable-next-line no-console
|
|
284
163
|
console.error(`Error deleting device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}\nstack: ${errorInspect}`);
|
|
285
164
|
return false;
|
|
286
165
|
}
|
|
@@ -293,4 +172,3 @@ export async function deleteDevice(owner, device) {
|
|
|
293
172
|
expect(device.construction.status).toBe(Lifecycle.Status.Destroyed);
|
|
294
173
|
return true;
|
|
295
174
|
}
|
|
296
|
-
//# sourceMappingURL=jestHelpers.js.map
|
package/dist/logger/export.js
CHANGED
package/dist/matter/behaviors.js
CHANGED
package/dist/matter/clusters.js
CHANGED
package/dist/matter/devices.js
CHANGED
package/dist/matter/endpoints.js
CHANGED
package/dist/matter/export.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
/* eslint-disable import/export */
|
|
2
|
-
// @matter
|
|
3
1
|
export * from '@matter/main';
|
|
4
2
|
export { SemanticNamespace, ClosureTag, CompassDirectionTag, CompassLocationTag, DirectionTag, ElectricalMeasurementTag, LaundryTag, LevelTag, LocationTag, NumberTag, PositionTag, PowerSourceTag, RefrigeratorTag, RoomAirConditionerTag, SwitchesTag, } from '@matter/main';
|
|
5
3
|
export { AttributeElement, ClusterElement, ClusterModel, CommandElement, EventElement, FieldElement } from '@matter/main/model';
|
|
6
4
|
export { MdnsService, Val } from '@matter/main/protocol';
|
|
7
|
-
//# sourceMappingURL=export.js.map
|