node-switchbot 4.0.0-beta.10 → 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 (279) hide show
  1. package/dist/devices/index.d.ts +25 -0
  2. package/dist/devices/index.d.ts.map +1 -1
  3. package/dist/devices/index.js +25 -0
  4. package/dist/devices/index.js.map +1 -1
  5. package/dist/devices/wo-art-frame.d.ts +8 -0
  6. package/dist/devices/wo-art-frame.d.ts.map +1 -0
  7. package/dist/devices/wo-art-frame.js +12 -0
  8. package/dist/devices/wo-art-frame.js.map +1 -0
  9. package/dist/devices/wo-circulator-fan.d.ts +8 -0
  10. package/dist/devices/wo-circulator-fan.d.ts.map +1 -0
  11. package/dist/devices/wo-circulator-fan.js +12 -0
  12. package/dist/devices/wo-circulator-fan.js.map +1 -0
  13. package/dist/devices/wo-climate-panel.d.ts +8 -0
  14. package/dist/devices/wo-climate-panel.d.ts.map +1 -0
  15. package/dist/devices/wo-climate-panel.js +12 -0
  16. package/dist/devices/wo-climate-panel.js.map +1 -0
  17. package/dist/devices/wo-floor-lamp.d.ts +8 -0
  18. package/dist/devices/wo-floor-lamp.d.ts.map +1 -0
  19. package/dist/devices/wo-floor-lamp.js +12 -0
  20. package/dist/devices/wo-floor-lamp.js.map +1 -0
  21. package/dist/devices/wo-garage-door-opener.d.ts +8 -0
  22. package/dist/devices/wo-garage-door-opener.d.ts.map +1 -0
  23. package/dist/devices/wo-garage-door-opener.js +12 -0
  24. package/dist/devices/wo-garage-door-opener.js.map +1 -0
  25. package/dist/devices/wo-hubmini-matter.d.ts +8 -0
  26. package/dist/devices/wo-hubmini-matter.d.ts.map +1 -0
  27. package/dist/devices/wo-hubmini-matter.js +12 -0
  28. package/dist/devices/wo-hubmini-matter.js.map +1 -0
  29. package/dist/devices/wo-humi2.d.ts +12 -0
  30. package/dist/devices/wo-humi2.d.ts.map +1 -1
  31. package/dist/devices/wo-humi2.js +18 -0
  32. package/dist/devices/wo-humi2.js.map +1 -1
  33. package/dist/devices/wo-keypad-vision-pro.d.ts +18 -0
  34. package/dist/devices/wo-keypad-vision-pro.d.ts.map +1 -0
  35. package/dist/devices/wo-keypad-vision-pro.js +15 -0
  36. package/dist/devices/wo-keypad-vision-pro.js.map +1 -0
  37. package/dist/devices/wo-keypad-vision.d.ts +8 -0
  38. package/dist/devices/wo-keypad-vision.d.ts.map +1 -0
  39. package/dist/devices/wo-keypad-vision.js +12 -0
  40. package/dist/devices/wo-keypad-vision.js.map +1 -0
  41. package/dist/devices/wo-lock-lite.d.ts +7 -0
  42. package/dist/devices/wo-lock-lite.d.ts.map +1 -0
  43. package/dist/devices/wo-lock-lite.js +11 -0
  44. package/dist/devices/wo-lock-lite.js.map +1 -0
  45. package/dist/devices/wo-lock-pro-wifi.d.ts +7 -0
  46. package/dist/devices/wo-lock-pro-wifi.d.ts.map +1 -0
  47. package/dist/devices/wo-lock-pro-wifi.js +11 -0
  48. package/dist/devices/wo-lock-pro-wifi.js.map +1 -0
  49. package/dist/devices/wo-lock-vision-pro.d.ts +7 -0
  50. package/dist/devices/wo-lock-vision-pro.d.ts.map +1 -0
  51. package/dist/devices/wo-lock-vision-pro.js +11 -0
  52. package/dist/devices/wo-lock-vision-pro.js.map +1 -0
  53. package/dist/devices/wo-lock-vision.d.ts +7 -0
  54. package/dist/devices/wo-lock-vision.d.ts.map +1 -0
  55. package/dist/devices/wo-lock-vision.js +11 -0
  56. package/dist/devices/wo-lock-vision.js.map +1 -0
  57. package/dist/devices/wo-rgbicww-floor-lamp.d.ts +8 -0
  58. package/dist/devices/wo-rgbicww-floor-lamp.d.ts.map +1 -0
  59. package/dist/devices/wo-rgbicww-floor-lamp.js +12 -0
  60. package/dist/devices/wo-rgbicww-floor-lamp.js.map +1 -0
  61. package/dist/devices/wo-rgbicww-strip-light.d.ts +8 -0
  62. package/dist/devices/wo-rgbicww-strip-light.d.ts.map +1 -0
  63. package/dist/devices/wo-rgbicww-strip-light.js +12 -0
  64. package/dist/devices/wo-rgbicww-strip-light.js.map +1 -0
  65. package/dist/devices/wo-roller-shade.d.ts +8 -0
  66. package/dist/devices/wo-roller-shade.d.ts.map +1 -0
  67. package/dist/devices/wo-roller-shade.js +12 -0
  68. package/dist/devices/wo-roller-shade.js.map +1 -0
  69. package/dist/devices/wo-smart-thermostat-radiator.d.ts +8 -0
  70. package/dist/devices/wo-smart-thermostat-radiator.d.ts.map +1 -0
  71. package/dist/devices/wo-smart-thermostat-radiator.js +12 -0
  72. package/dist/devices/wo-smart-thermostat-radiator.js.map +1 -0
  73. package/dist/devices/wo-strip-light-3.d.ts +8 -0
  74. package/dist/devices/wo-strip-light-3.d.ts.map +1 -0
  75. package/dist/devices/wo-strip-light-3.js +12 -0
  76. package/dist/devices/wo-strip-light-3.js.map +1 -0
  77. package/dist/devices/wo-vacuum-k10-plus.d.ts +7 -0
  78. package/dist/devices/wo-vacuum-k10-plus.d.ts.map +1 -0
  79. package/dist/devices/wo-vacuum-k10-plus.js +11 -0
  80. package/dist/devices/wo-vacuum-k10-plus.js.map +1 -0
  81. package/dist/devices/wo-vacuum-k10-pro-combo.d.ts +7 -0
  82. package/dist/devices/wo-vacuum-k10-pro-combo.d.ts.map +1 -0
  83. package/dist/devices/wo-vacuum-k10-pro-combo.js +11 -0
  84. package/dist/devices/wo-vacuum-k10-pro-combo.js.map +1 -0
  85. package/dist/devices/wo-vacuum-k10-pro.d.ts +7 -0
  86. package/dist/devices/wo-vacuum-k10-pro.d.ts.map +1 -0
  87. package/dist/devices/wo-vacuum-k10-pro.js +11 -0
  88. package/dist/devices/wo-vacuum-k10-pro.js.map +1 -0
  89. package/dist/devices/wo-vacuum-k11-plus.d.ts +7 -0
  90. package/dist/devices/wo-vacuum-k11-plus.d.ts.map +1 -0
  91. package/dist/devices/wo-vacuum-k11-plus.js +11 -0
  92. package/dist/devices/wo-vacuum-k11-plus.js.map +1 -0
  93. package/dist/devices/wo-vacuum-k20.d.ts +7 -0
  94. package/dist/devices/wo-vacuum-k20.d.ts.map +1 -0
  95. package/dist/devices/wo-vacuum-k20.js +11 -0
  96. package/dist/devices/wo-vacuum-k20.js.map +1 -0
  97. package/dist/devices/wo-vacuum-s10.d.ts +7 -0
  98. package/dist/devices/wo-vacuum-s10.d.ts.map +1 -0
  99. package/dist/devices/wo-vacuum-s10.js +11 -0
  100. package/dist/devices/wo-vacuum-s10.js.map +1 -0
  101. package/dist/devices/wo-vacuum-s20.d.ts +7 -0
  102. package/dist/devices/wo-vacuum-s20.d.ts.map +1 -0
  103. package/dist/devices/wo-vacuum-s20.js +11 -0
  104. package/dist/devices/wo-vacuum-s20.js.map +1 -0
  105. package/dist/devices/wo-vacuum.d.ts +44 -0
  106. package/dist/devices/wo-vacuum.d.ts.map +1 -0
  107. package/dist/devices/wo-vacuum.js +117 -0
  108. package/dist/devices/wo-vacuum.js.map +1 -0
  109. package/dist/index.d.ts +2 -2
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +1 -1
  112. package/dist/index.js.map +1 -1
  113. package/dist/settings.d.ts +10 -0
  114. package/dist/settings.d.ts.map +1 -1
  115. package/dist/settings.js +58 -5
  116. package/dist/settings.js.map +1 -1
  117. package/dist/switchbot.d.ts.map +1 -1
  118. package/dist/switchbot.js +55 -1
  119. package/dist/switchbot.js.map +1 -1
  120. package/dist/types/device.d.ts +19 -0
  121. package/dist/types/device.d.ts.map +1 -1
  122. package/docs/assets/hierarchy.js +1 -1
  123. package/docs/assets/navigation.js +1 -1
  124. package/docs/assets/search.js +1 -1
  125. package/docs/classes/APIError.html +2 -2
  126. package/docs/classes/APINotAvailableError.html +2 -2
  127. package/docs/classes/BLEConnection.html +9 -9
  128. package/docs/classes/BLENotAvailableError.html +2 -2
  129. package/docs/classes/BLEScanner.html +9 -9
  130. package/docs/classes/CommandFailedError.html +2 -2
  131. package/docs/classes/ConnectionTimeoutError.html +2 -2
  132. package/docs/classes/DeviceManager.html +13 -13
  133. package/docs/classes/DeviceNotFoundError.html +2 -2
  134. package/docs/classes/DeviceOverrideStateDuringConnection.html +28 -28
  135. package/docs/classes/DiscoveryError.html +2 -2
  136. package/docs/classes/OpenAPIClient.html +24 -24
  137. package/docs/classes/SequenceDevice.html +29 -29
  138. package/docs/classes/SwitchBot.html +11 -11
  139. package/docs/classes/SwitchBotDevice.html +28 -28
  140. package/docs/classes/SwitchBotError.html +2 -2
  141. package/docs/classes/ValidationError.html +2 -2
  142. package/docs/classes/WoAirPurifier.html +33 -33
  143. package/docs/classes/WoAirPurifierTable.html +33 -33
  144. package/docs/classes/WoArtFrame.html +71 -0
  145. package/docs/classes/WoBlindTilt.html +34 -34
  146. package/docs/classes/WoBulb.html +35 -35
  147. package/docs/classes/WoCeilingLight.html +35 -35
  148. package/docs/classes/WoCirculatorFan.html +66 -0
  149. package/docs/classes/WoClimatePanel.html +66 -0
  150. package/docs/classes/WoContact.html +28 -28
  151. package/docs/classes/WoCurtain.html +32 -32
  152. package/docs/classes/WoFloorLamp.html +71 -0
  153. package/docs/classes/WoGarageDoorOpener.html +64 -0
  154. package/docs/classes/WoHand.html +38 -38
  155. package/docs/classes/WoHub2.html +28 -28
  156. package/docs/classes/WoHub3.html +28 -28
  157. package/docs/classes/WoHubMiniMatter.html +56 -0
  158. package/docs/classes/WoHumi.html +32 -32
  159. package/docs/classes/WoHumi2.html +38 -32
  160. package/docs/classes/WoIOSensorTH.html +28 -28
  161. package/docs/classes/WoKeypad.html +28 -28
  162. package/docs/classes/WoKeypadVision.html +56 -0
  163. package/docs/classes/WoKeypadVisionPro.html +56 -0
  164. package/docs/classes/WoLeak.html +28 -28
  165. package/docs/classes/WoPlugMiniJP.html +31 -31
  166. package/docs/classes/WoPlugMiniUS.html +31 -31
  167. package/docs/classes/WoPresence.html +28 -28
  168. package/docs/classes/WoRGBICBulb.html +82 -0
  169. package/docs/classes/WoRGBICWWFloorLamp.html +82 -0
  170. package/docs/classes/WoRGBICWWStripLight.html +82 -0
  171. package/docs/classes/WoRelaySwitch1.html +32 -32
  172. package/docs/classes/WoRelaySwitch1PM.html +32 -32
  173. package/docs/classes/WoRelaySwitch2PM.html +68 -0
  174. package/docs/classes/WoRemote.html +28 -28
  175. package/docs/classes/WoRollerShade.html +64 -0
  176. package/docs/classes/WoSensorTH.html +28 -28
  177. package/docs/classes/WoSensorTHPlus.html +28 -28
  178. package/docs/classes/WoSensorTHPro.html +28 -28
  179. package/docs/classes/WoSensorTHProCO2.html +28 -28
  180. package/docs/classes/WoSmartLock.html +31 -31
  181. package/docs/classes/WoSmartLockLite.html +64 -0
  182. package/docs/classes/WoSmartLockPro.html +33 -33
  183. package/docs/classes/WoSmartLockProWiFi.html +68 -0
  184. package/docs/classes/WoSmartLockVision.html +64 -0
  185. package/docs/classes/WoSmartLockVisionPro.html +68 -0
  186. package/docs/classes/WoSmartThermostatRadiator.html +66 -0
  187. package/docs/classes/WoStrip.html +35 -35
  188. package/docs/classes/WoStripLight3.html +71 -0
  189. package/docs/classes/WoVacuum.html +71 -0
  190. package/docs/classes/WoVacuumK10Plus.html +71 -0
  191. package/docs/classes/WoVacuumK10Pro.html +71 -0
  192. package/docs/classes/WoVacuumK10ProCombo.html +71 -0
  193. package/docs/classes/WoVacuumK11Plus.html +71 -0
  194. package/docs/classes/WoVacuumK20.html +71 -0
  195. package/docs/classes/WoVacuumS10.html +71 -0
  196. package/docs/classes/WoVacuumS20.html +71 -0
  197. package/docs/enums/LogLevel.html +2 -2
  198. package/docs/enums/SwitchBotBLEModel.html +2 -2
  199. package/docs/enums/SwitchBotBLEModelName.html +2 -2
  200. package/docs/functions/updateBaseURL.html +1 -1
  201. package/docs/hierarchy.html +1 -1
  202. package/docs/interfaces/APICommandRequest.html +2 -2
  203. package/docs/interfaces/APICommandResponse.html +2 -2
  204. package/docs/interfaces/APIDevice.html +2 -2
  205. package/docs/interfaces/APIDeviceStatus.html +2 -2
  206. package/docs/interfaces/APIErrorResponse.html +2 -2
  207. package/docs/interfaces/APIResponse.html +2 -2
  208. package/docs/interfaces/AirPurifierCommands.html +2 -2
  209. package/docs/interfaces/AirPurifierServiceData.html +14 -14
  210. package/docs/interfaces/AirPurifierStatus.html +7 -7
  211. package/docs/interfaces/BLEAdvertisement.html +2 -2
  212. package/docs/interfaces/BLEScanOptions.html +5 -5
  213. package/docs/interfaces/BLEServiceData.html +14 -14
  214. package/docs/interfaces/BlindTiltCommands.html +2 -2
  215. package/docs/interfaces/BlindTiltServiceData.html +14 -14
  216. package/docs/interfaces/BlindTiltStatus.html +6 -6
  217. package/docs/interfaces/BotCommands.html +2 -2
  218. package/docs/interfaces/BotServiceData.html +14 -14
  219. package/docs/interfaces/BotStatus.html +6 -6
  220. package/docs/interfaces/BulbCommands.html +2 -2
  221. package/docs/interfaces/BulbServiceData.html +14 -14
  222. package/docs/interfaces/BulbStatus.html +6 -6
  223. package/docs/interfaces/CeilingLightCommands.html +2 -2
  224. package/docs/interfaces/CeilingLightServiceData.html +14 -14
  225. package/docs/interfaces/CeilingLightStatus.html +6 -6
  226. package/docs/interfaces/CommandResult.html +6 -6
  227. package/docs/interfaces/ContactServiceData.html +14 -14
  228. package/docs/interfaces/ContactStatus.html +6 -6
  229. package/docs/interfaces/CurtainCommands.html +2 -2
  230. package/docs/interfaces/CurtainServiceData.html +14 -14
  231. package/docs/interfaces/CurtainStatus.html +6 -6
  232. package/docs/interfaces/DeviceInfo.html +18 -18
  233. package/docs/interfaces/DeviceListResponse.html +2 -2
  234. package/docs/interfaces/DeviceStatus.html +6 -6
  235. package/docs/interfaces/DiscoveryOptions.html +7 -7
  236. package/docs/interfaces/HubServiceData.html +14 -14
  237. package/docs/interfaces/HubStatus.html +6 -6
  238. package/docs/interfaces/HumidifierCommands.html +2 -2
  239. package/docs/interfaces/HumidifierServiceData.html +15 -15
  240. package/docs/interfaces/HumidifierStatus.html +6 -6
  241. package/docs/interfaces/KeypadStatus.html +6 -6
  242. package/docs/interfaces/LeakServiceData.html +14 -14
  243. package/docs/interfaces/LeakStatus.html +6 -6
  244. package/docs/interfaces/LockCommands.html +2 -2
  245. package/docs/interfaces/LockServiceData.html +15 -15
  246. package/docs/interfaces/LockStatus.html +6 -6
  247. package/docs/interfaces/MeterServiceData.html +14 -14
  248. package/docs/interfaces/MeterStatus.html +6 -6
  249. package/docs/interfaces/MotionServiceData.html +14 -14
  250. package/docs/interfaces/MotionStatus.html +6 -6
  251. package/docs/interfaces/PlugCommands.html +2 -2
  252. package/docs/interfaces/PlugServiceData.html +14 -14
  253. package/docs/interfaces/PlugStatus.html +6 -6
  254. package/docs/interfaces/PresenceServiceData.html +14 -14
  255. package/docs/interfaces/PresenceStatus.html +6 -6
  256. package/docs/interfaces/RelaySwitchCommands.html +2 -2
  257. package/docs/interfaces/RelaySwitchServiceData.html +14 -14
  258. package/docs/interfaces/RelaySwitchStatus.html +6 -6
  259. package/docs/interfaces/RemoteStatus.html +6 -6
  260. package/docs/interfaces/SceneListResponse.html +2 -2
  261. package/docs/interfaces/StripCommands.html +2 -2
  262. package/docs/interfaces/StripServiceData.html +14 -14
  263. package/docs/interfaces/StripStatus.html +6 -6
  264. package/docs/interfaces/SwitchBotConfig.html +15 -15
  265. package/docs/interfaces/VacuumCommands.html +8 -0
  266. package/docs/interfaces/VacuumStatus.html +16 -0
  267. package/docs/interfaces/WebhookConfig.html +2 -2
  268. package/docs/interfaces/WebhookDetails.html +2 -2
  269. package/docs/interfaces/WebhookQueryResponse.html +2 -2
  270. package/docs/interfaces/WebhookSetupResponse.html +2 -2
  271. package/docs/modules.html +1 -1
  272. package/docs/types/ConnectionType.html +1 -1
  273. package/docs/types/PhysicalDeviceType.html +1 -1
  274. package/docs/types/VirtualDeviceType.html +1 -1
  275. package/docs/variables/urls.html +1 -1
  276. package/package.json +3 -3
  277. package/todo/PYSWITCHBOT_COMPARISON.md +52 -52
  278. package/todo/completed.md +175 -0
  279. package/todo/todo.md +38 -32
