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.
Files changed (97) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +374 -0
  3. package/dist/__tests__/autoCct.test.d.ts +2 -0
  4. package/dist/__tests__/autoCct.test.d.ts.map +1 -0
  5. package/dist/__tests__/autoCct.test.js +65 -0
  6. package/dist/__tests__/autoCct.test.js.map +1 -0
  7. package/dist/__tests__/cctUtil.test.d.ts +2 -0
  8. package/dist/__tests__/cctUtil.test.d.ts.map +1 -0
  9. package/dist/__tests__/cctUtil.test.js +195 -0
  10. package/dist/__tests__/cctUtil.test.js.map +1 -0
  11. package/dist/__tests__/cli.smoke.test.d.ts +2 -0
  12. package/dist/__tests__/cli.smoke.test.d.ts.map +1 -0
  13. package/dist/__tests__/cli.smoke.test.js +18 -0
  14. package/dist/__tests__/cli.smoke.test.js.map +1 -0
  15. package/dist/__tests__/intensityApi.test.d.ts +2 -0
  16. package/dist/__tests__/intensityApi.test.d.ts.map +1 -0
  17. package/dist/__tests__/intensityApi.test.js +105 -0
  18. package/dist/__tests__/intensityApi.test.js.map +1 -0
  19. package/dist/__tests__/lightControl.test.d.ts +2 -0
  20. package/dist/__tests__/lightControl.test.d.ts.map +1 -0
  21. package/dist/__tests__/lightControl.test.js +185 -0
  22. package/dist/__tests__/lightControl.test.js.map +1 -0
  23. package/dist/cctUtil.d.ts +26 -0
  24. package/dist/cctUtil.d.ts.map +1 -0
  25. package/dist/cctUtil.js +93 -0
  26. package/dist/cctUtil.js.map +1 -0
  27. package/dist/cli.d.ts +10 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +274 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/commands/autoCct.d.ts +5 -0
  32. package/dist/commands/autoCct.d.ts.map +1 -0
  33. package/dist/commands/autoCct.js +270 -0
  34. package/dist/commands/autoCct.js.map +1 -0
  35. package/dist/commands/cct.d.ts +5 -0
  36. package/dist/commands/cct.d.ts.map +1 -0
  37. package/dist/commands/cct.js +68 -0
  38. package/dist/commands/cct.js.map +1 -0
  39. package/dist/commands/color.d.ts +5 -0
  40. package/dist/commands/color.d.ts.map +1 -0
  41. package/dist/commands/color.js +63 -0
  42. package/dist/commands/color.js.map +1 -0
  43. package/dist/commands/discover.d.ts +5 -0
  44. package/dist/commands/discover.d.ts.map +1 -0
  45. package/dist/commands/discover.js +30 -0
  46. package/dist/commands/discover.js.map +1 -0
  47. package/dist/commands/hsi.d.ts +5 -0
  48. package/dist/commands/hsi.d.ts.map +1 -0
  49. package/dist/commands/hsi.js +65 -0
  50. package/dist/commands/hsi.js.map +1 -0
  51. package/dist/commands/intensity.d.ts +5 -0
  52. package/dist/commands/intensity.d.ts.map +1 -0
  53. package/dist/commands/intensity.js +56 -0
  54. package/dist/commands/intensity.js.map +1 -0
  55. package/dist/commands/list.d.ts +5 -0
  56. package/dist/commands/list.d.ts.map +1 -0
  57. package/dist/commands/list.js +36 -0
  58. package/dist/commands/list.js.map +1 -0
  59. package/dist/commands/power.d.ts +5 -0
  60. package/dist/commands/power.d.ts.map +1 -0
  61. package/dist/commands/power.js +126 -0
  62. package/dist/commands/power.js.map +1 -0
  63. package/dist/commands/schedule.d.ts +5 -0
  64. package/dist/commands/schedule.d.ts.map +1 -0
  65. package/dist/commands/schedule.js +188 -0
  66. package/dist/commands/schedule.js.map +1 -0
  67. package/dist/commands/service.d.ts +5 -0
  68. package/dist/commands/service.d.ts.map +1 -0
  69. package/dist/commands/service.js +350 -0
  70. package/dist/commands/service.js.map +1 -0
  71. package/dist/commands/status.d.ts +5 -0
  72. package/dist/commands/status.d.ts.map +1 -0
  73. package/dist/commands/status.js +54 -0
  74. package/dist/commands/status.js.map +1 -0
  75. package/dist/commands.d.ts +5 -0
  76. package/dist/commands.d.ts.map +1 -0
  77. package/dist/commands.js +31 -0
  78. package/dist/commands.js.map +1 -0
  79. package/dist/discovery.d.ts +13 -0
  80. package/dist/discovery.d.ts.map +1 -0
  81. package/dist/discovery.js +130 -0
  82. package/dist/discovery.js.map +1 -0
  83. package/dist/geoipUtil.d.ts +8 -0
  84. package/dist/geoipUtil.d.ts.map +1 -0
  85. package/dist/geoipUtil.js +26 -0
  86. package/dist/geoipUtil.js.map +1 -0
  87. package/dist/lightControl.d.ts +114 -0
  88. package/dist/lightControl.d.ts.map +1 -0
  89. package/dist/lightControl.js +385 -0
  90. package/dist/lightControl.js.map +1 -0
  91. package/dist/types.d.ts +37 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +3 -0
  94. package/dist/types.js.map +1 -0
  95. package/package.json +75 -0
  96. package/scripts/create-launchd-service.sh +114 -0
  97. package/scripts/run-auto-cct.sh +43 -0
