amaran-light-cli 1.4.0 → 1.6.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 (245) hide show
  1. package/README.md +48 -18
  2. package/dist/__tests__/autoCct.test.js +2 -2
  3. package/dist/__tests__/autoCct.test.js.map +1 -1
  4. package/dist/__tests__/autostart.test.js +1 -1
  5. package/dist/__tests__/autostart.test.js.map +1 -1
  6. package/dist/__tests__/cctUtil.test.js +19 -2
  7. package/dist/__tests__/cctUtil.test.js.map +1 -1
  8. package/dist/__tests__/intensityApi.test.js +4 -1
  9. package/dist/__tests__/intensityApi.test.js.map +1 -1
  10. package/dist/__tests__/lightControl.test.js +260 -1
  11. package/dist/__tests__/lightControl.test.js.map +1 -1
  12. package/dist/__tests__/simulateSchedule.test.js +2 -2
  13. package/dist/__tests__/simulateSchedule.test.js.map +1 -1
  14. package/dist/cli.d.ts +2 -2
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +4 -4
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/__tests__/integration.test.js +1 -1
  19. package/dist/commands/__tests__/integration.test.js.map +1 -1
  20. package/dist/commands/__tests__/newCommands.test.d.ts +2 -0
  21. package/dist/commands/__tests__/newCommands.test.d.ts.map +1 -0
  22. package/dist/commands/__tests__/newCommands.test.js +195 -0
  23. package/dist/commands/__tests__/newCommands.test.js.map +1 -0
  24. package/dist/commands/cmdUtils.d.ts +23 -0
  25. package/dist/commands/cmdUtils.d.ts.map +1 -0
  26. package/dist/commands/cmdUtils.js +43 -0
  27. package/dist/commands/cmdUtils.js.map +1 -0
  28. package/dist/commands/daylightSimulation/autoCct.d.ts +5 -0
  29. package/dist/commands/daylightSimulation/autoCct.d.ts.map +1 -0
  30. package/dist/commands/{autoCct.js → daylightSimulation/autoCct.js} +12 -13
  31. package/dist/commands/daylightSimulation/autoCct.js.map +1 -0
  32. package/dist/commands/{graphSchedule.d.ts → daylightSimulation/graphSchedule.d.ts} +1 -1
  33. package/dist/commands/daylightSimulation/graphSchedule.d.ts.map +1 -0
  34. package/dist/commands/daylightSimulation/graphSchedule.js +65 -0
  35. package/dist/commands/daylightSimulation/graphSchedule.js.map +1 -0
  36. package/dist/commands/daylightSimulation/printSchedule.d.ts +5 -0
  37. package/dist/commands/daylightSimulation/printSchedule.d.ts.map +1 -0
  38. package/dist/commands/daylightSimulation/printSchedule.js +65 -0
  39. package/dist/commands/daylightSimulation/printSchedule.js.map +1 -0
  40. package/dist/commands/{service.d.ts → daylightSimulation/service.d.ts} +1 -1
  41. package/dist/commands/daylightSimulation/service.d.ts.map +1 -0
  42. package/dist/commands/{service.js → daylightSimulation/service.js} +47 -35
  43. package/dist/commands/daylightSimulation/service.js.map +1 -0
  44. package/dist/commands/{simulateSchedule.d.ts → daylightSimulation/simulateSchedule.d.ts} +1 -1
  45. package/dist/commands/daylightSimulation/simulateSchedule.d.ts.map +1 -0
  46. package/dist/commands/daylightSimulation/simulateSchedule.js +123 -0
  47. package/dist/commands/daylightSimulation/simulateSchedule.js.map +1 -0
  48. package/dist/commands/{cct.d.ts → deviceControl/cct.d.ts} +1 -1
  49. package/dist/commands/deviceControl/cct.d.ts.map +1 -0
  50. package/dist/commands/{cct.js → deviceControl/cct.js} +31 -36
  51. package/dist/commands/deviceControl/cct.js.map +1 -0
  52. package/dist/commands/{color.d.ts → deviceControl/color.d.ts} +1 -1
  53. package/dist/commands/deviceControl/color.d.ts.map +1 -0
  54. package/dist/commands/deviceControl/color.js +52 -0
  55. package/dist/commands/deviceControl/color.js.map +1 -0
  56. package/dist/commands/{config.d.ts → deviceControl/config.d.ts} +1 -1
  57. package/dist/commands/deviceControl/config.d.ts.map +1 -0
  58. package/dist/commands/{config.js → deviceControl/config.js} +11 -7
  59. package/dist/commands/deviceControl/config.js.map +1 -0
  60. package/dist/commands/{discover.d.ts → deviceControl/discover.d.ts} +1 -1
  61. package/dist/commands/deviceControl/discover.d.ts.map +1 -0
  62. package/dist/commands/{discover.js → deviceControl/discover.js} +8 -4
  63. package/dist/commands/deviceControl/discover.js.map +1 -0
  64. package/dist/commands/deviceControl/effect.d.ts +5 -0
  65. package/dist/commands/deviceControl/effect.d.ts.map +1 -0
  66. package/dist/commands/deviceControl/effect.js +172 -0
  67. package/dist/commands/deviceControl/effect.js.map +1 -0
  68. package/dist/commands/deviceControl/fan.d.ts +5 -0
  69. package/dist/commands/deviceControl/fan.d.ts.map +1 -0
  70. package/dist/commands/deviceControl/fan.js +105 -0
  71. package/dist/commands/deviceControl/fan.js.map +1 -0
  72. package/dist/commands/deviceControl/firmware.d.ts +5 -0
  73. package/dist/commands/deviceControl/firmware.d.ts.map +1 -0
  74. package/dist/commands/deviceControl/firmware.js +68 -0
  75. package/dist/commands/deviceControl/firmware.js.map +1 -0
  76. package/dist/commands/deviceControl/group.d.ts +5 -0
  77. package/dist/commands/deviceControl/group.d.ts.map +1 -0
  78. package/dist/commands/deviceControl/group.js +101 -0
  79. package/dist/commands/deviceControl/group.js.map +1 -0
  80. package/dist/commands/{hsi.d.ts → deviceControl/hsi.d.ts} +1 -1
  81. package/dist/commands/deviceControl/hsi.d.ts.map +1 -0
  82. package/dist/commands/deviceControl/hsi.js +50 -0
  83. package/dist/commands/deviceControl/hsi.js.map +1 -0
  84. package/dist/commands/deviceControl/info.d.ts +5 -0
  85. package/dist/commands/deviceControl/info.d.ts.map +1 -0
  86. package/dist/commands/deviceControl/info.js +57 -0
  87. package/dist/commands/deviceControl/info.js.map +1 -0
  88. package/dist/commands/{intensity.d.ts → deviceControl/intensity.d.ts} +1 -1
  89. package/dist/commands/deviceControl/intensity.d.ts.map +1 -0
  90. package/dist/commands/deviceControl/intensity.js +41 -0
  91. package/dist/commands/deviceControl/intensity.js.map +1 -0
  92. package/dist/commands/{list.d.ts → deviceControl/list.d.ts} +1 -1
  93. package/dist/commands/deviceControl/list.d.ts.map +1 -0
  94. package/dist/commands/{list.js → deviceControl/list.js} +7 -3
  95. package/dist/commands/deviceControl/list.js.map +1 -0
  96. package/dist/commands/{power.d.ts → deviceControl/power.d.ts} +1 -1
  97. package/dist/commands/deviceControl/power.d.ts.map +1 -0
  98. package/dist/commands/deviceControl/power.js +78 -0
  99. package/dist/commands/deviceControl/power.js.map +1 -0
  100. package/dist/commands/deviceControl/preset.d.ts +5 -0
  101. package/dist/commands/deviceControl/preset.d.ts.map +1 -0
  102. package/dist/commands/deviceControl/preset.js +55 -0
  103. package/dist/commands/deviceControl/preset.js.map +1 -0
  104. package/dist/commands/deviceControl/quickshot.d.ts +5 -0
  105. package/dist/commands/deviceControl/quickshot.d.ts.map +1 -0
  106. package/dist/commands/deviceControl/quickshot.js +51 -0
  107. package/dist/commands/deviceControl/quickshot.js.map +1 -0
  108. package/dist/commands/deviceControl/scene.d.ts +5 -0
  109. package/dist/commands/deviceControl/scene.d.ts.map +1 -0
  110. package/dist/commands/deviceControl/scene.js +101 -0
  111. package/dist/commands/deviceControl/scene.js.map +1 -0
  112. package/dist/commands/{status.d.ts → deviceControl/status.d.ts} +1 -1
  113. package/dist/commands/deviceControl/status.d.ts.map +1 -0
  114. package/dist/commands/deviceControl/status.js +48 -0
  115. package/dist/commands/deviceControl/status.js.map +1 -0
  116. package/dist/commands.d.ts +1 -1
  117. package/dist/commands.d.ts.map +1 -1
  118. package/dist/commands.js +34 -43
  119. package/dist/commands.js.map +1 -1
  120. package/dist/daylightSimulation/cctUtil.d.ts +5 -0
  121. package/dist/daylightSimulation/cctUtil.d.ts.map +1 -0
  122. package/dist/daylightSimulation/cctUtil.js +191 -0
  123. package/dist/daylightSimulation/cctUtil.js.map +1 -0
  124. package/dist/{constants.d.ts → daylightSimulation/constants.d.ts} +1 -18
  125. package/dist/daylightSimulation/constants.d.ts.map +1 -0
  126. package/dist/{constants.js → daylightSimulation/constants.js} +1 -13
  127. package/dist/daylightSimulation/constants.js.map +1 -0
  128. package/dist/daylightSimulation/curves/approximations.d.ts +19 -0
  129. package/dist/daylightSimulation/curves/approximations.d.ts.map +1 -0
  130. package/dist/daylightSimulation/curves/approximations.js +27 -0
  131. package/dist/daylightSimulation/curves/approximations.js.map +1 -0
  132. package/dist/daylightSimulation/curves/index.d.ts +15 -0
  133. package/dist/daylightSimulation/curves/index.d.ts.map +1 -0
  134. package/dist/daylightSimulation/curves/index.js +56 -0
  135. package/dist/daylightSimulation/curves/index.js.map +1 -0
  136. package/dist/daylightSimulation/curves/mathematical.d.ts +15 -0
  137. package/dist/daylightSimulation/curves/mathematical.d.ts.map +1 -0
  138. package/dist/daylightSimulation/curves/mathematical.js +33 -0
  139. package/dist/daylightSimulation/curves/mathematical.js.map +1 -0
  140. package/dist/daylightSimulation/curves/realistic.d.ts +43 -0
  141. package/dist/daylightSimulation/curves/realistic.d.ts.map +1 -0
  142. package/dist/daylightSimulation/curves/realistic.js +259 -0
  143. package/dist/daylightSimulation/curves/realistic.js.map +1 -0
  144. package/dist/daylightSimulation/geoipUtil.d.ts.map +1 -0
  145. package/dist/daylightSimulation/geoipUtil.js.map +1 -0
  146. package/dist/daylightSimulation/graphSchedule.d.ts +8 -0
  147. package/dist/daylightSimulation/graphSchedule.d.ts.map +1 -0
  148. package/dist/daylightSimulation/graphSchedule.js +116 -0
  149. package/dist/daylightSimulation/graphSchedule.js.map +1 -0
  150. package/dist/daylightSimulation/scheduleMaker.d.ts +33 -0
  151. package/dist/daylightSimulation/scheduleMaker.d.ts.map +1 -0
  152. package/dist/daylightSimulation/scheduleMaker.js +192 -0
  153. package/dist/daylightSimulation/scheduleMaker.js.map +1 -0
  154. package/dist/daylightSimulation/textSchedule.d.ts +9 -0
  155. package/dist/daylightSimulation/textSchedule.d.ts.map +1 -0
  156. package/dist/daylightSimulation/textSchedule.js +172 -0
  157. package/dist/daylightSimulation/textSchedule.js.map +1 -0
  158. package/dist/{cctUtil.d.ts → daylightSimulation/types.d.ts} +7 -5
  159. package/dist/daylightSimulation/types.d.ts.map +1 -0
  160. package/dist/daylightSimulation/types.js +16 -0
  161. package/dist/daylightSimulation/types.js.map +1 -0
  162. package/dist/deviceControl/autostart.d.ts.map +1 -0
  163. package/dist/deviceControl/autostart.js.map +1 -0
  164. package/dist/deviceControl/constants.d.ts +23 -0
  165. package/dist/deviceControl/constants.d.ts.map +1 -0
  166. package/dist/deviceControl/constants.js +20 -0
  167. package/dist/deviceControl/constants.js.map +1 -0
  168. package/dist/deviceControl/discovery.d.ts.map +1 -0
  169. package/dist/{discovery.js → deviceControl/discovery.js} +0 -2
  170. package/dist/deviceControl/discovery.js.map +1 -0
  171. package/dist/{lightControl.d.ts → deviceControl/lightControl.d.ts} +67 -78
  172. package/dist/deviceControl/lightControl.d.ts.map +1 -0
  173. package/dist/{lightControl.js → deviceControl/lightControl.js} +292 -203
  174. package/dist/deviceControl/lightControl.js.map +1 -0
  175. package/dist/deviceControl/types.d.ts +59 -0
  176. package/dist/deviceControl/types.d.ts.map +1 -0
  177. package/dist/deviceControl/types.js.map +1 -0
  178. package/dist/test/MockLightServer.d.ts.map +1 -1
  179. package/dist/test/MockLightServer.js +134 -12
  180. package/dist/test/MockLightServer.js.map +1 -1
  181. package/package.json +11 -7
  182. package/scripts/extract-api.ts +158 -0
  183. package/scripts/extract-usage.ts +199 -0
  184. package/scripts/release.js +11 -11
  185. package/CHANGELOG.md +0 -67
  186. package/dist/autostart.d.ts.map +0 -1
  187. package/dist/autostart.js.map +0 -1
  188. package/dist/cctUtil.d.ts.map +0 -1
  189. package/dist/cctUtil.js +0 -435
  190. package/dist/cctUtil.js.map +0 -1
  191. package/dist/commands/autoCct.d.ts +0 -5
  192. package/dist/commands/autoCct.d.ts.map +0 -1
  193. package/dist/commands/autoCct.js.map +0 -1
  194. package/dist/commands/cct.d.ts.map +0 -1
  195. package/dist/commands/cct.js.map +0 -1
  196. package/dist/commands/color.d.ts.map +0 -1
  197. package/dist/commands/color.js +0 -57
  198. package/dist/commands/color.js.map +0 -1
  199. package/dist/commands/config.d.ts.map +0 -1
  200. package/dist/commands/config.js.map +0 -1
  201. package/dist/commands/discover.d.ts.map +0 -1
  202. package/dist/commands/discover.js.map +0 -1
  203. package/dist/commands/graphSchedule.d.ts.map +0 -1
  204. package/dist/commands/graphSchedule.js +0 -293
  205. package/dist/commands/graphSchedule.js.map +0 -1
  206. package/dist/commands/hsi.d.ts.map +0 -1
  207. package/dist/commands/hsi.js +0 -59
  208. package/dist/commands/hsi.js.map +0 -1
  209. package/dist/commands/intensity.d.ts.map +0 -1
  210. package/dist/commands/intensity.js +0 -50
  211. package/dist/commands/intensity.js.map +0 -1
  212. package/dist/commands/list.d.ts.map +0 -1
  213. package/dist/commands/list.js.map +0 -1
  214. package/dist/commands/power.d.ts.map +0 -1
  215. package/dist/commands/power.js +0 -120
  216. package/dist/commands/power.js.map +0 -1
  217. package/dist/commands/printSchedule.d.ts +0 -5
  218. package/dist/commands/printSchedule.d.ts.map +0 -1
  219. package/dist/commands/printSchedule.js +0 -452
  220. package/dist/commands/printSchedule.js.map +0 -1
  221. package/dist/commands/service.d.ts.map +0 -1
  222. package/dist/commands/service.js.map +0 -1
  223. package/dist/commands/simulateSchedule.d.ts.map +0 -1
  224. package/dist/commands/simulateSchedule.js +0 -199
  225. package/dist/commands/simulateSchedule.js.map +0 -1
  226. package/dist/commands/status.d.ts.map +0 -1
  227. package/dist/commands/status.js +0 -48
  228. package/dist/commands/status.js.map +0 -1
  229. package/dist/constants.d.ts.map +0 -1
  230. package/dist/constants.js.map +0 -1
  231. package/dist/discovery.d.ts.map +0 -1
  232. package/dist/discovery.js.map +0 -1
  233. package/dist/geoipUtil.d.ts.map +0 -1
  234. package/dist/geoipUtil.js.map +0 -1
  235. package/dist/lightControl.d.ts.map +0 -1
  236. package/dist/lightControl.js.map +0 -1
  237. package/dist/types.d.ts +0 -41
  238. package/dist/types.d.ts.map +0 -1
  239. package/dist/types.js.map +0 -1
  240. /package/dist/{geoipUtil.d.ts → daylightSimulation/geoipUtil.d.ts} +0 -0
  241. /package/dist/{geoipUtil.js → daylightSimulation/geoipUtil.js} +0 -0
  242. /package/dist/{autostart.d.ts → deviceControl/autostart.d.ts} +0 -0
  243. /package/dist/{autostart.js → deviceControl/autostart.js} +0 -0
  244. /package/dist/{discovery.d.ts → deviceControl/discovery.d.ts} +0 -0
  245. /package/dist/{types.js → deviceControl/types.js} +0 -0
