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.
Files changed (363) hide show
  1. package/README.md +108 -14
  2. package/dist/__tests__/autoCct.test.js +27 -0
  3. package/dist/__tests__/autoCct.test.js.map +1 -1
  4. package/dist/__tests__/bleHttpControl.test.d.ts +2 -0
  5. package/dist/__tests__/bleHttpControl.test.d.ts.map +1 -0
  6. package/dist/__tests__/bleHttpControl.test.js +230 -0
  7. package/dist/__tests__/bleHttpControl.test.js.map +1 -0
  8. package/dist/__tests__/bleStack.test.d.ts +2 -0
  9. package/dist/__tests__/bleStack.test.d.ts.map +1 -0
  10. package/dist/__tests__/bleStack.test.js +1239 -0
  11. package/dist/__tests__/bleStack.test.js.map +1 -0
  12. package/dist/__tests__/cctUtil.test.js +9 -4
  13. package/dist/__tests__/cctUtil.test.js.map +1 -1
  14. package/dist/__tests__/circadianDashboardSettings.test.d.ts +2 -0
  15. package/dist/__tests__/circadianDashboardSettings.test.d.ts.map +1 -0
  16. package/dist/__tests__/circadianDashboardSettings.test.js +82 -0
  17. package/dist/__tests__/circadianDashboardSettings.test.js.map +1 -0
  18. package/dist/__tests__/circadianIsolation.test.d.ts +2 -0
  19. package/dist/__tests__/circadianIsolation.test.d.ts.map +1 -0
  20. package/dist/__tests__/circadianIsolation.test.js +30 -0
  21. package/dist/__tests__/circadianIsolation.test.js.map +1 -0
  22. package/dist/__tests__/cli.config.test.js +49 -0
  23. package/dist/__tests__/cli.config.test.js.map +1 -1
  24. package/dist/__tests__/cli.smoke.test.js +34 -0
  25. package/dist/__tests__/cli.smoke.test.js.map +1 -1
  26. package/dist/__tests__/currentCct.test.d.ts +2 -0
  27. package/dist/__tests__/currentCct.test.d.ts.map +1 -0
  28. package/dist/__tests__/currentCct.test.js +29 -0
  29. package/dist/__tests__/currentCct.test.js.map +1 -0
  30. package/dist/__tests__/dashboard.test.d.ts +2 -0
  31. package/dist/__tests__/dashboard.test.d.ts.map +1 -0
  32. package/dist/__tests__/dashboard.test.js +126 -0
  33. package/dist/__tests__/dashboard.test.js.map +1 -0
  34. package/dist/__tests__/daylightSimulationParseUtils.test.d.ts +2 -0
  35. package/dist/__tests__/daylightSimulationParseUtils.test.d.ts.map +1 -0
  36. package/dist/__tests__/daylightSimulationParseUtils.test.js +16 -0
  37. package/dist/__tests__/daylightSimulationParseUtils.test.js.map +1 -0
  38. package/dist/__tests__/desktopImport.test.d.ts +2 -0
  39. package/dist/__tests__/desktopImport.test.d.ts.map +1 -0
  40. package/dist/__tests__/desktopImport.test.js +234 -0
  41. package/dist/__tests__/desktopImport.test.js.map +1 -0
  42. package/dist/__tests__/lightControl.basic.test.d.ts +2 -0
  43. package/dist/__tests__/lightControl.basic.test.d.ts.map +1 -0
  44. package/dist/__tests__/lightControl.basic.test.js +119 -0
  45. package/dist/__tests__/lightControl.basic.test.js.map +1 -0
  46. package/dist/__tests__/lightControl.colorEffects.test.d.ts +2 -0
  47. package/dist/__tests__/lightControl.colorEffects.test.d.ts.map +1 -0
  48. package/dist/__tests__/lightControl.colorEffects.test.js +170 -0
  49. package/dist/__tests__/lightControl.colorEffects.test.js.map +1 -0
  50. package/dist/__tests__/lightControl.management.test.d.ts +2 -0
  51. package/dist/__tests__/lightControl.management.test.d.ts.map +1 -0
  52. package/dist/__tests__/lightControl.management.test.js +90 -0
  53. package/dist/__tests__/lightControl.management.test.js.map +1 -0
  54. package/dist/__tests__/lightControlTestUtils.d.ts +10 -0
  55. package/dist/__tests__/lightControlTestUtils.d.ts.map +1 -0
  56. package/dist/__tests__/lightControlTestUtils.js +57 -0
  57. package/dist/__tests__/lightControlTestUtils.js.map +1 -0
  58. package/dist/__tests__/meshConfiguration.test.d.ts +2 -0
  59. package/dist/__tests__/meshConfiguration.test.d.ts.map +1 -0
  60. package/dist/__tests__/meshConfiguration.test.js +78 -0
  61. package/dist/__tests__/meshConfiguration.test.js.map +1 -0
  62. package/dist/__tests__/nativeGroups.test.d.ts +2 -0
  63. package/dist/__tests__/nativeGroups.test.d.ts.map +1 -0
  64. package/dist/__tests__/nativeGroups.test.js +104 -0
  65. package/dist/__tests__/nativeGroups.test.js.map +1 -0
  66. package/dist/__tests__/programApi.test.d.ts +2 -0
  67. package/dist/__tests__/programApi.test.d.ts.map +1 -0
  68. package/dist/__tests__/programApi.test.js +73 -0
  69. package/dist/__tests__/programApi.test.js.map +1 -0
  70. package/dist/__tests__/programs.test.d.ts +2 -0
  71. package/dist/__tests__/programs.test.d.ts.map +1 -0
  72. package/dist/__tests__/programs.test.js +176 -0
  73. package/dist/__tests__/programs.test.js.map +1 -0
  74. package/dist/__tests__/scheduleMaker.test.d.ts +2 -0
  75. package/dist/__tests__/scheduleMaker.test.d.ts.map +1 -0
  76. package/dist/__tests__/scheduleMaker.test.js +25 -0
  77. package/dist/__tests__/scheduleMaker.test.js.map +1 -0
  78. package/dist/ble/async.d.ts +2 -0
  79. package/dist/ble/async.d.ts.map +1 -0
  80. package/dist/ble/async.js +15 -0
  81. package/dist/ble/async.js.map +1 -0
  82. package/dist/ble/colors.d.ts +5 -0
  83. package/dist/ble/colors.d.ts.map +1 -0
  84. package/dist/ble/colors.js +44 -0
  85. package/dist/ble/colors.js.map +1 -0
  86. package/dist/ble/configuration.d.ts +22 -0
  87. package/dist/ble/configuration.d.ts.map +1 -0
  88. package/dist/ble/configuration.js +122 -0
  89. package/dist/ble/configuration.js.map +1 -0
  90. package/dist/ble/controller.d.ts +118 -0
  91. package/dist/ble/controller.d.ts.map +1 -0
  92. package/dist/ble/controller.js +931 -0
  93. package/dist/ble/controller.js.map +1 -0
  94. package/dist/ble/crypto.d.ts +34 -0
  95. package/dist/ble/crypto.d.ts.map +1 -0
  96. package/dist/ble/crypto.js +178 -0
  97. package/dist/ble/crypto.js.map +1 -0
  98. package/dist/ble/daemon.d.ts +2 -0
  99. package/dist/ble/daemon.d.ts.map +1 -0
  100. package/dist/ble/daemon.js +76 -0
  101. package/dist/ble/daemon.js.map +1 -0
  102. package/dist/ble/dashboard.d.ts +331 -0
  103. package/dist/ble/dashboard.d.ts.map +1 -0
  104. package/dist/ble/dashboard.js +280 -0
  105. package/dist/ble/dashboard.js.map +1 -0
  106. package/dist/ble/desktop.d.ts +4 -0
  107. package/dist/ble/desktop.d.ts.map +1 -0
  108. package/dist/ble/desktop.js +33 -0
  109. package/dist/ble/desktop.js.map +1 -0
  110. package/dist/ble/desktopLibrary.d.ts +12 -0
  111. package/dist/ble/desktopLibrary.d.ts.map +1 -0
  112. package/dist/ble/desktopLibrary.js +346 -0
  113. package/dist/ble/desktopLibrary.js.map +1 -0
  114. package/dist/ble/effects.d.ts +34 -0
  115. package/dist/ble/effects.d.ts.map +1 -0
  116. package/dist/ble/effects.js +138 -0
  117. package/dist/ble/effects.js.map +1 -0
  118. package/dist/ble/fan.d.ts +244 -0
  119. package/dist/ble/fan.d.ts.map +1 -0
  120. package/dist/ble/fan.js +46 -0
  121. package/dist/ble/fan.js.map +1 -0
  122. package/dist/ble/library.d.ts +341 -0
  123. package/dist/ble/library.d.ts.map +1 -0
  124. package/dist/ble/library.js +201 -0
  125. package/dist/ble/library.js.map +1 -0
  126. package/dist/ble/media.d.ts +133 -0
  127. package/dist/ble/media.d.ts.map +1 -0
  128. package/dist/ble/media.js +186 -0
  129. package/dist/ble/media.js.map +1 -0
  130. package/dist/ble/nativeGroups.d.ts +22 -0
  131. package/dist/ble/nativeGroups.d.ts.map +1 -0
  132. package/dist/ble/nativeGroups.js +114 -0
  133. package/dist/ble/nativeGroups.js.map +1 -0
  134. package/dist/ble/packets.d.ts +3 -0
  135. package/dist/ble/packets.d.ts.map +1 -0
  136. package/dist/ble/packets.js +15 -0
  137. package/dist/ble/packets.js.map +1 -0
  138. package/dist/ble/programs.d.ts +318 -0
  139. package/dist/ble/programs.d.ts.map +1 -0
  140. package/dist/ble/programs.js +329 -0
  141. package/dist/ble/programs.js.map +1 -0
  142. package/dist/ble/provisioning.d.ts +13 -0
  143. package/dist/ble/provisioning.d.ts.map +1 -0
  144. package/dist/ble/provisioning.js +39 -0
  145. package/dist/ble/provisioning.js.map +1 -0
  146. package/dist/ble/server.d.ts +18 -0
  147. package/dist/ble/server.d.ts.map +1 -0
  148. package/dist/ble/server.js +548 -0
  149. package/dist/ble/server.js.map +1 -0
  150. package/dist/ble/service.d.ts +2 -0
  151. package/dist/ble/service.d.ts.map +1 -0
  152. package/dist/ble/service.js +77 -0
  153. package/dist/ble/service.js.map +1 -0
  154. package/dist/ble/settings.d.ts +18 -0
  155. package/dist/ble/settings.d.ts.map +1 -0
  156. package/dist/ble/settings.js +25 -0
  157. package/dist/ble/settings.js.map +1 -0
  158. package/dist/ble/setup.d.ts +2 -0
  159. package/dist/ble/setup.d.ts.map +1 -0
  160. package/dist/ble/setup.js +31 -0
  161. package/dist/ble/setup.js.map +1 -0
  162. package/dist/ble/storage.d.ts +94 -0
  163. package/dist/ble/storage.d.ts.map +1 -0
  164. package/dist/ble/storage.js +132 -0
  165. package/dist/ble/storage.js.map +1 -0
  166. package/dist/ble/telink.d.ts +63 -0
  167. package/dist/ble/telink.d.ts.map +1 -0
  168. package/dist/ble/telink.js +108 -0
  169. package/dist/ble/telink.js.map +1 -0
  170. package/dist/ble/transitions.d.ts +3 -0
  171. package/dist/ble/transitions.d.ts.map +1 -0
  172. package/dist/ble/transitions.js +28 -0
  173. package/dist/ble/transitions.js.map +1 -0
  174. package/dist/ble/transport.d.ts +48 -0
  175. package/dist/ble/transport.d.ts.map +1 -0
  176. package/dist/ble/transport.js +370 -0
  177. package/dist/ble/transport.js.map +1 -0
  178. package/dist/circadian.d.ts +3 -0
  179. package/dist/circadian.d.ts.map +1 -1
  180. package/dist/circadian.js +2 -0
  181. package/dist/circadian.js.map +1 -1
  182. package/dist/cli.d.ts +3 -2
  183. package/dist/cli.d.ts.map +1 -1
  184. package/dist/cli.js +125 -6
  185. package/dist/cli.js.map +1 -1
  186. package/dist/commands/__tests__/newCommands.test.js +3 -4
  187. package/dist/commands/__tests__/newCommands.test.js.map +1 -1
  188. package/dist/commands/cmdUtils.d.ts +5 -2
  189. package/dist/commands/cmdUtils.d.ts.map +1 -1
  190. package/dist/commands/cmdUtils.js +29 -10
  191. package/dist/commands/cmdUtils.js.map +1 -1
  192. package/dist/commands/daylightSimulation/autoCct.d.ts.map +1 -1
  193. package/dist/commands/daylightSimulation/autoCct.js +67 -197
  194. package/dist/commands/daylightSimulation/autoCct.js.map +1 -1
  195. package/dist/commands/daylightSimulation/graphSchedule.d.ts +1 -1
  196. package/dist/commands/daylightSimulation/graphSchedule.d.ts.map +1 -1
  197. package/dist/commands/daylightSimulation/printSchedule.d.ts +1 -1
  198. package/dist/commands/daylightSimulation/printSchedule.d.ts.map +1 -1
  199. package/dist/commands/daylightSimulation/printSchedule.js +2 -2
  200. package/dist/commands/daylightSimulation/printSchedule.js.map +1 -1
  201. package/dist/commands/daylightSimulation/service.d.ts +1 -1
  202. package/dist/commands/daylightSimulation/service.d.ts.map +1 -1
  203. package/dist/commands/daylightSimulation/service.js +5 -3
  204. package/dist/commands/daylightSimulation/service.js.map +1 -1
  205. package/dist/commands/daylightSimulation/simulateSchedule.d.ts +1 -1
  206. package/dist/commands/daylightSimulation/simulateSchedule.d.ts.map +1 -1
  207. package/dist/commands/daylightSimulation/simulateSchedule.js +5 -4
  208. package/dist/commands/daylightSimulation/simulateSchedule.js.map +1 -1
  209. package/dist/commands/deviceControl/ble.d.ts +4 -0
  210. package/dist/commands/deviceControl/ble.d.ts.map +1 -0
  211. package/dist/commands/deviceControl/ble.js +214 -0
  212. package/dist/commands/deviceControl/ble.js.map +1 -0
  213. package/dist/commands/deviceControl/cct.d.ts.map +1 -1
  214. package/dist/commands/deviceControl/cct.js +41 -11
  215. package/dist/commands/deviceControl/cct.js.map +1 -1
  216. package/dist/commands/deviceControl/color.d.ts.map +1 -1
  217. package/dist/commands/deviceControl/color.js +13 -3
  218. package/dist/commands/deviceControl/color.js.map +1 -1
  219. package/dist/commands/deviceControl/config.d.ts.map +1 -1
  220. package/dist/commands/deviceControl/config.js +26 -3
  221. package/dist/commands/deviceControl/config.js.map +1 -1
  222. package/dist/commands/deviceControl/{discover.d.ts → desktop.d.ts} +3 -2
  223. package/dist/commands/deviceControl/desktop.d.ts.map +1 -0
  224. package/dist/commands/deviceControl/desktop.js +66 -0
  225. package/dist/commands/deviceControl/desktop.js.map +1 -0
  226. package/dist/commands/deviceControl/effect.d.ts.map +1 -1
  227. package/dist/commands/deviceControl/effect.js +90 -159
  228. package/dist/commands/deviceControl/effect.js.map +1 -1
  229. package/dist/commands/deviceControl/fan.d.ts.map +1 -1
  230. package/dist/commands/deviceControl/fan.js +77 -95
  231. package/dist/commands/deviceControl/fan.js.map +1 -1
  232. package/dist/commands/deviceControl/group.d.ts.map +1 -1
  233. package/dist/commands/deviceControl/group.js +43 -6
  234. package/dist/commands/deviceControl/group.js.map +1 -1
  235. package/dist/commands/deviceControl/hsi.d.ts.map +1 -1
  236. package/dist/commands/deviceControl/hsi.js +3 -1
  237. package/dist/commands/deviceControl/hsi.js.map +1 -1
  238. package/dist/commands/deviceControl/info.d.ts.map +1 -1
  239. package/dist/commands/deviceControl/info.js +0 -50
  240. package/dist/commands/deviceControl/info.js.map +1 -1
  241. package/dist/commands/deviceControl/intensity.d.ts.map +1 -1
  242. package/dist/commands/deviceControl/intensity.js +32 -8
  243. package/dist/commands/deviceControl/intensity.js.map +1 -1
  244. package/dist/commands/deviceControl/list.d.ts.map +1 -1
  245. package/dist/commands/deviceControl/list.js +3 -2
  246. package/dist/commands/deviceControl/list.js.map +1 -1
  247. package/dist/commands/deviceControl/power.d.ts.map +1 -1
  248. package/dist/commands/deviceControl/power.js +9 -3
  249. package/dist/commands/deviceControl/power.js.map +1 -1
  250. package/dist/commands/deviceControl/preset.d.ts.map +1 -1
  251. package/dist/commands/deviceControl/preset.js +56 -19
  252. package/dist/commands/deviceControl/preset.js.map +1 -1
  253. package/dist/commands/deviceControl/program.d.ts +4 -0
  254. package/dist/commands/deviceControl/program.d.ts.map +1 -0
  255. package/dist/commands/deviceControl/program.js +199 -0
  256. package/dist/commands/deviceControl/program.js.map +1 -0
  257. package/dist/commands/deviceControl/quickshot.d.ts.map +1 -1
  258. package/dist/commands/deviceControl/quickshot.js +75 -13
  259. package/dist/commands/deviceControl/quickshot.js.map +1 -1
  260. package/dist/commands/deviceControl/scene.d.ts.map +1 -1
  261. package/dist/commands/deviceControl/scene.js +72 -9
  262. package/dist/commands/deviceControl/scene.js.map +1 -1
  263. package/dist/commands/deviceControl/status.d.ts.map +1 -1
  264. package/dist/commands/deviceControl/status.js +26 -3
  265. package/dist/commands/deviceControl/status.js.map +1 -1
  266. package/dist/commands/parseUtils.d.ts +1 -1
  267. package/dist/commands/parseUtils.d.ts.map +1 -1
  268. package/dist/commands/parseUtils.js +1 -11
  269. package/dist/commands/parseUtils.js.map +1 -1
  270. package/dist/commands-api.d.ts +1 -1
  271. package/dist/commands-api.d.ts.map +1 -1
  272. package/dist/commands-api.js +1 -1
  273. package/dist/commands-api.js.map +1 -1
  274. package/dist/commands.d.ts.map +1 -1
  275. package/dist/commands.js +4 -2
  276. package/dist/commands.js.map +1 -1
  277. package/dist/config.d.ts +82 -0
  278. package/dist/config.d.ts.map +1 -1
  279. package/dist/config.js +13 -2
  280. package/dist/config.js.map +1 -1
  281. package/dist/daylightSimulation/cctUtil.d.ts.map +1 -1
  282. package/dist/daylightSimulation/cctUtil.js +2 -2
  283. package/dist/daylightSimulation/cctUtil.js.map +1 -1
  284. package/dist/daylightSimulation/constants.d.ts +10 -0
  285. package/dist/daylightSimulation/constants.d.ts.map +1 -1
  286. package/dist/daylightSimulation/constants.js +4 -0
  287. package/dist/daylightSimulation/constants.js.map +1 -1
  288. package/dist/daylightSimulation/currentCct.d.ts +42 -0
  289. package/dist/daylightSimulation/currentCct.d.ts.map +1 -0
  290. package/dist/daylightSimulation/currentCct.js +217 -0
  291. package/dist/daylightSimulation/currentCct.js.map +1 -0
  292. package/dist/daylightSimulation/dashboardSettings.d.ts +47 -0
  293. package/dist/daylightSimulation/dashboardSettings.d.ts.map +1 -0
  294. package/dist/daylightSimulation/dashboardSettings.js +95 -0
  295. package/dist/daylightSimulation/dashboardSettings.js.map +1 -0
  296. package/dist/daylightSimulation/dashboardStatus.d.ts +72 -0
  297. package/dist/daylightSimulation/dashboardStatus.d.ts.map +1 -0
  298. package/dist/daylightSimulation/dashboardStatus.js +191 -0
  299. package/dist/daylightSimulation/dashboardStatus.js.map +1 -0
  300. package/dist/daylightSimulation/parseUtils.d.ts +3 -0
  301. package/dist/daylightSimulation/parseUtils.d.ts.map +1 -0
  302. package/dist/daylightSimulation/parseUtils.js +25 -0
  303. package/dist/daylightSimulation/parseUtils.js.map +1 -0
  304. package/dist/daylightSimulation/scheduleMaker.d.ts +2 -2
  305. package/dist/daylightSimulation/scheduleMaker.d.ts.map +1 -1
  306. package/dist/daylightSimulation/scheduleMaker.js +6 -6
  307. package/dist/daylightSimulation/scheduleMaker.js.map +1 -1
  308. package/dist/daylightSimulation/types.d.ts +13 -2
  309. package/dist/daylightSimulation/types.d.ts.map +1 -1
  310. package/dist/daylightSimulation/types.js +0 -2
  311. package/dist/daylightSimulation/types.js.map +1 -1
  312. package/dist/device-control.d.ts +1 -0
  313. package/dist/device-control.d.ts.map +1 -1
  314. package/dist/device-control.js +1 -0
  315. package/dist/device-control.js.map +1 -1
  316. package/dist/deviceControl/bleHttpControl.d.ts +129 -0
  317. package/dist/deviceControl/bleHttpControl.d.ts.map +1 -0
  318. package/dist/deviceControl/bleHttpControl.js +753 -0
  319. package/dist/deviceControl/bleHttpControl.js.map +1 -0
  320. package/dist/deviceControl/lightControl.d.ts +8 -68
  321. package/dist/deviceControl/lightControl.d.ts.map +1 -1
  322. package/dist/deviceControl/lightControl.js +6 -246
  323. package/dist/deviceControl/lightControl.js.map +1 -1
  324. package/dist/deviceControl/lightControlCommands.d.ts +68 -0
  325. package/dist/deviceControl/lightControlCommands.d.ts.map +1 -0
  326. package/dist/deviceControl/lightControlCommands.js +244 -0
  327. package/dist/deviceControl/lightControlCommands.js.map +1 -0
  328. package/dist/deviceControl/types.d.ts +75 -4
  329. package/dist/deviceControl/types.d.ts.map +1 -1
  330. package/dist/deviceControl/types.js +1 -0
  331. package/dist/deviceControl/types.js.map +1 -1
  332. package/dist/index.d.ts +2 -1
  333. package/dist/index.d.ts.map +1 -1
  334. package/dist/index.js +1 -0
  335. package/dist/index.js.map +1 -1
  336. package/dist/test/MockLightServer.d.ts +1 -0
  337. package/dist/test/MockLightServer.d.ts.map +1 -1
  338. package/dist/test/MockLightServer.js +5 -0
  339. package/dist/test/MockLightServer.js.map +1 -1
  340. package/docs/CHANGELOG.md +37 -0
  341. package/docs/DIRECT_BLE.md +359 -0
  342. package/package.json +8 -4
  343. package/scripts/ble-cli-check.ts +129 -0
  344. package/scripts/ble-config-probe.ts +109 -0
  345. package/scripts/ble-effects-check.ts +82 -0
  346. package/scripts/ble-extended-probe.ts +44 -0
  347. package/scripts/ble-fan-check.ts +129 -0
  348. package/scripts/ble-feature-probe.ts +37 -0
  349. package/scripts/ble-followup-check.ts +165 -0
  350. package/scripts/ble-hardware-check.ts +99 -0
  351. package/scripts/ble-live-extended-check.ts +205 -0
  352. package/scripts/ble-non-ota-check.ts +193 -0
  353. package/scripts/ble-probe.ts +45 -0
  354. package/scripts/calibrate-webcam.ts +152 -0
  355. package/scripts/desktop-reference.ts +85 -0
  356. package/scripts/webcam.ts +129 -0
  357. package/dist/__tests__/lightControl.test.d.ts +0 -2
  358. package/dist/__tests__/lightControl.test.d.ts.map +0 -1
  359. package/dist/__tests__/lightControl.test.js +0 -424
  360. package/dist/__tests__/lightControl.test.js.map +0 -1
  361. package/dist/commands/deviceControl/discover.d.ts.map +0 -1
  362. package/dist/commands/deviceControl/discover.js +0 -29
  363. package/dist/commands/deviceControl/discover.js.map +0 -1
