amaran-light-cli 1.5.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 (86) hide show
  1. package/README.md +35 -0
  2. package/dist/__tests__/cctUtil.test.js +18 -1
  3. package/dist/__tests__/cctUtil.test.js.map +1 -1
  4. package/dist/__tests__/lightControl.test.js +259 -0
  5. package/dist/__tests__/lightControl.test.js.map +1 -1
  6. package/dist/commands/__tests__/newCommands.test.d.ts +2 -0
  7. package/dist/commands/__tests__/newCommands.test.d.ts.map +1 -0
  8. package/dist/commands/__tests__/newCommands.test.js +195 -0
  9. package/dist/commands/__tests__/newCommands.test.js.map +1 -0
  10. package/dist/commands/daylightSimulation/graphSchedule.js +1 -1
  11. package/dist/commands/daylightSimulation/graphSchedule.js.map +1 -1
  12. package/dist/commands/deviceControl/effect.d.ts +5 -0
  13. package/dist/commands/deviceControl/effect.d.ts.map +1 -0
  14. package/dist/commands/deviceControl/effect.js +172 -0
  15. package/dist/commands/deviceControl/effect.js.map +1 -0
  16. package/dist/commands/deviceControl/fan.d.ts +5 -0
  17. package/dist/commands/deviceControl/fan.d.ts.map +1 -0
  18. package/dist/commands/deviceControl/fan.js +105 -0
  19. package/dist/commands/deviceControl/fan.js.map +1 -0
  20. package/dist/commands/deviceControl/firmware.d.ts +5 -0
  21. package/dist/commands/deviceControl/firmware.d.ts.map +1 -0
  22. package/dist/commands/deviceControl/firmware.js +68 -0
  23. package/dist/commands/deviceControl/firmware.js.map +1 -0
  24. package/dist/commands/deviceControl/group.d.ts +5 -0
  25. package/dist/commands/deviceControl/group.d.ts.map +1 -0
  26. package/dist/commands/deviceControl/group.js +101 -0
  27. package/dist/commands/deviceControl/group.js.map +1 -0
  28. package/dist/commands/deviceControl/info.d.ts +5 -0
  29. package/dist/commands/deviceControl/info.d.ts.map +1 -0
  30. package/dist/commands/deviceControl/info.js +57 -0
  31. package/dist/commands/deviceControl/info.js.map +1 -0
  32. package/dist/commands/deviceControl/preset.d.ts +5 -0
  33. package/dist/commands/deviceControl/preset.d.ts.map +1 -0
  34. package/dist/commands/deviceControl/preset.js +55 -0
  35. package/dist/commands/deviceControl/preset.js.map +1 -0
  36. package/dist/commands/deviceControl/quickshot.d.ts +5 -0
  37. package/dist/commands/deviceControl/quickshot.d.ts.map +1 -0
  38. package/dist/commands/deviceControl/quickshot.js +51 -0
  39. package/dist/commands/deviceControl/quickshot.js.map +1 -0
  40. package/dist/commands/deviceControl/scene.d.ts +5 -0
  41. package/dist/commands/deviceControl/scene.d.ts.map +1 -0
  42. package/dist/commands/deviceControl/scene.js +101 -0
  43. package/dist/commands/deviceControl/scene.js.map +1 -0
  44. package/dist/commands.d.ts.map +1 -1
  45. package/dist/commands.js +17 -0
  46. package/dist/commands.js.map +1 -1
  47. package/dist/daylightSimulation/cctUtil.d.ts.map +1 -1
  48. package/dist/daylightSimulation/cctUtil.js +51 -23
  49. package/dist/daylightSimulation/cctUtil.js.map +1 -1
  50. package/dist/daylightSimulation/constants.d.ts +1 -0
  51. package/dist/daylightSimulation/constants.d.ts.map +1 -1
  52. package/dist/daylightSimulation/constants.js +1 -0
  53. package/dist/daylightSimulation/constants.js.map +1 -1
  54. package/dist/daylightSimulation/curves/realistic.d.ts +6 -6
  55. package/dist/daylightSimulation/curves/realistic.d.ts.map +1 -1
  56. package/dist/daylightSimulation/curves/realistic.js +6 -6
  57. package/dist/daylightSimulation/curves/realistic.js.map +1 -1
  58. package/dist/daylightSimulation/graphSchedule.d.ts +1 -1
  59. package/dist/daylightSimulation/graphSchedule.d.ts.map +1 -1
  60. package/dist/daylightSimulation/graphSchedule.js +27 -5
  61. package/dist/daylightSimulation/graphSchedule.js.map +1 -1
  62. package/dist/daylightSimulation/scheduleMaker.d.ts +2 -5
  63. package/dist/daylightSimulation/scheduleMaker.d.ts.map +1 -1
  64. package/dist/daylightSimulation/scheduleMaker.js.map +1 -1
  65. package/dist/daylightSimulation/textSchedule.d.ts.map +1 -1
  66. package/dist/daylightSimulation/textSchedule.js +2 -2
  67. package/dist/daylightSimulation/textSchedule.js.map +1 -1
  68. package/dist/daylightSimulation/types.d.ts +1 -0
  69. package/dist/daylightSimulation/types.d.ts.map +1 -1
  70. package/dist/daylightSimulation/types.js.map +1 -1
  71. package/dist/deviceControl/discovery.d.ts.map +1 -1
  72. package/dist/deviceControl/discovery.js +0 -2
  73. package/dist/deviceControl/discovery.js.map +1 -1
  74. package/dist/deviceControl/lightControl.d.ts +67 -78
  75. package/dist/deviceControl/lightControl.d.ts.map +1 -1
  76. package/dist/deviceControl/lightControl.js +292 -203
  77. package/dist/deviceControl/lightControl.js.map +1 -1
  78. package/dist/deviceControl/types.d.ts +18 -0
  79. package/dist/deviceControl/types.d.ts.map +1 -1
  80. package/dist/test/MockLightServer.d.ts.map +1 -1
  81. package/dist/test/MockLightServer.js +134 -12
  82. package/dist/test/MockLightServer.js.map +1 -1
  83. package/package.json +8 -7
  84. package/scripts/extract-api.ts +158 -0
  85. package/scripts/extract-usage.ts +199 -0
  86. package/scripts/release.js +9 -9