@@ -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,5 +1,5 @@
1
1
  import type { Command } from 'commander';
2
- import type { CommandDeps } from '../types.js';
2
+ import type { CommandDeps } from '../../deviceControl/types.js';
3
3
  export declare function registerStatus(program: Command, deps: CommandDeps): void;
4
4
  export default registerStatus;
5
5
  //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/status.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,QAMjE;AA+CD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,48 @@
1
+ import chalk from 'chalk';
2
+ import { addStandardOptions, runDeviceAction } from '../cmdUtils.js';
3
+ export function registerStatus(program, deps) {
4
+ const { asyncCommand } = deps;
5
+ addStandardOptions(program.command('status <device>').description('Get the current status of a light')).action(asyncCommand(handleStatus(deps)));
6
+ }
7
+ function handleStatus(deps) {
8
+ return async (deviceQuery, options) => {
9
+ return runDeviceAction({
10
+ deps,
11
+ options,
12
+ deviceQuery,
13
+ actionName: 'get status',
14
+ }, (device, controller) => {
15
+ return new Promise((resolve) => {
16
+ const nodeId = device.node_id;
17
+ controller.getLightSleepStatus(nodeId, (success, message, data) => {
18
+ if (success) {
19
+ const nodeConfig = controller.getNode(nodeId);
20
+ const displayName = device.device_name || device.name || device.id || device.node_id || 'Unknown';
21
+ console.log(chalk.blue(`Status for ${displayName}:`));
22
+ console.log(` State: ${data?.sleep ? chalk.red('Off') : chalk.green('On')}`);
23
+ if (nodeConfig) {
24
+ if (nodeConfig.intensity !== undefined) {
25
+ console.log(` Intensity: ${nodeConfig.intensity}%`);
26
+ }
27
+ if (nodeConfig.cct !== undefined) {
28
+ console.log(` Temperature: ${nodeConfig.cct}K`);
29
+ }
30
+ if (nodeConfig.hue !== undefined && nodeConfig.sat !== undefined) {
31
+ console.log(` HSI: H:${nodeConfig.hue} S:${nodeConfig.sat} I:${nodeConfig.intensity}`);
32
+ }
33
+ }
34
+ }
35
+ else {
36
+ console.error(chalk.red(`✗ Failed to get status: ${message}`));
37
+ }
38
+ resolve();
39
+ });
40
+ });
41
+ }, () => {
42
+ console.log(chalk.yellow('Status command requires a specific device name or ID.'));
43
+ console.log(chalk.gray('Use "list" to see available devices.'));
44
+ });
45
+ };
46
+ }
47
+ export default registerStatus;
48
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAErE,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,IAAiB;IAChE,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAE9B,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAC,CAAC,MAAM,CAC5G,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CACjC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAiB;IACrC,OAAO,KAAK,EAAE,WAAmB,EAAE,OAAuB,EAAE,EAAE;QAC5D,OAAO,eAAe,CACpB;YACE,IAAI;YACJ,OAAO;YACP,WAAW;YACX,UAAU,EAAE,YAAY;SACzB,EACD,CAAC,MAAc,EAAE,UAAU,EAAE,EAAE;YAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAiB,CAAC;gBACxC,UAAU,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,OAAgB,EAAE,OAAe,EAAE,IAAc,EAAE,EAAE;oBAC3F,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;wBAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;wBAClG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,WAAW,GAAG,CAAC,CAAC,CAAC;wBACtD,OAAO,CAAC,GAAG,CAAC,YAAa,IAA4B,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAEvG,IAAI,UAAU,EAAE,CAAC;4BACf,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gCACvC,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC;4BACvD,CAAC;4BACD,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gCACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;4BACnD,CAAC;4BACD,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gCACjE,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,CAAC,GAAG,MAAM,UAAU,CAAC,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;4BAC1F,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC,CAAC;oBACjE,CAAC;oBACD,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,EACD,GAAG,EAAE;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uDAAuD,CAAC,CAAC,CAAC;YACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAClE,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,eAAe,cAAc,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { Command } from 'commander';
2
- import type { CommandDeps } from './types.js';
2
+ import type { CommandDeps } from './deviceControl/types.js';
3
3
  export declare function registerCommands(program: Command, deps: CommandDeps): void;
