amaran-light-cli 1.5.0 → 1.7.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/README.md +87 -0
- package/dist/__tests__/autoCctMaxLux.test.d.ts +2 -0
- package/dist/__tests__/autoCctMaxLux.test.d.ts.map +1 -0
- package/dist/__tests__/autoCctMaxLux.test.js +153 -0
- package/dist/__tests__/autoCctMaxLux.test.js.map +1 -0
- package/dist/__tests__/cctUtil.test.js +63 -1
- package/dist/__tests__/cctUtil.test.js.map +1 -1
- package/dist/__tests__/configMaxLux.test.d.ts +2 -0
- package/dist/__tests__/configMaxLux.test.d.ts.map +1 -0
- package/dist/__tests__/configMaxLux.test.js +43 -0
- package/dist/__tests__/configMaxLux.test.js.map +1 -0
- package/dist/__tests__/lightControl.test.js +259 -0
- package/dist/__tests__/lightControl.test.js.map +1 -1
- package/dist/__tests__/maxLuxInterpolation.test.d.ts +2 -0
- package/dist/__tests__/maxLuxInterpolation.test.d.ts.map +1 -0
- package/dist/__tests__/maxLuxInterpolation.test.js +96 -0
- package/dist/__tests__/maxLuxInterpolation.test.js.map +1 -0
- package/dist/__tests__/weatherPhysics.test.d.ts +2 -0
- package/dist/__tests__/weatherPhysics.test.d.ts.map +1 -0
- package/dist/__tests__/weatherPhysics.test.js +72 -0
- package/dist/__tests__/weatherPhysics.test.js.map +1 -0
- package/dist/commands/__tests__/newCommands.test.d.ts +2 -0
- package/dist/commands/__tests__/newCommands.test.d.ts.map +1 -0
- package/dist/commands/__tests__/newCommands.test.js +195 -0
- package/dist/commands/__tests__/newCommands.test.js.map +1 -0
- package/dist/commands/daylightSimulation/autoCct.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/autoCct.js +66 -4
- package/dist/commands/daylightSimulation/autoCct.js.map +1 -1
- package/dist/commands/daylightSimulation/graphSchedule.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/graphSchedule.js +7 -2
- package/dist/commands/daylightSimulation/graphSchedule.js.map +1 -1
- package/dist/commands/daylightSimulation/printSchedule.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/printSchedule.js +6 -1
- package/dist/commands/daylightSimulation/printSchedule.js.map +1 -1
- package/dist/commands/daylightSimulation/simulateSchedule.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/simulateSchedule.js +6 -1
- package/dist/commands/daylightSimulation/simulateSchedule.js.map +1 -1
- package/dist/commands/deviceControl/config.d.ts.map +1 -1
- package/dist/commands/deviceControl/config.js +27 -0
- package/dist/commands/deviceControl/config.js.map +1 -1
- package/dist/commands/deviceControl/effect.d.ts +5 -0
- package/dist/commands/deviceControl/effect.d.ts.map +1 -0
- package/dist/commands/deviceControl/effect.js +172 -0
- package/dist/commands/deviceControl/effect.js.map +1 -0
- package/dist/commands/deviceControl/fan.d.ts +5 -0
- package/dist/commands/deviceControl/fan.d.ts.map +1 -0
- package/dist/commands/deviceControl/fan.js +105 -0
- package/dist/commands/deviceControl/fan.js.map +1 -0
- package/dist/commands/deviceControl/firmware.d.ts +5 -0
- package/dist/commands/deviceControl/firmware.d.ts.map +1 -0
- package/dist/commands/deviceControl/firmware.js +68 -0
- package/dist/commands/deviceControl/firmware.js.map +1 -0
- package/dist/commands/deviceControl/group.d.ts +5 -0
- package/dist/commands/deviceControl/group.d.ts.map +1 -0
- package/dist/commands/deviceControl/group.js +101 -0
- package/dist/commands/deviceControl/group.js.map +1 -0
- package/dist/commands/deviceControl/info.d.ts +5 -0
- package/dist/commands/deviceControl/info.d.ts.map +1 -0
- package/dist/commands/deviceControl/info.js +57 -0
- package/dist/commands/deviceControl/info.js.map +1 -0
- package/dist/commands/deviceControl/preset.d.ts +5 -0
- package/dist/commands/deviceControl/preset.d.ts.map +1 -0
- package/dist/commands/deviceControl/preset.js +55 -0
- package/dist/commands/deviceControl/preset.js.map +1 -0
- package/dist/commands/deviceControl/quickshot.d.ts +5 -0
- package/dist/commands/deviceControl/quickshot.d.ts.map +1 -0
- package/dist/commands/deviceControl/quickshot.js +51 -0
- package/dist/commands/deviceControl/quickshot.js.map +1 -0
- package/dist/commands/deviceControl/scene.d.ts +5 -0
- package/dist/commands/deviceControl/scene.d.ts.map +1 -0
- package/dist/commands/deviceControl/scene.js +101 -0
- package/dist/commands/deviceControl/scene.js.map +1 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +17 -0
- package/dist/commands.js.map +1 -1
- package/dist/daylightSimulation/cctUtil.d.ts +2 -2
- package/dist/daylightSimulation/cctUtil.d.ts.map +1 -1
- package/dist/daylightSimulation/cctUtil.js +98 -28
- package/dist/daylightSimulation/cctUtil.js.map +1 -1
- package/dist/daylightSimulation/constants.d.ts +3 -1
- package/dist/daylightSimulation/constants.d.ts.map +1 -1
- package/dist/daylightSimulation/constants.js +3 -1
- package/dist/daylightSimulation/constants.js.map +1 -1
- package/dist/daylightSimulation/curves/realistic.d.ts +7 -6
- package/dist/daylightSimulation/curves/realistic.d.ts.map +1 -1
- package/dist/daylightSimulation/curves/realistic.js +42 -18
- package/dist/daylightSimulation/curves/realistic.js.map +1 -1
- package/dist/daylightSimulation/graphSchedule.d.ts +1 -1
- package/dist/daylightSimulation/graphSchedule.d.ts.map +1 -1
- package/dist/daylightSimulation/graphSchedule.js +27 -5
- package/dist/daylightSimulation/graphSchedule.js.map +1 -1
- package/dist/daylightSimulation/mathUtil.d.ts +13 -0
- package/dist/daylightSimulation/mathUtil.d.ts.map +1 -0
- package/dist/daylightSimulation/mathUtil.js +54 -0
- package/dist/daylightSimulation/mathUtil.js.map +1 -0
- package/dist/daylightSimulation/scheduleMaker.d.ts +4 -5
- package/dist/daylightSimulation/scheduleMaker.d.ts.map +1 -1
- package/dist/daylightSimulation/scheduleMaker.js +8 -0
- package/dist/daylightSimulation/scheduleMaker.js.map +1 -1
- package/dist/daylightSimulation/textSchedule.d.ts.map +1 -1
- package/dist/daylightSimulation/textSchedule.js +2 -2
- package/dist/daylightSimulation/textSchedule.js.map +1 -1
- package/dist/daylightSimulation/types.d.ts +6 -0
- package/dist/daylightSimulation/types.d.ts.map +1 -1
- package/dist/daylightSimulation/types.js.map +1 -1
- package/dist/deviceControl/discovery.d.ts.map +1 -1
- package/dist/deviceControl/discovery.js +0 -2
- package/dist/deviceControl/discovery.js.map +1 -1
- package/dist/deviceControl/lightControl.d.ts +67 -78
- package/dist/deviceControl/lightControl.d.ts.map +1 -1
- package/dist/deviceControl/lightControl.js +292 -203
- package/dist/deviceControl/lightControl.js.map +1 -1
- package/dist/deviceControl/types.d.ts +19 -0
- package/dist/deviceControl/types.d.ts.map +1 -1
- package/dist/test/MockLightServer.d.ts.map +1 -1
- package/dist/test/MockLightServer.js +134 -12
- package/dist/test/MockLightServer.js.map +1 -1
- package/package.json +8 -7
- package/scripts/extract-api.ts +158 -0
- package/scripts/extract-usage.ts +199 -0
- package/scripts/release.js +9 -9
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { addStandardOptions, runDeviceAction } from '../cmdUtils.js';
|
|
3
|
+
export function registerInfo(program, deps) {
|
|
4
|
+
const { asyncCommand } = deps;
|
|
5
|
+
const info = program.command('info').description('Get detailed device info');
|
|
6
|
+
addStandardOptions(info.command('device <device>').description('Get device hardware/firmware info')).action(asyncCommand(handleDeviceInfo(deps)));
|
|
7
|
+
addStandardOptions(info.command('protocol').description('Get supported protocol versions')).action(asyncCommand(handleProtocolInfo(deps)));
|
|
8
|
+
}
|
|
9
|
+
function handleDeviceInfo(deps) {
|
|
10
|
+
return async (deviceQuery, options) => {
|
|
11
|
+
return runDeviceAction({
|
|
12
|
+
deps,
|
|
13
|
+
options,
|
|
14
|
+
deviceQuery,
|
|
15
|
+
actionName: 'get device info',
|
|
16
|
+
}, (device, controller) => {
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const nodeId = device.node_id;
|
|
19
|
+
// Parallel requests? Or sequential. Sequential is safer.
|
|
20
|
+
controller.getDeviceInfo(nodeId, (success, message, info) => {
|
|
21
|
+
if (success) {
|
|
22
|
+
controller.getFirmwareVersion(nodeId, (fwSuccess, _, fwInfo) => {
|
|
23
|
+
const displayName = device.device_name || device.name || 'Unknown';
|
|
24
|
+
console.log(chalk.blue(`Information for ${displayName}:`));
|
|
25
|
+
console.log('Device Info:', JSON.stringify(info, null, 2));
|
|
26
|
+
if (fwSuccess) {
|
|
27
|
+
console.log('Firmware:', JSON.stringify(fwInfo, null, 2));
|
|
28
|
+
}
|
|
29
|
+
resolve();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.error(chalk.red(`✗ Failed to get device info: ${message}`));
|
|
34
|
+
resolve();
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}, () => Promise.resolve());
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function handleProtocolInfo(deps) {
|
|
42
|
+
const { createController } = deps;
|
|
43
|
+
return async (options) => {
|
|
44
|
+
const controller = await createController(options.url, options.clientId, options.debug);
|
|
45
|
+
controller.getProtocolVersions((success, message, data) => {
|
|
46
|
+
if (success) {
|
|
47
|
+
console.log(chalk.blue('Supported Protocol Versions:'), data);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
console.error(chalk.red(`Error getting protocols: ${message}`));
|
|
51
|
+
}
|
|
52
|
+
controller.disconnect();
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export default registerInfo;
|
|
57
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/info.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/preset.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,8BAA8B,CAAC;AAGxF,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAejE;AAmDD,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { addStandardOptions, runDeviceAction } from '../cmdUtils.js';
|
|
3
|
+
export function registerPreset(program, deps) {
|
|
4
|
+
const { asyncCommand } = deps;
|
|
5
|
+
const preset = program.command('preset').description('Manage and recall presets');
|
|
6
|
+
addStandardOptions(preset.command('list').description('List all available presets')).action(asyncCommand(handlePresetList(deps)));
|
|
7
|
+
addStandardOptions(preset.command('recall <device> <preset_id>').description('Recall a preset on a device')).action(asyncCommand(handlePresetRecall(deps)));
|
|
8
|
+
addStandardOptions(preset.command('set <device> <preset_id>').description('Set a preset on a device (alias for recall)')).action(asyncCommand(handlePresetRecall(deps)));
|
|
9
|
+
}
|
|
10
|
+
function handlePresetList(deps) {
|
|
11
|
+
const { createController } = deps;
|
|
12
|
+
return async (options) => {
|
|
13
|
+
const controller = await createController(options.url, options.clientId, options.debug);
|
|
14
|
+
controller.getPresetList((success, message, data) => {
|
|
15
|
+
if (success) {
|
|
16
|
+
// biome-ignore lint/suspicious/noExplicitAny: API response data structure varies
|
|
17
|
+
const presets = data.data;
|
|
18
|
+
console.log(chalk.blue('Available Presets:'));
|
|
19
|
+
console.log(JSON.stringify(presets, null, 2));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.error(chalk.red(`Error getting preset list: ${message}`));
|
|
23
|
+
}
|
|
24
|
+
controller.disconnect();
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function handlePresetRecall(deps) {
|
|
29
|
+
return async (deviceQuery, presetId, options) => {
|
|
30
|
+
return runDeviceAction({
|
|
31
|
+
deps,
|
|
32
|
+
options,
|
|
33
|
+
deviceQuery,
|
|
34
|
+
actionName: `recall preset ${presetId}`,
|
|
35
|
+
}, (device, controller) => {
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
|
+
const nodeId = device.node_id;
|
|
38
|
+
controller.recallPreset(nodeId, presetId, (success, message) => {
|
|
39
|
+
if (success) {
|
|
40
|
+
console.log(chalk.green(`✓ Preset ${presetId} recalled on ${device.device_name || 'device'}`));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.error(chalk.red(`✗ Failed to recall preset: ${message}`));
|
|
44
|
+
}
|
|
45
|
+
resolve();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}, () => {
|
|
49
|
+
console.log(chalk.yellow('Preset recall for "all" is not supported.'));
|
|
50
|
+
return Promise.resolve();
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export default registerPreset;
|
|
55
|
+
//# sourceMappingURL=preset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/preset.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { CommandDeps } from '../../deviceControl/types.js';
|
|
3
|
+
export declare function registerQuickshot(program: Command, deps: CommandDeps): void;
|
|
4
|
+
export default registerQuickshot;
|
|
5
|
+
//# sourceMappingURL=quickshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickshot.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/quickshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,8BAA8B,CAAC;AAGhF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAWpE;AA4CD,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { addStandardOptions } from '../cmdUtils.js';
|
|
3
|
+
export function registerQuickshot(program, deps) {
|
|
4
|
+
const { asyncCommand } = deps;
|
|
5
|
+
const quickshot = program.command('quickshot').description('Manage quickshots');
|
|
6
|
+
addStandardOptions(quickshot.command('list').description('List all available quickshots')).action(asyncCommand(handleQuickshotList(deps)));
|
|
7
|
+
addStandardOptions(quickshot.command('set <id>').description('Apply a quickshot')).action(asyncCommand(handleQuickshotSet(deps)));
|
|
8
|
+
}
|
|
9
|
+
function handleQuickshotList(deps) {
|
|
10
|
+
const { createController } = deps;
|
|
11
|
+
return async (options) => {
|
|
12
|
+
const controller = await createController(options.url, options.clientId, options.debug);
|
|
13
|
+
controller.getQuickshotList((success, message, data) => {
|
|
14
|
+
if (success) {
|
|
15
|
+
// biome-ignore lint/suspicious/noExplicitAny: API response data structure varies
|
|
16
|
+
const quickshots = data.data;
|
|
17
|
+
if (quickshots.length === 0) {
|
|
18
|
+
console.log(chalk.yellow('No quickshots found'));
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
console.log(chalk.blue('Quickshots:'));
|
|
22
|
+
// biome-ignore lint/suspicious/noExplicitAny: API response data structure varies
|
|
23
|
+
quickshots.forEach((qs, index) => {
|
|
24
|
+
console.log(`${index + 1}. ${chalk.green(qs.name || 'Unnamed')} (${chalk.gray(qs.id || qs.quickshot_id)})`);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.error(chalk.red(`Error getting quickshot list: ${message}`));
|
|
30
|
+
}
|
|
31
|
+
controller.disconnect();
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function handleQuickshotSet(deps) {
|
|
36
|
+
const { createController } = deps;
|
|
37
|
+
return async (id, options) => {
|
|
38
|
+
const controller = await createController(options.url, options.clientId, options.debug);
|
|
39
|
+
controller.setQuickshot(id, (success, message) => {
|
|
40
|
+
if (success) {
|
|
41
|
+
console.log(chalk.green(`Quickshot ${id} applied successfully`));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
console.error(chalk.red(`Error applying quickshot: ${message}`));
|
|
45
|
+
}
|
|
46
|
+
controller.disconnect();
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export default registerQuickshot;
|
|
51
|
+
//# sourceMappingURL=quickshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickshot.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/quickshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/scene.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,8BAA8B,CAAC;AAGhF,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAuBhE;AA+FD,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { addStandardOptions } from '../cmdUtils.js';
|
|
3
|
+
export function registerScene(program, deps) {
|
|
4
|
+
const { asyncCommand } = deps;
|
|
5
|
+
const scene = program.command('scene').description('Manage scenes');
|
|
6
|
+
addStandardOptions(scene.command('list').description('List all saved scenes')).action(asyncCommand(handleSceneList(deps)));
|
|
7
|
+
addStandardOptions(scene.command('save <name>').description('Save current state as a scene')).action(asyncCommand(handleSceneSave(deps)));
|
|
8
|
+
addStandardOptions(scene.command('recall <id>').description('Recall a saved scene')).action(asyncCommand(handleSceneRecall(deps)));
|
|
9
|
+
addStandardOptions(scene.command('delete <id>').description('Delete a scene')).action(asyncCommand(handleSceneDelete(deps)));
|
|
10
|
+
addStandardOptions(scene.command('update <id>').option('-n, --name <name>', 'New name for the scene').description('Update a scene')).action(asyncCommand(handleSceneUpdate(deps)));
|
|
11
|
+
}
|
|
12
|
+
function handleSceneList(deps) {
|
|
13
|
+
const { createController } = deps;
|
|
14
|
+
return async (options) => {
|
|
15
|
+
const controller = await createController(options.url, options.clientId, options.debug);
|
|
16
|
+
controller.getSceneList((success, message, data) => {
|
|
17
|
+
if (success) {
|
|
18
|
+
// biome-ignore lint/suspicious/noExplicitAny: API response data structure varies
|
|
19
|
+
const scenes = data.data;
|
|
20
|
+
if (scenes.length === 0) {
|
|
21
|
+
console.log(chalk.yellow('No scenes found'));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
console.log(chalk.blue('Saved Scenes:'));
|
|
25
|
+
// biome-ignore lint/suspicious/noExplicitAny: API response data structure varies
|
|
26
|
+
scenes.forEach((scene, index) => {
|
|
27
|
+
console.log(`${index + 1}. ${chalk.green(scene.name || 'Unnamed')} (${chalk.gray(scene.id || scene.scene_id)})`);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.error(chalk.red(`Error getting scene list: ${message}`));
|
|
33
|
+
}
|
|
34
|
+
controller.disconnect();
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function handleSceneSave(deps) {
|
|
39
|
+
const { createController } = deps;
|
|
40
|
+
return async (name, options) => {
|
|
41
|
+
const controller = await createController(options.url, options.clientId, options.debug);
|
|
42
|
+
controller.saveScene(name, (success, message, data) => {
|
|
43
|
+
if (success) {
|
|
44
|
+
console.log(chalk.green(`Scene "${name}" saved successfully`));
|
|
45
|
+
if (data)
|
|
46
|
+
console.log('Data:', data);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.error(chalk.red(`Error saving scene: ${message}`));
|
|
50
|
+
}
|
|
51
|
+
controller.disconnect();
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function handleSceneRecall(deps) {
|
|
56
|
+
const { createController } = deps;
|
|
57
|
+
return async (id, options) => {
|
|
58
|
+
const controller = await createController(options.url, options.clientId, options.debug);
|
|
59
|
+
controller.recallScene(id, (success, message) => {
|
|
60
|
+
if (success) {
|
|
61
|
+
console.log(chalk.green(`Scene ${id} recalled successfully`));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.error(chalk.red(`Error recalling scene: ${message}`));
|
|
65
|
+
}
|
|
66
|
+
controller.disconnect();
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function handleSceneDelete(deps) {
|
|
71
|
+
const { createController } = deps;
|
|
72
|
+
return async (id, options) => {
|
|
73
|
+
const controller = await createController(options.url, options.clientId, options.debug);
|
|
74
|
+
controller.deleteScene(id, (success, message) => {
|
|
75
|
+
if (success) {
|
|
76
|
+
console.log(chalk.green(`Scene ${id} deleted successfully`));
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.error(chalk.red(`Error deleting scene: ${message}`));
|
|
80
|
+
}
|
|
81
|
+
controller.disconnect();
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function handleSceneUpdate(deps) {
|
|
86
|
+
const { createController } = deps;
|
|
87
|
+
return async (id, options) => {
|
|
88
|
+
const controller = await createController(options.url, options.clientId, options.debug);
|
|
89
|
+
controller.updateScene(id, options.name, (success, message) => {
|
|
90
|
+
if (success) {
|
|
91
|
+
console.log(chalk.green(`Scene ${id} updated successfully`));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.error(chalk.red(`Error updating scene: ${message}`));
|
|
95
|
+
}
|
|
96
|
+
controller.disconnect();
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export default registerScene;
|
|
101
|
+
//# sourceMappingURL=scene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/scene.ts"],"names":[],"mappings":"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"}
|
package/dist/commands.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QA4BnE;AAED,eAAe,gBAAgB,CAAC"}
|
package/dist/commands.js
CHANGED
|
@@ -7,10 +7,18 @@ import registerCct from './commands/deviceControl/cct.js';
|
|
|
7
7
|
import registerColor from './commands/deviceControl/color.js';
|
|
8
8
|
import registerConfig from './commands/deviceControl/config.js';
|
|
9
9
|
import registerDiscover from './commands/deviceControl/discover.js';
|
|
10
|
+
import registerEffect from './commands/deviceControl/effect.js';
|
|
11
|
+
import registerFan from './commands/deviceControl/fan.js';
|
|
12
|
+
import registerFirmware from './commands/deviceControl/firmware.js';
|
|
13
|
+
import registerGroup from './commands/deviceControl/group.js';
|
|
10
14
|
import registerHsi from './commands/deviceControl/hsi.js';
|
|
15
|
+
import registerInfo from './commands/deviceControl/info.js';
|
|
11
16
|
import registerIntensity from './commands/deviceControl/intensity.js';
|
|
12
17
|
import registerList from './commands/deviceControl/list.js';
|
|
13
18
|
import registerPower from './commands/deviceControl/power.js';
|
|
19
|
+
import registerPreset from './commands/deviceControl/preset.js';
|
|
20
|
+
import registerQuickshot from './commands/deviceControl/quickshot.js';
|
|
21
|
+
import registerScene from './commands/deviceControl/scene.js';
|
|
14
22
|
import registerStatus from './commands/deviceControl/status.js';
|
|
15
23
|
// Expose a function to register commands on a commander program instance
|
|
16
24
|
export function registerCommands(program, deps) {
|
|
@@ -30,6 +38,15 @@ export function registerCommands(program, deps) {
|
|
|
30
38
|
registerColor(program, deps);
|
|
31
39
|
registerStatus(program, deps);
|
|
32
40
|
registerService(program, deps);
|
|
41
|
+
// New commands
|
|
42
|
+
registerScene(program, deps);
|
|
43
|
+
registerGroup(program, deps);
|
|
44
|
+
registerPreset(program, deps);
|
|
45
|
+
registerQuickshot(program, deps);
|
|
46
|
+
registerFan(program, deps);
|
|
47
|
+
registerEffect(program, deps);
|
|
48
|
+
registerInfo(program, deps);
|
|
49
|
+
registerFirmware(program, deps);
|
|
33
50
|
}
|
|
34
51
|
export default registerCommands;
|
|
35
52
|
//# sourceMappingURL=commands.js.map
|
package/dist/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,0CAA0C,CAAC;AACvE,OAAO,qBAAqB,MAAM,gDAAgD,CAAC;AACnF,OAAO,qBAAqB,MAAM,gDAAgD,CAAC;AACnF,OAAO,eAAe,MAAM,0CAA0C,CAAC;AACvE,OAAO,wBAAwB,MAAM,mDAAmD,CAAC;AACzF,OAAO,WAAW,MAAM,iCAAiC,CAAC;AAC1D,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,cAAc,MAAM,oCAAoC,CAAC;AAChE,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AACpE,OAAO,WAAW,MAAM,iCAAiC,CAAC;AAC1D,OAAO,iBAAiB,MAAM,uCAAuC,CAAC;AACtE,OAAO,YAAY,MAAM,kCAAkC,CAAC;AAC5D,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,cAAc,MAAM,oCAAoC,CAAC;AAGhE,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,IAAiB;IAClE,gCAAgC;IAChC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE9B,8BAA8B;IAC9B,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5B,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9B,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,0CAA0C,CAAC;AACvE,OAAO,qBAAqB,MAAM,gDAAgD,CAAC;AACnF,OAAO,qBAAqB,MAAM,gDAAgD,CAAC;AACnF,OAAO,eAAe,MAAM,0CAA0C,CAAC;AACvE,OAAO,wBAAwB,MAAM,mDAAmD,CAAC;AACzF,OAAO,WAAW,MAAM,iCAAiC,CAAC;AAC1D,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,cAAc,MAAM,oCAAoC,CAAC;AAChE,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AACpE,OAAO,cAAc,MAAM,oCAAoC,CAAC;AAChE,OAAO,WAAW,MAAM,iCAAiC,CAAC;AAC1D,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AACpE,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,WAAW,MAAM,iCAAiC,CAAC;AAC1D,OAAO,YAAY,MAAM,kCAAkC,CAAC;AAC5D,OAAO,iBAAiB,MAAM,uCAAuC,CAAC;AACtE,OAAO,YAAY,MAAM,kCAAkC,CAAC;AAC5D,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,cAAc,MAAM,oCAAoC,CAAC;AAChE,OAAO,iBAAiB,MAAM,uCAAuC,CAAC;AACtE,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,cAAc,MAAM,oCAAoC,CAAC;AAGhE,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,IAAiB;IAClE,gCAAgC;IAChC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE9B,8BAA8B;IAC9B,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5B,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9B,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE/B,eAAe;IACf,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9B,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3B,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9B,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5B,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getAvailableCurves, parseCurveType } from './curves/index.js';
|
|
2
|
-
import { type CCTOptions, type CCTResult, CurveType } from './types.js';
|
|
3
|
-
export { type CCTOptions, type CCTResult, CurveType, getAvailableCurves, parseCurveType };
|
|
2
|
+
import { type CCTOptions, type CCTResult, CurveType, type WeatherOptions } from './types.js';
|
|
3
|
+
export { type CCTOptions, type CCTResult, CurveType, type WeatherOptions, getAvailableCurves, parseCurveType };
|
|
4
4
|
export declare function calculateCCT(lat: number, lon: number, date?: Date, opts?: CCTOptions, curveType?: CurveType): CCTResult;
|
|
5
5
|
//# sourceMappingURL=cctUtil.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cctUtil.d.ts","sourceRoot":"","sources":["../../src/daylightSimulation/cctUtil.ts"],"names":[],"mappings":"AAKA,OAAO,EAQL,kBAAkB,EAClB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"cctUtil.d.ts","sourceRoot":"","sources":["../../src/daylightSimulation/cctUtil.ts"],"names":[],"mappings":"AAKA,OAAO,EAQL,kBAAkB,EAClB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAG7F,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC;AAmO/G,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,IAAiB,EACvB,IAAI,CAAC,EAAE,UAAU,EACjB,SAAS,GAAE,SAA0B,GACpC,SAAS,CAuBX"}
|
|
@@ -19,36 +19,45 @@ function isValidSunTimes(sunrise, sunset, solarNoon) {
|
|
|
19
19
|
/**
|
|
20
20
|
* Handle scientific curves (CIE, SUN_ALTITUDE, PEREZ) which use altitude-based calculations
|
|
21
21
|
*/
|
|
22
|
-
function calculateScientificCCT(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType, times) {
|
|
22
|
+
function calculateScientificCCT(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType, times, weather) {
|
|
23
23
|
const sunrise = times.sunrise;
|
|
24
24
|
const sunset = times.sunset;
|
|
25
25
|
const _solarNoon = times.solarNoon;
|
|
26
26
|
const nightEnd = times.nightEnd;
|
|
27
27
|
const night = times.night;
|
|
28
|
-
|
|
28
|
+
// For scientific curves, we need solarNoon to establish a daily peak for normalization.
|
|
29
|
+
// Sunrise/sunset may be missing at the poles (Polar Day/Night).
|
|
30
|
+
if (!(_solarNoon instanceof Date) || Number.isNaN(_solarNoon.getTime())) {
|
|
29
31
|
return {
|
|
30
32
|
cct: Math.round(minK),
|
|
31
33
|
intensity: Math.round(minIntensity),
|
|
34
|
+
lightOutput: 0,
|
|
32
35
|
};
|
|
33
36
|
}
|
|
34
37
|
const t = date.getTime();
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
!Number.isNaN(
|
|
40
|
-
night
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
38
|
+
// If we have valid sunrise/sunset, enforce night minimums outside of daylight hours.
|
|
39
|
+
if (sunrise instanceof Date &&
|
|
40
|
+
!Number.isNaN(sunrise.getTime()) &&
|
|
41
|
+
sunset instanceof Date &&
|
|
42
|
+
!Number.isNaN(sunset.getTime())) {
|
|
43
|
+
// For scientific curves, handle cases where nightEnd/night might not be available
|
|
44
|
+
let nightEndTime;
|
|
45
|
+
let nightStartTime;
|
|
46
|
+
if (nightEnd instanceof Date &&
|
|
47
|
+
!Number.isNaN(nightEnd.getTime()) &&
|
|
48
|
+
night instanceof Date &&
|
|
49
|
+
!Number.isNaN(night.getTime())) {
|
|
50
|
+
nightEndTime = nightEnd.getTime();
|
|
51
|
+
nightStartTime = night.getTime();
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// Edge case: no proper night configuration but has sunrise/sunset
|
|
55
|
+
nightEndTime = sunrise.getTime() - 30 * 60 * 1000;
|
|
56
|
+
nightStartTime = sunset.getTime() + 30 * 60 * 1000;
|
|
57
|
+
}
|
|
58
|
+
if (t <= nightEndTime || t >= nightStartTime) {
|
|
59
|
+
return { cct: minK, intensity: minIntensity, lightOutput: 0 };
|
|
60
|
+
}
|
|
52
61
|
}
|
|
53
62
|
const pos = getPosition(date, lat, lon);
|
|
54
63
|
const altitude = pos.altitude;
|
|
@@ -66,7 +75,7 @@ function calculateScientificCCT(lat, lon, date, minK, maxK, minIntensity, maxInt
|
|
|
66
75
|
factors = calculateRealisticPerezDaylight(altitude, maxAltitude);
|
|
67
76
|
break;
|
|
68
77
|
case CurveType.PHYSICS:
|
|
69
|
-
factors = calculateRealisticPhysicsDaylight(altitude, maxAltitude);
|
|
78
|
+
factors = calculateRealisticPhysicsDaylight(altitude, maxAltitude, weather);
|
|
70
79
|
break;
|
|
71
80
|
case CurveType.BLACKBODY:
|
|
72
81
|
factors = calculateRealisticBlackbodyDaylight(altitude, maxAltitude);
|
|
@@ -75,12 +84,13 @@ function calculateScientificCCT(lat, lon, date, minK, maxK, minIntensity, maxInt
|
|
|
75
84
|
factors = calculateRealisticHazyDaylight(altitude, maxAltitude);
|
|
76
85
|
break;
|
|
77
86
|
default:
|
|
78
|
-
factors = [0, 0];
|
|
87
|
+
factors = [0, 0, 0];
|
|
79
88
|
}
|
|
80
|
-
const [cctFactor, intensityFactor] = factors;
|
|
89
|
+
const [cctFactor, intensityFactor, rawIntensity] = factors;
|
|
81
90
|
return {
|
|
82
91
|
cct: Math.round(minK + (maxK - minK) * cctFactor),
|
|
83
92
|
intensity: Math.round(minIntensity + (maxIntensity - minIntensity) * intensityFactor),
|
|
93
|
+
lightOutput: Math.round(rawIntensity * CCT_DEFAULTS.maxLux),
|
|
84
94
|
};
|
|
85
95
|
}
|
|
86
96
|
/**
|
|
@@ -103,7 +113,7 @@ function calculateEmpiricalCCT(lat, lon, date, minK, maxK, minIntensity, maxInte
|
|
|
103
113
|
const nightStartTime = night.getTime();
|
|
104
114
|
const nightEndTime = nightEnd.getTime();
|
|
105
115
|
if (t <= nightEndTime || t >= nightStartTime) {
|
|
106
|
-
return { cct: minK, intensity: minIntensity };
|
|
116
|
+
return { cct: minK, intensity: minIntensity, lightOutput: 0 };
|
|
107
117
|
}
|
|
108
118
|
let x;
|
|
109
119
|
if (t <= noon) {
|
|
@@ -113,27 +123,45 @@ function calculateEmpiricalCCT(lat, lon, date, minK, maxK, minIntensity, maxInte
|
|
|
113
123
|
x = 0.5 + ((t - noon) / (nightStartTime - noon)) * 0.5;
|
|
114
124
|
}
|
|
115
125
|
const f = curve(x);
|
|
126
|
+
// For empirical curves, we don't have a physical model, but we can estimate
|
|
127
|
+
// light output based on the curve factor and the max potential lux.
|
|
128
|
+
// We scale it by sin(altitude) if available to give some seasonal variation.
|
|
129
|
+
let luxEstimate = f * CCT_DEFAULTS.maxLux;
|
|
130
|
+
try {
|
|
131
|
+
const pos = getPosition(date, lat, lon);
|
|
132
|
+
if (pos.altitude > 0) {
|
|
133
|
+
luxEstimate *= Math.sin(pos.altitude);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
luxEstimate = 0;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Fallback if SunCalc fails
|
|
141
|
+
}
|
|
116
142
|
return {
|
|
117
143
|
cct: Math.round(minK + (maxK - minK) * f),
|
|
118
144
|
intensity: Math.round(minIntensity + (maxIntensity - minIntensity) * f),
|
|
145
|
+
lightOutput: Math.round(luxEstimate),
|
|
119
146
|
};
|
|
120
147
|
}
|
|
121
148
|
// Fallback for empirical curves when night times are not available
|
|
122
149
|
try {
|
|
123
150
|
const pos = getPosition(date, lat, lon);
|
|
124
151
|
if (pos.altitude <= 0)
|
|
125
|
-
return { cct: minK, intensity: minIntensity };
|
|
152
|
+
return { cct: minK, intensity: minIntensity, lightOutput: 0 };
|
|
126
153
|
const f = Math.max(0, Math.sin(pos.altitude));
|
|
127
154
|
return {
|
|
128
155
|
cct: Math.round(minK + (maxK - minK) * f),
|
|
129
156
|
intensity: Math.round(minIntensity + (maxIntensity - minIntensity) * f),
|
|
157
|
+
lightOutput: Math.round(f * CCT_DEFAULTS.maxLux),
|
|
130
158
|
};
|
|
131
159
|
}
|
|
132
160
|
catch {
|
|
133
|
-
return { cct: minK, intensity: minIntensity };
|
|
161
|
+
return { cct: minK, intensity: minIntensity, lightOutput: 0 };
|
|
134
162
|
}
|
|
135
163
|
}
|
|
136
|
-
function calculateCCTCore(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType) {
|
|
164
|
+
function calculateCCTCore(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType, weather) {
|
|
137
165
|
const times = getTimes(date, lat, lon);
|
|
138
166
|
const isScientific = curveType === CurveType.CIE_DAYLIGHT ||
|
|
139
167
|
curveType === CurveType.SUN_ALTITUDE ||
|
|
@@ -142,7 +170,7 @@ function calculateCCTCore(lat, lon, date, minK, maxK, minIntensity, maxIntensity
|
|
|
142
170
|
curveType === CurveType.BLACKBODY ||
|
|
143
171
|
curveType === CurveType.HAZY;
|
|
144
172
|
if (isScientific) {
|
|
145
|
-
return calculateScientificCCT(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType, times);
|
|
173
|
+
return calculateScientificCCT(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType, times, weather);
|
|
146
174
|
}
|
|
147
175
|
return calculateEmpiricalCCT(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType, times);
|
|
148
176
|
}
|
|
@@ -158,6 +186,48 @@ export function calculateCCT(lat, lon, date = new Date(), opts, curveType = Curv
|
|
|
158
186
|
const maxPct = Math.max(intensityMinPct, intensityMaxPct);
|
|
159
187
|
const minIntensity = Math.round(minPct * 10);
|
|
160
188
|
const maxIntensity = Math.round(maxPct * 10);
|
|
161
|
-
|
|
189
|
+
// Apply weather modifiers if provided
|
|
190
|
+
let result = calculateCCTCore(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType, opts?.weather);
|
|
191
|
+
if (opts?.weather) {
|
|
192
|
+
result = applyWeatherModifiers(result, opts.weather);
|
|
193
|
+
}
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
function applyWeatherModifiers(result, weather) {
|
|
197
|
+
const { cloudCover = 0, precipitation = 'none' } = weather;
|
|
198
|
+
let { cct, intensity, lightOutput = 0 } = result;
|
|
199
|
+
// Cloud cover logic:
|
|
200
|
+
// 1. Reduce intensity linearly: 0% clouds = 100%, 100% clouds = 20% intensity
|
|
201
|
+
const cloudIntensityFactor = 1 - Math.min(1, Math.max(0, cloudCover)) * 0.8;
|
|
202
|
+
intensity = Math.round(intensity * cloudIntensityFactor);
|
|
203
|
+
lightOutput = Math.round(lightOutput * cloudIntensityFactor);
|
|
204
|
+
// 2. Shift CCT towards 6500K (neutral/overcast) based on cloud cover
|
|
205
|
+
// Heavy clouds act as a diffuser, mixing direct sun and blue sky to a uniform ~6500K
|
|
206
|
+
const targetK = 6500;
|
|
207
|
+
const cloudMix = Math.min(1, Math.max(0, cloudCover));
|
|
208
|
+
cct = Math.round(cct * (1 - cloudMix) + targetK * cloudMix);
|
|
209
|
+
// Precipitation logic:
|
|
210
|
+
// Additional intensity reduction beyond cloud cover
|
|
211
|
+
let precipFactor = 1.0;
|
|
212
|
+
switch (precipitation) {
|
|
213
|
+
case 'rain':
|
|
214
|
+
precipFactor = 0.8;
|
|
215
|
+
// Rain also tends to cool the light slightly (scattering)
|
|
216
|
+
cct = Math.round(cct * 0.9 + 7000 * 0.1);
|
|
217
|
+
break;
|
|
218
|
+
case 'snow':
|
|
219
|
+
precipFactor = 0.9; // Snow reflects light, maybe less dark than rain? But falling snow blocks.
|
|
220
|
+
// Snow reflection can make things very cool/blue
|
|
221
|
+
cct = Math.round(cct * 0.8 + 8000 * 0.2);
|
|
222
|
+
break;
|
|
223
|
+
case 'drizzle':
|
|
224
|
+
precipFactor = 0.9;
|
|
225
|
+
break;
|
|
226
|
+
default:
|
|
227
|
+
precipFactor = 1.0;
|
|
228
|
+
}
|
|
229
|
+
intensity = Math.round(intensity * precipFactor);
|
|
230
|
+
lightOutput = Math.round(lightOutput * precipFactor);
|
|
231
|
+
return { cct, intensity, lightOutput };
|
|
162
232
|
}
|
|
163
233
|
//# sourceMappingURL=cctUtil.js.map
|