amaran-light-cli 1.0.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/LICENSE +22 -0
- package/README.md +374 -0
- package/dist/__tests__/autoCct.test.d.ts +2 -0
- package/dist/__tests__/autoCct.test.d.ts.map +1 -0
- package/dist/__tests__/autoCct.test.js +65 -0
- package/dist/__tests__/autoCct.test.js.map +1 -0
- package/dist/__tests__/cctUtil.test.d.ts +2 -0
- package/dist/__tests__/cctUtil.test.d.ts.map +1 -0
- package/dist/__tests__/cctUtil.test.js +195 -0
- package/dist/__tests__/cctUtil.test.js.map +1 -0
- package/dist/__tests__/cli.smoke.test.d.ts +2 -0
- package/dist/__tests__/cli.smoke.test.d.ts.map +1 -0
- package/dist/__tests__/cli.smoke.test.js +18 -0
- package/dist/__tests__/cli.smoke.test.js.map +1 -0
- package/dist/__tests__/intensityApi.test.d.ts +2 -0
- package/dist/__tests__/intensityApi.test.d.ts.map +1 -0
- package/dist/__tests__/intensityApi.test.js +105 -0
- package/dist/__tests__/intensityApi.test.js.map +1 -0
- package/dist/__tests__/lightControl.test.d.ts +2 -0
- package/dist/__tests__/lightControl.test.d.ts.map +1 -0
- package/dist/__tests__/lightControl.test.js +185 -0
- package/dist/__tests__/lightControl.test.js.map +1 -0
- package/dist/cctUtil.d.ts +26 -0
- package/dist/cctUtil.d.ts.map +1 -0
- package/dist/cctUtil.js +93 -0
- package/dist/cctUtil.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +274 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/autoCct.d.ts +5 -0
- package/dist/commands/autoCct.d.ts.map +1 -0
- package/dist/commands/autoCct.js +270 -0
- package/dist/commands/autoCct.js.map +1 -0
- package/dist/commands/cct.d.ts +5 -0
- package/dist/commands/cct.d.ts.map +1 -0
- package/dist/commands/cct.js +68 -0
- package/dist/commands/cct.js.map +1 -0
- package/dist/commands/color.d.ts +5 -0
- package/dist/commands/color.d.ts.map +1 -0
- package/dist/commands/color.js +63 -0
- package/dist/commands/color.js.map +1 -0
- package/dist/commands/discover.d.ts +5 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +30 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/hsi.d.ts +5 -0
- package/dist/commands/hsi.d.ts.map +1 -0
- package/dist/commands/hsi.js +65 -0
- package/dist/commands/hsi.js.map +1 -0
- package/dist/commands/intensity.d.ts +5 -0
- package/dist/commands/intensity.d.ts.map +1 -0
- package/dist/commands/intensity.js +56 -0
- package/dist/commands/intensity.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +36 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/power.d.ts +5 -0
- package/dist/commands/power.d.ts.map +1 -0
- package/dist/commands/power.js +126 -0
- package/dist/commands/power.js.map +1 -0
- package/dist/commands/schedule.d.ts +5 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +188 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/service.d.ts +5 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +350 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +54 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands.d.ts +5 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +31 -0
- package/dist/commands.js.map +1 -0
- package/dist/discovery.d.ts +13 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +130 -0
- package/dist/discovery.js.map +1 -0
- package/dist/geoipUtil.d.ts +8 -0
- package/dist/geoipUtil.d.ts.map +1 -0
- package/dist/geoipUtil.js +26 -0
- package/dist/geoipUtil.js.map +1 -0
- package/dist/lightControl.d.ts +114 -0
- package/dist/lightControl.d.ts.map +1 -0
- package/dist/lightControl.js +385 -0
- package/dist/lightControl.js.map +1 -0
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +75 -0
- package/scripts/create-launchd-service.sh +114 -0
- package/scripts/run-auto-cct.sh +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAanE;AAED,eAAe,gBAAgB,CAAC"}
|
package/dist/commands.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerCommands = registerCommands;
|
|
4
|
+
const autoCct_1 = require("./commands/autoCct");
|
|
5
|
+
const cct_1 = require("./commands/cct");
|
|
6
|
+
const color_1 = require("./commands/color");
|
|
7
|
+
const discover_1 = require("./commands/discover");
|
|
8
|
+
const hsi_1 = require("./commands/hsi");
|
|
9
|
+
const intensity_1 = require("./commands/intensity");
|
|
10
|
+
const list_1 = require("./commands/list");
|
|
11
|
+
const power_1 = require("./commands/power");
|
|
12
|
+
const schedule_1 = require("./commands/schedule");
|
|
13
|
+
const service_1 = require("./commands/service");
|
|
14
|
+
const status_1 = require("./commands/status");
|
|
15
|
+
// Expose a function to register commands on a commander program instance
|
|
16
|
+
function registerCommands(program, deps) {
|
|
17
|
+
// Delegate registrations to feature modules (avoid megafile)
|
|
18
|
+
(0, autoCct_1.registerAutoCct)(program, deps);
|
|
19
|
+
(0, schedule_1.registerSchedule)(program, deps);
|
|
20
|
+
(0, discover_1.registerDiscover)(program, deps);
|
|
21
|
+
(0, list_1.registerList)(program, deps);
|
|
22
|
+
(0, power_1.registerPower)(program, deps);
|
|
23
|
+
(0, intensity_1.registerIntensity)(program, deps);
|
|
24
|
+
(0, cct_1.registerCct)(program, deps);
|
|
25
|
+
(0, hsi_1.registerHsi)(program, deps);
|
|
26
|
+
(0, color_1.registerColor)(program, deps);
|
|
27
|
+
(0, status_1.registerStatus)(program, deps);
|
|
28
|
+
(0, service_1.registerService)(program, deps);
|
|
29
|
+
}
|
|
30
|
+
exports.default = registerCommands;
|
|
31
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":";;AAeA,4CAaC;AA3BD,gDAAqD;AACrD,wCAA6C;AAC7C,4CAAiD;AACjD,kDAAuD;AACvD,wCAA6C;AAC7C,oDAAyD;AACzD,0CAA+C;AAC/C,4CAAiD;AACjD,kDAAuD;AACvD,gDAAqD;AACrD,8CAAmD;AAGnD,yEAAyE;AACzE,SAAgB,gBAAgB,CAAC,OAAgB,EAAE,IAAiB;IAClE,6DAA6D;IAC7D,IAAA,yBAAe,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,IAAA,2BAAgB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChC,IAAA,2BAAgB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChC,IAAA,mBAAY,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5B,IAAA,qBAAa,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,IAAA,6BAAiB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjC,IAAA,iBAAW,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,IAAA,iBAAW,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,IAAA,qBAAa,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,IAAA,uBAAc,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9B,IAAA,yBAAe,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,kBAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface DiscoveryResult {
|
|
2
|
+
url: string;
|
|
3
|
+
port: number;
|
|
4
|
+
process: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function parseAmaranPorts(lsofOutput: string): Array<{
|
|
7
|
+
port: number;
|
|
8
|
+
process: string;
|
|
9
|
+
iface: '127.0.0.1' | '::1';
|
|
10
|
+
}>;
|
|
11
|
+
export declare function discoverLocalWebSocket(preferredHost?: '127.0.0.1' | 'localhost', debug?: boolean): Promise<DiscoveryResult | null>;
|
|
12
|
+
export default discoverLocalWebSocket;
|
|
13
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,GACjB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAAA;CAAE,CAAC,CAoDtE;AAwCD,wBAAsB,sBAAsB,CAC1C,aAAa,GAAE,WAAW,GAAG,WAAyB,EACtD,KAAK,UAAQ,GACZ,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAyBjC;AAED,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseAmaranPorts = parseAmaranPorts;
|
|
7
|
+
exports.discoverLocalWebSocket = discoverLocalWebSocket;
|
|
8
|
+
const node_child_process_1 = require("node:child_process");
|
|
9
|
+
const node_util_1 = require("node:util");
|
|
10
|
+
const ws_1 = __importDefault(require("ws"));
|
|
11
|
+
const execAsync = (0, node_util_1.promisify)(node_child_process_1.exec);
|
|
12
|
+
// Parse lsof output lines for ports bound by processes starting with "amaran"
|
|
13
|
+
function parseAmaranPorts(lsofOutput) {
|
|
14
|
+
const results = [];
|
|
15
|
+
const lines = lsofOutput.split(/\r?\n/);
|
|
16
|
+
for (const line of lines) {
|
|
17
|
+
// Trim and quickly filter
|
|
18
|
+
const trimmed = line.trim();
|
|
19
|
+
if (!trimmed)
|
|
20
|
+
continue;
|
|
21
|
+
// lsof table rows typically start with COMMAND name in column 1
|
|
22
|
+
// We only care about processes that start with "amaran" (case-insensitive)
|
|
23
|
+
const startsWithAmaran = /^amaran/i.test(trimmed);
|
|
24
|
+
if (!startsWithAmaran)
|
|
25
|
+
continue;
|
|
26
|
+
// Look for localhost binds and capture port
|
|
27
|
+
// Examples (macOS):
|
|
28
|
+
// amaran 1234 mac 10u IPv4 ... TCP 127.0.0.1:60124 (LISTEN)
|
|
29
|
+
// amaran 1234 mac 11u IPv6 ... TCP [::1]:60124 (LISTEN)
|
|
30
|
+
// amaran 1234 mac 12u IPv4 ... TCP 127.0.0.1:60124->127.0.0.1:65000 (ESTABLISHED)
|
|
31
|
+
let match = null;
|
|
32
|
+
let iface = null;
|
|
33
|
+
match = trimmed.match(/127\.0\.0\.1:(\d+)/);
|
|
34
|
+
if (match) {
|
|
35
|
+
iface = '127.0.0.1';
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
match = trimmed.match(/\[::1\]:(\d+)/);
|
|
39
|
+
if (match) {
|
|
40
|
+
iface = '::1';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (!match || !iface)
|
|
44
|
+
continue;
|
|
45
|
+
const port = parseInt(match[1], 10);
|
|
46
|
+
if (!Number.isFinite(port))
|
|
47
|
+
continue;
|
|
48
|
+
// Prefer LISTEN sockets, but also record ESTABLISHED as fallback
|
|
49
|
+
const isListen = /\(LISTEN\)/.test(trimmed);
|
|
50
|
+
// Ensure uniqueness (port, iface)
|
|
51
|
+
if (!results.some((r) => r.port === port && r.iface === iface)) {
|
|
52
|
+
results.push({ port, process: trimmed.split(/\s+/)[0], iface });
|
|
53
|
+
}
|
|
54
|
+
// If it's a LISTEN entry, push it to the front to prioritize
|
|
55
|
+
if (isListen) {
|
|
56
|
+
const idx = results.findIndex((r) => r.port === port && r.iface === iface);
|
|
57
|
+
if (idx > 0) {
|
|
58
|
+
const [item] = results.splice(idx, 1);
|
|
59
|
+
results.unshift(item);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
async function probeWebSocket(url, timeoutMs = 1200) {
|
|
66
|
+
return new Promise((resolve) => {
|
|
67
|
+
let settled = false;
|
|
68
|
+
const ws = new ws_1.default(url);
|
|
69
|
+
const timer = setTimeout(() => {
|
|
70
|
+
if (!settled) {
|
|
71
|
+
settled = true;
|
|
72
|
+
try {
|
|
73
|
+
ws.terminate();
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Ignore termination errors
|
|
77
|
+
}
|
|
78
|
+
resolve(false);
|
|
79
|
+
}
|
|
80
|
+
}, timeoutMs);
|
|
81
|
+
ws.on('open', () => {
|
|
82
|
+
if (!settled) {
|
|
83
|
+
settled = true;
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
try {
|
|
86
|
+
ws.close();
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Ignore close errors
|
|
90
|
+
}
|
|
91
|
+
resolve(true);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
ws.on('error', () => {
|
|
95
|
+
if (!settled) {
|
|
96
|
+
settled = true;
|
|
97
|
+
clearTimeout(timer);
|
|
98
|
+
resolve(false);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async function discoverLocalWebSocket(preferredHost = '127.0.0.1', debug = false) {
|
|
104
|
+
try {
|
|
105
|
+
const { stdout } = await execAsync('lsof -i -P -n');
|
|
106
|
+
const candidates = parseAmaranPorts(stdout);
|
|
107
|
+
if (debug) {
|
|
108
|
+
// eslint-disable-next-line no-console
|
|
109
|
+
console.log('[discovery] lsof candidates:', candidates);
|
|
110
|
+
}
|
|
111
|
+
// Try LISTEN candidates first (we unshifted those), then others
|
|
112
|
+
for (const c of candidates) {
|
|
113
|
+
const host = preferredHost === 'localhost' ? 'localhost' : c.iface === '::1' ? '127.0.0.1' : '127.0.0.1';
|
|
114
|
+
const url = `ws://${host}:${c.port}`;
|
|
115
|
+
const ok = await probeWebSocket(url, 1200);
|
|
116
|
+
if (ok) {
|
|
117
|
+
return { url, port: c.port, process: c.process };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
if (debug) {
|
|
123
|
+
// eslint-disable-next-line no-console
|
|
124
|
+
console.log('[discovery] lsof failed:', err);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
exports.default = discoverLocalWebSocket;
|
|
130
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geoipUtil.d.ts","sourceRoot":"","sources":["../src/geoipUtil.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAgB9D"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getLocationFromIP = getLocationFromIP;
|
|
7
|
+
const geoip_lite_1 = __importDefault(require("geoip-lite"));
|
|
8
|
+
function getLocationFromIP(ip) {
|
|
9
|
+
// If no IP provided, use public IP via external service or fallback to localhost
|
|
10
|
+
// geoip-lite works best with public IPs
|
|
11
|
+
if (!ip || ip === '127.0.0.1' || ip === '::1') {
|
|
12
|
+
// Try to get public IP via external service
|
|
13
|
+
// For now, fallback to null
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const geo = geoip_lite_1.default.lookup(ip);
|
|
17
|
+
if (!geo)
|
|
18
|
+
return null;
|
|
19
|
+
return {
|
|
20
|
+
city: geo.city,
|
|
21
|
+
region: geo.region,
|
|
22
|
+
country: geo.country,
|
|
23
|
+
ll: geo.ll,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=geoipUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geoipUtil.js","sourceRoot":"","sources":["../src/geoipUtil.ts"],"names":[],"mappings":";;;;;AASA,8CAgBC;AAzBD,4DAA+B;AAS/B,SAAgB,iBAAiB,CAAC,EAAW;IAC3C,iFAAiF;IACjF,wCAAwC;IACxC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,WAAW,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;QAC9C,4CAA4C;QAC5C,4BAA4B;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,oBAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,EAAE,EAAE,GAAG,CAAC,EAAsB;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
interface Device {
|
|
2
|
+
node_id?: string;
|
|
3
|
+
device_name?: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
id?: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
interface NodeConfig {
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
type CommandCallback = (success: boolean, message: string, data?: unknown) => void;
|
|
12
|
+
declare class LightController {
|
|
13
|
+
/**
|
|
14
|
+
* Apply a command to all light devices with throttling.
|
|
15
|
+
* Only targets devices with node_ids matching the light pattern (e.g., '400J5-F2C008').
|
|
16
|
+
* Throttles commands with 250ms delay between each to avoid overwhelming the server.
|
|
17
|
+
*
|
|
18
|
+
* @param commandFn - Function that takes (nodeId, callback) and executes the command
|
|
19
|
+
* @param commandName - Display name for the command (for logging)
|
|
20
|
+
* @param getDisplayArgs - Optional function to get display arguments for logging
|
|
21
|
+
*/
|
|
22
|
+
private applyToAllLights;
|
|
23
|
+
/**
|
|
24
|
+
* Set CCT & Intensity for all lights in deviceList.
|
|
25
|
+
* Only targets devices with node_ids matching the light pattern (e.g., '400J5-F2C008').
|
|
26
|
+
* Throttles commands with 250ms delay between each to avoid overwhelming the server.
|
|
27
|
+
*/
|
|
28
|
+
setCCTAndIntensityForAllLights(cct: number, intensity?: number, callback?: CommandCallback): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Turn on all lights.
|
|
31
|
+
*/
|
|
32
|
+
turnOnAllLights(callback?: CommandCallback): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Turn off all lights.
|
|
35
|
+
*/
|
|
36
|
+
turnOffAllLights(callback?: CommandCallback): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Toggle all lights.
|
|
39
|
+
*/
|
|
40
|
+
toggleAllLights(callback?: CommandCallback): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Set intensity for all lights.
|
|
43
|
+
*/
|
|
44
|
+
setIntensityForAllLights(intensity: number, callback?: CommandCallback): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Increment intensity for all lights.
|
|
47
|
+
*/
|
|
48
|
+
incrementIntensityForAllLights(delta: number, callback?: CommandCallback): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Increment CCT for all lights.
|
|
51
|
+
*/
|
|
52
|
+
incrementCCTForAllLights(delta: number, intensity?: number, callback?: CommandCallback): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Set HSI color for all lights.
|
|
55
|
+
*/
|
|
56
|
+
setHSIForAllLights(hue: number, sat: number, intensity: number, cct?: number, gm?: number, callback?: CommandCallback): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Set color for all lights.
|
|
59
|
+
*/
|
|
60
|
+
setColorForAllLights(color: string, intensity?: number, callback?: CommandCallback): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Set system effect for all lights.
|
|
63
|
+
*/
|
|
64
|
+
setSystemEffectForAllLights(effectType: string, intensity?: number, callback?: CommandCallback): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Check if a node_id looks like a light device (not a group or other entity).
|
|
67
|
+
* Light node_ids typically follow pattern like '400J5-F2C008' (alphanumeric with dash).
|
|
68
|
+
*/
|
|
69
|
+
private isLightNodeId;
|
|
70
|
+
/**
|
|
71
|
+
* Sleep utility for throttling commands
|
|
72
|
+
*/
|
|
73
|
+
private sleep;
|
|
74
|
+
private ws;
|
|
75
|
+
private clientId;
|
|
76
|
+
private deviceList;
|
|
77
|
+
private sceneList;
|
|
78
|
+
private nodeConfigs;
|
|
79
|
+
private debug;
|
|
80
|
+
private onInitializedCallback?;
|
|
81
|
+
private commandCallbacks;
|
|
82
|
+
private pendingQueue;
|
|
83
|
+
constructor(wsUrl: string, clientId?: string, onInitialized?: () => void, debug?: boolean);
|
|
84
|
+
setClientId(clientId: string): void;
|
|
85
|
+
private onConnectionOpen;
|
|
86
|
+
private sendCommand;
|
|
87
|
+
private handleDeviceList;
|
|
88
|
+
private handleSceneList;
|
|
89
|
+
private handleNodeConfig;
|
|
90
|
+
private getNodeConfigs;
|
|
91
|
+
getDeviceList(callback?: CommandCallback): void;
|
|
92
|
+
getSceneList(callback?: CommandCallback): void;
|
|
93
|
+
getNodeConfig(nodeId: string, callback?: CommandCallback): void;
|
|
94
|
+
turnLightOn(nodeId: string, callback?: CommandCallback): void;
|
|
95
|
+
turnLightOff(nodeId: string, callback?: CommandCallback): void;
|
|
96
|
+
getLightSleepStatus(nodeId: string, callback?: CommandCallback): void;
|
|
97
|
+
toggleLight(nodeId: string, callback?: CommandCallback): void;
|
|
98
|
+
setIntensity(nodeId: string, intensity: number, callback?: CommandCallback): void;
|
|
99
|
+
incrementIntensity(nodeId: string, delta: number, callback?: CommandCallback): void;
|
|
100
|
+
setCCT(nodeId: string, cct: number, intensity?: number, callback?: CommandCallback): void;
|
|
101
|
+
incrementCCT(nodeId: string, delta: number, intensity?: number, callback?: CommandCallback): void;
|
|
102
|
+
setHSI(nodeId: string, hue: number, sat: number, intensity: number, cct?: number, gm?: number, callback?: CommandCallback): void;
|
|
103
|
+
setColor(nodeId: string, color: string, intensity?: number, callback?: CommandCallback): void;
|
|
104
|
+
setSystemEffect(nodeId: string, effectType: string, intensity?: number, callback?: CommandCallback): void;
|
|
105
|
+
disconnect(): Promise<void>;
|
|
106
|
+
private waitForPendingCommands;
|
|
107
|
+
getDevices(): Device[];
|
|
108
|
+
getScenes(): unknown[];
|
|
109
|
+
getNode(nodeId: string): NodeConfig | undefined;
|
|
110
|
+
private log;
|
|
111
|
+
private flushPending;
|
|
112
|
+
}
|
|
113
|
+
export default LightController;
|
|
114
|
+
//# sourceMappingURL=lightControl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lightControl.d.ts","sourceRoot":"","sources":["../src/lightControl.ts"],"names":[],"mappings":"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"}
|