@@ -0,0 +1,28 @@
1
+ export function interpolateState(from, to, fraction) {
2
+ if (from.mode === 'effect' || to.mode === 'effect')
3
+ throw new Error('Transitions require steady CCT or HSI states');
4
+ const start = from.sleep ? 0 : from.intensity;
5
+ const end = to.sleep ? 0 : to.intensity;
6
+ const mix = (a, b) => a + (b - a) * fraction;
7
+ if (from.mode !== to.mode) {
8
+ const state = fraction < 0.5 ? from : to;
9
+ const intensity = fraction < 0.5 ? start * (1 - fraction * 2) : end * (fraction * 2 - 1);
10
+ return { ...state, sleep: false, intensity: Math.round(intensity / 10) * 10 };
11
+ }
12
+ const state = { ...to, sleep: false, intensity: Math.round(mix(start, end) / 10) * 10 };
13
+ if (to.mode === 'cct') {
14
+ if (from.cct === undefined || to.cct === undefined)
15
+ throw new Error('CCT transition is missing Kelvin');
16
+ state.cct = Math.round(mix(from.cct, to.cct) / 100) * 100;
17
+ state.gm = Math.round(mix(from.gm ?? 0, to.gm ?? 0) / 10) * 10;
18
+ }
19
+ else {
20
+ if (from.hue === undefined || to.hue === undefined || from.sat === undefined || to.sat === undefined)
21
+ throw new Error('HSI transition is missing hue/saturation');
22
+ const delta = ((to.hue - from.hue + 540) % 360) - 180;
23
+ state.hue = Math.round((from.hue + delta * fraction + 360) % 360) % 360;
24
+ state.sat = Math.round(mix(from.sat, to.sat));
25
+ }
26
+ return state;
27
+ }
28
+ //# sourceMappingURL=transitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitions.js","sourceRoot":"","sources":["../../src/ble/transitions.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,IAAkB,EAAE,EAAgB,EAAE,QAAgB;IACrF,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACpH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;IAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;IACxC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;IAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACzF,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;IAChF,CAAC;IACD,MAAM,KAAK,GAAiB,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;IACtG,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACxG,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC1D,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS;YAClG,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QACtD,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QACxE,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { MeshCrypto } from './crypto.js';
2
+ import { type UnprovisionedDevice } from './provisioning.js';
3
+ export { deadline } from './async.js';
4
+ import { type ProductInfo } from './settings.js';
5
+ import type { MeshConfig, SequenceStore } from './storage.js';
6
+ import { type FanState, type FixtureState } from './telink.js';
7
+ export declare class ProxyAssembler {
8
+ private partial?;
9
+ push(data: Buffer): {
10
+ type: number;
11
+ data: Buffer;
12
+ } | undefined;
13
+ }
14
+ export declare function proxyFragments(type: number, data: Buffer, size?: number): Buffer[];
15
+ export declare class MeshTransport {
16
+ readonly config: MeshConfig;
17
+ private readonly sequences;
18
+ private readonly debug;
19
+ readonly crypto: MeshCrypto;
20
+ private peripheral?;
21
+ private input?;
22
+ private output?;
23
+ private iv?;
24
+ private assembler;
25
+ private readonly events;
26
+ private readonly segments;
27
+ private readonly received;
28
+ private writes;
29
+ private initialized;
30
+ private closing;
31
+ constructor(config: MeshConfig, sequences: SequenceStore, debug?: boolean);
32
+ get ready(): boolean;
33
+ private wait;
34
+ connect(): Promise<void>;
35
+ private configureFilter;
36
+ private sendNetwork;
37
+ send(destination: number, payload: Buffer): Promise<void>;
38
+ readState(address: number): Promise<FixtureState>;
39
+ readFan(address: number): Promise<FanState>;
40
+ readProductInfo(address: number): Promise<ProductInfo>;
41
+ discoverUnprovisioned(): Promise<UnprovisionedDevice[]>;
42
+ readPacket<T>(address: number, query: Buffer, decode: (payload: Buffer) => T | undefined): Promise<T>;
43
+ configuration(address: number, request: Buffer, accept: (data: Buffer) => boolean): Promise<Buffer>;
44
+ private readonly notify;
45
+ private emitAccess;
46
+ disconnect(): Promise<void>;
47
+ }
48
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/ble/transport.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAuB,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEpF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAA0B,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAkC,MAAM,aAAa,CAAC;AAEvH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAC,CAAsE;IACtF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;CAwB/D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,MAAM,EAAE,CAQ9E;AAgBD,qBAAa,aAAa;IAetB,QAAQ,CAAC,MAAM,EAAE,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAhBxB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,KAAK,CAAC,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAiB;IAChC,OAAO,CAAC,EAAE,CAAC,CAAS;IACpB,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuD;IAChF,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAGb,MAAM,EAAE,UAAU,EACV,SAAS,EAAE,aAAa,EACxB,KAAK,UAAQ;IAKhC,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,OAAO,CAAC,IAAI;IA8BN,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YA0FhB,eAAe;YASf,WAAW;IAgCnB,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAazD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIjD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAG3C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAGtD,qBAAqB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAIvD,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;IAmBrG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBzG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAkErB;IAEF,OAAO,CAAC,UAAU;IASZ,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBlC"}
@@ -0,0 +1,370 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { setTimeout as delay } from 'node:timers/promises';
3
+ import { deadline } from './async.js';
4
+ import { MeshCrypto } from './crypto.js';
5
+ import { packet } from './packets.js';
6
+ import { discoverUnprovisioned } from './provisioning.js';
7
+ export { deadline } from './async.js';
8
+ import { decodeProductInfo } from './settings.js';
9
+ import { decodeFan, decodeState, readFanPacket, readStatePacket } from './telink.js';
10
+ export class ProxyAssembler {
11
+ partial;
12
+ push(data) {
13
+ if (data.length < 2)
14
+ throw new Error('Empty proxy packet');
15
+ const type = data[0] & 63;
16
+ const sar = data[0] >> 6;
17
+ if (sar === 0) {
18
+ this.partial = undefined;
19
+ return { type, data: data.subarray(1) };
20
+ }
21
+ if (sar === 1)
22
+ this.partial = { type, chunks: [], length: 0, started: Date.now() };
23
+ const partial = this.partial;
24
+ if (!partial || partial.type !== type || Date.now() - partial.started > 10_000) {
25
+ this.partial = undefined;
26
+ throw new Error('Unexpected proxy continuation');
27
+ }
28
+ partial.chunks.push(data.subarray(1));
29
+ partial.length += data.length - 1;
30
+ if (partial.length > 384) {
31
+ this.partial = undefined;
32
+ throw new Error('Oversized proxy packet');
33
+ }
34
+ if (sar !== 3)
35
+ return undefined;
36
+ this.partial = undefined;
37
+ return { type, data: Buffer.concat(partial.chunks) };
38
+ }
39
+ }
40
+ export function proxyFragments(type, data, size = 19) {
41
+ if (data.length <= size)
42
+ return [Buffer.concat([Buffer.from([type]), data])];
43
+ const fragments = [];
44
+ for (let offset = 0; offset < data.length; offset += size) {
45
+ const sar = offset === 0 ? 1 : offset + size >= data.length ? 3 : 2;
46
+ fragments.push(Buffer.concat([Buffer.from([(sar << 6) | type]), data.subarray(offset, offset + size)]));
47
+ }
48
+ return fragments;
49
+ }
50
+ export class MeshTransport {
51
+ config;
52
+ sequences;
53
+ debug;
54
+ crypto;
55
+ peripheral;
56
+ input;
57
+ output;
58
+ iv;
59
+ assembler = new ProxyAssembler();
60
+ events = new EventEmitter();
61
+ segments = new Map();
62
+ received = new Map();
63
+ writes = Promise.resolve();
64
+ initialized = false;
65
+ closing = false;
66
+ constructor(config, sequences, debug = false) {
67
+ this.config = config;
68
+ this.sequences = sequences;
69
+ this.debug = debug;
70
+ this.crypto = new MeshCrypto(config.netKey, config.appKey);
71
+ }
72
+ get ready() {
73
+ return this.initialized && this.peripheral?.state === 'connected';
74
+ }
75
+ wait(event, accept, milliseconds) {
76
+ return new Promise((resolve, reject) => {
77
+ const cleanup = () => {
78
+ clearTimeout(timer);
79
+ this.events.removeListener(event, handler);
80
+ this.events.removeListener('lost', lost);
81
+ };
82
+ const handler = (value) => {
83
+ try {
84
+ if (!accept(value))
85
+ return;
86
+ cleanup();
87
+ resolve(value);
88
+ }
89
+ catch (error) {
90
+ cleanup();
91
+ reject(error instanceof Error ? error : new Error(String(error)));
92
+ }
93
+ };
94
+ const lost = () => {
95
+ cleanup();
96
+ reject(new Error('BLE connection lost'));
97
+ };
98
+ const timer = setTimeout(() => {
99
+ cleanup();
100
+ reject(new Error(`BLE ${event} response timed out`));
101
+ }, milliseconds);
102
+ this.events.on(event, handler);
103
+ this.events.on('lost', lost);
104
+ });
105
+ }
106
+ async connect() {
107
+ if (this.ready)
108
+ return;
109
+ const { default: noble } = await import('@abandonware/noble');
110
+ this.closing = false;
111
+ const candidates = new Map();
112
+ const discover = (peripheral) => {
113
+ if (peripheral.advertisement.serviceData?.some((service) => service.uuid === '1828' &&
114
+ this.crypto.matchesAdvertisement(service.data, this.config.lights.map((light) => light.address))))
115
+ candidates.set(peripheral.id, peripheral);
116
+ };
117
+ let stateListener;
118
+ try {
119
+ if (noble._state !== 'poweredOn') {
120
+ await deadline(new Promise((resolve, reject) => {
121
+ stateListener = (state) => {
122
+ if (state === 'poweredOn')
123
+ resolve();
124
+ else if (state === 'unauthorized' || state === 'unsupported' || state === 'poweredOff')
125
+ reject(new Error(`Bluetooth is ${state}`));
126
+ };
127
+ noble.on('stateChange', stateListener);
128
+ }), 60_000, 'Bluetooth adapter initialization (check macOS Privacy & Security > Bluetooth permission for Node)');
129
+ }
130
+ noble.on('discover', discover);
131
+ await deadline(noble.startScanningAsync(['1828'], true), 5000, 'Bluetooth scan start');
132
+ await delay(5000);
133
+ }
134
+ finally {
135
+ if (stateListener)
136
+ noble.removeListener('stateChange', stateListener);
137
+ noble.removeListener('discover', discover);
138
+ await deadline(noble.stopScanningAsync(), 3000, 'Bluetooth scan stop');
139
+ }
140
+ if (!candidates.size)
141
+ throw new Error('No proxy for the configured mesh found. Quit Amaran Desktop and verify the lights and Bluetooth permission.');
142
+ const failures = [];
143
+ for (const peripheral of [...candidates.values()].sort((a, b) => b.rssi - a.rssi)) {
144
+ try {
145
+ console.error(`Connecting to mesh proxy ${peripheral.id} (${peripheral.rssi} dBm)`);
146
+ this.peripheral = peripheral;
147
+ peripheral.once('disconnect', () => {
148
+ this.initialized = false;
149
+ this.input = undefined;
150
+ this.events.emit('lost');
151
+ });
152
+ await deadline(peripheral.connectAsync(), 10_000, 'BLE connect');
153
+ const { characteristics } = await deadline(peripheral.discoverSomeServicesAndCharacteristicsAsync(['1828'], ['2add', '2ade']), 8000, 'BLE service discovery');
154
+ this.input = characteristics.find((entry) => entry.uuid === '2add');
155
+ this.output = characteristics.find((entry) => entry.uuid === '2ade');
156
+ if (!this.input || !this.output)
157
+ throw new Error('Mesh proxy characteristics are missing');
158
+ this.iv = undefined;
159
+ this.assembler = new ProxyAssembler();
160
+ this.output.on('data', this.notify);
161
+ const beacon = this.wait('beacon', () => true, 8000);
162
+ await Promise.all([beacon, deadline(this.output.subscribeAsync(), 5000, 'BLE subscribe')]);
163
+ await delay(500);
164
+ await this.configureFilter(Buffer.from([0, 0]), 0);
165
+ const addresses = Buffer.alloc(5);
166
+ addresses[0] = 1;
167
+ addresses.writeUInt16BE(this.config.source, 1);
168
+ // Amaran firmware sends menu replies to the original provisioner, not the request source.
169
+ addresses.writeUInt16BE(1, 3);
170
+ await this.configureFilter(addresses, 2);
171
+ this.initialized = true;
172
+ console.error(`Authenticated mesh proxy ready (IV ${this.iv}, source ${this.config.source})`);
173
+ return;
174
+ }
175
+ catch (error) {
176
+ failures.push(`${peripheral.id}: ${error.message}`);
177
+ await this.disconnect();
178
+ this.closing = false;
179
+ }
180
+ }
181
+ throw new Error(`Unable to initialize mesh proxy: ${failures.join('; ')}`);
182
+ }
183
+ async configureFilter(data, count) {
184
+ const response = this.wait('filter', (value) => value.length === 4 && value[0] === 3 && value[1] === 0 && value.readUInt16BE(2) === count, 4000);
185
+ await Promise.all([response, this.sendNetwork(0, data, true, true)]);
186
+ }
187
+ async sendNetwork(destination, transport, control, proxy = false, sequence = this.sequences.take()) {
188
+ if (this.iv === undefined)
189
+ throw new Error('No authenticated network beacon');
190
+ const data = this.crypto.network({
191
+ destination,
192
+ transport,
193
+ control,
194
+ sequence,
195
+ source: this.config.source,
196
+ iv: this.iv,
197
+ }, proxy);
198
+ const write = this.writes.then(async () => {
199
+ const input = this.input;
200
+ if (!input || this.closing)
201
+ throw new Error('BLE proxy is disconnected');
202
+ for (const fragment of proxyFragments(proxy ? 2 : 0, data)) {
203
+ await deadline(input.writeAsync(fragment, !input.properties.includes('write')), 3000, 'BLE write');
204
+ }
205
+ });
206
+ this.writes = write.catch((error) => {
207
+ console.error(`BLE write failed: ${error.message}`);
208
+ });
209
+ return write;
210
+ }
211
+ async send(destination, payload) {
212
+ if (!this.ready || this.iv === undefined)
213
+ throw new Error('BLE proxy is not ready');
214
+ const sequence = this.sequences.take();
215
+ const access = Buffer.concat([Buffer.from([0x26]), payload]);
216
+ await this.sendNetwork(destination, this.crypto.access(access, sequence, this.config.source, destination, this.iv), false, false, sequence);
217
+ }
218
+ async readState(address) {
219
+ return this.readPacket(address, readStatePacket(), decodeState);
220
+ }
221
+ async readFan(address) {
222
+ return this.readPacket(address, readFanPacket(), decodeFan);
223
+ }
224
+ async readProductInfo(address) {
225
+ return this.readPacket(address, packet(0), decodeProductInfo);
226
+ }
227
+ async discoverUnprovisioned() {
228
+ return discoverUnprovisioned();
229
+ }
230
+ async readPacket(address, query, decode) {
231
+ let state;
232
+ const response = this.wait('access', (message) => {
233
+ if (message.deviceKey)
234
+ return false;
235
+ if (message.source !== address)
236
+ return false;
237
+ // The command response is authenticated by the application key before reaching this point.
238
+ if (message.data[0] !== 0x26 && message.data[0] !== 0x27)
239
+ return false;
240
+ state = decode(message.data.subarray(1));
241
+ return state !== undefined;
242
+ }, 3500);
243
+ await Promise.all([response, this.send(address, query)]);
244
+ if (state === undefined)
245
+ throw new Error('No decodable fixture state');
246
+ return state;
247
+ }
248
+ async configuration(address, request, accept) {
249
+ if (!this.ready)
250
+ await this.connect();
251
+ if (!this.ready || this.iv === undefined)
252
+ throw new Error('BLE proxy is not ready');
253
+ const key = this.config.lights.find((light) => light.address === address)?.deviceKey;
254
+ if (!key)
255
+ throw new Error('Device Key is unavailable; import matching Desktop keys first');
256
+ const sequence = this.sequences.take();
257
+ const payload = this.crypto.deviceAccess(key, request, sequence, this.config.source, address, this.iv);
258
+ const response = this.wait('access', (message) => {
259
+ if (message.deviceKey !== true || message.source !== address)
260
+ return false;
261
+ if (this.debug && message.data[0] === 0x80 && [0x1f, 0x2a, 0x2c].includes(message.data[1]))
262
+ console.error(`Configuration status ${address}: ${message.data.toString('hex')}`);
263
+ return accept(message.data);
264
+ }, 5000);
265
+ const [result] = await Promise.all([response, this.sendNetwork(address, payload, false, false, sequence)]);
266
+ return result.data;
267
+ }
268
+ notify = (fragment) => {
269
+ try {
270
+ const pdu = this.assembler.push(fragment);
271
+ if (!pdu)
272
+ return;
273
+ if (pdu.type === 1) {
274
+ this.iv = this.crypto.readBeacon(pdu.data);
275
+ this.events.emit('beacon', this.iv);
276
+ return;
277
+ }
278
+ if ((pdu.type !== 0 && pdu.type !== 2) || this.iv === undefined)
279
+ return;
280
+ const message = this.crypto.readNetwork(pdu.data, this.iv, pdu.type === 2);
281
+ if (pdu.type === 2) {
282
+ this.events.emit('filter', message.transport);
283
+ return;
284
+ }
285
+ if (this.debug)
286
+ console.error(`Mesh network RX source=${message.source} destination=${message.destination} control=${message.control} transport=${message.transport.toString('hex')}`);
287
+ if (message.control || ![this.config.source, 1].includes(message.destination))
288
+ return;
289
+ if (!this.config.lights.some((light) => light.address === message.source))
290
+ return;
291
+ const lower = message.transport;
292
+ const deviceKey = !(lower[0] & 0x40);
293
+ const key = deviceKey
294
+ ? this.config.lights.find((light) => light.address === message.source)?.deviceKey
295
+ : undefined;
296
+ if (deviceKey ? (lower[0] & 63) !== 0 || !key : (lower[0] & 127) !== (0x40 | this.crypto.aid))
297
+ return;
298
+ const decode = (data, sequence = message.sequence, mic = false) => key
299
+ ? this.crypto.readDeviceAccess(key, data, message, sequence, mic)
300
+ : this.crypto.readAccess(data, message, sequence, mic);
301
+ if (!(lower[0] & 128)) {
302
+ this.emitAccess(message, decode(lower.subarray(1)), message.sequence, deviceKey);
303
+ return;
304
+ }
305
+ if (lower.length < 5)
306
+ throw new Error('Truncated segmented transport');
307
+ const zero = ((lower[1] & 127) << 6) | (lower[2] >> 2);
308
+ const index = ((lower[2] & 3) << 3) | (lower[3] >> 5);
309
+ const count = (lower[3] & 31) + 1;
310
+ const segmentKey = `${message.source}:${message.iv}:${zero}:${deviceKey ? 'device' : 'app'}`;
311
+ for (const [id, entry] of this.segments)
312
+ if (Date.now() - entry.started > 10_000)
313
+ this.segments.delete(id);
314
+ let segments = this.segments.get(segmentKey);
315
+ if (!segments) {
316
+ let sequence = (message.sequence & ~8191) | zero;
317
+ if (sequence > message.sequence)
318
+ sequence -= 8192;
319
+ segments = { chunks: new Map(), count, sequence, mic: Boolean(lower[1] & 128), started: Date.now() };
320
+ this.segments.set(segmentKey, segments);
321
+ }
322
+ if (index >= count || count !== segments.count)
323
+ throw new Error('Inconsistent segmented transport');
324
+ segments.chunks.set(index, lower.subarray(4));
325
+ if (segments.chunks.size !== count)
326
+ return;
327
+ const encrypted = Buffer.concat(Array.from({ length: count }, (_, i) => segments.chunks.get(i) ?? Buffer.alloc(0)));
328
+ const decoded = decode(encrypted, segments.sequence, segments.mic);
329
+ const ack = Buffer.alloc(7);
330
+ ack.writeUInt16BE(zero << 2, 1);
331
+ ack.writeUInt32BE(count === 32 ? 0xffffffff : 2 ** count - 1, 3);
332
+ void this.sendNetwork(message.source, ack, true).catch((error) => console.error(`Segment acknowledgement failed: ${error.message}`));
333
+ this.segments.delete(segmentKey);
334
+ this.emitAccess(message, decoded, segments.sequence, deviceKey);
335
+ }
336
+ catch (error) {
337
+ console.error(`Rejected BLE notification: ${error.message}`);
338
+ }
339
+ };
340
+ emitAccess(message, data, sequence, deviceKey = false) {
341
+ const last = this.received.get(message.source);
342
+ if (last && (message.iv < last.iv || (message.iv === last.iv && sequence <= last.sequence)))
343
+ return;
344
+ this.received.set(message.source, { iv: message.iv, sequence });
345
+ if (this.debug && !deviceKey)
346
+ console.error(`Mesh RX source=${message.source} sequence=${sequence} access=${data.toString('hex')}`);
347
+ this.events.emit('access', { source: message.source, sequence, data, deviceKey });
348
+ }
349
+ async disconnect() {
350
+ this.closing = true;
351
+ this.initialized = false;
352
+ this.events.emit('lost');
353
+ this.output?.removeListener('data', this.notify);
354
+ const peripheral = this.peripheral;
355
+ this.input = undefined;
356
+ this.output = undefined;
357
+ if (peripheral && peripheral.state !== 'disconnected') {
358
+ try {
359
+ await deadline(peripheral.disconnectAsync(), 3000, 'BLE disconnect');
360
+ }
361
+ catch (error) {
362
+ console.error(error.message);
363
+ peripheral.cancelConnect();
364
+ }
365
+ }
366
+ this.peripheral = undefined;
367
+ this.segments.clear();
368
+ }
369
+ }
370
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/ble/transport.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,15 @@
1
1
  export type { CCTOptions, CCTResult, WeatherOptions } from './daylightSimulation/cctUtil.js';
