homebridge-nanoleaf-multi 3.0.0 → 4.0.0

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.
Files changed (121) hide show
  1. package/README.md +0 -10
  2. package/dist/Device.js +108 -0
  3. package/dist/Device.js.map +1 -0
  4. package/dist/Effect.d.ts +1 -5
  5. package/dist/Effect.js +51 -0
  6. package/dist/Effect.js.map +1 -0
  7. package/dist/RandomEffect.d.ts +2 -5
  8. package/dist/RandomEffect.js +39 -0
  9. package/dist/RandomEffect.js.map +1 -0
  10. package/dist/SolidEffect.d.ts +4 -6
  11. package/dist/SolidEffect.js +29 -0
  12. package/dist/SolidEffect.js.map +1 -0
  13. package/dist/WaveEffect.d.ts +2 -5
  14. package/dist/WaveEffect.js +48 -0
  15. package/dist/WaveEffect.js.map +1 -0
  16. package/dist/Zone.d.ts +1 -1
  17. package/dist/Zone.js +153 -0
  18. package/dist/Zone.js.map +1 -0
  19. package/dist/accessories/ZoneAccessory.js +56 -0
  20. package/dist/accessories/ZoneAccessory.js.map +1 -0
  21. package/dist/accessories/index.d.ts +0 -1
  22. package/dist/accessories/index.js +18 -0
  23. package/dist/accessories/index.js.map +1 -0
  24. package/dist/constants.js +36 -0
  25. package/dist/constants.js.map +1 -0
  26. package/dist/index.js +11 -2
  27. package/dist/index.js.map +1 -0
  28. package/dist/platformFactory.d.ts +2 -3
  29. package/dist/platformFactory.js +61 -0
  30. package/dist/platformFactory.js.map +1 -0
  31. package/dist/types/Context.js +3 -0
  32. package/dist/types/Context.js.map +1 -0
  33. package/dist/types/PlatformConfiguration.js +3 -0
  34. package/dist/types/PlatformConfiguration.js.map +1 -0
  35. package/dist/types/devices/DeviceConfiguration.js +3 -0
  36. package/dist/types/devices/DeviceConfiguration.js.map +1 -0
  37. package/dist/types/devices/ZoneConfiguration.js +3 -0
  38. package/dist/types/devices/ZoneConfiguration.js.map +1 -0
  39. package/dist/types/devices/index.js +19 -0
  40. package/dist/types/devices/index.js.map +1 -0
  41. package/dist/types/effects/EffectConfiguration.js +3 -0
  42. package/dist/types/effects/EffectConfiguration.js.map +1 -0
  43. package/dist/types/effects/EffectConfigurationBase.js +3 -0
  44. package/dist/types/effects/EffectConfigurationBase.js.map +1 -0
  45. package/dist/types/effects/EffectType.js +10 -0
  46. package/dist/types/effects/EffectType.js.map +1 -0
  47. package/dist/types/effects/ProbabilisticColorConfiguration.d.ts +5 -0
  48. package/dist/types/effects/ProbabilisticColorConfiguration.js +3 -0
  49. package/dist/types/effects/ProbabilisticColorConfiguration.js.map +1 -0
  50. package/dist/types/effects/index.d.ts +1 -6
  51. package/dist/types/effects/index.js +25 -0
  52. package/dist/types/effects/index.js.map +1 -0
  53. package/dist/types/effects/native/NativeDirection.js +11 -0
  54. package/dist/types/effects/native/NativeDirection.js.map +1 -0
  55. package/dist/types/effects/native/NativeEffect.js +3 -0
  56. package/dist/types/effects/native/NativeEffect.js.map +1 -0
  57. package/dist/types/effects/native/NativeEffectColor.js +3 -0
  58. package/dist/types/effects/native/NativeEffectColor.js.map +1 -0
  59. package/dist/types/effects/native/NativeEffectOption.js +3 -0
  60. package/dist/types/effects/native/NativeEffectOption.js.map +1 -0
  61. package/dist/types/effects/native/NativeEffectType.js +13 -0
  62. package/dist/types/effects/native/NativeEffectType.js.map +1 -0
  63. package/dist/types/effects/native/index.js +22 -0
  64. package/dist/types/effects/native/index.js.map +1 -0
  65. package/dist/types/effects/random-effect/RandomEffectConfiguration.d.ts +2 -2
  66. package/dist/types/effects/random-effect/RandomEffectConfiguration.js +3 -0
  67. package/dist/types/effects/random-effect/RandomEffectConfiguration.js.map +1 -0
  68. package/dist/types/effects/random-effect/index.js +18 -0
  69. package/dist/types/effects/random-effect/index.js.map +1 -0
  70. package/dist/types/effects/solid-effect/SolidEffectConfiguration.d.ts +2 -2
  71. package/dist/types/effects/solid-effect/SolidEffectConfiguration.js +3 -0
  72. package/dist/types/effects/solid-effect/SolidEffectConfiguration.js.map +1 -0
  73. package/dist/types/effects/solid-effect/index.d.ts +0 -1
  74. package/dist/types/effects/solid-effect/index.js +18 -0
  75. package/dist/types/effects/solid-effect/index.js.map +1 -0
  76. package/dist/types/effects/wave-effect/WaveEffectConfiguration.d.ts +2 -3
  77. package/dist/types/effects/wave-effect/WaveEffectConfiguration.js +3 -0
  78. package/dist/types/effects/wave-effect/WaveEffectConfiguration.js.map +1 -0
  79. package/dist/types/effects/wave-effect/index.js +18 -0
  80. package/dist/types/effects/wave-effect/index.js.map +1 -0
  81. package/dist/types/index.js +21 -0
  82. package/dist/types/index.js.map +1 -0
  83. package/dist/utilities/colorToNanoleafColor.js +15 -0
  84. package/dist/utilities/colorToNanoleafColor.js.map +1 -0
  85. package/dist/utilities/index.js +19 -0
  86. package/dist/utilities/index.js.map +1 -0
  87. package/dist/utilities/nativeEffectTypeToPluginUuid.js +7 -0
  88. package/dist/utilities/nativeEffectTypeToPluginUuid.js.map +1 -0
  89. package/package.json +14 -17
  90. package/src/Effect.ts +8 -43
  91. package/src/RandomEffect.ts +13 -35
  92. package/src/SolidEffect.ts +20 -10
  93. package/src/WaveEffect.ts +13 -32
  94. package/src/accessories/ZoneAccessory.ts +6 -1
  95. package/src/accessories/index.ts +0 -1
  96. package/src/platformFactory.ts +9 -25
  97. package/src/types/effects/ProbabilisticColorConfiguration.ts +6 -0
  98. package/src/types/effects/index.ts +1 -6
  99. package/src/types/effects/random-effect/RandomEffectConfiguration.ts +2 -2
  100. package/src/types/effects/solid-effect/SolidEffectConfiguration.ts +2 -2
  101. package/src/types/effects/solid-effect/index.ts +0 -1
  102. package/src/types/effects/wave-effect/WaveEffectConfiguration.ts +3 -3
  103. package/tsconfig.json +0 -1
  104. package/dist/accessories/DynamicEffectColorAccessory.d.ts +0 -5
  105. package/dist/index.js.LICENSE.txt +0 -4
  106. package/dist/types/effects/ConstantEffectColorConfiguration.d.ts +0 -3
  107. package/dist/types/effects/DynamicEffectColorConfiguration.d.ts +0 -5
  108. package/dist/types/effects/EffectColorConfiguration.d.ts +0 -4
  109. package/dist/types/effects/EffectColorConfigurationBase.d.ts +0 -3
  110. package/dist/types/effects/EffectColorType.d.ts +0 -5
  111. package/dist/types/effects/RemoteEffectColorConfiguration.d.ts +0 -3
  112. package/dist/types/effects/solid-effect/SolidEffectColorConfiguration.d.ts +0 -2
  113. package/src/accessories/DynamicEffectColorAccessory.ts +0 -19
  114. package/src/types/effects/ConstantEffectColorConfiguration.ts +0 -7
  115. package/src/types/effects/DynamicEffectColorConfiguration.ts +0 -10
  116. package/src/types/effects/EffectColorConfiguration.ts +0 -8
  117. package/src/types/effects/EffectColorConfigurationBase.ts +0 -3
  118. package/src/types/effects/EffectColorType.ts +0 -7
  119. package/src/types/effects/RemoteEffectColorConfiguration.ts +0 -7
  120. package/src/types/effects/solid-effect/SolidEffectColorConfiguration.ts +0 -8
  121. package/webpack.config.js +0 -42
