@ecopoesis/homebridge-dmx 0.3.0 → 0.5.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.
- package/CLAUDE.md +1 -0
- package/ENCRYPTION.md +207 -0
- package/PROTOCOL.md +277 -0
- package/README.md +25 -2
- package/config.schema.json +53 -5
- package/dist/config.d.ts +5 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -2
- package/dist/config.js.map +1 -1
- package/dist/controller.d.ts +16 -4
- package/dist/controller.d.ts.map +1 -1
- package/dist/controller.js +41 -5
- package/dist/controller.js.map +1 -1
- package/dist/dmxController.d.ts +11 -0
- package/dist/dmxController.d.ts.map +1 -0
- package/dist/dmxController.js +4 -0
- package/dist/dmxController.js.map +1 -0
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +5 -2
- package/dist/platform.js.map +1 -1
- package/dist/platformAccessory.d.ts +2 -2
- package/dist/platformAccessory.d.ts.map +1 -1
- package/dist/platformAccessory.js.map +1 -1
- package/dist/sacn.d.ts +29 -0
- package/dist/sacn.d.ts.map +1 -0
- package/dist/sacn.js +142 -0
- package/dist/sacn.js.map +1 -0
- package/dist/settings.d.ts +23 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +24 -0
- package/dist/settings.js.map +1 -1
- package/dist/zoneAccessory.d.ts +2 -2
- package/dist/zoneAccessory.d.ts.map +1 -1
- package/dist/zoneAccessory.js.map +1 -1
- package/examples/dmx.yaml +13 -4
- package/package.json +1 -1
- package/src/config.ts +18 -3
- package/src/controller.ts +41 -6
- package/src/dmxController.ts +14 -0
- package/src/platform.ts +8 -4
- package/src/platformAccessory.ts +2 -2
- package/src/sacn.ts +149 -0
- package/src/settings.ts +32 -0
- package/src/zoneAccessory.ts +2 -2
- package/tools/stick-power-cycle.py +121 -0
package/dist/config.js
CHANGED
|
@@ -35,9 +35,10 @@
|
|
|
35
35
|
import fs from 'node:fs';
|
|
36
36
|
import path from 'node:path';
|
|
37
37
|
import yaml from 'js-yaml';
|
|
38
|
+
import { REFRESH_MINUTES_DEFAULT, SACN_PRIORITY_DEFAULT } from './settings.js';
|
|
38
39
|
import { getColorModel } from './color/index.js';
|
|
39
40
|
import { parseChannelName } from './color/parsers.js';
|
|
40
|
-
export const CONTROLLER_TYPES = ['StickDE3'];
|
|
41
|
+
export const CONTROLLER_TYPES = ['StickDE3', 'sACN'];
|
|
41
42
|
export const DEFAULT_PLATFORM_NAME = 'DMX';
|
|
42
43
|
/** Load + validate the platform config. `rawJson` is the Homebridge
|
|
43
44
|
* `platforms[]` entry; if it specifies `yamlPath`, that YAML file is loaded
|
|
@@ -75,7 +76,17 @@ export function loadConfig(rawJson, cwd) {
|
|
|
75
76
|
if (!cs.ip || typeof cs.ip !== 'string') {
|
|
76
77
|
throw new Error(`controller "${cs.id}": required field "ip" missing`);
|
|
77
78
|
}
|
|
78
|
-
|
|
79
|
+
const refreshMinutes = cs.refreshMinutes ?? REFRESH_MINUTES_DEFAULT;
|
|
80
|
+
if (typeof refreshMinutes !== 'number' || refreshMinutes < 0) {
|
|
81
|
+
throw new Error(`controller "${cs.id}": refreshMinutes must be a number >= 0 (0 disables)`);
|
|
82
|
+
}
|
|
83
|
+
const priority = cs.priority ?? SACN_PRIORITY_DEFAULT;
|
|
84
|
+
if (!Number.isInteger(priority) || priority < 0 || priority > 200) {
|
|
85
|
+
throw new Error(`controller "${cs.id}": priority must be an integer 0..200`);
|
|
86
|
+
}
|
|
87
|
+
controllersById.set(cs.id, {
|
|
88
|
+
id: cs.id, type: cs.type, ip: cs.ip, refreshMinutes, priority,
|
|
89
|
+
});
|
|
79
90
|
}
|
|
80
91
|
// Profiles
|
|
81
92
|
const profileSpecs = raw.profiles ?? [];
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,EAAE;AACF,UAAU;AACV,mEAAmE;AACnE,uEAAuE;AACvE,oDAAoD;AACpD,mDAAmD;AACnD,EAAE;AACF,SAAS;AACT,MAAM;AACN,yBAAyB;AACzB,qBAAqB;AACrB,gDAAgD;AAChD,uBAAuB;AACvB,mEAAmE;AACnE,SAAS;AACT,oBAAoB;AACpB,iDAAiD;AACjD,6DAA6D;AAC7D,0EAA0E;AAC1E,SAAS;AACT,iBAAiB;AACjB,2DAA2D;AAC3D,8DAA8D;AAC9D,QAAQ;AACR,MAAM;AACN,EAAE;AACF,wEAAwE;AACxE,0DAA0D;AAC1D,2EAA2E;AAC3E,6BAA6B;AAC7B,wEAAwE;AACxE,0EAA0E;AAC1E,qCAAqC;AAErC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,EAAE;AACF,UAAU;AACV,mEAAmE;AACnE,uEAAuE;AACvE,oDAAoD;AACpD,mDAAmD;AACnD,EAAE;AACF,SAAS;AACT,MAAM;AACN,yBAAyB;AACzB,qBAAqB;AACrB,gDAAgD;AAChD,uBAAuB;AACvB,mEAAmE;AACnE,SAAS;AACT,oBAAoB;AACpB,iDAAiD;AACjD,6DAA6D;AAC7D,0EAA0E;AAC1E,SAAS;AACT,iBAAiB;AACjB,2DAA2D;AAC3D,8DAA8D;AAC9D,QAAQ;AACR,MAAM;AACN,EAAE;AACF,wEAAwE;AACxE,0DAA0D;AAC1D,2EAA2E;AAC3E,6BAA6B;AAC7B,wEAAwE;AACxE,0EAA0E;AAC1E,qCAAqC;AAErC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AA8CtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,MAAM,CAAU,CAAC;AAsC9D,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAE3C;;;;oEAIoE;AACpE,MAAM,UAAU,UAAU,CAAC,OAAkB,EAAE,GAAY;IACzD,IAAI,GAAG,GAAc,OAAO,CAAC;IAC7B,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ;YAC9C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAc,CAAC;QAC5C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC;QACD,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,cAAc;IACd,MAAM,eAAe,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC9C,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAsB,CAAC;IACtD,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACtD,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAsB,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,eAAe,EAAE,CAAC,EAAE,oBAAoB,EAAE,CAAC,IAAI,KAAK;gBACpD,cAAc,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5C,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC,EAAE,gCAAgC,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,cAAc,GAAG,EAAE,CAAC,cAAc,IAAI,uBAAuB,CAAC;QACpE,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC,EAAE,sDAAsD,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,IAAI,qBAAqB,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC,EAAE,uCAAuC,CAAC,CAAC;QAC/E,CAAC;QACD,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YACzB,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAsB,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,QAAQ;SAChF,CAAC,CAAC;IACL,CAAC;IAED,WAAW;IACX,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAmB,CAAC;IAClD,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,4BAA4B,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,4CAA4C,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,KAAiB,CAAC;QACtB,IAAI,CAAC;YAAC,KAAK,GAAG,aAAa,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAAC,CAAC;QAC7C,OAAO,CAAC,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,MAAO,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAAC,CAAC;QAC/E,IAAI,QAAsB,CAAC;QAC3B,IAAI,CAAC;YAAC,QAAQ,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAAC,CAAC;QAC1D,OAAO,CAAC,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,oBAAqB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAAC,CAAC;QAC7F,IAAI,CAAC;YAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QACjC,OAAO,CAAC,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,MAAO,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAAC,CAAC;QAC/E,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,QAAQ;IACR,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,sEAAsE;IACtE,wDAAwD;IACxD,MAAM,SAAS,GAAqC,IAAI,GAAG,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,CAAS,EAAuB,EAAE;QAC5D,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,EAAE,CAAC;YAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;YAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;QACjD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,EAAE,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACjD,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,wBAAwB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,uBAAuB,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;QACpE,CAAC;QACD,6EAA6E;QAC7E,IAAI,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC;QACjC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC/B,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAe,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CACb,UAAU,EAAE,CAAC,EAAE,sEAAsE,CACtF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,0BAA0B,YAAY,GAAG,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,YAAY,GAAG,CAAC,EAAE,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACxD,IAAI,YAAY,KAAK,GAAG,IAAI,YAAY,KAAK,GAAG,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,wCAAwC,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CACb,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,KAAK,MAAM,GAAG,kCAAkC,CAC/E,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CACb,UAAU,EAAE,CAAC,EAAE,eAAe,IAAI,IAAI,YAAY,GAAG;oBACrD,gBAAgB,YAAY,qBAAqB,KAAK,GAAG,CAC1D,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;YACtB,OAAO;YACP,UAAU;YACV,QAAQ;YACR,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;IACL,CAAC;IAED,qEAAqE;IACrE,0EAA0E;IAC1E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAChD,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,uBAAuB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,4BAA4B,CAAC,CAAC;QACjE,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,qDAAqD,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,OAAO,GAAc,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;QACD,qEAAqE;QACrE,sBAAsB;QACtB,IAAI,KAAK,GAAG,IAAI,GAAG,CAAmB,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAChF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,EAAE,GAAG,IAAI,GAAG,CAAmB,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC/E,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;YACtB,OAAO;YACP,eAAe,EAAE,CAAC,GAAG,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,qBAAqB;QACvC,WAAW,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC;QAC1C,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC"}
|
package/dist/controller.d.ts
CHANGED
|
@@ -1,32 +1,44 @@
|
|
|
1
1
|
import type { Logger } from 'homebridge';
|
|
2
2
|
import { Fixture } from './config.js';
|
|
3
3
|
import { HomeKitLightState } from './color/types.js';
|
|
4
|
-
|
|
4
|
+
import { DmxController } from './dmxController.js';
|
|
5
|
+
export declare class StickController implements DmxController {
|
|
5
6
|
private readonly ip;
|
|
6
7
|
private readonly log;
|
|
7
8
|
private readonly debounceMs;
|
|
9
|
+
private readonly refreshMs;
|
|
8
10
|
private targets;
|
|
9
11
|
private lastChangeAt;
|
|
12
|
+
private lastTxEndAt;
|
|
10
13
|
private streaming;
|
|
14
|
+
private refreshTimer?;
|
|
11
15
|
/** Tracks whether the very first subprocess in this controller's
|
|
12
16
|
* lifetime should set RUN_PROBE=1. After a Stick power-cycle (which
|
|
13
17
|
* we can't detect in-band) the probe is required to (re-)register
|
|
14
18
|
* the client. Subsequent subprocesses can skip it. */
|
|
15
19
|
private needsProbe;
|
|
16
|
-
constructor(ip: string, log: Logger, debounceMs?: number);
|
|
20
|
+
constructor(ip: string, log: Logger, debounceMs?: number, refreshMs?: number);
|
|
21
|
+
/** Idle keepalive: the Stick wedges (sessions succeed, output dark) after
|
|
22
|
+
* hours without traffic. Re-send the current universe state whenever the
|
|
23
|
+
* controller has been idle for refreshMs. Also re-asserts state after an
|
|
24
|
+
* out-of-band power-cycle of the Stick. */
|
|
25
|
+
private maybeRefresh;
|
|
17
26
|
/** Stage a fixture's bytes into the universe target buffer and ensure
|
|
18
27
|
* the streaming loop is running. */
|
|
19
28
|
setFixture(fixture: Fixture, state: HomeKitLightState): void;
|
|
20
29
|
private universeBuf;
|
|
21
30
|
/** Build the CLI args from current targets. Only non-zero channels are
|
|
22
|
-
* passed — send_dmx initialises the universe to 0 so omission == 0.
|
|
31
|
+
* passed — send_dmx initialises the universe to 0 so omission == 0.
|
|
32
|
+
* When everything is 0 (all lights off), send an explicit zero so
|
|
33
|
+
* send_dmx still has at least one assignment to transact. */
|
|
23
34
|
private buildArgs;
|
|
24
35
|
/** Subprocess approach: spawn tools/send_dmx.mjs for each transaction.
|
|
25
36
|
* Fresh node process = no in-process state poisoning that breaks
|
|
26
37
|
* session 2+ in the long-lived plugin. Costs ~1.5-3s per spawn (process
|
|
27
38
|
* startup + handshake + 750ms stream + RST) but is empirically reliable. */
|
|
28
39
|
private run;
|
|
29
|
-
/** Shutdown hook.
|
|
40
|
+
/** Shutdown hook. Stop the keepalive timer; the subprocess approach has
|
|
41
|
+
* no other long-lived state. */
|
|
30
42
|
shutdown(): void;
|
|
31
43
|
}
|
|
32
44
|
//# sourceMappingURL=controller.d.ts.map
|
package/dist/controller.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAKzC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAKzC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASnD,qBAAa,eAAgB,YAAW,aAAa;IAajD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAf5B,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC;;;2DAGuD;IACvD,OAAO,CAAC,UAAU,CAAQ;gBAGP,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,MAAoB,EAChC,SAAS,GAAE,MAAU;IAQxC;;;gDAG4C;IAC5C,OAAO,CAAC,YAAY;IAcpB;yCACqC;IACrC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAmB5D,OAAO,CAAC,WAAW;IAMnB;;;kEAG8D;IAC9D,OAAO,CAAC,SAAS;IAcjB;;;iFAG6E;YAC/D,GAAG;IAgDjB;qCACiC;IACjC,QAAQ,IAAI,IAAI;CAGjB"}
|
package/dist/controller.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import { spawn } from 'node:child_process';
|
|
11
11
|
import { fileURLToPath } from 'node:url';
|
|
12
12
|
import path from 'node:path';
|
|
13
|
-
import { DEBOUNCE_MS } from './settings.js';
|
|
13
|
+
import { DEBOUNCE_MS, REFRESH_CHECK_MS } from './settings.js';
|
|
14
14
|
import { sleep } from './stick/protocol.js';
|
|
15
15
|
const __filename = fileURLToPath(import.meta.url);
|
|
16
16
|
const __dirname = path.dirname(__filename);
|
|
@@ -20,18 +20,45 @@ export class StickController {
|
|
|
20
20
|
ip;
|
|
21
21
|
log;
|
|
22
22
|
debounceMs;
|
|
23
|
+
refreshMs;
|
|
23
24
|
targets = new Map();
|
|
24
25
|
lastChangeAt = 0;
|
|
26
|
+
lastTxEndAt = 0;
|
|
25
27
|
streaming = false;
|
|
28
|
+
refreshTimer;
|
|
26
29
|
/** Tracks whether the very first subprocess in this controller's
|
|
27
30
|
* lifetime should set RUN_PROBE=1. After a Stick power-cycle (which
|
|
28
31
|
* we can't detect in-band) the probe is required to (re-)register
|
|
29
32
|
* the client. Subsequent subprocesses can skip it. */
|
|
30
33
|
needsProbe = true;
|
|
31
|
-
constructor(ip, log, debounceMs = DEBOUNCE_MS) {
|
|
34
|
+
constructor(ip, log, debounceMs = DEBOUNCE_MS, refreshMs = 0) {
|
|
32
35
|
this.ip = ip;
|
|
33
36
|
this.log = log;
|
|
34
37
|
this.debounceMs = debounceMs;
|
|
38
|
+
this.refreshMs = refreshMs;
|
|
39
|
+
if (refreshMs > 0) {
|
|
40
|
+
this.refreshTimer = setInterval(() => this.maybeRefresh(), REFRESH_CHECK_MS);
|
|
41
|
+
this.refreshTimer.unref?.();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Idle keepalive: the Stick wedges (sessions succeed, output dark) after
|
|
45
|
+
* hours without traffic. Re-send the current universe state whenever the
|
|
46
|
+
* controller has been idle for refreshMs. Also re-asserts state after an
|
|
47
|
+
* out-of-band power-cycle of the Stick. */
|
|
48
|
+
maybeRefresh() {
|
|
49
|
+
if (this.streaming || this.targets.size === 0)
|
|
50
|
+
return;
|
|
51
|
+
const idleMs = Date.now() - Math.max(this.lastTxEndAt, this.lastChangeAt);
|
|
52
|
+
if (idleMs < this.refreshMs)
|
|
53
|
+
return;
|
|
54
|
+
this.log.info(`keepalive refresh after ${Math.round(idleMs / 60_000)}m idle`);
|
|
55
|
+
this.needsProbe = true; // the Stick may have power-cycled while we were idle
|
|
56
|
+
this.streaming = true;
|
|
57
|
+
this.run().catch((e) => {
|
|
58
|
+
this.log.error('keepalive refresh crashed:', e.message);
|
|
59
|
+
}).finally(() => {
|
|
60
|
+
this.streaming = false;
|
|
61
|
+
});
|
|
35
62
|
}
|
|
36
63
|
/** Stage a fixture's bytes into the universe target buffer and ensure
|
|
37
64
|
* the streaming loop is running. */
|
|
@@ -62,7 +89,9 @@ export class StickController {
|
|
|
62
89
|
return arr;
|
|
63
90
|
}
|
|
64
91
|
/** Build the CLI args from current targets. Only non-zero channels are
|
|
65
|
-
* passed — send_dmx initialises the universe to 0 so omission == 0.
|
|
92
|
+
* passed — send_dmx initialises the universe to 0 so omission == 0.
|
|
93
|
+
* When everything is 0 (all lights off), send an explicit zero so
|
|
94
|
+
* send_dmx still has at least one assignment to transact. */
|
|
66
95
|
buildArgs() {
|
|
67
96
|
const args = [SEND_DMX_PATH, this.ip];
|
|
68
97
|
for (const [u, arr] of this.targets) {
|
|
@@ -71,6 +100,10 @@ export class StickController {
|
|
|
71
100
|
args.push(`${u},${i + 1}=${arr[i]}`);
|
|
72
101
|
}
|
|
73
102
|
}
|
|
103
|
+
if (args.length === 2 && this.targets.size > 0) {
|
|
104
|
+
const firstU = this.targets.keys().next().value;
|
|
105
|
+
args.push(`${firstU},1=0`);
|
|
106
|
+
}
|
|
74
107
|
return args;
|
|
75
108
|
}
|
|
76
109
|
/** Subprocess approach: spawn tools/send_dmx.mjs for each transaction.
|
|
@@ -107,6 +140,7 @@ export class StickController {
|
|
|
107
140
|
});
|
|
108
141
|
});
|
|
109
142
|
const elapsedMs = Date.now() - startedAt;
|
|
143
|
+
this.lastTxEndAt = Date.now();
|
|
110
144
|
if (exitCode === 0) {
|
|
111
145
|
this.needsProbe = false;
|
|
112
146
|
this.log.info(`send_dmx done in ${elapsedMs}ms`);
|
|
@@ -120,9 +154,11 @@ export class StickController {
|
|
|
120
154
|
return;
|
|
121
155
|
}
|
|
122
156
|
}
|
|
123
|
-
/** Shutdown hook.
|
|
157
|
+
/** Shutdown hook. Stop the keepalive timer; the subprocess approach has
|
|
158
|
+
* no other long-lived state. */
|
|
124
159
|
shutdown() {
|
|
125
|
-
|
|
160
|
+
if (this.refreshTimer)
|
|
161
|
+
clearInterval(this.refreshTimer);
|
|
126
162
|
}
|
|
127
163
|
}
|
|
128
164
|
//# sourceMappingURL=controller.js.map
|
package/dist/controller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,EAAE;AACF,YAAY;AACZ,mEAAmE;AACnE,wEAAwE;AACxE,sEAAsE;AACtE,kCAAkC;AAClC,yEAAyE;AACzE,0EAA0E;AAG1E,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Fixture } from './config.js';
|
|
2
|
+
import { HomeKitLightState } from './color/types.js';
|
|
3
|
+
export interface DmxController {
|
|
4
|
+
/** Render `state` through the fixture's color model into the universe
|
|
5
|
+
* buffer and (eventually) put it on the wire. Must be safe to call at
|
|
6
|
+
* HomeKit interaction rates. */
|
|
7
|
+
setFixture(fixture: Fixture, state: HomeKitLightState): void;
|
|
8
|
+
/** Homebridge shutdown hook: stop timers, close sockets. */
|
|
9
|
+
shutdown(): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=dmxController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dmxController.d.ts","sourceRoot":"","sources":["../src/dmxController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B;;qCAEiC;IACjC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7D,4DAA4D;IAC5D,QAAQ,IAAI,IAAI,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dmxController.js","sourceRoot":"","sources":["../src/dmxController.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,kEAAkE"}
|
package/dist/platform.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,GAAG,EACH,cAAc,EACd,qBAAqB,EACrB,MAAM,EACN,iBAAiB,EACjB,cAAc,EACd,OAAO,EACR,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,GAAG,EACH,cAAc,EACd,qBAAqB,EACrB,MAAM,EACN,iBAAiB,EACjB,cAAc,EACd,OAAO,EACR,MAAM,YAAY,CAAC;AAWpB,qBAAa,WAAY,YAAW,qBAAqB;aAUrC,GAAG,EAAE,MAAM;aACX,MAAM,EAAE,cAAc;aACtB,GAAG,EAAE,GAAG;IAX1B,SAAgB,OAAO,EAAE,OAAO,OAAO,CAAC;IACxC,SAAgB,cAAc,EAAE,OAAO,cAAc,CAAC;IACtD,SAAgB,WAAW,EAAE,iBAAiB,EAAE,CAAM;IAEtD,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,QAAQ,CAAuB;gBAGrB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,GAAG;IAgC1B,OAAO,CAAC,cAAc;IAWtB,iEAAiE;IACjE,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAKtD,OAAO,CAAC,eAAe;CA0DxB"}
|
package/dist/platform.js
CHANGED
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
// its controller.
|
|
6
6
|
import { loadConfig } from './config.js';
|
|
7
7
|
import { StickController } from './controller.js';
|
|
8
|
+
import { SacnController } from './sacn.js';
|
|
8
9
|
import { StickFixture } from './platformAccessory.js';
|
|
9
10
|
import { StateRegistry } from './stateRegistry.js';
|
|
10
11
|
import { ZoneFixture } from './zoneAccessory.js';
|
|
11
|
-
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
|
|
12
|
+
import { DEBOUNCE_MS, PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
|
|
12
13
|
export class DmxPlatform {
|
|
13
14
|
log;
|
|
14
15
|
config;
|
|
@@ -48,7 +49,9 @@ export class DmxPlatform {
|
|
|
48
49
|
makeController(c) {
|
|
49
50
|
switch (c.type) {
|
|
50
51
|
case 'StickDE3':
|
|
51
|
-
return new StickController(c.ip, this.log);
|
|
52
|
+
return new StickController(c.ip, this.log, DEBOUNCE_MS, c.refreshMinutes * 60_000);
|
|
53
|
+
case 'sACN':
|
|
54
|
+
return new SacnController(c.ip, this.log, c.priority);
|
|
52
55
|
default:
|
|
53
56
|
throw new Error(`unsupported controller type "${c.type}"`);
|
|
54
57
|
}
|
package/dist/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,kBAAkB;AAYlB,OAAO,EAA4B,UAAU,EAAa,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PlatformAccessory } from 'homebridge';
|
|
2
2
|
import { Fixture } from './config.js';
|
|
3
|
-
import {
|
|
3
|
+
import { DmxController } from './dmxController.js';
|
|
4
4
|
import type { DmxPlatform } from './platform.js';
|
|
5
5
|
import { StateRegistry } from './stateRegistry.js';
|
|
6
6
|
export declare class StickFixture {
|
|
@@ -11,7 +11,7 @@ export declare class StickFixture {
|
|
|
11
11
|
private readonly registry;
|
|
12
12
|
private pending;
|
|
13
13
|
private bulb;
|
|
14
|
-
constructor(platform: DmxPlatform, accessory: PlatformAccessory, fixture: Fixture, controller:
|
|
14
|
+
constructor(platform: DmxPlatform, accessory: PlatformAccessory, fixture: Fixture, controller: DmxController, registry: StateRegistry);
|
|
15
15
|
private pushFromRegistry;
|
|
16
16
|
private schedule;
|
|
17
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platformAccessory.d.ts","sourceRoot":"","sources":["../src/platformAccessory.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"platformAccessory.d.ts","sourceRoot":"","sources":["../src/platformAccessory.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR3B,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,IAAI,CAAU;gBAGH,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,aAAa,EACzB,QAAQ,EAAE,aAAa;IAoE1C,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,QAAQ;CAcjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platformAccessory.js","sourceRoot":"","sources":["../src/platformAccessory.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,wEAAwE;AACxE,qEAAqE;AACrE,qEAAqE;AAYrE,OAAO,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAG/D,MAAM,OAAO,YAAY;IAKJ;IACA;IACA;IACA;IACA;IARX,OAAO,GAA0B,IAAI,CAAC;IACtC,IAAI,CAAU;IAEtB,YACmB,QAAqB,EACrB,SAA4B,EAC5B,OAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"platformAccessory.js","sourceRoot":"","sources":["../src/platformAccessory.ts"],"names":[],"mappings":"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"}
|
package/dist/sacn.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Logger } from 'homebridge';
|
|
2
|
+
import { Fixture } from './config.js';
|
|
3
|
+
import { HomeKitLightState } from './color/types.js';
|
|
4
|
+
import { DmxController } from './dmxController.js';
|
|
5
|
+
export declare class SacnController implements DmxController {
|
|
6
|
+
private readonly ip;
|
|
7
|
+
private readonly log;
|
|
8
|
+
private readonly priority;
|
|
9
|
+
private universes;
|
|
10
|
+
private seq;
|
|
11
|
+
private dirty;
|
|
12
|
+
private coalesceTimer;
|
|
13
|
+
private keepaliveTimer;
|
|
14
|
+
private readonly socket;
|
|
15
|
+
private readonly cid;
|
|
16
|
+
private closed;
|
|
17
|
+
constructor(ip: string, log: Logger, priority?: number);
|
|
18
|
+
setFixture(fixture: Fixture, state: HomeKitLightState): void;
|
|
19
|
+
private universeBuf;
|
|
20
|
+
/** Coalesce the burst of setFixture calls a zone set produces into one
|
|
21
|
+
* packet per universe. */
|
|
22
|
+
private scheduleSend;
|
|
23
|
+
private sendAll;
|
|
24
|
+
private sendUniverse;
|
|
25
|
+
/** ANSI E1.31 data packet: root layer + framing layer + DMP layer. */
|
|
26
|
+
private buildPacket;
|
|
27
|
+
shutdown(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=sacn.d.ts.map
|
|
@@ -0,0 +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;IAWhD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAZ3B,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,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;IAgB5D,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
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// SacnController — streams DMX to a network gateway over sACN (E1.31).
|
|
2
|
+
//
|
|
3
|
+
// Built for the ENTTEC DIN Ethergate Mk2 (PoE) but speaks plain
|
|
4
|
+
// ANSI E1.31, so any sACN node works. Unlike the Stick there is no
|
|
5
|
+
// session, no crypto, and sends are ~free, so the model is simple:
|
|
6
|
+
//
|
|
7
|
+
// - setFixture() renders into a per-universe 512-byte buffer and marks
|
|
8
|
+
// the universe dirty; a short coalescing timer batches the burst of
|
|
9
|
+
// per-member calls a zone set produces into one packet per universe
|
|
10
|
+
// - a 1 Hz keepalive re-sends every universe we have state for: E1.31
|
|
11
|
+
// receivers drop a source after 2.5 s of silence, and the steady
|
|
12
|
+
// trickle keeps the gateway holding our look
|
|
13
|
+
// - shutdown() sends the spec's stream-terminated packets so the
|
|
14
|
+
// gateway drops the source cleanly (its DMX output holds last values)
|
|
15
|
+
//
|
|
16
|
+
// Universe numbering: patch universes A/B (internal 0/1) map to sACN
|
|
17
|
+
// universes 1/2 — sACN has no universe 0. Set the Ethergate ports to
|
|
18
|
+
// sACN universes 1 and 2. Packets are unicast to the configured ip.
|
|
19
|
+
import dgram from 'node:dgram';
|
|
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';
|
|
22
|
+
const PACKET_LEN = 638; // full 512-slot E1.31 data packet
|
|
23
|
+
const OPT_STREAM_TERMINATED = 0x40;
|
|
24
|
+
export class SacnController {
|
|
25
|
+
ip;
|
|
26
|
+
log;
|
|
27
|
+
priority;
|
|
28
|
+
universes = new Map(); // internal idx (0=A,1=B) → slots
|
|
29
|
+
seq = new Map();
|
|
30
|
+
dirty = new Set();
|
|
31
|
+
coalesceTimer = null;
|
|
32
|
+
keepaliveTimer = null;
|
|
33
|
+
socket;
|
|
34
|
+
cid = randomBytes(16);
|
|
35
|
+
closed = false;
|
|
36
|
+
constructor(ip, log, priority = SACN_PRIORITY_DEFAULT) {
|
|
37
|
+
this.ip = ip;
|
|
38
|
+
this.log = log;
|
|
39
|
+
this.priority = priority;
|
|
40
|
+
this.socket = dgram.createSocket('udp4');
|
|
41
|
+
this.socket.on('error', (e) => this.log.error('sACN socket error:', e.message));
|
|
42
|
+
}
|
|
43
|
+
setFixture(fixture, state) {
|
|
44
|
+
const arr = this.universeBuf(fixture.universe);
|
|
45
|
+
const bytes = fixture.profile.model.render(state, fixture.profile.channels);
|
|
46
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
47
|
+
arr[fixture.startCh - 1 + i] = bytes[i];
|
|
48
|
+
}
|
|
49
|
+
this.dirty.add(fixture.universe);
|
|
50
|
+
const hex = Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
51
|
+
this.log.info(`setFixture ${fixture.id}@DMX${fixture.startCh}/U${fixture.universe + 1}=${hex}`);
|
|
52
|
+
this.scheduleSend();
|
|
53
|
+
if (!this.keepaliveTimer) {
|
|
54
|
+
this.keepaliveTimer = setInterval(() => this.sendAll(), SACN_KEEPALIVE_MS);
|
|
55
|
+
this.keepaliveTimer.unref?.();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
universeBuf(u) {
|
|
59
|
+
let arr = this.universes.get(u);
|
|
60
|
+
if (!arr) {
|
|
61
|
+
arr = new Uint8Array(512);
|
|
62
|
+
this.universes.set(u, arr);
|
|
63
|
+
}
|
|
64
|
+
return arr;
|
|
65
|
+
}
|
|
66
|
+
/** Coalesce the burst of setFixture calls a zone set produces into one
|
|
67
|
+
* packet per universe. */
|
|
68
|
+
scheduleSend() {
|
|
69
|
+
if (this.coalesceTimer)
|
|
70
|
+
return;
|
|
71
|
+
this.coalesceTimer = setTimeout(() => {
|
|
72
|
+
this.coalesceTimer = null;
|
|
73
|
+
for (const u of this.dirty)
|
|
74
|
+
this.sendUniverse(u);
|
|
75
|
+
this.dirty.clear();
|
|
76
|
+
}, SACN_COALESCE_MS);
|
|
77
|
+
}
|
|
78
|
+
sendAll() {
|
|
79
|
+
for (const u of this.universes.keys())
|
|
80
|
+
this.sendUniverse(u);
|
|
81
|
+
}
|
|
82
|
+
sendUniverse(u, options = 0) {
|
|
83
|
+
if (this.closed)
|
|
84
|
+
return;
|
|
85
|
+
const slots = this.universes.get(u);
|
|
86
|
+
if (!slots)
|
|
87
|
+
return;
|
|
88
|
+
const seq = (this.seq.get(u) ?? 0) & 0xff;
|
|
89
|
+
this.seq.set(u, seq + 1);
|
|
90
|
+
const pkt = this.buildPacket(u + 1, seq, slots, options);
|
|
91
|
+
this.socket.send(pkt, SACN_PORT, this.ip, (e) => {
|
|
92
|
+
if (e)
|
|
93
|
+
this.log.error(`sACN send U${u + 1} failed:`, e.message);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** ANSI E1.31 data packet: root layer + framing layer + DMP layer. */
|
|
97
|
+
buildPacket(sacnUniverse, seq, slots, options) {
|
|
98
|
+
const buf = Buffer.alloc(PACKET_LEN);
|
|
99
|
+
// Root layer
|
|
100
|
+
buf.writeUInt16BE(0x0010, 0); // RLP preamble size
|
|
101
|
+
buf.writeUInt16BE(0x0000, 2); // RLP postamble size
|
|
102
|
+
buf.write('ASC-E1.17', 4, 'ascii'); // ACN packet identifier (12 bytes, zero-padded)
|
|
103
|
+
buf.writeUInt16BE(0x7000 | (PACKET_LEN - 16), 16); // flags + length
|
|
104
|
+
buf.writeUInt32BE(0x00000004, 18); // VECTOR_ROOT_E131_DATA
|
|
105
|
+
this.cid.copy(buf, 22);
|
|
106
|
+
// Framing layer
|
|
107
|
+
buf.writeUInt16BE(0x7000 | (PACKET_LEN - 38), 38);
|
|
108
|
+
buf.writeUInt32BE(0x00000002, 40); // VECTOR_E131_DATA_PACKET
|
|
109
|
+
buf.write(SACN_SOURCE_NAME.slice(0, 63), 44, 'utf8');
|
|
110
|
+
buf.writeUInt8(this.priority, 108);
|
|
111
|
+
buf.writeUInt16BE(0x0000, 109); // sync address (none)
|
|
112
|
+
buf.writeUInt8(seq, 111);
|
|
113
|
+
buf.writeUInt8(options, 112);
|
|
114
|
+
buf.writeUInt16BE(sacnUniverse, 113);
|
|
115
|
+
// DMP layer
|
|
116
|
+
buf.writeUInt16BE(0x7000 | (PACKET_LEN - 115), 115);
|
|
117
|
+
buf.writeUInt8(0x02, 117); // VECTOR_DMP_SET_PROPERTY
|
|
118
|
+
buf.writeUInt8(0xa1, 118); // address & data type
|
|
119
|
+
buf.writeUInt16BE(0x0000, 119); // first property address
|
|
120
|
+
buf.writeUInt16BE(0x0001, 121); // address increment
|
|
121
|
+
buf.writeUInt16BE(1 + 512, 123); // property value count
|
|
122
|
+
buf.writeUInt8(0x00, 125); // DMX start code
|
|
123
|
+
buf.set(slots, 126);
|
|
124
|
+
return buf;
|
|
125
|
+
}
|
|
126
|
+
shutdown() {
|
|
127
|
+
if (this.coalesceTimer)
|
|
128
|
+
clearTimeout(this.coalesceTimer);
|
|
129
|
+
if (this.keepaliveTimer)
|
|
130
|
+
clearInterval(this.keepaliveTimer);
|
|
131
|
+
// Spec-polite goodbye: three stream-terminated packets per universe.
|
|
132
|
+
// The gateway drops the source immediately instead of waiting out the
|
|
133
|
+
// 2.5 s network-loss timeout; its DMX output holds the last values.
|
|
134
|
+
for (const u of this.universes.keys()) {
|
|
135
|
+
for (let i = 0; i < 3; i++)
|
|
136
|
+
this.sendUniverse(u, OPT_STREAM_TERMINATED);
|
|
137
|
+
}
|
|
138
|
+
this.closed = true;
|
|
139
|
+
setTimeout(() => this.socket.close(), 100).unref?.();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=sacn.js.map
|
package/dist/sacn.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sacn.js","sourceRoot":"","sources":["../src/sacn.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,gEAAgE;AAChE,mEAAmE;AACnE,mEAAmE;AACnE,EAAE;AACF,yEAAyE;AACzE,wEAAwE;AACxE,wEAAwE;AACxE,wEAAwE;AACxE,qEAAqE;AACrE,iDAAiD;AACjD,mEAAmE;AACnE,0EAA0E;AAC1E,EAAE;AACF,qEAAqE;AACrE,qEAAqE;AACrE,oEAAoE;AAGpE,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK1C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,GAAG,GAAG,CAAC,CAAkB,kCAAkC;AAC3E,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAEnC,MAAM,OAAO,cAAc;IAWN;IACA;IACA;IAZX,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC,CAAE,iCAAiC;IAC7E,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChC,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1B,aAAa,GAA0B,IAAI,CAAC;IAC5C,cAAc,GAA0B,IAAI,CAAC;IACpC,MAAM,CAAe;IACrB,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,GAAG,KAAK,CAAC;IAEvB,YACmB,EAAU,EACV,GAAW,EACX,WAAmB,qBAAqB;QAFxC,OAAE,GAAF,EAAE,CAAQ;QACV,QAAG,GAAH,GAAG,CAAQ;QACX,aAAQ,GAAR,QAAQ,CAAgC;QAEzD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,UAAU,CAAC,OAAgB,EAAE,KAAwB;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,EAAE,OAAO,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;YAC3E,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,CAAS;QAC3B,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,EAAE,CAAC;YAAC,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;YAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QACpE,OAAO,GAAG,CAAC;IACb,CAAC;IAED;+BAC2B;IACnB,YAAY;QAClB,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAC/B,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK;gBAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvB,CAAC;IAEO,OAAO;QACb,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEO,YAAY,CAAC,CAAS,EAAE,OAAO,GAAG,CAAC;QACzC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QAC1C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YAC9C,IAAI,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,sEAAsE;IAC9D,WAAW,CAAC,YAAoB,EAAE,GAAW,EAAE,KAAiB,EAAE,OAAe;QACvF,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrC,aAAa;QACb,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAuB,oBAAoB;QACxE,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAuB,qBAAqB;QACzE,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAiB,gDAAgD;QACpG,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAE,iBAAiB;QACrE,GAAG,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAkB,wBAAwB;QAC5E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvB,gBAAgB;QAChB,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,GAAG,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAkB,0BAA0B;QAC9E,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACrD,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACnC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAqB,sBAAsB;QAC1E,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7B,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACrC,YAAY;QACZ,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACpD,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAA0B,0BAA0B;QAC9E,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAA0B,sBAAsB;QAC1E,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAqB,yBAAyB;QAC7E,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAqB,oBAAoB;QACxE,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAoB,uBAAuB;QAC3E,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAA0B,iBAAiB;QACrE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACpB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,aAAa;YAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,cAAc;YAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,qEAAqE;QACrE,sEAAsE;QACtE,oEAAoE;QACpE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;IACvD,CAAC;CACF"}
|
package/dist/settings.d.ts
CHANGED
|
@@ -7,8 +7,31 @@ export declare const CHARACTERISTIC_UPDATE_DELAY_MS = 50;
|
|
|
7
7
|
* this long before spawning the send_dmx subprocess. Coalesces a fast
|
|
8
8
|
* slider drag into one transaction. */
|
|
9
9
|
export declare const DEBOUNCE_MS = 750;
|
|
10
|
+
/** Idle keepalive. The Stick-DE3 drifts into a wedged state after hours
|
|
11
|
+
* without traffic: sessions and the crypto handshake still succeed but
|
|
12
|
+
* live DMX output goes dark (observed 2026-08-22..25; only a hard power
|
|
13
|
+
* cycle recovers it). Re-sending the last-known state whenever the
|
|
14
|
+
* controller has been idle this long keeps the device exercised and
|
|
15
|
+
* re-asserts state after an out-of-band power-cycle. 0 disables. */
|
|
16
|
+
export declare const REFRESH_MINUTES_DEFAULT = 30;
|
|
17
|
+
/** How often the controller checks whether a keepalive refresh is due. */
|
|
18
|
+
export declare const REFRESH_CHECK_MS = 60000;
|
|
10
19
|
/** Frame interval (40ms = 25Hz, matches HWM exactly). Unused by the
|
|
11
20
|
* subprocess controller — send_dmx.mjs's own FRAME_HZ env knob is what
|
|
12
21
|
* matters now. */
|
|
13
22
|
export declare const FRAME_INTERVAL_MS = 40;
|
|
23
|
+
/** UDP port sACN receivers listen on (ANSI E1.31). */
|
|
24
|
+
export declare const SACN_PORT = 5568;
|
|
25
|
+
/** Coalescing window for the burst of setFixture calls a zone set
|
|
26
|
+
* produces: one packet per universe per burst. */
|
|
27
|
+
export declare const SACN_COALESCE_MS = 25;
|
|
28
|
+
/** Keepalive stream rate. E1.31 receivers drop a source after 2.5 s of
|
|
29
|
+
* silence; a 1 Hz re-send keeps the gateway holding our look and
|
|
30
|
+
* re-asserts state cheaply. */
|
|
31
|
+
export declare const SACN_KEEPALIVE_MS = 1000;
|
|
32
|
+
/** Default E1.31 priority (spec range 0-200, 100 = default). Only matters
|
|
33
|
+
* if a second source ever targets the same universe. */
|
|
34
|
+
export declare const SACN_PRIORITY_DEFAULT = 100;
|
|
35
|
+
/** Source name advertised in every E1.31 framing layer (max 63 chars). */
|
|
36
|
+
export declare const SACN_SOURCE_NAME = "homebridge-dmx";
|
|
14
37
|
//# sourceMappingURL=settings.d.ts.map
|
package/dist/settings.d.ts.map
CHANGED
|
@@ -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;;mBAEmB;AACnB,eAAO,MAAM,iBAAiB,KAAK,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"}
|