2
2
  export { CurveType, calculateCCT, getAvailableCurves, parseCurveType } from './daylightSimulation/cctUtil.js';
3
3
  export { ALL_CURVE_TYPES_ORDERED, CCT_DEFAULTS, CURVE_HELP_TEXT, CURVE_METADATA, ERROR_MESSAGES, SPECIAL_TIME_CONFIG, VALID_CURVES_LIST, VALIDATION_RANGES, } from './daylightSimulation/constants.js';
4
+ export type { CurrentCCTDeps, CurrentCCTOptions, CurrentCCTResult } from './daylightSimulation/currentCct.js';
5
+ export { calculateCurrentCCT } from './daylightSimulation/currentCct.js';
4
6
  export * as curves from './daylightSimulation/curves/index.js';
5
7
  export type { Location } from './daylightSimulation/geoipUtil.js';
6
8
  export { getLocationFromIP } from './daylightSimulation/geoipUtil.js';
7
9
  export type { GraphScheduleOptions } from './daylightSimulation/graphSchedule.js';
8
10
  export { graphSchedule } from './daylightSimulation/graphSchedule.js';
9
11
  export { interpolateMaxLux, parseMaxLuxMap } from './daylightSimulation/mathUtil.js';
12
+ export { parseCloudCover } from './daylightSimulation/parseUtils.js';
10
13
  export { formatCoordinate, formatLocation, formatSource } from './daylightSimulation/privacyUtil.js';
