node-switchbot 4.0.0-beta.1 → 4.0.0-beta.10

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 (246) hide show
  1. package/.github/copilot-instructions.md +19 -5
  2. package/BLE.md +117 -4
  3. package/CHANGELOG.md +45 -0
  4. package/README.md +7 -1
  5. package/dist/api.d.ts +3 -3
  6. package/dist/api.d.ts.map +1 -1
  7. package/dist/api.js +9 -6
  8. package/dist/api.js.map +1 -1
  9. package/dist/ble.d.ts +38 -4
  10. package/dist/ble.d.ts.map +1 -1
  11. package/dist/ble.js +409 -53
  12. package/dist/ble.js.map +1 -1
  13. package/dist/devices/base.d.ts +83 -5
  14. package/dist/devices/base.d.ts.map +1 -1
  15. package/dist/devices/base.js +371 -34
  16. package/dist/devices/base.js.map +1 -1
  17. package/dist/devices/device-override-state-during-connection.d.ts +27 -0
  18. package/dist/devices/device-override-state-during-connection.d.ts.map +1 -0
  19. package/dist/devices/device-override-state-during-connection.js +45 -0
  20. package/dist/devices/device-override-state-during-connection.js.map +1 -0
  21. package/dist/devices/index.d.ts +4 -0
  22. package/dist/devices/index.d.ts.map +1 -1
  23. package/dist/devices/index.js +4 -0
  24. package/dist/devices/index.js.map +1 -1
  25. package/dist/devices/sequence-device.d.ts +36 -0
  26. package/dist/devices/sequence-device.d.ts.map +1 -0
  27. package/dist/devices/sequence-device.js +75 -0
  28. package/dist/devices/sequence-device.js.map +1 -0
  29. package/dist/devices/wo-air-purifier.d.ts +2 -2
  30. package/dist/devices/wo-air-purifier.d.ts.map +1 -1
  31. package/dist/devices/wo-air-purifier.js +2 -2
  32. package/dist/devices/wo-air-purifier.js.map +1 -1
  33. package/dist/devices/wo-bulb.d.ts +10 -0
  34. package/dist/devices/wo-bulb.d.ts.map +1 -1
  35. package/dist/devices/wo-bulb.js +69 -0
  36. package/dist/devices/wo-bulb.js.map +1 -1
  37. package/dist/devices/wo-curtain.d.ts +3 -3
  38. package/dist/devices/wo-curtain.d.ts.map +1 -1
  39. package/dist/devices/wo-curtain.js +12 -9
  40. package/dist/devices/wo-curtain.js.map +1 -1
  41. package/dist/devices/wo-hand.d.ts +53 -2
  42. package/dist/devices/wo-hand.d.ts.map +1 -1
  43. package/dist/devices/wo-hand.js +121 -3
  44. package/dist/devices/wo-hand.js.map +1 -1
  45. package/dist/devices/wo-lock-pro.d.ts +11 -2
  46. package/dist/devices/wo-lock-pro.d.ts.map +1 -1
  47. package/dist/devices/wo-lock-pro.js +65 -3
  48. package/dist/devices/wo-lock-pro.js.map +1 -1
  49. package/dist/devices/wo-lock.d.ts +7 -2
  50. package/dist/devices/wo-lock.d.ts.map +1 -1
  51. package/dist/devices/wo-lock.js +58 -3
  52. package/dist/devices/wo-lock.js.map +1 -1
  53. package/dist/devices/wo-plug-mini-us.d.ts +2 -2
  54. package/dist/devices/wo-plug-mini-us.d.ts.map +1 -1
  55. package/dist/devices/wo-plug-mini-us.js +2 -2
  56. package/dist/devices/wo-plug-mini-us.js.map +1 -1
  57. package/dist/devices/wo-relay-switch-1.d.ts +4 -2
  58. package/dist/devices/wo-relay-switch-1.d.ts.map +1 -1
  59. package/dist/devices/wo-relay-switch-1.js +36 -4
  60. package/dist/devices/wo-relay-switch-1.js.map +1 -1
  61. package/dist/devices/wo-relay-switch-2pm.d.ts +21 -0
  62. package/dist/devices/wo-relay-switch-2pm.d.ts.map +1 -0
  63. package/dist/devices/wo-relay-switch-2pm.js +39 -0
  64. package/dist/devices/wo-relay-switch-2pm.js.map +1 -0
  65. package/dist/devices/wo-rgbic-bulb.d.ts +29 -0
  66. package/dist/devices/wo-rgbic-bulb.d.ts.map +1 -0
  67. package/dist/devices/wo-rgbic-bulb.js +84 -0
  68. package/dist/devices/wo-rgbic-bulb.js.map +1 -0
  69. package/dist/index.d.ts +2 -0
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +2 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/settings.d.ts +17 -0
  74. package/dist/settings.d.ts.map +1 -1
  75. package/dist/settings.js +18 -1
  76. package/dist/settings.js.map +1 -1
  77. package/dist/switchbot.d.ts.map +1 -1
  78. package/dist/switchbot.js +31 -8
  79. package/dist/switchbot.js.map +1 -1
  80. package/dist/types/ble.d.ts +20 -1
  81. package/dist/types/ble.d.ts.map +1 -1
  82. package/dist/types/ble.js.map +1 -1
  83. package/dist/types/device.d.ts +30 -3
  84. package/dist/types/device.d.ts.map +1 -1
  85. package/dist/types/index.d.ts +22 -0
  86. package/dist/types/index.d.ts.map +1 -1
  87. package/dist/types/index.js.map +1 -1
  88. package/dist/utils/bot-ble.d.ts +36 -0
  89. package/dist/utils/bot-ble.d.ts.map +1 -0
  90. package/dist/utils/bot-ble.js +109 -0
  91. package/dist/utils/bot-ble.js.map +1 -0
  92. package/dist/utils/circuit-breaker.d.ts +98 -0
  93. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  94. package/dist/utils/circuit-breaker.js +187 -0
  95. package/dist/utils/circuit-breaker.js.map +1 -0
  96. package/dist/utils/connection-tracker.d.ts +66 -0
  97. package/dist/utils/connection-tracker.d.ts.map +1 -0
  98. package/dist/utils/connection-tracker.js +184 -0
  99. package/dist/utils/connection-tracker.js.map +1 -0
  100. package/dist/utils/fallback-handler.d.ts +68 -0
  101. package/dist/utils/fallback-handler.d.ts.map +1 -0
  102. package/dist/utils/fallback-handler.js +131 -0
  103. package/dist/utils/fallback-handler.js.map +1 -0
  104. package/dist/utils/index.d.ts +10 -0
  105. package/dist/utils/index.d.ts.map +1 -1
  106. package/dist/utils/index.js +41 -4
  107. package/dist/utils/index.js.map +1 -1
  108. package/dist/utils/retry.d.ts +55 -0
  109. package/dist/utils/retry.d.ts.map +1 -0
  110. package/dist/utils/retry.js +95 -0
  111. package/dist/utils/retry.js.map +1 -0
  112. package/docs/assets/hierarchy.js +1 -1
  113. package/docs/assets/navigation.js +1 -1
  114. package/docs/assets/search.js +1 -1
  115. package/docs/classes/APIError.html +2 -2
  116. package/docs/classes/APINotAvailableError.html +2 -2
  117. package/docs/classes/BLEConnection.html +16 -10
  118. package/docs/classes/BLENotAvailableError.html +2 -2
  119. package/docs/classes/BLEScanner.html +11 -9
  120. package/docs/classes/CommandFailedError.html +2 -2
  121. package/docs/classes/ConnectionTimeoutError.html +2 -2
  122. package/docs/classes/DeviceManager.html +13 -13
  123. package/docs/classes/DeviceNotFoundError.html +2 -2
  124. package/docs/classes/DeviceOverrideStateDuringConnection.html +56 -0
  125. package/docs/classes/DiscoveryError.html +2 -2
  126. package/docs/classes/OpenAPIClient.html +24 -24
  127. package/docs/classes/SequenceDevice.html +58 -0
  128. package/docs/classes/SwitchBot.html +11 -11
  129. package/docs/classes/SwitchBotDevice.html +43 -15
  130. package/docs/classes/SwitchBotError.html +2 -2
  131. package/docs/classes/ValidationError.html +2 -2
  132. package/docs/classes/WoAirPurifier.html +48 -18
  133. package/docs/classes/WoAirPurifierTable.html +48 -18
  134. package/docs/classes/WoBlindTilt.html +48 -20
  135. package/docs/classes/WoBulb.html +52 -19
  136. package/docs/classes/WoCeilingLight.html +52 -19
  137. package/docs/classes/WoContact.html +42 -14
  138. package/docs/classes/WoCurtain.html +46 -18
  139. package/docs/classes/WoHand.html +63 -19
  140. package/docs/classes/WoHub2.html +42 -14
  141. package/docs/classes/WoHub3.html +42 -14
  142. package/docs/classes/WoHumi.html +46 -18
  143. package/docs/classes/WoHumi2.html +46 -18
  144. package/docs/classes/WoIOSensorTH.html +42 -14
  145. package/docs/classes/WoKeypad.html +42 -14
  146. package/docs/classes/WoLeak.html +42 -14
  147. package/docs/classes/WoPlugMiniJP.html +45 -17
  148. package/docs/classes/WoPlugMiniUS.html +45 -17
  149. package/docs/classes/WoPresence.html +42 -14
  150. package/docs/classes/WoRelaySwitch1.html +47 -17
  151. package/docs/classes/WoRelaySwitch1PM.html +47 -17
  152. package/docs/classes/WoRemote.html +42 -14
  153. package/docs/classes/WoSensorTH.html +42 -14
  154. package/docs/classes/WoSensorTHPlus.html +42 -14
  155. package/docs/classes/WoSensorTHPro.html +42 -14
  156. package/docs/classes/WoSensorTHProCO2.html +42 -14
  157. package/docs/classes/WoSmartLock.html +49 -16
  158. package/docs/classes/WoSmartLockPro.html +52 -17
  159. package/docs/classes/WoStrip.html +52 -19
  160. package/docs/enums/LogLevel.html +2 -2
  161. package/docs/enums/SwitchBotBLEModel.html +2 -2
  162. package/docs/enums/SwitchBotBLEModelName.html +2 -2
  163. package/docs/functions/updateBaseURL.html +1 -1
  164. package/docs/hierarchy.html +1 -1
  165. package/docs/index.html +2 -2
  166. package/docs/interfaces/APICommandRequest.html +2 -2
  167. package/docs/interfaces/APICommandResponse.html +2 -2
  168. package/docs/interfaces/APIDevice.html +2 -2
  169. package/docs/interfaces/APIDeviceStatus.html +2 -2
  170. package/docs/interfaces/APIErrorResponse.html +2 -2
  171. package/docs/interfaces/APIResponse.html +2 -2
  172. package/docs/interfaces/AirPurifierCommands.html +2 -2
  173. package/docs/interfaces/AirPurifierServiceData.html +20 -5
  174. package/docs/interfaces/AirPurifierStatus.html +7 -7
  175. package/docs/interfaces/BLEAdvertisement.html +3 -2
  176. package/docs/interfaces/BLEScanOptions.html +5 -5
  177. package/docs/interfaces/BLEServiceData.html +22 -5
  178. package/docs/interfaces/BlindTiltCommands.html +2 -2
  179. package/docs/interfaces/BlindTiltServiceData.html +21 -5
  180. package/docs/interfaces/BlindTiltStatus.html +6 -6
  181. package/docs/interfaces/BotCommands.html +6 -2
  182. package/docs/interfaces/BotServiceData.html +20 -5
  183. package/docs/interfaces/BotStatus.html +6 -6
  184. package/docs/interfaces/BulbCommands.html +4 -2
  185. package/docs/interfaces/BulbServiceData.html +21 -5
  186. package/docs/interfaces/BulbStatus.html +6 -6
  187. package/docs/interfaces/CeilingLightCommands.html +4 -2
  188. package/docs/interfaces/CeilingLightServiceData.html +21 -5
  189. package/docs/interfaces/CeilingLightStatus.html +6 -6
  190. package/docs/interfaces/CommandResult.html +6 -6
  191. package/docs/interfaces/ContactServiceData.html +22 -5
  192. package/docs/interfaces/ContactStatus.html +6 -6
  193. package/docs/interfaces/CurtainCommands.html +2 -2
  194. package/docs/interfaces/CurtainServiceData.html +22 -5
  195. package/docs/interfaces/CurtainStatus.html +6 -6
  196. package/docs/interfaces/DeviceInfo.html +23 -13
  197. package/docs/interfaces/DeviceListResponse.html +2 -2
  198. package/docs/interfaces/DeviceStatus.html +6 -6
  199. package/docs/interfaces/DiscoveryOptions.html +7 -7
  200. package/docs/interfaces/HubServiceData.html +22 -5
  201. package/docs/interfaces/HubStatus.html +6 -6
  202. package/docs/interfaces/HumidifierCommands.html +2 -2
  203. package/docs/interfaces/HumidifierServiceData.html +23 -6
  204. package/docs/interfaces/HumidifierStatus.html +6 -6
  205. package/docs/interfaces/KeypadStatus.html +6 -6
  206. package/docs/interfaces/LeakServiceData.html +22 -5
  207. package/docs/interfaces/LeakStatus.html +6 -6
  208. package/docs/interfaces/LockCommands.html +6 -2
  209. package/docs/interfaces/LockServiceData.html +20 -6
  210. package/docs/interfaces/LockStatus.html +6 -6
  211. package/docs/interfaces/MeterServiceData.html +22 -5
  212. package/docs/interfaces/MeterStatus.html +6 -6
  213. package/docs/interfaces/MotionServiceData.html +22 -5
  214. package/docs/interfaces/MotionStatus.html +6 -6
  215. package/docs/interfaces/PlugCommands.html +2 -2
  216. package/docs/interfaces/PlugServiceData.html +21 -5
  217. package/docs/interfaces/PlugStatus.html +6 -6
  218. package/docs/interfaces/PresenceServiceData.html +22 -5
  219. package/docs/interfaces/PresenceStatus.html +6 -6
  220. package/docs/interfaces/RelaySwitchCommands.html +2 -2
  221. package/docs/interfaces/RelaySwitchServiceData.html +21 -5
  222. package/docs/interfaces/RelaySwitchStatus.html +6 -6
  223. package/docs/interfaces/RemoteStatus.html +6 -6
  224. package/docs/interfaces/SceneListResponse.html +2 -2
  225. package/docs/interfaces/StripCommands.html +4 -2
  226. package/docs/interfaces/StripServiceData.html +21 -5
  227. package/docs/interfaces/StripStatus.html +6 -6
  228. package/docs/interfaces/SwitchBotConfig.html +21 -9
  229. package/docs/interfaces/WebhookConfig.html +2 -2
  230. package/docs/interfaces/WebhookDetails.html +2 -2
  231. package/docs/interfaces/WebhookQueryResponse.html +2 -2
  232. package/docs/interfaces/WebhookSetupResponse.html +2 -2
  233. package/docs/media/BLE.md +117 -4
  234. package/docs/modules.html +1 -1
  235. package/docs/types/ConnectionType.html +1 -1
  236. package/docs/types/PhysicalDeviceType.html +1 -1
  237. package/docs/types/VirtualDeviceType.html +1 -1
  238. package/docs/variables/urls.html +1 -1
  239. package/package.json +11 -7
  240. package/tmp-switchbot-scan.mjs +79 -0
  241. package/todo/PYSWITCHBOT_COMPARISON.md +484 -0
  242. package/todo/README.md +68 -0
  243. package/todo/completed.md +134 -0
  244. package/todo/todo.md +296 -0
  245. package/tsconfig.build.json +17 -0
  246. package/PRODUCTION_READY.md +0 -135
