homebridge 2.0.0-beta.44 → 2.0.0-beta.46
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/api.d.ts +3 -365
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +13 -85
- package/dist/api.js.map +1 -1
- package/dist/bridgeService.d.ts +0 -25
- package/dist/bridgeService.d.ts.map +1 -1
- package/dist/bridgeService.js +32 -85
- package/dist/bridgeService.js.map +1 -1
- package/dist/childBridgeFork.d.ts +12 -15
- package/dist/childBridgeFork.d.ts.map +1 -1
- package/dist/childBridgeFork.js +152 -83
- package/dist/childBridgeFork.js.map +1 -1
- package/dist/childBridgeService.d.ts +21 -105
- package/dist/childBridgeService.d.ts.map +1 -1
- package/dist/childBridgeService.js +57 -134
- package/dist/childBridgeService.js.map +1 -1
- package/dist/cli.js +0 -2
- package/dist/cli.js.map +1 -1
- package/dist/externalPortService.d.ts +0 -21
- package/dist/externalPortService.d.ts.map +1 -1
- package/dist/externalPortService.js +0 -28
- package/dist/externalPortService.js.map +1 -1
- package/dist/index.d.ts +0 -112
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -44
- package/dist/index.js.map +1 -1
- package/dist/ipcService.d.ts +23 -15
- package/dist/ipcService.d.ts.map +1 -1
- package/dist/ipcService.js +6 -12
- package/dist/ipcService.js.map +1 -1
- package/dist/logger.d.ts +0 -46
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +13 -57
- package/dist/logger.js.map +1 -1
- package/dist/matter/BaseMatterManager.d.ts +19 -0
- package/dist/matter/BaseMatterManager.d.ts.map +1 -0
- package/dist/matter/BaseMatterManager.js +170 -0
- package/dist/matter/BaseMatterManager.js.map +1 -0
- package/dist/matter/ChildBridgeMatterManager.d.ts +7 -69
- package/dist/matter/ChildBridgeMatterManager.d.ts.map +1 -1
- package/dist/matter/ChildBridgeMatterManager.js +51 -234
- package/dist/matter/ChildBridgeMatterManager.js.map +1 -1
- package/dist/matter/ClusterCommandMapper.d.ts +5 -0
- package/dist/matter/ClusterCommandMapper.d.ts.map +1 -0
- package/dist/matter/ClusterCommandMapper.js +203 -0
- package/dist/matter/ClusterCommandMapper.js.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.d.ts +0 -27
- package/dist/matter/ExternalMatterAccessoryPublisher.d.ts.map +1 -1
- package/dist/matter/ExternalMatterAccessoryPublisher.js +3 -28
- package/dist/matter/ExternalMatterAccessoryPublisher.js.map +1 -1
- package/dist/matter/MatterAPIImpl.d.ts +0 -68
- package/dist/matter/MatterAPIImpl.d.ts.map +1 -1
- package/dist/matter/MatterAPIImpl.js +7 -107
- package/dist/matter/MatterAPIImpl.js.map +1 -1
- package/dist/matter/MatterBridgeManager.d.ts +9 -60
- package/dist/matter/MatterBridgeManager.d.ts.map +1 -1
- package/dist/matter/MatterBridgeManager.js +140 -216
- package/dist/matter/MatterBridgeManager.js.map +1 -1
- package/dist/matter/MatterConfigCollector.d.ts +1 -20
- package/dist/matter/MatterConfigCollector.d.ts.map +1 -1
- package/dist/matter/MatterConfigCollector.js +15 -28
- package/dist/matter/MatterConfigCollector.js.map +1 -1
- package/dist/matter/accessoryCache.d.ts +0 -48
- package/dist/matter/accessoryCache.d.ts.map +1 -1
- package/dist/matter/accessoryCache.js +1 -60
- package/dist/matter/accessoryCache.js.map +1 -1
- package/dist/matter/behaviors/AirQualityBehavior.d.ts +0 -42
- package/dist/matter/behaviors/AirQualityBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/AirQualityBehavior.js +0 -44
- package/dist/matter/behaviors/AirQualityBehavior.js.map +1 -1
- package/dist/matter/behaviors/BehaviorRegistry.d.ts +4 -42
- package/dist/matter/behaviors/BehaviorRegistry.d.ts.map +1 -1
- package/dist/matter/behaviors/BehaviorRegistry.js +12 -42
- package/dist/matter/behaviors/BehaviorRegistry.js.map +1 -1
- package/dist/matter/behaviors/ColorControlBehavior.d.ts +0 -49
- package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/ColorControlBehavior.js +0 -90
- package/dist/matter/behaviors/ColorControlBehavior.js.map +1 -1
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.d.ts +0 -91
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.js +0 -96
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.js.map +1 -1
- package/dist/matter/behaviors/DoorLockBehavior.d.ts +0 -11
- package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/DoorLockBehavior.js +0 -25
- package/dist/matter/behaviors/DoorLockBehavior.js.map +1 -1
- package/dist/matter/behaviors/FanControlBehavior.d.ts +0 -11
- package/dist/matter/behaviors/FanControlBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/FanControlBehavior.js +0 -25
- package/dist/matter/behaviors/FanControlBehavior.js.map +1 -1
- package/dist/matter/behaviors/IdentifyBehavior.d.ts +0 -11
- package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/IdentifyBehavior.js +0 -17
- package/dist/matter/behaviors/IdentifyBehavior.js.map +1 -1
- package/dist/matter/behaviors/LevelControlBehavior.d.ts +0 -20
- package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/LevelControlBehavior.js +0 -52
- package/dist/matter/behaviors/LevelControlBehavior.js.map +1 -1
- package/dist/matter/behaviors/OnOffBehavior.d.ts +0 -17
- package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/OnOffBehavior.js +0 -38
- package/dist/matter/behaviors/OnOffBehavior.js.map +1 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts +0 -11
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.js +0 -17
- package/dist/matter/behaviors/RvcCleanModeBehavior.js.map +1 -1
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +0 -11
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js +0 -29
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js.map +1 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts +0 -11
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.js +0 -17
- package/dist/matter/behaviors/RvcRunModeBehavior.js.map +1 -1
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +0 -11
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/ServiceAreaBehavior.js +0 -23
- package/dist/matter/behaviors/ServiceAreaBehavior.js.map +1 -1
- package/dist/matter/behaviors/ThermostatBehavior.d.ts +0 -11
- package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/ThermostatBehavior.js +0 -39
- package/dist/matter/behaviors/ThermostatBehavior.js.map +1 -1
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts +0 -17
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/WindowCoveringBehavior.js +0 -56
- package/dist/matter/behaviors/WindowCoveringBehavior.js.map +1 -1
- package/dist/matter/behaviors/index.d.ts +0 -5
- package/dist/matter/behaviors/index.d.ts.map +1 -1
- package/dist/matter/behaviors/index.js +0 -5
- package/dist/matter/behaviors/index.js.map +1 -1
- package/dist/matter/configValidator.d.ts +0 -55
- package/dist/matter/configValidator.d.ts.map +1 -1
- package/dist/matter/configValidator.js +1 -68
- package/dist/matter/configValidator.js.map +1 -1
- package/dist/matter/errorHandler.d.ts +0 -22
- package/dist/matter/errorHandler.d.ts.map +1 -1
- package/dist/matter/errorHandler.js +0 -32
- package/dist/matter/errorHandler.js.map +1 -1
- package/dist/matter/errors.d.ts +0 -132
- package/dist/matter/errors.d.ts.map +1 -1
- package/dist/matter/errors.js +0 -132
- package/dist/matter/errors.js.map +1 -1
- package/dist/matter/index.d.ts +0 -30
- package/dist/matter/index.d.ts.map +1 -1
- package/dist/matter/index.js +0 -13
- package/dist/matter/index.js.map +1 -1
- package/dist/matter/logFormatter.d.ts +0 -17
- package/dist/matter/logFormatter.d.ts.map +1 -1
- package/dist/matter/logFormatter.js +5 -63
- package/dist/matter/logFormatter.js.map +1 -1
- package/dist/matter/server.d.ts +12 -236
- package/dist/matter/server.d.ts.map +1 -1
- package/dist/matter/server.js +177 -488
- package/dist/matter/server.js.map +1 -1
- package/dist/matter/serverHelpers.d.ts +0 -56
- package/dist/matter/serverHelpers.d.ts.map +1 -1
- package/dist/matter/serverHelpers.js +1 -66
- package/dist/matter/serverHelpers.js.map +1 -1
- package/dist/matter/sharedTypes.d.ts +0 -83
- package/dist/matter/sharedTypes.d.ts.map +1 -1
- package/dist/matter/sharedTypes.js +0 -26
- package/dist/matter/sharedTypes.js.map +1 -1
- package/dist/matter/storage.d.ts +0 -90
- package/dist/matter/storage.d.ts.map +1 -1
- package/dist/matter/storage.js +2 -130
- package/dist/matter/storage.js.map +1 -1
- package/dist/matter/typeHelpers.d.ts +0 -30
- package/dist/matter/typeHelpers.d.ts.map +1 -1
- package/dist/matter/typeHelpers.js +0 -24
- package/dist/matter/typeHelpers.js.map +1 -1
- package/dist/matter/types.d.ts +0 -273
- package/dist/matter/types.d.ts.map +1 -1
- package/dist/matter/types.js +0 -83
- package/dist/matter/types.js.map +1 -1
- package/dist/platformAccessory.d.ts +0 -15
- package/dist/platformAccessory.d.ts.map +1 -1
- package/dist/platformAccessory.js +6 -32
- package/dist/platformAccessory.js.map +1 -1
- package/dist/plugin.d.ts +0 -3
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +6 -29
- package/dist/plugin.js.map +1 -1
- package/dist/pluginManager.d.ts +0 -22
- package/dist/pluginManager.d.ts.map +1 -1
- package/dist/pluginManager.js +18 -41
- package/dist/pluginManager.js.map +1 -1
- package/dist/server.d.ts +9 -29
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +308 -157
- package/dist/server.js.map +1 -1
- package/dist/user.d.ts +0 -3
- package/dist/user.d.ts.map +1 -1
- package/dist/user.js +2 -5
- package/dist/user.js.map +1 -1
- package/dist/util/mac.js +0 -1
- package/dist/util/mac.js.map +1 -1
- package/package.json +4 -4
- package/dist/api.spec.d.ts +0 -2
- package/dist/api.spec.d.ts.map +0 -1
- package/dist/api.spec.js +0 -413
- package/dist/api.spec.js.map +0 -1
- package/dist/logger.spec.d.ts +0 -2
- package/dist/logger.spec.d.ts.map +0 -1
- package/dist/logger.spec.js +0 -95
- package/dist/logger.spec.js.map +0 -1
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts +0 -2
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts.map +0 -1
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.js +0 -293
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.js.map +0 -1
- package/dist/matter/accessoryCache.spec.d.ts +0 -2
- package/dist/matter/accessoryCache.spec.d.ts.map +0 -1
- package/dist/matter/accessoryCache.spec.js +0 -452
- package/dist/matter/accessoryCache.spec.js.map +0 -1
- package/dist/matter/behaviors/AirQualityBehavior.spec.d.ts +0 -5
- package/dist/matter/behaviors/AirQualityBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/AirQualityBehavior.spec.js +0 -46
- package/dist/matter/behaviors/AirQualityBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts +0 -2
- package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/BehaviorRegistry.spec.js +0 -307
- package/dist/matter/behaviors/BehaviorRegistry.spec.js.map +0 -1
- package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/ColorControlBehavior.spec.js +0 -29
- package/dist/matter/behaviors/ColorControlBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.d.ts +0 -5
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.js +0 -95
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/DoorLockBehavior.spec.js +0 -120
- package/dist/matter/behaviors/DoorLockBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/FanControlBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/FanControlBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/FanControlBehavior.spec.js +0 -23
- package/dist/matter/behaviors/FanControlBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/IdentifyBehavior.spec.js +0 -64
- package/dist/matter/behaviors/IdentifyBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/LevelControlBehavior.spec.js +0 -145
- package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/OnOffBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/OnOffBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/OnOffBehavior.spec.js +0 -128
- package/dist/matter/behaviors/OnOffBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js +0 -57
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js +0 -55
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js +0 -57
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js +0 -53
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/ThermostatBehavior.spec.js +0 -23
- package/dist/matter/behaviors/ThermostatBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.js +0 -27
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.js.map +0 -1
- package/dist/matter/configValidator.spec.d.ts +0 -2
- package/dist/matter/configValidator.spec.d.ts.map +0 -1
- package/dist/matter/configValidator.spec.js +0 -390
- package/dist/matter/configValidator.spec.js.map +0 -1
- package/dist/matter/errorHandler.spec.d.ts +0 -2
- package/dist/matter/errorHandler.spec.d.ts.map +0 -1
- package/dist/matter/errorHandler.spec.js +0 -159
- package/dist/matter/errorHandler.spec.js.map +0 -1
- package/dist/matter/logFormatter.spec.d.ts +0 -2
- package/dist/matter/logFormatter.spec.d.ts.map +0 -1
- package/dist/matter/logFormatter.spec.js +0 -252
- package/dist/matter/logFormatter.spec.js.map +0 -1
- package/dist/matter/serverHelpers.spec.d.ts +0 -2
- package/dist/matter/serverHelpers.spec.d.ts.map +0 -1
- package/dist/matter/serverHelpers.spec.js +0 -527
- package/dist/matter/serverHelpers.spec.js.map +0 -1
- package/dist/matter/storage.spec.d.ts +0 -2
- package/dist/matter/storage.spec.d.ts.map +0 -1
- package/dist/matter/storage.spec.js +0 -570
- package/dist/matter/storage.spec.js.map +0 -1
- package/dist/matter/typeHelpers.spec.d.ts +0 -2
- package/dist/matter/typeHelpers.spec.d.ts.map +0 -1
- package/dist/matter/typeHelpers.spec.js +0 -127
- package/dist/matter/typeHelpers.spec.js.map +0 -1
- package/dist/platformAccessory.spec.d.ts +0 -2
- package/dist/platformAccessory.spec.d.ts.map +0 -1
- package/dist/platformAccessory.spec.js +0 -126
- package/dist/platformAccessory.spec.js.map +0 -1
- package/dist/pluginManager.spec.d.ts +0 -2
- package/dist/pluginManager.spec.d.ts.map +0 -1
- package/dist/pluginManager.spec.js +0 -43
- package/dist/pluginManager.spec.js.map +0 -1
- package/dist/server.spec.d.ts +0 -2
- package/dist/server.spec.d.ts.map +0 -1
- package/dist/server.spec.js +0 -57
- package/dist/server.spec.js.map +0 -1
- package/dist/user.spec.d.ts +0 -2
- package/dist/user.spec.d.ts.map +0 -1
- package/dist/user.spec.js +0 -31
- package/dist/user.spec.js.map +0 -1
- package/dist/util/mac.spec.d.ts +0 -2
- package/dist/util/mac.spec.d.ts.map +0 -1
- package/dist/util/mac.spec.js +0 -36
- package/dist/util/mac.spec.js.map +0 -1
- package/dist/version.spec.d.ts +0 -2
- package/dist/version.spec.d.ts.map +0 -1
- package/dist/version.spec.js +0 -20
- package/dist/version.spec.js.map +0 -1
package/dist/server.js
CHANGED
|
@@ -13,20 +13,11 @@ import { PluginManager } from './pluginManager.js';
|
|
|
13
13
|
import { User } from './user.js';
|
|
14
14
|
import { validMacAddress } from './util/mac.js';
|
|
15
15
|
const log = Logger.internal;
|
|
16
|
-
|
|
16
|
+
const matterLogger = Logger.withPrefix('Matter/MainManager');
|
|
17
17
|
export var ServerStatus;
|
|
18
18
|
(function (ServerStatus) {
|
|
19
|
-
/**
|
|
20
|
-
* When the server is starting up
|
|
21
|
-
*/
|
|
22
19
|
ServerStatus["PENDING"] = "pending";
|
|
23
|
-
/**
|
|
24
|
-
* When the server is online and has published the main bridge
|
|
25
|
-
*/
|
|
26
20
|
ServerStatus["OK"] = "ok";
|
|
27
|
-
/**
|
|
28
|
-
* When the server is shutting down
|
|
29
|
-
*/
|
|
30
21
|
ServerStatus["DOWN"] = "down";
|
|
31
22
|
})(ServerStatus || (ServerStatus = {}));
|
|
32
23
|
export class Server {
|
|
@@ -37,26 +28,19 @@ export class Server {
|
|
|
37
28
|
ipcService;
|
|
38
29
|
externalPortService;
|
|
39
30
|
config;
|
|
40
|
-
// used to keep track of child bridges
|
|
41
|
-
// Key is HAP username (MAC address)
|
|
42
31
|
childBridges = new Map();
|
|
43
|
-
// Matter bridge manager (handles Matter server lifecycle)
|
|
44
|
-
// Made optional to handle initialization order - gets created in constructor after first setServerStatus call
|
|
45
32
|
matterManager;
|
|
46
|
-
|
|
47
|
-
|
|
33
|
+
matterMonitoringActive = false;
|
|
34
|
+
matterMonitoringClients = 0;
|
|
35
|
+
serverStatus = "pending";
|
|
48
36
|
constructor(options = {}) {
|
|
49
37
|
this.options = options;
|
|
50
38
|
this.config = Server.loadConfig();
|
|
51
|
-
// object we feed to Plugins and BridgeService
|
|
52
39
|
this.api = new HomebridgeAPI();
|
|
53
40
|
this.ipcService = new IpcService();
|
|
54
|
-
// Collect all configured Matter ports to avoid conflicts
|
|
55
41
|
const configuredMatterPorts = MatterBridgeManager.collectConfiguredMatterPorts(this.config);
|
|
56
42
|
this.externalPortService = new ExternalPortService(this.config.ports, this.config.matterPorts, configuredMatterPorts);
|
|
57
|
-
|
|
58
|
-
this.setServerStatus("pending" /* ServerStatus.PENDING */);
|
|
59
|
-
// create new plugin manager
|
|
43
|
+
this.setServerStatus("pending");
|
|
60
44
|
const pluginManagerOptions = {
|
|
61
45
|
activePlugins: this.config.plugins,
|
|
62
46
|
disabledPlugins: this.config.disabledPlugins,
|
|
@@ -64,47 +48,27 @@ export class Server {
|
|
|
64
48
|
strictPluginResolution: options.strictPluginResolution,
|
|
65
49
|
};
|
|
66
50
|
this.pluginManager = new PluginManager(this.api, pluginManagerOptions);
|
|
67
|
-
// create new bridge service
|
|
68
51
|
const bridgeConfig = {
|
|
69
52
|
cachedAccessoriesDir: User.cachedAccessoryPath(),
|
|
70
53
|
cachedAccessoriesItemName: 'cachedAccessories',
|
|
71
54
|
};
|
|
72
|
-
// shallow copy the homebridge options to the bridge options object
|
|
73
55
|
Object.assign(bridgeConfig, this.options);
|
|
74
56
|
this.bridgeService = new BridgeService(this.api, this.pluginManager, this.externalPortService, bridgeConfig, this.config.bridge);
|
|
75
|
-
// Create Matter bridge manager
|
|
76
57
|
this.matterManager = new MatterBridgeManager(this.config, this.api, this.externalPortService, this.pluginManager, this.options);
|
|
77
|
-
// Set manager reference on API for getAccessoryState
|
|
78
58
|
this.api._setMatterManager(this.matterManager);
|
|
79
|
-
|
|
80
|
-
this.api.on("
|
|
81
|
-
this.api.on("
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
// Handle Matter accessory registration (matching HAP pattern)
|
|
85
|
-
this.api.on("publishExternalMatterAccessories" /* InternalAPIEvent.PUBLISH_EXTERNAL_MATTER_ACCESSORIES */, this.handlePublishExternalMatterAccessories.bind(this));
|
|
86
|
-
this.api.on("registerMatterPlatformAccessories" /* InternalAPIEvent.REGISTER_MATTER_PLATFORM_ACCESSORIES */, this.handleRegisterMatterPlatformAccessories.bind(this));
|
|
87
|
-
this.api.on("updateMatterPlatformAccessories" /* InternalAPIEvent.UPDATE_MATTER_PLATFORM_ACCESSORIES */, this.handleUpdateMatterPlatformAccessories.bind(this));
|
|
88
|
-
this.api.on("unregisterMatterPlatformAccessories" /* InternalAPIEvent.UNREGISTER_MATTER_PLATFORM_ACCESSORIES */, this.handleUnregisterMatterPlatformAccessories.bind(this));
|
|
89
|
-
this.api.on("unregisterExternalMatterAccessories" /* InternalAPIEvent.UNREGISTER_EXTERNAL_MATTER_ACCESSORIES */, this.handleUnregisterExternalMatterAccessories.bind(this));
|
|
90
|
-
this.api.on("updateMatterAccessoryState" /* InternalAPIEvent.UPDATE_MATTER_ACCESSORY_STATE */, this.handleUpdateMatterAccessoryState.bind(this));
|
|
91
|
-
// watch bridge events to check when server is online
|
|
92
|
-
this.bridgeService.bridge.on("advertised" /* AccessoryEventTypes.ADVERTISED */, () => {
|
|
93
|
-
this.setServerStatus("ok" /* ServerStatus.OK */);
|
|
59
|
+
this.api.on("registerPlatformAccessories", this.handleRegisterPlatformAccessories.bind(this));
|
|
60
|
+
this.api.on("unregisterPlatformAccessories", this.handleUnregisterPlatformAccessories.bind(this));
|
|
61
|
+
this.api.on("publishExternalAccessories", this.handlePublishExternalAccessories.bind(this));
|
|
62
|
+
this.bridgeService.bridge.on("advertised", () => {
|
|
63
|
+
this.setServerStatus("ok");
|
|
94
64
|
});
|
|
95
|
-
|
|
96
|
-
this.bridgeService.bridge.on("paired" /* AccessoryEventTypes.PAIRED */, () => {
|
|
65
|
+
this.bridgeService.bridge.on("paired", () => {
|
|
97
66
|
this.setServerStatus(this.serverStatus);
|
|
98
67
|
});
|
|
99
|
-
|
|
100
|
-
this.bridgeService.bridge.on("unpaired" /* AccessoryEventTypes.UNPAIRED */, () => {
|
|
68
|
+
this.bridgeService.bridge.on("unpaired", () => {
|
|
101
69
|
this.setServerStatus(this.serverStatus);
|
|
102
70
|
});
|
|
103
71
|
}
|
|
104
|
-
/**
|
|
105
|
-
* Set the current server status and update parent via IPC
|
|
106
|
-
* @param status
|
|
107
|
-
*/
|
|
108
72
|
setServerStatus(status) {
|
|
109
73
|
this.serverStatus = status;
|
|
110
74
|
const statusUpdate = {
|
|
@@ -116,18 +80,15 @@ export class Server {
|
|
|
116
80
|
pin: this.config.bridge.pin,
|
|
117
81
|
matter: this.matterManager?.getMatterStatus() ?? { enabled: false },
|
|
118
82
|
};
|
|
119
|
-
this.ipcService.sendMessage("serverStatusUpdate"
|
|
83
|
+
this.ipcService.sendMessage("serverStatusUpdate", statusUpdate);
|
|
120
84
|
}
|
|
121
85
|
async start() {
|
|
122
86
|
if (this.config.bridge.disableIpc !== true) {
|
|
123
87
|
this.initializeIpcEventHandlers();
|
|
124
88
|
}
|
|
125
89
|
const promises = [];
|
|
126
|
-
// load the cached accessories
|
|
127
90
|
await this.bridgeService.loadCachedPlatformAccessoriesFromDisk();
|
|
128
|
-
// initialize plugins
|
|
129
91
|
await this.pluginManager.initializeInstalledPlugins();
|
|
130
|
-
// Initialize Matter server for main bridge if enabled
|
|
131
92
|
await this.matterManager?.initialize();
|
|
132
93
|
if (this.config.platforms.length > 0) {
|
|
133
94
|
promises.push(...this.loadPlatforms());
|
|
@@ -135,78 +96,40 @@ export class Server {
|
|
|
135
96
|
if (this.config.accessories.length > 0) {
|
|
136
97
|
this.loadAccessories();
|
|
137
98
|
}
|
|
138
|
-
// start child bridges
|
|
139
99
|
for (const childBridge of this.childBridges.values()) {
|
|
140
100
|
childBridge.start();
|
|
141
101
|
}
|
|
142
|
-
// restore cached accessories
|
|
143
102
|
this.bridgeService.restoreCachedPlatformAccessories();
|
|
144
103
|
this.matterManager?.restoreCachedAccessories(this.options.keepOrphanedCachedAccessories ?? false);
|
|
145
104
|
this.api.signalFinished();
|
|
146
|
-
// wait for all platforms to publish their accessories before we publish the bridge
|
|
147
105
|
await Promise.all(promises)
|
|
148
106
|
.then(() => this.publishBridge());
|
|
149
107
|
}
|
|
150
108
|
async teardown() {
|
|
151
109
|
this.bridgeService.teardown();
|
|
152
|
-
// Teardown Matter servers (main bridge and external accessories)
|
|
153
110
|
await this.matterManager?.teardown();
|
|
154
|
-
this.setServerStatus("down"
|
|
111
|
+
this.setServerStatus("down");
|
|
155
112
|
}
|
|
156
113
|
publishBridge() {
|
|
157
114
|
this.bridgeService.publishBridge();
|
|
158
115
|
this.printSetupInfo(this.config.bridge.pin);
|
|
159
116
|
}
|
|
160
117
|
handlePublishExternalAccessories(accessories) {
|
|
161
|
-
// External accessories are published via HAP
|
|
162
|
-
// Plugins should use api.matter to register Matter accessories explicitly
|
|
163
118
|
log.info(`Publishing ${accessories.length} external accessories`);
|
|
164
119
|
}
|
|
165
|
-
/**
|
|
166
|
-
* Handle external Matter accessories - delegates to MatterBridgeManager
|
|
167
|
-
*/
|
|
168
|
-
handlePublishExternalMatterAccessories(accessories, registrationId) {
|
|
169
|
-
this.matterManager?.handlePublishExternalAccessories(accessories, registrationId).catch((error) => {
|
|
170
|
-
log.error('Failed to publish external Matter accessories:', error);
|
|
171
|
-
// Make sure to resolve the registration even on error
|
|
172
|
-
this.api._resolveExternalRegistration(registrationId);
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
120
|
handleRegisterPlatformAccessories(accessories) {
|
|
176
|
-
// Route to HAP bridge
|
|
177
121
|
this.bridgeService.handleRegisterPlatformAccessories(accessories);
|
|
178
122
|
}
|
|
179
123
|
handleUnregisterPlatformAccessories(accessories) {
|
|
180
|
-
// Route to HAP bridge
|
|
181
124
|
this.bridgeService.handleUnregisterPlatformAccessories(accessories);
|
|
182
125
|
}
|
|
183
|
-
|
|
184
|
-
this.matterManager
|
|
185
|
-
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
handleUpdateMatterPlatformAccessories(accessories) {
|
|
189
|
-
this.matterManager?.handleUpdatePlatformAccessories(accessories).catch((error) => {
|
|
190
|
-
log.error('Failed to update Matter platform accessories:', error);
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
handleUnregisterMatterPlatformAccessories(pluginIdentifier, platformName, accessories) {
|
|
194
|
-
this.matterManager?.handleUnregisterPlatformAccessories(pluginIdentifier, platformName, accessories).catch((error) => {
|
|
195
|
-
log.error(`Failed to unregister Matter accessories for ${pluginIdentifier}:`, error);
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
handleUnregisterExternalMatterAccessories(accessories) {
|
|
199
|
-
this.matterManager?.handleUnregisterExternalAccessories(accessories).catch((error) => {
|
|
200
|
-
log.error('Failed to unregister external Matter accessories:', error);
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
handleUpdateMatterAccessoryState(uuid, cluster, attributes, partId) {
|
|
204
|
-
this.matterManager?.handleUpdateAccessoryState(uuid, cluster, attributes, partId).catch((error) => {
|
|
205
|
-
log.error(`Failed to update Matter accessory state for ${uuid}:`, error);
|
|
206
|
-
});
|
|
126
|
+
async handleTriggerMatterCommand(uuid, cluster, attributes, partId) {
|
|
127
|
+
if (!this.matterManager) {
|
|
128
|
+
throw new Error('Matter manager not initialized');
|
|
129
|
+
}
|
|
130
|
+
await this.matterManager.handleTriggerCommand(uuid, cluster, attributes, partId);
|
|
207
131
|
}
|
|
208
132
|
static loadConfig() {
|
|
209
|
-
// Look for the configuration file
|
|
210
133
|
const configPath = User.configPath();
|
|
211
134
|
const defaultBridge = {
|
|
212
135
|
name: 'Homebridge',
|
|
@@ -243,18 +166,7 @@ export class Server {
|
|
|
243
166
|
config.ports = undefined;
|
|
244
167
|
}
|
|
245
168
|
}
|
|
246
|
-
|
|
247
|
-
if (config.matterPorts.start && config.matterPorts.end) {
|
|
248
|
-
if (config.matterPorts.start > config.matterPorts.end) {
|
|
249
|
-
log.error('Invalid Matter port pool configuration. End should be greater than or equal to start.');
|
|
250
|
-
config.matterPorts = undefined;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
log.error('Invalid configuration for \'matterPorts\'. Missing \'start\' and \'end\' properties! Ignoring it!');
|
|
255
|
-
config.matterPorts = undefined;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
169
|
+
MatterConfigCollector.validateMatterPortsPool(config);
|
|
258
170
|
const bridge = config.bridge || defaultBridge;
|
|
259
171
|
bridge.name = bridge.name || defaultBridge.name;
|
|
260
172
|
bridge.username = bridge.username || defaultBridge.username;
|
|
@@ -275,14 +187,13 @@ export class Server {
|
|
|
275
187
|
config.platforms = [];
|
|
276
188
|
}
|
|
277
189
|
log.info('Loaded config.json with %s accessories and %s platforms.', config.accessories.length, config.platforms.length);
|
|
278
|
-
// Validate Matter configuration for port conflicts
|
|
279
190
|
MatterConfigCollector.validateMatterConfig(config);
|
|
280
191
|
if (config.bridge.advertiser) {
|
|
281
192
|
if (![
|
|
282
|
-
"bonjour-hap"
|
|
283
|
-
"ciao"
|
|
284
|
-
"avahi"
|
|
285
|
-
"resolved"
|
|
193
|
+
"bonjour-hap",
|
|
194
|
+
"ciao",
|
|
195
|
+
"avahi",
|
|
196
|
+
"resolved",
|
|
286
197
|
].includes(config.bridge.advertiser)) {
|
|
287
198
|
config.bridge.advertiser = undefined;
|
|
288
199
|
log.error('Value provided in bridge.advertiser is not valid, reverting to platform default.');
|
|
@@ -298,7 +209,7 @@ export class Server {
|
|
|
298
209
|
this.config.accessories.forEach((accessoryConfig, index) => {
|
|
299
210
|
if (!accessoryConfig.accessory) {
|
|
300
211
|
log.warn('Your config.json contains an illegal accessory configuration object at position %d. '
|
|
301
|
-
+ 'Missing property \'accessory\'. Skipping entry...', index + 1);
|
|
212
|
+
+ 'Missing property \'accessory\'. Skipping entry...', index + 1);
|
|
302
213
|
return;
|
|
303
214
|
}
|
|
304
215
|
const accessoryIdentifier = accessoryConfig.accessory;
|
|
@@ -316,7 +227,6 @@ export class Server {
|
|
|
316
227
|
log.error(error.message);
|
|
317
228
|
return;
|
|
318
229
|
}
|
|
319
|
-
// check the plugin is not disabled
|
|
320
230
|
if (plugin.disabled) {
|
|
321
231
|
log.warn(`Ignoring config for the accessory "${accessoryIdentifier}" in your config.json as the plugin "${plugin.getPluginIdentifier()}" has been disabled.`);
|
|
322
232
|
return;
|
|
@@ -326,16 +236,15 @@ export class Server {
|
|
|
326
236
|
}
|
|
327
237
|
catch (error) {
|
|
328
238
|
log.error(`Error loading the accessory "${accessoryIdentifier}" requested in your config.json at position ${index + 1} - this is likely an issue with the "${plugin.getPluginIdentifier()}" plugin.`);
|
|
329
|
-
log.error(error);
|
|
239
|
+
log.error(error);
|
|
330
240
|
return;
|
|
331
241
|
}
|
|
332
242
|
const logger = Logger.withPrefix(displayName);
|
|
333
243
|
logger('Initializing %s accessory...', accessoryIdentifier);
|
|
334
244
|
if (accessoryConfig._bridge) {
|
|
335
|
-
// ensure the username is always uppercase
|
|
336
245
|
accessoryConfig._bridge.username = accessoryConfig._bridge.username.toUpperCase();
|
|
337
246
|
try {
|
|
338
|
-
this.validateChildBridgeConfig("accessory"
|
|
247
|
+
this.validateChildBridgeConfig("accessory", accessoryIdentifier, accessoryConfig._bridge);
|
|
339
248
|
}
|
|
340
249
|
catch (error) {
|
|
341
250
|
log.error(error.message);
|
|
@@ -348,15 +257,13 @@ export class Server {
|
|
|
348
257
|
}
|
|
349
258
|
else {
|
|
350
259
|
logger(`Initializing child bridge ${accessoryConfig._bridge.username}`);
|
|
351
|
-
childBridge = new ChildBridgeService("accessory"
|
|
260
|
+
childBridge = new ChildBridgeService("accessory", accessoryIdentifier, plugin, accessoryConfig._bridge, this.config, this.options, this.api, this.ipcService, this.externalPortService);
|
|
352
261
|
this.childBridges.set(accessoryConfig._bridge.username, childBridge);
|
|
353
262
|
}
|
|
354
|
-
// add config to child bridge service
|
|
355
263
|
childBridge.addConfig(accessoryConfig);
|
|
356
264
|
return;
|
|
357
265
|
}
|
|
358
266
|
const accessoryInstance = new constructor(logger, accessoryConfig, this.api);
|
|
359
|
-
// pass accessoryIdentifier for UUID generation, and optional parameter uuid_base which can be used instead of displayName for UUID generation
|
|
360
267
|
const accessory = this.bridgeService.createHAPAccessory(plugin, accessoryInstance, displayName, accessoryIdentifier, accessoryConfig.uuid_base);
|
|
361
268
|
if (accessory) {
|
|
362
269
|
try {
|
|
@@ -377,14 +284,13 @@ export class Server {
|
|
|
377
284
|
this.config.platforms.forEach((platformConfig, index) => {
|
|
378
285
|
if (!platformConfig.platform) {
|
|
379
286
|
log.warn('Your config.json contains an illegal platform configuration object at position %d. '
|
|
380
|
-
+ 'Missing property \'platform\'. Skipping entry...', index + 1);
|
|
287
|
+
+ 'Missing property \'platform\'. Skipping entry...', index + 1);
|
|
381
288
|
return;
|
|
382
289
|
}
|
|
383
290
|
const platformIdentifier = platformConfig.platform;
|
|
384
291
|
const displayName = platformConfig.name || platformIdentifier;
|
|
385
292
|
let plugin;
|
|
386
293
|
let constructor;
|
|
387
|
-
// do not load homebridge-config-ui-x when running in service mode
|
|
388
294
|
if (platformIdentifier === 'config' && process.env.UIX_SERVICE_MODE === '1') {
|
|
389
295
|
return;
|
|
390
296
|
}
|
|
@@ -395,7 +301,6 @@ export class Server {
|
|
|
395
301
|
log.error(error.message);
|
|
396
302
|
return;
|
|
397
303
|
}
|
|
398
|
-
// check the plugin is not disabled
|
|
399
304
|
if (plugin.disabled) {
|
|
400
305
|
log.warn(`Ignoring config for the platform "${platformIdentifier}" in your config.json as the plugin "${plugin.getPluginIdentifier()}" has been disabled.`);
|
|
401
306
|
return;
|
|
@@ -405,25 +310,23 @@ export class Server {
|
|
|
405
310
|
}
|
|
406
311
|
catch (error) {
|
|
407
312
|
log.error(`Error loading the platform "${platformIdentifier}" requested in your config.json at position ${index + 1} - this is likely an issue with the "${plugin.getPluginIdentifier()}" plugin.`);
|
|
408
|
-
log.error(error);
|
|
313
|
+
log.error(error);
|
|
409
314
|
return;
|
|
410
315
|
}
|
|
411
316
|
const logger = Logger.withPrefix(displayName);
|
|
412
317
|
logger('Initializing %s platform...', platformIdentifier);
|
|
413
318
|
if (platformConfig._bridge) {
|
|
414
|
-
// ensure the username is always uppercase
|
|
415
319
|
platformConfig._bridge.username = platformConfig._bridge.username.toUpperCase();
|
|
416
320
|
try {
|
|
417
|
-
this.validateChildBridgeConfig("platform"
|
|
321
|
+
this.validateChildBridgeConfig("platform", platformIdentifier, platformConfig._bridge);
|
|
418
322
|
}
|
|
419
323
|
catch (error) {
|
|
420
324
|
log.error(error.message);
|
|
421
325
|
return;
|
|
422
326
|
}
|
|
423
327
|
logger(`Initializing child bridge ${platformConfig._bridge.username}`);
|
|
424
|
-
const childBridge = new ChildBridgeService("platform"
|
|
328
|
+
const childBridge = new ChildBridgeService("platform", platformIdentifier, plugin, platformConfig._bridge, this.config, this.options, this.api, this.ipcService, this.externalPortService);
|
|
425
329
|
this.childBridges.set(platformConfig._bridge.username, childBridge);
|
|
426
|
-
// add config to child bridge service
|
|
427
330
|
childBridge.addConfig(platformConfig);
|
|
428
331
|
return;
|
|
429
332
|
}
|
|
@@ -431,21 +334,15 @@ export class Server {
|
|
|
431
334
|
if (HomebridgeAPI.isDynamicPlatformPlugin(platform)) {
|
|
432
335
|
plugin.assignDynamicPlatform(platformIdentifier, platform);
|
|
433
336
|
}
|
|
434
|
-
else if (HomebridgeAPI.isStaticPlatformPlugin(platform)) {
|
|
337
|
+
else if (HomebridgeAPI.isStaticPlatformPlugin(platform)) {
|
|
435
338
|
promises.push(this.bridgeService.loadPlatformAccessories(plugin, platform, platformIdentifier, logger));
|
|
436
339
|
}
|
|
437
340
|
else {
|
|
438
|
-
// otherwise it's a IndependentPlatformPlugin which doesn't expose any methods at all.
|
|
439
|
-
// We just call the constructor and let it be enabled.
|
|
440
341
|
}
|
|
441
342
|
});
|
|
442
343
|
return promises;
|
|
443
344
|
}
|
|
444
|
-
/**
|
|
445
|
-
* Validate an external bridge config
|
|
446
|
-
*/
|
|
447
345
|
validateChildBridgeConfig(type, identifier, bridgeConfig) {
|
|
448
|
-
// All child bridges require username
|
|
449
346
|
if (!bridgeConfig.username) {
|
|
450
347
|
throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
|
|
451
348
|
+ 'Missing required field "_bridge.username".');
|
|
@@ -456,13 +353,11 @@ export class Server {
|
|
|
456
353
|
}
|
|
457
354
|
if (this.childBridges.has(bridgeConfig.username)) {
|
|
458
355
|
const childBridge = this.childBridges.get(bridgeConfig.username);
|
|
459
|
-
if (type === "platform"
|
|
460
|
-
// only a single platform can exist on one child bridge
|
|
356
|
+
if (type === "platform") {
|
|
461
357
|
throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
|
|
462
358
|
+ `Duplicate username found in _bridge.username: "${bridgeConfig.username}". Each platform child bridge must have it's own unique username.`);
|
|
463
359
|
}
|
|
464
360
|
else if (childBridge?.identifier !== identifier) {
|
|
465
|
-
// only accessories of the same type can be added to the same child bridge
|
|
466
361
|
throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
|
|
467
362
|
+ `Duplicate username found in _bridge.username: "${bridgeConfig.username}". You can only group accessories of the same type in a child bridge.`);
|
|
468
363
|
}
|
|
@@ -472,47 +367,304 @@ export class Server {
|
|
|
472
367
|
+ `Username found in _bridge.username: "${bridgeConfig.username}" is the same as the main bridge. Each child bridge platform/accessory must have it's own unique username.`);
|
|
473
368
|
}
|
|
474
369
|
}
|
|
475
|
-
/**
|
|
476
|
-
* Takes care of the IPC Events sent to Homebridge
|
|
477
|
-
*/
|
|
478
370
|
initializeIpcEventHandlers() {
|
|
479
|
-
// start ipc service
|
|
480
371
|
this.ipcService.start();
|
|
481
|
-
|
|
482
|
-
this.ipcService.on("restartChildBridge" /* IpcIncomingEvent.RESTART_CHILD_BRIDGE */, (username) => {
|
|
483
|
-
// noinspection SuspiciousTypeOfGuard
|
|
372
|
+
this.ipcService.on("restartChildBridge", (username) => {
|
|
484
373
|
if (typeof username === 'string') {
|
|
485
374
|
const childBridge = this.childBridges.get(username.toUpperCase());
|
|
486
375
|
childBridge?.restartChildBridge();
|
|
487
376
|
}
|
|
488
377
|
});
|
|
489
|
-
|
|
490
|
-
this.ipcService.on("stopChildBridge" /* IpcIncomingEvent.STOP_CHILD_BRIDGE */, (username) => {
|
|
491
|
-
// noinspection SuspiciousTypeOfGuard
|
|
378
|
+
this.ipcService.on("stopChildBridge", (username) => {
|
|
492
379
|
if (typeof username === 'string') {
|
|
493
380
|
const childBridge = this.childBridges.get(username.toUpperCase());
|
|
494
381
|
childBridge?.stopChildBridge();
|
|
495
382
|
}
|
|
496
383
|
});
|
|
497
|
-
|
|
498
|
-
this.ipcService.on("startChildBridge" /* IpcIncomingEvent.START_CHILD_BRIDGE */, (username) => {
|
|
499
|
-
// noinspection SuspiciousTypeOfGuard
|
|
384
|
+
this.ipcService.on("startChildBridge", (username) => {
|
|
500
385
|
if (typeof username === 'string') {
|
|
501
386
|
const childBridge = this.childBridges.get(username.toUpperCase());
|
|
502
387
|
childBridge?.startChildBridge();
|
|
503
388
|
}
|
|
504
389
|
});
|
|
505
|
-
this.ipcService.on("childBridgeMetadataRequest"
|
|
506
|
-
this.ipcService.sendMessage("childBridgeMetadataResponse"
|
|
390
|
+
this.ipcService.on("childBridgeMetadataRequest", () => {
|
|
391
|
+
this.ipcService.sendMessage("childBridgeMetadataResponse", Array.from(this.childBridges.values()).map(x => x.getMetadata()));
|
|
392
|
+
});
|
|
393
|
+
this.ipcService.on("startMatterMonitoring", () => {
|
|
394
|
+
this.handleStartMatterMonitoring();
|
|
395
|
+
});
|
|
396
|
+
this.ipcService.on("stopMatterMonitoring", () => {
|
|
397
|
+
this.handleStopMatterMonitoring();
|
|
398
|
+
});
|
|
399
|
+
this.ipcService.on("getMatterAccessories", (data) => {
|
|
400
|
+
this.handleGetMatterAccessories(data?.bridgeUsername);
|
|
401
|
+
});
|
|
402
|
+
this.ipcService.on("getMatterAccessoryInfo", (data) => {
|
|
403
|
+
this.handleGetMatterAccessoryInfo(data?.uuid);
|
|
404
|
+
});
|
|
405
|
+
this.ipcService.on("matterAccessoryControl", (data) => {
|
|
406
|
+
this.handleMatterAccessoryControl(data);
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
handleStartMatterMonitoring() {
|
|
410
|
+
this.matterMonitoringClients++;
|
|
411
|
+
if (this.matterMonitoringClients === 1) {
|
|
412
|
+
matterLogger.debug('Starting Matter accessory monitoring');
|
|
413
|
+
this.matterMonitoringActive = true;
|
|
414
|
+
this.matterManager?.enableStateMonitoring();
|
|
415
|
+
for (const childBridge of this.childBridges.values()) {
|
|
416
|
+
childBridge.startMatterMonitoring();
|
|
417
|
+
}
|
|
418
|
+
const event = {
|
|
419
|
+
type: 'monitoringStarted',
|
|
420
|
+
data: { success: true },
|
|
421
|
+
};
|
|
422
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
const event = {
|
|
426
|
+
type: 'monitoringStarted',
|
|
427
|
+
data: { success: true, alreadyActive: true },
|
|
428
|
+
};
|
|
429
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
handleStopMatterMonitoring() {
|
|
433
|
+
this.matterMonitoringClients--;
|
|
434
|
+
if (this.matterMonitoringClients <= 0) {
|
|
435
|
+
matterLogger.debug('Stopping Matter accessory monitoring');
|
|
436
|
+
this.matterMonitoringClients = 0;
|
|
437
|
+
this.matterMonitoringActive = false;
|
|
438
|
+
this.matterManager?.disableStateMonitoring();
|
|
439
|
+
for (const childBridge of this.childBridges.values()) {
|
|
440
|
+
childBridge.stopMatterMonitoring();
|
|
441
|
+
}
|
|
442
|
+
const event = {
|
|
443
|
+
type: 'monitoringStopped',
|
|
444
|
+
data: { success: true },
|
|
445
|
+
};
|
|
446
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
const event = {
|
|
450
|
+
type: 'monitoringStopped',
|
|
451
|
+
data: { success: true, othersActive: true },
|
|
452
|
+
};
|
|
453
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
async handleGetMatterAccessories(bridgeUsername) {
|
|
457
|
+
matterLogger.debug(`Getting Matter accessories${bridgeUsername ? ` for bridge ${bridgeUsername}` : ' for all bridges'}`);
|
|
458
|
+
if (!this.matterMonitoringActive) {
|
|
459
|
+
matterLogger.warn('Matter monitoring not active - cannot get accessories');
|
|
460
|
+
const event = {
|
|
461
|
+
type: 'accessoriesData',
|
|
462
|
+
data: {
|
|
463
|
+
bridgeUsername,
|
|
464
|
+
error: 'Matter monitoring not active',
|
|
465
|
+
},
|
|
466
|
+
};
|
|
467
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
if (!this.api.isMatterEnabled() && this.childBridges.size === 0) {
|
|
471
|
+
matterLogger.debug('Matter not enabled and no child bridges');
|
|
472
|
+
const event = {
|
|
473
|
+
type: 'accessoriesData',
|
|
474
|
+
data: {
|
|
475
|
+
bridgeUsername,
|
|
476
|
+
accessories: [],
|
|
477
|
+
},
|
|
478
|
+
};
|
|
479
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
try {
|
|
483
|
+
const allAccessories = this.matterManager?.collectAllAccessories(bridgeUsername) || [];
|
|
484
|
+
matterLogger.debug(`Collected ${allAccessories.length} accessories from main bridge`);
|
|
485
|
+
if (this.childBridges.size > 0) {
|
|
486
|
+
matterLogger.debug(`Requesting accessories from ${this.childBridges.size} child bridge(s)`);
|
|
487
|
+
for (const childBridge of this.childBridges.values()) {
|
|
488
|
+
childBridge.lastMatterAccessoriesResponse = undefined;
|
|
489
|
+
}
|
|
490
|
+
for (const childBridge of this.childBridges.values()) {
|
|
491
|
+
childBridge.getMatterAccessories();
|
|
492
|
+
}
|
|
493
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
494
|
+
let responsesCollected = 0;
|
|
495
|
+
for (const childBridge of this.childBridges.values()) {
|
|
496
|
+
if (childBridge.lastMatterAccessoriesResponse?.accessories) {
|
|
497
|
+
const accessories = childBridge.lastMatterAccessoriesResponse.accessories;
|
|
498
|
+
allAccessories.push(...accessories);
|
|
499
|
+
responsesCollected++;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
matterLogger.debug(`Collected responses from ${responsesCollected} of ${this.childBridges.size} child bridge(s)`);
|
|
503
|
+
}
|
|
504
|
+
matterLogger.debug(`Sending ${allAccessories.length} total Matter accessories`);
|
|
505
|
+
const event = {
|
|
506
|
+
type: 'accessoriesData',
|
|
507
|
+
data: {
|
|
508
|
+
bridgeUsername: bridgeUsername || 'all',
|
|
509
|
+
accessories: allAccessories,
|
|
510
|
+
},
|
|
511
|
+
};
|
|
512
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
513
|
+
}
|
|
514
|
+
catch (error) {
|
|
515
|
+
matterLogger.error('Failed to get Matter accessories:', error);
|
|
516
|
+
const event = {
|
|
517
|
+
type: 'accessoriesData',
|
|
518
|
+
data: {
|
|
519
|
+
bridgeUsername,
|
|
520
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
521
|
+
},
|
|
522
|
+
};
|
|
523
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
handleGetMatterAccessoryInfo(uuid) {
|
|
527
|
+
if (!uuid) {
|
|
528
|
+
const event = {
|
|
529
|
+
type: 'accessoryInfoData',
|
|
530
|
+
data: {
|
|
531
|
+
error: 'UUID is required',
|
|
532
|
+
},
|
|
533
|
+
};
|
|
534
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
try {
|
|
538
|
+
const accessoryInfo = this.matterManager?.getAccessoryInfo(uuid);
|
|
539
|
+
if (accessoryInfo) {
|
|
540
|
+
const event = {
|
|
541
|
+
type: 'accessoryInfoData',
|
|
542
|
+
data: accessoryInfo,
|
|
543
|
+
};
|
|
544
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
for (const childBridge of this.childBridges.values()) {
|
|
548
|
+
if (childBridge.getMetadata().matterConfig) {
|
|
549
|
+
childBridge.getMatterAccessoryInfo(uuid);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
catch (error) {
|
|
554
|
+
matterLogger.error('Failed to get Matter accessory info:', error);
|
|
555
|
+
const event = {
|
|
556
|
+
type: 'accessoryInfoData',
|
|
557
|
+
data: {
|
|
558
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
559
|
+
},
|
|
560
|
+
};
|
|
561
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
handleMatterAccessoryControl(data) {
|
|
565
|
+
matterLogger.debug(`Matter control request: uuid=${data?.uuid}, cluster=${data?.cluster}, bridge=${data?.bridgeUsername || 'auto'}, part=${data?.partId || 'main'}`);
|
|
566
|
+
if (!data?.uuid || !data?.cluster || !data?.attributes) {
|
|
567
|
+
matterLogger.error('Missing required parameters for Matter control');
|
|
568
|
+
const event = {
|
|
569
|
+
type: 'accessoryControlResponse',
|
|
570
|
+
data: {
|
|
571
|
+
success: false,
|
|
572
|
+
error: 'Missing required parameters',
|
|
573
|
+
},
|
|
574
|
+
};
|
|
575
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
if (data.bridgeUsername) {
|
|
579
|
+
const targetUsername = data.bridgeUsername.toUpperCase();
|
|
580
|
+
if (targetUsername === this.config.bridge.username.toUpperCase()) {
|
|
581
|
+
matterLogger.debug(`Routing to main bridge (${targetUsername})`);
|
|
582
|
+
this.handleTriggerMatterCommand(data.uuid, data.cluster, data.attributes, data.partId)
|
|
583
|
+
.then(() => {
|
|
584
|
+
matterLogger.debug(`Main bridge successfully controlled accessory ${data.uuid}`);
|
|
585
|
+
const event = {
|
|
586
|
+
type: 'accessoryControlResponse',
|
|
587
|
+
data: {
|
|
588
|
+
success: true,
|
|
589
|
+
uuid: data.uuid,
|
|
590
|
+
},
|
|
591
|
+
};
|
|
592
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
593
|
+
})
|
|
594
|
+
.catch((error) => {
|
|
595
|
+
matterLogger.error(`Main bridge failed to control ${data.uuid}: ${error.message}`);
|
|
596
|
+
const event = {
|
|
597
|
+
type: 'accessoryControlResponse',
|
|
598
|
+
data: {
|
|
599
|
+
success: false,
|
|
600
|
+
error: error.message,
|
|
601
|
+
uuid: data.uuid,
|
|
602
|
+
},
|
|
603
|
+
};
|
|
604
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
605
|
+
});
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
for (const childBridge of this.childBridges.values()) {
|
|
609
|
+
if (childBridge.getMetadata().username.toUpperCase() === targetUsername) {
|
|
610
|
+
matterLogger.debug(`Routing to child bridge ${childBridge.identifier} (${targetUsername})`);
|
|
611
|
+
childBridge.controlMatterAccessory(data);
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
matterLogger.warn(`Bridge ${targetUsername} not found`);
|
|
616
|
+
const event = {
|
|
617
|
+
type: 'accessoryControlResponse',
|
|
618
|
+
data: {
|
|
619
|
+
success: false,
|
|
620
|
+
error: `Bridge ${targetUsername} not found`,
|
|
621
|
+
uuid: data.uuid,
|
|
622
|
+
},
|
|
623
|
+
};
|
|
624
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
matterLogger.debug(`Broadcast mode: trying main bridge for accessory ${data.uuid}`);
|
|
628
|
+
this.handleTriggerMatterCommand(data.uuid, data.cluster, data.attributes, data.partId)
|
|
629
|
+
.then(() => {
|
|
630
|
+
matterLogger.debug(`Main bridge successfully controlled accessory ${data.uuid}`);
|
|
631
|
+
const event = {
|
|
632
|
+
type: 'accessoryControlResponse',
|
|
633
|
+
data: {
|
|
634
|
+
success: true,
|
|
635
|
+
uuid: data.uuid,
|
|
636
|
+
},
|
|
637
|
+
};
|
|
638
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
639
|
+
})
|
|
640
|
+
.catch(() => {
|
|
641
|
+
const matterChildBridges = Array.from(this.childBridges.values()).filter(bridge => bridge.getMetadata().matterConfig);
|
|
642
|
+
if (matterChildBridges.length > 0) {
|
|
643
|
+
matterLogger.debug(`Main bridge doesn't have accessory ${data.uuid}, forwarding to ${matterChildBridges.length} child bridge(s) with Matter enabled`);
|
|
644
|
+
for (const childBridge of matterChildBridges) {
|
|
645
|
+
childBridge.controlMatterAccessory(data);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
else {
|
|
649
|
+
matterLogger.warn(`Accessory ${data.uuid} not found - not on main bridge and no child bridges with Matter available`);
|
|
650
|
+
const event = {
|
|
651
|
+
type: 'accessoryControlResponse',
|
|
652
|
+
data: {
|
|
653
|
+
success: false,
|
|
654
|
+
error: 'Accessory not found',
|
|
655
|
+
uuid: data.uuid,
|
|
656
|
+
},
|
|
657
|
+
};
|
|
658
|
+
this.ipcService.sendMessage("matterEvent", event);
|
|
659
|
+
}
|
|
507
660
|
});
|
|
508
661
|
}
|
|
509
662
|
printSetupInfo(pin) {
|
|
510
|
-
/* eslint-disable no-console */
|
|
511
663
|
console.log('Setup Payload:');
|
|
512
664
|
console.log(this.bridgeService.bridge.setupURI());
|
|
513
665
|
if (!this.options.hideQRCode) {
|
|
514
666
|
console.log('Scan this code with your HomeKit app on your iOS device to pair with Homebridge:');
|
|
515
|
-
qrcode.setErrorLevel('M');
|
|
667
|
+
qrcode.setErrorLevel('M');
|
|
516
668
|
qrcode.generate(this.bridgeService.bridge.setupURI());
|
|
517
669
|
console.log('Or enter this code with your HomeKit app on your iOS device to pair with Homebridge:');
|
|
518
670
|
}
|
|
@@ -524,7 +676,6 @@ export class Server {
|
|
|
524
676
|
console.log(chalk.black.bgWhite(` │ ${pin} │ `));
|
|
525
677
|
console.log(chalk.black.bgWhite(' └────────────┘ '));
|
|
526
678
|
console.log(chalk.black.bgWhite(' '));
|
|
527
|
-
/* eslint-enable no-console */
|
|
528
679
|
}
|
|
529
680
|
}
|
|
530
681
|
//# sourceMappingURL=server.js.map
|