4
4
  export default registerCommands;
5
5
  //# sourceMappingURL=commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,OAAO,KAAK,EAAE,WAAW,EAAU,MAAM,YAAY,CAAC;AAGtD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QA2CnE;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
@@ -1,48 +1,30 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import chalk from 'chalk';
4
- import registerAutoCct from './commands/autoCct.js';
5
- import registerCct from './commands/cct.js';
6
- import registerColor from './commands/color.js';
7
- import registerConfig from './commands/config.js';
8
- import registerDiscover from './commands/discover.js';
9
- import registerGraphSchedule from './commands/graphSchedule.js';
10
- import registerHsi from './commands/hsi.js';
11
- import registerIntensity from './commands/intensity.js';
12
- import registerList from './commands/list.js';
13
- import registerPower from './commands/power.js';
14
- import registerPrintSchedule from './commands/printSchedule.js';
15
- import registerService from './commands/service.js';
16
- import registerSimulateSchedule from './commands/simulateSchedule.js';
17
- import registerStatus from './commands/status.js';
1
+ import registerAutoCct from './commands/daylightSimulation/autoCct.js';
2
+ import registerGraphSchedule from './commands/daylightSimulation/graphSchedule.js';
3
+ import registerPrintSchedule from './commands/daylightSimulation/printSchedule.js';
4
+ import registerService from './commands/daylightSimulation/service.js';
5
+ import registerSimulateSchedule from './commands/daylightSimulation/simulateSchedule.js';
6
+ import registerCct from './commands/deviceControl/cct.js';
7
+ import registerColor from './commands/deviceControl/color.js';
8
+ import registerConfig from './commands/deviceControl/config.js';
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';
14
+ import registerHsi from './commands/deviceControl/hsi.js';
15
+ import registerInfo from './commands/deviceControl/info.js';
16
+ import registerIntensity from './commands/deviceControl/intensity.js';
17
+ import registerList from './commands/deviceControl/list.js';
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';
22
+ import registerStatus from './commands/deviceControl/status.js';
18
23
  // Expose a function to register commands on a commander program instance