@@ -0,0 +1,45 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/device-override-state-during-connection.ts: SwitchBot v4.0.0 - Device Override State During Connection Base Class
4
+ */
5
+ import { SwitchBotDevice } from './base.js';
6
+ /**
7
+ * Base class for devices that should ignore advertisement state while connected.
8
+ * Prevents stale BLE advertisement data from overriding active connection state.
9
+ */
10
+ export class DeviceOverrideStateDuringConnection extends SwitchBotDevice {
11
+ constructor(info, options = {}) {
12
+ super(info, options);
13
+ }
14
+ updateInfo(newInfo) {
15
+ if (!this.isBLEConnected()) {
16
+ super.updateInfo(newInfo);
17
+ return;
18
+ }
19
+ const filtered = { ...newInfo };
20
+ delete filtered.bleServiceData;
21
+ delete filtered.battery;
22
+ delete filtered.rssi;
23
+ super.updateInfo(filtered);
24
+ }
25
+ normalizeBLEStatusData(data) {
26
+ if (data && typeof data === 'object') {
27
+ return super.normalizeBLEStatusData(data);
28
+ }
29
+ if (this.isBLEConnected()) {
30
+ return {};
31
+ }
32
+ return super.normalizeBLEStatusData(data);
33
+ }
34
+ isBLEConnected() {
35
+ if (!this.bleConnection?.isConnected) {
36
+ return false;
37
+ }
38
+ const macOrBleId = this.info.mac ?? (this.info.bleId ? `id:${this.info.bleId}` : undefined);
39
+ if (!macOrBleId) {
40
+ return false;
41
+ }
42
+ return this.bleConnection.isConnected(macOrBleId);
43
+ }
44
+ }
45
+ //# sourceMappingURL=device-override-state-during-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-override-state-during-connection.js","sourceRoot":"","sources":["../../src/devices/device-override-state-during-connection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;;GAGG;AACH,MAAM,OAAgB,mCAAoC,SAAQ,eAAe;IAC/E,YACE,IAAgB,EAChB,UAWI,EAAE;QAEN,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACtB,CAAC;IAEQ,UAAU,CAAC,OAA4B;QAC9C,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;YACzB,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAwB,EAAE,GAAG,OAAO,EAAE,CAAA;QACpD,OAAO,QAAQ,CAAC,cAAc,CAAA;QAC9B,OAAO,QAAQ,CAAC,OAAO,CAAA;QACvB,OAAO,QAAQ,CAAC,IAAI,CAAA;QAEpB,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IAC5B,CAAC;IAEkB,sBAAsB,CAAC,IAAS;QACjD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAA;QAC3C,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAA;IAC3C,CAAC;IAES,cAAc;QACtB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC;YACrC,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC3F,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;IACnD,CAAC;CACF"}
@@ -1,4 +1,6 @@
1
1
  export { DeviceManager, SwitchBotDevice } from './base.js';
