homebridge 2.0.0-beta.4 → 2.0.0-beta.40
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/README.md +16 -17
- package/bin/homebridge.js +22 -0
- package/config-sample.json +3 -3
- package/dist/api.d.ts +499 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +223 -0
- package/dist/api.js.map +1 -0
- 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/{lib → dist}/bridgeService.d.ts +19 -10
- package/dist/bridgeService.d.ts.map +1 -0
- package/{lib → dist}/bridgeService.js +85 -117
- package/dist/bridgeService.js.map +1 -0
- package/{lib → dist}/childBridgeFork.d.ts +11 -5
- package/dist/childBridgeFork.d.ts.map +1 -0
- package/{lib → dist}/childBridgeFork.js +93 -44
- package/dist/childBridgeFork.js.map +1 -0
- package/{lib → dist}/childBridgeService.d.ts +37 -7
- package/dist/childBridgeService.d.ts.map +1 -0
- package/{lib → dist}/childBridgeService.js +127 -69
- package/dist/childBridgeService.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +90 -0
- package/dist/cli.js.map +1 -0
- package/dist/externalPortService.d.ts +47 -0
- package/dist/externalPortService.d.ts.map +1 -0
- package/dist/externalPortService.js +105 -0
- package/dist/externalPortService.js.map +1 -0
- package/dist/index.d.ts +141 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/ipcService.d.ts +48 -0
- package/dist/ipcService.d.ts.map +1 -0
- package/{lib → dist}/ipcService.js +12 -14
- package/dist/ipcService.js.map +1 -0
- package/{lib → dist}/logger.d.ts +12 -6
- package/dist/logger.d.ts.map +1 -0
- package/{lib → dist}/logger.js +27 -28
- package/dist/logger.js.map +1 -0
- 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 +399 -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/MatterAPIImpl.d.ts +504 -0
- 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 +87 -0
- package/dist/matter/MatterBridgeManager.d.ts.map +1 -0
- package/dist/matter/MatterBridgeManager.js +413 -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/accessoryCache.d.ts +105 -0
- package/dist/matter/accessoryCache.d.ts.map +1 -0
- package/dist/matter/accessoryCache.js +214 -0
- 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 +63 -0
- package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.js +223 -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 +20 -0
- package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.js +71 -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 +120 -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 +71 -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 +20 -0
- package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.js +41 -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 +33 -0
- package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.js +138 -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 +145 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.d.ts +27 -0
- package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.js +95 -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 +128 -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 +41 -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 +57 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +22 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js +86 -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 +41 -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 +57 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +21 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.js +61 -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 +53 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.d.ts +22 -0
- package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.js +127 -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 +31 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.js +158 -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/configValidator.d.ts +81 -0
- package/dist/matter/configValidator.d.ts.map +1 -0
- package/dist/matter/configValidator.js +240 -0
- 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/errors.d.ts +178 -0
- package/dist/matter/errors.d.ts.map +1 -0
- package/dist/matter/errors.js +200 -0
- package/dist/matter/errors.js.map +1 -0
- package/dist/matter/index.d.ts +127 -0
- package/dist/matter/index.d.ts.map +1 -0
- package/dist/matter/index.js +23 -0
- package/dist/matter/index.js.map +1 -0
- package/dist/matter/logFormatter.d.ts +19 -0
- package/dist/matter/logFormatter.d.ts.map +1 -0
- package/dist/matter/logFormatter.js +158 -0
- 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 +252 -0
- package/dist/matter/logFormatter.spec.js.map +1 -0
- package/dist/matter/server.d.ts +336 -0
- package/dist/matter/server.d.ts.map +1 -0
- package/dist/matter/server.js +1810 -0
- package/dist/matter/server.js.map +1 -0
- package/dist/matter/serverHelpers.d.ts +81 -0
- package/dist/matter/serverHelpers.d.ts.map +1 -0
- package/dist/matter/serverHelpers.js +326 -0
- 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/sharedTypes.d.ts +164 -0
- package/dist/matter/sharedTypes.d.ts.map +1 -0
- package/dist/matter/sharedTypes.js +46 -0
- package/dist/matter/sharedTypes.js.map +1 -0
- package/dist/matter/storage.d.ts +135 -0
- package/dist/matter/storage.d.ts.map +1 -0
- package/dist/matter/storage.js +424 -0
- package/dist/matter/storage.js.map +1 -0
- 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/types.d.ts +826 -0
- package/dist/matter/types.d.ts.map +1 -0
- package/dist/matter/types.js +204 -0
- package/dist/matter/types.js.map +1 -0
- package/{lib → dist}/platformAccessory.d.ts +8 -6
- package/dist/platformAccessory.d.ts.map +1 -0
- package/{lib → dist}/platformAccessory.js +19 -16
- package/dist/platformAccessory.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/{lib → dist}/plugin.d.ts +2 -3
- package/dist/plugin.d.ts.map +1 -0
- package/{lib → dist}/plugin.js +39 -51
- package/dist/plugin.js.map +1 -0
- package/{lib → dist}/pluginManager.d.ts +3 -3
- package/dist/pluginManager.d.ts.map +1 -0
- package/{lib → dist}/pluginManager.js +76 -81
- package/dist/pluginManager.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/{lib → dist}/server.d.ts +14 -1
- package/dist/server.d.ts.map +1 -0
- package/{lib → dist}/server.js +193 -123
- package/dist/server.js.map +1 -0
- 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/{lib → dist}/storageService.d.ts.map +1 -1
- package/dist/storageService.js +41 -0
- package/dist/storageService.js.map +1 -0
- package/{lib → dist}/user.d.ts +1 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +32 -0
- package/dist/user.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/{lib → dist}/util/mac.d.ts +1 -0
- package/dist/util/mac.d.ts.map +1 -0
- package/dist/util/mac.js +14 -0
- package/dist/util/mac.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.d.ts.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.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 +49 -50
- package/bin/homebridge +0 -17
- package/lib/api.d.ts +0 -210
- package/lib/api.d.ts.map +0 -1
- package/lib/api.js +0 -155
- package/lib/api.js.map +0 -1
- package/lib/bridgeService.d.ts.map +0 -1
- package/lib/bridgeService.js.map +0 -1
- package/lib/childBridgeFork.d.ts.map +0 -1
- package/lib/childBridgeFork.js.map +0 -1
- package/lib/childBridgeService.d.ts.map +0 -1
- package/lib/childBridgeService.js.map +0 -1
- package/lib/cli.d.ts +0 -4
- package/lib/cli.d.ts.map +0 -1
- package/lib/cli.js +0 -111
- package/lib/cli.js.map +0 -1
- package/lib/externalPortService.d.ts +0 -33
- package/lib/externalPortService.d.ts.map +0 -1
- package/lib/externalPortService.js +0 -64
- package/lib/externalPortService.js.map +0 -1
- package/lib/index.d.ts +0 -76
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -72
- package/lib/index.js.map +0 -1
- package/lib/ipcService.d.ts +0 -33
- package/lib/ipcService.d.ts.map +0 -1
- package/lib/ipcService.js.map +0 -1
- package/lib/logger.d.ts.map +0 -1
- package/lib/logger.js.map +0 -1
- package/lib/platformAccessory.d.ts.map +0 -1
- package/lib/platformAccessory.js.map +0 -1
- package/lib/plugin.d.ts.map +0 -1
- package/lib/plugin.js.map +0 -1
- package/lib/pluginManager.d.ts.map +0 -1
- package/lib/pluginManager.js.map +0 -1
- package/lib/server.d.ts.map +0 -1
- package/lib/server.js.map +0 -1
- package/lib/storageService.js +0 -70
- package/lib/storageService.js.map +0 -1
- package/lib/user.d.ts.map +0 -1
- package/lib/user.js +0 -36
- package/lib/user.js.map +0 -1
- package/lib/util/mac.d.ts.map +0 -1
- package/lib/util/mac.js +0 -20
- package/lib/util/mac.js.map +0 -1
- package/lib/version.d.ts.map +0 -1
- package/lib/version.js +0 -21
- package/lib/version.js.map +0 -1
- /package/{lib → dist}/storageService.d.ts +0 -0
- /package/{lib → dist}/version.d.ts +0 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ColorControl Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles color control commands for RGB lights and color temperature lights
|
|
5
|
+
*/
|
|
6
|
+
import { ColorControlServer } from '@matter/main/behaviors/color-control';
|
|
7
|
+
import { Status, StatusResponseError } from '@matter/main/types';
|
|
8
|
+
import { MatterStatus } from '../errors.js';
|
|
9
|
+
/**
|
|
10
|
+
* Custom ColorControl Server that calls plugin handlers
|
|
11
|
+
*
|
|
12
|
+
* ColorControl handles color changes for lights (hue, saturation, XY color, color temperature).
|
|
13
|
+
* Plugin developers can override these *Logic methods to handle color changes in their hardware.
|
|
14
|
+
*
|
|
15
|
+
* Features (Xy, ColorTemperature, HueSaturation) are added by the device type, not this behavior.
|
|
16
|
+
* This ensures each device only gets the features it needs.
|
|
17
|
+
*/
|
|
18
|
+
export class HomebridgeColorControlServer extends ColorControlServer {
|
|
19
|
+
static registry;
|
|
20
|
+
/**
|
|
21
|
+
* Set the behavior registry (called once during server initialization)
|
|
22
|
+
*/
|
|
23
|
+
static setRegistry(registry) {
|
|
24
|
+
this.registry = registry;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Called when color temperature is changed
|
|
28
|
+
* @param colorTemperatureMireds - Target color temperature in mireds (micro reciprocal degrees)
|
|
29
|
+
* @param transitionTime - Transition time in seconds (0 = as fast as possible)
|
|
30
|
+
*/
|
|
31
|
+
async moveToColorTemperatureLogic(colorTemperatureMireds, transitionTime) {
|
|
32
|
+
const endpointId = this.endpoint.id;
|
|
33
|
+
try {
|
|
34
|
+
// Execute user handler
|
|
35
|
+
await HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'moveToColorTemperatureLogic', { colorTemperatureMireds, transitionTime });
|
|
36
|
+
// Only reached if handler succeeded - update Matter state
|
|
37
|
+
await super.moveToColorTemperatureLogic(colorTemperatureMireds, transitionTime);
|
|
38
|
+
// Sync color temperature to cache
|
|
39
|
+
const currentState = this.state;
|
|
40
|
+
if (currentState.colorTemperatureMireds !== undefined) {
|
|
41
|
+
HomebridgeColorControlServer.registry.syncStateToCache(endpointId, 'colorControl', {
|
|
42
|
+
colorTemperatureMireds: currentState.colorTemperatureMireds,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
48
|
+
// This sends a proper Matter protocol error response to the controller
|
|
49
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
53
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
54
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
55
|
+
throw new StatusResponseError(`Failed to set color temperature: ${message}`, Status.Failure);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Called when hue and saturation are changed together
|
|
60
|
+
* @param hue - Target hue value (0-254 for normal hue, 0-65535 for enhanced hue)
|
|
61
|
+
* @param saturation - Target saturation value (0-254)
|
|
62
|
+
* @param transitionTime - Transition time in seconds (0 = as fast as possible)
|
|
63
|
+
*/
|
|
64
|
+
async moveToHueAndSaturationLogic(hue, saturation, transitionTime) {
|
|
65
|
+
const endpointId = this.endpoint.id;
|
|
66
|
+
try {
|
|
67
|
+
// Execute user handler
|
|
68
|
+
await HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'moveToHueAndSaturationLogic', { hue, saturation, transitionTime });
|
|
69
|
+
// Only reached if handler succeeded - update Matter state
|
|
70
|
+
await super.moveToHueAndSaturationLogic(hue, saturation, transitionTime);
|
|
71
|
+
// Sync hue and saturation to cache
|
|
72
|
+
const currentState = this.state;
|
|
73
|
+
const stateUpdate = {};
|
|
74
|
+
if (currentState.currentHue !== undefined) {
|
|
75
|
+
stateUpdate.currentHue = currentState.currentHue;
|
|
76
|
+
}
|
|
77
|
+
if (currentState.currentSaturation !== undefined) {
|
|
78
|
+
stateUpdate.currentSaturation = currentState.currentSaturation;
|
|
79
|
+
}
|
|
80
|
+
HomebridgeColorControlServer.registry.syncStateToCache(endpointId, 'colorControl', stateUpdate);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
84
|
+
// This sends a proper Matter protocol error response to the controller
|
|
85
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
89
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
90
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
91
|
+
throw new StatusResponseError(`Failed to set hue and saturation: ${message}`, Status.Failure);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Called when XY color coordinates are changed
|
|
96
|
+
* @param targetX - Target X value (0-65535 representing 0.0-1.0 in CIE color space)
|
|
97
|
+
* @param targetY - Target Y value (0-65535 representing 0.0-1.0 in CIE color space)
|
|
98
|
+
* @param transitionTime - Transition time in seconds (0 = as fast as possible)
|
|
99
|
+
*/
|
|
100
|
+
async moveToColorLogic(targetX, targetY, transitionTime) {
|
|
101
|
+
const endpointId = this.endpoint.id;
|
|
102
|
+
try {
|
|
103
|
+
// Execute user handler
|
|
104
|
+
await HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'moveToColorLogic', { targetX, targetY, transitionTime });
|
|
105
|
+
// Only reached if handler succeeded - update Matter state
|
|
106
|
+
await super.moveToColorLogic(targetX, targetY, transitionTime);
|
|
107
|
+
// Sync XY color to cache
|
|
108
|
+
const currentState = this.state;
|
|
109
|
+
const stateUpdate = {};
|
|
110
|
+
if (currentState.currentX !== undefined) {
|
|
111
|
+
stateUpdate.currentX = currentState.currentX;
|
|
112
|
+
}
|
|
113
|
+
if (currentState.currentY !== undefined) {
|
|
114
|
+
stateUpdate.currentY = currentState.currentY;
|
|
115
|
+
}
|
|
116
|
+
HomebridgeColorControlServer.registry.syncStateToCache(endpointId, 'colorControl', stateUpdate);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
120
|
+
// This sends a proper Matter protocol error response to the controller
|
|
121
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
125
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
126
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
127
|
+
throw new StatusResponseError(`Failed to set XY color: ${message}`, Status.Failure);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Called when hue is changed individually
|
|
132
|
+
* @param targetHue - Target hue value
|
|
133
|
+
* @param direction - Direction to move (shortest, longest, up, down)
|
|
134
|
+
* @param transitionTime - Transition time in seconds
|
|
135
|
+
* @param isEnhancedHue - Whether this is enhanced hue (16-bit) or normal hue (8-bit)
|
|
136
|
+
*/
|
|
137
|
+
async moveToHueLogic(targetHue, direction, transitionTime, isEnhancedHue = false) {
|
|
138
|
+
const endpointId = this.endpoint.id;
|
|
139
|
+
try {
|
|
140
|
+
// Execute user handler
|
|
141
|
+
await HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'moveToHueLogic', { targetHue, direction, transitionTime, isEnhancedHue });
|
|
142
|
+
// Only reached if handler succeeded - update Matter state
|
|
143
|
+
await super.moveToHueLogic(targetHue, direction, transitionTime, isEnhancedHue);
|
|
144
|
+
// Sync hue to cache
|
|
145
|
+
const currentState = this.state;
|
|
146
|
+
const stateUpdate = {};
|
|
147
|
+
if (isEnhancedHue && currentState.enhancedCurrentHue !== undefined) {
|
|
148
|
+
stateUpdate.enhancedCurrentHue = currentState.enhancedCurrentHue;
|
|
149
|
+
}
|
|
150
|
+
else if (currentState.currentHue !== undefined) {
|
|
151
|
+
stateUpdate.currentHue = currentState.currentHue;
|
|
152
|
+
}
|
|
153
|
+
HomebridgeColorControlServer.registry.syncStateToCache(endpointId, 'colorControl', stateUpdate);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
157
|
+
// This sends a proper Matter protocol error response to the controller
|
|
158
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
162
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
163
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
164
|
+
throw new StatusResponseError(`Failed to set hue: ${message}`, Status.Failure);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Called when saturation is changed individually
|
|
169
|
+
* @param targetSaturation - Target saturation value (0-254)
|
|
170
|
+
* @param transitionTime - Transition time in seconds
|
|
171
|
+
*/
|
|
172
|
+
async moveToSaturationLogic(targetSaturation, transitionTime) {
|
|
173
|
+
const endpointId = this.endpoint.id;
|
|
174
|
+
try {
|
|
175
|
+
// Execute user handler
|
|
176
|
+
await HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'moveToSaturationLogic', { targetSaturation, transitionTime });
|
|
177
|
+
// Only reached if handler succeeded - update Matter state
|
|
178
|
+
await super.moveToSaturationLogic(targetSaturation, transitionTime);
|
|
179
|
+
// Sync saturation to cache
|
|
180
|
+
const currentState = this.state;
|
|
181
|
+
if (currentState.currentSaturation !== undefined) {
|
|
182
|
+
HomebridgeColorControlServer.registry.syncStateToCache(endpointId, 'colorControl', {
|
|
183
|
+
currentSaturation: currentState.currentSaturation,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
189
|
+
// This sends a proper Matter protocol error response to the controller
|
|
190
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
193
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
194
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
195
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
196
|
+
throw new StatusResponseError(`Failed to set saturation: ${message}`, Status.Failure);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Called when all color movement should be stopped
|
|
201
|
+
*/
|
|
202
|
+
async stopAllColorMovement() {
|
|
203
|
+
const endpointId = this.endpoint.id;
|
|
204
|
+
try {
|
|
205
|
+
// Execute user handler
|
|
206
|
+
await HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'stopAllColorMovement');
|
|
207
|
+
// Only reached if handler succeeded - update Matter state
|
|
208
|
+
await super.stopAllColorMovement();
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
212
|
+
// This sends a proper Matter protocol error response to the controller
|
|
213
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
214
|
+
throw error;
|
|
215
|
+
}
|
|
216
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
217
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
218
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
219
|
+
throw new StatusResponseError(`Failed to stop color movement: ${message}`, Status.Failure);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=ColorControlBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorControlBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/ColorControlBehavior.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorControlBehavior.spec.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/ColorControlBehavior.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { HomebridgeColorControlServer } from './ColorControlBehavior.js';
|
|
3
|
+
describe('homebridgeColorControlServer', () => {
|
|
4
|
+
describe('setRegistry', () => {
|
|
5
|
+
it('should set the registry', () => {
|
|
6
|
+
const newRegistry = {};
|
|
7
|
+
HomebridgeColorControlServer.setRegistry(newRegistry);
|
|
8
|
+
expect(true).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe('behavior structure', () => {
|
|
12
|
+
it('should extend ColorControlServer', () => {
|
|
13
|
+
expect(HomebridgeColorControlServer.prototype).toBeDefined();
|
|
14
|
+
});
|
|
15
|
+
it('should have color control logic methods', () => {
|
|
16
|
+
// Check the *Logic methods that we actually override
|
|
17
|
+
expect(typeof HomebridgeColorControlServer.prototype.moveToHueLogic).toBe('function');
|
|
18
|
+
expect(typeof HomebridgeColorControlServer.prototype.moveToSaturationLogic).toBe('function');
|
|
19
|
+
expect(typeof HomebridgeColorControlServer.prototype.moveToHueAndSaturationLogic).toBe('function');
|
|
20
|
+
expect(typeof HomebridgeColorControlServer.prototype.moveToColorLogic).toBe('function');
|
|
21
|
+
expect(typeof HomebridgeColorControlServer.prototype.moveToColorTemperatureLogic).toBe('function');
|
|
22
|
+
expect(typeof HomebridgeColorControlServer.prototype.stopAllColorMovement).toBe('function');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
// Note: ColorControlBehavior has complex color command overrides with state synchronization.
|
|
27
|
+
// Full unit testing would require mocking the entire Matter.js state machine.
|
|
28
|
+
// Integration tests would be more appropriate.
|
|
29
|
+
//# sourceMappingURL=ColorControlBehavior.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorControlBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/ColorControlBehavior.spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAExE,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,WAAW,GAAG,EAAsB,CAAA;YAC1C,4BAA4B,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;YACrD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;QAC9D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,qDAAqD;YACrD,MAAM,CAAC,OAAO,4BAA4B,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACrF,MAAM,CAAC,OAAO,4BAA4B,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC5F,MAAM,CAAC,OAAO,4BAA4B,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAClG,MAAM,CAAC,OAAO,4BAA4B,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACvF,MAAM,CAAC,OAAO,4BAA4B,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAClG,MAAM,CAAC,OAAO,4BAA4B,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC7F,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,6FAA6F;AAC7F,8EAA8E;AAC9E,+CAA+C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DoorLock Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles door lock commands for smart locks
|
|
5
|
+
*/
|
|
6
|
+
import type { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
7
|
+
import { DoorLockServer } from '@matter/main/behaviors/door-lock';
|
|
8
|
+
/**
|
|
9
|
+
* Custom DoorLock Server that calls plugin handlers
|
|
10
|
+
*/
|
|
11
|
+
export declare class HomebridgeDoorLockServer extends DoorLockServer {
|
|
12
|
+
private static registry;
|
|
13
|
+
/**
|
|
14
|
+
* Set the behavior registry (called once during server initialization)
|
|
15
|
+
*/
|
|
16
|
+
static setRegistry(registry: BehaviorRegistry): void;
|
|
17
|
+
lockDoor(): Promise<void>;
|
|
18
|
+
unlockDoor(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=DoorLockBehavior.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DoorLockBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/DoorLockBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAKjE;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,cAAc;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIrC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CA4B3C"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DoorLock Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles door lock commands for smart locks
|
|
5
|
+
*/
|
|
6
|
+
import { DoorLockServer } from '@matter/main/behaviors/door-lock';
|
|
7
|
+
import { Status, StatusResponseError } from '@matter/main/types';
|
|
8
|
+
import { MatterStatus } from '../errors.js';
|
|
9
|
+
/**
|
|
10
|
+
* Custom DoorLock Server that calls plugin handlers
|
|
11
|
+
*/
|
|
12
|
+
export class HomebridgeDoorLockServer extends DoorLockServer {
|
|
13
|
+
static registry;
|
|
14
|
+
/**
|
|
15
|
+
* Set the behavior registry (called once during server initialization)
|
|
16
|
+
*/
|
|
17
|
+
static setRegistry(registry) {
|
|
18
|
+
this.registry = registry;
|
|
19
|
+
}
|
|
20
|
+
async lockDoor() {
|
|
21
|
+
const endpointId = this.endpoint.id;
|
|
22
|
+
try {
|
|
23
|
+
// Execute user handler
|
|
24
|
+
await HomebridgeDoorLockServer.registry.executeHandler(endpointId, 'doorLock', 'lockDoor');
|
|
25
|
+
// Only reached if handler succeeded - update Matter state
|
|
26
|
+
await super.lockDoor();
|
|
27
|
+
// Sync lock state to cache
|
|
28
|
+
const currentState = this.state;
|
|
29
|
+
if (currentState.lockState !== undefined) {
|
|
30
|
+
HomebridgeDoorLockServer.registry.syncStateToCache(endpointId, 'doorLock', { lockState: currentState.lockState });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
35
|
+
// This sends a proper Matter protocol error response to the controller
|
|
36
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
40
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
41
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
42
|
+
throw new StatusResponseError(`Failed to lock door: ${message}`, Status.Failure);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async unlockDoor() {
|
|
46
|
+
const endpointId = this.endpoint.id;
|
|
47
|
+
try {
|
|
48
|
+
// Execute user handler
|
|
49
|
+
await HomebridgeDoorLockServer.registry.executeHandler(endpointId, 'doorLock', 'unlockDoor');
|
|
50
|
+
// Only reached if handler succeeded - update Matter state
|
|
51
|
+
await super.unlockDoor();
|
|
52
|
+
// Sync lock state to cache
|
|
53
|
+
const currentState = this.state;
|
|
54
|
+
if (currentState.lockState !== undefined) {
|
|
55
|
+
HomebridgeDoorLockServer.registry.syncStateToCache(endpointId, 'doorLock', { lockState: currentState.lockState });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
60
|
+
// This sends a proper Matter protocol error response to the controller
|
|
61
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
65
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
66
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
67
|
+
throw new StatusResponseError(`Failed to unlock door: ${message}`, Status.Failure);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=DoorLockBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DoorLockBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/DoorLockBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,cAAc;IAClD,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAA0B;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAEQ,KAAK,CAAC,QAAQ;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,IAAI,CAAC;YACH,uBAAuB;YACvB,MAAM,wBAAwB,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;YAE1F,0DAA0D;YAC1D,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAA;YAEtB,2BAA2B;YAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAY,CAAA;YACtC,IAAI,YAAY,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACzC,wBAAwB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,CAAA;YACnH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,uEAAuE;YACvE,IAAI,YAAY,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,MAAM,KAAK,CAAA;YACb,CAAC;YAED,4DAA4D;YAC5D,uEAAuE;YACvE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,MAAM,IAAI,mBAAmB,CAAC,wBAAwB,OAAO,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QAClF,CAAC;IACH,CAAC;IAEQ,KAAK,CAAC,UAAU;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,IAAI,CAAC;YACH,uBAAuB;YACvB,MAAM,wBAAwB,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAA;YAE5F,0DAA0D;YAC1D,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;YAExB,2BAA2B;YAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAY,CAAA;YACtC,IAAI,YAAY,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACzC,wBAAwB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,CAAA;YACnH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,uEAAuE;YACvE,IAAI,YAAY,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,MAAM,KAAK,CAAA;YACb,CAAC;YAED,4DAA4D;YAC5D,uEAAuE;YACvE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,MAAM,IAAI,mBAAmB,CAAC,0BAA0B,OAAO,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACpF,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DoorLockBehavior.spec.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/DoorLockBehavior.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { HomebridgeDoorLockServer } from './DoorLockBehavior.js';
|
|
3
|
+
describe('homebridgeDoorLockServer', () => {
|
|
4
|
+
let mockRegistry;
|
|
5
|
+
let behavior;
|
|
6
|
+
let mockEndpoint;
|
|
7
|
+
let mockState;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
// Create mock registry
|
|
10
|
+
mockRegistry = {
|
|
11
|
+
executeHandler: vi.fn().mockResolvedValue(true),
|
|
12
|
+
syncStateToCache: vi.fn(),
|
|
13
|
+
};
|
|
14
|
+
// Set registry on behavior class
|
|
15
|
+
HomebridgeDoorLockServer.setRegistry(mockRegistry);
|
|
16
|
+
// Create mock state
|
|
17
|
+
mockState = { lockState: 1 }; // 1 = locked, 2 = unlocked
|
|
18
|
+
// Create mock endpoint
|
|
19
|
+
mockEndpoint = {
|
|
20
|
+
id: 'test-endpoint-123',
|
|
21
|
+
};
|
|
22
|
+
// Create behavior instance with mocked properties
|
|
23
|
+
behavior = Object.create(HomebridgeDoorLockServer.prototype);
|
|
24
|
+
Object.defineProperty(behavior, 'endpoint', {
|
|
25
|
+
get: () => mockEndpoint,
|
|
26
|
+
configurable: true,
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(behavior, 'state', {
|
|
29
|
+
get: () => mockState,
|
|
30
|
+
set: (value) => {
|
|
31
|
+
mockState = value;
|
|
32
|
+
},
|
|
33
|
+
configurable: true,
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('setRegistry', () => {
|
|
37
|
+
it('should set the registry', () => {
|
|
38
|
+
const newRegistry = {};
|
|
39
|
+
HomebridgeDoorLockServer.setRegistry(newRegistry);
|
|
40
|
+
expect(true).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('lockDoor', () => {
|
|
44
|
+
it('should execute handler for lockDoor command', async () => {
|
|
45
|
+
await behavior.lockDoor();
|
|
46
|
+
expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', 'lockDoor');
|
|
47
|
+
});
|
|
48
|
+
it('should sync lockState to cache after locking', async () => {
|
|
49
|
+
mockState.lockState = 1; // locked
|
|
50
|
+
await behavior.lockDoor();
|
|
51
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', { lockState: 1 });
|
|
52
|
+
});
|
|
53
|
+
it('should propagate handler execution errors', async () => {
|
|
54
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
55
|
+
// Should throw/reject when handler fails
|
|
56
|
+
await expect(behavior.lockDoor()).rejects.toThrow('Handler failed');
|
|
57
|
+
});
|
|
58
|
+
it('should not sync state if handler fails', async () => {
|
|
59
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
60
|
+
mockState.lockState = 1;
|
|
61
|
+
try {
|
|
62
|
+
await behavior.lockDoor();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Expected to throw
|
|
66
|
+
}
|
|
67
|
+
// State should NOT be synced when handler fails
|
|
68
|
+
expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
|
|
69
|
+
});
|
|
70
|
+
it('should check lockState before syncing', async () => {
|
|
71
|
+
// When lockState is defined, it syncs
|
|
72
|
+
mockState.lockState = 1;
|
|
73
|
+
await behavior.lockDoor();
|
|
74
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalled();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('unlockDoor', () => {
|
|
78
|
+
it('should execute handler for unlockDoor command', async () => {
|
|
79
|
+
await behavior.unlockDoor();
|
|
80
|
+
expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', 'unlockDoor');
|
|
81
|
+
});
|
|
82
|
+
it('should sync lockState to cache after unlocking', async () => {
|
|
83
|
+
mockState.lockState = 2; // unlocked
|
|
84
|
+
await behavior.unlockDoor();
|
|
85
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', { lockState: 2 });
|
|
86
|
+
});
|
|
87
|
+
it('should propagate handler execution errors', async () => {
|
|
88
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
89
|
+
// Should throw/reject when handler fails
|
|
90
|
+
await expect(behavior.unlockDoor()).rejects.toThrow('Handler failed');
|
|
91
|
+
});
|
|
92
|
+
it('should not sync state if handler fails', async () => {
|
|
93
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
94
|
+
mockState.lockState = 2;
|
|
95
|
+
try {
|
|
96
|
+
await behavior.unlockDoor();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Expected to throw
|
|
100
|
+
}
|
|
101
|
+
// State should NOT be synced when handler fails
|
|
102
|
+
expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
|
|
103
|
+
});
|
|
104
|
+
it('should check lockState before syncing', async () => {
|
|
105
|
+
// When lockState is defined, it syncs
|
|
106
|
+
mockState.lockState = 2;
|
|
107
|
+
await behavior.unlockDoor();
|
|
108
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalled();
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe('lock states', () => {
|
|
112
|
+
it('should sync whatever lockState is set after command', async () => {
|
|
113
|
+
// Test that we sync the current state after lock command
|
|
114
|
+
mockState.lockState = 1;
|
|
115
|
+
await behavior.lockDoor();
|
|
116
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', { lockState: 1 });
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=DoorLockBehavior.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DoorLockBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/DoorLockBehavior.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FanControl Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles fan control commands for fans
|
|
5
|
+
*/
|
|
6
|
+
import type { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
7
|
+
import { FanControlServer } from '@matter/main/behaviors/fan-control';
|
|
8
|
+
/**
|
|
9
|
+
* Custom FanControl Server that calls plugin handlers
|
|
10
|
+
*/
|
|
11
|
+
export declare class HomebridgeFanControlServer extends FanControlServer {
|
|
12
|
+
#private;
|
|
13
|
+
private static registry;
|
|
14
|
+
/**
|
|
15
|
+
* Set the behavior registry (called once during server initialization)
|
|
16
|
+
*/
|
|
17
|
+
static setRegistry(registry: BehaviorRegistry): void;
|
|
18
|
+
initialize(): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=FanControlBehavior.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FanControlBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/FanControlBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AAKrE;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,gBAAgB;;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAI3C,UAAU,IAAI,IAAI;CAoE5B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FanControl Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles fan control commands for fans
|
|
5
|
+
*/
|
|
6
|
+
import { FanControlServer } from '@matter/main/behaviors/fan-control';
|
|
7
|
+
import { Status, StatusResponseError } from '@matter/main/types';
|
|
8
|
+
import { MatterStatus } from '../errors.js';
|
|
9
|
+
/**
|
|
10
|
+
* Custom FanControl Server that calls plugin handlers
|
|
11
|
+
*/
|
|
12
|
+
export class HomebridgeFanControlServer extends FanControlServer {
|
|
13
|
+
static registry;
|
|
14
|
+
/**
|
|
15
|
+
* Set the behavior registry (called once during server initialization)
|
|
16
|
+
*/
|
|
17
|
+
static setRegistry(registry) {
|
|
18
|
+
this.registry = registry;
|
|
19
|
+
}
|
|
20
|
+
initialize() {
|
|
21
|
+
super.initialize();
|
|
22
|
+
// React to fanMode attribute changes (on/off)
|
|
23
|
+
this.reactTo(this.events.fanMode$Changed, this.#handleFanModeChange);
|
|
24
|
+
// React to percentSetting attribute changes (speed)
|
|
25
|
+
this.reactTo(this.events.percentSetting$Changed, this.#handlePercentSettingChange);
|
|
26
|
+
}
|
|
27
|
+
async #handleFanModeChange(value, oldValue) {
|
|
28
|
+
const endpointId = this.endpoint.id;
|
|
29
|
+
try {
|
|
30
|
+
// Execute user handler
|
|
31
|
+
await HomebridgeFanControlServer.registry.executeHandler(endpointId, 'fanControl', 'fanModeChange', { fanMode: value, oldFanMode: oldValue });
|
|
32
|
+
// Sync state to cache
|
|
33
|
+
HomebridgeFanControlServer.registry.syncStateToCache(endpointId, 'fanControl', { fanMode: value });
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
37
|
+
// This sends a proper Matter protocol error response to the controller
|
|
38
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
42
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
43
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
44
|
+
throw new StatusResponseError(`Failed to change fan mode: ${message}`, Status.Failure);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async #handlePercentSettingChange(value, oldValue) {
|
|
48
|
+
const endpointId = this.endpoint.id;
|
|
49
|
+
try {
|
|
50
|
+
// Execute user handler
|
|
51
|
+
await HomebridgeFanControlServer.registry.executeHandler(endpointId, 'fanControl', 'percentSettingChange', { percentSetting: value, oldPercentSetting: oldValue });
|
|
52
|
+
// Sync state to cache
|
|
53
|
+
HomebridgeFanControlServer.registry.syncStateToCache(endpointId, 'fanControl', {
|
|
54
|
+
percentSetting: value,
|
|
55
|
+
percentCurrent: value,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
60
|
+
// This sends a proper Matter protocol error response to the controller
|
|
61
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
65
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
66
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
67
|
+
throw new StatusResponseError(`Failed to change fan speed: ${message}`, Status.Failure);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=FanControlBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FanControlBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/FanControlBehavior.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FanControlBehavior.spec.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/FanControlBehavior.spec.ts"],"names":[],"mappings":""}
|