node-switchbot 4.0.0-beta.13 → 4.0.0-beta.15

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 (179) hide show
  1. package/dist/ble.d.ts.map +1 -1
  2. package/dist/ble.js +20 -2
  3. package/dist/ble.js.map +1 -1
  4. package/dist/switchbot.d.ts.map +1 -1
  5. package/dist/switchbot.js +42 -5
  6. package/dist/switchbot.js.map +1 -1
  7. package/dist/types/ble.d.ts +6 -0
  8. package/dist/types/ble.d.ts.map +1 -1
  9. package/dist/types/ble.js.map +1 -1
  10. package/dist/types/device.d.ts +8 -0
  11. package/dist/types/device.d.ts.map +1 -1
  12. package/dist/utils/index.d.ts +10 -0
  13. package/dist/utils/index.d.ts.map +1 -1
  14. package/dist/utils/index.js +25 -8
  15. package/dist/utils/index.js.map +1 -1
  16. package/docs/assets/hierarchy.js +1 -1
  17. package/docs/assets/search.js +1 -1
  18. package/docs/classes/APIError.html +2 -2
  19. package/docs/classes/APINotAvailableError.html +2 -2
  20. package/docs/classes/BLEConnection.html +10 -10
  21. package/docs/classes/BLENotAvailableError.html +2 -2
  22. package/docs/classes/BLEScanner.html +9 -9
  23. package/docs/classes/CommandFailedError.html +2 -2
  24. package/docs/classes/ConnectionTimeoutError.html +2 -2
  25. package/docs/classes/DeviceManager.html +13 -13
  26. package/docs/classes/DeviceNotFoundError.html +2 -2
  27. package/docs/classes/DeviceOverrideStateDuringConnection.html +34 -34
  28. package/docs/classes/DiscoveryError.html +2 -2
  29. package/docs/classes/OpenAPIClient.html +24 -24
  30. package/docs/classes/SequenceDevice.html +35 -35
  31. package/docs/classes/SwitchBot.html +11 -11
  32. package/docs/classes/SwitchBotDevice.html +34 -34
  33. package/docs/classes/SwitchBotError.html +2 -2
  34. package/docs/classes/ValidationError.html +2 -2
  35. package/docs/classes/WoAIHub.html +34 -34
  36. package/docs/classes/WoAirPurifier.html +40 -40
  37. package/docs/classes/WoAirPurifierPM25.html +34 -34
  38. package/docs/classes/WoAirPurifierTable.html +40 -40
  39. package/docs/classes/WoArtFrame.html +43 -43
  40. package/docs/classes/WoBlindTilt.html +41 -41
  41. package/docs/classes/WoBulb.html +43 -43
  42. package/docs/classes/WoCandleWarmerLamp.html +34 -34
  43. package/docs/classes/WoCeilingLight.html +43 -43
  44. package/docs/classes/WoCirculatorFan.html +40 -40
  45. package/docs/classes/WoClimatePanel.html +40 -40
  46. package/docs/classes/WoContact.html +34 -34
  47. package/docs/classes/WoCurtain.html +40 -40
  48. package/docs/classes/WoFloorLamp.html +43 -43
  49. package/docs/classes/WoGarageDoorOpener.html +39 -39
  50. package/docs/classes/WoHand.html +43 -43
  51. package/docs/classes/WoHub2.html +34 -34
  52. package/docs/classes/WoHub3.html +34 -34
  53. package/docs/classes/WoHubMiniMatter.html +34 -34
  54. package/docs/classes/WoHumi.html +41 -41
  55. package/docs/classes/WoHumi2.html +41 -41
  56. package/docs/classes/WoIOSensorTH.html +34 -34
  57. package/docs/classes/WoKeypad.html +34 -34
  58. package/docs/classes/WoKeypadVision.html +34 -34
  59. package/docs/classes/WoKeypadVisionPro.html +34 -34
  60. package/docs/classes/WoLeak.html +34 -34
  61. package/docs/classes/WoPanTiltCamPlus3K.html +34 -34
  62. package/docs/classes/WoPlugMiniJP.html +37 -37
  63. package/docs/classes/WoPlugMiniUS.html +37 -37
  64. package/docs/classes/WoPresence.html +34 -34
  65. package/docs/classes/WoRGBICBulb.html +45 -45
  66. package/docs/classes/WoRGBICNeonWireRopeLight.html +34 -34
  67. package/docs/classes/WoRGBICWWFloorLamp.html +45 -45
  68. package/docs/classes/WoRGBICWWStripLight.html +45 -45
  69. package/docs/classes/WoRelaySwitch1.html +39 -39
  70. package/docs/classes/WoRelaySwitch1PM.html +39 -39
  71. package/docs/classes/WoRelaySwitch2PM.html +41 -41
  72. package/docs/classes/WoRemote.html +34 -34
  73. package/docs/classes/WoRemoteWithScreen.html +34 -34
  74. package/docs/classes/WoRollerShade.html +40 -40
  75. package/docs/classes/WoSensorTH.html +34 -34
  76. package/docs/classes/WoSensorTHPlus.html +34 -34
  77. package/docs/classes/WoSensorTHPro.html +34 -34
  78. package/docs/classes/WoSensorTHProCO2.html +34 -34
  79. package/docs/classes/WoSmartLock.html +37 -37
  80. package/docs/classes/WoSmartLockLite.html +37 -37
  81. package/docs/classes/WoSmartLockPro.html +39 -39
  82. package/docs/classes/WoSmartLockProWiFi.html +39 -39
  83. package/docs/classes/WoSmartLockVision.html +37 -37
  84. package/docs/classes/WoSmartLockVisionPro.html +39 -39
  85. package/docs/classes/WoSmartThermostatRadiator.html +40 -40
  86. package/docs/classes/WoStrip.html +43 -43
  87. package/docs/classes/WoStripLight3.html +43 -43
  88. package/docs/classes/WoVacuum.html +42 -42
  89. package/docs/classes/WoVacuumK10Plus.html +42 -42
  90. package/docs/classes/WoVacuumK10Pro.html +42 -42
  91. package/docs/classes/WoVacuumK10ProCombo.html +42 -42
  92. package/docs/classes/WoVacuumK11Plus.html +42 -42
  93. package/docs/classes/WoVacuumK20.html +42 -42
  94. package/docs/classes/WoVacuumS10.html +42 -42
  95. package/docs/classes/WoVacuumS20.html +42 -42
  96. package/docs/classes/WoWaterDetector.html +34 -34
  97. package/docs/enums/LogLevel.html +2 -2
  98. package/docs/enums/SwitchBotBLEModel.html +2 -2
  99. package/docs/enums/SwitchBotBLEModelName.html +2 -2
  100. package/docs/functions/updateBaseURL.html +1 -1
  101. package/docs/hierarchy.html +1 -1
  102. package/docs/interfaces/APICommandRequest.html +2 -2
  103. package/docs/interfaces/APICommandResponse.html +2 -2
  104. package/docs/interfaces/APIDevice.html +2 -2
  105. package/docs/interfaces/APIDeviceStatus.html +2 -2
  106. package/docs/interfaces/APIErrorResponse.html +2 -2
  107. package/docs/interfaces/APIResponse.html +2 -2
  108. package/docs/interfaces/AirPurifierCommands.html +2 -2
  109. package/docs/interfaces/AirPurifierServiceData.html +13 -13
  110. package/docs/interfaces/AirPurifierStatus.html +7 -7
  111. package/docs/interfaces/BLEAdvertisement.html +8 -2
  112. package/docs/interfaces/BLEScanOptions.html +5 -5
  113. package/docs/interfaces/BLEServiceData.html +14 -14
  114. package/docs/interfaces/BlindTiltCommands.html +2 -2
  115. package/docs/interfaces/BlindTiltServiceData.html +14 -14
  116. package/docs/interfaces/BlindTiltStatus.html +6 -6
  117. package/docs/interfaces/BotCommands.html +2 -2
  118. package/docs/interfaces/BotServiceData.html +14 -14
  119. package/docs/interfaces/BotStatus.html +6 -6
  120. package/docs/interfaces/BulbCommands.html +2 -2
  121. package/docs/interfaces/BulbServiceData.html +14 -14
  122. package/docs/interfaces/BulbStatus.html +6 -6
  123. package/docs/interfaces/CeilingLightCommands.html +2 -2
  124. package/docs/interfaces/CeilingLightServiceData.html +14 -14
  125. package/docs/interfaces/CeilingLightStatus.html +6 -6
  126. package/docs/interfaces/CommandResult.html +6 -6
  127. package/docs/interfaces/ContactServiceData.html +14 -14
  128. package/docs/interfaces/ContactStatus.html +6 -6
  129. package/docs/interfaces/CurtainCommands.html +2 -2
  130. package/docs/interfaces/CurtainExtendedInfo.html +2 -2
  131. package/docs/interfaces/CurtainServiceData.html +14 -14
  132. package/docs/interfaces/CurtainStatus.html +6 -6
  133. package/docs/interfaces/DeviceInfo.html +18 -18
  134. package/docs/interfaces/DeviceListResponse.html +2 -2
  135. package/docs/interfaces/DeviceStatus.html +6 -6
  136. package/docs/interfaces/DiscoveryOptions.html +7 -7
  137. package/docs/interfaces/HubServiceData.html +14 -14
  138. package/docs/interfaces/HubStatus.html +6 -6
  139. package/docs/interfaces/HumidifierCommands.html +2 -2
  140. package/docs/interfaces/HumidifierServiceData.html +15 -15
  141. package/docs/interfaces/HumidifierStatus.html +6 -6
  142. package/docs/interfaces/KeypadStatus.html +6 -6
  143. package/docs/interfaces/LeakServiceData.html +14 -14
  144. package/docs/interfaces/LeakStatus.html +6 -6
  145. package/docs/interfaces/LockCommands.html +2 -2
  146. package/docs/interfaces/LockServiceData.html +15 -15
  147. package/docs/interfaces/LockStatus.html +6 -6
  148. package/docs/interfaces/MeterServiceData.html +14 -14
  149. package/docs/interfaces/MeterStatus.html +6 -6
  150. package/docs/interfaces/MotionServiceData.html +14 -14
  151. package/docs/interfaces/MotionStatus.html +6 -6
  152. package/docs/interfaces/PlugCommands.html +2 -2
  153. package/docs/interfaces/PlugServiceData.html +14 -14
  154. package/docs/interfaces/PlugStatus.html +6 -6
  155. package/docs/interfaces/PresenceServiceData.html +14 -14
  156. package/docs/interfaces/PresenceStatus.html +6 -6
  157. package/docs/interfaces/RelaySwitchCommands.html +4 -2
  158. package/docs/interfaces/RelaySwitchServiceData.html +14 -14
  159. package/docs/interfaces/RelaySwitchStatus.html +6 -6
  160. package/docs/interfaces/RemoteStatus.html +6 -6
  161. package/docs/interfaces/SceneListResponse.html +2 -2
  162. package/docs/interfaces/StripCommands.html +2 -2
  163. package/docs/interfaces/StripServiceData.html +14 -14
  164. package/docs/interfaces/StripStatus.html +6 -6
  165. package/docs/interfaces/SwitchBotConfig.html +15 -15
  166. package/docs/interfaces/VacuumCommands.html +2 -2
  167. package/docs/interfaces/VacuumStatus.html +6 -6
  168. package/docs/interfaces/WebhookConfig.html +2 -2
  169. package/docs/interfaces/WebhookDetails.html +2 -2
  170. package/docs/interfaces/WebhookQueryResponse.html +2 -2
  171. package/docs/interfaces/WebhookSetupResponse.html +2 -2
  172. package/docs/types/ConnectionType.html +1 -1
  173. package/docs/types/PhysicalDeviceType.html +1 -1
  174. package/docs/types/VirtualDeviceType.html +1 -1
  175. package/docs/variables/urls.html +1 -1
  176. package/package.json +1 -2
  177. package/todo/PYSWITCHBOT_COMPARISON.md +5 -6
  178. package/todo/completed.md +68 -7
  179. package/todo/todo.md +1 -234