2
+ export { DeviceOverrideStateDuringConnection } from './device-override-state-during-connection.js';
3
+ export { SequenceDevice } from './sequence-device.js';
2
4
  export { WoAirPurifierTable } from './wo-air-purifier-table.js';
3
5
  export { WoAirPurifier } from './wo-air-purifier.js';
4
6
  export { WoBlindTilt } from './wo-blind-tilt.js';
@@ -21,7 +23,9 @@ export { WoPlugMiniUS } from './wo-plug-mini-us.js';
21
23
  export { WoPresence } from './wo-presence.js';
22
24
  export { WoRelaySwitch1 } from './wo-relay-switch-1.js';
23
25
  export { WoRelaySwitch1PM } from './wo-relay-switch-1pm.js';
26
+ export { WoRelaySwitch2PM } from './wo-relay-switch-2pm.js';
24
27
  export { WoRemote } from './wo-remote.js';
28
+ export { WoRGBICBulb } from './wo-rgbic-bulb.js';
25
29
  export { WoSensorTHPlus } from './wo-sensor-th-plus.js';
26
30
  export { WoSensorTHProCO2 } from './wo-sensor-th-pro-co2.js';
27
31
  export { WoSensorTHPro } from './wo-sensor-th-pro.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devices/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devices/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC1D,OAAO,EAAE,mCAAmC,EAAE,MAAM,8CAA8C,CAAA;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA"}
