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.
Files changed (121) hide show
  1. package/README.md +87 -0
  2. package/dist/__tests__/autoCctMaxLux.test.d.ts +2 -0
  3. package/dist/__tests__/autoCctMaxLux.test.d.ts.map +1 -0
  4. package/dist/__tests__/autoCctMaxLux.test.js +153 -0
  5. package/dist/__tests__/autoCctMaxLux.test.js.map +1 -0
  6. package/dist/__tests__/cctUtil.test.js +63 -1
  7. package/dist/__tests__/cctUtil.test.js.map +1 -1
  8. package/dist/__tests__/configMaxLux.test.d.ts +2 -0
  9. package/dist/__tests__/configMaxLux.test.d.ts.map +1 -0
  10. package/dist/__tests__/configMaxLux.test.js +43 -0
  11. package/dist/__tests__/configMaxLux.test.js.map +1 -0
  12. package/dist/__tests__/lightControl.test.js +259 -0
  13. package/dist/__tests__/lightControl.test.js.map +1 -1
  14. package/dist/__tests__/maxLuxInterpolation.test.d.ts +2 -0
  15. package/dist/__tests__/maxLuxInterpolation.test.d.ts.map +1 -0
  16. package/dist/__tests__/maxLuxInterpolation.test.js +96 -0
  17. package/dist/__tests__/maxLuxInterpolation.test.js.map +1 -0
  18. package/dist/__tests__/weatherPhysics.test.d.ts +2 -0
  19. package/dist/__tests__/weatherPhysics.test.d.ts.map +1 -0
  20. package/dist/__tests__/weatherPhysics.test.js +72 -0
  21. package/dist/__tests__/weatherPhysics.test.js.map +1 -0
  22. package/dist/commands/__tests__/newCommands.test.d.ts +2 -0
  23. package/dist/commands/__tests__/newCommands.test.d.ts.map +1 -0
  24. package/dist/commands/__tests__/newCommands.test.js +195 -0
  25. package/dist/commands/__tests__/newCommands.test.js.map +1 -0
  26. package/dist/commands/daylightSimulation/autoCct.d.ts.map +1 -1
  27. package/dist/commands/daylightSimulation/autoCct.js +66 -4
  28. package/dist/commands/daylightSimulation/autoCct.js.map +1 -1
  29. package/dist/commands/daylightSimulation/graphSchedule.d.ts.map +1 -1
  30. package/dist/commands/daylightSimulation/graphSchedule.js +7 -2
  31. package/dist/commands/daylightSimulation/graphSchedule.js.map +1 -1
  32. package/dist/commands/daylightSimulation/printSchedule.d.ts.map +1 -1
  33. package/dist/commands/daylightSimulation/printSchedule.js +6 -1
  34. package/dist/commands/daylightSimulation/printSchedule.js.map +1 -1
  35. package/dist/commands/daylightSimulation/simulateSchedule.d.ts.map +1 -1
  36. package/dist/commands/daylightSimulation/simulateSchedule.js +6 -1
  37. package/dist/commands/daylightSimulation/simulateSchedule.js.map +1 -1
  38. package/dist/commands/deviceControl/config.d.ts.map +1 -1
  39. package/dist/commands/deviceControl/config.js +27 -0
  40. package/dist/commands/deviceControl/config.js.map +1 -1
  41. package/dist/commands/deviceControl/effect.d.ts +5 -0
  42. package/dist/commands/deviceControl/effect.d.ts.map +1 -0
  43. package/dist/commands/deviceControl/effect.js +172 -0
  44. package/dist/commands/deviceControl/effect.js.map +1 -0
  45. package/dist/commands/deviceControl/fan.d.ts +5 -0
  46. package/dist/commands/deviceControl/fan.d.ts.map +1 -0
  47. package/dist/commands/deviceControl/fan.js +105 -0
  48. package/dist/commands/deviceControl/fan.js.map +1 -0
  49. package/dist/commands/deviceControl/firmware.d.ts +5 -0
  50. package/dist/commands/deviceControl/firmware.d.ts.map +1 -0
  51. package/dist/commands/deviceControl/firmware.js +68 -0
  52. package/dist/commands/deviceControl/firmware.js.map +1 -0
  53. package/dist/commands/deviceControl/group.d.ts +5 -0
  54. package/dist/commands/deviceControl/group.d.ts.map +1 -0
  55. package/dist/commands/deviceControl/group.js +101 -0
  56. package/dist/commands/deviceControl/group.js.map +1 -0
  57. package/dist/commands/deviceControl/info.d.ts +5 -0
  58. package/dist/commands/deviceControl/info.d.ts.map +1 -0
  59. package/dist/commands/deviceControl/info.js +57 -0
  60. package/dist/commands/deviceControl/info.js.map +1 -0
  61. package/dist/commands/deviceControl/preset.d.ts +5 -0
  62. package/dist/commands/deviceControl/preset.d.ts.map +1 -0
  63. package/dist/commands/deviceControl/preset.js +55 -0
  64. package/dist/commands/deviceControl/preset.js.map +1 -0
  65. package/dist/commands/deviceControl/quickshot.d.ts +5 -0
  66. package/dist/commands/deviceControl/quickshot.d.ts.map +1 -0
  67. package/dist/commands/deviceControl/quickshot.js +51 -0
  68. package/dist/commands/deviceControl/quickshot.js.map +1 -0
  69. package/dist/commands/deviceControl/scene.d.ts +5 -0
  70. package/dist/commands/deviceControl/scene.d.ts.map +1 -0
  71. package/dist/commands/deviceControl/scene.js +101 -0
  72. package/dist/commands/deviceControl/scene.js.map +1 -0
  73. package/dist/commands.d.ts.map +1 -1
  74. package/dist/commands.js +17 -0
  75. package/dist/commands.js.map +1 -1
  76. package/dist/daylightSimulation/cctUtil.d.ts +2 -2
  77. package/dist/daylightSimulation/cctUtil.d.ts.map +1 -1
  78. package/dist/daylightSimulation/cctUtil.js +98 -28
  79. package/dist/daylightSimulation/cctUtil.js.map +1 -1
  80. package/dist/daylightSimulation/constants.d.ts +3 -1
  81. package/dist/daylightSimulation/constants.d.ts.map +1 -1
  82. package/dist/daylightSimulation/constants.js +3 -1
  83. package/dist/daylightSimulation/constants.js.map +1 -1
  84. package/dist/daylightSimulation/curves/realistic.d.ts +7 -6
  85. package/dist/daylightSimulation/curves/realistic.d.ts.map +1 -1
  86. package/dist/daylightSimulation/curves/realistic.js +42 -18
  87. package/dist/daylightSimulation/curves/realistic.js.map +1 -1
  88. package/dist/daylightSimulation/graphSchedule.d.ts +1 -1
  89. package/dist/daylightSimulation/graphSchedule.d.ts.map +1 -1
  90. package/dist/daylightSimulation/graphSchedule.js +27 -5
  91. package/dist/daylightSimulation/graphSchedule.js.map +1 -1
  92. package/dist/daylightSimulation/mathUtil.d.ts +13 -0
  93. package/dist/daylightSimulation/mathUtil.d.ts.map +1 -0
  94. package/dist/daylightSimulation/mathUtil.js +54 -0
  95. package/dist/daylightSimulation/mathUtil.js.map +1 -0
  96. package/dist/daylightSimulation/scheduleMaker.d.ts +4 -5
  97. package/dist/daylightSimulation/scheduleMaker.d.ts.map +1 -1
  98. package/dist/daylightSimulation/scheduleMaker.js +8 -0
  99. package/dist/daylightSimulation/scheduleMaker.js.map +1 -1
  100. package/dist/daylightSimulation/textSchedule.d.ts.map +1 -1
  101. package/dist/daylightSimulation/textSchedule.js +2 -2
  102. package/dist/daylightSimulation/textSchedule.js.map +1 -1
  103. package/dist/daylightSimulation/types.d.ts +6 -0
  104. package/dist/daylightSimulation/types.d.ts.map +1 -1
  105. package/dist/daylightSimulation/types.js.map +1 -1
  106. package/dist/deviceControl/discovery.d.ts.map +1 -1
  107. package/dist/deviceControl/discovery.js +0 -2
  108. package/dist/deviceControl/discovery.js.map +1 -1
  109. package/dist/deviceControl/lightControl.d.ts +67 -78
  110. package/dist/deviceControl/lightControl.d.ts.map +1 -1
  111. package/dist/deviceControl/lightControl.js +292 -203
  112. package/dist/deviceControl/lightControl.js.map +1 -1
  113. package/dist/deviceControl/types.d.ts +19 -0
  114. package/dist/deviceControl/types.d.ts.map +1 -1
  115. package/dist/test/MockLightServer.d.ts.map +1 -1
  116. package/dist/test/MockLightServer.js +134 -12
  117. package/dist/test/MockLightServer.js.map +1 -1
  118. package/package.json +8 -7
  119. package/scripts/extract-api.ts +158 -0
  120. package/scripts/extract-usage.ts +199 -0
  121. 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,5 @@