package/README.md CHANGED
@@ -1,11 +1 @@
1
1
  ## Homebridge Nanoleaf Multi
2
-
3
- ## Development
4
-
5
- ```shell
6
- rsync -rv \
7
- --exclude .git \
8
- --exclude node_modules \
9
- . \
10
- sam@local.mangane.se:/home/sam/homebridge-development/volumes/homebridge/node_modules/homebridge-nanoleaf-multi
11
- ```
package/dist/Device.js ADDED
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.Device = void 0;
16
+ const rwlock_1 = __importDefault(require("rwlock"));
17
+ const core_kit_node_1 = require("@manganese/core-kit-node");
18
+ const nanoleaf_client_multi_1 = require("nanoleaf-client-multi");
19
+ const constants_1 = require("./constants");
20
+ class Device {
21
+ constructor(configuration, context) {
22
+ this.configuration = configuration;
23
+ this.context = context;
24
+ this.initialized = false;
25
+ this.lock = new rwlock_1.default();
26
+ }
27
+ get name() {
28
+ return this.configuration.name;
29
+ }
30
+ get size() {
31
+ return this.configuration.size || constants_1.DEFAULT_DEVICE_SIZE;
32
+ }
33
+ initialize() {
34
+ return __awaiter(this, void 0, void 0, function* () {
35
+ this.context.log.debug(`Initializing <${this.name}>...`);
36
+ const ip = yield (0, core_kit_node_1.lookupHost)(this.configuration.host);
37
+ this.context.log.debug(`Initializing <${this.name}> at IP ${ip}...`);
38
+ if (this.configuration.token) {
39
+ this.context.log.debug(`Initializing <${this.name}> with configured token...`);
40
+ this.nanoleafClient = new nanoleaf_client_multi_1.NanoleafClient(ip, this.configuration.token);
41
+ }
42
+ else {
43
+ this.context.log.warn(`Device <${this.name}> has no token configured, press and hold the power button on it for 5 seconds to authorize it and then copy the token into the plugin configuration!`);
44
+ const nanoleafClient = new nanoleaf_client_multi_1.NanoleafClient(ip);
45
+ let token = null;
46
+ while (!token) {
47
+ this.context.log.debug(`Requesting token from <${this.name}>...`);
48
+ try {
49
+ token = yield nanoleafClient.authorize();
50
+ }
51
+ catch (error) {
52
+ this.context.log.debug(`No token was authorized from <${this.name}>, will try again in 10 seconds`);
53
+ }
54
+ yield new Promise((resolve, reject) => setTimeout(resolve, 10 * 1000));
55
+ }
56
+ this.nanoleafClient = new nanoleaf_client_multi_1.NanoleafClient(ip, token);
57
+ this.context.log.warn(`Device <${this.name}> authorized a new token. Copy this into your configuration to avoid re-authorizing when the plugin restarts!`);
58
+ this.context.log.info(`Token for device <${this.name}>: ${token}`);
59
+ this.context.log.debug(`Initializing <${this.name}> with manually authorized token...`);
60
+ }
61
+ const deviceInfo = yield this.nanoleafClient.getInfo();
62
+ this.context.log.info(`Initialized <${this.name}>`);
63
+ this.initialized = true;
64
+ });
65
+ }
66
+ withWriteLock(callback) {
67
+ return __awaiter(this, void 0, void 0, function* () {
68
+ if (!this.initialized) {
69
+ return Promise.reject('Device is not initialized');
70
+ }
71
+ yield this.lock.writeLock((release) => __awaiter(this, void 0, void 0, function* () {
72
+ try {
73
+ yield callback();
74
+ }
75
+ catch (error) {
76
+ this.context.log.error('Error while holding write lock', error);
77
+ }
78
+ finally {
79
+ release();
80
+ }
81
+ }));
82
+ });
83
+ }
84
+ setActive(active) {
85
+ return __awaiter(this, void 0, void 0, function* () {
86
+ yield this.withWriteLock(() => __awaiter(this, void 0, void 0, function* () {
87
+ yield this.nanoleafClient.power(active);
88
+ }));
89
+ });
90
+ }
91
+ setActiveEffect(effect) {
92
+ return __awaiter(this, void 0, void 0, function* () {
93
+ yield this.withWriteLock(() => __awaiter(this, void 0, void 0, function* () {
94
+ const nativeEffect = effect.getNativeEffectForDevice(this);
95
+ yield this.nanoleafClient.addEffect(nativeEffect);
96
+ }));
97
+ });
98
+ }
99
+ addNativeEffect(nativeEffect) {
100
+ return __awaiter(this, void 0, void 0, function* () {
101
+ yield this.withWriteLock(() => __awaiter(this, void 0, void 0, function* () {
102
+ yield this.nanoleafClient.addEffect(nativeEffect);
103
+ }));
104
+ });
105
+ }
106
+ }
107
+ exports.Device = Device;
108
+ //# sourceMappingURL=Device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Device.js","sourceRoot":"","sources":["../src/Device.ts"],"names":[],"mappings":"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"}
package/dist/Effect.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import { ColorHSV } from '@manganese/palette-kit-core';
3
3
  import EventEmitter from 'events';