@@ -3,6 +3,8 @@
3
3
  * devices/index.ts: SwitchBot v4.0.0 - Device Exports
4
4
  */
5
5
  export { DeviceManager, SwitchBotDevice } from './base.js';
6
+ export { DeviceOverrideStateDuringConnection } from './device-override-state-during-connection.js';
7
+ export { SequenceDevice } from './sequence-device.js';
6
8
  export { WoAirPurifierTable } from './wo-air-purifier-table.js';
7
9
  export { WoAirPurifier } from './wo-air-purifier.js';
8
10
  export { WoBlindTilt } from './wo-blind-tilt.js';
@@ -25,7 +27,9 @@ export { WoPlugMiniUS } from './wo-plug-mini-us.js';
25
27
  export { WoPresence } from './wo-presence.js';
26
28
  export { WoRelaySwitch1 } from './wo-relay-switch-1.js';
27
29
  export { WoRelaySwitch1PM } from './wo-relay-switch-1pm.js';
30
+ export { WoRelaySwitch2PM } from './wo-relay-switch-2pm.js';
28
31
  export { WoRemote } from './wo-remote.js';
32
+ export { WoRGBICBulb } from './wo-rgbic-bulb.js';
29
33
  export { WoSensorTHPlus } from './wo-sensor-th-plus.js';
30
34
  export { WoSensorTHProCO2 } from './wo-sensor-th-pro-co2.js';
31
35
  export { WoSensorTHPro } from './wo-sensor-th-pro.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devices/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devices/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC1D,OAAO,EAAE,mCAAmC,EAAE,MAAM,8CAA8C,CAAA;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,36 @@
