@silizia/homebridge-dioder 0.1.5 → 0.1.7
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/config.schema.json +2 -1
- package/dist/index.mjs +16 -41
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/config.schema.json
CHANGED
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
"name": { "title": "Name", "type": "string", "required": true },
|
|
16
16
|
"rPin": { "title": "rPin", "type": "integer", "required": true },
|
|
17
17
|
"gPin": { "title": "gPin", "type": "integer", "required": true },
|
|
18
|
-
"bPin": { "title": "bPin", "type": "integer", "required": true }
|
|
18
|
+
"bPin": { "title": "bPin", "type": "integer", "required": true },
|
|
19
|
+
"freq": { "title": "freq", "type": "integer", "default": 10000, "minimum": 1, "maximum": 10000 }
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
},
|
package/dist/index.mjs
CHANGED
|
@@ -33,9 +33,9 @@ var DioderAccessory = class {
|
|
|
33
33
|
this.LEDservice = this.accessory.getService(hap.Service.Lightbulb) || this.accessory.addService(hap.Service.Lightbulb);
|
|
34
34
|
this.LEDservice.setCharacteristic(this.Characteristic.Name, this.config.name);
|
|
35
35
|
this.LEDservice.getCharacteristic(this.Characteristic.On).onGet(this.getOn.bind(this)).onSet(this.setOn.bind(this));
|
|
36
|
-
this.LEDservice.getCharacteristic(this.Characteristic.Brightness).
|
|
37
|
-
this.LEDservice.getCharacteristic(this.Characteristic.Hue).
|
|
38
|
-
this.LEDservice.getCharacteristic(this.Characteristic.Saturation).
|
|
36
|
+
this.LEDservice.getCharacteristic(this.Characteristic.Brightness).onSet(this.setBrightness.bind(this));
|
|
37
|
+
this.LEDservice.getCharacteristic(this.Characteristic.Hue).onSet(this.setHue.bind(this));
|
|
38
|
+
this.LEDservice.getCharacteristic(this.Characteristic.Saturation).onSet(this.setSaturation.bind(this));
|
|
39
39
|
}
|
|
40
40
|
identify() {
|
|
41
41
|
this.pwm(0, 0, 0);
|
|
@@ -43,7 +43,7 @@ var DioderAccessory = class {
|
|
|
43
43
|
this.pwm(255, 0, 0);
|
|
44
44
|
setTimeout(() => {
|
|
45
45
|
this.pwm(0, 0, 0);
|
|
46
|
-
if (this.
|
|
46
|
+
if (this.hsv.v > 0) setTimeout(() => {
|
|
47
47
|
this.setHSV(this.hsv);
|
|
48
48
|
}, 1e3);
|
|
49
49
|
}, 3e3);
|
|
@@ -51,16 +51,16 @@ var DioderAccessory = class {
|
|
|
51
51
|
this.log.info("Identify!");
|
|
52
52
|
}
|
|
53
53
|
pwm(r, g, b) {
|
|
54
|
-
lg.txPwm(this.gpiochip, this.config.rPin, PWM_FREQUENCY, r === 0 ? 0 : (r / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);
|
|
55
|
-
lg.txPwm(this.gpiochip, this.config.gPin, PWM_FREQUENCY, g === 0 ? 0 : (g / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);
|
|
56
|
-
lg.txPwm(this.gpiochip, this.config.bPin, PWM_FREQUENCY, b === 0 ? 0 : (b / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);
|
|
54
|
+
lg.txPwm(this.gpiochip, this.config.rPin, this.config.freq ?? PWM_FREQUENCY, r === 0 ? 0 : (r / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);
|
|
55
|
+
lg.txPwm(this.gpiochip, this.config.gPin, this.config.freq ?? PWM_FREQUENCY, g === 0 ? 0 : (g / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);
|
|
56
|
+
lg.txPwm(this.gpiochip, this.config.bPin, this.config.freq ?? PWM_FREQUENCY, b === 0 ? 0 : (b / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);
|
|
57
57
|
}
|
|
58
58
|
setOn(on) {
|
|
59
59
|
this.log.info("setOn", on);
|
|
60
60
|
this.on = on;
|
|
61
61
|
if (on) {
|
|
62
62
|
this.platform.stopAnimation();
|
|
63
|
-
if (this.
|
|
63
|
+
if (this.hsv.v === 0) {
|
|
64
64
|
this.hsv.v = 100;
|
|
65
65
|
this.LEDservice.setCharacteristic(this.Characteristic.Brightness, 100);
|
|
66
66
|
} else this.setHSV(this.hsv);
|
|
@@ -75,34 +75,25 @@ var DioderAccessory = class {
|
|
|
75
75
|
}
|
|
76
76
|
getOn() {
|
|
77
77
|
if (this.platform.isAnimationRunning()) return false;
|
|
78
|
-
return this.
|
|
78
|
+
return this.hsv.v > 0;
|
|
79
79
|
}
|
|
80
80
|
setBrightness(v) {
|
|
81
81
|
this.log.info("setBrightness", v);
|
|
82
82
|
this.hsv.v = v;
|
|
83
83
|
this.setHSV(this.hsv);
|
|
84
84
|
}
|
|
85
|
-
getBrightness() {
|
|
86
|
-
return this.hsv.v;
|
|
87
|
-
}
|
|
88
85
|
setHue(h) {
|
|
89
86
|
this.log.info("setHue", h);
|
|
90
87
|
this.hsv.h = h;
|
|
91
88
|
this.setHSV(this.hsv);
|
|
92
89
|
}
|
|
93
|
-
getHue() {
|
|
94
|
-
return this.hsv.h;
|
|
95
|
-
}
|
|
96
90
|
setSaturation(s) {
|
|
97
91
|
this.hsv.s = s;
|
|
98
92
|
this.log.info("setSaturation", s, this.hsv.s);
|
|
99
93
|
this.setHSV(this.hsv);
|
|
100
94
|
}
|
|
101
|
-
getSaturation() {
|
|
102
|
-
return this.hsv.s;
|
|
103
|
-
}
|
|
104
95
|
setHSV(c, t) {
|
|
105
|
-
if (t || this.on && this.
|
|
96
|
+
if (t || this.on && this.hsv.v > 0) {
|
|
106
97
|
const { r, g, b } = colord(c).toRgb();
|
|
107
98
|
this.pwm(r, g, b);
|
|
108
99
|
if (!t) this.log.info(`set ${this.accessory.displayName} r: ${r}, g: ${g}, b: ${b} or h: ${c.h}, s: ${c.s}, v: ${c.v}`);
|
|
@@ -112,14 +103,6 @@ var DioderAccessory = class {
|
|
|
112
103
|
getHSV() {
|
|
113
104
|
return this.hsv;
|
|
114
105
|
}
|
|
115
|
-
setRGB(r, g, b) {
|
|
116
|
-
this.pwm(r, g, b);
|
|
117
|
-
this.hsv = colord({
|
|
118
|
-
r,
|
|
119
|
-
g,
|
|
120
|
-
b
|
|
121
|
-
}).toHsv();
|
|
122
|
-
}
|
|
123
106
|
turnOff() {
|
|
124
107
|
this.pwm(0, 0, 0);
|
|
125
108
|
this.hsv = {
|
|
@@ -261,7 +244,7 @@ var GradientAccessory = class extends AnimatedAccessory {
|
|
|
261
244
|
const r = this.colors[prevColor].r * (1 - prog) + this.colors[nextColor].r * prog;
|
|
262
245
|
const g = this.colors[prevColor].g * (1 - prog) + this.colors[nextColor].g * prog;
|
|
263
246
|
const b = this.colors[prevColor].b * (1 - prog) + this.colors[nextColor].b * prog;
|
|
264
|
-
this.leds[i].
|
|
247
|
+
this.leds[i].pwm(r * this.brightness / 100, g * this.brightness / 100, b * this.brightness / 100);
|
|
265
248
|
}
|
|
266
249
|
this.currentStep = (this.currentStep + this.speed * len / 360) % len;
|
|
267
250
|
}
|
|
@@ -288,7 +271,7 @@ var RainbowAccessory = class extends AnimatedAccessory {
|
|
|
288
271
|
//#region src/DioderPlatform.ts
|
|
289
272
|
const PLUGIN_NAME = "@silizia/homebridge-dioder";
|
|
290
273
|
var DioderPlatform = class {
|
|
291
|
-
accessories =
|
|
274
|
+
accessories = /* @__PURE__ */ new Map();
|
|
292
275
|
animationCancel = void 0;
|
|
293
276
|
constructor(log, config, api) {
|
|
294
277
|
this.log = log;
|
|
@@ -297,14 +280,12 @@ var DioderPlatform = class {
|
|
|
297
280
|
this.log.debug("Finished initializing platform: Dioder");
|
|
298
281
|
this.api.on("didFinishLaunching", () => {
|
|
299
282
|
this.log.debug("Executed didFinishLaunching callback");
|
|
300
|
-
let removedAccessories = this.accessories;
|
|
301
283
|
const dioderAccessories = [];
|
|
302
284
|
const gpiochip = lg.gpiochipOpen(0);
|
|
303
285
|
for (const c of this.config.leds || []) {
|
|
304
286
|
const uuid = this.api.hap.uuid.generate(JSON.stringify(c));
|
|
305
|
-
const existingAccessory = this.accessories.
|
|
287
|
+
const existingAccessory = this.accessories.get(uuid);
|
|
306
288
|
if (existingAccessory) {
|
|
307
|
-
removedAccessories = removedAccessories.filter((accessory) => accessory.UUID !== uuid);
|
|
308
289
|
this.log.info("Restoring existing accessory from cache:", existingAccessory.displayName);
|
|
309
290
|
dioderAccessories.push(new DioderAccessory(this, existingAccessory, gpiochip));
|
|
310
291
|
} else {
|
|
@@ -317,9 +298,8 @@ var DioderPlatform = class {
|
|
|
317
298
|
}
|
|
318
299
|
if (this.config.rainbowAnim?.enabled) {
|
|
319
300
|
const uuid = this.api.hap.uuid.generate("Rainbow Effect");
|
|
320
|
-
const existingAccessory = this.accessories.
|
|
301
|
+
const existingAccessory = this.accessories.get(uuid);
|
|
321
302
|
if (existingAccessory) {
|
|
322
|
-
removedAccessories = removedAccessories.filter((accessory) => accessory.UUID !== uuid);
|
|
323
303
|
this.log.info("Restoring existing accessory from cache:", existingAccessory.displayName);
|
|
324
304
|
new RainbowAccessory(this, existingAccessory, dioderAccessories);
|
|
325
305
|
} else {
|
|
@@ -331,9 +311,8 @@ var DioderPlatform = class {
|
|
|
331
311
|
}
|
|
332
312
|
for (const c of this.config.gradientAnim || []) {
|
|
333
313
|
const uuid = this.api.hap.uuid.generate(JSON.stringify(c));
|
|
334
|
-
const existingAccessory = this.accessories.
|
|
314
|
+
const existingAccessory = this.accessories.get(uuid);
|
|
335
315
|
if (existingAccessory) {
|
|
336
|
-
removedAccessories = removedAccessories.filter((accessory) => accessory.UUID !== uuid);
|
|
337
316
|
this.log.info("Restoring existing accessory from cache:", existingAccessory.displayName);
|
|
338
317
|
new GradientAccessory(this, existingAccessory, dioderAccessories);
|
|
339
318
|
} else {
|
|
@@ -344,15 +323,11 @@ var DioderPlatform = class {
|
|
|
344
323
|
this.api.registerPlatformAccessories(PLUGIN_NAME, "Dioder", [accessory]);
|
|
345
324
|
}
|
|
346
325
|
}
|
|
347
|
-
if (removedAccessories.length > 0) {
|
|
348
|
-
this.log.warn("removing unused accessories", removedAccessories.map((a) => a.displayName));
|
|
349
|
-
this.api.unregisterPlatformAccessories(PLUGIN_NAME, "Dioder", removedAccessories);
|
|
350
|
-
}
|
|
351
326
|
});
|
|
352
327
|
}
|
|
353
328
|
configureAccessory(accessory) {
|
|
354
329
|
this.log.info("Loading accessory from cache:", accessory.displayName);
|
|
355
|
-
this.accessories.
|
|
330
|
+
this.accessories.set(accessory.UUID, accessory);
|
|
356
331
|
}
|
|
357
332
|
setAnimationCancel(callback) {
|
|
358
333
|
if (this.animationCancel !== void 0) this.animationCancel();
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/DioderAccessory.ts","../src/AnimatedAccessory.ts","../src/GradientAccessory.ts","../src/RainbowAccessory.ts","../src/DioderPlatform.ts","../src/index.ts"],"sourcesContent":["import { colord, type HsvColor } from 'colord';\nimport type { CharacteristicValue, PlatformAccessory, Service, Logging } from 'homebridge';\nimport lg from 'lgpio';\n\nimport type DioderPlatform from './DioderPlatform';\nimport type { DioderContext, LedConfig } from './DioderPlatform';\n\nconst MIN_PWM = 0.5; // min pwm to get actually light from dioder, depends on PWM_RANGE\nconst PWM_FREQUENCY = 10000;\nconst GAMMA_COR = 2.8;\n\nexport default class DioderAccessory {\n private hsv: HsvColor;\n private on: boolean;\n\n private readonly LEDservice: Service;\n private readonly Characteristic;\n private readonly log: Logging;\n private readonly config: LedConfig;\n\n constructor(\n private readonly platform: DioderPlatform,\n private readonly accessory: PlatformAccessory<DioderContext>,\n private readonly gpiochip: number\n ) {\n const { hap } = platform.api;\n this.Characteristic = hap.Characteristic;\n this.log = platform.log;\n\n this.config = accessory.context.config;\n lg.gpioClaimOutput(gpiochip, this.config.rPin);\n lg.gpioClaimOutput(gpiochip, this.config.gPin);\n lg.gpioClaimOutput(gpiochip, this.config.bPin);\n this.hsv = { h: 0, s: 0, v: 0 };\n this.on = false;\n\n this.accessory\n .getService(hap.Service.AccessoryInformation)\n ?.setCharacteristic(this.Characteristic.Manufacturer, 'Silizia')\n .setCharacteristic(this.Characteristic.Model, 'Fancy LED')\n .setCharacteristic(this.Characteristic.SerialNumber, '42');\n\n this.accessory.on('identify', () => this.identify());\n\n this.LEDservice = this.accessory.getService(hap.Service.Lightbulb) || this.accessory.addService(hap.Service.Lightbulb);\n this.LEDservice.setCharacteristic(this.Characteristic.Name, this.config.name);\n\n this.LEDservice.getCharacteristic(this.Characteristic.On).onGet(this.getOn.bind(this)).onSet(this.setOn.bind(this));\n this.LEDservice.getCharacteristic(this.Characteristic.Brightness).onGet(this.getBrightness.bind(this)).onSet(this.setBrightness.bind(this));\n this.LEDservice.getCharacteristic(this.Characteristic.Hue).onGet(this.getHue.bind(this)).onSet(this.setHue.bind(this));\n this.LEDservice.getCharacteristic(this.Characteristic.Saturation).onGet(this.getSaturation.bind(this)).onSet(this.setSaturation.bind(this));\n }\n\n identify(): void {\n this.pwm(0, 0, 0);\n setTimeout(() => {\n this.pwm(255, 0, 0);\n setTimeout(() => {\n this.pwm(0, 0, 0);\n if (this.getBrightness() > 0) {\n setTimeout(() => {\n this.setHSV(this.hsv);\n }, 1000);\n }\n }, 3000);\n }, 1000);\n this.log.info('Identify!');\n }\n\n pwm(r: number, g: number, b: number): void {\n lg.txPwm(this.gpiochip, this.config.rPin, PWM_FREQUENCY, r === 0 ? 0 : (r / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);\n lg.txPwm(this.gpiochip, this.config.gPin, PWM_FREQUENCY, g === 0 ? 0 : (g / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);\n lg.txPwm(this.gpiochip, this.config.bPin, PWM_FREQUENCY, b === 0 ? 0 : (b / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);\n }\n\n setOn(on: CharacteristicValue): void {\n this.log.info('setOn', on);\n this.on = on as boolean;\n if (on) {\n this.platform.stopAnimation();\n if (this.getBrightness() === 0) {\n this.hsv.v = 100;\n this.LEDservice.setCharacteristic(this.Characteristic.Brightness, 100);\n } else {\n this.setHSV(this.hsv);\n }\n } else {\n this.pwm(0, 0, 0);\n this.hsv = { h: 0, s: 0, v: 0 };\n }\n }\n\n getOn(): boolean {\n if (this.platform.isAnimationRunning()) return false;\n return this.getBrightness() > 0;\n }\n\n setBrightness(v: CharacteristicValue): void {\n this.log.info('setBrightness', v);\n this.hsv.v = v as number;\n this.setHSV(this.hsv);\n }\n\n getBrightness(): number {\n return this.hsv.v;\n }\n\n setHue(h: CharacteristicValue): void {\n this.log.info('setHue', h);\n this.hsv.h = h as number;\n this.setHSV(this.hsv);\n }\n\n getHue(): number {\n return this.hsv.h;\n }\n\n setSaturation(s: CharacteristicValue): void {\n this.hsv.s = s as number;\n this.log.info('setSaturation', s, this.hsv.s);\n this.setHSV(this.hsv);\n }\n\n getSaturation(): number {\n return this.hsv.s;\n }\n\n setHSV(c: HsvColor, t?: boolean): void {\n if (t || (this.on && this.getBrightness() > 0)) {\n const { r, g, b } = colord(c).toRgb();\n this.pwm(r, g, b);\n if (!t) this.log.info(`set ${this.accessory.displayName} r: ${r}, g: ${g}, b: ${b} or h: ${c.h}, s: ${c.s}, v: ${c.v}`);\n } else {\n this.log.warn('Skipping color change while light bulb being off');\n }\n this.hsv = c;\n }\n\n getHSV(): HsvColor {\n return this.hsv;\n }\n\n setRGB(r: number, g: number, b: number): void {\n this.pwm(r, g, b);\n this.hsv = colord({ r, g, b }).toHsv();\n }\n\n turnOff(): void {\n this.pwm(0, 0, 0);\n this.hsv = { h: 0, s: 0, v: 0 };\n }\n}\n","import type { PlatformAccessory, CharacteristicValue, Service, Logging } from 'homebridge';\n\nimport type DioderAccessory from './DioderAccessory';\nimport type DioderPlatform from './DioderPlatform';\n\nconst INTERVAL = 1000 / 30; // 30 FPS\nconst SPEED = 100; // 1..100 => 0.01..1\nconst OFFSET_CT = 5; // 140..500 => 28..100\n\nexport default class AnimatedAccessory {\n public brightness: number;\n public offset: number;\n public speed: number;\n private on: boolean;\n private onS: boolean;\n private interval: NodeJS.Timeout | undefined;\n\n private readonly LEDservice: Service;\n private readonly FanService: Service;\n private readonly Characteristic;\n public readonly log: Logging;\n\n constructor(\n private readonly platform: DioderPlatform,\n private readonly accessory: PlatformAccessory,\n public readonly leds: DioderAccessory[],\n name: string\n ) {\n const { hap } = this.platform.api;\n this.Characteristic = hap.Characteristic;\n this.log = this.platform.log;\n\n this.on = false;\n this.onS = false;\n this.brightness = 0;\n this.offset = 50;\n this.speed = 0.5;\n this.interval = undefined;\n\n this.accessory\n .getService(hap.Service.AccessoryInformation)\n ?.setCharacteristic(this.Characteristic.Manufacturer, 'Silizia')\n .setCharacteristic(this.Characteristic.Model, 'Fancy LED')\n .setCharacteristic(this.Characteristic.SerialNumber, '42');\n\n this.accessory.on('identify', () => this.identify());\n\n this.LEDservice = this.accessory.getService(hap.Service.Lightbulb) || this.accessory.addService(hap.Service.Lightbulb);\n this.LEDservice.setCharacteristic(this.Characteristic.Name, name);\n this.LEDservice.getCharacteristic(this.Characteristic.On).onGet(this.getOn.bind(this)).onSet(this.setOn.bind(this));\n this.LEDservice.getCharacteristic(this.Characteristic.Brightness).onGet(this.getBrightness.bind(this)).onSet(this.setBrightness.bind(this));\n this.LEDservice.getCharacteristic(this.Characteristic.ColorTemperature)\n .onGet(this.getColorTemperature.bind(this))\n .onSet(this.setColorTemperature.bind(this));\n\n this.FanService = this.accessory.getService(hap.Service.Fan) || this.accessory.addService(hap.Service.Fan);\n this.FanService.setCharacteristic(this.Characteristic.Name, `${name} Speed`);\n this.FanService.getCharacteristic(this.Characteristic.On).onGet(this.getOnS.bind(this)).onSet(this.setOnS.bind(this));\n this.FanService.getCharacteristic(this.Characteristic.RotationSpeed).onGet(this.getSpeed.bind(this)).onSet(this.setSpeed.bind(this));\n }\n\n identify(): void {\n this.log.info('Identify!');\n }\n\n setOn(on: CharacteristicValue): void {\n this.log.info(`rainbow setOn`, on);\n this.on = on as boolean;\n if (on) {\n if (this.getBrightness() === 0) {\n this.LEDservice.setCharacteristic(this.Characteristic.Brightness, 100);\n }\n this.FanService.updateCharacteristic(this.Characteristic.On, true);\n this.onS = true;\n if (this.getSpeed() === 0) {\n this.FanService.setCharacteristic(this.Characteristic.RotationSpeed, 50);\n }\n this.interval = setInterval(() => this.runAnimation(), INTERVAL);\n this.platform.setAnimationCancel(this.cancelAnimation.bind(this));\n } else {\n this.FanService.updateCharacteristic(this.Characteristic.On, false);\n this.onS = false;\n clearInterval(this.interval);\n this.interval = undefined;\n for (const led of this.leds) led.turnOff();\n }\n }\n\n getOn(): boolean {\n return this.on;\n }\n\n setOnS(on: CharacteristicValue): void {\n this.log.info('rainbow setOnS', on);\n this.onS = on as boolean;\n if (on) {\n if (this.getSpeed() === 0) {\n this.FanService.setCharacteristic(this.Characteristic.RotationSpeed, 50);\n }\n this.interval = setInterval(() => this.runAnimation(), INTERVAL);\n this.LEDservice.updateCharacteristic(this.Characteristic.On, true);\n this.on = true;\n if (this.getBrightness() === 0) {\n this.LEDservice.setCharacteristic(this.Characteristic.Brightness, 100);\n }\n this.platform.setAnimationCancel(this.cancelAnimation.bind(this));\n } else {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n getOnS(): boolean {\n return this.onS; // interval running\n }\n\n setBrightness(v: CharacteristicValue): void {\n this.log.info('rainbow setBrightness', v);\n this.brightness = v as number;\n }\n\n getBrightness(): number {\n return this.brightness;\n }\n\n setColorTemperature(v: CharacteristicValue): void {\n this.log.info('rainbow setColorTemperature', v);\n this.offset = (v as number) / OFFSET_CT;\n }\n\n getColorTemperature(): number {\n return this.offset * OFFSET_CT;\n }\n\n setSpeed(v: CharacteristicValue): void {\n this.log.info('rainbow speed', v);\n this.speed = (v as number) / SPEED;\n }\n\n getSpeed(): number {\n return this.speed * SPEED;\n }\n\n // oxlint-disable-next-line class-methods-use-this, no-empty-function\n runAnimation(): void {}\n\n cancelAnimation(): void {\n clearInterval(this.interval);\n this.interval = undefined;\n this.LEDservice.updateCharacteristic(this.Characteristic.On, false);\n this.FanService.updateCharacteristic(this.Characteristic.On, false);\n }\n}\n","import { colord, type RgbColor } from 'colord';\nimport type { PlatformAccessory } from 'homebridge';\n\nimport AnimatedAccessory from './AnimatedAccessory';\nimport type DioderAccessory from './DioderAccessory';\nimport type DioderPlatform from './DioderPlatform';\nimport type { GradiantContext } from './DioderPlatform';\n\nexport default class GradientAccessory extends AnimatedAccessory {\n private currentStep: number;\n private readonly colors: RgbColor[];\n\n constructor(platform: DioderPlatform, accessory: PlatformAccessory<GradiantContext>, leds: DioderAccessory[]) {\n super(platform, accessory, leds, accessory.context.config.name);\n this.currentStep = 0;\n this.colors = accessory.context.config.colors.map((c: string) => colord(c).toRgb());\n }\n\n runAnimation(): void {\n const len = this.leds.length;\n for (let i = 0; i < len; i++) {\n const step = this.currentStep + (i * this.offset) / 50;\n const prevColor = Math.floor(step) % len;\n const nextColor = (prevColor + 1) % len;\n const prog = step % 1;\n const r = this.colors[prevColor].r * (1 - prog) + this.colors[nextColor].r * prog;\n const g = this.colors[prevColor].g * (1 - prog) + this.colors[nextColor].g * prog;\n const b = this.colors[prevColor].b * (1 - prog) + this.colors[nextColor].b * prog;\n this.leds[i].setRGB((r * this.brightness) / 100, (g * this.brightness) / 100, (b * this.brightness) / 100);\n }\n this.currentStep = (this.currentStep + (this.speed * len) / 360) % len;\n }\n}\n","import type { PlatformAccessory } from 'homebridge';\n\nimport AnimatedAccessory from './AnimatedAccessory';\nimport type DioderAccessory from './DioderAccessory';\nimport type DioderPlatform from './DioderPlatform';\n\nconst SATURATION = 100;\n\nexport default class RainbowAccessory extends AnimatedAccessory {\n private currentHue: number;\n\n constructor(platform: DioderPlatform, accessory: PlatformAccessory, leds: DioderAccessory[]) {\n super(platform, accessory, leds, 'Rainbow Effect');\n this.currentHue = 0;\n }\n\n runAnimation(): void {\n //this.log.warn(`currentHue: ${this.currentHue}, offset: ${this.offset}, speed: ${this.speed}`);\n for (let i = 0; i < this.leds.length; i++) {\n this.leds[i].setHSV({ h: (this.currentHue + i * this.offset) % 360, s: SATURATION, v: this.brightness }, true);\n }\n this.currentHue = (this.currentHue + this.speed) % 360;\n }\n}\n","import type { PlatformAccessory, API, Logging, PlatformConfig, DynamicPlatformPlugin } from 'homebridge';\nimport lg from 'lgpio';\n\nimport DioderAccessory from './DioderAccessory';\nimport GradientAccessory from './GradientAccessory';\nimport RainbowAccessory from './RainbowAccessory';\n\nexport interface LedConfig {\n name: string;\n rPin: number;\n gPin: number;\n bPin: number;\n}\n\ninterface GradiantConfig {\n name: string;\n colors: string[];\n}\n\ninterface DioderConfig extends PlatformConfig {\n leds: LedConfig[];\n gradientAnim: GradiantConfig[];\n rainbowAnim: { enabled: boolean };\n}\n\nexport interface DioderContext {\n config: LedConfig;\n}\n\nexport interface GradiantContext {\n config: GradiantConfig;\n}\n\nconst PLUGIN_NAME = '@silizia/homebridge-dioder';\n\nexport default class DioderPlatform implements DynamicPlatformPlugin {\n public readonly accessories: PlatformAccessory[] = [];\n public animationCancel?: () => void = undefined;\n\n constructor(\n public readonly log: Logging,\n public readonly config: DioderConfig,\n public readonly api: API\n ) {\n this.log.debug('Finished initializing platform: Dioder');\n this.api.on('didFinishLaunching', () => {\n this.log.debug('Executed didFinishLaunching callback');\n let removedAccessories = this.accessories;\n // DioderAccessories\n const dioderAccessories: DioderAccessory[] = [];\n const gpiochip = lg.gpiochipOpen(0);\n for (const c of this.config.leds || []) {\n const uuid = this.api.hap.uuid.generate(JSON.stringify(c));\n const existingAccessory = this.accessories.find(accessory => accessory.UUID === uuid) as PlatformAccessory<DioderContext>;\n if (existingAccessory) {\n removedAccessories = removedAccessories.filter(accessory => accessory.UUID !== uuid);\n this.log.info('Restoring existing accessory from cache:', existingAccessory.displayName);\n dioderAccessories.push(new DioderAccessory(this, existingAccessory, gpiochip));\n } else {\n this.log.info('Adding new accessory:', c.name);\n const accessory = new this.api.platformAccessory<DioderContext>(c.name, uuid);\n accessory.context.config = c;\n dioderAccessories.push(new DioderAccessory(this, accessory, gpiochip));\n this.api.registerPlatformAccessories(PLUGIN_NAME, 'Dioder', [accessory]);\n }\n }\n // RainbowAccessory\n if (this.config.rainbowAnim?.enabled) {\n const uuid = this.api.hap.uuid.generate('Rainbow Effect');\n const existingAccessory = this.accessories.find(accessory => accessory.UUID === uuid);\n if (existingAccessory) {\n removedAccessories = removedAccessories.filter(accessory => accessory.UUID !== uuid);\n this.log.info('Restoring existing accessory from cache:', existingAccessory.displayName);\n // oxlint-disable-next-line no-new\n new RainbowAccessory(this, existingAccessory, dioderAccessories);\n } else {\n this.log.info('Adding new accessory: Rainbow Effect');\n const accessory = new this.api.platformAccessory('Rainbow Effect', uuid);\n // oxlint-disable-next-line no-new\n new RainbowAccessory(this, accessory, dioderAccessories);\n this.api.registerPlatformAccessories(PLUGIN_NAME, 'Dioder', [accessory]);\n }\n }\n // GradientAccessory\n for (const c of this.config.gradientAnim || []) {\n const uuid = this.api.hap.uuid.generate(JSON.stringify(c));\n const existingAccessory = this.accessories.find(accessory => accessory.UUID === uuid) as PlatformAccessory<GradiantContext>;\n if (existingAccessory) {\n removedAccessories = removedAccessories.filter(accessory => accessory.UUID !== uuid);\n this.log.info('Restoring existing accessory from cache:', existingAccessory.displayName);\n // oxlint-disable-next-line no-new\n new GradientAccessory(this, existingAccessory, dioderAccessories);\n } else {\n this.log.info('Adding new gradient accessory:', c.name);\n const accessory = new this.api.platformAccessory<GradiantContext>(c.name, uuid);\n accessory.context.config = c;\n // oxlint-disable-next-line no-new\n new GradientAccessory(this, accessory, dioderAccessories);\n this.api.registerPlatformAccessories(PLUGIN_NAME, 'Dioder', [accessory]);\n }\n }\n // removed unused Accessories\n if (removedAccessories.length > 0) {\n this.log.warn(\n 'removing unused accessories',\n removedAccessories.map(a => a.displayName)\n );\n this.api.unregisterPlatformAccessories(PLUGIN_NAME, 'Dioder', removedAccessories);\n }\n });\n }\n\n configureAccessory(accessory: PlatformAccessory): void {\n this.log.info('Loading accessory from cache:', accessory.displayName);\n this.accessories.push(accessory);\n }\n\n // oxlint-disable-next-line promise/prefer-await-to-callbacks\n setAnimationCancel(callback: () => void): void {\n if (this.animationCancel !== undefined) {\n (this.animationCancel as () => void)();\n }\n this.animationCancel = callback;\n }\n\n isAnimationRunning(): boolean {\n return this.animationCancel !== undefined;\n }\n\n stopAnimation(): void {\n if (this.animationCancel !== undefined) {\n (this.animationCancel as () => void)();\n this.animationCancel = undefined;\n }\n }\n}\n","import type { API } from 'homebridge';\n\nimport DioderPlatform from './DioderPlatform';\n\nexport default function main(api: API): void {\n api.registerPlatform('Dioder', DioderPlatform);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/DioderAccessory.ts","../src/AnimatedAccessory.ts","../src/GradientAccessory.ts","../src/RainbowAccessory.ts","../src/DioderPlatform.ts","../src/index.ts"],"sourcesContent":["import { colord, type HsvColor } from 'colord';\nimport type { CharacteristicValue, PlatformAccessory, Service, Logging } from 'homebridge';\nimport lg from 'lgpio';\n\nimport type DioderPlatform from './DioderPlatform';\nimport type { DioderContext, LedConfig } from './DioderPlatform';\n\nconst MIN_PWM = 0.5; // min pwm to get actually light from dioder, depends on PWM_RANGE\nconst PWM_FREQUENCY = 10000;\nconst GAMMA_COR = 2.8;\n\nexport default class DioderAccessory {\n private hsv: HsvColor;\n private on: boolean;\n\n private readonly LEDservice: Service;\n private readonly Characteristic;\n private readonly log: Logging;\n private readonly config: LedConfig;\n\n constructor(\n private readonly platform: DioderPlatform,\n private readonly accessory: PlatformAccessory<DioderContext>,\n private readonly gpiochip: number\n ) {\n const { hap } = platform.api;\n this.Characteristic = hap.Characteristic;\n this.log = platform.log;\n\n this.config = accessory.context.config;\n lg.gpioClaimOutput(gpiochip, this.config.rPin);\n lg.gpioClaimOutput(gpiochip, this.config.gPin);\n lg.gpioClaimOutput(gpiochip, this.config.bPin);\n this.hsv = { h: 0, s: 0, v: 0 };\n this.on = false;\n\n this.accessory\n .getService(hap.Service.AccessoryInformation)\n ?.setCharacteristic(this.Characteristic.Manufacturer, 'Silizia')\n .setCharacteristic(this.Characteristic.Model, 'Fancy LED')\n .setCharacteristic(this.Characteristic.SerialNumber, '42');\n\n this.accessory.on('identify', () => this.identify());\n\n this.LEDservice = this.accessory.getService(hap.Service.Lightbulb) || this.accessory.addService(hap.Service.Lightbulb);\n this.LEDservice.setCharacteristic(this.Characteristic.Name, this.config.name);\n\n this.LEDservice.getCharacteristic(this.Characteristic.On).onGet(this.getOn.bind(this)).onSet(this.setOn.bind(this));\n this.LEDservice.getCharacteristic(this.Characteristic.Brightness).onSet(this.setBrightness.bind(this));\n this.LEDservice.getCharacteristic(this.Characteristic.Hue).onSet(this.setHue.bind(this));\n this.LEDservice.getCharacteristic(this.Characteristic.Saturation).onSet(this.setSaturation.bind(this));\n }\n\n identify(): void {\n this.pwm(0, 0, 0);\n setTimeout(() => {\n this.pwm(255, 0, 0);\n setTimeout(() => {\n this.pwm(0, 0, 0);\n if (this.hsv.v > 0) {\n setTimeout(() => {\n this.setHSV(this.hsv);\n }, 1000);\n }\n }, 3000);\n }, 1000);\n this.log.info('Identify!');\n }\n\n pwm(r: number, g: number, b: number): void {\n lg.txPwm(this.gpiochip, this.config.rPin, this.config.freq ?? PWM_FREQUENCY, r === 0 ? 0 : (r / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);\n lg.txPwm(this.gpiochip, this.config.gPin, this.config.freq ?? PWM_FREQUENCY, g === 0 ? 0 : (g / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);\n lg.txPwm(this.gpiochip, this.config.bPin, this.config.freq ?? PWM_FREQUENCY, b === 0 ? 0 : (b / 255) ** GAMMA_COR * (100 - MIN_PWM) + MIN_PWM, 0, 0);\n }\n\n setOn(on: CharacteristicValue): void {\n this.log.info('setOn', on);\n this.on = on as boolean;\n if (on) {\n this.platform.stopAnimation();\n if (this.hsv.v === 0) {\n this.hsv.v = 100;\n this.LEDservice.setCharacteristic(this.Characteristic.Brightness, 100);\n } else {\n this.setHSV(this.hsv);\n }\n } else {\n this.pwm(0, 0, 0);\n this.hsv = { h: 0, s: 0, v: 0 };\n }\n }\n\n getOn(): boolean {\n if (this.platform.isAnimationRunning()) return false;\n return this.hsv.v > 0;\n }\n\n setBrightness(v: CharacteristicValue): void {\n this.log.info('setBrightness', v);\n this.hsv.v = v as number;\n this.setHSV(this.hsv);\n }\n\n setHue(h: CharacteristicValue): void {\n this.log.info('setHue', h);\n this.hsv.h = h as number;\n this.setHSV(this.hsv);\n }\n\n setSaturation(s: CharacteristicValue): void {\n this.hsv.s = s as number;\n this.log.info('setSaturation', s, this.hsv.s);\n this.setHSV(this.hsv);\n }\n\n setHSV(c: HsvColor, t?: boolean): void {\n if (t || (this.on && this.hsv.v > 0)) {\n const { r, g, b } = colord(c).toRgb();\n this.pwm(r, g, b);\n if (!t) this.log.info(`set ${this.accessory.displayName} r: ${r}, g: ${g}, b: ${b} or h: ${c.h}, s: ${c.s}, v: ${c.v}`);\n } else {\n this.log.warn('Skipping color change while light bulb being off');\n }\n this.hsv = c;\n }\n\n getHSV(): HsvColor {\n return this.hsv;\n }\n\n turnOff(): void {\n this.pwm(0, 0, 0);\n this.hsv = { h: 0, s: 0, v: 0 };\n }\n}\n","import type { PlatformAccessory, CharacteristicValue, Service, Logging } from 'homebridge';\n\nimport type DioderAccessory from './DioderAccessory';\nimport type DioderPlatform from './DioderPlatform';\n\nconst INTERVAL = 1000 / 30; // 30 FPS\nconst SPEED = 100; // 1..100 => 0.01..1\nconst OFFSET_CT = 5; // 140..500 => 28..100\n\nexport default class AnimatedAccessory {\n public brightness: number;\n public offset: number;\n public speed: number;\n private on: boolean;\n private onS: boolean;\n private interval: NodeJS.Timeout | undefined;\n\n private readonly LEDservice: Service;\n private readonly FanService: Service;\n private readonly Characteristic;\n public readonly log: Logging;\n\n constructor(\n private readonly platform: DioderPlatform,\n private readonly accessory: PlatformAccessory,\n public readonly leds: DioderAccessory[],\n name: string\n ) {\n const { hap } = this.platform.api;\n this.Characteristic = hap.Characteristic;\n this.log = this.platform.log;\n\n this.on = false;\n this.onS = false;\n this.brightness = 0;\n this.offset = 50;\n this.speed = 0.5;\n this.interval = undefined;\n\n this.accessory\n .getService(hap.Service.AccessoryInformation)\n ?.setCharacteristic(this.Characteristic.Manufacturer, 'Silizia')\n .setCharacteristic(this.Characteristic.Model, 'Fancy LED')\n .setCharacteristic(this.Characteristic.SerialNumber, '42');\n\n this.accessory.on('identify', () => this.identify());\n\n this.LEDservice = this.accessory.getService(hap.Service.Lightbulb) || this.accessory.addService(hap.Service.Lightbulb);\n this.LEDservice.setCharacteristic(this.Characteristic.Name, name);\n this.LEDservice.getCharacteristic(this.Characteristic.On).onGet(this.getOn.bind(this)).onSet(this.setOn.bind(this));\n this.LEDservice.getCharacteristic(this.Characteristic.Brightness).onGet(this.getBrightness.bind(this)).onSet(this.setBrightness.bind(this));\n this.LEDservice.getCharacteristic(this.Characteristic.ColorTemperature)\n .onGet(this.getColorTemperature.bind(this))\n .onSet(this.setColorTemperature.bind(this));\n\n this.FanService = this.accessory.getService(hap.Service.Fan) || this.accessory.addService(hap.Service.Fan);\n this.FanService.setCharacteristic(this.Characteristic.Name, `${name} Speed`);\n this.FanService.getCharacteristic(this.Characteristic.On).onGet(this.getOnS.bind(this)).onSet(this.setOnS.bind(this));\n this.FanService.getCharacteristic(this.Characteristic.RotationSpeed).onGet(this.getSpeed.bind(this)).onSet(this.setSpeed.bind(this));\n }\n\n identify(): void {\n this.log.info('Identify!');\n }\n\n setOn(on: CharacteristicValue): void {\n this.log.info(`rainbow setOn`, on);\n this.on = on as boolean;\n if (on) {\n if (this.getBrightness() === 0) {\n this.LEDservice.setCharacteristic(this.Characteristic.Brightness, 100);\n }\n this.FanService.updateCharacteristic(this.Characteristic.On, true);\n this.onS = true;\n if (this.getSpeed() === 0) {\n this.FanService.setCharacteristic(this.Characteristic.RotationSpeed, 50);\n }\n this.interval = setInterval(() => this.runAnimation(), INTERVAL);\n this.platform.setAnimationCancel(this.cancelAnimation.bind(this));\n } else {\n this.FanService.updateCharacteristic(this.Characteristic.On, false);\n this.onS = false;\n clearInterval(this.interval);\n this.interval = undefined;\n for (const led of this.leds) led.turnOff();\n }\n }\n\n getOn(): boolean {\n return this.on;\n }\n\n setOnS(on: CharacteristicValue): void {\n this.log.info('rainbow setOnS', on);\n this.onS = on as boolean;\n if (on) {\n if (this.getSpeed() === 0) {\n this.FanService.setCharacteristic(this.Characteristic.RotationSpeed, 50);\n }\n this.interval = setInterval(() => this.runAnimation(), INTERVAL);\n this.LEDservice.updateCharacteristic(this.Characteristic.On, true);\n this.on = true;\n if (this.getBrightness() === 0) {\n this.LEDservice.setCharacteristic(this.Characteristic.Brightness, 100);\n }\n this.platform.setAnimationCancel(this.cancelAnimation.bind(this));\n } else {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n getOnS(): boolean {\n return this.onS; // interval running\n }\n\n setBrightness(v: CharacteristicValue): void {\n this.log.info('rainbow setBrightness', v);\n this.brightness = v as number;\n }\n\n getBrightness(): number {\n return this.brightness;\n }\n\n setColorTemperature(v: CharacteristicValue): void {\n this.log.info('rainbow setColorTemperature', v);\n this.offset = (v as number) / OFFSET_CT;\n }\n\n getColorTemperature(): number {\n return this.offset * OFFSET_CT;\n }\n\n setSpeed(v: CharacteristicValue): void {\n this.log.info('rainbow speed', v);\n this.speed = (v as number) / SPEED;\n }\n\n getSpeed(): number {\n return this.speed * SPEED;\n }\n\n // oxlint-disable-next-line class-methods-use-this, no-empty-function\n runAnimation(): void {}\n\n cancelAnimation(): void {\n clearInterval(this.interval);\n this.interval = undefined;\n this.LEDservice.updateCharacteristic(this.Characteristic.On, false);\n this.FanService.updateCharacteristic(this.Characteristic.On, false);\n }\n}\n","import { colord, type RgbColor } from 'colord';\nimport type { PlatformAccessory } from 'homebridge';\n\nimport AnimatedAccessory from './AnimatedAccessory';\nimport type DioderAccessory from './DioderAccessory';\nimport type DioderPlatform from './DioderPlatform';\nimport type { GradiantContext } from './DioderPlatform';\n\nexport default class GradientAccessory extends AnimatedAccessory {\n private currentStep: number;\n private readonly colors: RgbColor[];\n\n constructor(platform: DioderPlatform, accessory: PlatformAccessory<GradiantContext>, leds: DioderAccessory[]) {\n super(platform, accessory, leds, accessory.context.config.name);\n this.currentStep = 0;\n this.colors = accessory.context.config.colors.map((c: string) => colord(c).toRgb());\n }\n\n runAnimation(): void {\n const len = this.leds.length;\n for (let i = 0; i < len; i++) {\n const step = this.currentStep + (i * this.offset) / 50;\n const prevColor = Math.floor(step) % len;\n const nextColor = (prevColor + 1) % len;\n const prog = step % 1;\n const r = this.colors[prevColor].r * (1 - prog) + this.colors[nextColor].r * prog;\n const g = this.colors[prevColor].g * (1 - prog) + this.colors[nextColor].g * prog;\n const b = this.colors[prevColor].b * (1 - prog) + this.colors[nextColor].b * prog;\n this.leds[i].pwm((r * this.brightness) / 100, (g * this.brightness) / 100, (b * this.brightness) / 100);\n }\n this.currentStep = (this.currentStep + (this.speed * len) / 360) % len;\n }\n}\n","import type { PlatformAccessory } from 'homebridge';\n\nimport AnimatedAccessory from './AnimatedAccessory';\nimport type DioderAccessory from './DioderAccessory';\nimport type DioderPlatform from './DioderPlatform';\n\nconst SATURATION = 100;\n\nexport default class RainbowAccessory extends AnimatedAccessory {\n private currentHue: number;\n\n constructor(platform: DioderPlatform, accessory: PlatformAccessory, leds: DioderAccessory[]) {\n super(platform, accessory, leds, 'Rainbow Effect');\n this.currentHue = 0;\n }\n\n runAnimation(): void {\n //this.log.warn(`currentHue: ${this.currentHue}, offset: ${this.offset}, speed: ${this.speed}`);\n for (let i = 0; i < this.leds.length; i++) {\n this.leds[i].setHSV({ h: (this.currentHue + i * this.offset) % 360, s: SATURATION, v: this.brightness }, true);\n }\n this.currentHue = (this.currentHue + this.speed) % 360;\n }\n}\n","import type { PlatformAccessory, API, Logging, PlatformConfig, DynamicPlatformPlugin } from 'homebridge';\nimport lg from 'lgpio';\n\nimport DioderAccessory from './DioderAccessory';\nimport GradientAccessory from './GradientAccessory';\nimport RainbowAccessory from './RainbowAccessory';\n\nexport interface LedConfig {\n name: string;\n rPin: number;\n gPin: number;\n bPin: number;\n freq: number;\n}\n\ninterface GradiantConfig {\n name: string;\n colors: string[];\n}\n\ninterface DioderConfig extends PlatformConfig {\n leds: LedConfig[];\n gradientAnim: GradiantConfig[];\n rainbowAnim: { enabled: boolean };\n}\n\nexport interface DioderContext {\n config: LedConfig;\n}\n\nexport interface GradiantContext {\n config: GradiantConfig;\n}\n\nconst PLUGIN_NAME = '@silizia/homebridge-dioder';\n\nexport default class DioderPlatform implements DynamicPlatformPlugin {\n public readonly accessories: Map<string, PlatformAccessory> = new Map();\n public animationCancel?: () => void = undefined;\n\n constructor(\n public readonly log: Logging,\n public readonly config: DioderConfig,\n public readonly api: API\n ) {\n this.log.debug('Finished initializing platform: Dioder');\n this.api.on('didFinishLaunching', () => {\n this.log.debug('Executed didFinishLaunching callback');\n // DioderAccessories\n const dioderAccessories: DioderAccessory[] = [];\n const gpiochip = lg.gpiochipOpen(0);\n for (const c of this.config.leds || []) {\n const uuid = this.api.hap.uuid.generate(JSON.stringify(c));\n const existingAccessory = this.accessories.get(uuid) as PlatformAccessory<DioderContext>;\n if (existingAccessory) {\n this.log.info('Restoring existing accessory from cache:', existingAccessory.displayName);\n dioderAccessories.push(new DioderAccessory(this, existingAccessory, gpiochip));\n } else {\n this.log.info('Adding new accessory:', c.name);\n const accessory = new this.api.platformAccessory<DioderContext>(c.name, uuid);\n accessory.context.config = c;\n dioderAccessories.push(new DioderAccessory(this, accessory, gpiochip));\n this.api.registerPlatformAccessories(PLUGIN_NAME, 'Dioder', [accessory]);\n }\n }\n // RainbowAccessory\n if (this.config.rainbowAnim?.enabled) {\n const uuid = this.api.hap.uuid.generate('Rainbow Effect');\n const existingAccessory = this.accessories.get(uuid);\n if (existingAccessory) {\n this.log.info('Restoring existing accessory from cache:', existingAccessory.displayName);\n // oxlint-disable-next-line no-new\n new RainbowAccessory(this, existingAccessory, dioderAccessories);\n } else {\n this.log.info('Adding new accessory: Rainbow Effect');\n const accessory = new this.api.platformAccessory('Rainbow Effect', uuid);\n // oxlint-disable-next-line no-new\n new RainbowAccessory(this, accessory, dioderAccessories);\n this.api.registerPlatformAccessories(PLUGIN_NAME, 'Dioder', [accessory]);\n }\n }\n // GradientAccessory\n for (const c of this.config.gradientAnim || []) {\n const uuid = this.api.hap.uuid.generate(JSON.stringify(c));\n const existingAccessory = this.accessories.get(uuid) as PlatformAccessory<GradiantContext>;\n if (existingAccessory) {\n this.log.info('Restoring existing accessory from cache:', existingAccessory.displayName);\n // oxlint-disable-next-line no-new\n new GradientAccessory(this, existingAccessory, dioderAccessories);\n } else {\n this.log.info('Adding new gradient accessory:', c.name);\n const accessory = new this.api.platformAccessory<GradiantContext>(c.name, uuid);\n accessory.context.config = c;\n // oxlint-disable-next-line no-new\n new GradientAccessory(this, accessory, dioderAccessories);\n this.api.registerPlatformAccessories(PLUGIN_NAME, 'Dioder', [accessory]);\n }\n }\n });\n }\n\n configureAccessory(accessory: PlatformAccessory): void {\n this.log.info('Loading accessory from cache:', accessory.displayName);\n this.accessories.set(accessory.UUID, accessory);\n }\n\n // oxlint-disable-next-line promise/prefer-await-to-callbacks\n setAnimationCancel(callback: () => void): void {\n if (this.animationCancel !== undefined) {\n (this.animationCancel as () => void)();\n }\n this.animationCancel = callback;\n }\n\n isAnimationRunning(): boolean {\n return this.animationCancel !== undefined;\n }\n\n stopAnimation(): void {\n if (this.animationCancel !== undefined) {\n (this.animationCancel as () => void)();\n this.animationCancel = undefined;\n }\n }\n}\n","import type { API } from 'homebridge';\n\nimport DioderPlatform from './DioderPlatform';\n\nexport default function main(api: API): void {\n api.registerPlatform('Dioder', DioderPlatform);\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED