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
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|