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,160 @@
|
|
|
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
|
+
/**
|
|
8
|
+
* Custom ColorControl Server that calls plugin handlers
|
|
9
|
+
*
|
|
10
|
+
* ColorControl handles color changes for lights (hue, saturation, XY color, color temperature).
|
|
11
|
+
* Plugin developers can override these *Logic methods to handle color changes in their hardware.
|
|
12
|
+
*
|
|
13
|
+
* Features (Xy, ColorTemperature, HueSaturation) are added by the device type, not this behavior.
|
|
14
|
+
* This ensures each device only gets the features it needs.
|
|
15
|
+
*/
|
|
16
|
+
export class HomebridgeColorControlServer extends ColorControlServer {
|
|
17
|
+
static registry;
|
|
18
|
+
/**
|
|
19
|
+
* Set the behavior registry (called once during server initialization)
|
|
20
|
+
*/
|
|
21
|
+
static setRegistry(registry) {
|
|
22
|
+
this.registry = registry;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Called when color temperature is changed
|
|
26
|
+
* @param colorTemperatureMireds - Target color temperature in mireds (micro reciprocal degrees)
|
|
27
|
+
* @param transitionTime - Transition time in seconds (0 = as fast as possible)
|
|
28
|
+
*/
|
|
29
|
+
moveToColorTemperatureLogic(colorTemperatureMireds, transitionTime) {
|
|
30
|
+
const endpointId = this.endpoint.id;
|
|
31
|
+
// Execute user handler (errors are logged by registry)
|
|
32
|
+
HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'moveToColorTemperatureLogic', { colorTemperatureMireds, transitionTime }).catch(() => {
|
|
33
|
+
// Error already logged by registry
|
|
34
|
+
});
|
|
35
|
+
// Call base implementation
|
|
36
|
+
const result = super.moveToColorTemperatureLogic(colorTemperatureMireds, transitionTime);
|
|
37
|
+
// Sync color temperature to cache
|
|
38
|
+
const currentState = this.state;
|
|
39
|
+
if (currentState.colorTemperatureMireds !== undefined) {
|
|
40
|
+
HomebridgeColorControlServer.registry.syncStateToCache(endpointId, 'colorControl', {
|
|
41
|
+
colorTemperatureMireds: currentState.colorTemperatureMireds,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Called when hue and saturation are changed together
|
|
48
|
+
* @param hue - Target hue value (0-254 for normal hue, 0-65535 for enhanced hue)
|
|
49
|
+
* @param saturation - Target saturation value (0-254)
|
|
50
|
+
* @param transitionTime - Transition time in seconds (0 = as fast as possible)
|
|
51
|
+
*/
|
|
52
|
+
moveToHueAndSaturationLogic(hue, saturation, transitionTime) {
|
|
53
|
+
const endpointId = this.endpoint.id;
|
|
54
|
+
// Execute user handler (errors are logged by registry)
|
|
55
|
+
HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'moveToHueAndSaturationLogic', { hue, saturation, transitionTime }).catch(() => {
|
|
56
|
+
// Error already logged by registry
|
|
57
|
+
});
|
|
58
|
+
// Call base implementation
|
|
59
|
+
const result = super.moveToHueAndSaturationLogic(hue, saturation, transitionTime);
|
|
60
|
+
// Sync hue and saturation to cache
|
|
61
|
+
const currentState = this.state;
|
|
62
|
+
const stateUpdate = {};
|
|
63
|
+
if (currentState.currentHue !== undefined) {
|
|
64
|
+
stateUpdate.currentHue = currentState.currentHue;
|
|
65
|
+
}
|
|
66
|
+
if (currentState.currentSaturation !== undefined) {
|
|
67
|
+
stateUpdate.currentSaturation = currentState.currentSaturation;
|
|
68
|
+
}
|
|
69
|
+
HomebridgeColorControlServer.registry.syncStateToCache(endpointId, 'colorControl', stateUpdate);
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Called when XY color coordinates are changed
|
|
74
|
+
* @param targetX - Target X value (0-65535 representing 0.0-1.0 in CIE color space)
|
|
75
|
+
* @param targetY - Target Y value (0-65535 representing 0.0-1.0 in CIE color space)
|
|
76
|
+
* @param transitionTime - Transition time in seconds (0 = as fast as possible)
|
|
77
|
+
*/
|
|
78
|
+
moveToColorLogic(targetX, targetY, transitionTime) {
|
|
79
|
+
const endpointId = this.endpoint.id;
|
|
80
|
+
// Execute user handler (errors are logged by registry)
|
|
81
|
+
HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'moveToColorLogic', { targetX, targetY, transitionTime }).catch(() => {
|
|
82
|
+
// Error already logged by registry
|
|
83
|
+
});
|
|
84
|
+
// Call base implementation
|
|
85
|
+
const result = super.moveToColorLogic(targetX, targetY, transitionTime);
|
|
86
|
+
// Sync XY color to cache
|
|
87
|
+
const currentState = this.state;
|
|
88
|
+
const stateUpdate = {};
|
|
89
|
+
if (currentState.currentX !== undefined) {
|
|
90
|
+
stateUpdate.currentX = currentState.currentX;
|
|
91
|
+
}
|
|
92
|
+
if (currentState.currentY !== undefined) {
|
|
93
|
+
stateUpdate.currentY = currentState.currentY;
|
|
94
|
+
}
|
|
95
|
+
HomebridgeColorControlServer.registry.syncStateToCache(endpointId, 'colorControl', stateUpdate);
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Called when hue is changed individually
|
|
100
|
+
* @param targetHue - Target hue value
|
|
101
|
+
* @param direction - Direction to move (shortest, longest, up, down)
|
|
102
|
+
* @param transitionTime - Transition time in seconds
|
|
103
|
+
* @param isEnhancedHue - Whether this is enhanced hue (16-bit) or normal hue (8-bit)
|
|
104
|
+
*/
|
|
105
|
+
moveToHueLogic(targetHue, direction, transitionTime, isEnhancedHue = false) {
|
|
106
|
+
const endpointId = this.endpoint.id;
|
|
107
|
+
// Execute user handler (errors are logged by registry)
|
|
108
|
+
HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'moveToHueLogic', { targetHue, direction, transitionTime, isEnhancedHue }).catch(() => {
|
|
109
|
+
// Error already logged by registry
|
|
110
|
+
});
|
|
111
|
+
// Call base implementation
|
|
112
|
+
const result = super.moveToHueLogic(targetHue, direction, transitionTime, isEnhancedHue);
|
|
113
|
+
// Sync hue to cache
|
|
114
|
+
const currentState = this.state;
|
|
115
|
+
const stateUpdate = {};
|
|
116
|
+
if (isEnhancedHue && currentState.enhancedCurrentHue !== undefined) {
|
|
117
|
+
stateUpdate.enhancedCurrentHue = currentState.enhancedCurrentHue;
|
|
118
|
+
}
|
|
119
|
+
else if (currentState.currentHue !== undefined) {
|
|
120
|
+
stateUpdate.currentHue = currentState.currentHue;
|
|
121
|
+
}
|
|
122
|
+
HomebridgeColorControlServer.registry.syncStateToCache(endpointId, 'colorControl', stateUpdate);
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Called when saturation is changed individually
|
|
127
|
+
* @param targetSaturation - Target saturation value (0-254)
|
|
128
|
+
* @param transitionTime - Transition time in seconds
|
|
129
|
+
*/
|
|
130
|
+
moveToSaturationLogic(targetSaturation, transitionTime) {
|
|
131
|
+
const endpointId = this.endpoint.id;
|
|
132
|
+
// Execute user handler (errors are logged by registry)
|
|
133
|
+
HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'moveToSaturationLogic', { targetSaturation, transitionTime }).catch(() => {
|
|
134
|
+
// Error already logged by registry
|
|
135
|
+
});
|
|
136
|
+
// Call base implementation
|
|
137
|
+
const result = super.moveToSaturationLogic(targetSaturation, transitionTime);
|
|
138
|
+
// Sync saturation to cache
|
|
139
|
+
const currentState = this.state;
|
|
140
|
+
if (currentState.currentSaturation !== undefined) {
|
|
141
|
+
HomebridgeColorControlServer.registry.syncStateToCache(endpointId, 'colorControl', {
|
|
142
|
+
currentSaturation: currentState.currentSaturation,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Called when all color movement should be stopped
|
|
149
|
+
*/
|
|
150
|
+
stopAllColorMovement() {
|
|
151
|
+
const endpointId = this.endpoint.id;
|
|
152
|
+
// Execute user handler (errors are logged by registry)
|
|
153
|
+
HomebridgeColorControlServer.registry.executeHandler(endpointId, 'colorControl', 'stopAllColorMovement').catch(() => {
|
|
154
|
+
// Error already logged by registry
|
|
155
|
+
});
|
|
156
|
+
// Call base implementation
|
|
157
|
+
return super.stopAllColorMovement();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# 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,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DoorLock Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles door lock commands for smart locks
|
|
5
|
+
*/
|
|
6
|
+
import type { MaybePromise } from '@matter/main';
|
|
7
|
+
import type { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
8
|
+
import { DoorLockServer } from '@matter/main/behaviors/door-lock';
|
|
9
|
+
/**
|
|
10
|
+
* Custom DoorLock Server that calls plugin handlers
|
|
11
|
+
*/
|
|
12
|
+
export declare class HomebridgeDoorLockServer extends DoorLockServer {
|
|
13
|
+
private static registry;
|
|
14
|
+
/**
|
|
15
|
+
* Set the behavior registry (called once during server initialization)
|
|
16
|
+
*/
|
|
17
|
+
static setRegistry(registry: BehaviorRegistry): void;
|
|
18
|
+
lockDoor(): MaybePromise;
|
|
19
|
+
unlockDoor(): MaybePromise;
|
|
20
|
+
}
|
|
21
|
+
//# 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,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAEjE;;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;IAI3C,QAAQ,IAAI,YAAY;IAoBxB,UAAU,IAAI,YAAY;CAmBpC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
/**
|
|
8
|
+
* Custom DoorLock Server that calls plugin handlers
|
|
9
|
+
*/
|
|
10
|
+
export class HomebridgeDoorLockServer extends DoorLockServer {
|
|
11
|
+
static registry;
|
|
12
|
+
/**
|
|
13
|
+
* Set the behavior registry (called once during server initialization)
|
|
14
|
+
*/
|
|
15
|
+
static setRegistry(registry) {
|
|
16
|
+
this.registry = registry;
|
|
17
|
+
}
|
|
18
|
+
lockDoor() {
|
|
19
|
+
const endpointId = this.endpoint.id;
|
|
20
|
+
// Execute user handler (errors are logged by registry)
|
|
21
|
+
HomebridgeDoorLockServer.registry.executeHandler(endpointId, 'doorLock', 'lockDoor').catch(() => {
|
|
22
|
+
// Error already logged by registry
|
|
23
|
+
});
|
|
24
|
+
// Call base implementation
|
|
25
|
+
const result = super.lockDoor();
|
|
26
|
+
// Sync lock state to cache
|
|
27
|
+
const currentState = this.state;
|
|
28
|
+
if (currentState.lockState !== undefined) {
|
|
29
|
+
HomebridgeDoorLockServer.registry.syncStateToCache(endpointId, 'doorLock', { lockState: currentState.lockState });
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
unlockDoor() {
|
|
34
|
+
const endpointId = this.endpoint.id;
|
|
35
|
+
// Execute user handler (errors are logged by registry)
|
|
36
|
+
HomebridgeDoorLockServer.registry.executeHandler(endpointId, 'doorLock', 'unlockDoor').catch(() => {
|
|
37
|
+
// Error already logged by registry
|
|
38
|
+
});
|
|
39
|
+
// Call base implementation
|
|
40
|
+
const result = super.unlockDoor();
|
|
41
|
+
// Sync lock state to cache
|
|
42
|
+
const currentState = this.state;
|
|
43
|
+
if (currentState.lockState !== undefined) {
|
|
44
|
+
HomebridgeDoorLockServer.registry.syncStateToCache(endpointId, 'doorLock', { lockState: currentState.lockState });
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=DoorLockBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DoorLockBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/DoorLockBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAEjE;;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,QAAQ;QACf,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,wBAAwB,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAC9F,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,2BAA2B;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;QAE/B,2BAA2B;QAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAY,CAAA;QACtC,IAAI,YAAY,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACzC,wBAAwB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,CAAA;QACnH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAEQ,UAAU;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,wBAAwB,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAChG,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,2BAA2B;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAA;QAEjC,2BAA2B;QAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAY,CAAA;QACtC,IAAI,YAAY,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACzC,wBAAwB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,CAAA;QACnH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,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,108 @@
|
|
|
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 handle handler execution errors gracefully', () => {
|
|
54
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
55
|
+
// Should not throw (returns undefined, not a promise)
|
|
56
|
+
expect(() => behavior.lockDoor()).not.toThrow();
|
|
57
|
+
});
|
|
58
|
+
it('should sync state even if handler fails', async () => {
|
|
59
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
60
|
+
mockState.lockState = 1;
|
|
61
|
+
await behavior.lockDoor();
|
|
62
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', { lockState: 1 });
|
|
63
|
+
});
|
|
64
|
+
it('should check lockState before syncing', async () => {
|
|
65
|
+
// When lockState is defined, it syncs
|
|
66
|
+
mockState.lockState = 1;
|
|
67
|
+
await behavior.lockDoor();
|
|
68
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalled();
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('unlockDoor', () => {
|
|
72
|
+
it('should execute handler for unlockDoor command', async () => {
|
|
73
|
+
await behavior.unlockDoor();
|
|
74
|
+
expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', 'unlockDoor');
|
|
75
|
+
});
|
|
76
|
+
it('should sync lockState to cache after unlocking', async () => {
|
|
77
|
+
mockState.lockState = 2; // unlocked
|
|
78
|
+
await behavior.unlockDoor();
|
|
79
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', { lockState: 2 });
|
|
80
|
+
});
|
|
81
|
+
it('should handle handler execution errors gracefully', () => {
|
|
82
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
83
|
+
// Should not throw (returns undefined, not a promise)
|
|
84
|
+
expect(() => behavior.unlockDoor()).not.toThrow();
|
|
85
|
+
});
|
|
86
|
+
it('should sync state even if handler fails', async () => {
|
|
87
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
88
|
+
mockState.lockState = 2;
|
|
89
|
+
await behavior.unlockDoor();
|
|
90
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', { lockState: 2 });
|
|
91
|
+
});
|
|
92
|
+
it('should check lockState before syncing', async () => {
|
|
93
|
+
// When lockState is defined, it syncs
|
|
94
|
+
mockState.lockState = 2;
|
|
95
|
+
await behavior.unlockDoor();
|
|
96
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalled();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe('lock states', () => {
|
|
100
|
+
it('should sync whatever lockState is set after command', async () => {
|
|
101
|
+
// Test that we sync the current state after lock command
|
|
102
|
+
mockState.lockState = 1;
|
|
103
|
+
await behavior.lockDoor();
|
|
104
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'doorLock', { lockState: 1 });
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# 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;AAErE;;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;CA4C5B"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FanControl Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles fan control commands for fans
|
|
5
|
+
*/
|
|
6
|
+
import { FanControlServer } from '@matter/main/behaviors/fan-control';
|
|
7
|
+
/**
|
|
8
|
+
* Custom FanControl Server that calls plugin handlers
|
|
9
|
+
*/
|
|
10
|
+
export class HomebridgeFanControlServer extends FanControlServer {
|
|
11
|
+
static registry;
|
|
12
|
+
/**
|
|
13
|
+
* Set the behavior registry (called once during server initialization)
|
|
14
|
+
*/
|
|
15
|
+
static setRegistry(registry) {
|
|
16
|
+
this.registry = registry;
|
|
17
|
+
}
|
|
18
|
+
initialize() {
|
|
19
|
+
super.initialize();
|
|
20
|
+
// React to fanMode attribute changes (on/off)
|
|
21
|
+
this.reactTo(this.events.fanMode$Changed, this.#handleFanModeChange);
|
|
22
|
+
// React to percentSetting attribute changes (speed)
|
|
23
|
+
this.reactTo(this.events.percentSetting$Changed, this.#handlePercentSettingChange);
|
|
24
|
+
}
|
|
25
|
+
#handleFanModeChange(value, oldValue) {
|
|
26
|
+
const endpointId = this.endpoint.id;
|
|
27
|
+
// Execute user handler (errors are logged by registry)
|
|
28
|
+
HomebridgeFanControlServer.registry.executeHandler(endpointId, 'fanControl', 'fanModeChange', { fanMode: value, oldFanMode: oldValue }).catch(() => {
|
|
29
|
+
// Error already logged by registry
|
|
30
|
+
});
|
|
31
|
+
HomebridgeFanControlServer.registry.syncStateToCache(endpointId, 'fanControl', { fanMode: value });
|
|
32
|
+
}
|
|
33
|
+
#handlePercentSettingChange(value, oldValue) {
|
|
34
|
+
const endpointId = this.endpoint.id;
|
|
35
|
+
// Execute user handler (errors are logged by registry)
|
|
36
|
+
HomebridgeFanControlServer.registry.executeHandler(endpointId, 'fanControl', 'percentSettingChange', { percentSetting: value, oldPercentSetting: oldValue }).catch(() => {
|
|
37
|
+
// Error already logged by registry
|
|
38
|
+
});
|
|
39
|
+
HomebridgeFanControlServer.registry.syncStateToCache(endpointId, 'fanControl', {
|
|
40
|
+
percentSetting: value,
|
|
41
|
+
percentCurrent: value,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=FanControlBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FanControlBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/FanControlBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AAErE;;GAEG;AACH,MAAM,OAAO,0BAA2B,SAAQ,gBAAgB;IACtD,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAA0B;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAEQ,UAAU;QACjB,KAAK,CAAC,UAAU,EAAE,CAAA;QAElB,8CAA8C;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAA;QAEpE,oDAAoD;QACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAA;IACpF,CAAC;IAED,oBAAoB,CAAC,KAAa,EAAE,QAAgB;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,0BAA0B,CAAC,QAAQ,CAAC,cAAc,CAChD,UAAU,EACV,YAAY,EACZ,eAAe,EACf,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CACzC,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,0BAA0B,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IACpG,CAAC;IAED,2BAA2B,CAAC,KAAoB,EAAE,QAAuB;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,0BAA0B,CAAC,QAAQ,CAAC,cAAc,CAChD,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,EAAE,cAAc,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CACvD,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,0BAA0B,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE;YAC7E,cAAc,EAAE,KAAK;YACrB,cAAc,EAAE,KAAK;SACtB,CAAC,CAAA;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FanControlBehavior.spec.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/FanControlBehavior.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { HomebridgeFanControlServer } from './FanControlBehavior.js';
|
|
3
|
+
describe('homebridgeFanControlServer', () => {
|
|
4
|
+
describe('setRegistry', () => {
|
|
5
|
+
it('should set the registry', () => {
|
|
6
|
+
const newRegistry = {};
|
|
7
|
+
HomebridgeFanControlServer.setRegistry(newRegistry);
|
|
8
|
+
expect(true).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe('behavior structure', () => {
|
|
12
|
+
it('should extend FanControlServer', () => {
|
|
13
|
+
expect(HomebridgeFanControlServer.prototype).toBeDefined();
|
|
14
|
+
});
|
|
15
|
+
it('should have initialize method', () => {
|
|
16
|
+
expect(typeof HomebridgeFanControlServer.prototype.initialize).toBe('function');
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
// Note: FanControlBehavior uses private methods (#handleFanModeChange, #handlePercentSettingChange)
|
|
21
|
+
// and reactTo() pattern which makes direct unit testing difficult.
|
|
22
|
+
// Integration tests would be more appropriate for testing the event reaction logic.
|
|
23
|
+
//# sourceMappingURL=FanControlBehavior.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FanControlBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/FanControlBehavior.spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAEpE,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,WAAW,GAAG,EAAsB,CAAA;YAC1C,0BAA0B,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;YACnD,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,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,CAAC,OAAO,0BAA0B,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACjF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,oGAAoG;AACpG,mEAAmE;AACnE,oFAAoF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identify Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles identify commands (e.g., flash LED, beep sound)
|
|
5
|
+
*/
|
|
6
|
+
import type { MaybePromise } from '@matter/main';
|
|
7
|
+
import type { Identify } from '@matter/main/clusters';
|
|
8
|
+
import type { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
9
|
+
import { IdentifyServer } from '@matter/main/behaviors/identify';
|
|
10
|
+
/**
|
|
11
|
+
* Custom Identify Server that calls plugin handlers
|
|
12
|
+
*/
|
|
13
|
+
export declare class HomebridgeIdentifyServer extends IdentifyServer {
|
|
14
|
+
private static registry;
|
|
15
|
+
/**
|
|
16
|
+
* Set the behavior registry (called once during server initialization)
|
|
17
|
+
*/
|
|
18
|
+
static setRegistry(registry: BehaviorRegistry): void;
|
|
19
|
+
identify(request: Identify.IdentifyRequest): MaybePromise;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=IdentifyBehavior.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdentifyBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAEhE;;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;IAI3C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,eAAe,GAAG,YAAY;CAUnE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identify Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles identify commands (e.g., flash LED, beep sound)
|
|
5
|
+
*/
|
|
6
|
+
import { IdentifyServer } from '@matter/main/behaviors/identify';
|
|
7
|
+
/**
|
|
8
|
+
* Custom Identify Server that calls plugin handlers
|
|
9
|
+
*/
|
|
10
|
+
export class HomebridgeIdentifyServer extends IdentifyServer {
|
|
11
|
+
static registry;
|
|
12
|
+
/**
|
|
13
|
+
* Set the behavior registry (called once during server initialization)
|
|
14
|
+
*/
|
|
15
|
+
static setRegistry(registry) {
|
|
16
|
+
this.registry = registry;
|
|
17
|
+
}
|
|
18
|
+
identify(request) {
|
|
19
|
+
const endpointId = this.endpoint.id;
|
|
20
|
+
// Execute user handler (errors are logged by registry)
|
|
21
|
+
HomebridgeIdentifyServer.registry.executeHandler(endpointId, 'identify', 'identify', request).catch(() => {
|
|
22
|
+
// Error already logged by registry
|
|
23
|
+
});
|
|
24
|
+
return super.identify(request);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=IdentifyBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdentifyBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAEhE;;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,QAAQ,CAAC,OAAiC;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,wBAAwB,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACvG,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdentifyBehavior.spec.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.spec.ts"],"names":[],"mappings":""}
|