@@ -1,2 +1,2 @@
1
1
  <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ConnectionType | node-switchbot</title><meta name="description" content="Documentation for node-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">node-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">ConnectionType</a></li></ul><h1>Type Alias ConnectionType</h1></div><div class="tsd-signature"><span class="tsd-kind-type-alias">ConnectionType</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">&quot;ble&quot;</span> <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;api&quot;</span> <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;hybrid&quot;</span></div><div class="tsd-comment tsd-typography"><p>Device connection type</p>
2
- </div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/node-switchbot/blob/f0fb8fac5d7a6465aa342a4935a60bf9d616d041/src/types/index.ts#L20">types/index.ts:20</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">node-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
2
+ </div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/node-switchbot/blob/4d519c7abbc4fb4e44f9ae1b58c53b18a14df244/src/types/index.ts#L20">types/index.ts:20</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">node-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
@@ -1,2 +1,2 @@
1
1
  <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>PhysicalDeviceType | node-switchbot</title><meta name="description" content="Documentation for node-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">node-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">PhysicalDeviceType</a></li></ul><h1>Type Alias PhysicalDeviceType</h1></div><div class="tsd-signature"><span class="tsd-kind-type-alias">PhysicalDeviceType</span><span class="tsd-signature-symbol">:</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Bot&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Curtain&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Curtain3&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Plug&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Plug Mini (US)&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Plug Mini (JP)&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Meter&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Meter Plus&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Meter Pro&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Meter Pro (CO2)&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Outdoor Meter&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Lock&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Lock Pro&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Keypad&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Keypad Touch&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Motion Sensor&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Contact Sensor&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Ceiling Light&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Ceiling Light Pro&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Strip Light&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Color Bulb&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Robot Vacuum Cleaner S1&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Robot Vacuum Cleaner S1 Plus&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Robot Vacuum Cleaner K10 Plus&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Humidifier&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Humidifier 2&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Blind Tilt&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Hub 2&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Hub Mini&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Hub Plus&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Remote&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Battery Circulator Fan&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Air Purifier&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Air Purifier Table&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Water Leak Detector&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Presence Sensor&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Relay Switch 1PM&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Relay Switch 1&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;K10+ Pro Combo&quot;</span></div><div class="tsd-comment tsd-typography"><p>Physical device types supported by OpenAPI</p>