1
+ import type { OpenAPIClient } from '../api.js';
2
+ import type { BLEConnection } from '../ble.js';
3
+ import type { ConnectionType, DeviceInfo, DeviceStatus } from '../types/index.js';
4
+ import type { CircuitBreakerConfig, RetryConfig } from '../utils/index.js';
5
+ import { SwitchBotDevice } from './base.js';
6
+ /**
7
+ * Base class for devices that expose an advertisement sequence number.
8
+ * Automatically triggers a status refresh when the sequence number changes.
9
+ */
10
+ export declare abstract class SequenceDevice extends SwitchBotDevice {
11
+ private lastSequenceNumber;
12
+ private sequenceUpdateInFlight;
13
+ constructor(info: DeviceInfo, options?: {
14
+ bleConnection?: BLEConnection;
15
+ apiClient?: OpenAPIClient;
16
+ enableFallback?: boolean;
17
+ preferredConnection?: ConnectionType;
18
+ enableConnectionIntelligence?: boolean;
19
+ enableCircuitBreaker?: boolean;
20
+ enableRetry?: boolean;
21
+ retryConfig?: RetryConfig;
22
+ circuitBreakerConfig?: CircuitBreakerConfig;
23
+ logLevel?: number;
24
+ });
25
+ /**
26
+ * Refresh status for this device. Called automatically after sequence changes.
27
+ */
28
+ update(): Promise<DeviceStatus>;
29
+ /**
30
+ * Update device information and react to sequence number changes.
31
+ */
32
+ updateInfo(newInfo: Partial<DeviceInfo>): void;
33
+ private getSequenceNumberFromInfo;
34
+ private triggerSequenceUpdate;
35
+ }
36
+ //# sourceMappingURL=sequence-device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence-device.d.ts","sourceRoot":"","sources":["../../src/devices/sequence-device.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACjF,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;;GAGG;AACH,8BAAsB,cAAe,SAAQ,eAAe;IAC1D,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,sBAAsB,CAAQ;gBAGpC,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,aAAa,CAAA;QAC7B,SAAS,CAAC,EAAE,aAAa,CAAA;QACzB,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,mBAAmB,CAAC,EAAE,cAAc,CAAA;QACpC,4BAA4B,CAAC,EAAE,OAAO,CAAA;QACtC,oBAAoB,CAAC,EAAE,OAAO,CAAA;QAC9B,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,WAAW,CAAC,EAAE,WAAW,CAAA;QACzB,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;QAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;KACb;IAMR;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAIrC;;OAEG;IACM,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IA6BvD,OAAO,CAAC,yBAAyB;YAMnB,qBAAqB;CAmBpC"}
@@ -0,0 +1,75 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/sequence-device.ts: SwitchBot v4.0.0 - Sequence Aware Device Base Class
4
+ */
5
+ import { SwitchBotDevice } from './base.js';
6
+ /**
7
+ * Base class for devices that expose an advertisement sequence number.
8
+ * Automatically triggers a status refresh when the sequence number changes.
9
+ */
10
+ export class SequenceDevice extends SwitchBotDevice {
11
+ lastSequenceNumber;
12
+ sequenceUpdateInFlight = false;
13
+ constructor(info, options = {}) {
14
+ super(info, options);
15
+ this.lastSequenceNumber = this.getSequenceNumberFromInfo(info);
16
+ }
17
+ /**
18
+ * Refresh status for this device. Called automatically after sequence changes.
19
+ */
20
+ async update() {
21
+ return this.getStatus();
22
+ }
23
+ /**
24
+ * Update device information and react to sequence number changes.
25
+ */
26
+ updateInfo(newInfo) {
27
+ const previousSequenceNumber = this.lastSequenceNumber;
28
+ super.updateInfo(newInfo);
29
+ const nextSequenceNumber = this.getSequenceNumberFromInfo(this.info);
30
+ if (nextSequenceNumber === undefined) {
31
+ return;
32
+ }
33
+ if (previousSequenceNumber === undefined) {
34
+ this.lastSequenceNumber = nextSequenceNumber;
35
+ return;
36
+ }
37
+ if (nextSequenceNumber === previousSequenceNumber) {
38
+ return;
39
+ }
40
+ this.lastSequenceNumber = nextSequenceNumber;
41
+ this.emit('sequence-changed', {
42
+ deviceId: this.info.id,
43
+ previousSequenceNumber,
44
+ sequenceNumber: nextSequenceNumber,
45
+ updatedAt: new Date(),
46
+ });
47
+ void this.triggerSequenceUpdate();
48
+ }
49
+ getSequenceNumberFromInfo(info) {
50
+ const raw = (info.bleServiceData ?? {});
51
+ const sequenceNumber = raw.sequenceNumber;
52
+ return typeof sequenceNumber === 'number' ? sequenceNumber : undefined;
53
+ }
54
+ async triggerSequenceUpdate() {
55
+ if (this.sequenceUpdateInFlight) {
56
+ return;
57
+ }
58
+ this.sequenceUpdateInFlight = true;
59
+ try {
60
+ const status = await this.update();
61
+ this.emit('status-updated', {
62
+ deviceId: this.info.id,
63
+ status,
64
+ updatedAt: new Date(),
65
+ });
66
+ }
67
+ catch (error) {
68
+ this.logger.debug('Sequence-triggered update failed', error);
69
+ }
70
+ finally {
71
+ this.sequenceUpdateInFlight = false;
72
+ }
73
+ }
74
+ }
75
+ //# sourceMappingURL=sequence-device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence-device.js","sourceRoot":"","sources":["../../src/devices/sequence-device.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;;GAGG;AACH,MAAM,OAAgB,cAAe,SAAQ,eAAe;IAClD,kBAAkB,CAAoB;IACtC,sBAAsB,GAAG,KAAK,CAAA;IAEtC,YACE,IAAgB,EAChB,UAWI,EAAE;QAEN,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACpB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAA;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,SAAS,EAAE,CAAA;IACzB,CAAC;IAED;;OAEG;IACM,UAAU,CAAC,OAA4B;QAC9C,MAAM,sBAAsB,GAAG,IAAI,CAAC,kBAAkB,CAAA;QACtD,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QAEzB,MAAM,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpE,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACrC,OAAM;QACR,CAAC;QAED,IAAI,sBAAsB,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;YAC5C,OAAM;QACR,CAAC;QAED,IAAI,kBAAkB,KAAK,sBAAsB,EAAE,CAAC;YAClD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC5B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;YACtB,sBAAsB;YACtB,cAAc,EAAE,kBAAkB;YAClC,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC,CAAA;QAEF,KAAK,IAAI,CAAC,qBAAqB,EAAE,CAAA;IACnC,CAAC;IAEO,yBAAyB,CAAC,IAAgB;QAChD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAA4B,CAAA;QAClE,MAAM,cAAc,GAAG,GAAG,CAAC,cAAc,CAAA;QACzC,OAAO,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;IACxE,CAAC;IAEO,KAAK,CAAC,qBAAqB;QACjC,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,OAAM;QACR,CAAC;QAED,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAA;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;YAClC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC1B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;gBACtB,MAAM;gBACN,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAA;QAC9D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAA;QACrC,CAAC;IACH,CAAC;CACF"}
@@ -1,9 +1,9 @@
1
1
  import type { AirPurifierCommands, AirPurifierStatus } from '../types/device.js';
2
- import { SwitchBotDevice } from './base.js';
2
+ import { SequenceDevice } from './sequence-device.js';
3
3
  /**
4
4
  * Air Purifier Device
5
5
  */