1
+ import type { Command } from 'commander';
2
+ import type { CommandDeps } from '../../deviceControl/types.js';
3
+ export declare function registerPreset(program: Command, deps: CommandDeps): void;
4
+ export default registerPreset;
5
+ //# sourceMappingURL=preset.d.ts.map
@@ -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,5 @@
1
+ import type { Command } from 'commander';
2
+ import type { CommandDeps } from '../../deviceControl/types.js';
3
+ export declare function registerScene(program: Command, deps: CommandDeps): void;
4
+ export default registerScene;
5
+ //# sourceMappingURL=scene.d.ts.map
@@ -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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"}
@@ -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;AAgBzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAkBnE;AAED,eAAe,gBAAgB,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
@@ -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;AACjC,CAAC;AAED,eAAe,gBAAgB,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;AAGxE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC;AAoM1F,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,CAgBX"}
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
- if (!isValidSunTimes(sunrise, sunset, _solarNoon)) {
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
- // For scientific curves, handle cases where nightEnd/night might not be available
36
- let nightEndTime;
37
- let nightStartTime;
38
- if (nightEnd instanceof Date &&
39
- !Number.isNaN(nightEnd.getTime()) &&
40
- night instanceof Date &&
41
- !Number.isNaN(night.getTime())) {
42
- nightEndTime = nightEnd.getTime();
43
- nightStartTime = night.getTime();
44
- }
45
- else {
46
- // Edge case: no proper night (e.g., summer in high latitudes)
47
- nightEndTime = sunrise.getTime() - 30 * 60 * 1000;
48
- nightStartTime = sunset.getTime() + 30 * 60 * 1000;
49
- }
50
- if (t <= nightEndTime || t >= nightStartTime) {
51
- return { cct: minK, intensity: minIntensity };
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
- return calculateCCTCore(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType);
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