amaran-light-cli 1.11.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -14
- package/dist/__tests__/autoCct.test.js +27 -0
- package/dist/__tests__/autoCct.test.js.map +1 -1
- package/dist/__tests__/bleHttpControl.test.d.ts +2 -0
- package/dist/__tests__/bleHttpControl.test.d.ts.map +1 -0
- package/dist/__tests__/bleHttpControl.test.js +230 -0
- package/dist/__tests__/bleHttpControl.test.js.map +1 -0
- package/dist/__tests__/bleStack.test.d.ts +2 -0
- package/dist/__tests__/bleStack.test.d.ts.map +1 -0
- package/dist/__tests__/bleStack.test.js +1239 -0
- package/dist/__tests__/bleStack.test.js.map +1 -0
- package/dist/__tests__/cctUtil.test.js +9 -4
- package/dist/__tests__/cctUtil.test.js.map +1 -1
- package/dist/__tests__/circadianDashboardSettings.test.d.ts +2 -0
- package/dist/__tests__/circadianDashboardSettings.test.d.ts.map +1 -0
- package/dist/__tests__/circadianDashboardSettings.test.js +82 -0
- package/dist/__tests__/circadianDashboardSettings.test.js.map +1 -0
- package/dist/__tests__/circadianIsolation.test.d.ts +2 -0
- package/dist/__tests__/circadianIsolation.test.d.ts.map +1 -0
- package/dist/__tests__/circadianIsolation.test.js +30 -0
- package/dist/__tests__/circadianIsolation.test.js.map +1 -0
- package/dist/__tests__/cli.config.test.js +49 -0
- package/dist/__tests__/cli.config.test.js.map +1 -1
- package/dist/__tests__/cli.smoke.test.js +34 -0
- package/dist/__tests__/cli.smoke.test.js.map +1 -1
- package/dist/__tests__/currentCct.test.d.ts +2 -0
- package/dist/__tests__/currentCct.test.d.ts.map +1 -0
- package/dist/__tests__/currentCct.test.js +29 -0
- package/dist/__tests__/currentCct.test.js.map +1 -0
- package/dist/__tests__/dashboard.test.d.ts +2 -0
- package/dist/__tests__/dashboard.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard.test.js +126 -0
- package/dist/__tests__/dashboard.test.js.map +1 -0
- package/dist/__tests__/daylightSimulationParseUtils.test.d.ts +2 -0
- package/dist/__tests__/daylightSimulationParseUtils.test.d.ts.map +1 -0
- package/dist/__tests__/daylightSimulationParseUtils.test.js +16 -0
- package/dist/__tests__/daylightSimulationParseUtils.test.js.map +1 -0
- package/dist/__tests__/desktopImport.test.d.ts +2 -0
- package/dist/__tests__/desktopImport.test.d.ts.map +1 -0
- package/dist/__tests__/desktopImport.test.js +234 -0
- package/dist/__tests__/desktopImport.test.js.map +1 -0
- package/dist/__tests__/lightControl.basic.test.d.ts +2 -0
- package/dist/__tests__/lightControl.basic.test.d.ts.map +1 -0
- package/dist/__tests__/lightControl.basic.test.js +119 -0
- package/dist/__tests__/lightControl.basic.test.js.map +1 -0
- package/dist/__tests__/lightControl.colorEffects.test.d.ts +2 -0
- package/dist/__tests__/lightControl.colorEffects.test.d.ts.map +1 -0
- package/dist/__tests__/lightControl.colorEffects.test.js +170 -0
- package/dist/__tests__/lightControl.colorEffects.test.js.map +1 -0
- package/dist/__tests__/lightControl.management.test.d.ts +2 -0
- package/dist/__tests__/lightControl.management.test.d.ts.map +1 -0
- package/dist/__tests__/lightControl.management.test.js +90 -0
- package/dist/__tests__/lightControl.management.test.js.map +1 -0
- package/dist/__tests__/lightControlTestUtils.d.ts +10 -0
- package/dist/__tests__/lightControlTestUtils.d.ts.map +1 -0
- package/dist/__tests__/lightControlTestUtils.js +57 -0
- package/dist/__tests__/lightControlTestUtils.js.map +1 -0
- package/dist/__tests__/meshConfiguration.test.d.ts +2 -0
- package/dist/__tests__/meshConfiguration.test.d.ts.map +1 -0
- package/dist/__tests__/meshConfiguration.test.js +78 -0
- package/dist/__tests__/meshConfiguration.test.js.map +1 -0
- package/dist/__tests__/nativeGroups.test.d.ts +2 -0
- package/dist/__tests__/nativeGroups.test.d.ts.map +1 -0
- package/dist/__tests__/nativeGroups.test.js +104 -0
- package/dist/__tests__/nativeGroups.test.js.map +1 -0
- package/dist/__tests__/programApi.test.d.ts +2 -0
- package/dist/__tests__/programApi.test.d.ts.map +1 -0
- package/dist/__tests__/programApi.test.js +73 -0
- package/dist/__tests__/programApi.test.js.map +1 -0
- package/dist/__tests__/programs.test.d.ts +2 -0
- package/dist/__tests__/programs.test.d.ts.map +1 -0
- package/dist/__tests__/programs.test.js +176 -0
- package/dist/__tests__/programs.test.js.map +1 -0
- package/dist/__tests__/scheduleMaker.test.d.ts +2 -0
- package/dist/__tests__/scheduleMaker.test.d.ts.map +1 -0
- package/dist/__tests__/scheduleMaker.test.js +25 -0
- package/dist/__tests__/scheduleMaker.test.js.map +1 -0
- package/dist/ble/async.d.ts +2 -0
- package/dist/ble/async.d.ts.map +1 -0
- package/dist/ble/async.js +15 -0
- package/dist/ble/async.js.map +1 -0
- package/dist/ble/colors.d.ts +5 -0
- package/dist/ble/colors.d.ts.map +1 -0
- package/dist/ble/colors.js +44 -0
- package/dist/ble/colors.js.map +1 -0
- package/dist/ble/configuration.d.ts +22 -0
- package/dist/ble/configuration.d.ts.map +1 -0
- package/dist/ble/configuration.js +122 -0
- package/dist/ble/configuration.js.map +1 -0
- package/dist/ble/controller.d.ts +118 -0
- package/dist/ble/controller.d.ts.map +1 -0
- package/dist/ble/controller.js +931 -0
- package/dist/ble/controller.js.map +1 -0
- package/dist/ble/crypto.d.ts +34 -0
- package/dist/ble/crypto.d.ts.map +1 -0
- package/dist/ble/crypto.js +178 -0
- package/dist/ble/crypto.js.map +1 -0
- package/dist/ble/daemon.d.ts +2 -0
- package/dist/ble/daemon.d.ts.map +1 -0
- package/dist/ble/daemon.js +76 -0
- package/dist/ble/daemon.js.map +1 -0
- package/dist/ble/dashboard.d.ts +331 -0
- package/dist/ble/dashboard.d.ts.map +1 -0
- package/dist/ble/dashboard.js +280 -0
- package/dist/ble/dashboard.js.map +1 -0
- package/dist/ble/desktop.d.ts +4 -0
- package/dist/ble/desktop.d.ts.map +1 -0
- package/dist/ble/desktop.js +33 -0
- package/dist/ble/desktop.js.map +1 -0
- package/dist/ble/desktopLibrary.d.ts +12 -0
- package/dist/ble/desktopLibrary.d.ts.map +1 -0
- package/dist/ble/desktopLibrary.js +346 -0
- package/dist/ble/desktopLibrary.js.map +1 -0
- package/dist/ble/effects.d.ts +34 -0
- package/dist/ble/effects.d.ts.map +1 -0
- package/dist/ble/effects.js +138 -0
- package/dist/ble/effects.js.map +1 -0
- package/dist/ble/fan.d.ts +244 -0
- package/dist/ble/fan.d.ts.map +1 -0
- package/dist/ble/fan.js +46 -0
- package/dist/ble/fan.js.map +1 -0
- package/dist/ble/library.d.ts +341 -0
- package/dist/ble/library.d.ts.map +1 -0
- package/dist/ble/library.js +201 -0
- package/dist/ble/library.js.map +1 -0
- package/dist/ble/media.d.ts +133 -0
- package/dist/ble/media.d.ts.map +1 -0
- package/dist/ble/media.js +186 -0
- package/dist/ble/media.js.map +1 -0
- package/dist/ble/nativeGroups.d.ts +22 -0
- package/dist/ble/nativeGroups.d.ts.map +1 -0
- package/dist/ble/nativeGroups.js +114 -0
- package/dist/ble/nativeGroups.js.map +1 -0
- package/dist/ble/packets.d.ts +3 -0
- package/dist/ble/packets.d.ts.map +1 -0
- package/dist/ble/packets.js +15 -0
- package/dist/ble/packets.js.map +1 -0
- package/dist/ble/programs.d.ts +318 -0
- package/dist/ble/programs.d.ts.map +1 -0
- package/dist/ble/programs.js +329 -0
- package/dist/ble/programs.js.map +1 -0
- package/dist/ble/provisioning.d.ts +13 -0
- package/dist/ble/provisioning.d.ts.map +1 -0
- package/dist/ble/provisioning.js +39 -0
- package/dist/ble/provisioning.js.map +1 -0
- package/dist/ble/server.d.ts +18 -0
- package/dist/ble/server.d.ts.map +1 -0
- package/dist/ble/server.js +548 -0
- package/dist/ble/server.js.map +1 -0
- package/dist/ble/service.d.ts +2 -0
- package/dist/ble/service.d.ts.map +1 -0
- package/dist/ble/service.js +77 -0
- package/dist/ble/service.js.map +1 -0
- package/dist/ble/settings.d.ts +18 -0
- package/dist/ble/settings.d.ts.map +1 -0
- package/dist/ble/settings.js +25 -0
- package/dist/ble/settings.js.map +1 -0
- package/dist/ble/setup.d.ts +2 -0
- package/dist/ble/setup.d.ts.map +1 -0
- package/dist/ble/setup.js +31 -0
- package/dist/ble/setup.js.map +1 -0
- package/dist/ble/storage.d.ts +94 -0
- package/dist/ble/storage.d.ts.map +1 -0
- package/dist/ble/storage.js +132 -0
- package/dist/ble/storage.js.map +1 -0
- package/dist/ble/telink.d.ts +63 -0
- package/dist/ble/telink.d.ts.map +1 -0
- package/dist/ble/telink.js +108 -0
- package/dist/ble/telink.js.map +1 -0
- package/dist/ble/transitions.d.ts +3 -0
- package/dist/ble/transitions.d.ts.map +1 -0
- package/dist/ble/transitions.js +28 -0
- package/dist/ble/transitions.js.map +1 -0
- package/dist/ble/transport.d.ts +48 -0
- package/dist/ble/transport.d.ts.map +1 -0
- package/dist/ble/transport.js +370 -0
- package/dist/ble/transport.js.map +1 -0
- package/dist/circadian.d.ts +3 -0
- package/dist/circadian.d.ts.map +1 -1
- package/dist/circadian.js +2 -0
- package/dist/circadian.js.map +1 -1
- package/dist/cli.d.ts +3 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +125 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/newCommands.test.js +3 -4
- package/dist/commands/__tests__/newCommands.test.js.map +1 -1
- package/dist/commands/cmdUtils.d.ts +5 -2
- package/dist/commands/cmdUtils.d.ts.map +1 -1
- package/dist/commands/cmdUtils.js +29 -10
- package/dist/commands/cmdUtils.js.map +1 -1
- package/dist/commands/daylightSimulation/autoCct.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/autoCct.js +67 -197
- package/dist/commands/daylightSimulation/autoCct.js.map +1 -1
- package/dist/commands/daylightSimulation/graphSchedule.d.ts +1 -1
- package/dist/commands/daylightSimulation/graphSchedule.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/printSchedule.d.ts +1 -1
- package/dist/commands/daylightSimulation/printSchedule.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/printSchedule.js +2 -2
- package/dist/commands/daylightSimulation/printSchedule.js.map +1 -1
- package/dist/commands/daylightSimulation/service.d.ts +1 -1
- package/dist/commands/daylightSimulation/service.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/service.js +5 -3
- package/dist/commands/daylightSimulation/service.js.map +1 -1
- package/dist/commands/daylightSimulation/simulateSchedule.d.ts +1 -1
- package/dist/commands/daylightSimulation/simulateSchedule.d.ts.map +1 -1
- package/dist/commands/daylightSimulation/simulateSchedule.js +5 -4
- package/dist/commands/daylightSimulation/simulateSchedule.js.map +1 -1
- package/dist/commands/deviceControl/ble.d.ts +4 -0
- package/dist/commands/deviceControl/ble.d.ts.map +1 -0
- package/dist/commands/deviceControl/ble.js +214 -0
- package/dist/commands/deviceControl/ble.js.map +1 -0
- package/dist/commands/deviceControl/cct.d.ts.map +1 -1
- package/dist/commands/deviceControl/cct.js +41 -11
- package/dist/commands/deviceControl/cct.js.map +1 -1
- package/dist/commands/deviceControl/color.d.ts.map +1 -1
- package/dist/commands/deviceControl/color.js +13 -3
- package/dist/commands/deviceControl/color.js.map +1 -1
- package/dist/commands/deviceControl/config.d.ts.map +1 -1
- package/dist/commands/deviceControl/config.js +26 -3
- package/dist/commands/deviceControl/config.js.map +1 -1
- package/dist/commands/deviceControl/{discover.d.ts → desktop.d.ts} +3 -2
- package/dist/commands/deviceControl/desktop.d.ts.map +1 -0
- package/dist/commands/deviceControl/desktop.js +66 -0
- package/dist/commands/deviceControl/desktop.js.map +1 -0
- package/dist/commands/deviceControl/effect.d.ts.map +1 -1
- package/dist/commands/deviceControl/effect.js +90 -159
- package/dist/commands/deviceControl/effect.js.map +1 -1
- package/dist/commands/deviceControl/fan.d.ts.map +1 -1
- package/dist/commands/deviceControl/fan.js +77 -95
- package/dist/commands/deviceControl/fan.js.map +1 -1
- package/dist/commands/deviceControl/group.d.ts.map +1 -1
- package/dist/commands/deviceControl/group.js +43 -6
- package/dist/commands/deviceControl/group.js.map +1 -1
- package/dist/commands/deviceControl/hsi.d.ts.map +1 -1
- package/dist/commands/deviceControl/hsi.js +3 -1
- package/dist/commands/deviceControl/hsi.js.map +1 -1
- package/dist/commands/deviceControl/info.d.ts.map +1 -1
- package/dist/commands/deviceControl/info.js +0 -50
- package/dist/commands/deviceControl/info.js.map +1 -1
- package/dist/commands/deviceControl/intensity.d.ts.map +1 -1
- package/dist/commands/deviceControl/intensity.js +32 -8
- package/dist/commands/deviceControl/intensity.js.map +1 -1
- package/dist/commands/deviceControl/list.d.ts.map +1 -1
- package/dist/commands/deviceControl/list.js +3 -2
- package/dist/commands/deviceControl/list.js.map +1 -1
- package/dist/commands/deviceControl/power.d.ts.map +1 -1
- package/dist/commands/deviceControl/power.js +9 -3
- package/dist/commands/deviceControl/power.js.map +1 -1
- package/dist/commands/deviceControl/preset.d.ts.map +1 -1
- package/dist/commands/deviceControl/preset.js +56 -19
- package/dist/commands/deviceControl/preset.js.map +1 -1
- package/dist/commands/deviceControl/program.d.ts +4 -0
- package/dist/commands/deviceControl/program.d.ts.map +1 -0
- package/dist/commands/deviceControl/program.js +199 -0
- package/dist/commands/deviceControl/program.js.map +1 -0
- package/dist/commands/deviceControl/quickshot.d.ts.map +1 -1
- package/dist/commands/deviceControl/quickshot.js +75 -13
- package/dist/commands/deviceControl/quickshot.js.map +1 -1
- package/dist/commands/deviceControl/scene.d.ts.map +1 -1
- package/dist/commands/deviceControl/scene.js +72 -9
- package/dist/commands/deviceControl/scene.js.map +1 -1
- package/dist/commands/deviceControl/status.d.ts.map +1 -1
- package/dist/commands/deviceControl/status.js +26 -3
- package/dist/commands/deviceControl/status.js.map +1 -1
- package/dist/commands/parseUtils.d.ts +1 -1
- package/dist/commands/parseUtils.d.ts.map +1 -1
- package/dist/commands/parseUtils.js +1 -11
- package/dist/commands/parseUtils.js.map +1 -1
- package/dist/commands-api.d.ts +1 -1
- package/dist/commands-api.d.ts.map +1 -1
- package/dist/commands-api.js +1 -1
- package/dist/commands-api.js.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +4 -2
- package/dist/commands.js.map +1 -1
- package/dist/config.d.ts +82 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -2
- package/dist/config.js.map +1 -1
- package/dist/daylightSimulation/cctUtil.d.ts.map +1 -1
- package/dist/daylightSimulation/cctUtil.js +2 -2
- package/dist/daylightSimulation/cctUtil.js.map +1 -1
- package/dist/daylightSimulation/constants.d.ts +10 -0
- package/dist/daylightSimulation/constants.d.ts.map +1 -1
- package/dist/daylightSimulation/constants.js +4 -0
- package/dist/daylightSimulation/constants.js.map +1 -1
- package/dist/daylightSimulation/currentCct.d.ts +42 -0
- package/dist/daylightSimulation/currentCct.d.ts.map +1 -0
- package/dist/daylightSimulation/currentCct.js +217 -0
- package/dist/daylightSimulation/currentCct.js.map +1 -0
- package/dist/daylightSimulation/dashboardSettings.d.ts +47 -0
- package/dist/daylightSimulation/dashboardSettings.d.ts.map +1 -0
- package/dist/daylightSimulation/dashboardSettings.js +95 -0
- package/dist/daylightSimulation/dashboardSettings.js.map +1 -0
- package/dist/daylightSimulation/dashboardStatus.d.ts +72 -0
- package/dist/daylightSimulation/dashboardStatus.d.ts.map +1 -0
- package/dist/daylightSimulation/dashboardStatus.js +191 -0
- package/dist/daylightSimulation/dashboardStatus.js.map +1 -0
- package/dist/daylightSimulation/parseUtils.d.ts +3 -0
- package/dist/daylightSimulation/parseUtils.d.ts.map +1 -0
- package/dist/daylightSimulation/parseUtils.js +25 -0
- package/dist/daylightSimulation/parseUtils.js.map +1 -0
- package/dist/daylightSimulation/scheduleMaker.d.ts +2 -2
- package/dist/daylightSimulation/scheduleMaker.d.ts.map +1 -1
- package/dist/daylightSimulation/scheduleMaker.js +6 -6
- package/dist/daylightSimulation/scheduleMaker.js.map +1 -1
- package/dist/daylightSimulation/types.d.ts +13 -2
- package/dist/daylightSimulation/types.d.ts.map +1 -1
- package/dist/daylightSimulation/types.js +0 -2
- package/dist/daylightSimulation/types.js.map +1 -1
- package/dist/device-control.d.ts +1 -0
- package/dist/device-control.d.ts.map +1 -1
- package/dist/device-control.js +1 -0
- package/dist/device-control.js.map +1 -1
- package/dist/deviceControl/bleHttpControl.d.ts +129 -0
- package/dist/deviceControl/bleHttpControl.d.ts.map +1 -0
- package/dist/deviceControl/bleHttpControl.js +753 -0
- package/dist/deviceControl/bleHttpControl.js.map +1 -0
- package/dist/deviceControl/lightControl.d.ts +8 -68
- package/dist/deviceControl/lightControl.d.ts.map +1 -1
- package/dist/deviceControl/lightControl.js +6 -246
- package/dist/deviceControl/lightControl.js.map +1 -1
- package/dist/deviceControl/lightControlCommands.d.ts +68 -0
- package/dist/deviceControl/lightControlCommands.d.ts.map +1 -0
- package/dist/deviceControl/lightControlCommands.js +244 -0
- package/dist/deviceControl/lightControlCommands.js.map +1 -0
- package/dist/deviceControl/types.d.ts +75 -4
- package/dist/deviceControl/types.d.ts.map +1 -1
- package/dist/deviceControl/types.js +1 -0
- package/dist/deviceControl/types.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/test/MockLightServer.d.ts +1 -0
- package/dist/test/MockLightServer.d.ts.map +1 -1
- package/dist/test/MockLightServer.js +5 -0
- package/dist/test/MockLightServer.js.map +1 -1
- package/docs/CHANGELOG.md +37 -0
- package/docs/DIRECT_BLE.md +359 -0
- package/package.json +8 -4
- package/scripts/ble-cli-check.ts +129 -0
- package/scripts/ble-config-probe.ts +109 -0
- package/scripts/ble-effects-check.ts +82 -0
- package/scripts/ble-extended-probe.ts +44 -0
- package/scripts/ble-fan-check.ts +129 -0
- package/scripts/ble-feature-probe.ts +37 -0
- package/scripts/ble-followup-check.ts +165 -0
- package/scripts/ble-hardware-check.ts +99 -0
- package/scripts/ble-live-extended-check.ts +205 -0
- package/scripts/ble-non-ota-check.ts +193 -0
- package/scripts/ble-probe.ts +45 -0
- package/scripts/calibrate-webcam.ts +152 -0
- package/scripts/desktop-reference.ts +85 -0
- package/scripts/webcam.ts +129 -0
- package/dist/__tests__/lightControl.test.d.ts +0 -2
- package/dist/__tests__/lightControl.test.d.ts.map +0 -1
- package/dist/__tests__/lightControl.test.js +0 -424
- package/dist/__tests__/lightControl.test.js.map +0 -1
- package/dist/commands/deviceControl/discover.d.ts.map +0 -1
- package/dist/commands/deviceControl/discover.js +0 -29
- package/dist/commands/deviceControl/discover.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Amaran Light CLI
|
|
2
2
|
|
|
3
|
-
A command line tool for controlling Aputure Amaran lights via WebSocket connection to the Amaran Desktop application.
|
|
3
|
+
A command line tool for controlling Aputure Amaran lights via WebSocket connection to the Amaran Desktop application, or directly over Bluetooth Mesh using the included local BLE daemon. The legacy HTTP daemon from [wesbos/amaran-BLE-control](https://github.com/wesbos/amaran-BLE-control) is also supported. Not an official Amaran command line tool.
|
|
4
4
|
|
|
5
5
|
Also has a circadian lighting command called `auto-cct` that will set the CCT & intensity according to the time of day it is currently at your location, and a service that will run the command every minute to automate it.
|
|
6
6
|
|
|
@@ -33,8 +33,8 @@ It's not as obvious, but this repo is published on npm too: https://www.npmjs.co
|
|
|
33
33
|
|
|
34
34
|
## Prerequisites
|
|
35
35
|
|
|
36
|
-
-
|
|
37
|
-
-
|
|
36
|
+
- Default direct BLE backend: macOS with Bluetooth permission for Node and a private mesh configuration imported from the previous BLE project. The included daemon listens on `http://127.0.0.1:2708`; Amaran Desktop is not required at runtime.
|
|
37
|
+
- Explicit Desktop backend: Aputure Amaran Desktop must be running with its WebSocket server accessible (default: `ws://localhost:60124`). Select it with `--backend desktop`; `websocket` remains a compatibility alias.
|
|
38
38
|
|
|
39
39
|
## Library Usage
|
|
40
40
|
|
|
@@ -82,12 +82,21 @@ registerCommands(program, deps);
|
|
|
82
82
|
|
|
83
83
|
## Configuration
|
|
84
84
|
|
|
85
|
-
Configure the
|
|
85
|
+
Configure the light control backend and other settings:
|
|
86
86
|
|
|
87
87
|
```bash
|
|
88
|
-
#
|
|
88
|
+
# Use the default direct BLE backend
|
|
89
|
+
amaran-cli config --backend ble --ble-url http://localhost:2708
|
|
90
|
+
|
|
91
|
+
# Explicitly use Amaran Desktop
|
|
92
|
+
amaran-cli config --backend desktop
|
|
93
|
+
|
|
94
|
+
# Set the Desktop WebSocket URL
|
|
89
95
|
amaran-cli config -u ws://localhost:60124
|
|
90
96
|
|
|
97
|
+
# If the BLE daemon has http.apiKey configured
|
|
98
|
+
amaran-cli config --ble-api-key my-secret
|
|
99
|
+
|
|
91
100
|
# Set client ID
|
|
92
101
|
amaran-cli config -c my-cli-client
|
|
93
102
|
|
|
@@ -101,21 +110,103 @@ amaran-cli config --lat 40.7128 --lon -74.0060
|
|
|
101
110
|
amaran-cli config --show
|
|
102
111
|
```
|
|
103
112
|
|
|
104
|
-
Configuration is stored in `~/.amaran-cli.json
|
|
113
|
+
Configuration is stored in the platform config directory used by the CLI; legacy `~/.amaran-cli.json` is still read when no new config exists.
|
|
114
|
+
|
|
115
|
+
You can also select the backend per command without changing config:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
amaran-cli list --url http://localhost:2708
|
|
119
|
+
amaran-cli cct 5600 -i 80
|
|
120
|
+
amaran-cli list --backend desktop
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
When `--url` is used with `--backend`, it overrides the endpoint for that backend: an HTTP base URL for `ble`, or a WebSocket URL for `desktop`/`websocket`.
|
|
124
|
+
|
|
125
|
+
Direct BLE is the default when neither the command nor configuration selects a backend. Use `--backend desktop` for Amaran Desktop; the legacy name `--backend websocket` remains accepted. The included daemon supports power, brightness, CCT, 150c G/M and HSI, native effects/trigger requests, fan profiles, named/hex colors through HSI, relative adjustments, local groups/scenes/presets/quickshots with fan settings, and CCT/HSI/scene transitions. Manual lighting changes create a persistent 30-minute circadian override; use `ble override resume` to hand control back sooner. Hardware settings require matching authenticated readback; transient trigger events explicitly lack event confirmation, and library operations confirm local persistence instead.
|
|
126
|
+
|
|
127
|
+
Neither model has native RGB/XY or advanced HSI CCT/G/M. The BLE stack implements all eight native fan modes, including explicit manual RPM control, for individual fixtures, groups and all lights. Every mode requires advertised device support: the tested 150c and 200x S fixtures currently advertise only Smart and Medium. Mode changes are verified by readback; zero reported RPM is not treated as a fault. Active thermal protection blocks changes without restarting the fixture, and stopped-cooling requests require LEDs off or at zero brightness.
|
|
128
|
+
|
|
129
|
+
Optional native mesh groups use verified subscriptions after private Device Key import. Desktop effect presets, quickshots, and workspaces can be previewed and imported without applying lighting. Bounded timelines, local audio-driven brightness and image/camera HSI picking run as cancellable daemon jobs and restore initial settings by default. Provisioning discovery and key-refresh inspection are read-only; full joining/re-keying is not implemented. OTA/firmware updates are intentionally excluded, and unverified dimming-curve writes remain unavailable.
|
|
105
130
|
|
|
106
|
-
|
|
131
|
+
### Direct Bluetooth setup
|
|
107
132
|
|
|
108
|
-
|
|
133
|
+
```bash
|
|
134
|
+
npm ci
|
|
135
|
+
npm run build
|
|
136
|
+
|
|
137
|
+
# One-time import; mesh keys remain in the private platform config directory.
|
|
138
|
+
node dist/cli.js ble import ../amaran-BLE-control/lights.json
|
|
139
|
+
|
|
140
|
+
# Quit Amaran Desktop and pause other lighting automation before initial testing.
|
|
141
|
+
node dist/cli.js ble serve
|
|
142
|
+
|
|
143
|
+
# Alternatively, install a persistent macOS user service.
|
|
144
|
+
node dist/cli.js ble service install
|
|
145
|
+
node dist/cli.js ble service status
|
|
146
|
+
|
|
147
|
+
node dist/cli.js status
|
|
148
|
+
node dist/cli.js cct 3200 desk -i 5
|
|
149
|
+
node dist/cli.js hsi 240 100 5 back
|
|
150
|
+
node dist/cli.js ble gm back 20
|
|
151
|
+
node dist/cli.js ble health
|
|
152
|
+
node dist/cli.js ble dashboard --open
|
|
153
|
+
node dist/cli.js ble import-desktop "/path/to/amaran.db"
|
|
154
|
+
node dist/cli.js intensity 5 all
|
|
155
|
+
node dist/cli.js ble batch brightness --args '{"value":5}' --broadcast
|
|
156
|
+
node dist/cli.js scene save Evening
|
|
157
|
+
node dist/cli.js scene show Evening
|
|
158
|
+
node dist/cli.js fan info all
|
|
159
|
+
node dist/cli.js off
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
The daemon also serves a local control dashboard at `http://127.0.0.1:2708/dashboard`. It uses the same verified
|
|
163
|
+
BLE API as the CLI for fixtures, groups, power, CCT/G/M, HSI, effects, fans, saved states, transitions, circadian
|
|
164
|
+
overrides, timelines, local media paths, browser camera/microphone sampling, Desktop-library import and mesh
|
|
165
|
+
diagnostics. It is loopback-only, loads no remote code, and does not expose mesh credentials. The dashboard exposes
|
|
166
|
+
the fixtures' full 0-100% brightness range without an artificial output cap. In CCT mode, fixture cards also show
|
|
167
|
+
estimated lux from the configured Kelvin-dependent `maxLux` calibration, scaled by verified brightness. Optional
|
|
168
|
+
`maxLuxByModel` entries for `200x`, `200x-s`, and `150c` override the shared curve per fixture model. Dashboard
|
|
169
|
+
preferences and the last timestamped observed status are stored beside the private BLE configuration as
|
|
170
|
+
`dashboard-settings.json` and `dashboard-status.json`. A circadian panel shows whether the LaunchAgent is loaded and
|
|
171
|
+
recently updating, its latest requested target, current verified fixture output, active curve, weather adjustment
|
|
172
|
+
state, and a hover/touch daily graph of Kelvin, intensity, and estimated lux. The graph uses the same configured
|
|
173
|
+
CCT/intensity bounds as `auto-cct`, while keeping the intensity axis fixed at 0–100% and marking the configured
|
|
174
|
+
maximum with a dotted limit line. The natural intensity curve continues above that line; tooltips show both the
|
|
175
|
+
uncapped schedule and the value the service will actually apply. A separate **Actual sunlight lux (modeled)** curve
|
|
176
|
+
continues beyond the fixtures' measured lux capacity, which is shown as its own dashed reference. The same panel can
|
|
177
|
+
persistently enable or disable the service and edit its curve, live-weather adjustment, interval, location, Kelvin
|
|
178
|
+
bounds, and intensity bounds. Saving immediately recalculates the graph; active weather shows cloud/precipitation
|
|
179
|
+
details and its current intensity, Kelvin, and sunlight-lux difference from clear-sky output.
|
|
180
|
+
|
|
181
|
+
Desktop import previews by default and never changes fixture output. With `--apply`, Desktop quickshots become local
|
|
182
|
+
quickshots, explicit workspace membership becomes local groups, and all eleven supported legacy effect types become
|
|
183
|
+
retargetable local presets. Effect frequency, animation speed, trigger mode, CCT/HSI variants, palettes, saturation,
|
|
184
|
+
brightness, and 150c G/M are converted and validated against the configured fixtures before anything is persisted.
|
|
185
|
+
Use `--allow-partial` only when intentionally accepting a report that contains unsupported or malformed records.
|
|
186
|
+
|
|
187
|
+
These fixtures use whole-percent brightness, 100-K CCT steps, and (150c only) G/M steps of 10. Requests are rounded and verified against the applied values. Omitting CCT brightness or tint preserves the fixture's actual setting, never an 80% brightness default or full-magenta tint. CCT/HSI commands wake the fixture, matching its native behavior; use `off` to put it back to sleep.
|
|
188
|
+
|
|
189
|
+
See [Direct BLE operation and verification](docs/DIRECT_BLE.md) for restart behavior, permissions, protocol findings, webcam checks, and limitations.
|
|
190
|
+
|
|
191
|
+
## Amaran Desktop compatibility
|
|
192
|
+
|
|
193
|
+
Desktop-only utilities are isolated under the explicit `desktop` namespace. The CLI can discover and save the
|
|
194
|
+
WebSocket endpoint from a running Amaran Desktop application:
|
|
109
195
|
|
|
110
196
|
```bash
|
|
111
197
|
# Discover and save WebSocket URL
|
|
112
|
-
amaran-cli discover
|
|
198
|
+
amaran-cli desktop discover
|
|
113
199
|
|
|
114
200
|
# Discover with debug output
|
|
115
|
-
amaran-cli discover -d
|
|
201
|
+
amaran-cli desktop discover -d
|
|
202
|
+
|
|
203
|
+
# Start a vendor firmware update through Amaran Desktop
|
|
204
|
+
amaran-cli desktop firmware update desk
|
|
116
205
|
```
|
|
117
206
|
|
|
118
|
-
|
|
207
|
+
Discovery uses `lsof` to find the WebSocket port and saves it for explicit Desktop-backend use. Firmware updates are
|
|
208
|
+
not implemented by the direct BLE daemon. The previous `firmware check` command was removed because it did not query
|
|
209
|
+
update availability and could incorrectly claim that firmware was current.
|
|
119
210
|
|
|
120
211
|
## Device Identification
|
|
121
212
|
|
|
@@ -226,6 +317,8 @@ The `auto-cct` command automatically adjusts color temperature based on sunrise/
|
|
|
226
317
|
- **Between sunrise and sunset**: Smooth bell curve transition from 2000K/5% → 6500K/100% → 2000K/5%
|
|
227
318
|
|
|
228
319
|
This mimics natural daylight changes throughout the day for more comfortable, circadian-friendly lighting. Both color temperature and brightness follow the same curve, providing natural dimming at dawn/dusk.
|
|
320
|
+
When a configured schedule extends beyond a fixture's advertised CCT range, direct BLE automation clamps the target
|
|
321
|
+
for that fixture instead of failing the entire multi-light update.
|
|
229
322
|
|
|
230
323
|
#### Location Priority
|
|
231
324
|
|
|
@@ -460,7 +553,7 @@ amaran-cli schedule print --date 2025-12-21
|
|
|
460
553
|
# Change time interval (default: 30 minutes)
|
|
461
554
|
amaran-cli schedule print --interval 15
|
|
462
555
|
|
|
463
|
-
# Specify which curves to show (default: "
|
|
556
|
+
# Specify which curves to show (default: "cie-daylight")
|
|
464
557
|
amaran-cli schedule print --curve "hann, cie-daylight"
|
|
465
558
|
|
|
466
559
|
# Output as CSV
|
|
@@ -501,7 +594,7 @@ amaran-cli schedule graph -W 1920 -H 1080
|
|
|
501
594
|
amaran-cli schedule graph --curve cie-daylight
|
|
502
595
|
amaran-cli schedule graph --curve "perez-daylight, sun-altitude"
|
|
503
596
|
|
|
504
|
-
# View all available curves on one graph
|
|
597
|
+
# View all available curves on one graph
|
|
505
598
|
amaran-cli schedule graph --curve all
|
|
506
599
|
|
|
507
600
|
# Preview for a specific date and location
|
|
@@ -575,7 +668,8 @@ amaran-cli delete-quickshot "My Scene"
|
|
|
575
668
|
|
|
576
669
|
All commands support these options:
|
|
577
670
|
|
|
578
|
-
- `-
|
|
671
|
+
- `-b, --backend <backend>`: Select `ble` (default) or `desktop`; `websocket` is a compatibility alias
|
|
672
|
+
- `-u, --url <url>`: Override the backend endpoint (BLE HTTP URL or Desktop WebSocket URL)
|
|
579
673
|
- `-c, --client-id <id>`: Override client ID
|
|
580
674
|
- `-d, --debug`: Enable debug mode
|
|
581
675
|
|
|
@@ -104,5 +104,32 @@ describe('auto-cct command', () => {
|
|
|
104
104
|
expect(setCCT).toHaveBeenCalledWith('400J5-F2C008', 5600, 500, expect.any(Function));
|
|
105
105
|
expect(disconnect).toHaveBeenCalledTimes(1);
|
|
106
106
|
});
|
|
107
|
+
test('clamps automatic CCT to each BLE fixture capability', async () => {
|
|
108
|
+
const setAutomaticCCT = vi.fn((_, _cct, _intensity, cb) => {
|
|
109
|
+
cb?.(true, 'ok');
|
|
110
|
+
});
|
|
111
|
+
const controllerStub = {
|
|
112
|
+
getDevices: vi.fn(() => [
|
|
113
|
+
{
|
|
114
|
+
node_id: 'desk',
|
|
115
|
+
device_name: 'Desk',
|
|
116
|
+
backend: 'ble',
|
|
117
|
+
capabilities: { cct_min: 2700, cct_max: 5500 },
|
|
118
|
+
},
|
|
119
|
+
]),
|
|
120
|
+
setAutomaticCCT,
|
|
121
|
+
disconnect: vi.fn(async () => undefined),
|
|
122
|
+
};
|
|
123
|
+
const program = new Command();
|
|
124
|
+
program.exitOverride();
|
|
125
|
+
registerCommands(program, {
|
|
126
|
+
createController: async () => controllerStub,
|
|
127
|
+
findDevice: () => null,
|
|
128
|
+
asyncCommand: (fn) => (...args) => fn(...args),
|
|
129
|
+
loadConfig: () => ({}),
|
|
130
|
+
});
|
|
131
|
+
await program.parseAsync(['node', 'test', 'auto-cct']);
|
|
132
|
+
expect(setAutomaticCCT).toHaveBeenCalledWith('desk', 5500, 500, expect.any(Function));
|
|
133
|
+
});
|
|
107
134
|
});
|
|
108
135
|
//# sourceMappingURL=autoCct.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoCct.test.js","sourceRoot":"","sources":["../../src/__tests__/autoCct.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"autoCct.test.js","sourceRoot":"","sources":["../../src/__tests__/autoCct.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bleHttpControl.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/bleHttpControl.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { commandCallbackResult, getLightDevices } from '../commands/cmdUtils.js';
|
|
5
|
+
import registerAutoCct from '../commands/daylightSimulation/autoCct.js';
|
|
6
|
+
import BleHttpController, { trimTrailingSlashes } from '../deviceControl/bleHttpControl.js';
|
|
7
|
+
describe('BleHttpController', () => {
|
|
8
|
+
let server;
|
|
9
|
+
let baseUrl;
|
|
10
|
+
const requests = [];
|
|
11
|
+
const waitForRequests = async (count) => {
|
|
12
|
+
const deadline = Date.now() + 1000;
|
|
13
|
+
while (requests.length < count && Date.now() < deadline) {
|
|
14
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
requests.length = 0;
|
|
19
|
+
server = http.createServer(async (req, res) => {
|
|
20
|
+
const chunks = [];
|
|
21
|
+
for await (const chunk of req) {
|
|
22
|
+
chunks.push(Buffer.from(chunk));
|
|
23
|
+
}
|
|
24
|
+
const rawBody = Buffer.concat(chunks).toString('utf8');
|
|
25
|
+
requests.push({
|
|
26
|
+
method: req.method,
|
|
27
|
+
url: req.url,
|
|
28
|
+
body: rawBody ? JSON.parse(rawBody) : undefined,
|
|
29
|
+
authorization: req.headers.authorization,
|
|
30
|
+
});
|
|
31
|
+
if (req.url === '/' && req.method === 'GET') {
|
|
32
|
+
res.writeHead(200, { 'content-type': 'application/json' });
|
|
33
|
+
res.end(JSON.stringify({
|
|
34
|
+
ok: true,
|
|
35
|
+
daemon: true,
|
|
36
|
+
protocolVersion: 2,
|
|
37
|
+
connected: true,
|
|
38
|
+
features: { library: true, meshConfig: true, effects: true },
|
|
39
|
+
lights: [
|
|
40
|
+
{ key: 'key', name: 'Key Light', mac: 'A4:C1:38:13:41:38', address: 2 },
|
|
41
|
+
{ key: 'back', name: 'Back Light', mac: 'A4:C1:38:13:30:86', address: 4 },
|
|
42
|
+
],
|
|
43
|
+
}));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (req.url === '/lights/key/off' && req.method === 'POST') {
|
|
47
|
+
res.writeHead(204);
|
|
48
|
+
res.end();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
res.writeHead(200, { 'content-type': 'application/json' });
|
|
52
|
+
res.end(JSON.stringify({ ok: true, result: 'ok' }));
|
|
53
|
+
});
|
|
54
|
+
await new Promise((resolve) => {
|
|
55
|
+
server.listen(0, '127.0.0.1', resolve);
|
|
56
|
+
});
|
|
57
|
+
const address = server.address();
|
|
58
|
+
if (typeof address !== 'object' || !address) {
|
|
59
|
+
throw new Error('test server did not provide an address');
|
|
60
|
+
}
|
|
61
|
+
baseUrl = `http://127.0.0.1:${address.port}`;
|
|
62
|
+
});
|
|
63
|
+
afterEach(async () => {
|
|
64
|
+
await new Promise((resolve, reject) => {
|
|
65
|
+
server.close((error) => (error ? reject(error) : resolve()));
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
it('loads BLE daemon lights as CLI light devices', async () => {
|
|
69
|
+
const controller = await BleHttpController.connect(baseUrl);
|
|
70
|
+
expect(controller.getDevices()).toMatchObject([
|
|
71
|
+
{
|
|
72
|
+
node_id: 'key',
|
|
73
|
+
id: 'key',
|
|
74
|
+
device_name: 'Key Light',
|
|
75
|
+
device_type: 'ble-light',
|
|
76
|
+
backend: 'ble',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
node_id: 'back',
|
|
80
|
+
id: 'back',
|
|
81
|
+
device_name: 'Back Light',
|
|
82
|
+
device_type: 'ble-light',
|
|
83
|
+
backend: 'ble',
|
|
84
|
+
},
|
|
85
|
+
]);
|
|
86
|
+
expect(getLightDevices(controller.getDevices())).toHaveLength(2);
|
|
87
|
+
});
|
|
88
|
+
it('exposes daemon health and detailed local records through read-only methods', async () => {
|
|
89
|
+
const controller = await BleHttpController.connect(baseUrl);
|
|
90
|
+
const health = await new Promise((resolve, reject) => controller.getHealth((success, message, data) => (success ? resolve(data) : reject(new Error(message)))));
|
|
91
|
+
const group = await new Promise((resolve, reject) => controller.getGroup('group:work', (success, message, data) => success ? resolve(data) : reject(new Error(message))));
|
|
92
|
+
const scene = await new Promise((resolve, reject) => controller.getSaved('scenes', 'Evening', (success, message, data) => success ? resolve(data) : reject(new Error(message))));
|
|
93
|
+
expect(health).toMatchObject({
|
|
94
|
+
data: { daemon: true, protocolVersion: 2, connected: true, features: { library: true, meshConfig: true } },
|
|
95
|
+
});
|
|
96
|
+
expect(group).toEqual({ data: 'ok' });
|
|
97
|
+
expect(scene).toEqual({ data: 'ok' });
|
|
98
|
+
expect(requests).toContainEqual({
|
|
99
|
+
method: 'GET',
|
|
100
|
+
url: '/groups/group%3Awork',
|
|
101
|
+
body: undefined,
|
|
102
|
+
authorization: undefined,
|
|
103
|
+
});
|
|
104
|
+
expect(requests).toContainEqual({
|
|
105
|
+
method: 'GET',
|
|
106
|
+
url: '/library/scenes/Evening',
|
|
107
|
+
body: undefined,
|
|
108
|
+
authorization: undefined,
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
it('sends supported commands to the BLE HTTP API', async () => {
|
|
112
|
+
const controller = await BleHttpController.connect(baseUrl, 'test-key');
|
|
113
|
+
await controller.setCCTAndIntensityForAllLights(5600, 750);
|
|
114
|
+
controller.setIntensity('key', 250);
|
|
115
|
+
controller.turnLightOff('key');
|
|
116
|
+
await waitForRequests(5);
|
|
117
|
+
expect(requests).toContainEqual({
|
|
118
|
+
method: 'POST',
|
|
119
|
+
url: '/lights/key/cct',
|
|
120
|
+
body: { kelvin: 5600, brightness: 75 },
|
|
121
|
+
authorization: 'Bearer test-key',
|
|
122
|
+
});
|
|
123
|
+
expect(requests).toContainEqual({
|
|
124
|
+
method: 'POST',
|
|
125
|
+
url: '/lights/back/cct',
|
|
126
|
+
body: { kelvin: 5600, brightness: 75 },
|
|
127
|
+
authorization: 'Bearer test-key',
|
|
128
|
+
});
|
|
129
|
+
expect(requests).toContainEqual({
|
|
130
|
+
method: 'POST',
|
|
131
|
+
url: '/lights/key/brightness',
|
|
132
|
+
body: { value: 25 },
|
|
133
|
+
authorization: 'Bearer test-key',
|
|
134
|
+
});
|
|
135
|
+
expect(requests).toContainEqual({
|
|
136
|
+
method: 'POST',
|
|
137
|
+
url: '/lights/key/off',
|
|
138
|
+
body: {},
|
|
139
|
+
authorization: 'Bearer test-key',
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
it('routes effect animation, target selection and saved-state transitions', async () => {
|
|
143
|
+
const controller = await BleHttpController.connect(baseUrl);
|
|
144
|
+
await commandCallbackResult((callback) => controller.setEffectAnimationSpeed('back', 4, callback));
|
|
145
|
+
await commandCallbackResult((callback) => controller.saveSaved('scenes', 'Work', ['key'], callback));
|
|
146
|
+
await commandCallbackResult((callback) => controller.replaceSaved('quickshots', 'Workday', undefined, 'all', callback));
|
|
147
|
+
await commandCallbackResult((callback) => controller.recallSaved('presets', 'Portrait', { target: 'back', seconds: 2 }, callback));
|
|
148
|
+
expect(requests).toContainEqual({
|
|
149
|
+
method: 'POST',
|
|
150
|
+
url: '/lights/back/effect-animation-speed',
|
|
151
|
+
body: { value: 4 },
|
|
152
|
+
authorization: undefined,
|
|
153
|
+
});
|
|
154
|
+
expect(requests).toContainEqual({
|
|
155
|
+
method: 'POST',
|
|
156
|
+
url: '/library/scenes',
|
|
157
|
+
body: { name: 'Work', keys: ['key'] },
|
|
158
|
+
authorization: undefined,
|
|
159
|
+
});
|
|
160
|
+
expect(requests).toContainEqual({
|
|
161
|
+
method: 'POST',
|
|
162
|
+
url: '/library/quickshots/Workday',
|
|
163
|
+
body: { keys: 'all' },
|
|
164
|
+
authorization: undefined,
|
|
165
|
+
});
|
|
166
|
+
expect(requests).toContainEqual({
|
|
167
|
+
method: 'POST',
|
|
168
|
+
url: '/library/presets/Portrait/recall',
|
|
169
|
+
body: { target: 'back', seconds: 2 },
|
|
170
|
+
authorization: undefined,
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
it('supports auto-cct updates through the BLE backend', async () => {
|
|
174
|
+
const deps = {
|
|
175
|
+
createController: async (url) => BleHttpController.connect(url),
|
|
176
|
+
findDevice: (controller, deviceQuery) => {
|
|
177
|
+
return (controller.getDevices().find((device) => device.node_id === deviceQuery || device.id === deviceQuery) ?? null);
|
|
178
|
+
},
|
|
179
|
+
asyncCommand: (fn) => (...args) => fn(...args),
|
|
180
|
+
loadConfig: () => ({}),
|
|
181
|
+
};
|
|
182
|
+
const program = new Command();
|
|
183
|
+
program.exitOverride();
|
|
184
|
+
registerAutoCct(program, deps);
|
|
185
|
+
await program.parseAsync([
|
|
186
|
+
'node',
|
|
187
|
+
'test',
|
|
188
|
+
'auto-cct',
|
|
189
|
+
'key',
|
|
190
|
+
'--backend',
|
|
191
|
+
'ble',
|
|
192
|
+
'--url',
|
|
193
|
+
baseUrl,
|
|
194
|
+
'--lat',
|
|
195
|
+
'40.7128',
|
|
196
|
+
'--lon',
|
|
197
|
+
'-74.0060',
|
|
198
|
+
'--time',
|
|
199
|
+
'2025-06-21T12:00:00-04:00',
|
|
200
|
+
]);
|
|
201
|
+
expect(requests).toContainEqual({
|
|
202
|
+
method: 'POST',
|
|
203
|
+
url: '/lights/key/cct',
|
|
204
|
+
body: { kelvin: expect.any(Number), brightness: expect.any(Number) },
|
|
205
|
+
authorization: undefined,
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
it('surfaces a friendly error when the BLE backend fetch fails', async () => {
|
|
209
|
+
const fetchSpy = vi.spyOn(global, 'fetch').mockRejectedValue(new TypeError('fetch failed'));
|
|
210
|
+
const controller = new BleHttpController(baseUrl);
|
|
211
|
+
await new Promise((resolve) => {
|
|
212
|
+
controller.getDeviceList((success, message) => {
|
|
213
|
+
expect(success).toBe(false);
|
|
214
|
+
expect(message).toContain('Unable to reach BLE backend');
|
|
215
|
+
expect(message).toContain('Make sure the BLE service is running');
|
|
216
|
+
resolve();
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
fetchSpy.mockRestore();
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
describe('trimTrailingSlashes', () => {
|
|
223
|
+
it('removes trailing slashes without changing the rest of the URL', () => {
|
|
224
|
+
expect(trimTrailingSlashes('http://localhost:2708/')).toBe('http://localhost:2708');
|
|
225
|
+
expect(trimTrailingSlashes('http://localhost:2708///')).toBe('http://localhost:2708');
|
|
226
|
+
expect(trimTrailingSlashes('http://localhost:2708')).toBe('http://localhost:2708');
|
|
227
|
+
expect(trimTrailingSlashes('')).toBe('');
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=bleHttpControl.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bleHttpControl.test.js","sourceRoot":"","sources":["../../src/__tests__/bleHttpControl.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bleStack.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/bleStack.test.ts"],"names":[],"mappings":""}
|