6
- export declare class WoAirPurifier extends SwitchBotDevice implements AirPurifierCommands {
6
+ export declare class WoAirPurifier extends SequenceDevice implements AirPurifierCommands {
7
7
  /**
8
8
  * Turn on
9
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"wo-air-purifier.d.ts","sourceRoot":"","sources":["../../src/devices/wo-air-purifier.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAIhF,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,aAAc,SAAQ,eAAgB,YAAW,mBAAmB;IAC/E;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQjC;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBlE;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAalD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAqD9C"}
1
+ {"version":3,"file":"wo-air-purifier.d.ts","sourceRoot":"","sources":["../../src/devices/wo-air-purifier.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAIhF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD;;GAEG;AACH,qBAAa,aAAc,SAAQ,cAAe,YAAW,mBAAmB;IAC9E;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQjC;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBlE;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAalD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAqD9C"}
@@ -4,11 +4,11 @@
4
4
  */
5
5
  import { DEVICE_COMMANDS } from '../settings.js';
6
6
  import { clamp } from '../utils/index.js';
7
- import { SwitchBotDevice } from './base.js';
7
+ import { SequenceDevice } from './sequence-device.js';
8
8
  /**
9
9
  * Air Purifier Device
10
10
  */
11
- export class WoAirPurifier extends SwitchBotDevice {
11
+ export class WoAirPurifier extends SequenceDevice {
12
12
  /**
13
13
  * Turn on
14
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"wo-air-purifier.js","sourceRoot":"","sources":["../../src/devices/wo-air-purifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wo-air-purifier.js","sourceRoot":"","sources":["../../src/devices/wo-air-purifier.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { SwitchBotDevice } from './base.js';
4
4
  * Color Bulb Device
5
5
  */
6
6
  export declare class WoBulb extends SwitchBotDevice implements BulbCommands {
7
+ private static readonly EFFECTS;
7
8
  /**
8
9
  * Turn on
9
10
  */
@@ -20,10 +21,19 @@ export declare class WoBulb extends SwitchBotDevice implements BulbCommands {
20
21
  * Set color temperature (2700-6500K)
21
22
  */
22
23
  setColorTemperature(temperature: number): Promise<boolean>;
24
+ /**
25
+ * Set color temperature with min/max bounds
26
+ * For advanced bulbs that support color temperature range control
27
+ */
28
+ setColorTemp(minTemp: number, maxTemp: number, temp: number): Promise<boolean>;
23
29
  /**
24
30
  * Set RGB color
25
31
  */
26
32
  setColor(red: number, green: number, blue: number): Promise<boolean>;
33
+ /**
34
+ * Set preset light effect
35
+ */
36
+ setEffect(effectName: string, speed?: number): Promise<boolean>;
27
37
  /**
28
38
  * Get device status
29
39
  */
@@ -1 +1 @@
1
- {"version":3,"file":"wo-bulb.d.ts","sourceRoot":"","sources":["../../src/devices/wo-bulb.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAIlE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,MAAO,SAAQ,eAAgB,YAAW,YAAY;IACjE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQjC;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAazD;;OAEG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAehE;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe1E;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;CAmDvC"}
1
+ {"version":3,"file":"wo-bulb.d.ts","sourceRoot":"","sources":["../../src/devices/wo-bulb.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAIlE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,MAAO,SAAQ,eAAgB,YAAW,YAAY;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAqB9B;IAED;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQjC;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAazD;;OAEG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAehE;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuCpF;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe1E;;OAEG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBlE;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;CAmDvC"}
@@ -9,6 +9,28 @@ import { SwitchBotDevice } from './base.js';
9
9
  * Color Bulb Device
10
10
  */
11
11
  export class WoBulb extends SwitchBotDevice {
12
+ static EFFECTS = {
13
+ christmas: 0x00,
14
+ candle: 0x01,
15
+ halloween: 0x02,
16
+ sunset: 0x03,
17
+ party: 0x04,
18
+ reading: 0x05,
19
+ rainbow: 0x06,
20
+ forest: 0x07,
21
+ ocean: 0x08,
22
+ spring: 0x09,
23
+ summer: 0x0A,
24
+ autumn: 0x0B,
25
+ winter: 0x0C,
26
+ aurora: 0x0D,
27
+ meteor: 0x0E,
28
+ firework: 0x0F,
29
+ breathe: 0x10,
30
+ pulse: 0x11,
31
+ flicker: 0x12,
32
+ pet: 0x13,
33
+ };
12
34
  /**
13
35
  * Turn on
14
36
  */
@@ -43,6 +65,40 @@ export class WoBulb extends SwitchBotDevice {
43
65
  const result = await this.sendCommand(bleCommand, 'setColorTemperature', clampedTemp);
44
66
  return result.success;
45
67
  }
68
+ /**
69
+ * Set color temperature with min/max bounds
70
+ * For advanced bulbs that support color temperature range control
71
+ */
72
+ async setColorTemp(minTemp, maxTemp, temp) {
73
+ // Validate and clamp temperatures
74
+ const clampedMinTemp = clamp(minTemp, 2700, 6500);
75
+ const clampedMaxTemp = clamp(maxTemp, 2700, 6500);
76
+ const clampedTemp = clamp(temp, clampedMinTemp, clampedMaxTemp);
77
+ // Ensure min <= max
78
+ const finalMinTemp = Math.min(clampedMinTemp, clampedMaxTemp);
79
+ const finalMaxTemp = Math.max(clampedMinTemp, clampedMaxTemp);
80
+ // Build command: 0x57 0x0F 0x47 0x01 0x17 BRIGHTNESS MIN_KEL MAX_KEL TEMP
81
+ // Note: Brightness is required but not specified, use default 100 (0x64)
82
+ const minTempBytes = [
83
+ (finalMinTemp >> 8) & 0xFF,
84
+ finalMinTemp & 0xFF,
85
+ ];
86
+ const maxTempBytes = [
87
+ (finalMaxTemp >> 8) & 0xFF,
88
+ finalMaxTemp & 0xFF,
89
+ ];
90
+ const tempBytes = [(clampedTemp >> 8) & 0xFF, clampedTemp & 0xFF];
91
+ const bleCommand = [
92
+ ...DEVICE_COMMANDS.BULB.BASE,
93
+ 0x17,
94
+ 0x64, // brightness (default: 100/255)
95
+ ...minTempBytes,
96
+ ...maxTempBytes,
97
+ ...tempBytes,
98
+ ];
99
+ const result = await this.sendCommand(bleCommand, 'setColorTemp', `${finalMinTemp}-${finalMaxTemp}:${clampedTemp}`);
100
+ return result.success;
101
+ }
46
102
  /**
47
103
  * Set RGB color
48
104
  */
@@ -54,6 +110,19 @@ export class WoBulb extends SwitchBotDevice {
54
110
  const result = await this.sendCommand(bleCommand, 'setColor', `${r}:${g}:${b}`);
55
111
  return result.success;
56
112
  }
113
+ /**
114
+ * Set preset light effect
115
+ */
116
+ async setEffect(effectName, speed = 100) {
117
+ const effectId = WoBulb.EFFECTS[effectName.toLowerCase()];
118
+ if (effectId === undefined) {
119
+ throw new Error(`Unsupported effect: ${effectName}`);
120
+ }
121
+ const effectSpeed = clamp(speed, 1, 100);
122
+ const bleCommand = [...DEVICE_COMMANDS.BULB.BASE, effectId, 0xFF, effectSpeed, 0x00, 0x00, 0x00];
123
+ const result = await this.sendCommand(bleCommand, 'setEffect', `${effectName}:${effectSpeed}`);
124
+ return result.success;
125
+ }
57
126
  /**
58
127
  * Get device status
59
128
  */
@@ -1 +1 @@
1
- {"version":3,"file":"wo-bulb.js","sourceRoot":"","sources":["../../src/devices/wo-bulb.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wo-bulb.js","sourceRoot":"","sources":["../../src/devices/wo-bulb.ts"],"names":[],"mappings":"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"}
@@ -7,11 +7,11 @@ export declare class WoCurtain extends SwitchBotDevice implements CurtainCommand
7
7
  /**
8
8
  * Open curtain (position 0%)
9
9
  */
10
- open(): Promise<boolean>;
10
+ open(speed?: number): Promise<boolean>;
11
11
  /**
12
12
  * Close curtain (position 100%)
13
13
  */
14
- close(): Promise<boolean>;
14
+ close(speed?: number): Promise<boolean>;
15
15
  /**
16
16
  * Pause curtain movement
17
17
  */
@@ -19,7 +19,7 @@ export declare class WoCurtain extends SwitchBotDevice implements CurtainCommand
19
19
  /**
20
20
  * Set curtain position (0-100%)
21
21
  */
22
- setPosition(position: number): Promise<boolean>;
22
+ setPosition(position: number, speed?: number): Promise<boolean>;
23
23
  /**
24
24
  * Get device status
25
25
  */
@@ -1 +1 @@
1
- {"version":3,"file":"wo-curtain.d.ts","sourceRoot":"","sources":["../../src/devices/wo-curtain.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIxE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,SAAU,SAAQ,eAAgB,YAAW,eAAe;IACvE;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ/B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ/B;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAcrD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;CAoC1C"}
1
+ {"version":3,"file":"wo-curtain.d.ts","sourceRoot":"","sources":["../../src/devices/wo-curtain.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIxE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,SAAU,SAAQ,eAAgB,YAAW,eAAe;IACvE;;OAEG;IACG,IAAI,CAAC,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzC;;OAEG;IACG,KAAK,CAAC,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ/B;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAelE;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;CAoC1C"}
@@ -12,15 +12,17 @@ export class WoCurtain extends SwitchBotDevice {
12
12
  /**
13
13
  * Open curtain (position 0%)
14
14
  */
15
- async open() {
16
- const result = await this.sendCommand(DEVICE_COMMANDS.CURTAIN.OPEN, 'turnOn');
15
+ async open(speed = 255) {
16
+ const clampedSpeed = clamp(speed, 1, 255);
17
+ const result = await this.sendCommand([...DEVICE_COMMANDS.CURTAIN.POSITION, clampedSpeed, 0], 'setPosition', `0,${clampedSpeed.toString(16).padStart(2, '0')},0`);
17
18
  return result.success;
18
19
  }
19
20
  /**
20
21
  * Close curtain (position 100%)
21
22
  */
22
- async close() {
23
- const result = await this.sendCommand(DEVICE_COMMANDS.CURTAIN.CLOSE, 'turnOff');
23
+ async close(speed = 255) {
24
+ const clampedSpeed = clamp(speed, 1, 255);
25
+ const result = await this.sendCommand([...DEVICE_COMMANDS.CURTAIN.POSITION, clampedSpeed, 100], 'setPosition', `0,${clampedSpeed.toString(16).padStart(2, '0')},100`);
24
26
  return result.success;
25
27
  }
26
28
  /**
@@ -33,11 +35,12 @@ export class WoCurtain extends SwitchBotDevice {
33
35
  /**
34
36
  * Set curtain position (0-100%)
35
37
  */
36
- async setPosition(position) {
38
+ async setPosition(position, speed = 255) {
37
39
  const clampedPosition = clamp(position, 0, 100);
38
- // BLE command with position byte
39
- const bleCommand = [...DEVICE_COMMANDS.CURTAIN.POSITION, clampedPosition];
40
- const result = await this.sendCommand(bleCommand, 'setPosition', `0,ff,${clampedPosition}`);
40
+ const clampedSpeed = clamp(speed, 1, 255);
41
+ // BLE command with speed and position bytes
42
+ const bleCommand = [...DEVICE_COMMANDS.CURTAIN.POSITION, clampedSpeed, clampedPosition];
43
+ const result = await this.sendCommand(bleCommand, 'setPosition', `0,${clampedSpeed.toString(16).padStart(2, '0')},${clampedPosition}`);
41
44
  return result.success;
42
45
  }
43
46
  /**
@@ -61,7 +64,7 @@ export class WoCurtain extends SwitchBotDevice {
61
64
  }
62
65
  // Fallback to BLE
63
66
  if (this.hasBLE()) {
64
- const bleData = await this.getBLEStatus();
67
+ const bleData = await this.getBLEStatus().catch(() => this.normalizeBLEStatusData(undefined));
65
68
  return {
66
69
  deviceId: this.info.id,
67
70
  connectionType: 'ble',
@@ -1 +1 @@
1
- {"version":3,"file":"wo-curtain.js","sourceRoot":"","sources":["../../src/devices/wo-curtain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,eAAe;IAC5C;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,eAAe,CAAC,OAAO,CAAC,IAAI,EAC5B,QAAQ,CACT,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,eAAe,CAAC,OAAO,CAAC,KAAK,EAC7B,SAAS,CACV,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,eAAe,CAAC,OAAO,CAAC,KAAK,EAC7B,OAAO,CACR,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,QAAgB;QAChC,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;QAE/C,iCAAiC;QACjC,MAAM,UAAU,GAAG,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;QAEzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,UAAU,EACV,aAAa,EACb,QAAQ,eAAe,EAAE,CAC1B,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,6BAA6B;YAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;gBAC3C,OAAO;oBACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;oBACtB,cAAc,EAAE,KAAK;oBACrB,QAAQ,EAAE,SAAS,CAAC,aAAa,IAAI,CAAC;oBACtC,UAAU,EAAE,SAAS,CAAC,SAAS;oBAC/B,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAA;YACH,CAAC;YAED,kBAAkB;YAClB,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;gBACzC,OAAO;oBACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;oBACtB,cAAc,EAAE,KAAK;oBACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;oBAC/B,UAAU,EAAE,OAAO,CAAC,WAAW;oBAC/B,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAA;YACH,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;YAChD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"wo-curtain.js","sourceRoot":"","sources":["../../src/devices/wo-curtain.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,25 @@
1
+ import type { OpenAPIClient } from '../api.js';
2
+ import type { BLEConnection } from '../ble.js';
1
3
  import type { BotCommands, BotStatus } from '../types/device.js';
2
- import { SwitchBotDevice } from './base.js';
4
+ import type { DeviceInfo } from '../types/index.js';
5
+ import { DeviceOverrideStateDuringConnection } from './device-override-state-during-connection.js';
3
6
  /**
4
7
  * Bot (WoHand) Device - Press or switch button device
8
+ * Supports optional BLE password protection
5
9
  */
6
- export declare class WoHand extends SwitchBotDevice implements BotCommands {
10
+ export declare class WoHand extends DeviceOverrideStateDuringConnection implements BotCommands {
11
+ private password?;
12
+ constructor(info: DeviceInfo, options?: {
13
+ bleConnection?: BLEConnection;
14
+ apiClient?: OpenAPIClient;
15
+ enableFallback?: boolean;
16
+ preferredConnection?: 'ble' | 'api';
17
+ enableConnectionIntelligence?: boolean;
18
+ enableCircuitBreaker?: boolean;
19
+ enableRetry?: boolean;
20
+ password?: string;
21
+ logLevel?: number;
22
+ });
7
23
  /**
8
24
  * Turn on (switch mode)
9
25
  */
@@ -16,6 +32,41 @@ export declare class WoHand extends SwitchBotDevice implements BotCommands {
16
32
  * Press (press mode)
17
33
  */
18
34
  press(): Promise<boolean>;
35
+ /**
36
+ * Set Bot mode
37
+ */
38
+ setMode(mode: 'press' | 'switch'): Promise<boolean>;
39
+ /**
40
+ * Set Bot long-press duration (1-255 deciseconds)
41
+ */
42
+ setLongPress(duration: number): Promise<boolean>;
43
+ /**
44
+ * Raise Bot arm
45
+ */
46
+ handUp(): Promise<boolean>;
47
+ /**
48
+ * Lower Bot arm
49
+ */
50
+ handDown(): Promise<boolean>;
51
+ /**
52
+ * Execute password-protected Bot command
53
+ * @param action - Bot action to perform
54
+ * @returns True if command was successful
55
+ */
56
+ private executePasswordCommand;
57
+ /**
58
+ * Set or update Bot password
59
+ * @param password - 4-character alphanumeric password (case-sensitive)
60
+ */
61
+ setPassword(password: string): void;
62
+ /**
63
+ * Clear Bot password
64
+ */
65
+ clearPassword(): void;
66
+ /**
67
+ * Check if password is configured
68
+ */
69
+ hasPassword(): boolean;
19
70
  /**
20
71
  * Get device status
21
72
  */
@@ -1 +1 @@
1
- {"version":3,"file":"wo-hand.d.ts","sourceRoot":"","sources":["../../src/devices/wo-hand.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,MAAO,SAAQ,eAAgB,YAAW,WAAW;IAChE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ/B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;CAmCtC"}
1
+ {"version":3,"file":"wo-hand.d.ts","sourceRoot":"","sources":["../../src/devices/wo-hand.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAInD,OAAO,EAAE,mCAAmC,EAAE,MAAM,8CAA8C,CAAA;AAElG;;;GAGG;AACH,qBAAa,MAAO,SAAQ,mCAAoC,YAAW,WAAW;IACpF,OAAO,CAAC,QAAQ,CAAC,CAAQ;gBAGvB,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,aAAa,CAAA;QAC7B,SAAS,CAAC,EAAE,aAAa,CAAA;QACzB,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,mBAAmB,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;QACnC,4BAA4B,CAAC,EAAE,OAAO,CAAA;QACtC,oBAAoB,CAAC,EAAE,OAAO,CAAA;QAC9B,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;KACb;IAiBR;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAchC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAcjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAc/B;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzD;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUtD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAQlC;;;;OAIG;YACW,sBAAsB;IAmCpC;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMnC;;OAEG;IACH,aAAa,IAAI,IAAI;IAKrB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;CAmCtC"}