19
24
  export function registerCommands(program, deps) {
20
- // Register config command first since other commands may depend on it
21
- const configDeps = {
22
- ...deps,
23
- loadConfig: deps.loadConfig || (() => null),
24
- saveConfig: deps.saveConfig ||
25
- ((config, changes) => {
26
- if (deps.saveWsUrl && config.wsUrl) {
27
- deps.saveWsUrl(config.wsUrl);
28
- }
29
- // Save the rest of the config
30
- const configPath = path.join(process.env.HOME || '', '.amaran-cli.json');
31
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
32
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
33
- if (changes && changes.length > 0) {
34
- console.log(chalk.green('Configuration saved successfully:'));
35
- changes.forEach((change) => {
36
- console.log(chalk.green(` • ${change}`));
37
- });
38
- }
39
- else {
40
- console.log(chalk.green('Configuration saved successfully'));
41
- }
42
- }),
43
- };
44
- // Register all commands
45
- registerConfig(program, configDeps);
25
+ // Register config command first
26
+ registerConfig(program, deps);
27
+ // Register all other commands
46
28
  registerAutoCct(program, deps);
47
29
  registerPrintSchedule(program, deps);
48
30
  registerGraphSchedule(program, deps);
@@ -56,6 +38,15 @@ export function registerCommands(program, deps) {
56
38
  registerColor(program, deps);
57
39
  registerStatus(program, deps);
58
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);
59
50
  }