@@ -0,0 +1,195 @@
1
+ import { Command } from 'commander';
2
+ import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import registerCommands from '../../commands.js';
4
+ import LightController from '../../deviceControl/lightControl.js';
5
+ import { MockLightServer } from '../../test/MockLightServer.js';
6
+ const TEST_PORT = 8091; // Use a different port to avoid conflicts
7
+ const WS_URL = `ws://localhost:${TEST_PORT}`;
8
+ describe('New CLI Commands Integration Tests', () => {
9
+ let server;
10
+ beforeAll(async () => {
11
+ server = new MockLightServer(TEST_PORT);
12
+ await new Promise((resolve) => setTimeout(resolve, 500));
13
+ });
14
+ afterAll(async () => {
15
+ await new Promise((resolve) => {
16
+ server.close(() => resolve());
17
+ });
18
+ await new Promise((resolve) => setTimeout(resolve, 100));
19
+ });
20
+ beforeEach(() => {
21
+ server.resetState();
22
+ vi.clearAllMocks();
23
+ });
24
+ const createDeps = () => {
25
+ const controller = new LightController(WS_URL, 'test-cli-new', undefined, false);
26
+ return {
27
+ createController: async () => {
28
+ await new Promise((resolve, reject) => {
29
+ const ws = controller.getWebSocket();
30
+ const fetchDevices = () => {
31
+ controller.getDeviceList((success) => {
32
+ if (success)
33
+ resolve();
34
+ else
35
+ reject(new Error('Failed to fetch devices'));
36
+ });
37
+ };
38
+ if (ws.readyState === 1) {
39
+ fetchDevices();
40
+ }
41
+ else {
42
+ ws.once('open', () => {
43
+ setTimeout(fetchDevices, 50);
44
+ });
45
+ ws.once('error', reject);
46
+ setTimeout(() => reject(new Error('Timeout connecting')), 2000);
47
+ }
48
+ });
49
+ return controller;
50
+ },
51
+ findDevice: (ctrl, deviceQuery) => {
52
+ const devices = ctrl.getDevices();
53
+ let device = devices.find((d) => d.node_id === deviceQuery || d.id === deviceQuery);
54
+ if (!device) {
55
+ const q = deviceQuery.toLowerCase();
56
+ device = devices.find((d) => {
57
+ const nm = (d.device_name || d.name || '').toLowerCase();
58
+ return nm.includes(q);
59
+ });
60
+ }
61
+ return device || null;
62
+ },
63
+ asyncCommand: (fn) => (...args) => fn(...args),
64
+ loadConfig: () => ({}),
65
+ saveWsUrl: vi.fn(),
66
+ saveConfig: vi.fn(),
67
+ };
68
+ };
69
+ it('should list scenes', async () => {
70
+ const program = new Command();
71
+ program.exitOverride();
72
+ const deps = createDeps();
73
+ registerCommands(program, deps);
74
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {
75
+ /* no-op */
76
+ });
77
+ await program.parseAsync(['node', 'test', 'scene', 'list']);
78
+ await new Promise((resolve) => setTimeout(resolve, 100));
79
+ // Mock server returns empty list by default, so "No scenes found"
80
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('No scenes found'));
81
+ consoleSpy.mockRestore();
82
+ });
83
+ it('should save a scene', async () => {
84
+ const program = new Command();
85
+ program.exitOverride();
86
+ const deps = createDeps();
87
+ registerCommands(program, deps);
88
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {
89
+ /* no-op */
90
+ });
91
+ await program.parseAsync(['node', 'test', 'scene', 'save', 'MyScene']);
92
+ await new Promise((resolve) => setTimeout(resolve, 100));
93
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Scene "MyScene" saved successfully'));
94
+ consoleSpy.mockRestore();
95
+ });
96
+ it('should recall a scene', async () => {
97
+ const program = new Command();
98
+ program.exitOverride();
99
+ const deps = createDeps();
100
+ registerCommands(program, deps);
101
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {
102
+ /* no-op */
103
+ });
104
+ await program.parseAsync(['node', 'test', 'scene', 'recall', 'scene-123']);
105
+ await new Promise((resolve) => setTimeout(resolve, 100));
106
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Scene scene-123 recalled successfully'));
107
+ consoleSpy.mockRestore();
108
+ });
109
+ it('should create a group', async () => {
110
+ const program = new Command();
111
+ program.exitOverride();
112
+ const deps = createDeps();
113
+ registerCommands(program, deps);
114
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {
115
+ /* no-op */
116
+ });
117
+ await program.parseAsync(['node', 'test', 'group', 'create', 'A']);
118
+ await new Promise((resolve) => setTimeout(resolve, 100));
119
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Group "A" created successfully'));
120
+ consoleSpy.mockRestore();
121
+ });
122
+ it('should set fan mode', async () => {
123
+ const program = new Command();
124
+ program.exitOverride();
125
+ const deps = createDeps();
126
+ registerCommands(program, deps);
127
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {
128
+ /* no-op */
129
+ });
130
+ await program.parseAsync(['node', 'test', 'fan', 'mode', '400J5-F2C008', '1']); // Mode 1
131
+ await new Promise((resolve) => setTimeout(resolve, 100));
132
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Fan mode set to 1'));
133
+ // Verify state in mock server
134
+ const state = server.getDeviceState('400J5-F2C008');
135
+ expect(state?.fan_mode).toBe(1); // Args are typically strings via CLI, mock handles appropriately
136
+ consoleSpy.mockRestore();
137
+ });
138
+ it('should set effect', async () => {
139
+ const program = new Command();
140
+ program.exitOverride();
141
+ const deps = createDeps();
142
+ registerCommands(program, deps);
143
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {
144
+ /* no-op */
145
+ });
146
+ await program.parseAsync(['node', 'test', 'effect', 'set', '400J5-F2C008', 'fire']);
147
+ await new Promise((resolve) => setTimeout(resolve, 100));
148
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Effect fire set'));
149
+ const state = server.getDeviceState('400J5-F2C008');
150
+ expect(state?.work_mode).toBe('EFFECT');
151
+ expect(state?.effect_type).toBe('fire');
152
+ consoleSpy.mockRestore();
153
+ });
154
+ it('should check firmware info', async () => {
155
+ const program = new Command();
156
+ program.exitOverride();
157
+ const deps = createDeps();
158
+ registerCommands(program, deps);
159
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {
160
+ /* no-op */
161
+ });
162
+ await program.parseAsync(['node', 'test', 'firmware', 'check', '400J5-F2C008']);
163
+ await new Promise((resolve) => setTimeout(resolve, 100));
164
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Firmware Status'));
165
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Firmware is up to date'));
166
+ consoleSpy.mockRestore();
167
+ });
168
+ it('should apply quickshot', async () => {
169
+ const program = new Command();
170
+ program.exitOverride();
171
+ const deps = createDeps();
172
+ registerCommands(program, deps);
173
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {
174
+ /* no-op */
175
+ });
176
+ await program.parseAsync(['node', 'test', 'quickshot', 'set', 'qs-999']);
177
+ await new Promise((resolve) => setTimeout(resolve, 100));
178
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Quickshot qs-999 applied'));
179
+ consoleSpy.mockRestore();
180
+ });
181
+ it('should recall preset', async () => {
182
+ const program = new Command();
183
+ program.exitOverride();
184
+ const deps = createDeps();
185
+ registerCommands(program, deps);
186
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {
187
+ /* no-op */
188
+ });
189
+ await program.parseAsync(['node', 'test', 'preset', 'recall', '400J5-F2C008', 'p1']);
190
+ await new Promise((resolve) => setTimeout(resolve, 100));
191
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Preset p1 recalled'));
192
+ consoleSpy.mockRestore();
193
+ });
194
+ });
195
+ //# sourceMappingURL=newCommands.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newCommands.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/newCommands.test.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@ export function registerGraphSchedule(program, deps) {
15
15
  .option('-o, --output <filename>', 'Output filename (default: schedule-<date>.png)')