package/dist/cli.js ADDED
@@ -0,0 +1,274 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.program = void 0;
41
+ exports.createController = createController;
42
+ exports.findDevice = findDevice;
43
+ exports.asyncCommand = asyncCommand;
44
+ const fs = __importStar(require("node:fs"));
45
+ const path = __importStar(require("node:path"));
46
+ const chalk_1 = __importDefault(require("chalk"));
47
+ const commander_1 = require("commander");
48
+ const commands_1 = __importDefault(require("./commands"));
49
+ const discovery_1 = require("./discovery");
50
+ const lightControl_1 = __importDefault(require("./lightControl"));
51
+ const program = new commander_1.Command();
52
+ exports.program = program;
53
+ // Configuration file path
54
+ const configPath = path.join(process.env.HOME || '', '.amaran-cli.json');
55
+ // Load configuration
56
+ function loadConfig() {
57
+ try {
58
+ if (fs.existsSync(configPath)) {
59
+ const configData = fs.readFileSync(configPath, 'utf8');
60
+ return JSON.parse(configData);
61
+ }
62
+ return null;
63
+ }
64
+ catch (_error) {
65
+ console.warn(chalk_1.default.yellow('Warning: Could not load config file'));
66
+ return null;
67
+ }
68
+ }
69
+ // Save configuration
70
+ function saveConfig(config) {
71
+ try {
72
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
73
+ console.log(chalk_1.default.green('Configuration saved successfully'));
74
+ }
75
+ catch (error) {
76
+ console.error(chalk_1.default.red('Error saving configuration:'), error);
77
+ }
78
+ }
79
+ function saveWsUrl(url) {
80
+ const current = loadConfig() || {};
81
+ current.wsUrl = url;
82
+ saveConfig(current);
83
+ }
84
+ // Create light controller with connection handling
85
+ async function createController(wsUrl, clientId, debug) {
86
+ const config = loadConfig();
87
+ let url = wsUrl || config?.wsUrl;
88
+ const id = clientId || config?.clientId || 'amaran-cli';
89
+ const debugMode = debug !== undefined ? debug : config?.debug || false;
90
+ const connectWithUrl = (candidateUrl) => {
91
+ return new Promise((resolve, reject) => {
92
+ const timeout = setTimeout(() => {
93
+ reject(new Error('Connection timeout'));
94
+ }, 8000);
95
+ const controller = new lightControl_1.default(candidateUrl, id, undefined, debugMode);
96
+ // Resolve once we have a device list back (works even if zero devices)
97
+ controller.getDeviceList((success, message) => {
98
+ clearTimeout(timeout);
99
+ if (!success) {
100
+ reject(new Error(message || 'Failed to fetch device list'));
101
+ return;
102
+ }
103
+ if (debugMode) {
104
+ console.log(chalk_1.default.green('✓ Connected (device list received)'));
105
+ }
106
+ resolve(controller);
107
+ });
108
+ });
109
+ };
110
+ // If no URL is known, try discovery first and persist
111
+ if (!url) {
112
+ const found = await (0, discovery_1.discoverLocalWebSocket)('127.0.0.1', debugMode);
113
+ if (found) {
114
+ url = found.url;
115
+ if (debugMode) {
116
+ console.log(chalk_1.default.green(`✓ Discovered WebSocket at ${url} (process: ${found.process})`));
117
+ }
118
+ saveWsUrl(url);
119
+ }
120
+ else {
121
+ url = 'ws://localhost:60124';
122
+ if (debugMode) {
123
+ console.log(chalk_1.default.yellow(`⚠︎ Discovery failed, falling back to ${url}`));
124
+ }
125
+ }
126
+ }
127
+ // Try to connect; on failure, discover, persist, and retry once
128
+ try {
129
+ return await connectWithUrl(url);
130
+ }
131
+ catch (e) {
132
+ if (debugMode) {
133
+ console.log(chalk_1.default.yellow(`Initial connection to ${url} failed; attempting discovery...`));
134
+ }
135
+ const found = await (0, discovery_1.discoverLocalWebSocket)('127.0.0.1', debugMode);
136
+ if (found) {
137
+ if (debugMode) {
138
+ console.log(chalk_1.default.green(`✓ Discovered fallback WebSocket at ${found.url}`));
139
+ }
140
+ saveWsUrl(found.url);
141
+ return await connectWithUrl(found.url);
142
+ }
143
+ throw e;
144
+ }
145
+ }
146
+ // Helper function to handle async commands
147
+ function asyncCommand(fn) {
148
+ return (...args) => {
149
+ return fn(...args).catch((error) => {
150
+ console.error(chalk_1.default.red('Error:'), error.message);
151
+ process.exit(1);
152
+ });
153
+ };
154
+ }
155
+ // Helper function to find device by name or ID
156
+ function findDevice(controller, deviceQuery) {
157
+ const devices = controller.getDevices();
158
+ // Try to find by exact ID first
159
+ let device = devices.find((d) => d.node_id === deviceQuery || d.id === deviceQuery);
160
+ // If not found, try to find by name (case insensitive)
161
+ if (!device) {
162
+ const q = deviceQuery.toLowerCase();
163
+ device = devices.find((d) => {
164
+ const nm = (d.device_name || d.name || '').toLowerCase();
165
+ return nm.includes(q);
166
+ });
167
+ }
168
+ return device || null;
169
+ }
170
+ // Main CLI setup
171
+ program
172
+ .name('amaran-cli')
173
+ .description('Command line tool for controlling Aputure Amaran lights')
174
+ .version('1.0.1');
175
+ // Configuration command
176
+ program
177
+ .command('config')
178
+ .description('Configure WebSocket URL and other settings')
179
+ .option('-u, --url <url>', 'WebSocket URL (default: ws://localhost:60124)')
180
+ .option('-c, --client-id <id>', 'Client ID (default: amaran-cli)')
181
+ .option('-d, --debug', 'Enable debug mode')
182
+ .option('--lat <latitude>', 'Default latitude for auto-cct (overrides geoip)')
183
+ .option('--lon <longitude>', 'Default longitude for auto-cct (overrides geoip)')
184
+ .option('--cct-min <kelvin>', 'Minimum CCT for auto-cct in Kelvin (default: 2000)')
185
+ .option('--cct-max <kelvin>', 'Maximum CCT for auto-cct in Kelvin (default: 6500)')
186
+ .option('--intensity-min <percent>', 'Minimum intensity for auto-cct in percent (default: 5)')
187
+ .option('--intensity-max <percent>', 'Maximum intensity for auto-cct in percent (default: 100)')
188
+ .option('--show', 'Show current configuration')
189
+ .action((options) => {
190
+ if (options.show) {
191
+ const config = loadConfig();
192
+ console.log(chalk_1.default.blue('Current configuration:'));
193
+ console.log(JSON.stringify(config, null, 2));
194
+ return;
195
+ }
196
+ const config = loadConfig() || {};
197
+ if (options.url)
198
+ config.wsUrl = options.url;
199
+ if (options.clientId)
200
+ config.clientId = options.clientId;
201
+ if (options.debug !== undefined)
202
+ config.debug = options.debug;
203
+ if (options.lat !== undefined) {
204
+ const lat = parseFloat(options.lat);
205
+ if (Number.isNaN(lat) || lat < -90 || lat > 90) {
206
+ console.error(chalk_1.default.red('Latitude must be between -90 and 90'));
207
+ process.exit(1);
208
+ }
209
+ config.latitude = lat;
210
+ }
211
+ if (options.lon !== undefined) {
212
+ const lon = parseFloat(options.lon);
213
+ if (Number.isNaN(lon) || lon < -180 || lon > 180) {
214
+ console.error(chalk_1.default.red('Longitude must be between -180 and 180'));
215
+ process.exit(1);
216
+ }
217
+ config.longitude = lon;
218
+ }
219
+ // Bounds validation helpers
220
+ const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
221
+ if (options.cctMin !== undefined) {
222
+ const k = parseInt(options.cctMin, 10);
223
+ if (Number.isNaN(k)) {
224
+ console.error(chalk_1.default.red('cct-min must be a number (Kelvin)'));
225
+ process.exit(1);
226
+ }
227
+ config.cctMin = clamp(k, 1000, 20000);
228
+ }
229
+ if (options.cctMax !== undefined) {
230
+ const k = parseInt(options.cctMax, 10);
231
+ if (Number.isNaN(k)) {
232
+ console.error(chalk_1.default.red('cct-max must be a number (Kelvin)'));
233
+ process.exit(1);
234
+ }
235
+ config.cctMax = clamp(k, 1000, 20000);
236
+ }
237
+ if (options.intensityMin !== undefined) {
238
+ const p = parseFloat(options.intensityMin);
239
+ if (Number.isNaN(p)) {
240
+ console.error(chalk_1.default.red('intensity-min must be a number (percent)'));
241
+ process.exit(1);
242
+ }
243
+ config.intensityMin = clamp(p, 0, 100);
244
+ }
245
+ if (options.intensityMax !== undefined) {
246
+ const p = parseFloat(options.intensityMax);
247
+ if (Number.isNaN(p)) {
248
+ console.error(chalk_1.default.red('intensity-max must be a number (percent)'));
249
+ process.exit(1);
250
+ }
251
+ config.intensityMax = clamp(p, 0, 100);
252
+ }
253
+ // Ensure logical ordering if both sides provided
254
+ if (config.cctMin !== undefined &&
255
+ config.cctMax !== undefined &&
256
+ config.cctMin > config.cctMax) {
257
+ console.error(chalk_1.default.red('cct-min must be <= cct-max'));
258
+ process.exit(1);
259
+ }
260
+ if (config.intensityMin !== undefined &&
261
+ config.intensityMax !== undefined &&
262
+ config.intensityMin > config.intensityMax) {
263
+ console.error(chalk_1.default.red('intensity-min must be <= intensity-max'));
264
+ process.exit(1);
265
+ }
266
+ saveConfig(config);
267
+ });
268
+ // Register all commands
269
+ (0, commands_1.default)(program, { createController, findDevice, asyncCommand, saveWsUrl, loadConfig });
270
+ // If this file is run directly, parse the arguments
271
+ if (require.main === module) {
272
+ program.parse();
273
+ }
274
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from 'commander';
2
+ import type { CommandDeps } from '../types';
3
+ export declare function registerAutoCct(program: Command, deps: CommandDeps): void;
4
+ export default registerAutoCct;
5
+ //# sourceMappingURL=autoCct.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoCct.d.ts","sourceRoot":"","sources":["../../src/commands/autoCct.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QA6RlE;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerAutoCct = registerAutoCct;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ function registerAutoCct(program, deps) {
42
+ const { createController, asyncCommand, loadConfig } = deps;
43
+ program
44
+ .command('auto-cct')
45
+ .description('Set CCT for all lights based on current location and time (geoip)')
46
+ .option('-u, --url <url>', 'WebSocket URL')
47
+ .option('-c, --client-id <id>', 'Client ID')
48
+ .option('-d, --debug', 'Enable debug mode')
49
+ .option('--ip <ip>', 'Override IP address for geoip lookup')
50
+ .option('--lat <latitude>', 'Manual latitude (-90 to 90)')
51
+ .option('--lon <longitude>', 'Manual longitude (-180 to 180)')
52
+ .option('--time <time>', 'Manual time (ISO 8601 format, e.g., 2025-10-26T14:30:00)')
53
+ .action(asyncCommand(async (...args) => {
54
+ const optionsRaw = (args[0] ?? {});
55
+ const { getLocationFromIP } = await Promise.resolve().then(() => __importStar(require('../geoipUtil')));
56
+ const { calculateCCT } = await Promise.resolve().then(() => __importStar(require('../cctUtil')));
57
+ const options = optionsRaw;
58
+ const controller = await createController(options.url, options.clientId, options.debug);
59
+ let lat;
60
+ let lon;
61
+ let time = new Date();
62
+ let source = '';
63
+ if (options.time) {
64
+ time = new Date(options.time);
65
+ if (Number.isNaN(time.getTime())) {
66
+ console.error(chalk_1.default.red('Invalid time format. Use ISO 8601 format (e.g., 2025-10-26T14:30:00)'));
67
+ process.exit(1);
68
+ }
69
+ }
70
+ if (options.lat !== undefined && options.lon !== undefined) {
71
+ lat = parseFloat(options.lat);
72
+ lon = parseFloat(options.lon);
73
+ if (Number.isNaN(lat) || lat < -90 || lat > 90) {
74
+ console.error(chalk_1.default.red('Latitude must be between -90 and 90'));
75
+ process.exit(1);
76
+ }
77
+ if (Number.isNaN(lon) || lon < -180 || lon > 180) {
78
+ console.error(chalk_1.default.red('Longitude must be between -180 and 180'));
79
+ process.exit(1);
80
+ }
81
+ source = 'manual';
82
+ }
83
+ else if (loadConfig) {
84
+ const config = loadConfig();
85
+ if (config) {
86
+ const storedLat = config.latitude;
87
+ const storedLon = config.longitude;
88
+ if (typeof storedLat === 'number' && typeof storedLon === 'number') {
89
+ lat = storedLat;
90
+ lon = storedLon;
91
+ source = 'config';
92
+ }
93
+ }
94
+ }
95
+ if (lat === undefined || lon === undefined) {
96
+ let ip = options.ip;
97
+ if (!ip) {
98
+ try {
99
+ const res = await fetch('https://api.ipify.org?format=json');
100
+ const data = await res.json();
101
+ ip = data.ip;
102
+ }
103
+ catch (_err) {
104
+ ip = '127.0.0.1';
105
+ }
106
+ }
107
+ const location = getLocationFromIP(ip);
108
+ if (!location || !location.ll) {
109
+ console.error(chalk_1.default.red('Could not determine location from IP. Use --lat and --lon to specify manually, or set defaults with: amaran config --lat <lat> --lon <lon>'));
110
+ process.exit(1);
111
+ }
112
+ [lat, lon] = location.ll;
113
+ source = `geoip (${ip})`;
114
+ }
115
+ // Load optional bounds from config; fall back to built-in defaults for auto-cct
116
+ const cfg = (typeof loadConfig === 'function' ? (loadConfig() ?? {}) : {});
117
+ const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
118
+ const minKRaw = cfg.cctMin;
119
+ const maxKRaw = cfg.cctMax;
120
+ const minKCfg = typeof minKRaw === 'number' ? minKRaw : undefined;
121
+ const maxKCfg = typeof maxKRaw === 'number' ? maxKRaw : undefined;
122
+ const loK = minKCfg !== undefined ? clamp(minKCfg, 1000, 20000) : 2000;
123
+ const hiK = maxKCfg !== undefined ? clamp(maxKCfg, 1000, 20000) : 6500;
124
+ // For auto-cct defaults: use 5–100% if not configured
125
+ const minPctRaw = cfg.intensityMin;
126
+ const maxPctRaw = cfg.intensityMax;
127
+ const minPctCfg = typeof minPctRaw === 'number' ? minPctRaw : 5;
128
+ const maxPctCfg = typeof maxPctRaw === 'number' ? maxPctRaw : 100;
129
+ const loPct = clamp(Math.min(minPctCfg, maxPctCfg), 0, 100);
130
+ const hiPct = clamp(Math.max(minPctCfg, maxPctCfg), 0, 100);
131
+ const result = calculateCCT(lat, lon, time, {
132
+ cctMinK: Math.min(loK, hiK),
133
+ cctMaxK: Math.max(loK, hiK),
134
+ intensityMinPct: loPct,
135
+ intensityMaxPct: hiPct,
136
+ });
137
+ const percent = Math.round((result.intensity / 10) * 10) / 10;
138
+ console.log(chalk_1.default.blue(`Setting CCT to ${result.cct}K at ${percent}% for active lights`));
139
+ console.log(chalk_1.default.gray(` Location: ${lat.toFixed(4)}, ${lon.toFixed(4)} (${source})`));
140
+ console.log(chalk_1.default.gray(` Time: ${time.toISOString()}`));
141
+ const devices = controller.getDevices?.() ?? [];
142
+ const lightPattern = /^[A-Z0-9]+-[A-Z0-9]+$/i;
143
+ const lightDevices = devices.filter((device) => {
144
+ if (!device || typeof device !== 'object') {
145
+ return false;
146
+ }
147
+ const candidate = device;
148
+ return typeof candidate.node_id === 'string' && lightPattern.test(candidate.node_id);
149
+ });
150
+ if (lightDevices.length === 0) {
151
+ console.log(chalk_1.default.yellow('No light devices found; skipping auto CCT update.'));
152
+ await controller.disconnect();
153
+ return;
154
+ }
155
+ const waitMs = 250;
156
+ const offDevices = [];
157
+ const activeDevices = [];
158
+ const hasSleep = (o) => typeof o === 'object' && o !== null && 'sleep' in o;
159
+ const getSleepStatus = async (nodeId) => {
160
+ return new Promise((resolve) => {
161
+ let settled = false;
162
+ const timeout = setTimeout(() => {
163
+ if (!settled) {
164
+ settled = true;
165
+ resolve(undefined);
166
+ }
167
+ }, 3000);
168
+ controller.getLightSleepStatus?.(nodeId, (success, _message, data) => {
169
+ if (settled)
170
+ return;
171
+ settled = true;
172
+ clearTimeout(timeout);
173
+ if (!success) {
174
+ resolve(undefined);
175
+ return;
176
+ }
177
+ // Normalize various possible representations of sleep state
178
+ if (data) {
179
+ // Direct sleep field
180
+ if (hasSleep(data)) {
181
+ const v = data.sleep;
182
+ if (typeof v === 'boolean') {
183
+ resolve(v);
184
+ return;
185
+ }
186
+ if (typeof v === 'number') {
187
+ resolve(v !== 0);
188
+ return;
189
+ }
190
+ if (typeof v === 'string') {
191
+ const s = v.trim().toLowerCase();
192
+ resolve(s === 'true' || s === '1' || s === 'on' || s === 'sleep');
193
+ return;
194
+ }
195
+ }
196
+ // Server may return { data: boolean }
197
+ const inner = data.data;
198
+ if (typeof inner === 'boolean') {
199
+ resolve(inner);
200
+ return;
201
+ }
202
+ if (typeof inner === 'number') {
203
+ resolve(inner !== 0);
204
+ return;
205
+ }
206
+ if (typeof inner === 'string') {
207
+ const s = inner.trim().toLowerCase();
208
+ resolve(s === 'true' || s === '1' || s === 'on' || s === 'sleep');
209
+ return;
210
+ }
211
+ if (hasSleep(inner)) {
212
+ const v = inner.sleep;
213
+ if (typeof v === 'boolean') {
214
+ resolve(v);
215
+ return;
216
+ }
217
+ if (typeof v === 'number') {
218
+ resolve(v !== 0);
219
+ return;
220
+ }
221
+ if (typeof v === 'string') {
222
+ const s = v.trim().toLowerCase();
223
+ resolve(s === 'true' || s === '1' || s === 'on' || s === 'sleep');
224
+ return;
225
+ }
226
+ }
227
+ }
228
+ resolve(undefined);
229
+ });
230
+ });
231
+ };
232
+ for (const device of lightDevices) {
233
+ const nodeId = device.node_id;
234
+ const sleep = await getSleepStatus(nodeId);
235
+ if (sleep === false) {
236
+ activeDevices.push(device);
237
+ }
238
+ else {
239
+ offDevices.push(device);
240
+ }
241
+ }
242
+ if (activeDevices.length === 0) {
243
+ console.log(chalk_1.default.yellow('All discovered lights are off; nothing to update.'));
244
+ if (offDevices.length > 0) {
245
+ console.log(chalk_1.default.gray(` Skipped ${offDevices.length} light(s) to avoid turning them on.`));
246
+ }
247
+ await controller.disconnect();
248
+ return;
249
+ }
250
+ console.log(chalk_1.default.gray(` Updating ${activeDevices.length} light(s)${offDevices.length ? `, skipped ${offDevices.length} off light(s)` : ''}`));
251
+ for (let i = 0; i < activeDevices.length; i++) {
252
+ const device = activeDevices[i];
253
+ const displayName = typeof device.device_name === 'string'
254
+ ? device.device_name
255
+ : typeof device.name === 'string'
256
+ ? device.name
257
+ : typeof device.id === 'string'
258
+ ? device.id
259
+ : device.node_id;
260
+ console.log(` Setting ${displayName} (${device.node_id}) to ${result.cct}K at ${percent}%`);
261
+ controller.setCCT(device.node_id, result.cct, result.intensity);
262
+ if (i < activeDevices.length - 1) {
263
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
264
+ }
265
+ }
266
+ await controller.disconnect();
267
+ }));
268
+ }
269
+ exports.default = registerAutoCct;
270
+ //# sourceMappingURL=autoCct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoCct.js","sourceRoot":"","sources":["../../src/commands/autoCct.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from 'commander';
2
+ import type { CommandDeps } from '../types';
3
+ export declare function registerCct(program: Command, deps: CommandDeps): void;
4
+ export default registerCct;
5
+ //# sourceMappingURL=cct.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cct.d.ts","sourceRoot":"","sources":["../../src/commands/cct.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,UAAU,CAAC;AAE5D,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAgF9D;AAED,eAAe,WAAW,CAAC"}