60
51
  export default registerCommands;
61
52
  //# sourceMappingURL=commands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
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"}
@@ -0,0 +1,5 @@
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 };
4
+ export declare function calculateCCT(lat: number, lon: number, date?: Date, opts?: CCTOptions, curveType?: CurveType): CCTResult;
5
+ //# sourceMappingURL=cctUtil.d.ts.map
@@ -0,0 +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;AAiO1F,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"}
@@ -0,0 +1,191 @@
1
+ import SunCalc from 'suncalc';
2
+ const { getPosition, getTimes } = SunCalc;
3
+ import { CCT_DEFAULTS } from './constants.js';
4
+ import { CURVE_FUNCTIONS, calculateRealisticBlackbodyDaylight, calculateRealisticCIEDaylight, calculateRealisticHazyDaylight, calculateRealisticPerezDaylight, calculateRealisticPhysicsDaylight, calculateRealisticSunAltitude, getAvailableCurves, parseCurveType, } from './curves/index.js';
5
+ import { CurveType } from './types.js';
6
+ // Re-export for backward compatibility
7
+ export { CurveType, getAvailableCurves, parseCurveType };
8
+ function isValidSunTimes(sunrise, sunset, solarNoon) {
9
+ return (sunrise instanceof Date &&
10
+ !Number.isNaN(sunrise.getTime()) &&
11
+ sunset instanceof Date &&
12
+ !Number.isNaN(sunset.getTime()) &&
13
+ solarNoon instanceof Date &&
14
+ !Number.isNaN(solarNoon.getTime()) &&
15
+ sunset.getTime() > sunrise.getTime() &&
16
+ solarNoon.getTime() > sunrise.getTime() &&
17
+ solarNoon.getTime() < sunset.getTime());
18
+ }
19
+ /**
20
+ * Handle scientific curves (CIE, SUN_ALTITUDE, PEREZ) which use altitude-based calculations
21
+ */
22
+ function calculateScientificCCT(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType, times) {
23
+ const sunrise = times.sunrise;
24
+ const sunset = times.sunset;
25
+ const _solarNoon = times.solarNoon;
26
+ const nightEnd = times.nightEnd;
27
+ const night = times.night;
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())) {
31
+ return {
32
+ cct: Math.round(minK),
33
+ intensity: Math.round(minIntensity),
34
+ lightOutput: 0,
35
+ };
36
+ }
37
+ const t = date.getTime();
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
+ }
61
+ }
62
+ const pos = getPosition(date, lat, lon);
63
+ const altitude = pos.altitude;
64
+ const noonPos = getPosition(_solarNoon, lat, lon);
65
+ const maxAltitude = noonPos.altitude;
66
+ let factors;
67
+ switch (curveType) {
68
+ case CurveType.SUN_ALTITUDE:
69
+ factors = calculateRealisticSunAltitude(altitude, maxAltitude);
70
+ break;
71
+ case CurveType.CIE_DAYLIGHT:
72
+ factors = calculateRealisticCIEDaylight(altitude, maxAltitude);
73
+ break;
74
+ case CurveType.PEREZ_DAYLIGHT:
75
+ factors = calculateRealisticPerezDaylight(altitude, maxAltitude);
76
+ break;
77
+ case CurveType.PHYSICS:
78
+ factors = calculateRealisticPhysicsDaylight(altitude, maxAltitude);
79
+ break;
80
+ case CurveType.BLACKBODY:
81
+ factors = calculateRealisticBlackbodyDaylight(altitude, maxAltitude);
82
+ break;
83
+ case CurveType.HAZY:
84
+ factors = calculateRealisticHazyDaylight(altitude, maxAltitude);
85
+ break;
86
+ default:
87
+ factors = [0, 0, 0];
88
+ }
89
+ const [cctFactor, intensityFactor, rawIntensity] = factors;
90
+ return {
91
+ cct: Math.round(minK + (maxK - minK) * cctFactor),
92
+ intensity: Math.round(minIntensity + (maxIntensity - minIntensity) * intensityFactor),
93
+ lightOutput: Math.round(rawIntensity * CCT_DEFAULTS.maxLux),
94
+ };
95
+ }
96
+ /**
97
+ * Handle empirical curves (HANN, WIDER_MIDDLE) which use time-based calculations
98
+ */
99
+ function calculateEmpiricalCCT(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType, times) {
100
+ const curve = CURVE_FUNCTIONS[curveType];
101
+ const sunrise = times.sunrise;
102
+ const sunset = times.sunset;
103
+ const _solarNoon = times.solarNoon;
104
+ const nightEnd = times.nightEnd;
105
+ const night = times.night;
106
+ if (isValidSunTimes(sunrise, sunset, _solarNoon) &&
107
+ nightEnd instanceof Date &&
108
+ !Number.isNaN(nightEnd.getTime()) &&
109
+ night instanceof Date &&
110
+ !Number.isNaN(night.getTime())) {
111
+ const t = date.getTime();
112
+ const noon = _solarNoon.getTime();
113
+ const nightStartTime = night.getTime();
114
+ const nightEndTime = nightEnd.getTime();
115
+ if (t <= nightEndTime || t >= nightStartTime) {
116
+ return { cct: minK, intensity: minIntensity, lightOutput: 0 };
117
+ }
118
+ let x;
119
+ if (t <= noon) {
120
+ x = ((t - nightEndTime) / (noon - nightEndTime)) * 0.5;
121
+ }
122
+ else {
123
+ x = 0.5 + ((t - noon) / (nightStartTime - noon)) * 0.5;
124
+ }
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
+ }
142
+ return {
143
+ cct: Math.round(minK + (maxK - minK) * f),
144
+ intensity: Math.round(minIntensity + (maxIntensity - minIntensity) * f),
145
+ lightOutput: Math.round(luxEstimate),
146
+ };
147
+ }
148
+ // Fallback for empirical curves when night times are not available
149
+ try {
150
+ const pos = getPosition(date, lat, lon);
151
+ if (pos.altitude <= 0)
152
+ return { cct: minK, intensity: minIntensity, lightOutput: 0 };
153
+ const f = Math.max(0, Math.sin(pos.altitude));
154
+ return {
155
+ cct: Math.round(minK + (maxK - minK) * f),
156
+ intensity: Math.round(minIntensity + (maxIntensity - minIntensity) * f),
157
+ lightOutput: Math.round(f * CCT_DEFAULTS.maxLux),
158
+ };
159
+ }
160
+ catch {
161
+ return { cct: minK, intensity: minIntensity, lightOutput: 0 };
162
+ }
163
+ }
164
+ function calculateCCTCore(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType) {
165
+ const times = getTimes(date, lat, lon);
166
+ const isScientific = curveType === CurveType.CIE_DAYLIGHT ||
167
+ curveType === CurveType.SUN_ALTITUDE ||
168
+ curveType === CurveType.PEREZ_DAYLIGHT ||
169
+ curveType === CurveType.PHYSICS ||
170
+ curveType === CurveType.BLACKBODY ||
171
+ curveType === CurveType.HAZY;
172
+ if (isScientific) {
173
+ return calculateScientificCCT(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType, times);
174
+ }
175
+ return calculateEmpiricalCCT(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType, times);
176
+ }
177
+ export function calculateCCT(lat, lon, date = new Date(), opts, curveType = CurveType.HANN) {
178
+ const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
179
+ const cctMinK = clamp(opts?.cctMinK ?? CCT_DEFAULTS.cctMinK, 1000, 20000);
180
+ const cctMaxK = clamp(opts?.cctMaxK ?? CCT_DEFAULTS.cctMaxK, 1000, 20000);
181
+ const minK = Math.min(cctMinK, cctMaxK);
182
+ const maxK = Math.max(cctMinK, cctMaxK);
183
+ const intensityMinPct = clamp(opts?.intensityMinPct ?? CCT_DEFAULTS.intensityMinPct, 0, 100);
184
+ const intensityMaxPct = clamp(opts?.intensityMaxPct ?? CCT_DEFAULTS.intensityMaxPct, 0, 100);
185
+ const minPct = Math.min(intensityMinPct, intensityMaxPct);
186
+ const maxPct = Math.max(intensityMinPct, intensityMaxPct);
187
+ const minIntensity = Math.round(minPct * 10);
188
+ const maxIntensity = Math.round(maxPct * 10);
189
+ return calculateCCTCore(lat, lon, date, minK, maxK, minIntensity, maxIntensity, curveType);
190
+ }
191
+ //# sourceMappingURL=cctUtil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cctUtil.js","sourceRoot":"","sources":["../../src/daylightSimulation/cctUtil.ts"],"names":[],"mappings":"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"}