2
- </div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/node-switchbot/blob/f0fb8fac5d7a6465aa342a4935a60bf9d616d041/src/types/api.ts#L213">types/api.ts:213</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">node-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
2
+ </div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/node-switchbot/blob/4d519c7abbc4fb4e44f9ae1b58c53b18a14df244/src/types/api.ts#L213">types/api.ts:213</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">node-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
@@ -1,2 +1,2 @@
1
1
  <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>VirtualDeviceType | node-switchbot</title><meta name="description" content="Documentation for node-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">node-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">VirtualDeviceType</a></li></ul><h1>Type Alias VirtualDeviceType</h1></div><div class="tsd-signature"><span class="tsd-kind-type-alias">VirtualDeviceType</span><span class="tsd-signature-symbol">:</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Air Conditioner&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;TV&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Light&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;IPTV/Streamer&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Set Top Box&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;DVD&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Fan&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Projector&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Camera&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Air Purifier&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Speaker&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Water Heater&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Vacuum Cleaner&quot;</span><br/>    <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">&quot;Others&quot;</span></div><div class="tsd-comment tsd-typography"><p>Virtual/Infrared device types</p>
2
- </div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/node-switchbot/blob/f0fb8fac5d7a6465aa342a4935a60bf9d616d041/src/types/api.ts#L257">types/api.ts:257</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">node-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
2
+ </div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/node-switchbot/blob/4d519c7abbc4fb4e44f9ae1b58c53b18a14df244/src/types/api.ts#L257">types/api.ts:257</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">node-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>urls | node-switchbot</title><meta name="description" content="Documentation for node-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">node-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">urls</a></li></ul><h1>Variable urls<code class="tsd-tag">Const</code></h1></div><div class="tsd-signature"><span class="tsd-kind-variable">urls</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{</span> <span class="tsd-kind-property">base</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span> <span class="tsd-kind-property">devices</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span> <span class="tsd-kind-property">scenes</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span> <span class="tsd-kind-property">webhook</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span> <span class="tsd-signature-symbol">}</span><span class="tsd-signature-symbol"> = ...</span></div><div class="tsd-type-declaration"><h4>Type Declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5 id="base"><span class="tsd-kind-property">base</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li><li class="tsd-parameter"><h5 id="devices"><span class="tsd-kind-property">devices</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li><li class="tsd-parameter"><h5 id="scenes"><span class="tsd-kind-property">scenes</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li><li class="tsd-parameter"><h5 id="webhook"><span class="tsd-kind-property">webhook</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li></ul></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/node-switchbot/blob/f0fb8fac5d7a6465aa342a4935a60bf9d616d041/src/settings.ts#L14">settings.ts:14</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">node-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
1
+ <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>urls | node-switchbot</title><meta name="description" content="Documentation for node-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">node-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">urls</a></li></ul><h1>Variable urls<code class="tsd-tag">Const</code></h1></div><div class="tsd-signature"><span class="tsd-kind-variable">urls</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{</span> <span class="tsd-kind-property">base</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span> <span class="tsd-kind-property">devices</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span> <span class="tsd-kind-property">scenes</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span> <span class="tsd-kind-property">webhook</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span> <span class="tsd-signature-symbol">}</span><span class="tsd-signature-symbol"> = ...</span></div><div class="tsd-type-declaration"><h4>Type Declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5 id="base"><span class="tsd-kind-property">base</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li><li class="tsd-parameter"><h5 id="devices"><span class="tsd-kind-property">devices</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li><li class="tsd-parameter"><h5 id="scenes"><span class="tsd-kind-property">scenes</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li><li class="tsd-parameter"><h5 id="webhook"><span class="tsd-kind-property">webhook</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li></ul></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/node-switchbot/blob/4d519c7abbc4fb4e44f9ae1b58c53b18a14df244/src/settings.ts#L14">settings.ts:14</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">node-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "node-switchbot",
3
3
  "type": "module",
