homebridge 2.0.0-beta.34 → 2.0.0-beta.36
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 +74 -32
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +48 -46
- package/dist/api.js.map +1 -1
- package/dist/api.spec.d.ts +2 -0
- package/dist/api.spec.d.ts.map +1 -0
- package/dist/api.spec.js +413 -0
- package/dist/api.spec.js.map +1 -0
- package/dist/childBridgeFork.d.ts +1 -18
- package/dist/childBridgeFork.d.ts.map +1 -1
- package/dist/childBridgeFork.js +21 -258
- package/dist/childBridgeFork.js.map +1 -1
- package/dist/externalPortService.d.ts +2 -9
- package/dist/externalPortService.d.ts.map +1 -1
- package/dist/externalPortService.js +20 -40
- package/dist/externalPortService.js.map +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/logger.spec.d.ts +2 -0
- package/dist/logger.spec.d.ts.map +1 -0
- package/dist/logger.spec.js +95 -0
- package/dist/logger.spec.js.map +1 -0
- package/dist/matter/ChildBridgeMatterManager.d.ts +96 -0
- package/dist/matter/ChildBridgeMatterManager.d.ts.map +1 -0
- package/dist/matter/ChildBridgeMatterManager.js +397 -0
- package/dist/matter/ChildBridgeMatterManager.js.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.d.ts +48 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.d.ts.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.js +73 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.js.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts +2 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.js +293 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.js.map +1 -0
- package/dist/matter/{matterServer.d.ts → MatterAPIImpl.d.ts} +203 -367
- package/dist/matter/MatterAPIImpl.d.ts.map +1 -0
- package/dist/matter/MatterAPIImpl.js +305 -0
- package/dist/matter/MatterAPIImpl.js.map +1 -0
- package/dist/matter/MatterBridgeManager.d.ts +91 -0
- package/dist/matter/MatterBridgeManager.d.ts.map +1 -0
- package/dist/matter/MatterBridgeManager.js +426 -0
- package/dist/matter/MatterBridgeManager.js.map +1 -0
- package/dist/matter/MatterConfigCollector.d.ts +26 -0
- package/dist/matter/MatterConfigCollector.d.ts.map +1 -0
- package/dist/matter/MatterConfigCollector.js +78 -0
- package/dist/matter/MatterConfigCollector.js.map +1 -0
- package/dist/matter/{matterAccessoryCache.d.ts → accessoryCache.d.ts} +12 -3
- package/dist/matter/accessoryCache.d.ts.map +1 -0
- package/dist/matter/{matterAccessoryCache.js → accessoryCache.js} +32 -10
- package/dist/matter/accessoryCache.js.map +1 -0
- package/dist/matter/accessoryCache.spec.d.ts +2 -0
- package/dist/matter/accessoryCache.spec.d.ts.map +1 -0
- package/dist/matter/accessoryCache.spec.js +452 -0
- package/dist/matter/accessoryCache.spec.js.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.d.ts +65 -0
- package/dist/matter/behaviors/BehaviorRegistry.d.ts.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.js +139 -0
- package/dist/matter/behaviors/BehaviorRegistry.js.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts +2 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.js +307 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.js.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.d.ts +64 -0
- package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.js +160 -0
- package/dist/matter/behaviors/ColorControlBehavior.js.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.js +29 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.d.ts +21 -0
- package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.js +49 -0
- package/dist/matter/behaviors/DoorLockBehavior.js.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.js +108 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.d.ts +20 -0
- package/dist/matter/behaviors/FanControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.js +45 -0
- package/dist/matter/behaviors/FanControlBehavior.js.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.js +23 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.d.ts +21 -0
- package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.js +27 -0
- package/dist/matter/behaviors/IdentifyBehavior.js.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.js +64 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.d.ts +34 -0
- package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.js +75 -0
- package/dist/matter/behaviors/LevelControlBehavior.js.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.js +140 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.d.ts +28 -0
- package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.js +63 -0
- package/dist/matter/behaviors/OnOffBehavior.js.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.js +116 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts +19 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.js +27 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.js.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js +56 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +23 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js +49 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js +55 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts +19 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.js +27 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.js.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js +56 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +22 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.js +35 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.js.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js +52 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.d.ts +23 -0
- package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.js +79 -0
- package/dist/matter/behaviors/ThermostatBehavior.js.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.js +23 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts +32 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.js +106 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.js.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.js +27 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/index.d.ts +20 -0
- package/dist/matter/behaviors/index.d.ts.map +1 -0
- package/dist/matter/behaviors/index.js +21 -0
- package/dist/matter/behaviors/index.js.map +1 -0
- package/dist/matter/{matterConfigValidator.d.ts → configValidator.d.ts} +1 -1
- package/dist/matter/configValidator.d.ts.map +1 -0
- package/dist/matter/{matterConfigValidator.js → configValidator.js} +1 -1
- package/dist/matter/configValidator.js.map +1 -0
- package/dist/matter/configValidator.spec.d.ts +2 -0
- package/dist/matter/configValidator.spec.d.ts.map +1 -0
- package/dist/matter/configValidator.spec.js +390 -0
- package/dist/matter/configValidator.spec.js.map +1 -0
- package/dist/matter/errorHandler.d.ts +33 -0
- package/dist/matter/errorHandler.d.ts.map +1 -0
- package/dist/matter/errorHandler.js +113 -0
- package/dist/matter/errorHandler.js.map +1 -0
- package/dist/matter/errorHandler.spec.d.ts +2 -0
- package/dist/matter/errorHandler.spec.d.ts.map +1 -0
- package/dist/matter/errorHandler.spec.js +159 -0
- package/dist/matter/errorHandler.spec.js.map +1 -0
- package/dist/matter/index.d.ts +7 -4
- package/dist/matter/index.d.ts.map +1 -1
- package/dist/matter/index.js +7 -4
- package/dist/matter/index.js.map +1 -1
- package/dist/matter/{matterLogFormatter.d.ts → logFormatter.d.ts} +1 -1
- package/dist/matter/logFormatter.d.ts.map +1 -0
- package/dist/matter/{matterLogFormatter.js → logFormatter.js} +33 -6
- package/dist/matter/logFormatter.js.map +1 -0
- package/dist/matter/logFormatter.spec.d.ts +2 -0
- package/dist/matter/logFormatter.spec.d.ts.map +1 -0
- package/dist/matter/logFormatter.spec.js +284 -0
- package/dist/matter/logFormatter.spec.js.map +1 -0
- package/dist/matter/server.d.ts +350 -0
- package/dist/matter/server.d.ts.map +1 -0
- package/dist/matter/{matterServer.js → server.js} +533 -352
- package/dist/matter/server.js.map +1 -0
- package/dist/matter/{matterServerHelpers.d.ts → serverHelpers.d.ts} +2 -2
- package/dist/matter/serverHelpers.d.ts.map +1 -0
- package/dist/matter/{matterServerHelpers.js → serverHelpers.js} +11 -8
- package/dist/matter/serverHelpers.js.map +1 -0
- package/dist/matter/serverHelpers.spec.d.ts +2 -0
- package/dist/matter/serverHelpers.spec.d.ts.map +1 -0
- package/dist/matter/serverHelpers.spec.js +521 -0
- package/dist/matter/serverHelpers.spec.js.map +1 -0
- package/dist/matter/{matterSharedTypes.d.ts → sharedTypes.d.ts} +4 -10
- package/dist/matter/sharedTypes.d.ts.map +1 -0
- package/dist/matter/{matterSharedTypes.js → sharedTypes.js} +4 -10
- package/dist/matter/sharedTypes.js.map +1 -0
- package/dist/matter/{matterStorage.d.ts → storage.d.ts} +9 -2
- package/dist/matter/storage.d.ts.map +1 -0
- package/dist/matter/{matterStorage.js → storage.js} +14 -5
- package/dist/matter/{matterStorage.js.map → storage.js.map} +1 -1
- package/dist/matter/storage.spec.d.ts +2 -0
- package/dist/matter/storage.spec.d.ts.map +1 -0
- package/dist/matter/storage.spec.js +570 -0
- package/dist/matter/storage.spec.js.map +1 -0
- package/dist/matter/typeHelpers.d.ts +45 -0
- package/dist/matter/typeHelpers.d.ts.map +1 -0
- package/dist/matter/typeHelpers.js +57 -0
- package/dist/matter/typeHelpers.js.map +1 -0
- package/dist/matter/typeHelpers.spec.d.ts +2 -0
- package/dist/matter/typeHelpers.spec.d.ts.map +1 -0
- package/dist/matter/typeHelpers.spec.js +127 -0
- package/dist/matter/typeHelpers.spec.js.map +1 -0
- package/dist/matter/{matterTypes.d.ts → types.d.ts} +2 -2
- package/dist/matter/types.d.ts.map +1 -0
- package/dist/matter/{matterTypes.js → types.js} +1 -2
- package/dist/matter/types.js.map +1 -0
- package/dist/platformAccessory.spec.d.ts +2 -0
- package/dist/platformAccessory.spec.d.ts.map +1 -0
- package/dist/platformAccessory.spec.js +126 -0
- package/dist/platformAccessory.spec.js.map +1 -0
- package/dist/pluginManager.spec.d.ts +2 -0
- package/dist/pluginManager.spec.d.ts.map +1 -0
- package/dist/pluginManager.spec.js +43 -0
- package/dist/pluginManager.spec.js.map +1 -0
- package/dist/server.d.ts +4 -13
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +45 -333
- package/dist/server.js.map +1 -1
- package/dist/server.spec.d.ts +2 -0
- package/dist/server.spec.d.ts.map +1 -0
- package/dist/server.spec.js +57 -0
- package/dist/server.spec.js.map +1 -0
- package/dist/user.spec.d.ts +2 -0
- package/dist/user.spec.d.ts.map +1 -0
- package/dist/user.spec.js +31 -0
- package/dist/user.spec.js.map +1 -0
- package/dist/util/mac.spec.d.ts +2 -0
- package/dist/util/mac.spec.d.ts.map +1 -0
- package/dist/util/mac.spec.js +36 -0
- package/dist/util/mac.spec.js.map +1 -0
- package/dist/version.spec.d.ts +2 -0
- package/dist/version.spec.d.ts.map +1 -0
- package/dist/version.spec.js +20 -0
- package/dist/version.spec.js.map +1 -0
- package/package.json +4 -4
- package/dist/matter/matterAccessoryCache.d.ts.map +0 -1
- package/dist/matter/matterAccessoryCache.js.map +0 -1
- package/dist/matter/matterBehaviors.d.ts +0 -194
- package/dist/matter/matterBehaviors.d.ts.map +0 -1
- package/dist/matter/matterBehaviors.js +0 -665
- package/dist/matter/matterBehaviors.js.map +0 -1
- package/dist/matter/matterConfigValidator.d.ts.map +0 -1
- package/dist/matter/matterConfigValidator.js.map +0 -1
- package/dist/matter/matterErrorHandler.d.ts +0 -106
- package/dist/matter/matterErrorHandler.d.ts.map +0 -1
- package/dist/matter/matterErrorHandler.js +0 -495
- package/dist/matter/matterErrorHandler.js.map +0 -1
- package/dist/matter/matterLogFormatter.d.ts.map +0 -1
- package/dist/matter/matterLogFormatter.js.map +0 -1
- package/dist/matter/matterNetworkMonitor.d.ts +0 -68
- package/dist/matter/matterNetworkMonitor.d.ts.map +0 -1
- package/dist/matter/matterNetworkMonitor.js +0 -249
- package/dist/matter/matterNetworkMonitor.js.map +0 -1
- package/dist/matter/matterServer.d.ts.map +0 -1
- package/dist/matter/matterServer.js.map +0 -1
- package/dist/matter/matterServerHelpers.d.ts.map +0 -1
- package/dist/matter/matterServerHelpers.js.map +0 -1
- package/dist/matter/matterSharedTypes.d.ts.map +0 -1
- package/dist/matter/matterSharedTypes.js.map +0 -1
- package/dist/matter/matterStorage.d.ts.map +0 -1
- package/dist/matter/matterTypes.d.ts.map +0 -1
- package/dist/matter/matterTypes.js.map +0 -1
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matter Bridge Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages Matter server lifecycle and accessories for the main Homebridge bridge.
|
|
5
|
+
* This class extracts Matter-specific logic from server.ts to minimize changes to core files.
|
|
6
|
+
*/
|
|
7
|
+
import { rmSync } from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { Logger } from '../logger.js';
|
|
10
|
+
import { User } from '../user.js';
|
|
11
|
+
import { generate } from '../util/mac.js';
|
|
12
|
+
import { publishExternalMatterAccessory } from './ExternalMatterAccessoryPublisher.js';
|
|
13
|
+
import { MatterServer } from './server.js';
|
|
14
|
+
const log = Logger.internal;
|
|
15
|
+
/**
|
|
16
|
+
* Manages Matter server and accessories for the main bridge
|
|
17
|
+
*/
|
|
18
|
+
export class MatterBridgeManager {
|
|
19
|
+
config;
|
|
20
|
+
api;
|
|
21
|
+
externalPortService;
|
|
22
|
+
pluginManager;
|
|
23
|
+
options;
|
|
24
|
+
// Matter server instance for main bridge (if enabled)
|
|
25
|
+
matterServer;
|
|
26
|
+
// External Matter servers for accessories that need their own bridge
|
|
27
|
+
// Key is accessory UUID, value is MatterServer instance
|
|
28
|
+
externalMatterServers = new Map();
|
|
29
|
+
constructor(config, api, externalPortService, pluginManager, options) {
|
|
30
|
+
this.config = config;
|
|
31
|
+
this.api = api;
|
|
32
|
+
this.externalPortService = externalPortService;
|
|
33
|
+
this.pluginManager = pluginManager;
|
|
34
|
+
this.options = options;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Collect all configured Matter ports from config to avoid conflicts
|
|
38
|
+
*/
|
|
39
|
+
static collectConfiguredMatterPorts(config) {
|
|
40
|
+
const configuredMatterPorts = [];
|
|
41
|
+
if (config.bridge.matter?.port) {
|
|
42
|
+
configuredMatterPorts.push(config.bridge.matter.port);
|
|
43
|
+
}
|
|
44
|
+
for (const platform of config.platforms) {
|
|
45
|
+
if (platform._bridge?.matter?.port) {
|
|
46
|
+
configuredMatterPorts.push(platform._bridge.matter.port);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const accessory of config.accessories) {
|
|
50
|
+
if (accessory._bridge?.matter?.port) {
|
|
51
|
+
configuredMatterPorts.push(accessory._bridge.matter.port);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return configuredMatterPorts;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Initialize Matter server for main bridge if enabled
|
|
58
|
+
*/
|
|
59
|
+
async initialize() {
|
|
60
|
+
// Check if main bridge has matter configuration
|
|
61
|
+
if (!this.config.bridge.matter) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Declare matterPort outside try block so it's accessible in catch
|
|
65
|
+
let matterPort;
|
|
66
|
+
try {
|
|
67
|
+
log.info('Initializing Matter server for main bridge...');
|
|
68
|
+
// Allocate port from pool if not explicitly configured
|
|
69
|
+
matterPort = this.config.bridge.matter.port;
|
|
70
|
+
if (!matterPort) {
|
|
71
|
+
matterPort = await this.externalPortService.requestPort(`${this.config.bridge.username}:MATTER`);
|
|
72
|
+
if (!matterPort) {
|
|
73
|
+
matterPort = 5540; // Default Matter port
|
|
74
|
+
log.warn('No port available from pool for main Matter bridge, using default port 5540');
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
log.info(`Allocated port ${matterPort} from pool for main Matter bridge`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Create Matter server instance with config inheritance from main bridge
|
|
81
|
+
const serialNumber = this.config.bridge.username.replace(/:/g, '');
|
|
82
|
+
// Normalize bind config to array format
|
|
83
|
+
const networkInterfaces = this.config.bridge.bind
|
|
84
|
+
? Array.isArray(this.config.bridge.bind)
|
|
85
|
+
? this.config.bridge.bind
|
|
86
|
+
: [this.config.bridge.bind]
|
|
87
|
+
: undefined;
|
|
88
|
+
this.matterServer = new MatterServer({
|
|
89
|
+
storagePath: User.matterPath(),
|
|
90
|
+
port: matterPort,
|
|
91
|
+
uniqueId: serialNumber,
|
|
92
|
+
manufacturer: this.config.bridge.manufacturer,
|
|
93
|
+
model: this.config.bridge.model,
|
|
94
|
+
firmwareRevision: this.config.bridge.firmwareRevision,
|
|
95
|
+
serialNumber,
|
|
96
|
+
debugModeEnabled: this.options.debugModeEnabled,
|
|
97
|
+
networkInterfaces,
|
|
98
|
+
});
|
|
99
|
+
// Start the Matter server
|
|
100
|
+
await this.matterServer.start();
|
|
101
|
+
log.info('Matter server initialized for main bridge');
|
|
102
|
+
// Inform the API that Matter is enabled
|
|
103
|
+
this.api._setMatterEnabled(true);
|
|
104
|
+
// Set the Matter server reference for API methods like getAccessoryState
|
|
105
|
+
this.api._setMatterServer(this.matterServer);
|
|
106
|
+
// Listen for Matter commissioning events to update status
|
|
107
|
+
this.matterServer.on('commissioning-changed', (commissioned, fabricCount) => {
|
|
108
|
+
// Status update is handled by server.ts via getMatterStatus()
|
|
109
|
+
log.info(`Matter commissioning state changed: commissioned=${commissioned}, fabricCount=${fabricCount}`);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
log.error('Failed to initialize Matter server for main bridge:', error);
|
|
114
|
+
// Provide user-friendly guidance for common errors
|
|
115
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
116
|
+
const errorCode = error instanceof Error && 'code' in error ? error.code : undefined;
|
|
117
|
+
if (errorMessage.includes('corrupted')) {
|
|
118
|
+
log.error('');
|
|
119
|
+
log.error('╔════════════════════════════════════════════════════════════════════════════╗');
|
|
120
|
+
log.error('║ MATTER STORAGE CORRUPTED ║');
|
|
121
|
+
log.error('╠════════════════════════════════════════════════════════════════════════════╣');
|
|
122
|
+
log.error('║ Your Matter storage has become corrupted. This can happen when: ║');
|
|
123
|
+
log.error('║ • Matter.js library version changes ║');
|
|
124
|
+
log.error('║ • Storage format upgrades occur ║');
|
|
125
|
+
log.error('║ • Incomplete writes during shutdown ║');
|
|
126
|
+
log.error('║ ║');
|
|
127
|
+
log.error('║ To fix this, delete the corrupted storage directory: ║');
|
|
128
|
+
log.error(`║ rm -rf ~/.homebridge/matter/${this.config.bridge.username} ║`);
|
|
129
|
+
log.error('║ ║');
|
|
130
|
+
log.error('║ Note: You will need to re-pair your Matter devices after deletion. ║');
|
|
131
|
+
log.error('╚════════════════════════════════════════════════════════════════════════════╝');
|
|
132
|
+
log.error('');
|
|
133
|
+
}
|
|
134
|
+
else if (errorCode === 'EADDRINUSE' || errorMessage.includes('address already in use')) {
|
|
135
|
+
log.error('');
|
|
136
|
+
log.error('╔════════════════════════════════════════════════════════════════════════════╗');
|
|
137
|
+
log.error('║ MATTER PORT ALREADY IN USE ║');
|
|
138
|
+
log.error('╠════════════════════════════════════════════════════════════════════════════╣');
|
|
139
|
+
log.error(`║ Port ${matterPort} is already in use by another application. ║`);
|
|
140
|
+
log.error('║ ║');
|
|
141
|
+
log.error('║ To fix this: ║');
|
|
142
|
+
log.error('║ 1. Stop the application using this port, or ║');
|
|
143
|
+
log.error('║ 2. Configure a different port in your config.json: ║');
|
|
144
|
+
log.error('║ "bridge": { ║');
|
|
145
|
+
log.error('║ "matter": { ║');
|
|
146
|
+
log.error('║ "port": <different-port> ║');
|
|
147
|
+
log.error('║ } ║');
|
|
148
|
+
log.error('║ } ║');
|
|
149
|
+
log.error('╚════════════════════════════════════════════════════════════════════════════╝');
|
|
150
|
+
log.error('');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Handle external Matter accessories - each gets its own dedicated Matter server
|
|
156
|
+
* This is required for devices like Robotic Vacuum Cleaners that Apple Home
|
|
157
|
+
* requires to be on their own bridge.
|
|
158
|
+
*/
|
|
159
|
+
async handlePublishExternalAccessories(accessories, registrationId) {
|
|
160
|
+
log.info(`Publishing ${accessories.length} external Matter accessor${accessories.length === 1 ? 'y' : 'ies'}`);
|
|
161
|
+
// Normalize bind config to array format (inherit from main bridge)
|
|
162
|
+
const networkInterfaces = this.config.bridge.bind
|
|
163
|
+
? Array.isArray(this.config.bridge.bind)
|
|
164
|
+
? this.config.bridge.bind
|
|
165
|
+
: [this.config.bridge.bind]
|
|
166
|
+
: undefined;
|
|
167
|
+
try {
|
|
168
|
+
for (const accessory of accessories) {
|
|
169
|
+
try {
|
|
170
|
+
// Check if already published
|
|
171
|
+
if (this.externalMatterServers.has(accessory.uuid)) {
|
|
172
|
+
log.warn(`External Matter accessory ${accessory.displayName} (${accessory.uuid}) is already published`);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
// Publish the accessory using shared helper
|
|
176
|
+
const result = await publishExternalMatterAccessory(accessory, {
|
|
177
|
+
portService: this.externalPortService,
|
|
178
|
+
networkInterfaces,
|
|
179
|
+
debugModeEnabled: this.options.debugModeEnabled,
|
|
180
|
+
});
|
|
181
|
+
if (!result) {
|
|
182
|
+
// Validation or publishing failed (errors already logged by helper)
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
// Store the server instance
|
|
186
|
+
this.externalMatterServers.set(accessory.uuid, result.server);
|
|
187
|
+
// Emit the 'ready' event to notify plugins that the accessory is now available on the network
|
|
188
|
+
// This is similar to HAP's 'advertised' event and signals that the Matter server is running
|
|
189
|
+
// and the accessory can be commissioned by Matter controllers
|
|
190
|
+
if (accessory._eventEmitter) {
|
|
191
|
+
accessory._eventEmitter.emit('ready', result.port);
|
|
192
|
+
}
|
|
193
|
+
// Log commissioning info
|
|
194
|
+
if (result.commissioningInfo.qrCode && result.commissioningInfo.manualPairingCode) {
|
|
195
|
+
log.info(`📱 Commissioning codes for ${accessory.displayName}:`);
|
|
196
|
+
log.info(` QR Code: ${result.commissioningInfo.qrCode}`);
|
|
197
|
+
log.info(` Manual Code: ${result.commissioningInfo.manualPairingCode}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
log.error(`Failed to publish external Matter accessory ${accessory.displayName}:`, error);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
// Notify that registration is complete (whether successful or not)
|
|
207
|
+
this.api._resolveExternalRegistration(registrationId);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Handle registration of Matter platform accessories
|
|
212
|
+
*/
|
|
213
|
+
async handleRegisterPlatformAccessories(pluginIdentifier, platformName, accessories) {
|
|
214
|
+
if (!this.matterServer) {
|
|
215
|
+
log.warn('Cannot register Matter accessories - Matter server is not running');
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
await this.matterServer.registerPlatformAccessories(pluginIdentifier, platformName, accessories);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Handle unregistration of Matter platform accessories
|
|
222
|
+
*/
|
|
223
|
+
async handleUnregisterPlatformAccessories(pluginIdentifier, platformName, accessories) {
|
|
224
|
+
if (!this.matterServer) {
|
|
225
|
+
log.warn('Cannot unregister Matter accessories - Matter server is not running');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
await this.matterServer.unregisterPlatformAccessories(pluginIdentifier, platformName, accessories);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Handle unregistration of external Matter accessories
|
|
232
|
+
* Stops dedicated servers and cleans up storage
|
|
233
|
+
*/
|
|
234
|
+
async handleUnregisterExternalAccessories(accessories) {
|
|
235
|
+
log.info(`Unregistering ${accessories.length} external Matter accessor${accessories.length === 1 ? 'y' : 'ies'}`);
|
|
236
|
+
for (const accessory of accessories) {
|
|
237
|
+
try {
|
|
238
|
+
// Check if this external server exists
|
|
239
|
+
const matterServer = this.externalMatterServers.get(accessory.uuid);
|
|
240
|
+
if (!matterServer) {
|
|
241
|
+
log.warn(`External Matter accessory ${accessory.displayName} (${accessory.uuid}) is not registered`);
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
log.info(`Stopping external Matter server for ${accessory.displayName}`);
|
|
245
|
+
// Stop the Matter server
|
|
246
|
+
await matterServer.stop();
|
|
247
|
+
// Remove from the map
|
|
248
|
+
this.externalMatterServers.delete(accessory.uuid);
|
|
249
|
+
// Clean up storage folder
|
|
250
|
+
// Generate the same uniqueId that was used when creating the server
|
|
251
|
+
const advertiseAddress = generate(accessory.uuid);
|
|
252
|
+
const uniqueId = advertiseAddress.replace(/:/g, '');
|
|
253
|
+
const storagePath = path.join(User.matterPath(), uniqueId);
|
|
254
|
+
try {
|
|
255
|
+
log.debug(`Removing Matter storage for external accessory at: ${storagePath}`);
|
|
256
|
+
rmSync(storagePath, { recursive: true, force: true });
|
|
257
|
+
log.info(`✓ Cleaned up storage for external Matter accessory: ${accessory.displayName}`);
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
log.error(`Failed to clean up storage for external Matter accessory ${accessory.displayName}:`, error);
|
|
261
|
+
}
|
|
262
|
+
log.info(`✓ External Matter accessory unregistered: ${accessory.displayName}`);
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
log.error(`Failed to unregister external Matter accessory ${accessory.displayName}:`, error);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Handle updating Matter platform accessories in the cache
|
|
271
|
+
* Checks both external servers and main bridge server
|
|
272
|
+
*/
|
|
273
|
+
async handleUpdatePlatformAccessories(accessories) {
|
|
274
|
+
const bridgeAccessories = [];
|
|
275
|
+
// Route each accessory to the appropriate server
|
|
276
|
+
for (const accessory of accessories) {
|
|
277
|
+
const externalServer = this.externalMatterServers.get(accessory.uuid);
|
|
278
|
+
if (externalServer) {
|
|
279
|
+
// Update external accessory
|
|
280
|
+
await externalServer.updatePlatformAccessories([accessory]);
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
// Collect accessories for main bridge
|
|
284
|
+
bridgeAccessories.push(accessory);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Update accessories on main bridge server if any
|
|
288
|
+
if (bridgeAccessories.length > 0) {
|
|
289
|
+
if (!this.matterServer) {
|
|
290
|
+
log.warn('Cannot update Matter platform accessories - Matter server is not running');
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
await this.matterServer.updatePlatformAccessories(bridgeAccessories);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Handle Matter accessory state updates
|
|
298
|
+
* Checks both external servers and main bridge server
|
|
299
|
+
*/
|
|
300
|
+
async handleUpdateAccessoryState(uuid, cluster, attributes, partId) {
|
|
301
|
+
// Check if this is an external accessory first
|
|
302
|
+
const externalServer = this.externalMatterServers.get(uuid);
|
|
303
|
+
if (externalServer) {
|
|
304
|
+
await externalServer.updateAccessoryState(uuid, cluster, attributes, partId);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
// Otherwise, try the main bridge server
|
|
308
|
+
if (!this.matterServer) {
|
|
309
|
+
log.warn(`Cannot update Matter accessory state for ${uuid} - accessory not found in external servers and main Matter server is not running`);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
await this.matterServer.updateAccessoryState(uuid, cluster, attributes, partId);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Restore cached Matter accessories (matching HAP pattern)
|
|
316
|
+
*/
|
|
317
|
+
restoreCachedAccessories(keepOrphaned) {
|
|
318
|
+
if (!this.matterServer) {
|
|
319
|
+
log.debug('Matter server not available for restoring cached accessories');
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const cachedAccessories = this.matterServer.getAllCachedAccessories();
|
|
323
|
+
log.debug(`Restoring ${cachedAccessories.length} cached Matter accessories`);
|
|
324
|
+
for (const cachedAccessory of cachedAccessories) {
|
|
325
|
+
let plugin = this.pluginManager.getPlugin(cachedAccessory.plugin);
|
|
326
|
+
if (!plugin) {
|
|
327
|
+
try {
|
|
328
|
+
// Try to find plugin by platform name (handles plugin renames)
|
|
329
|
+
plugin = this.pluginManager.getPluginByActiveDynamicPlatform(cachedAccessory.platform);
|
|
330
|
+
if (plugin) {
|
|
331
|
+
log.info(`When searching for the associated plugin of the Matter accessory '${cachedAccessory.displayName}' `
|
|
332
|
+
+ `it seems like the plugin name changed from '${cachedAccessory.plugin}' to '${plugin.getPluginIdentifier()}'. Plugin association is now being transformed!`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
337
|
+
log.warn(`Could not find the associated plugin for the Matter accessory '${cachedAccessory.displayName}'. `
|
|
338
|
+
+ `Tried to find the plugin by the platform name but ${errorMessage}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
const platformPlugin = plugin && plugin.getActiveDynamicPlatform(cachedAccessory.platform);
|
|
342
|
+
if (!platformPlugin) {
|
|
343
|
+
log.warn(`Failed to find plugin to handle Matter accessory ${cachedAccessory.displayName} (plugin: ${cachedAccessory.plugin}, platform: ${cachedAccessory.platform})`);
|
|
344
|
+
if (!keepOrphaned) {
|
|
345
|
+
log.info(`Removing orphaned Matter accessory ${cachedAccessory.displayName}`);
|
|
346
|
+
this.matterServer.unregisterAccessory(cachedAccessory.uuid).catch((error) => {
|
|
347
|
+
log.warn(`Failed to unregister orphaned Matter accessory ${cachedAccessory.displayName}:`, error);
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
// Call configureMatterAccessory if the plugin implements it
|
|
353
|
+
if (platformPlugin.configureMatterAccessory) {
|
|
354
|
+
log.debug(`Calling configureMatterAccessory for ${cachedAccessory.displayName}`);
|
|
355
|
+
platformPlugin.configureMatterAccessory(cachedAccessory);
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
log.debug(`Platform ${cachedAccessory.platform} does not implement configureMatterAccessory`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Get Matter server status information for IPC communication
|
|
365
|
+
*/
|
|
366
|
+
getMatterStatus() {
|
|
367
|
+
// Include Matter commissioning info if Matter is enabled
|
|
368
|
+
if (this.matterServer) {
|
|
369
|
+
const commissioningInfo = this.matterServer.getCommissioningInfo();
|
|
370
|
+
return {
|
|
371
|
+
enabled: true,
|
|
372
|
+
port: this.config.bridge.matter?.port,
|
|
373
|
+
setupUri: commissioningInfo.qrCode,
|
|
374
|
+
pin: commissioningInfo.manualPairingCode,
|
|
375
|
+
serialNumber: commissioningInfo.serialNumber,
|
|
376
|
+
commissioned: commissioningInfo.commissioned || false,
|
|
377
|
+
deviceCount: this.matterServer.getAccessories().length,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
else if (this.config.bridge.matter) {
|
|
381
|
+
// Matter is configured but not yet started (or failed to start)
|
|
382
|
+
return {
|
|
383
|
+
enabled: false,
|
|
384
|
+
port: this.config.bridge.matter?.port,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
return {
|
|
388
|
+
enabled: false,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Trigger Matter status update (called when commissioning changes)
|
|
393
|
+
*/
|
|
394
|
+
onCommissioningChanged(callback) {
|
|
395
|
+
if (this.matterServer) {
|
|
396
|
+
this.matterServer.on('commissioning-changed', callback);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Teardown Matter servers
|
|
401
|
+
*/
|
|
402
|
+
async teardown() {
|
|
403
|
+
// Stop main Matter server if running
|
|
404
|
+
if (this.matterServer) {
|
|
405
|
+
try {
|
|
406
|
+
await this.matterServer.stop();
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
log.error('Failed to stop Matter server:', error);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// Stop all external Matter servers
|
|
413
|
+
for (const [uuid, matterServer] of this.externalMatterServers) {
|
|
414
|
+
try {
|
|
415
|
+
await matterServer.stop();
|
|
416
|
+
log.debug(`Stopped external Matter server for ${uuid}`);
|
|
417
|
+
}
|
|
418
|
+
catch (error) {
|
|
419
|
+
log.error(`Failed to stop external Matter server for ${uuid}:`, error);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
this.externalMatterServers.clear();
|
|
423
|
+
// Child bridge Matter servers are stopped by their own forked processes
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=MatterBridgeManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatterBridgeManager.js","sourceRoot":"","sources":["../../src/matter/MatterBridgeManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matter Config Collector
|
|
3
|
+
*
|
|
4
|
+
* Collects and validates Matter configuration from Homebridge config.
|
|
5
|
+
* This class extracts Matter config validation logic from server.ts to minimize changes to core files.
|
|
6
|
+
*/
|
|
7
|
+
import type { HomebridgeConfig } from '../bridgeService.js';
|
|
8
|
+
/**
|
|
9
|
+
* Validates and processes Matter configuration from Homebridge config
|
|
10
|
+
*/
|
|
11
|
+
export declare class MatterConfigCollector {
|
|
12
|
+
/**
|
|
13
|
+
* Validate all Matter configuration in the config
|
|
14
|
+
* Validates main bridge and child bridge Matter configs, checks for port conflicts
|
|
15
|
+
*
|
|
16
|
+
* @param config - The Homebridge configuration
|
|
17
|
+
*/
|
|
18
|
+
static validateMatterConfig(config: HomebridgeConfig): void;
|
|
19
|
+
/**
|
|
20
|
+
* Check for port conflicts between main bridge and child bridges
|
|
21
|
+
*
|
|
22
|
+
* @param config - The Homebridge configuration
|
|
23
|
+
*/
|
|
24
|
+
private static checkPortConflicts;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=MatterConfigCollector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatterConfigCollector.d.ts","sourceRoot":"","sources":["../../src/matter/MatterConfigCollector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAO3D;;GAEG;AACH,qBAAa,qBAAqB;IAChC;;;;;OAKG;IACH,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAmC3D;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;CA+BlC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matter Config Collector
|
|
3
|
+
*
|
|
4
|
+
* Collects and validates Matter configuration from Homebridge config.
|
|
5
|
+
* This class extracts Matter config validation logic from server.ts to minimize changes to core files.
|
|
6
|
+
*/
|
|
7
|
+
import { Logger } from '../logger.js';
|
|
8
|
+
import { MatterConfigValidator } from './configValidator.js';
|
|
9
|
+
const log = Logger.internal;
|
|
10
|
+
/**
|
|
11
|
+
* Validates and processes Matter configuration from Homebridge config
|
|
12
|
+
*/
|
|
13
|
+
export class MatterConfigCollector {
|
|
14
|
+
/**
|
|
15
|
+
* Validate all Matter configuration in the config
|
|
16
|
+
* Validates main bridge and child bridge Matter configs, checks for port conflicts
|
|
17
|
+
*
|
|
18
|
+
* @param config - The Homebridge configuration
|
|
19
|
+
*/
|
|
20
|
+
static validateMatterConfig(config) {
|
|
21
|
+
// Check if any Matter config exists
|
|
22
|
+
const hasMatterConfig = config.bridge.matter
|
|
23
|
+
|| config.platforms.some((p) => p._bridge?.matter)
|
|
24
|
+
|| config.accessories.some((a) => a._bridge?.matter);
|
|
25
|
+
if (!hasMatterConfig) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// Validate main bridge Matter config
|
|
29
|
+
if (config.bridge.matter) {
|
|
30
|
+
const validation = MatterConfigValidator.validate(config.bridge.matter);
|
|
31
|
+
if (!validation.isValid) {
|
|
32
|
+
log.error('Main bridge Matter configuration is invalid. Matter will not be enabled for the main bridge.');
|
|
33
|
+
delete config.bridge.matter;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Validate all child bridge Matter configs and check for port conflicts
|
|
37
|
+
const childMatterValidation = MatterConfigValidator.validateAllChildMatterConfigs(config.platforms, config.accessories);
|
|
38
|
+
if (!childMatterValidation.isValid) {
|
|
39
|
+
log.error('Some child bridge Matter configurations are invalid. Check the errors above.');
|
|
40
|
+
}
|
|
41
|
+
// Check for conflicts between main bridge Matter port and child bridge ports
|
|
42
|
+
if (config.bridge.matter?.port) {
|
|
43
|
+
this.checkPortConflicts(config);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check for port conflicts between main bridge and child bridges
|
|
48
|
+
*
|
|
49
|
+
* @param config - The Homebridge configuration
|
|
50
|
+
*/
|
|
51
|
+
static checkPortConflicts(config) {
|
|
52
|
+
const mainMatterPort = config.bridge.matter?.port;
|
|
53
|
+
if (!mainMatterPort) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Collect all child bridge Matter ports
|
|
57
|
+
const childMatterPorts = [];
|
|
58
|
+
for (const platform of config.platforms) {
|
|
59
|
+
if (platform._bridge?.matter?.port) {
|
|
60
|
+
childMatterPorts.push(platform._bridge.matter.port);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
for (const accessory of config.accessories) {
|
|
64
|
+
if (accessory._bridge?.matter?.port) {
|
|
65
|
+
childMatterPorts.push(accessory._bridge.matter.port);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Check for conflicts with child bridge Matter ports
|
|
69
|
+
if (childMatterPorts.includes(mainMatterPort)) {
|
|
70
|
+
log.error(`Main bridge Matter port ${mainMatterPort} conflicts with a child bridge Matter port. Please use unique ports.`);
|
|
71
|
+
}
|
|
72
|
+
// Check for conflict with main bridge HAP port
|
|
73
|
+
if (config.bridge.port && Math.abs(config.bridge.port - mainMatterPort) < 10) {
|
|
74
|
+
log.warn(`Main bridge HAP port ${config.bridge.port} and Matter port ${mainMatterPort} are very close. Consider spacing them further apart.`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=MatterConfigCollector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatterConfigCollector.js","sourceRoot":"","sources":["../../src/matter/MatterConfigCollector.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Handles persistence of Matter accessories across Homebridge restarts.
|
|
5
5
|
* Similar to HAP's cached accessories, but designed for Matter's simpler API.
|
|
6
6
|
*/
|
|
7
|
-
import type { InternalMatterAccessory } from './
|
|
7
|
+
import type { InternalMatterAccessory } from './types.js';
|
|
8
8
|
/**
|
|
9
9
|
* Serializable Matter accessory part (excludes functions and runtime state)
|
|
10
10
|
*/
|
|
@@ -56,6 +56,8 @@ export declare class MatterAccessoryCache {
|
|
|
56
56
|
private cacheLoaded;
|
|
57
57
|
private saveQueue;
|
|
58
58
|
private directoryEnsured;
|
|
59
|
+
private saveDebounceTimer;
|
|
60
|
+
private readonly SAVE_DEBOUNCE_MS;
|
|
59
61
|
constructor(storagePath: string, bridgeId: string);
|
|
60
62
|
/**
|
|
61
63
|
* Load cached accessories from disk
|
|
@@ -63,8 +65,15 @@ export declare class MatterAccessoryCache {
|
|
|
63
65
|
*/
|
|
64
66
|
load(): Promise<Map<string, SerializedMatterAccessory>>;
|
|
65
67
|
/**
|
|
66
|
-
*
|
|
68
|
+
* Request a debounced save to cache
|
|
69
|
+
* Multiple rapid calls within the debounce window will only result in one disk write
|
|
70
|
+
* Use this for normal operations to reduce disk I/O
|
|
71
|
+
*/
|
|
72
|
+
requestSave(accessories: Map<string, InternalMatterAccessory>): void;
|
|
73
|
+
/**
|
|
74
|
+
* Save accessories to cache immediately (serialized to prevent concurrent write conflicts)
|
|
67
75
|
* Uses a queue pattern to ensure saves are truly serialized even when called concurrently
|
|
76
|
+
* Use this for shutdown/critical operations that need immediate persistence
|
|
68
77
|
*/
|
|
69
78
|
save(accessories: Map<string, InternalMatterAccessory>): Promise<void>;
|
|
70
79
|
/**
|
|
@@ -93,4 +102,4 @@ export declare class MatterAccessoryCache {
|
|
|
93
102
|
*/
|
|
94
103
|
private serializeAccessory;
|
|
95
104
|
}
|
|
96
|
-
//# sourceMappingURL=
|
|
105
|
+
//# sourceMappingURL=accessoryCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessoryCache.d.ts","sourceRoot":"","sources":["../../src/matter/accessoryCache.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAUzD;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,QAAQ,EAAE;QACR,CAAC,WAAW,EAAE,MAAM,GAAG;YACrB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAA;SACjC,CAAA;KACF,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE;QACT,CAAC,WAAW,EAAE,MAAM,GAAG;YACrB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAA;SACjC,CAAA;KACF,CAAA;IACD,KAAK,CAAC,EAAE,6BAA6B,EAAE,CAAA;CACxC;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,iBAAiB,CAAoD;IAC7E,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAO;gBAE5B,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAIjD;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAoD7D;;;;OAIG;IACH,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,GAAG,IAAI;IAcpE;;;;OAIG;IACG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5E;;;OAGG;YACW,WAAW;IA+CzB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS;IAI9D;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAItD;;OAEG;IACH,OAAO,CAAC,kBAAkB;CA0C3B"}
|