4
- import { Context, EffectConfigurationBase, NativeEffect, ConstantEffectColorConfiguration, DynamicEffectColorConfiguration, RemoteEffectColorConfiguration } from './types';
4
+ import { Context, EffectConfigurationBase, NativeEffect } from './types';
5
5
  import { Device } from './Device';
6
6
  export declare abstract class Effect<EffectConfigurationType extends EffectConfigurationBase> extends EventEmitter {
7
7
  protected readonly configuration: EffectConfigurationType;
@@ -15,9 +15,5 @@ export declare abstract class Effect<EffectConfigurationType extends EffectConfi
15
15
  get autoOffDuration(): number;
16
16
  protected handleChange(): void;
17
17
  abstract getNativeEffectForDevice(device: Device): NativeEffect;
18
- abstract getColors(): Array<ConstantEffectColorConfiguration | DynamicEffectColorConfiguration | RemoteEffectColorConfiguration>;
19
18
  abstract setColor(colorId: string, color: ColorHSV): any;
20
- getDynamicColors(): DynamicEffectColorConfiguration[];
21
- getRemoteColors(): RemoteEffectColorConfiguration[];
22
- hasColor(colorId: string): boolean;
23
19
  }
package/dist/Effect.js ADDED
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.Effect = void 0;
16
+ const events_1 = __importDefault(require("events"));
17
+ const constants_1 = require("./constants");
18
+ class Effect extends events_1.default {
19
+ constructor(configuration, context) {
20
+ super();
21
+ this.configuration = configuration;
22
+ this.context = context;
23
+ }
24
+ initialize() {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ this.context.palette.onAnyColorChange(({ colorId, colorHsv }) => {
27
+ this.setColor(colorId, colorHsv);
28
+ });
29
+ });
30
+ }
31
+ get id() {
32
+ return this.configuration.id;
33
+ }
34
+ get name() {
35
+ return this.configuration.name;
36
+ }
37
+ get nativeEffectBase() {
38
+ return {
39
+ animName: this.configuration.nativeName || constants_1.DEFAULT_NATIVE_EFFECT_NAME,
40
+ };
41
+ }
42
+ get autoOffDuration() {
43
+ var _a;
44
+ return (_a = this.configuration.autoOffDuration) !== null && _a !== void 0 ? _a : null;
45
+ }
46
+ handleChange() {
47
+ this.emit(constants_1.EFFECT_CHANGE_EVENT);
48
+ }
49
+ }
50
+ exports.Effect = Effect;
51
+ //# sourceMappingURL=Effect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Effect.js","sourceRoot":"","sources":["../src/Effect.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,oDAAkC;AAElC,2CAA8E;AAG9E,MAAsB,MAEpB,SAAQ,gBAAY;IAGpB,YACqB,aAAsC,EACtC,OAAgB;QAEnC,KAAK,EAAE,CAAC;QAHW,kBAAa,GAAb,aAAa,CAAyB;QACtC,YAAO,GAAP,OAAO,CAAS;IAGrC,CAAC;IAEY,UAAU;;YACrB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAC9D,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;IAED,IAAW,EAAE;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;IAC/B,CAAC;IAED,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,IAAc,gBAAgB;QAC5B,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,IAAI,sCAA0B;SACtE,CAAC;IACJ,CAAC;IAED,IAAW,eAAe;;QACxB,OAAO,MAAA,IAAI,CAAC,aAAa,CAAC,eAAe,mCAAI,IAAI,CAAC;IACpD,CAAC;IAES,YAAY;QACpB,IAAI,CAAC,IAAI,CAAC,+BAAmB,CAAC,CAAC;IACjC,CAAC;CAKF;AA3CD,wBA2CC"}
@@ -1,12 +1,9 @@
1
1
  import { ColorHSV } from '@manganese/palette-kit-core';