16
16
  .option('-W, --width <width>', 'Image width in pixels (default: 1200)', '1200')
17
17
  .option('-H, --height <height>', 'Image height in pixels (default: 600)', '600')
18
- .option('-m, --metrics <type>', 'Metrics to graph: cct, intensity, or both (default: both)', 'both')
18
+ .option('-m, --metrics <type>', 'Metrics to graph: cct, intensity, lux, both, or all (default: both)', 'both')
19
19
  .action(asyncCommand(handleGraphSchedule(deps)));
20
20
  }
21
21
  function handleGraphSchedule(deps) {
@@ -1 +1 @@
1
- {"version":3,"file":"graphSchedule.js","sourceRoot":"","sources":["../../../src/commands/daylightSimulation/graphSchedule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graphSchedule.js","sourceRoot":"","sources":["../../../src/commands/daylightSimulation/graphSchedule.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 registerEffect(program: Command, deps: CommandDeps): void;
4
+ export default registerEffect;
5
+ //# sourceMappingURL=effect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/effect.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,QA0BjE;AAmLD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,172 @@
1
+ import chalk from 'chalk';
2
+ import { addStandardOptions, runDeviceAction } from '../cmdUtils.js';
3
+ export function registerEffect(program, deps) {
4
+ const { asyncCommand } = deps;
5
+ const effect = program.command('effect').description('Control effects');
6
+ addStandardOptions(effect.command('list').description('List available system effects')).action(asyncCommand(handleEffectList(deps)));
7
+ addStandardOptions(effect
8
+ .command('set <device> <effect_type>')
9
+ .option('-i, --intensity <percent>', 'Intensity percentage')
10
+ .description('Set a system effect')).action(asyncCommand(handleEffectSet(deps)));
11
+ addStandardOptions(effect.command('custom <device> <effect_name>').description('Set a custom effect by name')).action(asyncCommand(handleEffectCustom(deps)));
12
+ addStandardOptions(effect.command('speed <device> <speed>').description('Set effect speed')).action(asyncCommand(handleEffectSpeed(deps)));
13
+ addStandardOptions(effect.command('intensity <device> <intensity>').description('Set effect intensity')).action(asyncCommand(handleEffectIntensity(deps)));
14
+ }
15
+ function handleEffectList(deps) {
16
+ const { createController } = deps;
17
+ return async (options) => {
18
+ const controller = await createController(options.url, options.clientId, options.debug);
19
+ controller.getSystemEffectList((success, message, data) => {
20
+ if (success) {
21
+ const effects = data.data;
22
+ console.log(chalk.blue('System Effects:'));
23
+ effects.forEach((eff) => {
24
+ console.log(` - ${eff}`);
25
+ });
26
+ }
27
+ else {
28
+ console.error(chalk.red(`Error getting effect list: ${message}`));
29
+ }
30
+ controller.disconnect();
31
+ });
32
+ };
33
+ }
34
+ function handleEffectSet(deps) {
35
+ return async (deviceQuery, effectType, options) => {
36
+ let intensity;
37
+ if (options.intensity) {
38
+ const p = parseFloat(options.intensity);
39
+ if (!Number.isNaN(p)) {
40
+ intensity = p * 10; // Convert to API scale
41
+ }
42
+ }
43
+ // Special handling for "all" devices
44
+ if (deviceQuery.toLowerCase() === 'all') {
45
+ const { createController } = deps;
46
+ const controller = await createController(options.url, options.clientId, options.debug);
47
+ try {
48
+ await controller.setSystemEffectForAllLights(effectType, intensity, (success, message) => {
49
+ if (!success) {
50
+ console.error(chalk.red(`Error setting effect for all lights: ${message}`));
51
+ }
52
+ });
53
+ console.log(chalk.green(`Effect ${effectType} set for all lights`));
54
+ }
55
+ finally {
56
+ await controller.disconnect();
57
+ }
58
+ return;
59
+ }
60
+ return runDeviceAction({
61
+ deps,
62
+ options,
63
+ deviceQuery,
64
+ actionName: `set effect ${effectType}`,
65
+ }, (device, controller) => {
66
+ return new Promise((resolve) => {
67
+ controller.setSystemEffect(device.node_id, effectType, intensity, (success, message) => {
68
+ if (success) {
69
+ console.log(chalk.green(`✓ Effect ${effectType} set on ${device.device_name || 'device'}`));
70
+ }
71
+ else {
72
+ console.error(chalk.red(`✗ Failed to set effect: ${message}`));
73
+ }
74
+ resolve();
75
+ });
76
+ });
77
+ }, () => {
78
+ console.log(chalk.yellow('Bulk effect set not supported.'));
79
+ return Promise.resolve();
80
+ });
81
+ };
82
+ }
83
+ function handleEffectCustom(deps) {
84
+ return async (deviceQuery, effectName, options) => {
85
+ return runDeviceAction({
86
+ deps,
87
+ options,
88
+ deviceQuery,
89
+ actionName: `set custom effect ${effectName}`,
90
+ }, (device, controller) => {
91
+ return new Promise((resolve) => {
92
+ controller.setEffect(device.node_id, effectName, {}, (success, message) => {
93
+ if (success) {
94
+ console.log(chalk.green(`✓ Custom effect ${effectName} set on ${device.device_name || 'device'}`));
95
+ }
96
+ else {
97
+ console.error(chalk.red(`✗ Failed to set custom effect: ${message}`));
98
+ }
99
+ resolve();
100
+ });
101
+ });
102
+ }, () => {
103
+ console.log(chalk.yellow('Bulk custom effect not supported.'));
104
+ return Promise.resolve();
105
+ });
106
+ };
107
+ }
108
+ function handleEffectSpeed(deps) {
109
+ return async (deviceQuery, speedStr, options) => {
110
+ const speed = parseInt(speedStr, 10);
111
+ if (Number.isNaN(speed)) {
112
+ console.error(chalk.red('Speed must be a number'));
113
+ return;
114
+ }
115
+ return runDeviceAction({
116
+ deps,
117
+ options,
118
+ deviceQuery,
119
+ actionName: `set effect speed to ${speed}`,
120
+ }, (device, controller) => {
121
+ return new Promise((resolve) => {
122
+ controller.setEffectSpeed(device.node_id, speed, (success, message) => {
123
+ if (success) {
124
+ console.log(chalk.green(`✓ Effect speed set to ${speed} on ${device.device_name || 'device'}`));
125
+ }
126
+ else {
127
+ console.error(chalk.red(`✗ Failed to set effect speed: ${message}`));
128
+ }
129
+ resolve();
130
+ });
131
+ });
132
+ }, () => {
133
+ console.log(chalk.yellow('Bulk effect speed not supported.'));
134
+ return Promise.resolve();
135
+ });
136
+ };
137
+ }
138
+ function handleEffectIntensity(deps) {
139
+ return async (deviceQuery, valueStr, options) => {
140
+ const value = parseInt(valueStr, 10);
141
+ if (Number.isNaN(value)) {
142
+ console.error(chalk.red('Intensity must be a number'));
143
+ return;
144
+ }
145
+ // Note: The API usually expects 0-1000 range or similar. Check constants.
146
+ // Assuming user inputs API value directly for this low-level command,
147
+ // or we could map from percent. Let's assume input matches API expectation for now.
148
+ return runDeviceAction({
149
+ deps,
150
+ options,
151
+ deviceQuery,
152
+ actionName: `set effect intensity to ${value}`,
153
+ }, (device, controller) => {
154
+ return new Promise((resolve) => {
155
+ controller.setEffectIntensity(device.node_id, value, (success, message) => {
156
+ if (success) {
157
+ console.log(chalk.green(`✓ Effect intensity set to ${value} on ${device.device_name || 'device'}`));
158
+ }
159
+ else {
160
+ console.error(chalk.red(`✗ Failed to set effect intensity: ${message}`));
161
+ }
162
+ resolve();
163
+ });
164
+ });
165
+ }, () => {
166
+ console.log(chalk.yellow('Bulk effect intensity not supported.'));
167
+ return Promise.resolve();
168
+ });
169
+ };
170
+ }
171
+ export default registerEffect;
172
+ //# sourceMappingURL=effect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/effect.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 registerFan(program: Command, deps: CommandDeps): void;
4
+ export default registerFan;
5
+ //# sourceMappingURL=fan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fan.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/fan.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,8BAA8B,CAAC;AAGxF,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAe9D;AA8GD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,105 @@
1
+ import chalk from 'chalk';
2
+ import { addStandardOptions, runDeviceAction } from '../cmdUtils.js';
3
+ export function registerFan(program, deps) {
4
+ const { asyncCommand } = deps;
5
+ const fan = program.command('fan').description('Control fan settings');
6
+ addStandardOptions(fan.command('mode <device> <mode>').description('Set fan mode (e.g. 0=Auto, 1=Smart, 2=High, 3=Medium, 4=Silent)')).action(asyncCommand(handleFanMode(deps)));
7
+ addStandardOptions(fan.command('speed <device> <speed>').description('Set fan speed')).action(asyncCommand(handleFanSpeed(deps)));
8
+ addStandardOptions(fan.command('info <device>').description('Get fan status')).action(asyncCommand(handleFanInfo(deps)));
9
+ }
10
+ function handleFanMode(deps) {
11
+ return async (deviceQuery, modeStr, options) => {
12
+ const mode = parseInt(modeStr, 10);
13
+ if (Number.isNaN(mode)) {
14
+ console.error(chalk.red('Fan mode must be a number'));
15
+ return;
16
+ }
17
+ return runDeviceAction({
18
+ deps,
19
+ options,
20
+ deviceQuery,
21
+ actionName: `set fan mode to ${mode}`,
22
+ }, (device, controller) => {
23
+ return new Promise((resolve) => {
24
+ controller.setFanMode(device.node_id, mode, (success, message) => {
25
+ if (success) {
26
+ console.log(chalk.green(`✓ Fan mode set to ${mode} on ${device.device_name || 'device'}`));
27
+ }
28
+ else {
29
+ console.error(chalk.red(`✗ Failed to set fan mode: ${message}`));
30
+ }
31
+ resolve();
32
+ });
33
+ });
34
+ }, () => {
35
+ console.log(chalk.yellow('Bulk fan control not supported.'));
36
+ return Promise.resolve();
37
+ });
38
+ };
39
+ }
40
+ function handleFanSpeed(deps) {
41
+ return async (deviceQuery, speedStr, options) => {
42
+ const speed = parseInt(speedStr, 10);
43
+ if (Number.isNaN(speed)) {
44
+ console.error(chalk.red('Fan speed must be a number'));
45
+ return;
46
+ }
47
+ return runDeviceAction({
48
+ deps,
49
+ options,
50
+ deviceQuery,
51
+ actionName: `set fan speed to ${speed}`,
52
+ }, (device, controller) => {
53
+ return new Promise((resolve) => {
54
+ controller.setFanSpeed(device.node_id, speed, (success, message) => {
55
+ if (success) {
56
+ console.log(chalk.green(`✓ Fan speed set to ${speed} on ${device.device_name || 'device'}`));
57
+ }
58
+ else {
59
+ console.error(chalk.red(`✗ Failed to set fan speed: ${message}`));
60
+ }
61
+ resolve();
62
+ });
63
+ });
64
+ }, () => {
65
+ console.log(chalk.yellow('Bulk fan control not supported.'));
66
+ return Promise.resolve();
67
+ });
68
+ };
69
+ }
70
+ function handleFanInfo(deps) {
71
+ return async (deviceQuery, options) => {
72
+ return runDeviceAction({
73
+ deps,
74
+ options,
75
+ deviceQuery,
76
+ actionName: 'get fan status',
77
+ }, (device, controller) => {
78
+ return new Promise((resolve) => {
79
+ const nodeId = device.node_id;
80
+ controller.getFanMode(nodeId, (success, message, mode) => {
81
+ if (success) {
82
+ controller.getFanSpeed(nodeId, (successSpeed, _, speed) => {
83
+ const displayName = device.device_name || device.name || 'Unknown';
84
+ console.log(chalk.blue(`Fan Information for ${displayName}:`));
85
+ console.log(` Mode: ${mode}`);
86
+ if (successSpeed) {
87
+ console.log(` Speed: ${speed}`);
88
+ }
89
+ resolve();
90
+ });
91
+ }
92
+ else {
93
+ console.error(chalk.red(`✗ Failed to get fan info: ${message}`));
94
+ resolve();
95
+ }
96
+ });
97
+ });
98
+ }, () => {
99
+ console.log(chalk.yellow('Bulk fan info not supported.'));
100
+ return Promise.resolve();
101
+ });
102
+ };
103
+ }
104
+ export default registerFan;
105
+ //# sourceMappingURL=fan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fan.js","sourceRoot":"","sources":["../../../src/commands/deviceControl/fan.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 registerFirmware(program: Command, deps: CommandDeps): void;
4
+ export default registerFirmware;
5
+ //# sourceMappingURL=firmware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firmware.d.ts","sourceRoot":"","sources":["../../../src/commands/deviceControl/firmware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,8BAA8B,CAAC;AAGxF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAWnE;AAoED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,68 @@
1
+ import chalk from 'chalk';
2
+ import { addStandardOptions, runDeviceAction } from '../cmdUtils.js';
3
+ export function registerFirmware(program, deps) {
4
+ const { asyncCommand } = deps;
5
+ const fw = program.command('firmware').description('Manage device firmware');
6
+ addStandardOptions(fw.command('check <device>').description('Check for firmware updates')).action(asyncCommand(handleFirmwareCheck(deps)));
7
+ addStandardOptions(fw.command('update <device>').description('Update device firmware')).action(asyncCommand(handleFirmwareUpdate(deps)));
8
+ }
9
+ function handleFirmwareCheck(deps) {
10
+ return async (deviceQuery, options) => {
11
+ return runDeviceAction({
12
+ deps,
13
+ options,
14
+ deviceQuery,
15
+ actionName: 'check firmware',
16
+ }, (device, controller) => {
17
+ return new Promise((resolve) => {
18
+ controller.checkForUpdates(device.node_id, (success, message, data) => {
19
+ if (success) {
20
+ const displayName = device.device_name || device.name || 'Unknown';
21
+ console.log(chalk.blue(`Firmware Status for ${displayName}:`));
22
+ // API returns update_available boolean usually
23
+ const available = data?.update_available;
24
+ if (available) {
25
+ console.log(chalk.green('Update Available!'));
26
+ }
27
+ else {
28
+ console.log(chalk.green('Firmware is up to date.'));
29
+ }
30
+ console.log('Details:', data);
31
+ }
32
+ else {
33
+ console.error(chalk.red(`✗ Failed to check firmware: ${message}`));
34
+ }
35
+ resolve();
36
+ });
37
+ });
38
+ }, () => Promise.resolve());
39
+ };
40
+ }
41
+ function handleFirmwareUpdate(deps) {
42
+ return async (deviceQuery, options) => {
43
+ return runDeviceAction({
44
+ deps,
45
+ options,
46
+ deviceQuery,
47
+ actionName: 'update firmware',
48
+ }, (device, controller) => {
49
+ return new Promise((resolve) => {
50
+ // Ask for confirmation? For CLI automation often skip.
51
+ // In a real app we might prompt.
52
+ console.log(chalk.yellow(`Initiating firmware update for ${device.device_name || device.node_id}...`));
53
+ controller.updateFirmware(device.node_id, (success, message, data) => {
54
+ if (success) {
55
+ console.log(chalk.green('✓ Update command sent successfully'));
56
+ console.log('Response:', data);
57
+ }
58
+ else {
59
+ console.error(chalk.red(`✗ Failed to start update: ${message}`));
60
+ }
61
+ resolve();
62
+ });
63
+ });
64
+ }, () => Promise.resolve());
65
+ };
66
+ }
67
+ export default registerFirmware;
68
+ //# sourceMappingURL=firmware.js.map