4
- "version": "4.0.0-beta.10",
4
+ "version": "4.0.0-beta.11",
5
5
  "description": "The node-switchbot is a Node.js module which allows you to control your Switchbot Devices through Bluetooth (BLE) with automatic OpenAPI fallback.",
6
6
  "author": "OpenWonderLabs (https://github.com/OpenWonderLabs)",
7
7
  "license": "MIT",
@@ -36,7 +36,8 @@
36
36
  },
37
37
  "scripts": {
38
38
  "check": "npm install && npm outdated",
39
- "lint": "eslint src/**/*.ts test/**/*.ts",
39
+ "type-check": "tsc --noEmit",
40
+ "lint": "eslint src/**/*.ts test/**/*.ts && npm run type-check",
40
41
  "lint:fix": "eslint src/**/*.ts test/**/*.ts --fix",
41
42
  "lint:src": "eslint src/**/*.ts",
42
43
  "lint:test": "eslint test/**/*.ts",
@@ -48,7 +49,6 @@
48
49
  "test": "vitest run",
49
50
  "test:watch": "vitest watch",
50
51
  "test-coverage": "npm run test -- --coverage",
51
- "type-check": "tsc --noEmit",
52
52
  "ble:scan": "node tmp-switchbot-scan.mjs",
53
53
  "docs": "typedoc",
54
54
  "lint-docs": "typedoc --emit none --treatWarningsAsErrors"
@@ -44,16 +44,16 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
44
44
  ### Bot (WoHand) Commands
45
45
 
46
46
  #### High Priority
47
- - [ ] **Task 2.1**: Add `setMode(mode: 'switch' | 'press')` command
47
+ - [x] **Task 2.1**: Add `setMode(mode: 'switch' | 'press')` command
48
48
  - Switch mode: Toggle on/off
49
49
  - Press mode: Momentary press
50
50
  - Command: `0x57 0x0F 0x47 0x01 MODE` (MODE: 0x00=press, 0x01=switch)
51
51
 
52
- - [ ] **Task 2.2**: Add `setLongPress(duration: number)` command
52
+ - [x] **Task 2.2**: Add `setLongPress(duration: number)` command
53
53
  - Configure press duration (1-255 deciseconds)
54
54
  - Command: `0x57 0x0F 0x47 0x03 DURATION`
55
55
 
56
- - [ ] **Task 2.3**: Add direct arm control
56
+ - [x] **Task 2.3**: Add direct arm control
57
57
  - `handUp()` - Raise arm
58
58
  - `handDown()` - Lower arm
59
59
  - More precise than toggle
@@ -61,7 +61,7 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
61
61
  ### Curtain Commands
62
62
 
63
63
  #### High Priority
64
- - [ ] **Task 3.1**: Add speed parameter to movement commands
64
+ - [x] **Task 3.1**: Add speed parameter to movement commands
65
65
  - `open(speed?: number)` - Speed 1-255 (default: 255)
66
66
  - `close(speed?: number)` - Speed 1-255
67
67
  - `setPosition(position: number, speed?: number)` - Position with speed
@@ -81,23 +81,23 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
81
81
  ### Lock Commands
82
82
 
83
83
  #### High Priority
84
- - [ ] **Task 4.1**: Add `unlockWithoutUnlatch()` command
84
+ - [x] **Task 4.1**: Add `unlockWithoutUnlatch()` command
85
85
  - EU firmware feature
86
86
  - Unlocks without unlatching door
87
87
  - Command: Different from standard unlock
88
88
 
89
- - [ ] **Task 4.2**: Implement notification handling
89
+ - [x] **Task 4.2**: Implement notification handling
90
90
  - Subscribe to lock notifications
91
91
  - Real-time status updates
92
92
  - Handle unsolicited notifications
93
93
 
94
- - [ ] **Task 4.3**: Add smart lock state detection
94
+ - [x] **Task 4.3**: Add smart lock state detection
95
95
  - Check current state before sending command
96
96
  - Avoid unnecessary unlock/lock commands
97
97
  - Return early if already in target state
98
98
 
99
99
  #### Medium Priority
100
- - [ ] **Task 4.4**: Add `getLockInfo()` command
100
+ - [x] **Task 4.4**: Add `getLockInfo()` command
101
101
  - Get detailed lock configuration
102
102
  - Battery, firmware, settings
103
103
  - Command: `0x57 0x02`
@@ -105,16 +105,16 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
105
105
  ### Relay Switch (1PM/2PM) Commands
106
106
 
107
107
  #### High Priority
108
- - [ ] **Task 5.1**: Add `toggle()` command
108
+ - [x] **Task 5.1**: Add `toggle()` command
109
109
  - Toggle current state
110
110
  - Command: `0x57 0x0F 0x50 0x01 0x01 0x02`
111
111
 
112
- - [ ] **Task 5.2**: Implement power monitoring
112
+ - [x] **Task 5.2**: Implement power monitoring
113
113
  - `getBasicInfo()` - Returns voltage, current, power, energy
114
114
  - Parse response: 11 bytes with power data at specific offsets
115
115
  - Command: `0x57 0x02`
116
116
 
117
- - [ ] **Task 5.3**: Add channel-specific control (2PM model)
117
+ - [x] **Task 5.3**: Add channel-specific control (2PM model)
118
118
  - `setChannel1(state: boolean)`
119
119
  - `setChannel2(state: boolean)`
120
120
  - Detect 2PM vs 1PM model
@@ -132,19 +132,19 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
132
132
  ### Light (Bulb/Strip) Commands
133
133
 
134
134
  #### High Priority
135
- - [ ] **Task 6.1**: Add effect presets (20+ effects)
135
+ - [x] **Task 6.1**: Add effect presets (20+ effects)
136
136
  - Christmas, Halloween, Sunset, Rainbow, etc.
137
137
  - Command: `0x57 0x0F 0x47 0x01 EFFECT_ID 0xFF SPEED 0x00 0x00 0x00`
138
138
  - Effect IDs: 0x00-0x13 (20 effects)
139
139
  - Speed: 0x01 (slow) to 0x64 (fast)
140
140
 
141
- - [ ] **Task 6.2**: Add RGBIC segmented control
141
+ - [x] **Task 6.2**: Add RGBIC segmented control
142
142
  - Control individual LED segments
143
143
  - RGBIC-specific effects
144
144
  - Multi-zone color control
145
145
 
146
146
  #### Medium Priority
147
- - [ ] **Task 6.3**: Add color temperature with min/max
147
+ - [x] **Task 6.3**: Add color temperature with min/max
148
148
  - `setColorTemp(minTemp: number, maxTemp: number, temp: number)`
149
149
  - Command: `0x57 0x0F 0x47 0x01 0x17 BRIGHTNESS MIN_KEL MAX_KEL TEMP`
150
150
 
@@ -181,17 +181,17 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
181
181
  ### Vacuum Commands
182
182
 
183
183
  #### High Priority
184
- - [ ] **Task 9.1**: Implement vacuum device classes
184
+ - [x] **Task 9.1**: Implement vacuum device classes
185
185
  - K10+, K10+ Pro, K10+ Pro Combo
186
186
  - K11+, K20
187
187
  - S10, S20
188
188
 
189
- - [ ] **Task 9.2**: Add basic vacuum commands
189
+ - [x] **Task 9.2**: Add basic vacuum commands
190
190
  - `cleanUp(protocolVersion: number)` - Start cleaning
191
191
  - `returnToDock(protocolVersion: number)` - Return to base
192
192
  - Support protocol versions 1 and 2
193
193
 
194
- - [ ] **Task 9.3**: Add vacuum status getters
194
+ - [x] **Task 9.3**: Add vacuum status getters
195
195
  - Battery level
196
196
  - Work status (cleaning, returning, docked, etc.)
197
197
  - Dustbin status
@@ -202,12 +202,12 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
202
202
  ### Advertisement-Based Status (No Connection Required)
203
203
 
204
204
  #### High Priority
205
- - [ ] **Task 10.1**: Implement passive status from advertisements
205
+ - [x] **Task 10.1**: Implement passive status from advertisements
206
206
  - Parse device state from BLE advertisements
207
207
  - No connection needed for basic status
208
208
  - Cache last known state
209
209
 
210
- - [ ] **Task 10.2**: Add sequence number tracking
210
+ - [x] **Task 10.2**: Add sequence number tracking
211
211
  - Monitor `sequence_number` in advertisements
212
212
  - Auto-trigger status update when sequence changes
213
213
  - Implement for: locks, relay switches, vacuums, air purifiers
@@ -231,7 +231,7 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
231
231
  - Validate specific byte positions
232
232
  - Compare against expected value sets: `{1}`, `{1, 5}`, `{1, 6}`
233
233
 
234
- - [ ] **Task 11.2**: Implement password detection
234
+ - [x] **Task 11.2**: Implement password detection
235
235
  - Check for `0x07` (password required)
236
236
  - Check for `0x09` (password incorrect)
237
237
  - Throw specific authentication errors
@@ -241,46 +241,46 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
241
241
  ### High Priority Devices
242
242
 
243
243
  #### Vacuum Cleaners
244
- - [ ] **Task 12.1**: K10+ Vacuum
245
- - [ ] **Task 12.2**: K10+ Pro Vacuum
246
- - [ ] **Task 12.3**: K10+ Pro Combo Vacuum
247
- - [ ] **Task 12.4**: K11+ Vacuum
248
- - [ ] **Task 12.5**: K20 Vacuum
249
- - [ ] **Task 12.6**: S10 Vacuum
250
- - [ ] **Task 12.7**: S20 Vacuum
244
+ - [x] **Task 12.1**: K10+ Vacuum
245
+ - [x] **Task 12.2**: K10+ Pro Vacuum
246
+ - [x] **Task 12.3**: K10+ Pro Combo Vacuum
247
+ - [x] **Task 12.4**: K11+ Vacuum
248
+ - [x] **Task 12.5**: K20 Vacuum
249
+ - [x] **Task 12.6**: S10 Vacuum
250
+ - [x] **Task 12.7**: S20 Vacuum
251
251
 
252
252
  #### Lock Variants
253
- - [ ] **Task 13.1**: Lock Lite
254
- - [ ] **Task 13.2**: Lock Vision
255
- - [ ] **Task 13.3**: Lock Vision Pro
256
- - [ ] **Task 13.4**: Lock Pro WiFi
253
+ - [x] **Task 13.1**: Lock Lite
254
+ - [x] **Task 13.2**: Lock Vision
255
+ - [x] **Task 13.3**: Lock Vision Pro
256
+ - [x] **Task 13.4**: Lock Pro WiFi
257
257
 
258
258
  #### Relay Switches
259
- - [ ] **Task 14.1**: Relay Switch 2PM
260
- - [ ] **Task 14.2**: Garage Door Opener (relay variant)
259
+ - [x] **Task 14.1**: Relay Switch 2PM
260
+ - [x] **Task 14.2**: Garage Door Opener (relay variant)
261
261
 
262
262
  ### Medium Priority Devices
263
263
 
264
264
  #### Climate Control
265
- - [ ] **Task 15.1**: Evaporative Humidifier (WoHumi2) - Already exists, enhance
266
- - [ ] **Task 15.2**: Circulator Fan (Battery/USB)
267
- - [ ] **Task 15.3**: Smart Thermostat Radiator
268
- - [ ] **Task 15.4**: Climate Panel
265
+ - [x] **Task 15.1**: Evaporative Humidifier (WoHumi2) - Already exists, enhance
266
+ - [x] **Task 15.2**: Circulator Fan (Battery/USB)
267
+ - [x] **Task 15.3**: Smart Thermostat Radiator
268
+ - [x] **Task 15.4**: Climate Panel
269
269
 
270
270
  #### Lighting
271
- - [ ] **Task 16.1**: Strip Light 3
272
- - [ ] **Task 16.2**: Floor Lamp
273
- - [ ] **Task 16.3**: RGBICWW Strip Light
274
- - [ ] **Task 16.4**: RGBICWW Floor Lamp
275
- - [ ] **Task 16.5**: Art Frame
271
+ - [x] **Task 16.1**: Strip Light 3
272
+ - [x] **Task 16.2**: Floor Lamp
273
+ - [x] **Task 16.3**: RGBICWW Strip Light
274
+ - [x] **Task 16.4**: RGBICWW Floor Lamp
275
+ - [x] **Task 16.5**: Art Frame
276
276
 
277
277
  #### Other
278
- - [ ] **Task 17.1**: Plug Mini EU - Already exists, verify
279
- - [ ] **Task 17.2**: Roller Shade
280
- - [ ] **Task 17.3**: Keypad Vision
281
- - [ ] **Task 17.4**: Keypad Vision Pro
282
- - [ ] **Task 17.5**: Hub3 - Already exists, enhance
283
- - [ ] **Task 17.6**: HubMini Matter
278
+ - [x] **Task 17.1**: Plug Mini EU - Already exists, verify
279
+ - [x] **Task 17.2**: Roller Shade
280
+ - [x] **Task 17.3**: Keypad Vision
281
+ - [x] **Task 17.4**: Keypad Vision Pro
282
+ - [x] **Task 17.5**: Hub3 - Already exists, enhance
283
+ - [x] **Task 17.6**: HubMini Matter
284
284
 
285
285
  **Total New Devices:** ~30+ device types/variants to add or enhance
286
286
 
@@ -363,12 +363,12 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
363
363
 
364
364
  ### High Priority
365
365
 
366
- - [ ] **Task 20.1**: Implement persistent connection with timer
366
+ - [x] **Task 20.1**: Implement persistent connection with timer
367
367
  - Keep connection open for 8.5 seconds after last command
368
368
  - Reset timer on each command
369
369
  - Allows command batching without reconnecting
370
370
 
371
- - [ ] **Task 20.2**: Add operation lock
371
+ - [x] **Task 20.2**: Add operation lock
372
372
  - Prevent concurrent BLE operations
373
373
  - `_operation_lock` async lock
374
374
  - Wait for operations to complete before disconnecting
@@ -399,13 +399,13 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
399
399
 
400
400
  ### High Priority
401
401
 
402
- - [ ] **Task 21.1**: Implement sequence device pattern
402
+ - [x] **Task 21.1**: Implement sequence device pattern
403
403
  - `SequenceDevice` base class
404
404
  - Monitor `sequence_number` from advertisements
405
405
  - Auto-trigger `update()` when sequence changes
406
406
  - Use for: locks, relay switches, vacuums, air purifiers
407
407
 
408
- - [ ] **Task 21.2**: Add override state during connection pattern
408
+ - [x] **Task 21.2**: Add override state during connection pattern
409
409
  - `DeviceOverrideStateDuringConnection` base class
410
410
  - Ignore advertisement data while connected
411
411
  - Prevents stale data issues
package/todo/completed.md CHANGED
@@ -6,6 +6,48 @@ Last Updated: March 7, 2026
6
6
 
7
7
  ---
8
8
 
9
+ ## Phase 3: New Devices - Other Devices Block (March 7, 2026)
10
+
11
+ ### Task 17.6: HubMini Matter ✅
12
+ **Implementation Details:**
13
+ - Created `WoHubMiniMatter` class extending `WoHub2` in `src/devices/wo-hubmini-matter.ts`
14
+ - Inherits all hub functionality: `getStatus()` returning sensor data (temperature, humidity, lightLevel)
15
+ - Wired through 3-layer export chain (device → devices/index.ts → src/index.ts)
16
+ - Added to runtime registry: `DEVICE_CLASSES['WoHubMiniMatter']` in `src/switchbot.ts`
17
+ - Added device-type mappings in `src/settings.ts`: "HubMini Matter", "SwitchBot HubMini Matter"
18
+ - Created `test/hubmini-matter.test.ts` with 3 tests validating device-type mappings and method inheritance from WoHub2
19
+ - Full validation passed: build ✅ tests ✅ (233 passing) lint ✅ type-check ✅
20
+
21
+ ### Task 17.5: Hub3 Enhancement ✅
22
+ **Implementation Details:**
23
+ - Enhanced existing `WoHub3` class (extends `WoHub2` in `src/devices/wo-hub3.ts`)
24
+ - Added device-type alias in `src/settings.ts`: "SwitchBot Hub 3" (in addition to existing "Hub 3")
25
+ - Created `test/hub3.test.ts` with 3 tests validating device-type mappings and method inheritance from WoHub2
26
+ - Verified inheritance: `getStatus()` method returns hub sensor data (temperature, humidity, lightLevel)
27
+ - Full validation passed: build ✅ tests ✅ (230 passing) lint ✅ type-check ✅
28
+
29
+ ### Task 17.4: Keypad Vision Pro ✅
30
+ **Implementation Details:**
31
+ - Created `WoKeypadVisionPro` class extending `WoKeypad` in `src/devices/wo-keypad-vision-pro.ts`
32
+ - Inherits all keypad functionality: `getStatus()` methods
33
+ - Wired through 3-layer export chain (device → devices/index.ts → src/index.ts)
34
+ - Added to runtime registry: `DEVICE_CLASSES['WoKeypadVisionPro']` in `src/switchbot.ts`
35
+ - Added device-type mappings in `src/settings.ts`: "Keypad Vision Pro", "SwitchBot Keypad Vision Pro"
36
+ - Created `test/keypad-vision-pro.test.ts` with 3 tests validating device-type mapping and method inheritance
37
+ - Full validation passed: build ✅ tests ✅ (227 passing) lint ✅ type-check ✅
38
+
39
+ ### Task 17.3: Keypad Vision ✅
40
+ **Implementation Details:**
41
+ - Created `WoKeypadVision` class extending `WoKeypad` in `src/devices/wo-keypad-vision.ts`
42
+ - Inherits all keypad functionality: `getStatus()` methods
43
+ - Wired through 3-layer export chain (device → devices/index.ts → src/index.ts)
44
+ - Added to runtime registry: `DEVICE_CLASSES['WoKeypadVision']` in `src/switchbot.ts`
45
+ - Added device-type mappings in `src/settings.ts`: "Keypad Vision", "SwitchBot Keypad Vision"
46
+ - Created `test/keypad-vision.test.ts` with 3 tests validating device-type mapping and method inheritance
47
+ - Full validation passed: build ✅ tests ✅ (224 passing) lint ✅ type-check ✅
48
+
49
+ ---
50
+
9
51
  ## Phase 0: Foundation & Preparation ✅
10
52
 
11
53
  ### BLE Infrastructure Hardening (Completed March 6, 2026)
@@ -123,6 +165,139 @@ Last Updated: March 7, 2026
123
165
 
124
166
  ---
125
167
 
168
+ ## Phase 3: New Device Types (Vacuum Variants) ✅
169
+
170
+ ### Completed March 7, 2026
171
+ - [x] K10+ / K10+ Pro / K10+ Pro Combo vacuum variants (Tasks 12.1-12.3)
172
+ - Added `WoVacuumK10Plus`, `WoVacuumK10Pro`, and `WoVacuumK10ProCombo` classes
173
+ - Reused shared `WoVacuum` command/status behavior to avoid duplication
174
+ - Wired `DEVICE_CLASS_MAP` routing for K10 family API/BLE names
175
+
176
+ - [x] K11+ / K20 / S10 / S20 vacuum variants (Tasks 12.4-12.7)
177
+ - Added `WoVacuumK11Plus`, `WoVacuumK20`, `WoVacuumS10`, and `WoVacuumS20` classes
178
+ - Updated `SwitchBot` runtime device registry and package exports
179
+ - Added regression coverage in `test/vacuum-variants.test.ts` for class mapping
180
+
181
+ - [x] Lock Lite / Lock Vision variants (Tasks 13.1-13.2)
182
+ - Added `WoSmartLockLite` and `WoSmartLockVision` classes extending `WoSmartLock`
183
+ - Both variants use base lock functionality without unlatch support
184
+ - Wired `DEVICE_CLASS_MAP` routing for lock variant API/BLE names
185
+
186
+ - [x] Lock Vision Pro / Lock Pro WiFi variants (Tasks 13.3-13.4)
187
+ - Added `WoSmartLockVisionPro` and `WoSmartLockProWiFi` classes extending `WoSmartLockPro`
188
+ - Both variants inherit pro lock features including unlatch support
189
+ - Updated `SwitchBot` runtime device registry and package exports
190
+ - Added regression coverage in `test/lock-variants.test.ts` for class mapping and method inheritance
191
+
192
+ ---
193
+
194
+ ## Phase 3: New Device Types (Relay Variants) ✅
195
+
196
+ ### Completed March 7, 2026
197
+ - [x] Relay Switch 2PM wiring completion (Task 14.1)
198
+ - WoRelaySwitch2PM class already existed from Phase 2
199
+ - Completed wiring through src/index.ts exports
200
+ - Added to src/switchbot.ts DEVICE_CLASSES registry
201
+ - Added 'Relay Switch 2PM' mapping to DEVICE_CLASS_MAP in src/settings.ts
202
+
203
+ - [x] Garage Door Opener relay variant (Task 14.2)
204
+ - Added WoGarageDoorOpener class extending WoRelaySwitch1
205
+ - Lightweight variant reuses relay switch control methods (turnOn/turnOff/toggle)
206
+ - Wired through exports, registry, and DEVICE_CLASS_MAP
207
+ - Added regression coverage in test/relay-variants.test.ts (4 tests)
208
+ - Tests verify: 2PM class mapping, Garage Door Opener mapping, channel methods on 2PM, relay methods on opener
209
+
210
+ ---
211
+
212
+ ## Phase 3: New Device Types (Climate Enhancements) ✅
213
+
214
+ ### Completed March 7, 2026
215
+ - [x] Evaporative Humidifier (WoHumi2) enhancement (Task 15.1)
216
+ - Enhanced WoHumi2 with convenience methods: setAuto(), setManual(), setLevel(level)
217
+ - Added evaporative humidifier API aliases in DEVICE_CLASS_MAP to map to WoHumi2
218
+ - Added regression coverage in test/humidifier2-enhancement.test.ts (4 tests)
219
+ - Tests verify WoHumi2 method delegation and evaporative humidifier device-type mapping
220
+
221
+ - [x] Circulator Fan (Battery/USB) variant (Task 15.2)
222
+ - Added WoCirculatorFan class extending WoAirPurifier
223
+ - Wired fan class through exports and SwitchBot runtime DEVICE_CLASSES registry
224
+ - Added device-type aliases in DEVICE_CLASS_MAP for Battery/USB fan names
225
+ - Added regression coverage in test/circulator-fan-variants.test.ts (4 tests)
226
+ - Tests verify model mapping and inherited control methods (turnOn/turnOff/setFanSpeed)
227
+
228
+ - [x] Smart Thermostat Radiator variant (Task 15.3)
229
+ - Added WoSmartThermostatRadiator class extending WoAirPurifier
230
+ - Wired class through exports and SwitchBot runtime DEVICE_CLASSES registry
231
+ - Added device-type aliases in DEVICE_CLASS_MAP for thermostat radiator names
232
+ - Added regression coverage in test/thermostat-radiator-variants.test.ts (4 tests)
233
+ - Tests verify model mapping and inherited climate control methods (turnOn/turnOff/setMode)
234
+
235
+ - [x] Climate Panel variant (Task 15.4)
236
+ - Added WoClimatePanel class extending WoAirPurifier
237
+ - Wired class through exports and SwitchBot runtime DEVICE_CLASSES registry
238
+ - Added climate panel aliases in DEVICE_CLASS_MAP
239
+ - Added regression coverage in test/climate-panel-variants.test.ts (3 tests)
240
+ - Tests verify model mapping and inherited climate control methods (turnOn/turnOff/setMode)
241
+
242
+ ## Phase 3: New Device Types (Lighting Variants) ⏳
243
+
244
+ ### Completed March 7, 2026
245
+ - [x] Strip Light 3 (Task 16.1)
246
+ - Added WoStripLight3 class extending WoBulb for color control
247
+ - Wired class through exports and SwitchBot runtime DEVICE_CLASSES registry
248
+ - Added device-type mappings: "Strip Light 3", "SwitchBot Strip Light 3"
249
+ - Added regression coverage in test/strip-light-3.test.ts (3 tests)
250
+ - Tests verify device-type mapping for both aliases and inherited color control methods
251
+
252
+ - [x] Floor Lamp (Task 16.2)
253
+ - Added WoFloorLamp class extending WoBulb for color control
254
+ - Wired class through exports and SwitchBot runtime DEVICE_CLASSES registry
255
+ - Added device-type mappings: "Floor Lamp", "SwitchBot Floor Lamp"
256
+ - Added regression coverage in test/floor-lamp.test.ts (3 tests)
257
+ - Tests verify device-type mapping for both aliases and inherited color control methods
258
+
259
+ - [x] RGBICWW Strip Light (Task 16.3)
260
+ - Added WoRGBICWWStripLight class extending WoRGBICBulb for segmented control
261
+ - Wired class through exports and SwitchBot runtime DEVICE_CLASSES registry
262
+ - Added device-type mappings: "RGBICWW Strip Light", "SwitchBot RGBICWW Strip Light"
263
+ - Added regression coverage in test/rgbicww-strip-light.test.ts (3 tests)
264
+ - Tests verify device-type mapping and inherited RGBIC methods (setSegmentColor, setSegmentEffect)
265
+ - Note: Also wired WoRGBICBulb through exports for completeness
266
+
267
+ - [x] RGBICWW Floor Lamp (Task 16.4)
268
+ - Added WoRGBICWWFloorLamp class extending WoRGBICBulb for segmented control
269
+ - Wired class through exports and SwitchBot runtime DEVICE_CLASSES registry
270
+ - Added device-type mappings: "RGBICWW Floor Lamp", "SwitchBot RGBICWW Floor Lamp"
271
+ - Added regression coverage in test/rgbicww-floor-lamp.test.ts (3 tests)
272
+ - Tests verify device-type mapping and inherited RGBIC methods (setSegmentColor, setSegmentEffect)
273
+
274
+ - [x] Art Frame (Task 16.5)
275
+ - Added WoArtFrame class extending WoBulb for color control
276
+ - Wired class through exports and SwitchBot runtime DEVICE_CLASSES registry
277
+ - Added device-type mappings: "Art Frame", "SwitchBot Art Frame"
278
+ - Added regression coverage in test/art-frame.test.ts (3 tests)
279
+ - Tests verify device-type mapping for both aliases and inherited color control methods
280
+ - **Lighting variants block (Tasks 16.1-16.5) complete!** ✅
281
+
282
+ ## Phase 3: New Device Types (Other Devices) ⏳
283
+
284
+ ### Completed March 7, 2026
285
+ - [x] Plug Mini EU verification (Task 17.1)
286
+ - Verified WoPlugMiniEU exists in runtime registry (aliased to WoPlugMiniUS)
287
+ - Verified device-type mapping: "Plug Mini (EU)" → WoPlugMiniEU
288
+ - Added regression coverage in test/plug-mini-eu.test.ts (2 tests)
289
+ - Tests verify EU variant maps to WoPlugMiniUS class and inherits plug control methods
290
+ - Note: WoPlugMiniEU shares implementation with WoPlugMiniUS (regional variant)
291
+
292
+ - [x] Roller Shade (Task 17.2)
293
+ - Added WoRollerShade class extending WoCurtain for motorized window covering control
294
+ - Wired class through exports and SwitchBot runtime DEVICE_CLASSES registry
295
+ - Added device-type mappings: "Roller Shade", "SwitchBot Roller Shade"
296
+ - Added regression coverage in test/roller-shade.test.ts (3 tests)
297
+ - Tests verify device-type mapping and inherited curtain control methods (open, close, pause, setPosition)
298
+
299
+ ---
300
+
126
301
  ## Notes
127
302
 
128
303
  When moving a task from todo.md to this file: