@ecopoesis/homebridge-dmx 0.5.5 → 0.6.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 (58) hide show
  1. package/CLAUDE.md +1 -0
  2. package/README.md +67 -0
  3. package/config.schema.json +104 -0
  4. package/dist/config.d.ts +5 -0
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +18 -1
  7. package/dist/config.js.map +1 -1
  8. package/dist/controller.d.ts +3 -2
  9. package/dist/controller.d.ts.map +1 -1
  10. package/dist/controller.js +7 -4
  11. package/dist/controller.js.map +1 -1
  12. package/dist/dmxController.d.ts +9 -1
  13. package/dist/dmxController.d.ts.map +1 -1
  14. package/dist/platform.d.ts +1 -0
  15. package/dist/platform.d.ts.map +1 -1
  16. package/dist/platform.js +37 -2
  17. package/dist/platform.js.map +1 -1
  18. package/dist/sacn.d.ts +3 -2
  19. package/dist/sacn.d.ts.map +1 -1
  20. package/dist/sacn.js +7 -4
  21. package/dist/sacn.js.map +1 -1
  22. package/dist/settings.d.ts +13 -0
  23. package/dist/settings.d.ts.map +1 -1
  24. package/dist/settings.js +14 -0
  25. package/dist/settings.js.map +1 -1
  26. package/dist/show/colors.d.ts +25 -0
  27. package/dist/show/colors.d.ts.map +1 -0
  28. package/dist/show/colors.js +216 -0
  29. package/dist/show/colors.js.map +1 -0
  30. package/dist/show/dsl.d.ts +56 -0
  31. package/dist/show/dsl.d.ts.map +1 -0
  32. package/dist/show/dsl.js +326 -0
  33. package/dist/show/dsl.js.map +1 -0
  34. package/dist/show/engine.d.ts +50 -0
  35. package/dist/show/engine.d.ts.map +1 -0
  36. package/dist/show/engine.js +264 -0
  37. package/dist/show/engine.js.map +1 -0
  38. package/dist/showAccessory.d.ts +9 -0
  39. package/dist/showAccessory.d.ts.map +1 -0
  40. package/dist/showAccessory.js +33 -0
  41. package/dist/showAccessory.js.map +1 -0
  42. package/dist/stateRegistry.d.ts +8 -3
  43. package/dist/stateRegistry.d.ts.map +1 -1
  44. package/dist/stateRegistry.js +4 -4
  45. package/dist/stateRegistry.js.map +1 -1
  46. package/examples/dmx.yaml +76 -0
  47. package/package.json +1 -1
  48. package/src/config.ts +22 -1
  49. package/src/controller.ts +8 -5
  50. package/src/dmxController.ts +10 -1
  51. package/src/platform.ts +35 -2
  52. package/src/sacn.ts +8 -4
  53. package/src/settings.ts +19 -0
  54. package/src/show/colors.ts +224 -0
  55. package/src/show/dsl.ts +370 -0
  56. package/src/show/engine.ts +280 -0
  57. package/src/showAccessory.ts +46 -0
  58. package/src/stateRegistry.ts +11 -5
@@ -1 +1 @@
1
- {"version":3,"file":"sacn.d.ts","sourceRoot":"","sources":["../src/sacn.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAYnD,qBAAa,cAAe,YAAW,aAAa;IAehD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAhB3B,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,cAAc,CAA+B;IACrD;;uCAEmC;IAC5B,YAAY,SAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;IACvC,OAAO,CAAC,MAAM,CAAS;gBAGJ,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAA8B;IAM3D,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAiB5D,OAAO,CAAC,WAAW;IAMnB;+BAC2B;IAC3B,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,YAAY;IAYpB,sEAAsE;IACtE,OAAO,CAAC,WAAW;IA8BnB,QAAQ,IAAI,IAAI;CAYjB"}
1
+ {"version":3,"file":"sacn.d.ts","sourceRoot":"","sources":["../src/sacn.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAa/D,qBAAa,cAAe,YAAW,aAAa;IAgBhD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAjB3B,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,cAAc,CAA+B;IACrD;;uCAEmC;IAC5B,YAAY,SAAK;IACxB,QAAQ,CAAC,eAAe,MAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;IACvC,OAAO,CAAC,MAAM,CAAS;gBAGJ,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAA8B;IAM3D,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAmB/E,OAAO,CAAC,WAAW;IAMnB;+BAC2B;IAC3B,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,YAAY;IAYpB,sEAAsE;IACtE,OAAO,CAAC,WAAW;IA8BnB,QAAQ,IAAI,IAAI;CAYjB"}
package/dist/sacn.js CHANGED
@@ -18,7 +18,7 @@
18
18
  // sACN universes 1 and 2. Packets are unicast to the configured ip.
19
19
  import dgram from 'node:dgram';
20
20
  import { randomBytes } from 'node:crypto';
21
- import { SACN_COALESCE_MS, SACN_KEEPALIVE_MS, SACN_PORT, SACN_PRIORITY_DEFAULT, SACN_SOURCE_NAME, } from './settings.js';
21
+ import { SACN_COALESCE_MS, SACN_FRAME_MS, SACN_KEEPALIVE_MS, SACN_PORT, SACN_PRIORITY_DEFAULT, SACN_SOURCE_NAME, } from './settings.js';
22
22
  const PACKET_LEN = 638; // full 512-slot E1.31 data packet
23
23
  const OPT_STREAM_TERMINATED = 0x40;
24
24
  export class SacnController {
@@ -34,6 +34,7 @@ export class SacnController {
34
34
  * Read by the platform's state-poll guard so a read-back never clobbers
35
35
  * an in-flight HomeKit change. */
36
36
  lastChangeAt = 0;
37
+ frameIntervalMs = SACN_FRAME_MS;
37
38
  socket;
38
39
  cid = randomBytes(16);
39
40
  closed = false;
@@ -44,7 +45,7 @@ export class SacnController {
44
45
  this.socket = dgram.createSocket('udp4');
45
46
  this.socket.on('error', (e) => this.log.error('sACN socket error:', e.message));
46
47
  }
47
- setFixture(fixture, state) {
48
+ setFixture(fixture, state, opts) {
48
49
  const arr = this.universeBuf(fixture.universe);
49
50
  const bytes = fixture.profile.model.render(state, fixture.profile.channels);
50
51
  for (let i = 0; i < bytes.length; i++) {
@@ -52,8 +53,10 @@ export class SacnController {
52
53
  }
53
54
  this.dirty.add(fixture.universe);
54
55
  this.lastChangeAt = Date.now();
55
- const hex = Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');
56
- this.log.info(`setFixture ${fixture.id}@DMX${fixture.startCh}/U${fixture.universe + 1}=${hex}`);
56
+ if (!opts?.quiet) {
57
+ const hex = Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');
58
+ this.log.info(`setFixture ${fixture.id}@DMX${fixture.startCh}/U${fixture.universe + 1}=${hex}`);
59
+ }
57
60
  this.scheduleSend();
58
61
  if (!this.keepaliveTimer) {
59
62
  this.keepaliveTimer = setInterval(() => this.sendAll(), SACN_KEEPALIVE_MS);
package/dist/sacn.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sacn.js","sourceRoot":"","sources":["../src/sacn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sacn.js","sourceRoot":"","sources":["../src/sacn.ts"],"names":[],"mappings":"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"}
@@ -34,4 +34,17 @@ export declare const SACN_KEEPALIVE_MS = 1000;
34
34
  export declare const SACN_PRIORITY_DEFAULT = 100;
35
35
  /** Source name advertised in every E1.31 framing layer (max 63 chars). */
36
36
  export declare const SACN_SOURCE_NAME = "homebridge-dmx";
37
+ /** Show frame interval on sACN: 25 Hz, the same cadence the Nicolaudie
38
+ * tools stream at and well inside what a gateway accepts. */
39
+ export declare const SACN_FRAME_MS = 40;
40
+ /** Show frame interval on the Stick-DE3. Each frame becomes a full
41
+ * subprocess transaction (~2 s) after the 750 ms debounce, so fades on
42
+ * the Stick are a slow staircase rather than a glide. */
43
+ export declare const STICK_FRAME_MS = 3000;
44
+ /** Fallback frame interval for a controller that doesn't declare one. */
45
+ export declare const SHOW_FRAME_MS_DEFAULT = 40;
46
+ /** Minimum spacing between the registry keyframes a running show writes
47
+ * (each one fans out into HomeKit characteristic events for every
48
+ * fixture and zone involved). */
49
+ export declare const SHOW_KEYFRAME_MIN_MS = 1000;
37
50
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,WAAW,8BAA8B,CAAC;AAEvD;6EAC6E;AAC7E,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD;;wCAEwC;AACxC,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B;;;;;qEAKqE;AACrE,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC;;mBAEmB;AACnB,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAIpC,sDAAsD;AACtD,eAAO,MAAM,SAAS,OAAO,CAAC;AAE9B;mDACmD;AACnD,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC;;gCAEgC;AAChC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC;yDACyD;AACzD,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,mBAAmB,CAAC"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,WAAW,8BAA8B,CAAC;AAEvD;6EAC6E;AAC7E,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD;;wCAEwC;AACxC,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B;;;;;qEAKqE;AACrE,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC;;mBAEmB;AACnB,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAIpC,sDAAsD;AACtD,eAAO,MAAM,SAAS,OAAO,CAAC;AAE9B;mDACmD;AACnD,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC;;gCAEgC;AAChC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC;yDACyD;AACzD,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD;8DAC8D;AAC9D,eAAO,MAAM,aAAa,KAAK,CAAC;AAIhC;;0DAE0D;AAC1D,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC;;kCAEkC;AAClC,eAAO,MAAM,oBAAoB,OAAO,CAAC"}
package/dist/settings.js CHANGED
@@ -36,4 +36,18 @@ export const SACN_KEEPALIVE_MS = 1000;
36
36
  export const SACN_PRIORITY_DEFAULT = 100;
37
37
  /** Source name advertised in every E1.31 framing layer (max 63 chars). */
38
38
  export const SACN_SOURCE_NAME = 'homebridge-dmx';
39
+ /** Show frame interval on sACN: 25 Hz, the same cadence the Nicolaudie
40
+ * tools stream at and well inside what a gateway accepts. */
41
+ export const SACN_FRAME_MS = 40;
42
+ // ── Shows ──────────────────────────────────────────────────────────────────
43
+ /** Show frame interval on the Stick-DE3. Each frame becomes a full
44
+ * subprocess transaction (~2 s) after the 750 ms debounce, so fades on
45
+ * the Stick are a slow staircase rather than a glide. */
46
+ export const STICK_FRAME_MS = 3000;
47
+ /** Fallback frame interval for a controller that doesn't declare one. */
48
+ export const SHOW_FRAME_MS_DEFAULT = 40;
49
+ /** Minimum spacing between the registry keyframes a running show writes
50
+ * (each one fans out into HomeKit characteristic events for every
51
+ * fixture and zone involved). */
52
+ export const SHOW_KEYFRAME_MIN_MS = 1000;
39
53
  //# sourceMappingURL=settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAEvD;6EAC6E;AAC7E,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD;;wCAEwC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAE/B;;;;;qEAKqE;AACrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC;;mBAEmB;AACnB,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,8EAA8E;AAE9E,sDAAsD;AACtD,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;AAE9B;mDACmD;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC;;gCAEgC;AAChC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAEtC;yDACyD;AACzD,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAEvD;6EAC6E;AAC7E,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD;;wCAEwC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAE/B;;;;;qEAKqE;AACrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC;;mBAEmB;AACnB,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,8EAA8E;AAE9E,sDAAsD;AACtD,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;AAE9B;mDACmD;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC;;gCAEgC;AAChC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAEtC;yDACyD;AACzD,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAEjD;8DAC8D;AAC9D,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAEhC,8EAA8E;AAE9E;;0DAE0D;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC;;kCAEkC;AAClC,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC"}
@@ -0,0 +1,25 @@
1
+ /** What a step asks of a fixture. `brightness` 0 means off. Hue/sat
2
+ * present → color mode; mireds present with sat 0/absent → white mode. */
3
+ export interface LookColor {
4
+ brightness: number;
5
+ hue?: number;
6
+ saturation?: number;
7
+ mireds?: number;
8
+ }
9
+ export type Palette = Map<string, LookColor>;
10
+ /** Normalise a color/palette name: lowercase, strip spaces/underscores/dashes
11
+ * so "Surprise Pink", "surprise_pink" and "surprisepink" all match. */
12
+ export declare function colorKey(name: string): string;
13
+ export declare function rgbToHsv(r: number, g: number, b: number): {
14
+ h: number;
15
+ s: number;
16
+ v: number;
17
+ };
18
+ /** Parse a color spec into a LookColor. `palette` wins over CSS names. */
19
+ export declare function parseColor(spec: unknown, palette?: Palette): LookColor;
20
+ /** Blend two look colors. Brightness and saturation go linearly; hue takes
21
+ * the shortest arc; a white-mode endpoint (no hue or sat 0) borrows the
22
+ * other side's hue so a white↔color fade is a clean (de)saturation;
23
+ * mireds blend when both sides have them. */
24
+ export declare function mixLook(a: LookColor, b: LookColor, t: number): LookColor;
25
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/show/colors.ts"],"names":[],"mappings":"AAmBA;2EAC2E;AAC3E,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AA0C7C;wEACwE;AACxE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAgB7F;AAmBD,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAoBtE;AAgED;;;8CAG8C;AAC9C,wBAAgB,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAmBxE"}
@@ -0,0 +1,216 @@
1
+ // Show color specs → a controller-independent "look color".
2
+ //
3
+ // Accepted spec forms (strings are case-insensitive, whitespace-tolerant):
4
+ //
5
+ // off → dark
6
+ // indigo, hotpink, ... → any CSS named color (hue/sat from the color,
7
+ // brightness from its HSV value)
8
+ // "#4b0082" / "#f0f" → hex RGB, same mapping
9
+ // "3000K" / "3000 K" → white mode at that color temperature, 100 %
10
+ // "hsv(275, 100, 80)" → explicit hue °, sat %, brightness %
11
+ // "<any of the above> @ 60%" → override brightness
12
+ // { hue: 275, saturation: 100, brightness: 80 }
13
+ // { kelvin: 3000, brightness: 60 } / { mireds: 333 }
14
+ //
15
+ // A `palette` (user-defined name → spec) is consulted before the CSS
16
+ // table, so gel names like "surprise pink" can be given real values.
17
+ import { clamp } from '../color/types.js';
18
+ const CSS_COLORS = ('aliceblue:f0f8ff antiquewhite:faebd7 aqua:00ffff aquamarine:7fffd4 azure:f0ffff ' +
19
+ 'beige:f5f5dc bisque:ffe4c4 black:000000 blanchedalmond:ffebcd blue:0000ff ' +
20
+ 'blueviolet:8a2be2 brown:a52a2a burlywood:deb887 cadetblue:5f9ea0 chartreuse:7fff00 ' +
21
+ 'chocolate:d2691e coral:ff7f50 cornflowerblue:6495ed cornsilk:fff8dc crimson:dc143c ' +
22
+ 'cyan:00ffff darkblue:00008b darkcyan:008b8b darkgoldenrod:b8860b darkgray:a9a9a9 ' +
23
+ 'darkgreen:006400 darkgrey:a9a9a9 darkkhaki:bdb76b darkmagenta:8b008b ' +
24
+ 'darkolivegreen:556b2f darkorange:ff8c00 darkorchid:9932cc darkred:8b0000 ' +
25
+ 'darksalmon:e9967a darkseagreen:8fbc8f darkslateblue:483d8b darkslategray:2f4f4f ' +
26
+ 'darkslategrey:2f4f4f darkturquoise:00ced1 darkviolet:9400d3 deeppink:ff1493 ' +
27
+ 'deepskyblue:00bfff dimgray:696969 dimgrey:696969 dodgerblue:1e90ff firebrick:b22222 ' +
28
+ 'floralwhite:fffaf0 forestgreen:228b22 fuchsia:ff00ff gainsboro:dcdcdc ' +
29
+ 'ghostwhite:f8f8ff gold:ffd700 goldenrod:daa520 gray:808080 green:008000 ' +
30
+ 'greenyellow:adff2f grey:808080 honeydew:f0fff0 hotpink:ff69b4 indianred:cd5c5c ' +
31
+ 'indigo:4b0082 ivory:fffff0 khaki:f0e68c lavender:e6e6fa lavenderblush:fff0f5 ' +
32
+ 'lawngreen:7cfc00 lemonchiffon:fffacd lightblue:add8e6 lightcoral:f08080 ' +
33
+ 'lightcyan:e0ffff lightgoldenrodyellow:fafad2 lightgray:d3d3d3 lightgreen:90ee90 ' +
34
+ 'lightgrey:d3d3d3 lightpink:ffb6c1 lightsalmon:ffa07a lightseagreen:20b2aa ' +
35
+ 'lightskyblue:87cefa lightslategray:778899 lightslategrey:778899 ' +
36
+ 'lightsteelblue:b0c4de lightyellow:ffffe0 lime:00ff00 limegreen:32cd32 linen:faf0e6 ' +
37
+ 'magenta:ff00ff maroon:800000 mediumaquamarine:66cdaa mediumblue:0000cd ' +
38
+ 'mediumorchid:ba55d3 mediumpurple:9370db mediumseagreen:3cb371 ' +
39
+ 'mediumslateblue:7b68ee mediumspringgreen:00fa9a mediumturquoise:48d1cc ' +
40
+ 'mediumvioletred:c71585 midnightblue:191970 mintcream:f5fffa mistyrose:ffe4e1 ' +
41
+ 'moccasin:ffe4b5 navajowhite:ffdead navy:000080 oldlace:fdf5e6 olive:808000 ' +
42
+ 'olivedrab:6b8e23 orange:ffa500 orangered:ff4500 orchid:da70d6 palegoldenrod:eee8aa ' +
43
+ 'palegreen:98fb98 paleturquoise:afeeee palevioletred:db7093 papayawhip:ffefd5 ' +
44
+ 'peachpuff:ffdab9 peru:cd853f pink:ffc0cb plum:dda0dd powderblue:b0e0e6 ' +
45
+ 'purple:800080 rebeccapurple:663399 red:ff0000 rosybrown:bc8f8f royalblue:4169e1 ' +
46
+ 'saddlebrown:8b4513 salmon:fa8072 sandybrown:f4a460 seagreen:2e8b57 seashell:fff5ee ' +
47
+ 'sienna:a0522d silver:c0c0c0 skyblue:87ceeb slateblue:6a5acd slategray:708090 ' +
48
+ 'slategrey:708090 snow:fffafa springgreen:00ff7f steelblue:4682b4 tan:d2b48c ' +
49
+ 'teal:008080 thistle:d8bfd8 tomato:ff6347 turquoise:40e0d0 violet:ee82ee ' +
50
+ 'wheat:f5deb3 white:ffffff whitesmoke:f5f5f5 yellow:ffff00 yellowgreen:9acd32').split(' ').reduce((m, kv) => {
51
+ const [k, v] = kv.split(':');
52
+ m.set(k, v);
53
+ return m;
54
+ }, new Map());
55
+ /** Normalise a color/palette name: lowercase, strip spaces/underscores/dashes
56
+ * so "Surprise Pink", "surprise_pink" and "surprisepink" all match. */
57
+ export function colorKey(name) {
58
+ return name.toLowerCase().replace(/[\s_-]+/g, '');
59
+ }
60
+ export function rgbToHsv(r, g, b) {
61
+ const max = Math.max(r, g, b);
62
+ const min = Math.min(r, g, b);
63
+ const d = max - min;
64
+ let h = 0;
65
+ if (d !== 0) {
66
+ if (max === r)
67
+ h = 60 * (((g - b) / d) % 6);
68
+ else if (max === g)
69
+ h = 60 * (((b - r) / d) + 2);
70
+ else
71
+ h = 60 * (((r - g) / d) + 4);
72
+ }
73
+ if (h < 0)
74
+ h += 360;
75
+ return {
76
+ h,
77
+ s: max === 0 ? 0 : (d / max) * 100,
78
+ v: (max / 255) * 100,
79
+ };
80
+ }
81
+ function fromHex(hex) {
82
+ let h = hex.replace(/^#/, '');
83
+ if (h.length === 3)
84
+ h = h.split('').map((c) => c + c).join('');
85
+ if (!/^[0-9a-f]{6}$/i.test(h))
86
+ throw new Error(`bad hex color "${hex}"`);
87
+ const n = parseInt(h, 16);
88
+ const { h: hue, s, v } = rgbToHsv((n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff);
89
+ return { brightness: round1(v), hue: round1(hue), saturation: round1(s) };
90
+ }
91
+ function round1(n) {
92
+ return Math.round(n * 10) / 10;
93
+ }
94
+ function kelvinToMireds(k) {
95
+ return Math.round(clamp(1_000_000 / k, 50, 400));
96
+ }
97
+ /** Parse a color spec into a LookColor. `palette` wins over CSS names. */
98
+ export function parseColor(spec, palette) {
99
+ if (spec && typeof spec === 'object')
100
+ return fromObject(spec);
101
+ if (typeof spec === 'number') {
102
+ // Bare number: treat as Kelvin (e.g. `3000`). Small numbers are a mistake.
103
+ if (spec < 1000)
104
+ throw new Error(`color "${spec}": bare numbers are Kelvin; use "3000K" or an object`);
105
+ return { brightness: 100, mireds: kelvinToMireds(spec) };
106
+ }
107
+ if (typeof spec !== 'string')
108
+ throw new Error(`color: expected a string or object, got ${typeof spec}`);
109
+ let text = spec.trim();
110
+ // Optional trailing brightness override: "... @ 60%"
111
+ let brightness;
112
+ const at = text.match(/^(.*?)\s*@\s*(\d+(?:\.\d+)?)\s*%?$/);
113
+ if (at) {
114
+ text = at[1].trim();
115
+ brightness = clamp(Number(at[2]), 0, 100);
116
+ }
117
+ const base = parseBase(text, palette);
118
+ if (brightness != null)
119
+ base.brightness = brightness;
120
+ return base;
121
+ }
122
+ function parseBase(text, palette) {
123
+ const lower = text.toLowerCase();
124
+ if (lower === 'off' || lower === 'black' || lower === 'dark') {
125
+ return { brightness: 0 };
126
+ }
127
+ if (lower.startsWith('#'))
128
+ return fromHex(lower);
129
+ const k = lower.match(/^(\d+(?:\.\d+)?)\s*k$/);
130
+ if (k)
131
+ return { brightness: 100, mireds: kelvinToMireds(Number(k[1])) };
132
+ const hsv = lower.match(/^hsv\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)$/);
133
+ if (hsv) {
134
+ return {
135
+ brightness: clamp(Number(hsv[3]), 0, 100),
136
+ hue: ((Number(hsv[1]) % 360) + 360) % 360,
137
+ saturation: clamp(Number(hsv[2]), 0, 100),
138
+ };
139
+ }
140
+ const hs = lower.match(/^hs\(\s*([\d.]+)\s*,\s*([\d.]+)\s*\)$/);
141
+ if (hs) {
142
+ return {
143
+ brightness: 100,
144
+ hue: ((Number(hs[1]) % 360) + 360) % 360,
145
+ saturation: clamp(Number(hs[2]), 0, 100),
146
+ };
147
+ }
148
+ const key = colorKey(text);
149
+ const pal = palette?.get(key);
150
+ if (pal)
151
+ return { ...pal };
152
+ const css = CSS_COLORS.get(key);
153
+ if (css)
154
+ return fromHex(css);
155
+ throw new Error(`unknown color "${text}" (not in palette, not a CSS name, not #hex/NNNNK/hsv())`);
156
+ }
157
+ function fromObject(o) {
158
+ const num = (k) => {
159
+ const v = o[k];
160
+ if (v == null)
161
+ return undefined;
162
+ if (typeof v !== 'number' || Number.isNaN(v))
163
+ throw new Error(`color.${k}: expected a number`);
164
+ return v;
165
+ };
166
+ const out = { brightness: clamp(num('brightness') ?? 100, 0, 100) };
167
+ const hue = num('hue');
168
+ const sat = num('saturation') ?? num('sat');
169
+ const kelvin = num('kelvin') ?? num('k');
170
+ const mireds = num('mireds');
171
+ if (hue != null || sat != null) {
172
+ out.hue = (((hue ?? 0) % 360) + 360) % 360;
173
+ out.saturation = clamp(sat ?? 100, 0, 100);
174
+ }
175
+ if (kelvin != null)
176
+ out.mireds = kelvinToMireds(kelvin);
177
+ else if (mireds != null)
178
+ out.mireds = Math.round(clamp(mireds, 50, 400));
179
+ if (out.hue == null && out.mireds == null && out.brightness > 0) {
180
+ throw new Error('color object needs hue/saturation, kelvin, or mireds');
181
+ }
182
+ return out;
183
+ }
184
+ // ── interpolation ──────────────────────────────────────────────────────────
185
+ /** Blend two look colors. Brightness and saturation go linearly; hue takes
186
+ * the shortest arc; a white-mode endpoint (no hue or sat 0) borrows the
187
+ * other side's hue so a white↔color fade is a clean (de)saturation;
188
+ * mireds blend when both sides have them. */
189
+ export function mixLook(a, b, t) {
190
+ t = clamp(t, 0, 1);
191
+ const out = { brightness: lerp(a.brightness, b.brightness, t) };
192
+ const aColor = a.hue != null && (a.saturation ?? 0) > 0;
193
+ const bColor = b.hue != null && (b.saturation ?? 0) > 0;
194
+ if (aColor || bColor) {
195
+ const ah = aColor ? a.hue : b.hue;
196
+ const bh = bColor ? b.hue : a.hue;
197
+ const d = ((bh - ah + 540) % 360) - 180;
198
+ out.hue = (((ah + d * t) % 360) + 360) % 360;
199
+ out.saturation = lerp(a.saturation ?? 0, b.saturation ?? 0, t);
200
+ }
201
+ else if (a.hue != null || b.hue != null) {
202
+ out.hue = b.hue ?? a.hue;
203
+ out.saturation = 0;
204
+ }
205
+ if (a.mireds != null && b.mireds != null)
206
+ out.mireds = lerp(a.mireds, b.mireds, t);
207
+ else
208
+ out.mireds = b.mireds ?? a.mireds;
209
+ if (out.mireds == null)
210
+ delete out.mireds;
211
+ return out;
212
+ }
213
+ function lerp(a, b, t) {
214
+ return a + (b - a) * t;
215
+ }
216
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/show/colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { Fixture, Zone } from '../config.js';
2
+ import { LookColor, Palette } from './colors.js';
3
+ export type Ease = 'linear' | 'sine';
4
+ export declare const EASES: Ease[];
5
+ export interface StepSpec {
6
+ look?: Record<string, unknown>;
7
+ fade?: number | string;
8
+ hold?: number | string;
9
+ ease?: string;
10
+ }
11
+ export interface ShowSpec {
12
+ id: string;
13
+ name?: string;
14
+ extends?: string;
15
+ params?: Record<string, unknown>;
16
+ steps?: StepSpec[];
17
+ loop?: boolean;
18
+ fade?: number | string;
19
+ hold?: number | string;
20
+ ease?: string;
21
+ switch?: boolean;
22
+ }
23
+ export interface ResolvedStep {
24
+ /** Full look for every fixture in the show after tracking. A missing
25
+ * entry (only possible in step 0 of a non-looping show) means "hold
26
+ * whatever the fixture was doing when the show started". */
27
+ targets: Map<string, LookColor>;
28
+ fadeMs: number;
29
+ holdMs: number;
30
+ ease: Ease;
31
+ }
32
+ export interface Show {
33
+ id: string;
34
+ name: string;
35
+ loop: boolean;
36
+ /** True when every param is bound (a show with unbound params is a template). */
37
+ runnable: boolean;
38
+ unboundParams: string[];
39
+ /** Runnable AND not hidden with `switch: false`. */
40
+ exposeSwitch: boolean;
41
+ fixtures: Fixture[];
42
+ steps: ResolvedStep[];
43
+ cycleMs: number;
44
+ }
45
+ export declare function parseDuration(v: unknown, what: string): number;
46
+ export declare function parsePalette(raw: unknown): Palette;
47
+ /** Deep-substitute `$name` / `${name}` in `value`. A string that is exactly
48
+ * one reference becomes the param's value with its own type (so
49
+ * `fade: $secs` stays numeric); otherwise references interpolate as text. */
50
+ export declare function substitute(value: unknown, params: Record<string, unknown>, where: string): unknown;
51
+ /** Named fixture sets for show targets: `groups: { odd: [id, id, ...] }`.
52
+ * Unlike zones they create no HomeKit accessory. Ids may be fixture ids
53
+ * or zone ids; group ids must not collide with either. */
54
+ export declare function parseGroups(raw: unknown, fixtures: Fixture[], zones: Zone[]): Map<string, Fixture[]>;
55
+ export declare function loadShows(specs: ShowSpec[], fixtures: Fixture[], zones: Zone[], groups: Map<string, Fixture[]>, palette: Palette): Show[];
56
+ //# sourceMappingURL=dsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.d.ts","sourceRoot":"","sources":["../../src/show/dsl.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAwB,MAAM,aAAa,CAAC;AAEvE,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC;AACrC,eAAO,MAAM,KAAK,EAAE,IAAI,EAAuB,CAAC;AAEhD,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B;;iEAE6D;IAC7D,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,iFAAiF;IACjF,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,oDAAoD;IACpD,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAiB9D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAWlD;AAOD;;8EAE8E;AAC9E,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAsBlG;AAmED;;2DAE2D;AAC3D,wBAAgB,WAAW,CACzB,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,GACZ,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CA0BxB;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAC9B,OAAO,EAAE,OAAO,GACf,IAAI,EAAE,CAiGR"}