2
- import { Context, RandomEffectConfiguration, EffectColorConfiguration, NativeEffectOption } from './types';
2
+ import { Context, RandomEffectConfiguration, NativeEffectOption } from './types';
3
3
  import { Effect } from './Effect';
4
4
  import { Device } from './Device';
5
5
  export declare class RandomEffect extends Effect<RandomEffectConfiguration> {
6
- private colors;
7
6
  constructor(configuration: RandomEffectConfiguration, context: Context);
8
- initialize(): Promise<void>;
9
- private getColor;
10
7
  getNativeEffectForDevice(_device: Device): {
11
8
  pluginUuid: string;
12
9
  pluginOptions: NativeEffectOption[];
@@ -18,6 +15,6 @@ export declare class RandomEffect extends Effect<RandomEffectConfiguration> {
18
15
  pluginType: "color";
19
16
  hasOverlay: false;
20
17
  };
21
- getColors(): EffectColorConfiguration[];
18
+ private hasColor;
22
19
  setColor(colorId: string, color: ColorHSV): void;
23
20
  }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RandomEffect = void 0;
4
+ const palette_kit_core_1 = require("@manganese/palette-kit-core");
5
+ const types_1 = require("./types");
6
+ const constants_1 = require("./constants");
7
+ const utilities_1 = require("./utilities");
8
+ const Effect_1 = require("./Effect");
9
+ class RandomEffect extends Effect_1.Effect {
10
+ constructor(configuration, context) {
11
+ super(configuration, context);
12
+ }
13
+ getNativeEffectForDevice(_device) {
14
+ return Object.assign(Object.assign(Object.assign({}, constants_1.NATIVE_EFFECT_BASE), this.nativeEffectBase), { pluginUuid: (0, utilities_1.nativeEffectTypeToPluginUuid)(types_1.NativeEffectType.Random), pluginOptions: [
15
+ {
16
+ name: 'delayTime',
17
+ value: this.configuration.delayTime,
18
+ },
19
+ {
20
+ name: 'transTime',
21
+ value: this.configuration.transitionTime,
22
+ },
23
+ ], palette: this.configuration.colors.map((colorConfiguration) => {
24
+ const color = this.context.palette.resolveColor(colorConfiguration.color);
25
+ return (0, utilities_1.colorToNanoleafColor)(color, colorConfiguration.probability);
26
+ }) });
27
+ }
28
+ hasColor(colorId) {
29
+ return this.configuration.colors.some((colorConfiguration) => colorConfiguration.color.type === palette_kit_core_1.ColorType.Dynamic &&
30
+ colorConfiguration.color.id === colorId);
31
+ }
32
+ setColor(colorId, color) {
33
+ if (!this.hasColor(colorId))
34
+ return;
35
+ this.handleChange();
36
+ }
37
+ }
38
+ exports.RandomEffect = RandomEffect;
39
+ //# sourceMappingURL=RandomEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RandomEffect.js","sourceRoot":"","sources":["../src/RandomEffect.ts"],"names":[],"mappings":";;;AAAA,kEAAkE;AAClE,mCAKiB;AACjB,2CAAiD;AACjD,2CAGqB;AACrB,qCAAkC;AAGlC,MAAa,YAAa,SAAQ,eAAiC;IACjE,YAAY,aAAwC,EAAE,OAAgB;QACpE,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAEM,wBAAwB,CAAC,OAAe;QAC7C,qDACK,8BAAkB,GAClB,IAAI,CAAC,gBAAgB,KACxB,UAAU,EAAE,IAAA,wCAA4B,EAAC,wBAAgB,CAAC,MAAM,CAAC,EACjE,aAAa,EAAE;gBACb;oBACE,IAAI,EAAE,WAAW;oBACjB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS;iBACd;gBACvB;oBACE,IAAI,EAAE,WAAW;oBACjB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,cAAc;iBACnB;aACxB,EACD,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,kBAAkB,EAAE,EAAE;gBAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAC7C,kBAAkB,CAAC,KAAK,CACzB,CAAC;gBAEF,OAAO,IAAA,gCAAoB,EAAC,KAAK,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACrE,CAAC,CAAC,IACF;IACJ,CAAC;IAEO,QAAQ,CAAC,OAAe;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CACnC,CAAC,kBAAkB,EAAE,EAAE,CACrB,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,4BAAS,CAAC,OAAO;YACnD,kBAAkB,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAC1C,CAAC;IACJ,CAAC;IAEe,QAAQ,CAAC,OAAe,EAAE,KAAe;QACvD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO;QAEpC,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;CACF;AA3CD,oCA2CC"}
@@ -3,20 +3,18 @@ import { Context, SolidEffectConfiguration } from './types';
3
3
  import { Effect } from './Effect';
4
4
  import { Device } from './Device';
5
5
  export declare class SolidEffect extends Effect<SolidEffectConfiguration> {
6
- private color;
7
6
  constructor(configuration: SolidEffectConfiguration, context: Context);
8
- initialize(): Promise<void>;
9
7
  getNativeEffectForDevice(_device: Device): {
8
+ pluginUuid: string;
9
+ palette: import("./types").NativeEffectColor[];
10
10
  version: "2.0";
11
11
  animName: string;
12
12
  animType: "plugin";
13
13
  colorType: "HSB";
14
- palette: import("./types").NativeEffectColor[];
15
14
  pluginType: "color";
16
- pluginUuid: string;
17
15
  pluginOptions: import("./types").NativeEffectOption[];
18
16
  hasOverlay: false;
19
17
  };
20
- getColors(): import("./types").SolidEffectColorConfiguration[];
21
- setColor(_colorId: string, color: ColorHSV): void;
18
+ private hasColor;
19
+ setColor(colorId: string, color: ColorHSV): void;
22
20
  }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SolidEffect = void 0;
4
+ const palette_kit_core_1 = require("@manganese/palette-kit-core");
5
+ const types_1 = require("./types");
6
+ const constants_1 = require("./constants");
7
+ const utilities_1 = require("./utilities");
8
+ const Effect_1 = require("./Effect");
9
+ class SolidEffect extends Effect_1.Effect {
10
+ constructor(configuration, context) {
11
+ super(configuration, context);
12
+ }
13
+ getNativeEffectForDevice(_device) {
14
+ const color = this.context.palette.resolveColor(this.configuration.color);
15
+ return Object.assign(Object.assign(Object.assign({}, constants_1.NATIVE_EFFECT_BASE), this.nativeEffectBase), { pluginUuid: (0, utilities_1.nativeEffectTypeToPluginUuid)(types_1.NativeEffectType.Random), palette: [(0, utilities_1.colorToNanoleafColor)(color, 1)] });
16
+ }
17
+ hasColor(colorId) {
18
+ const colorConfiguration = this.configuration.color;
19
+ return (colorConfiguration.type === palette_kit_core_1.ColorType.Dynamic &&
20
+ colorConfiguration.id === colorId);
21
+ }
22
+ setColor(colorId, color) {
23
+ if (!this.hasColor(colorId))
24
+ return;
25
+ this.handleChange();
26
+ }
27
+ }
28
+ exports.SolidEffect = SolidEffect;
29
+ //# sourceMappingURL=SolidEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SolidEffect.js","sourceRoot":"","sources":["../src/SolidEffect.ts"],"names":[],"mappings":";;;AAAA,kEAAkE;AAElE,mCAA8E;AAC9E,2CAAiD;AACjD,2CAGqB;AACrB,qCAAkC;AAGlC,MAAa,WAAY,SAAQ,eAAgC;IAC/D,YAAY,aAAuC,EAAE,OAAgB;QACnE,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAEM,wBAAwB,CAAC,OAAe;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAE1E,qDACK,8BAAkB,GAClB,IAAI,CAAC,gBAAgB,KACxB,UAAU,EAAE,IAAA,wCAA4B,EAAC,wBAAgB,CAAC,MAAM,CAAC,EACjE,OAAO,EAAE,CAAC,IAAA,gCAAoB,EAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IACzC;IACJ,CAAC;IAEO,QAAQ,CAAC,OAAe;QAC9B,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAEpD,OAAO,CACL,kBAAkB,CAAC,IAAI,KAAK,4BAAS,CAAC,OAAO;YAC7C,kBAAkB,CAAC,EAAE,KAAK,OAAO,CAClC,CAAC;IACJ,CAAC;IAEe,QAAQ,CAAC,OAAe,EAAE,KAAe;QACvD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO;QAEpC,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;CACF;AA9BD,kCA8BC"}
@@ -1,12 +1,9 @@
1
1
  import { ColorHSV } from '@manganese/palette-kit-core';
2
- import { Context, WaveEffectConfiguration, EffectColorConfiguration, NativeEffectOption } from './types';
2
+ import { Context, WaveEffectConfiguration, NativeEffectOption } from './types';
3
3
  import { Effect } from './Effect';
4
4
  import { Device } from './Device';
5
5
  export declare class WaveEffect extends Effect<WaveEffectConfiguration> {
6
- private colors;
7
6
  constructor(configuration: WaveEffectConfiguration, context: Context);
8
- initialize(): Promise<void>;
9
- private getColor;
10
7
  getNativeEffectForDevice(device: Device): {
11
8
  pluginUuid: string;
12
9
  pluginOptions: NativeEffectOption[];
@@ -18,6 +15,6 @@ export declare class WaveEffect extends Effect<WaveEffectConfiguration> {
18
15
  pluginType: "color";
19
16
  hasOverlay: false;
20
17
  };
21
- getColors(): EffectColorConfiguration[];
18
+ private hasColor;
22
19
  setColor(colorId: string, color: ColorHSV): void;
23
20
  }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WaveEffect = void 0;
4
+ const palette_kit_core_1 = require("@manganese/palette-kit-core");
5
+ const types_1 = require("./types");
6
+ const constants_1 = require("./constants");
7
+ const utilities_1 = require("./utilities");
8
+ const Effect_1 = require("./Effect");
9
+ class WaveEffect extends Effect_1.Effect {
10
+ constructor(configuration, context) {
11
+ super(configuration, context);
12
+ }
13
+ getNativeEffectForDevice(device) {
14
+ const colorsPerFrame = 1 + Math.ceil(device.size / this.configuration.colorSize);
15
+ return Object.assign(Object.assign(Object.assign({}, constants_1.NATIVE_EFFECT_BASE), this.nativeEffectBase), { pluginUuid: (0, utilities_1.nativeEffectTypeToPluginUuid)(types_1.NativeEffectType.Wheel), pluginOptions: [
16
+ {
17
+ name: 'linDirection',
18
+ value: this.configuration.direction,
19
+ },
20
+ {
21
+ name: 'loop',
22
+ value: true,
23
+ },
24
+ {
25
+ name: 'nColorsPerFrame',
26
+ value: colorsPerFrame,
27
+ },
28
+ {
29
+ name: 'transTime',
30
+ value: this.configuration.transitionTime / colorsPerFrame,
31
+ },
32
+ ], palette: this.configuration.colors.map((colorConfiguration) => {
33
+ const color = this.context.palette.resolveColor(colorConfiguration.color);
34
+ return (0, utilities_1.colorToNanoleafColor)(color, colorConfiguration.probability);
35
+ }) });
36
+ }
37
+ hasColor(colorId) {
38
+ return this.configuration.colors.some((colorConfiguration) => colorConfiguration.color.type === palette_kit_core_1.ColorType.Dynamic &&
39
+ colorConfiguration.color.id === colorId);
40
+ }
41
+ setColor(colorId, color) {
42
+ if (!this.hasColor(colorId))
43
+ return;
44
+ this.handleChange();
45
+ }
46
+ }
47
+ exports.WaveEffect = WaveEffect;
48
+ //# sourceMappingURL=WaveEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaveEffect.js","sourceRoot":"","sources":["../src/WaveEffect.ts"],"names":[],"mappings":";;;AAAA,kEAKqC;AAErC,mCAKiB;AACjB,2CAA2E;AAC3E,2CAGqB;AACrB,qCAAkC;AAGlC,MAAa,UAAW,SAAQ,eAA+B;IAC7D,YAAY,aAAsC,EAAE,OAAgB;QAClE,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAEM,wBAAwB,CAAC,MAAc;QAC5C,MAAM,cAAc,GAClB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAE5D,qDACK,8BAAkB,GAClB,IAAI,CAAC,gBAAgB,KACxB,UAAU,EAAE,IAAA,wCAA4B,EAAC,wBAAgB,CAAC,KAAK,CAAC,EAChE,aAAa,EAAE;gBACb;oBACE,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS;iBACd;gBACvB;oBACE,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,IAAI;iBACU;gBACvB;oBACE,IAAI,EAAE,iBAAiB;oBACvB,KAAK,EAAE,cAAc;iBACA;gBACvB;oBACE,IAAI,EAAE,WAAW;oBACjB,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,cAAc,GAAG,cAAc;iBACpC;aACxB,EACD,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,kBAAkB,EAAE,EAAE;gBAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAC7C,kBAAkB,CAAC,KAAK,CACzB,CAAC;gBAEF,OAAO,IAAA,gCAAoB,EAAC,KAAK,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;YACrE,CAAC,CAAC,IACF;IACJ,CAAC;IAEO,QAAQ,CAAC,OAAe;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CACnC,CAAC,kBAAkB,EAAE,EAAE,CACrB,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,4BAAS,CAAC,OAAO;YACnD,kBAAkB,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAC1C,CAAC;IACJ,CAAC;IAEe,QAAQ,CAAC,OAAe,EAAE,KAAe;QACvD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO;QAEpC,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;CACF;AAtDD,gCAsDC"}
package/dist/Zone.d.ts CHANGED
@@ -11,7 +11,7 @@ export declare class Zone extends EventEmitter {
11
11
  constructor(configuration: ZoneConfiguration, context: Context);
12
12
  get name(): string;
13
13
  get id(): string;
14
- createEffect(configuration: EffectConfiguration): SolidEffect | WaveEffect | RandomEffect;
14
+ createEffect(configuration: EffectConfiguration): RandomEffect | SolidEffect | WaveEffect;
15
15
  initialize(): Promise<void>;
16
16
  private devices;
17
17
  private get devicesArray();
package/dist/Zone.js ADDED
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.Zone = void 0;
16
+ const events_1 = __importDefault(require("events"));
17
+ const types_1 = require("./types");
18
+ const constants_1 = require("./constants");
19
+ const Device_1 = require("./Device");
20
+ const SolidEffect_1 = require("./SolidEffect");
21
+ const WaveEffect_1 = require("./WaveEffect");
22
+ const RandomEffect_1 = require("./RandomEffect");
23
+ class Zone extends events_1.default {
24
+ constructor(configuration, context) {
25
+ var _a;
26
+ super();
27
+ // Devices
28
+ this.devices = new Set();
29
+ // Effects
30
+ this.effects = new Map();
31
+ this.configuration = configuration;
32
+ this.context = context;
33
+ configuration.devices.forEach((deviceConfiguration) => {
34
+ if (deviceConfiguration.disabled) {
35
+ this.context.log.info('Ignoring device with diabled configuration');
36
+ return;
37
+ }
38
+ const device = new Device_1.Device(deviceConfiguration, context);
39
+ this.devices.add(device);
40
+ });
41
+ (_a = this.configuration.effects) === null || _a === void 0 ? void 0 : _a.forEach((effectConfiguration) => {
42
+ const effect = this.createEffect(effectConfiguration);
43
+ effect.on(constants_1.EFFECT_CHANGE_EVENT, () => {
44
+ if (this.activeEffectId !== effect.id)
45
+ return;
46
+ // TODO log
47
+ this.setActiveEffect(effect);
48
+ });
49
+ this.effects.set(effect.id, effect);
50
+ });
51
+ }
52
+ get name() {
53
+ return this.configuration.name;
54
+ }
55
+ get id() {
56
+ return this.configuration.id;
57
+ }
58
+ createEffect(configuration) {
59
+ switch (configuration.type) {
60
+ case types_1.EffectType.Solid:
61
+ return new SolidEffect_1.SolidEffect(configuration, this.context);
62
+ case types_1.EffectType.Wave:
63
+ return new WaveEffect_1.WaveEffect(configuration, this.context);
64
+ case types_1.EffectType.Random:
65
+ return new RandomEffect_1.RandomEffect(configuration, this.context);
66
+ }
67
+ }
68
+ // Initialization
69
+ initialize() {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ yield Promise.all(this.devicesArray.map((device) => __awaiter(this, void 0, void 0, function* () {
72
+ try {
73
+ yield device.initialize();
74
+ }
75
+ catch (error) {
76
+ this.context.log.error(`Failed to initialize device <${device.name}>`, error);
77
+ }
78
+ })));
79
+ });
80
+ }
81
+ get devicesArray() {
82
+ return Array.from(this.devices);
83
+ }
84
+ setActive(active) {
85
+ return __awaiter(this, void 0, void 0, function* () {
86
+ if (!active) {
87
+ this.clearAutoOffTimeout();
88
+ }
89
+ yield Promise.all(this.devicesArray.map((device) => __awaiter(this, void 0, void 0, function* () {
90
+ yield device.setActive(active);
91
+ })));
92
+ const { activeEffect } = this;
93
+ if (active && !!activeEffect) {
94
+ yield this.setActiveEffect(activeEffect);
95
+ }
96
+ });
97
+ }
98
+ getEffects() {
99
+ return this.effects;
100
+ }
101
+ getEffect(effectId) {
102
+ const effect = this.effects.get(effectId);
103
+ return effect || null;
104
+ }
105
+ get activeEffect() {
106
+ return this.getEffect(this.activeEffectId);
107
+ }
108
+ getDefaultActiveEffectId() {
109
+ if (this.effects.size === 0) {
110
+ return null;
111
+ }
112
+ return Array.from(this.effects.values())[0].id;
113
+ }
114
+ setActiveEffectById(effectId) {
115
+ return __awaiter(this, void 0, void 0, function* () {
116
+ this.activeEffectId = effectId;
117
+ yield this.setActiveEffect(this.activeEffect);
118
+ });
119
+ }
120
+ setActiveEffect(effect) {
121
+ return __awaiter(this, void 0, void 0, function* () {
122
+ this.clearAutoOffTimeout();
123
+ yield Promise.all(Array.from(this.devices).map((device) => {
124
+ return device.setActiveEffect(effect);
125
+ }));
126
+ if (effect.autoOffDuration) {
127
+ this.setAutoOffTimeout(effect.autoOffDuration);
128
+ }
129
+ });
130
+ }
131
+ getActiveEffectId() {
132
+ return this.activeEffectId;
133
+ }
134
+ setAutoOffTimeout(duration) {
135
+ this.autoOffTimeout = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
136
+ try {
137
+ yield this.setActive(false);
138
+ this.emit(constants_1.ZONE_AUTO_OFF_EVENT);
139
+ this.context.log.info('Set zone auto-off');
140
+ }
141
+ catch (error) {
142
+ this.context.log.error('Error setting zone auto-off', error);
143
+ }
144
+ }), duration);
145
+ }
146
+ clearAutoOffTimeout() {
147
+ if (this.autoOffTimeout) {
148
+ clearTimeout(this.autoOffTimeout);
149
+ }
150
+ }
151
+ }
152
+ exports.Zone = Zone;
153
+ //# sourceMappingURL=Zone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Zone.js","sourceRoot":"","sources":["../src/Zone.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ZoneAccessory = void 0;
13
+ const helpers_for_homebridge_1 = require("helpers-for-homebridge");
14
+ class ZoneAccessory extends helpers_for_homebridge_1.SelectionAccessory {
15
+ constructor(zone, context) {
16
+ super({
17
+ name: zone.name,
18
+ serial: zone.id,
19
+ model: 'Nanoleaf Multi Zone',
20
+ options: zone.configuration.effects.map((effectConfiguration) => {
21
+ return {
22
+ name: effectConfiguration.name,
23
+ id: effectConfiguration.id,
24
+ hapIdentifier: effectConfiguration.hapIdentifier,
25
+ };
26
+ }),
27
+ }, context);
28
+ this.zone = zone;
29
+ this.active = false;
30
+ this.activeOptionId = this.configuration.options[0].id;
31
+ }
32
+ getActiveOptionId() {
33
+ return __awaiter(this, void 0, void 0, function* () {
34
+ return this.activeOptionId;
35
+ });
36
+ }
37
+ setActiveOptionId(effectId) {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ this.activeOptionId = effectId;
40
+ yield this.zone.setActiveEffectById(effectId);
41
+ });
42
+ }
43
+ getActive() {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ return this.active;
46
+ });
47
+ }
48
+ setActive(active) {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ this.active = active;
51
+ yield this.zone.setActive(active);
52
+ });
53
+ }
54
+ }
55
+ exports.ZoneAccessory = ZoneAccessory;
56
+ //# sourceMappingURL=ZoneAccessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZoneAccessory.js","sourceRoot":"","sources":["../../src/accessories/ZoneAccessory.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mEAA4D;AAI5D,MAAa,aAAc,SAAQ,2CAAkB;IACnD,YACmB,IAAU,EAC3B,OAAgB;QAEhB,KAAK,CACH;YACE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,KAAK,EAAE,qBAAqB;YAC5B,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,mBAAmB,EAAE,EAAE;gBAC9D,OAAO;oBACL,IAAI,EAAE,mBAAmB,CAAC,IAAI;oBAC9B,EAAE,EAAE,mBAAmB,CAAC,EAAE;oBAC1B,aAAa,EAAE,mBAAmB,CAAC,aAAa;iBACjD,CAAC;YACJ,CAAC,CAAC;SACH,EACD,OAAO,CACR,CAAC;QAjBe,SAAI,GAAJ,IAAI,CAAM;QAsBrB,WAAM,GAAY,KAAK,CAAC;QAH9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,CAAC;IAKwB,iBAAiB;;YACxC,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;KAAA;IAEwB,iBAAiB,CAAC,QAAgB;;YACzD,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;YAE/B,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;KAAA;IAEwB,SAAS;;YAChC,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;KAAA;IAEwB,SAAS,CAAC,MAAe;;YAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YAErB,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;KAAA;CACF;AA9CD,sCA8CC"}
@@ -1,2 +1 @@
1
- export * from './DynamicEffectColorAccessory';
2
1
  export * from './ZoneAccessory';