11
14
  export type { MakeScheduleOptions, Schedule, ScheduleMakerDeps, SchedulePoint, } from './daylightSimulation/scheduleMaker.js';
12
15
  export { ScheduleMaker } from './daylightSimulation/scheduleMaker.js';
@@ -1 +1 @@
1
- {"version":3,"file":"circadian.d.ts","sourceRoot":"","sources":["../src/circadian.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAC9G,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,sCAAsC,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACrG,YAAY,EACV,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,EACjB,aAAa,GACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,YAAY,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"circadian.d.ts","sourceRoot":"","sources":["../src/circadian.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAC9G,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC9G,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,MAAM,MAAM,sCAAsC,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACrG,YAAY,EACV,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,EACjB,aAAa,GACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,YAAY,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC"}
package/dist/circadian.js CHANGED
@@ -1,9 +1,11 @@
1
1
  export { CurveType, calculateCCT, getAvailableCurves, parseCurveType } from './daylightSimulation/cctUtil.js';
2
2
  export { ALL_CURVE_TYPES_ORDERED, CCT_DEFAULTS, CURVE_HELP_TEXT, CURVE_METADATA, ERROR_MESSAGES, SPECIAL_TIME_CONFIG, VALID_CURVES_LIST, VALIDATION_RANGES, } from './daylightSimulation/constants.js';
3
+ export { calculateCurrentCCT } from './daylightSimulation/currentCct.js';
3
4
  export * as curves from './daylightSimulation/curves/index.js';
4
5
  export { getLocationFromIP } from './daylightSimulation/geoipUtil.js';
5
6
  export { graphSchedule } from './daylightSimulation/graphSchedule.js';
6
7
  export { interpolateMaxLux, parseMaxLuxMap } from './daylightSimulation/mathUtil.js';
8
+ export { parseCloudCover } from './daylightSimulation/parseUtils.js';
7
9
  export { formatCoordinate, formatLocation, formatSource } from './daylightSimulation/privacyUtil.js';
8
10
  export { ScheduleMaker } from './daylightSimulation/scheduleMaker.js';
9
11
  export { textSchedule } from './daylightSimulation/textSchedule.js';
@@ -1 +1 @@
1
- {"version":3,"file":"circadian.js","sourceRoot":"","sources":["../src/circadian.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAC9G,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,sCAAsC,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAOrG,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"circadian.js","sourceRoot":"","sources":["../src/circadian.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAC9G,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,MAAM,MAAM,sCAAsC,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAOrG,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC"}
package/dist/cli.d.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from 'commander';
3
3
  import registerCommands from './commands.js';
4
+ import BleHttpController from './deviceControl/bleHttpControl.js';
4
5
  import LightController from './deviceControl/lightControl.js';
5
- import type { Device } from './deviceControl/types.js';
6
+ import type { Device, LightBackend } from './deviceControl/types.js';
6
7
  declare const program: Command;
7
- declare function createController(wsUrl?: string, clientId?: string, debug?: boolean): Promise<LightController>;
8
+ declare function createController(wsUrl?: string, clientId?: string, debug?: boolean, backend?: LightBackend): Promise<LightController | BleHttpController>;
8
9
  declare function asyncCommand<T extends unknown[]>(fn: (...args: T) => Promise<void>): (...args: T) => Promise<void>;
9
10
  declare function findDevice(controller: LightController, deviceQuery: string): Device | null;
10
11
  export { program, createController, findDevice, asyncCommand, registerCommands };
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,gBAAgB,MAAM,eAAe,CAAC;AAI7C,OAAO,eAAe,MAAM,iCAAiC,CAAC;AAE9D,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAQ/D,QAAA,MAAM,OAAO,SAAgB,CAAC;AAiK9B,iBAAe,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CA2H5G;AAGD,iBAAS,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,IAClE,GAAG,MAAM,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAMnC;AAGD,iBAAS,UAAU,CAAC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBnF;AAkCD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,gBAAgB,MAAM,eAAe,CAAC;AAG7C,OAAO,iBAAiB,MAAM,mCAAmC,CAAC;AAElE,OAAO,eAAe,MAAM,iCAAiC,CAAC;AAE9D,OAAO,KAAK,EAAU,MAAM,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAQ7E,QAAA,MAAM,OAAO,SAAgB,CAAC;AAyQ9B,iBAAe,gBAAgB,CAC7B,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,eAAe,GAAG,iBAAiB,CAAC,CAoI9C;AAGD,iBAAS,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,IAClE,GAAG,MAAM,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAMnC;AAGD,iBAAS,UAAU,CAAC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBnF;AAmCD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC"}