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

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 (379) 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 +29 -0
  22. package/dist/devices/index.d.ts.map +1 -1
  23. package/dist/devices/index.js +29 -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-art-frame.d.ts +8 -0
  34. package/dist/devices/wo-art-frame.d.ts.map +1 -0
  35. package/dist/devices/wo-art-frame.js +12 -0
  36. package/dist/devices/wo-art-frame.js.map +1 -0
  37. package/dist/devices/wo-bulb.d.ts +10 -0
  38. package/dist/devices/wo-bulb.d.ts.map +1 -1
  39. package/dist/devices/wo-bulb.js +69 -0
  40. package/dist/devices/wo-bulb.js.map +1 -1
  41. package/dist/devices/wo-circulator-fan.d.ts +8 -0
  42. package/dist/devices/wo-circulator-fan.d.ts.map +1 -0
  43. package/dist/devices/wo-circulator-fan.js +12 -0
  44. package/dist/devices/wo-circulator-fan.js.map +1 -0
  45. package/dist/devices/wo-climate-panel.d.ts +8 -0
  46. package/dist/devices/wo-climate-panel.d.ts.map +1 -0
  47. package/dist/devices/wo-climate-panel.js +12 -0
  48. package/dist/devices/wo-climate-panel.js.map +1 -0
  49. package/dist/devices/wo-curtain.d.ts +3 -3
  50. package/dist/devices/wo-curtain.d.ts.map +1 -1
  51. package/dist/devices/wo-curtain.js +12 -9
  52. package/dist/devices/wo-curtain.js.map +1 -1
  53. package/dist/devices/wo-floor-lamp.d.ts +8 -0
  54. package/dist/devices/wo-floor-lamp.d.ts.map +1 -0
  55. package/dist/devices/wo-floor-lamp.js +12 -0
  56. package/dist/devices/wo-floor-lamp.js.map +1 -0
  57. package/dist/devices/wo-garage-door-opener.d.ts +8 -0
  58. package/dist/devices/wo-garage-door-opener.d.ts.map +1 -0
  59. package/dist/devices/wo-garage-door-opener.js +12 -0
  60. package/dist/devices/wo-garage-door-opener.js.map +1 -0
  61. package/dist/devices/wo-hand.d.ts +53 -2
  62. package/dist/devices/wo-hand.d.ts.map +1 -1
  63. package/dist/devices/wo-hand.js +121 -3
  64. package/dist/devices/wo-hand.js.map +1 -1
  65. package/dist/devices/wo-hubmini-matter.d.ts +8 -0
  66. package/dist/devices/wo-hubmini-matter.d.ts.map +1 -0
  67. package/dist/devices/wo-hubmini-matter.js +12 -0
  68. package/dist/devices/wo-hubmini-matter.js.map +1 -0
  69. package/dist/devices/wo-humi2.d.ts +12 -0
  70. package/dist/devices/wo-humi2.d.ts.map +1 -1
  71. package/dist/devices/wo-humi2.js +18 -0
  72. package/dist/devices/wo-humi2.js.map +1 -1
  73. package/dist/devices/wo-keypad-vision-pro.d.ts +18 -0
  74. package/dist/devices/wo-keypad-vision-pro.d.ts.map +1 -0
  75. package/dist/devices/wo-keypad-vision-pro.js +15 -0
  76. package/dist/devices/wo-keypad-vision-pro.js.map +1 -0
  77. package/dist/devices/wo-keypad-vision.d.ts +8 -0
  78. package/dist/devices/wo-keypad-vision.d.ts.map +1 -0
  79. package/dist/devices/wo-keypad-vision.js +12 -0
  80. package/dist/devices/wo-keypad-vision.js.map +1 -0
  81. package/dist/devices/wo-lock-lite.d.ts +7 -0
  82. package/dist/devices/wo-lock-lite.d.ts.map +1 -0
  83. package/dist/devices/wo-lock-lite.js +11 -0
  84. package/dist/devices/wo-lock-lite.js.map +1 -0
  85. package/dist/devices/wo-lock-pro-wifi.d.ts +7 -0
  86. package/dist/devices/wo-lock-pro-wifi.d.ts.map +1 -0
  87. package/dist/devices/wo-lock-pro-wifi.js +11 -0
  88. package/dist/devices/wo-lock-pro-wifi.js.map +1 -0
  89. package/dist/devices/wo-lock-pro.d.ts +11 -2
  90. package/dist/devices/wo-lock-pro.d.ts.map +1 -1
  91. package/dist/devices/wo-lock-pro.js +65 -3
  92. package/dist/devices/wo-lock-pro.js.map +1 -1
  93. package/dist/devices/wo-lock-vision-pro.d.ts +7 -0
  94. package/dist/devices/wo-lock-vision-pro.d.ts.map +1 -0
  95. package/dist/devices/wo-lock-vision-pro.js +11 -0
  96. package/dist/devices/wo-lock-vision-pro.js.map +1 -0
  97. package/dist/devices/wo-lock-vision.d.ts +7 -0
  98. package/dist/devices/wo-lock-vision.d.ts.map +1 -0
  99. package/dist/devices/wo-lock-vision.js +11 -0
  100. package/dist/devices/wo-lock-vision.js.map +1 -0
  101. package/dist/devices/wo-lock.d.ts +7 -2
  102. package/dist/devices/wo-lock.d.ts.map +1 -1
  103. package/dist/devices/wo-lock.js +58 -3
  104. package/dist/devices/wo-lock.js.map +1 -1
  105. package/dist/devices/wo-plug-mini-us.d.ts +2 -2
  106. package/dist/devices/wo-plug-mini-us.d.ts.map +1 -1
  107. package/dist/devices/wo-plug-mini-us.js +2 -2
  108. package/dist/devices/wo-plug-mini-us.js.map +1 -1
  109. package/dist/devices/wo-relay-switch-1.d.ts +4 -2
  110. package/dist/devices/wo-relay-switch-1.d.ts.map +1 -1
  111. package/dist/devices/wo-relay-switch-1.js +36 -4
  112. package/dist/devices/wo-relay-switch-1.js.map +1 -1
  113. package/dist/devices/wo-relay-switch-2pm.d.ts +21 -0
  114. package/dist/devices/wo-relay-switch-2pm.d.ts.map +1 -0
  115. package/dist/devices/wo-relay-switch-2pm.js +39 -0
  116. package/dist/devices/wo-relay-switch-2pm.js.map +1 -0
  117. package/dist/devices/wo-rgbic-bulb.d.ts +29 -0
  118. package/dist/devices/wo-rgbic-bulb.d.ts.map +1 -0
  119. package/dist/devices/wo-rgbic-bulb.js +84 -0
  120. package/dist/devices/wo-rgbic-bulb.js.map +1 -0
  121. package/dist/devices/wo-rgbicww-floor-lamp.d.ts +8 -0
  122. package/dist/devices/wo-rgbicww-floor-lamp.d.ts.map +1 -0
  123. package/dist/devices/wo-rgbicww-floor-lamp.js +12 -0
  124. package/dist/devices/wo-rgbicww-floor-lamp.js.map +1 -0
  125. package/dist/devices/wo-rgbicww-strip-light.d.ts +8 -0
  126. package/dist/devices/wo-rgbicww-strip-light.d.ts.map +1 -0
  127. package/dist/devices/wo-rgbicww-strip-light.js +12 -0
  128. package/dist/devices/wo-rgbicww-strip-light.js.map +1 -0
  129. package/dist/devices/wo-roller-shade.d.ts +8 -0
  130. package/dist/devices/wo-roller-shade.d.ts.map +1 -0
  131. package/dist/devices/wo-roller-shade.js +12 -0
  132. package/dist/devices/wo-roller-shade.js.map +1 -0
  133. package/dist/devices/wo-smart-thermostat-radiator.d.ts +8 -0
  134. package/dist/devices/wo-smart-thermostat-radiator.d.ts.map +1 -0
  135. package/dist/devices/wo-smart-thermostat-radiator.js +12 -0
  136. package/dist/devices/wo-smart-thermostat-radiator.js.map +1 -0
  137. package/dist/devices/wo-strip-light-3.d.ts +8 -0
  138. package/dist/devices/wo-strip-light-3.d.ts.map +1 -0
  139. package/dist/devices/wo-strip-light-3.js +12 -0
  140. package/dist/devices/wo-strip-light-3.js.map +1 -0
  141. package/dist/devices/wo-vacuum-k10-plus.d.ts +7 -0
  142. package/dist/devices/wo-vacuum-k10-plus.d.ts.map +1 -0
  143. package/dist/devices/wo-vacuum-k10-plus.js +11 -0
  144. package/dist/devices/wo-vacuum-k10-plus.js.map +1 -0
  145. package/dist/devices/wo-vacuum-k10-pro-combo.d.ts +7 -0
  146. package/dist/devices/wo-vacuum-k10-pro-combo.d.ts.map +1 -0
  147. package/dist/devices/wo-vacuum-k10-pro-combo.js +11 -0
  148. package/dist/devices/wo-vacuum-k10-pro-combo.js.map +1 -0
  149. package/dist/devices/wo-vacuum-k10-pro.d.ts +7 -0
  150. package/dist/devices/wo-vacuum-k10-pro.d.ts.map +1 -0
  151. package/dist/devices/wo-vacuum-k10-pro.js +11 -0
  152. package/dist/devices/wo-vacuum-k10-pro.js.map +1 -0
  153. package/dist/devices/wo-vacuum-k11-plus.d.ts +7 -0
  154. package/dist/devices/wo-vacuum-k11-plus.d.ts.map +1 -0
  155. package/dist/devices/wo-vacuum-k11-plus.js +11 -0
  156. package/dist/devices/wo-vacuum-k11-plus.js.map +1 -0
  157. package/dist/devices/wo-vacuum-k20.d.ts +7 -0
  158. package/dist/devices/wo-vacuum-k20.d.ts.map +1 -0
  159. package/dist/devices/wo-vacuum-k20.js +11 -0
  160. package/dist/devices/wo-vacuum-k20.js.map +1 -0
  161. package/dist/devices/wo-vacuum-s10.d.ts +7 -0
  162. package/dist/devices/wo-vacuum-s10.d.ts.map +1 -0
  163. package/dist/devices/wo-vacuum-s10.js +11 -0
  164. package/dist/devices/wo-vacuum-s10.js.map +1 -0
  165. package/dist/devices/wo-vacuum-s20.d.ts +7 -0
  166. package/dist/devices/wo-vacuum-s20.d.ts.map +1 -0
  167. package/dist/devices/wo-vacuum-s20.js +11 -0
  168. package/dist/devices/wo-vacuum-s20.js.map +1 -0
  169. package/dist/devices/wo-vacuum.d.ts +44 -0
  170. package/dist/devices/wo-vacuum.d.ts.map +1 -0
  171. package/dist/devices/wo-vacuum.js +117 -0
  172. package/dist/devices/wo-vacuum.js.map +1 -0
  173. package/dist/index.d.ts +4 -2
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +3 -1
  176. package/dist/index.js.map +1 -1
  177. package/dist/settings.d.ts +27 -0
  178. package/dist/settings.d.ts.map +1 -1
  179. package/dist/settings.js +76 -6
  180. package/dist/settings.js.map +1 -1
  181. package/dist/switchbot.d.ts.map +1 -1
  182. package/dist/switchbot.js +86 -9
  183. package/dist/switchbot.js.map +1 -1
  184. package/dist/types/ble.d.ts +20 -1
  185. package/dist/types/ble.d.ts.map +1 -1
  186. package/dist/types/ble.js.map +1 -1
  187. package/dist/types/device.d.ts +49 -3
  188. package/dist/types/device.d.ts.map +1 -1
  189. package/dist/types/index.d.ts +22 -0
  190. package/dist/types/index.d.ts.map +1 -1
  191. package/dist/types/index.js.map +1 -1
  192. package/dist/utils/bot-ble.d.ts +36 -0
  193. package/dist/utils/bot-ble.d.ts.map +1 -0
  194. package/dist/utils/bot-ble.js +109 -0
  195. package/dist/utils/bot-ble.js.map +1 -0
  196. package/dist/utils/circuit-breaker.d.ts +98 -0
  197. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  198. package/dist/utils/circuit-breaker.js +187 -0
  199. package/dist/utils/circuit-breaker.js.map +1 -0
  200. package/dist/utils/connection-tracker.d.ts +66 -0
  201. package/dist/utils/connection-tracker.d.ts.map +1 -0
  202. package/dist/utils/connection-tracker.js +184 -0
  203. package/dist/utils/connection-tracker.js.map +1 -0
  204. package/dist/utils/fallback-handler.d.ts +68 -0
  205. package/dist/utils/fallback-handler.d.ts.map +1 -0
  206. package/dist/utils/fallback-handler.js +131 -0
  207. package/dist/utils/fallback-handler.js.map +1 -0
  208. package/dist/utils/index.d.ts +10 -0
  209. package/dist/utils/index.d.ts.map +1 -1
  210. package/dist/utils/index.js +41 -4
  211. package/dist/utils/index.js.map +1 -1
  212. package/dist/utils/retry.d.ts +55 -0
  213. package/dist/utils/retry.d.ts.map +1 -0
  214. package/dist/utils/retry.js +95 -0
  215. package/dist/utils/retry.js.map +1 -0
  216. package/docs/assets/hierarchy.js +1 -1
  217. package/docs/assets/navigation.js +1 -1
  218. package/docs/assets/search.js +1 -1
  219. package/docs/classes/APIError.html +2 -2
  220. package/docs/classes/APINotAvailableError.html +2 -2
  221. package/docs/classes/BLEConnection.html +16 -10
  222. package/docs/classes/BLENotAvailableError.html +2 -2
  223. package/docs/classes/BLEScanner.html +11 -9
  224. package/docs/classes/CommandFailedError.html +2 -2
  225. package/docs/classes/ConnectionTimeoutError.html +2 -2
  226. package/docs/classes/DeviceManager.html +13 -13
  227. package/docs/classes/DeviceNotFoundError.html +2 -2
  228. package/docs/classes/DeviceOverrideStateDuringConnection.html +56 -0
  229. package/docs/classes/DiscoveryError.html +2 -2
  230. package/docs/classes/OpenAPIClient.html +24 -24
  231. package/docs/classes/SequenceDevice.html +58 -0
  232. package/docs/classes/SwitchBot.html +11 -11
  233. package/docs/classes/SwitchBotDevice.html +43 -15
  234. package/docs/classes/SwitchBotError.html +2 -2
  235. package/docs/classes/ValidationError.html +2 -2
  236. package/docs/classes/WoAirPurifier.html +48 -18
  237. package/docs/classes/WoAirPurifierTable.html +48 -18
  238. package/docs/classes/WoArtFrame.html +71 -0
  239. package/docs/classes/WoBlindTilt.html +48 -20
  240. package/docs/classes/WoBulb.html +52 -19
  241. package/docs/classes/WoCeilingLight.html +52 -19
  242. package/docs/classes/WoCirculatorFan.html +66 -0
  243. package/docs/classes/WoClimatePanel.html +66 -0
  244. package/docs/classes/WoContact.html +42 -14
  245. package/docs/classes/WoCurtain.html +46 -18
  246. package/docs/classes/WoFloorLamp.html +71 -0
  247. package/docs/classes/WoGarageDoorOpener.html +64 -0
  248. package/docs/classes/WoHand.html +63 -19
  249. package/docs/classes/WoHub2.html +42 -14
  250. package/docs/classes/WoHub3.html +42 -14
  251. package/docs/classes/WoHubMiniMatter.html +56 -0
  252. package/docs/classes/WoHumi.html +46 -18
  253. package/docs/classes/WoHumi2.html +52 -18
  254. package/docs/classes/WoIOSensorTH.html +42 -14
  255. package/docs/classes/WoKeypad.html +42 -14
  256. package/docs/classes/WoKeypadVision.html +56 -0
  257. package/docs/classes/WoKeypadVisionPro.html +56 -0
  258. package/docs/classes/WoLeak.html +42 -14
  259. package/docs/classes/WoPlugMiniJP.html +45 -17
  260. package/docs/classes/WoPlugMiniUS.html +45 -17
  261. package/docs/classes/WoPresence.html +42 -14
  262. package/docs/classes/WoRGBICBulb.html +82 -0
  263. package/docs/classes/WoRGBICWWFloorLamp.html +82 -0
  264. package/docs/classes/WoRGBICWWStripLight.html +82 -0
  265. package/docs/classes/WoRelaySwitch1.html +47 -17
  266. package/docs/classes/WoRelaySwitch1PM.html +47 -17
  267. package/docs/classes/WoRelaySwitch2PM.html +68 -0
  268. package/docs/classes/WoRemote.html +42 -14
  269. package/docs/classes/WoRollerShade.html +64 -0
  270. package/docs/classes/WoSensorTH.html +42 -14
  271. package/docs/classes/WoSensorTHPlus.html +42 -14
  272. package/docs/classes/WoSensorTHPro.html +42 -14
  273. package/docs/classes/WoSensorTHProCO2.html +42 -14
  274. package/docs/classes/WoSmartLock.html +49 -16
  275. package/docs/classes/WoSmartLockLite.html +64 -0
  276. package/docs/classes/WoSmartLockPro.html +52 -17
  277. package/docs/classes/WoSmartLockProWiFi.html +68 -0
  278. package/docs/classes/WoSmartLockVision.html +64 -0
  279. package/docs/classes/WoSmartLockVisionPro.html +68 -0
  280. package/docs/classes/WoSmartThermostatRadiator.html +66 -0
  281. package/docs/classes/WoStrip.html +52 -19
  282. package/docs/classes/WoStripLight3.html +71 -0
  283. package/docs/classes/WoVacuum.html +71 -0
  284. package/docs/classes/WoVacuumK10Plus.html +71 -0
  285. package/docs/classes/WoVacuumK10Pro.html +71 -0
  286. package/docs/classes/WoVacuumK10ProCombo.html +71 -0
  287. package/docs/classes/WoVacuumK11Plus.html +71 -0
  288. package/docs/classes/WoVacuumK20.html +71 -0
  289. package/docs/classes/WoVacuumS10.html +71 -0
  290. package/docs/classes/WoVacuumS20.html +71 -0
  291. package/docs/enums/LogLevel.html +2 -2
  292. package/docs/enums/SwitchBotBLEModel.html +2 -2
  293. package/docs/enums/SwitchBotBLEModelName.html +2 -2
  294. package/docs/functions/updateBaseURL.html +1 -1
  295. package/docs/hierarchy.html +1 -1
  296. package/docs/index.html +2 -2
  297. package/docs/interfaces/APICommandRequest.html +2 -2
  298. package/docs/interfaces/APICommandResponse.html +2 -2
  299. package/docs/interfaces/APIDevice.html +2 -2
  300. package/docs/interfaces/APIDeviceStatus.html +2 -2
  301. package/docs/interfaces/APIErrorResponse.html +2 -2
  302. package/docs/interfaces/APIResponse.html +2 -2
  303. package/docs/interfaces/AirPurifierCommands.html +2 -2
  304. package/docs/interfaces/AirPurifierServiceData.html +20 -5
  305. package/docs/interfaces/AirPurifierStatus.html +7 -7
  306. package/docs/interfaces/BLEAdvertisement.html +3 -2
  307. package/docs/interfaces/BLEScanOptions.html +5 -5
  308. package/docs/interfaces/BLEServiceData.html +22 -5
  309. package/docs/interfaces/BlindTiltCommands.html +2 -2
  310. package/docs/interfaces/BlindTiltServiceData.html +21 -5
  311. package/docs/interfaces/BlindTiltStatus.html +6 -6
  312. package/docs/interfaces/BotCommands.html +6 -2
  313. package/docs/interfaces/BotServiceData.html +20 -5
  314. package/docs/interfaces/BotStatus.html +6 -6
  315. package/docs/interfaces/BulbCommands.html +4 -2
  316. package/docs/interfaces/BulbServiceData.html +21 -5
  317. package/docs/interfaces/BulbStatus.html +6 -6
  318. package/docs/interfaces/CeilingLightCommands.html +4 -2
  319. package/docs/interfaces/CeilingLightServiceData.html +21 -5
  320. package/docs/interfaces/CeilingLightStatus.html +6 -6
  321. package/docs/interfaces/CommandResult.html +6 -6
  322. package/docs/interfaces/ContactServiceData.html +22 -5
  323. package/docs/interfaces/ContactStatus.html +6 -6
  324. package/docs/interfaces/CurtainCommands.html +2 -2
  325. package/docs/interfaces/CurtainServiceData.html +22 -5
  326. package/docs/interfaces/CurtainStatus.html +6 -6
  327. package/docs/interfaces/DeviceInfo.html +23 -13
  328. package/docs/interfaces/DeviceListResponse.html +2 -2
  329. package/docs/interfaces/DeviceStatus.html +6 -6
  330. package/docs/interfaces/DiscoveryOptions.html +7 -7
  331. package/docs/interfaces/HubServiceData.html +22 -5
  332. package/docs/interfaces/HubStatus.html +6 -6
  333. package/docs/interfaces/HumidifierCommands.html +2 -2
  334. package/docs/interfaces/HumidifierServiceData.html +23 -6
  335. package/docs/interfaces/HumidifierStatus.html +6 -6
  336. package/docs/interfaces/KeypadStatus.html +6 -6
  337. package/docs/interfaces/LeakServiceData.html +22 -5
  338. package/docs/interfaces/LeakStatus.html +6 -6
  339. package/docs/interfaces/LockCommands.html +6 -2
  340. package/docs/interfaces/LockServiceData.html +20 -6
  341. package/docs/interfaces/LockStatus.html +6 -6
  342. package/docs/interfaces/MeterServiceData.html +22 -5
  343. package/docs/interfaces/MeterStatus.html +6 -6
  344. package/docs/interfaces/MotionServiceData.html +22 -5
  345. package/docs/interfaces/MotionStatus.html +6 -6
  346. package/docs/interfaces/PlugCommands.html +2 -2
  347. package/docs/interfaces/PlugServiceData.html +21 -5
  348. package/docs/interfaces/PlugStatus.html +6 -6
  349. package/docs/interfaces/PresenceServiceData.html +22 -5
  350. package/docs/interfaces/PresenceStatus.html +6 -6
  351. package/docs/interfaces/RelaySwitchCommands.html +2 -2
  352. package/docs/interfaces/RelaySwitchServiceData.html +21 -5
  353. package/docs/interfaces/RelaySwitchStatus.html +6 -6
  354. package/docs/interfaces/RemoteStatus.html +6 -6
  355. package/docs/interfaces/SceneListResponse.html +2 -2
  356. package/docs/interfaces/StripCommands.html +4 -2
  357. package/docs/interfaces/StripServiceData.html +21 -5
  358. package/docs/interfaces/StripStatus.html +6 -6
  359. package/docs/interfaces/SwitchBotConfig.html +21 -9
  360. package/docs/interfaces/VacuumCommands.html +8 -0
  361. package/docs/interfaces/VacuumStatus.html +16 -0
  362. package/docs/interfaces/WebhookConfig.html +2 -2
  363. package/docs/interfaces/WebhookDetails.html +2 -2
  364. package/docs/interfaces/WebhookQueryResponse.html +2 -2
  365. package/docs/interfaces/WebhookSetupResponse.html +2 -2
  366. package/docs/media/BLE.md +117 -4
  367. package/docs/modules.html +1 -1
  368. package/docs/types/ConnectionType.html +1 -1
  369. package/docs/types/PhysicalDeviceType.html +1 -1
  370. package/docs/types/VirtualDeviceType.html +1 -1
  371. package/docs/variables/urls.html +1 -1
  372. package/package.json +11 -7
  373. package/tmp-switchbot-scan.mjs +79 -0
  374. package/todo/PYSWITCHBOT_COMPARISON.md +484 -0
  375. package/todo/README.md +68 -0
  376. package/todo/completed.md +309 -0
  377. package/todo/todo.md +302 -0
  378. package/tsconfig.build.json +17 -0
  379. package/PRODUCTION_READY.md +0 -135
