@silizia/homebridge-dioder 0.1.0 → 0.1.2

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/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { gpiochipOpen, txPwm } from "lgpio";
1
+ import lg from "lgpio";
2
2
  import { colord } from "colord";
3
3
  //#region src/DioderAccessory.ts
4
4
  const MIN_PWM = 31.4995 / 8e3;
@@ -18,7 +18,9 @@ var DioderAccessory = class {
18
18
  this.Characteristic = hap.Characteristic;
19
19
  this.log = platform.log;
20
20
  this.config = accessory.context.config;
21
- this.pwm(0, 0, 0);
21
+ lg.gpioClaimOutput(gpiochip, this.config.rPin);
22
+ lg.gpioClaimOutput(gpiochip, this.config.gPin);
23
+ lg.gpioClaimOutput(gpiochip, this.config.bPin);
22
24
  this.hsv = {
23
25
  h: 0,
24
26
  s: 0,
@@ -48,9 +50,9 @@ var DioderAccessory = class {
48
50
  this.log.info("Identify!");
49
51
  }
50
52
  pwm(r, b, g) {
51
- txPwm(this.gpiochip, this.config.rPin, 8e3, r, 0, 0);
52
- txPwm(this.gpiochip, this.config.gPin, 8e3, g, 0, 0);
53
- txPwm(this.gpiochip, this.config.bPin, 8e3, b, 0, 0);
53
+ lg.txPwm(this.gpiochip, this.config.rPin, 8e3, r, 0, 0);
54
+ lg.txPwm(this.gpiochip, this.config.gPin, 8e3, g, 0, 0);
55
+ lg.txPwm(this.gpiochip, this.config.bPin, 8e3, b, 0, 0);
54
56
  }
55
57
  setOn(on) {
56
58
  this.log.info("setOn", on);
@@ -265,6 +267,7 @@ var RainbowAccessory = class extends AnimatedAccessory {
265
267
  };
266
268
  //#endregion
267
269
  //#region src/DioderPlatform.ts
270
+ const PLUGIN_NAME = "@silizia/homebridge-dioder";
268
271
  var DioderPlatform = class {
269
272
  accessories = [];
270
273
  animationCancel = void 0;
@@ -277,7 +280,7 @@ var DioderPlatform = class {
277
280
  this.log.debug("Executed didFinishLaunching callback");
278
281
  let removedAccessories = this.accessories;
279
282
  const dioderAccessories = [];
280
- const gpiochip = gpiochipOpen(0);
283
+ const gpiochip = lg.gpiochipOpen(0);
281
284
  for (const c of this.config.leds || []) {
282
285
  const uuid = this.api.hap.uuid.generate(JSON.stringify(c));
283
286
  const existingAccessory = this.accessories.find((accessory) => accessory.UUID === uuid);
@@ -290,7 +293,7 @@ var DioderPlatform = class {
290
293
  const accessory = new this.api.platformAccessory(c.name, uuid);
291
294
  accessory.context.config = c;
292
295
  dioderAccessories.push(new DioderAccessory(this, accessory, gpiochip));
293
- this.api.registerPlatformAccessories("homebridge-dioder", "Dioder", [accessory]);
296
+ this.api.registerPlatformAccessories(PLUGIN_NAME, "Dioder", [accessory]);
294
297
  }
295
298
  }
296
299
  if (this.config.rainbowAnim?.enabled) {
@@ -304,7 +307,7 @@ var DioderPlatform = class {
304
307
  this.log.info("Adding new accessory: Rainbow Effect");
305
308
  const accessory = new this.api.platformAccessory("Rainbow Effect", uuid);
306
309
  new RainbowAccessory(this, accessory, dioderAccessories);
307
- this.api.registerPlatformAccessories("homebridge-dioder", "Dioder", [accessory]);
310
+ this.api.registerPlatformAccessories(PLUGIN_NAME, "Dioder", [accessory]);
308
311
  }
309
312
  }
310
313
  for (const c of this.config.gradientAnim || []) {
@@ -319,12 +322,12 @@ var DioderPlatform = class {
319
322
  const accessory = new this.api.platformAccessory(c.name, uuid);
320
323
  accessory.context.config = c;
321
324
  new GradientAccessory(this, accessory, dioderAccessories);
322
- this.api.registerPlatformAccessories("homebridge-dioder", "Dioder", [accessory]);
325
+ this.api.registerPlatformAccessories(PLUGIN_NAME, "Dioder", [accessory]);
323
326
  }
324
327
  }
325
328
  if (removedAccessories.length > 0) {
326
329
  this.log.warn("removing unused accessories", removedAccessories.map((a) => a.displayName));
327
- this.api.unregisterPlatformAccessories("homebridge-dioder", "Dioder", removedAccessories);
330
+ this.api.unregisterPlatformAccessories(PLUGIN_NAME, "Dioder", removedAccessories);
328
331
  }
329
332
  });
330
333
  }
@@ -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 { txPwm } from 'lgpio';\n\nimport type DioderPlatform from './DioderPlatform';\nimport type { DioderContext, LedConfig } from './DioderPlatform';\n\nconst MIN_PWM = 31.4995 / 8000; // min pwm to get actually light from dioder, depends on PWM_RANGE\nconst GAMMA_COR = 2.8;\n\nexport default class DioderAccessory {\n private readonly 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 this.pwm(0, 0, 0);\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(1, 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, b: number, g: number): void {\n txPwm(this.gpiochip, this.config.rPin, 8000, r, 0, 0);\n txPwm(this.gpiochip, this.config.gPin, 8000, g, 0, 0);\n txPwm(this.gpiochip, this.config.bPin, 8000, b, 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 }\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.log.info('setSaturation', s);\n this.hsv.s = s as number;\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(\n Math.round((r / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM),\n Math.round((g / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM),\n Math.round((b / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM)\n );\n if (!t) this.log.info(`set ${this.accessory.displayName} RGB to ${r}, ${g}, ${b}`);\n } else {\n this.log.warn('Skipping color change while light bulb being off');\n }\n }\n\n getHSV(): HsvColor {\n return this.hsv;\n }\n\n setRGB(r: number, g: number, b: number): void {\n this.pwm(\n Math.round((r / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM),\n Math.round((g / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM),\n Math.round((b / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM)\n );\n }\n\n turnOff(): void {\n this.pwm(0, 0, 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 { gpiochipOpen } 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\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 = 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('homebridge-dioder', '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('homebridge-dioder', '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('homebridge-dioder', '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('homebridge-dioder', '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 = 31.4995 / 8000; // min pwm to get actually light from dioder, depends on PWM_RANGE\nconst GAMMA_COR = 2.8;\n\nexport default class DioderAccessory {\n private readonly 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(1, 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, b: number, g: number): void {\n lg.txPwm(this.gpiochip, this.config.rPin, 8000, r, 0, 0);\n lg.txPwm(this.gpiochip, this.config.gPin, 8000, g, 0, 0);\n lg.txPwm(this.gpiochip, this.config.bPin, 8000, b, 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 }\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.log.info('setSaturation', s);\n this.hsv.s = s as number;\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(\n Math.round((r / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM),\n Math.round((g / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM),\n Math.round((b / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM)\n );\n if (!t) this.log.info(`set ${this.accessory.displayName} RGB to ${r}, ${g}, ${b}`);\n } else {\n this.log.warn('Skipping color change while light bulb being off');\n }\n }\n\n getHSV(): HsvColor {\n return this.hsv;\n }\n\n setRGB(r: number, g: number, b: number): void {\n this.pwm(\n Math.round((r / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM),\n Math.round((g / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM),\n Math.round((b / 255) ** GAMMA_COR * (1 - MIN_PWM) + MIN_PWM)\n );\n }\n\n turnOff(): void {\n this.pwm(0, 0, 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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@silizia/homebridge-dioder",
3
3
  "displayName": "Homebridge Dioder",
4
- "version": "0.1.0",
4
+ "version": "0.1.2",
5
5
  "description": "Homebridge plugin to control Dioder LED strips over pigpio pins",
6
6
  "keywords": [
7
7
  "homebridge-plugin"
@@ -20,7 +20,7 @@
20
20
  "config.schema.json"
21
21
  ],
22
22
  "type": "module",
23
- "main": "dist/index.js",
23
+ "main": "dist/index.mjs",
24
24
  "types": "dist/index.d.ts",
25
25
  "scripts": {
26
26
  "prepare": "npm run build",