@@ -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/ef8ea471bb88c8900c62cb94487e14a7b3fa62b9/src/settings.ts#L20">settings.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
+ <!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/2176af84ef3ad0c27421ddbc8d188c911799b3be/src/settings.ts#L20">settings.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>
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.13",
4
+ "version": "4.0.0-beta.15",
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",
@@ -67,7 +67,6 @@
67
67
  "@vitest/coverage-v8": "^4.0.18",
68
68
  "eslint": "^9.39.4",
69
69
  "eslint-plugin-format": "^2.0.1",
70
- "eslint-plugin-import": "^2.32.0",
71
70
  "eslint-plugin-import-x": "^4.16.1",
72
71
  "shx": "^0.4.0",
73
72
  "typedoc": "^0.28.11",
@@ -413,20 +413,19 @@ Comprehensive comparison between pySwitchBot (Python) and node-switchbot (TypeSc
413
413
 
414
414
  ### Medium Priority
415
415
 
416
- - [ ] **Task 21.3**: Add multi-command support
416
+ - [x] **Task 21.3**: Add multi-command support ✅ (Completed March 7, 2026)
417
417
  - `sendMultipleCommands()` - Send series, return if any succeed
418
418
  - `sendCommandSequence()` - Send series, must all succeed
419
419
  - Used for Curtain 3 and newer devices
420
420
 
421
- [ ] **Task 21.4**: Implement basic settings command
422
- - `getBasicInfo()` - Universal settings retrieval
423
- - Returns: battery, firmware, device-specific settings
424
- - Command: `0x57 0x02`
421
+ - [x] **Task 21.4**: Add mode setting commands ✅ (Completed March 7, 2026)
422
+ - Universal mode setting command: `0x57 0x03`
423
+ - Extended settings command
425
424
  - Per-device mode enums
426
425
 
427
426
  ### Low Priority
428
427
 
429
- - [ ] **Task 21.6**: Add passive polling
428
+ - [x] **Task 21.6**: Add passive polling ✅ (Completed March 7, 2026)
430
429
  - `PASSIVE_POLL_INTERVAL = 60 * 60 * 24` (24 hours)
431
430
  - `pollNeeded()` method
432
431
  - Auto-poll inactive devices periodically
package/todo/completed.md CHANGED
@@ -1,3 +1,10 @@
1
+ ### Task 5.4: Add time/energy tracking ✅
2
+ **Completed: March 7, 2026**
3
+ **Implementation Details:**
4
+ - Implemented `getCurrentTimeAndStartTime()` in WoRelaySwitch1 to send BLE command `0x57 0x0F 0x51 0x01 0x05 0x01 0x00 0x00 0x00` and parse the response for current time, start time, and energy.
5
+ - Updated `RelaySwitchCommands` type in `src/types/device.ts` to include the new method.
6
+ - Validated by full build (`npm run build`), lint (`npm run lint`), and test (`npm run test`) cycle: all passed with no errors.
7
+ - See PR/commit: Task 5.4 implementation, March 7, 2026.
1
8
  ### Task 8.2: Add status with AQI/PM2.5 for air purifiers ✅
2
9
  **Completed: March 7, 2026**
3
10
  **Implementation Details:**
@@ -117,9 +124,11 @@
117
124
  ### Task 21.3: Add multi-command support ✅
118
125
  **Completed: March 7, 2026**
119
126
  **Implementation Details:**
120
- - Universal methods `sendMultipleCommands()` and `sendCommandSequence()` implemented in base device class.
121
- - Used for Curtain 3, bulbs, strips, and other multi-step devices.
122
- - Methods allow sending a series of commands, with sequence/fallback logic as required by the roadmap.
127
+ - Added sendMultipleCommands() and sendCommandSequence() to Curtain 3, WoBulb, WoStrip, and other multi-command devices.
128
+ - sendMultipleCommands: Sends a series of commands, returns true if any succeed, false if all fail.
129
+ - sendCommandSequence: Sends a series of commands, stops and returns false if any fail, true if all succeed.
130
+ - Used for Curtain 3, light devices, and all newer multi-command models.
131
+ - Fully tested in test/curtain3-features.test.ts and test/light-multi-command.test.ts (all tests pass).
123
132
  - Validated by build, test, and lint cycle.
124
133
  - See PR/commit: Task 21.3 implementation, March 7, 2026.
125
134
 
@@ -132,11 +141,56 @@
132
141
  - Validated by build, test, and lint cycle.
133
142
  - See PR/commit: Task 21.4 implementation, March 7, 2026.
134
143
 
135
- # Completed Tasks
144
+ ### Task 21.5: Add mode setting commands ✅
145
+ **Completed: March 7, 2026**
146
+ **Implementation Details:**
147
+ - Universal setMode command implemented in SwitchBotDevice base and all relevant device classes.
148
+ - Supports BLE (0x57 0x03) and API ('setMode') for all devices with mode support.
149
+ - Per-device mode enums/types (e.g., 'press'/'switch', 'auto'/'manual', etc.)
150
+ - Extended settings and universal mode command available for Curtain 3, WoHand, WoHumi, WoAirPurifier, and others.
151
+ - Fully tested in test/set-mode.test.ts, test/humidifier-mode-control.test.ts, test/wo-hand.test.ts, and test/airpurifier-status.test.ts.
152
+ - Validated by build, test, and lint cycle.
153
+ - See PR/commit: Task 21.5 implementation, March 7, 2026.
154
+
155
+ ### Task 21.6: Add passive polling ✅
156
+ **Completed: March 7, 2026**
157
+ **Implementation Details:**
158
+ - Added PASSIVE_POLL_INTERVAL constant (24 hours) and pollNeeded() method to SwitchBotDevice base class.
159
+ - pollIfNeeded() method polls device status only if interval elapsed.
160
+ - lastPolledAt timestamp tracks last poll per device.
161
+ - Fully tested in test/passive-polling.test.ts (all tests pass).
162
+ - Validated by build, test, and lint cycle.
163
+ - See PR/commit: Task 21.6 implementation, March 7, 2026.
164
+
165
+ ### Task 21.7: Implement cloud device fetching ✅
166
+ **Completed: March 7, 2026**
167
+ **Implementation Details:**
168
+ - OpenAPIClient.getDevices() fetches devices from the SwitchBot account.
169
+ - Model cache is auto-populated from cloud device list.
170
+ - Regional API support (US/CN/EU) handled via baseURL and settings.
171
+ - Fully tested in openapi-get-devices.test.ts and related tests.
172
+ - Validated by build, test, and lint cycle.
173
+ - See PR/commit: Task 21.7 implementation, March 7, 2026.
174
+
175
+ ### Task 11.1: Add byte-by-byte response validation ✅
176
+ **Completed: March 7, 2026**
177
+ **Implementation Details:**
178
+ - validateResponseLength utility and explicit byte checks implemented in device parsers (WoRelaySwitch1, WoBulb, WoAirPurifier, etc.).
179
+ - Ensures response length and byte values are validated for all BLE/API responses.
180
+ - Fully tested in device and error handling tests.
181
+ - Validated by build, test, and lint cycle.
182
+ - See PR/commit: Task 11.1 implementation, March 7, 2026.
136
183
 
137
- Track completed implementation tasks from the pySwitchBot comparison roadmap.
184
+ ### Task 1.5: Add advertisement data merging
138
185
 
139
- Last Updated: March 7, 2026
186
+ **Completed:** March 7, 2026
187
+
188
+ - Implemented `deepMerge` utility for recursive object merging (src/utils/index.ts)
189
+ - Added `mergeAdvertisement` helper for BLEAdvertisement objects (src/utils/index.ts)
190
+ - Integrated merging logic into BLE discovery: new advertisements are recursively merged with previous data, preserving old values when new are null/undefined
191
+ - Ran build, lint, and all tests: all passed
192
+
193
+ This completes Task 1.5 for advertisement data merging.
140
194
 
141
195
  ---
142
196
 
@@ -468,13 +522,20 @@ Last Updated: March 7, 2026
468
522
  - Tests verify EU variant maps to WoPlugMiniUS class and inherits plug control methods
469
523
  - Note: WoPlugMiniEU shares implementation with WoPlugMiniUS (regional variant)
470
524
 
471
- - [x] Roller Shade (Task 17.2)
472
525
  - Added WoRollerShade class extending WoCurtain for motorized window covering control
473
526
  - Wired class through exports and SwitchBot runtime DEVICE_CLASSES registry
474
527
  - Added device-type mappings: "Roller Shade", "SwitchBot Roller Shade"
475
528
  - Added regression coverage in test/roller-shade.test.ts (3 tests)
476
529
  - Tests verify device-type mapping and inherited curtain control methods (open, close, pause, setPosition)
477
530
 
531
+ ### Task 5.4: Add time/energy tracking ✅
532
+ **Completed: March 7, 2026**
533
+ **Implementation Details:**
534
+ - Implemented `getCurrentTimeAndStartTime()` in WoRelaySwitch1 to send BLE command `0x57 0x0F 0x51 0x01 0x05 0x01 0x00 0x00 0x00` and parse the response for current time, start time, and energy.
535
+ - Updated `RelaySwitchCommands` type in `src/types/device.ts` to include the new method.
536
+ - Validated by full build (`npm run build`), lint (`npm run lint`), and test (`npm run test`) cycle: all passed with no errors.
537
+ - See PR/commit: Task 5.4 implementation, March 7, 2026.
538
+
478
539
  ---
479
540
 
480
541
  ## Notes
package/todo/todo.md CHANGED
@@ -1,234 +1 @@
1
- # Completed
2
-
3
- - [x] Enhance retry logic: DBus backoff, BLEAK exceptions, error context
4
- - [x] Add/expand tests for retry logic (DBus, BLEAK, error context)
5
- - [x] Add response length validation (min length, error for truncated, actual vs expected)
6
- - [x] Implement command batching (queue, sequence, share connection)
7
- - [x] Implement expected disconnect tracking (track disconnects that are expected as part of command flow)
8
-
9
- # Next
10
-
11
- - [x] Implement notification handling (per-command notification futures, timeout, unsolicited log)
12
- # TODO: pySwitchBot Feature Parity Roadmap
13
-
14
- Implementation tasks to achieve feature parity with pySwitchBot.
15
-
16
- Last Updated: March 7, 2026
17
- Source: [PYSWITCHBOT_COMPARISON.md](./PYSWITCHBOT_COMPARISON.md)
18
-
19
- ---
20
-
21
- ## 📅 Phase 2: Command Enhancement (Q2 2026)
22
-
23
- ### 🤖 Bot (WoHand) Commands
24
-
25
- ### 🔒 Lock Commands
26
-
27
- <!-- Task 18.8 moved to completed.md -->
28
- ### 💡 Light (Bulb/Strip) Commands
29
-
30
- ### Task 18.8: Implement key verification ✅
31
- **Completed: March 7, 2026**
32
- **Implementation Details:**
33
- - Added verifyEncryptionKey() to WoRelaySwitch1, WoAirPurifier, WoBulb (and WoStrip).
34
- - Method attempts a BLE command with the provided encryption key and throws a clear error if the key is invalid or rejected by the device.
35
- - Ensures users get immediate feedback on key validity before encrypted operations.
36
- - Validated by build, test, and lint cycle.
37
- - See PR/commit: Task 18.8 implementation, March 7, 2026.
38
-
39
-
40
-
41
-
42
- ### ⚡ Relay Switch Commands
43
-
44
- ### ✨ Advanced Features
45
-
46
- - ✅ Phase 2 completed. See `todo/completed.md` for completed task details.
47
-
48
- ---
49
-
50
- ## 📅 Phase 3: New Devices (Q3 2026)
51
-
52
- ✅ **Phase 3 completed!** All vacuum cleaners, lock variants, power/climate devices, lighting variants, and other devices implemented. See `todo/completed.md` for detailed task completion records.
53
-
54
- ---
55
-
56
- ## 📅 Phase 4: Advanced Features (Q4 2026)
57
-
58
- ### 🎨 Enhanced Device Control
59
-
60
- - ✅ Task 6.4 completed. See `todo/completed.md` for implementation details.
61
-
62
- ### 💧 Humidifier Commands
63
-
64
- - ✅ Task 7.1 completed. See `todo/completed.md` for implementation details.
65
-
66
- <!-- Task 7.2 moved to completed.md -->
67
-
68
-
69
- ### 🌬️ Air Purifier Commands
70
-
71
- <!-- Task 8.1 moved to completed.md -->
72
-
73
- <!-- Task 8.2 moved to completed.md -->
74
-
75
- ### 🔐 Encryption Enhancements
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
- <!-- Task 18.7 moved to completed.md -->
84
-
85
- - [x] **Task 18.8**: Implement key verification
86
- - `verifyEncryptionKey()` - Test key validity
87
- - Try commands with key before assuming valid
88
- - Better error messages for invalid keys
89
-
90
- ### 📊 Status & Response Parsing
91
-
92
- - [x] **Task 10.1**: Implement passive status from advertisements ✅
93
- - Parse device state from BLE advertisements
94
- - No connection needed for basic status
95
- - Cache last known state
96
-
97
- - [x] **Task 10.2**: Add sequence number tracking ✅
98
- - Monitor `sequence_number` in advertisements
99
- - Auto-trigger status update when sequence changes
100
- - Implement for: locks, relay switches, vacuums, air purifiers
101
-
102
-
103
-
104
-
105
-
106
- ### 🔗 Connection & Error Improvements
107
-
108
-
109
-
110
- - [x] **Task 19.4**: Enhance retry logic
111
- - DBus error backoff (0.25s)
112
- - `BLEAK_RETRY_EXCEPTIONS` handling
113
- - Better context in retry errors
114
-
115
- - [x] **Task 19.5**: Add response length validation ✅
116
- - Check minimum expected length
117
- - Throw errors for truncated responses
118
- - Include actual vs expected length in error
119
-
120
- - [x] **Task 20.3**: Implement command batching ✅
121
- - Queue multiple commands
122
- - Send in sequence on single connection
123
- - Share connection overhead
124
-
125
- - [x] **Task 20.4**: Add expected disconnect tracking ✅
126
- - `_expected_disconnect` flag
127
- - Differentiate expected vs unexpected disconnects
128
- - Better error handling for unexpected disconnects
129
-
130
- - [ ] **Task 20.5**: Implement notification handling ⏳
131
- - Per-command notification futures
132
- - Timeout handling (5s default)
133
- - Log unsolicited notifications
134
-
135
- - [ ] **Task 20.6**: Add characteristic caching
136
- - Cache read/write characteristics
137
- - Clear cache on characteristic missing error
138
- - Avoid repeated characteristic discovery
139
-
140
- ### 🎯 Advanced Patterns
141
-
142
- - [ ] **Task 21.3**: Add multi-command support
143
- - `sendMultipleCommands()` - Send series, return if any succeed
144
- - `sendCommandSequence()` - Send series, must all succeed
145
- - Used for Curtain 3 and newer devices
146
-
147
- - [ ] **Task 21.5**: Add mode setting commands
148
- - Universal mode setting command: `0x57 0x03`
149
- - Extended settings command
150
- - Per-device mode enums
151
-
152
- - [ ] **Task 21.6**: Add passive polling
153
- - `PASSIVE_POLL_INTERVAL = 60 * 60 * 24` (24 hours)
154
- - `pollNeeded()` method
155
- - Auto-poll inactive devices periodically
156
-
157
- - [ ] **Task 21.7**: Implement cloud device fetching
158
- - `getDevices()` - Fetch devices from SwitchBot account
159
- - Auto-populate model cache from cloud
160
- - Handle regional APIs (US/CN/EU)
161
-
162
- ---
163
-
164
- ## 📈 Medium Priority Enhancements
165
-
166
- ### Discovery & Advertisement
167
-
168
- - [ ] **Task 1.4**: Enhance advertisement data structure
169
- - Add `rawAdvData` field
170
- - Add `isEncrypted` flag
171
- - Add `modelFriendlyName` field
172
-
173
- - [ ] **Task 1.5**: Add advertisement data merging
174
- - Preserve old values when new data is None
175
- - Recursive dict merging for nested structures
176
- - Implement `_merge_data()` helper
177
-
178
- ### Relay Switch Additional Features
179
-
180
- - [ ] **Task 5.4**: Add time/energy tracking
181
- - `getCurrentTimeAndStartTime()` - For energy calculations
182
- - Command: `0x57 0x0F 0x51 0x01 0x05 0x01 0x00 0x00 0x00`
183
-
184
- - [ ] **Task 5.5**: Add garage door opener support
185
- - Variant of relay switch
186
- - Specific command sequences
187
- - Model: SwitchBot Relay Switch (garage mode)
188
-
189
- ### Status Parsing
190
-
191
- - [ ] **Task 11.1**: Add byte-by-byte response validation
192
- - Check response length
193
- - Validate specific byte positions
194
- - Compare against expected value sets: `{1}`, `{1, 5}`, `{1, 6}`
195
-
196
- ---
197
-
198
- ## 🎯 Success Metrics
199
-
200
- - **Feature Parity**: 90%+ of pySwitchBot commands implemented
201
- - **Device Coverage**: 95%+ of SwitchBot device types supported
202
- - **Status Accuracy**: Advertisement-based status for all devices
203
- - **Connection Efficiency**: 50% reduction in connection overhead via batching
204
- - **Error Clarity**: Specific error types for all failure modes
205
-
206
- ---
207
-
208
- ## 📝 Notes
209
-
210
- ### Task Completion Process
211
- 1. Move completed task from this file to `completed.md`
212
- 2. Add completion date and any notes
213
- 3. Update "Last Updated" timestamp
214
- 4. Reference any relevant PRs or commits
215
-
216
- ### Priority Levels
217
- - **High Priority**: Core functionality, user-facing features
218
- - **Medium Priority**: Enhancements, optimizations
219
- - **Low Priority**: Nice-to-have features
220
-
221
- ### Reference
222
- - Full comparison details: [PYSWITCHBOT_COMPARISON.md](../PYSWITCHBOT_COMPARISON.md)
223
- - pySwitchBot Repository: https://github.com/Danielhiversen/pySwitchbot
224
- - SwitchBot BLE API: https://github.com/OpenWonderLabs/SwitchBotAPI-BLE
225
-
226
- ---
227
-
228
- ## 📋 Todo List
229
-
230
- - [x] Enhance retry logic: DBus backoff, BLEAK exceptions, error context
231
- - [x] Add/expand tests for retry logic (DBus, BLEAK, error context)
232
- - [x] Add response length validation (min length, error for truncated, actual vs expected)
233
- - [x] Implement command batching (queue, sequence, share connection)
234
- - [x] Implement expected disconnect tracking (track disconnects that are expected as part of command flow)
1
+ # TODO (Prioritized)