@@ -0,0 +1,84 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-rgbic-bulb.ts: SwitchBot v4.0.0 - RGBIC Color Bulb with Segmented Control
4
+ */
5
+ import { clamp } from '../utils/index.js';
6
+ import { WoBulb } from './wo-bulb.js';
7
+ /**
8
+ * RGBIC Bulb Device with segmented/multi-zone color control
9
+ * Supports individual LED segment control for addressable RGB+IC strips
10
+ */
11
+ export class WoRGBICBulb extends WoBulb {
12
+ static RGBIC_EFFECTS = {
13
+ // Standard effects (compatible with WoBulb)
14
+ christmas: 0x00,
15
+ candle: 0x01,
16
+ halloween: 0x02,
17
+ sunset: 0x03,
18
+ party: 0x04,
19
+ reading: 0x05,
20
+ rainbow: 0x06,
21
+ forest: 0x07,
22
+ ocean: 0x08,
23
+ spring: 0x09,
24
+ summer: 0x0A,
25
+ autumn: 0x0B,
26
+ winter: 0x0C,
27
+ aurora: 0x0D,
28
+ meteor: 0x0E,
29
+ firework: 0x0F,
30
+ breathe: 0x10,
31
+ pulse: 0x11,
32
+ flicker: 0x12,
33
+ pet: 0x13,
34
+ // RGBIC-specific effects
35
+ segment_cycle: 0x20,
36
+ segment_wave: 0x21,
37
+ segment_chase: 0x22,
38
+ segment_strobe: 0x23,
39
+ segment_twinkle: 0x24,
40
+ };
41
+ /**
42
+ * Set color for individual LED segment
43
+ * @param segmentId - Segment identifier (0-based index)
44
+ * @param red - Red value (0-255)
45
+ * @param green - Green value (0-255)
46
+ * @param blue - Blue value (0-255)
47
+ */
48
+ async setSegmentColor(segmentId, red, green, blue) {
49
+ const segId = clamp(segmentId, 0, 255);
50
+ const r = clamp(red, 0, 255);
51
+ const g = clamp(green, 0, 255);
52
+ const b = clamp(blue, 0, 255);
53
+ // Command format for segment color: varies by device
54
+ // Using extended command format: 0x57 0x0F 0x47 0x01 0x13 SEG_ID R G B
55
+ const bleCommand = [0x57, 0x0F, 0x47, 0x01, 0x13, segId, r, g, b];
56
+ const result = await this.sendCommand(bleCommand, 'setSegmentColor', `seg${segId}:${r}:${g}:${b}`);
57
+ return result.success;
58
+ }
59
+ /**
60
+ * Set effect for individual LED segment
61
+ * @param segmentId - Segment identifier (0-based index)
62
+ * @param effectName - Effect name from RGBIC_EFFECTS
63
+ * @param speed - Effect speed (1-100, default: 50)
64
+ */
65
+ async setSegmentEffect(segmentId, effectName, speed = 50) {
66
+ const effectId = WoRGBICBulb.RGBIC_EFFECTS[effectName.toLowerCase()];
67
+ if (effectId === undefined) {
68
+ throw new Error(`Unsupported RGBIC effect: ${effectName}`);
69
+ }
70
+ const segId = clamp(segmentId, 0, 255);
71
+ const effectSpeed = clamp(speed, 1, 100);
72
+ // Command format for segment effect: 0x57 0x0F 0x47 0x01 0x14 SEG_ID EFFECT_ID SPEED
73
+ const bleCommand = [0x57, 0x0F, 0x47, 0x01, 0x14, segId, effectId, effectSpeed];
74
+ const result = await this.sendCommand(bleCommand, 'setSegmentEffect', `seg${segId}:${effectName}:${effectSpeed}`);
75
+ return result.success;
76
+ }
77
+ /**
78
+ * Get device status (inherited from WoBulb)
79
+ */
80
+ async getStatus() {
81
+ return super.getStatus();
82
+ }
83
+ }
84
+ //# sourceMappingURL=wo-rgbic-bulb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-rgbic-bulb.js","sourceRoot":"","sources":["../../src/devices/wo-rgbic-bulb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { WoRGBICBulb } from './wo-rgbic-bulb.js';
2
+ /**
3
+ * RGBICWW Floor Lamp Device
4
+ * Uses same logic as RGBIC Bulb with segmented control
5
+ */
6
+ export declare class WoRGBICWWFloorLamp extends WoRGBICBulb {
7
+ }
8
+ //# sourceMappingURL=wo-rgbicww-floor-lamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-rgbicww-floor-lamp.d.ts","sourceRoot":"","sources":["../../src/devices/wo-rgbicww-floor-lamp.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,WAAW;CAAG"}
@@ -0,0 +1,12 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-rgbicww-floor-lamp.ts: SwitchBot v4.0.0 - RGBICWW Floor Lamp
4
+ */
5
+ import { WoRGBICBulb } from './wo-rgbic-bulb.js';
6
+ /**
7
+ * RGBICWW Floor Lamp Device
8
+ * Uses same logic as RGBIC Bulb with segmented control
9
+ */
10
+ export class WoRGBICWWFloorLamp extends WoRGBICBulb {
11
+ }
12
+ //# sourceMappingURL=wo-rgbicww-floor-lamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-rgbicww-floor-lamp.js","sourceRoot":"","sources":["../../src/devices/wo-rgbicww-floor-lamp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,WAAW;CAAG"}
@@ -0,0 +1,8 @@
1
+ import { WoRGBICBulb } from './wo-rgbic-bulb.js';
2
+ /**
3
+ * RGBICWW Strip Light Device
4
+ * Uses same logic as RGBIC Bulb with segmented control
5
+ */
6
+ export declare class WoRGBICWWStripLight extends WoRGBICBulb {
7
+ }
8
+ //# sourceMappingURL=wo-rgbicww-strip-light.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-rgbicww-strip-light.d.ts","sourceRoot":"","sources":["../../src/devices/wo-rgbicww-strip-light.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;CAAG"}
@@ -0,0 +1,12 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-rgbicww-strip-light.ts: SwitchBot v4.0.0 - RGBICWW Strip Light
4
+ */
5
+ import { WoRGBICBulb } from './wo-rgbic-bulb.js';
6
+ /**
7
+ * RGBICWW Strip Light Device
8
+ * Uses same logic as RGBIC Bulb with segmented control
9
+ */
10
+ export class WoRGBICWWStripLight extends WoRGBICBulb {
11
+ }
12
+ //# sourceMappingURL=wo-rgbicww-strip-light.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-rgbicww-strip-light.js","sourceRoot":"","sources":["../../src/devices/wo-rgbicww-strip-light.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,WAAW;CAAG"}
@@ -0,0 +1,8 @@
1
+ import { WoCurtain } from './wo-curtain.js';
2
+ /**
3
+ * Roller Shade Device
4
+ * Uses same logic as Curtain (motorized window covering)
5
+ */
6
+ export declare class WoRollerShade extends WoCurtain {
7
+ }
8
+ //# sourceMappingURL=wo-roller-shade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-roller-shade.d.ts","sourceRoot":"","sources":["../../src/devices/wo-roller-shade.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C;;;GAGG;AACH,qBAAa,aAAc,SAAQ,SAAS;CAAG"}
@@ -0,0 +1,12 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-roller-shade.ts: SwitchBot v4.0.0 - Roller Shade
4
+ */
5
+ import { WoCurtain } from './wo-curtain.js';
6
+ /**
7
+ * Roller Shade Device
8
+ * Uses same logic as Curtain (motorized window covering)
9
+ */
10
+ export class WoRollerShade extends WoCurtain {
11
+ }
12
+ //# sourceMappingURL=wo-roller-shade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-roller-shade.js","sourceRoot":"","sources":["../../src/devices/wo-roller-shade.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,SAAS;CAAG"}
@@ -0,0 +1,8 @@
1
+ import { WoAirPurifier } from './wo-air-purifier.js';
2
+ /**
3
+ * Smart Thermostat Radiator Device
4
+ * Reuses climate control behavior for power, mode, and speed-level style control.
5
+ */
6
+ export declare class WoSmartThermostatRadiator extends WoAirPurifier {
7
+ }
8
+ //# sourceMappingURL=wo-smart-thermostat-radiator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-smart-thermostat-radiator.d.ts","sourceRoot":"","sources":["../../src/devices/wo-smart-thermostat-radiator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,aAAa;CAAG"}
@@ -0,0 +1,12 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-smart-thermostat-radiator.ts: SwitchBot v4.0.0 - Smart Thermostat Radiator Device
4
+ */
5
+ import { WoAirPurifier } from './wo-air-purifier.js';
6
+ /**
7
+ * Smart Thermostat Radiator Device
8
+ * Reuses climate control behavior for power, mode, and speed-level style control.
9
+ */
10
+ export class WoSmartThermostatRadiator extends WoAirPurifier {
11
+ }
12
+ //# sourceMappingURL=wo-smart-thermostat-radiator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-smart-thermostat-radiator.js","sourceRoot":"","sources":["../../src/devices/wo-smart-thermostat-radiator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,aAAa;CAAG"}
@@ -0,0 +1,8 @@
1
+ import { WoBulb } from './wo-bulb.js';
2
+ /**
3
+ * Strip Light 3 Device
4
+ * Uses same logic as Color Bulb
5
+ */
6
+ export declare class WoStripLight3 extends WoBulb {
7
+ }
8
+ //# sourceMappingURL=wo-strip-light-3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-strip-light-3.d.ts","sourceRoot":"","sources":["../../src/devices/wo-strip-light-3.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC;;;GAGG;AACH,qBAAa,aAAc,SAAQ,MAAM;CAAG"}
@@ -0,0 +1,12 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-strip-light-3.ts: SwitchBot v4.0.0 - Strip Light 3
4
+ */
5
+ import { WoBulb } from './wo-bulb.js';
6
+ /**
7
+ * Strip Light 3 Device
8
+ * Uses same logic as Color Bulb
9
+ */
10
+ export class WoStripLight3 extends WoBulb {
11
+ }
12
+ //# sourceMappingURL=wo-strip-light-3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-strip-light-3.js","sourceRoot":"","sources":["../../src/devices/wo-strip-light-3.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,MAAM;CAAG"}
@@ -0,0 +1,7 @@
1
+ import { WoVacuum } from './wo-vacuum.js';
2
+ /**
3
+ * Robot Vacuum Cleaner K10+
4
+ */
5
+ export declare class WoVacuumK10Plus extends WoVacuum {
6
+ }
7
+ //# sourceMappingURL=wo-vacuum-k10-plus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-k10-plus.d.ts","sourceRoot":"","sources":["../../src/devices/wo-vacuum-k10-plus.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,11 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-vacuum-k10-plus.ts: SwitchBot v4.0.0 - K10+ Vacuum Device
4
+ */
5
+ import { WoVacuum } from './wo-vacuum.js';
6
+ /**
7
+ * Robot Vacuum Cleaner K10+
8
+ */
9
+ export class WoVacuumK10Plus extends WoVacuum {
10
+ }
11
+ //# sourceMappingURL=wo-vacuum-k10-plus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-k10-plus.js","sourceRoot":"","sources":["../../src/devices/wo-vacuum-k10-plus.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,7 @@
1
+ import { WoVacuum } from './wo-vacuum.js';
2
+ /**
3
+ * Robot Vacuum Cleaner K10+ Pro Combo
4
+ */
5
+ export declare class WoVacuumK10ProCombo extends WoVacuum {
6
+ }
7
+ //# sourceMappingURL=wo-vacuum-k10-pro-combo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-k10-pro-combo.d.ts","sourceRoot":"","sources":["../../src/devices/wo-vacuum-k10-pro-combo.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,11 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-vacuum-k10-pro-combo.ts: SwitchBot v4.0.0 - K10+ Pro Combo Vacuum Device
4
+ */
5
+ import { WoVacuum } from './wo-vacuum.js';
6
+ /**
7
+ * Robot Vacuum Cleaner K10+ Pro Combo
8
+ */
9
+ export class WoVacuumK10ProCombo extends WoVacuum {
10
+ }
11
+ //# sourceMappingURL=wo-vacuum-k10-pro-combo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-k10-pro-combo.js","sourceRoot":"","sources":["../../src/devices/wo-vacuum-k10-pro-combo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,7 @@
1
+ import { WoVacuum } from './wo-vacuum.js';
2
+ /**
3
+ * Robot Vacuum Cleaner K10+ Pro
4
+ */
5
+ export declare class WoVacuumK10Pro extends WoVacuum {
6
+ }
7
+ //# sourceMappingURL=wo-vacuum-k10-pro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-k10-pro.d.ts","sourceRoot":"","sources":["../../src/devices/wo-vacuum-k10-pro.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,qBAAa,cAAe,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,11 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-vacuum-k10-pro.ts: SwitchBot v4.0.0 - K10+ Pro Vacuum Device
4
+ */
5
+ import { WoVacuum } from './wo-vacuum.js';
6
+ /**
7
+ * Robot Vacuum Cleaner K10+ Pro
8
+ */
9
+ export class WoVacuumK10Pro extends WoVacuum {
10
+ }
11
+ //# sourceMappingURL=wo-vacuum-k10-pro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-k10-pro.js","sourceRoot":"","sources":["../../src/devices/wo-vacuum-k10-pro.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,7 @@
1
+ import { WoVacuum } from './wo-vacuum.js';
2
+ /**
3
+ * Robot Vacuum Cleaner K11+
4
+ */
5
+ export declare class WoVacuumK11Plus extends WoVacuum {
6
+ }
7
+ //# sourceMappingURL=wo-vacuum-k11-plus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-k11-plus.d.ts","sourceRoot":"","sources":["../../src/devices/wo-vacuum-k11-plus.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,11 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-vacuum-k11-plus.ts: SwitchBot v4.0.0 - K11+ Vacuum Device
4
+ */
5
+ import { WoVacuum } from './wo-vacuum.js';
6
+ /**
7
+ * Robot Vacuum Cleaner K11+
8
+ */
9
+ export class WoVacuumK11Plus extends WoVacuum {
10
+ }
11
+ //# sourceMappingURL=wo-vacuum-k11-plus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-k11-plus.js","sourceRoot":"","sources":["../../src/devices/wo-vacuum-k11-plus.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,7 @@
1
+ import { WoVacuum } from './wo-vacuum.js';
2
+ /**
3
+ * Robot Vacuum Cleaner K20
4
+ */
5
+ export declare class WoVacuumK20 extends WoVacuum {
6
+ }
7
+ //# sourceMappingURL=wo-vacuum-k20.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-k20.d.ts","sourceRoot":"","sources":["../../src/devices/wo-vacuum-k20.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,qBAAa,WAAY,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,11 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-vacuum-k20.ts: SwitchBot v4.0.0 - K20 Vacuum Device
4
+ */
5
+ import { WoVacuum } from './wo-vacuum.js';
6
+ /**
7
+ * Robot Vacuum Cleaner K20
8
+ */
9
+ export class WoVacuumK20 extends WoVacuum {
10
+ }
11
+ //# sourceMappingURL=wo-vacuum-k20.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-k20.js","sourceRoot":"","sources":["../../src/devices/wo-vacuum-k20.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,7 @@
1
+ import { WoVacuum } from './wo-vacuum.js';
2
+ /**
3
+ * Robot Vacuum Cleaner S10
4
+ */
5
+ export declare class WoVacuumS10 extends WoVacuum {
6
+ }
7
+ //# sourceMappingURL=wo-vacuum-s10.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-s10.d.ts","sourceRoot":"","sources":["../../src/devices/wo-vacuum-s10.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,qBAAa,WAAY,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,11 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-vacuum-s10.ts: SwitchBot v4.0.0 - S10 Vacuum Device
4
+ */
5
+ import { WoVacuum } from './wo-vacuum.js';
6
+ /**
7
+ * Robot Vacuum Cleaner S10
8
+ */
9
+ export class WoVacuumS10 extends WoVacuum {
10
+ }
11
+ //# sourceMappingURL=wo-vacuum-s10.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-s10.js","sourceRoot":"","sources":["../../src/devices/wo-vacuum-s10.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,7 @@
1
+ import { WoVacuum } from './wo-vacuum.js';
2
+ /**
3
+ * Robot Vacuum Cleaner S20
4
+ */
5
+ export declare class WoVacuumS20 extends WoVacuum {
6
+ }
7
+ //# sourceMappingURL=wo-vacuum-s20.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-s20.d.ts","sourceRoot":"","sources":["../../src/devices/wo-vacuum-s20.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,qBAAa,WAAY,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,11 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-vacuum-s20.ts: SwitchBot v4.0.0 - S20 Vacuum Device
4
+ */
5
+ import { WoVacuum } from './wo-vacuum.js';
6
+ /**
7
+ * Robot Vacuum Cleaner S20
8
+ */
9
+ export class WoVacuumS20 extends WoVacuum {
10
+ }
11
+ //# sourceMappingURL=wo-vacuum-s20.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum-s20.js","sourceRoot":"","sources":["../../src/devices/wo-vacuum-s20.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,44 @@
1
+ import type { VacuumCommands, VacuumStatus } from '../types/device.js';
2
+ import { SequenceDevice } from './sequence-device.js';
3
+ /**
4
+ * Vacuum Device
5
+ */
6
+ export declare class WoVacuum extends SequenceDevice implements VacuumCommands {
7
+ /**
8
+ * Start cleaning
9
+ */
10
+ cleanUp(protocolVersion: number): Promise<boolean>;
11
+ /**
12
+ * Return to dock
13
+ */
14
+ returnToDock(protocolVersion: number): Promise<boolean>;
15
+ /**
16
+ * Return advertised battery value
17
+ */
18
+ getBattery(): number | undefined;
19
+ /**
20
+ * Return advertised work status value
21
+ */
22
+ getWorkStatus(): number | undefined;
23
+ /**
24
+ * Return advertised dustbin bound state
25
+ */
26
+ getDustbinBoundStatus(): boolean | undefined;
27
+ /**
28
+ * Return advertised dustbin connected state
29
+ */
30
+ getDustbinConnectedStatus(): boolean | undefined;
31
+ /**
32
+ * Return advertised network connected state
33
+ */
34
+ getNetworkConnectedStatus(): boolean | undefined;
35
+ /**
36
+ * Get device status
37
+ */
38
+ getStatus(): Promise<VacuumStatus>;
39
+ private getCommandForProtocol;
40
+ private getAdvertisementStatusData;
41
+ private asNumber;
42
+ private asBoolean;
43
+ }
44
+ //# sourceMappingURL=wo-vacuum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum.d.ts","sourceRoot":"","sources":["../../src/devices/wo-vacuum.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGtE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD;;GAEG;AACH,qBAAa,QAAS,SAAQ,cAAe,YAAW,cAAc;IACpE;;OAEG;IACG,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMxD;;OAEG;IACG,YAAY,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM7D;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,SAAS;IAKhC;;OAEG;IACH,aAAa,IAAI,MAAM,GAAG,SAAS;IAKnC;;OAEG;IACH,qBAAqB,IAAI,OAAO,GAAG,SAAS;IAK5C;;OAEG;IACH,yBAAyB,IAAI,OAAO,GAAG,SAAS;IAKhD;;OAEG;IACH,yBAAyB,IAAI,OAAO,GAAG,SAAS;IAKhD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAsCxC,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;CAGlB"}
@@ -0,0 +1,117 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * devices/wo-vacuum.ts: SwitchBot v4.0.0 - Vacuum Device
4
+ */
5
+ import { DEVICE_COMMANDS } from '../settings.js';
6
+ import { SequenceDevice } from './sequence-device.js';
7
+ /**
8
+ * Vacuum Device
9
+ */
10
+ export class WoVacuum extends SequenceDevice {
11
+ /**
12
+ * Start cleaning
13
+ */
14
+ async cleanUp(protocolVersion) {
15
+ const command = this.getCommandForProtocol(DEVICE_COMMANDS.VACUUM.CLEAN_UP, protocolVersion);
16
+ const result = await this.sendCommand(command, 'start', { protocolVersion });
17
+ return result.success;
18
+ }
19
+ /**
20
+ * Return to dock
21
+ */
22
+ async returnToDock(protocolVersion) {
23
+ const command = this.getCommandForProtocol(DEVICE_COMMANDS.VACUUM.RETURN_TO_DOCK, protocolVersion);
24
+ const result = await this.sendCommand(command, 'dock', { protocolVersion });
25
+ return result.success;
26
+ }
27
+ /**
28
+ * Return advertised battery value
29
+ */
30
+ getBattery() {
31
+ const data = this.getAdvertisementStatusData();
32
+ return this.asNumber(data.battery);
33
+ }
34
+ /**
35
+ * Return advertised work status value
36
+ */
37
+ getWorkStatus() {
38
+ const data = this.getAdvertisementStatusData();
39
+ return this.asNumber(data.workStatus ?? data.work_status);
40
+ }
41
+ /**
42
+ * Return advertised dustbin bound state
43
+ */
44
+ getDustbinBoundStatus() {
45
+ const data = this.getAdvertisementStatusData();
46
+ return this.asBoolean(data.dustbinBound ?? data.dustbin_bound);
47
+ }
48
+ /**
49
+ * Return advertised dustbin connected state
50
+ */
51
+ getDustbinConnectedStatus() {
52
+ const data = this.getAdvertisementStatusData();
53
+ return this.asBoolean(data.dustbinConnected ?? data.dusbin_connected);
54
+ }
55
+ /**
56
+ * Return advertised network connected state
57
+ */
58
+ getNetworkConnectedStatus() {
59
+ const data = this.getAdvertisementStatusData();
60
+ return this.asBoolean(data.networkConnected ?? data.network_connected);
61
+ }
62
+ /**
63
+ * Get device status
64
+ */
65
+ async getStatus() {
66
+ try {
67
+ if (this.hasAPI()) {
68
+ const apiStatus = await this.getAPIStatus();
69
+ return {
70
+ deviceId: this.info.id,
71
+ connectionType: 'api',
72
+ battery: apiStatus.battery,
73
+ workStatus: apiStatus.workStatus ?? apiStatus.work_status,
74
+ dustbinBound: apiStatus.dustbinBound ?? apiStatus.dustbin_bound,
75
+ dustbinConnected: apiStatus.dustbinConnected ?? apiStatus.dusbin_connected,
76
+ networkConnected: apiStatus.networkConnected ?? apiStatus.network_connected,
77
+ version: apiStatus.version,
78
+ updatedAt: new Date(),
79
+ };
80
+ }
81
+ if (this.hasBLE()) {
82
+ const bleData = await this.getBLEStatus().catch(() => this.normalizeBLEStatusData(undefined));
83
+ return {
84
+ deviceId: this.info.id,
85
+ connectionType: 'ble',
86
+ battery: this.asNumber(bleData.battery),
87
+ workStatus: this.asNumber(bleData.workStatus ?? bleData.work_status),
88
+ dustbinBound: this.asBoolean(bleData.dustbinBound ?? bleData.dustbin_bound),
89
+ dustbinConnected: this.asBoolean(bleData.dustbinConnected ?? bleData.dusbin_connected),
90
+ networkConnected: this.asBoolean(bleData.networkConnected ?? bleData.network_connected),
91
+ updatedAt: new Date(),
92
+ };
93
+ }
94
+ throw new Error('No connection method available');
95
+ }
96
+ catch (error) {
97
+ this.logger.error('Failed to get status', error);
98
+ throw error;
99
+ }
100
+ }
101
+ getCommandForProtocol(commands, protocolVersion) {
102
+ if (protocolVersion !== 1 && protocolVersion !== 2) {
103
+ throw new Error(`Unsupported vacuum protocol version: ${protocolVersion}`);
104
+ }
105
+ return commands[protocolVersion];
106
+ }
107
+ getAdvertisementStatusData() {
108
+ return this.normalizeBLEStatusData(undefined);
109
+ }
110
+ asNumber(value) {
111
+ return typeof value === 'number' ? value : undefined;
112
+ }
113
+ asBoolean(value) {
114
+ return typeof value === 'boolean' ? value : undefined;
115
+ }
116
+ }
117
+ //# sourceMappingURL=wo-vacuum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-vacuum.js","sourceRoot":"","sources":["../../src/devices/wo-vacuum.ts"],"names":[],"mappings":"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"}