@switchbot/homebridge-switchbot 5.0.0-beta.12 → 5.0.0-beta.121

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 (588) hide show
  1. package/.github/ISSUE_TEMPLATE/e2e-verification.md +36 -0
  2. package/.github/copilot-instructions.md +39 -0
  3. package/.github/workflows/ci.yml +32 -0
  4. package/.github/workflows/manual-e2e.yml +115 -0
  5. package/.github/workflows/release.yml +0 -4
  6. package/CHANGELOG.md +35 -0
  7. package/E2E-VERIFICATION.md +121 -0
  8. package/MIGRATION.md +54 -0
  9. package/README.md +99 -3
  10. package/TODO.md +263 -0
  11. package/config.schema.json +187 -14787
  12. package/dist/device-types.d.ts +31 -0
  13. package/dist/device-types.d.ts.map +1 -0
  14. package/dist/device-types.js +246 -0
  15. package/dist/device-types.js.map +1 -0
  16. package/dist/deviceFactory.d.ts +13 -0
  17. package/dist/deviceFactory.d.ts.map +1 -0
  18. package/dist/deviceFactory.js +146 -0
  19. package/dist/deviceFactory.js.map +1 -0
  20. package/dist/devices/deviceBase.d.ts +50 -0
  21. package/dist/devices/deviceBase.d.ts.map +1 -0
  22. package/dist/devices/deviceBase.js +119 -0
  23. package/dist/devices/deviceBase.js.map +1 -0
  24. package/dist/devices/genericDevice.d.ts +276 -0
  25. package/dist/devices/genericDevice.d.ts.map +1 -0
  26. package/dist/devices/genericDevice.js +1320 -0
  27. package/dist/devices/genericDevice.js.map +1 -0
  28. package/dist/errors.d.ts +5 -0
  29. package/dist/errors.d.ts.map +1 -0
  30. package/dist/errors.js +51 -0
  31. package/dist/errors.js.map +1 -0
  32. package/dist/homebridge-ui/endpoints/config.d.ts +3 -0
  33. package/dist/homebridge-ui/endpoints/config.d.ts.map +1 -0
  34. package/dist/homebridge-ui/endpoints/config.js +107 -0
  35. package/dist/homebridge-ui/endpoints/config.js.map +1 -0
  36. package/dist/homebridge-ui/endpoints/credentials.d.ts +6 -0
  37. package/dist/homebridge-ui/endpoints/credentials.d.ts.map +1 -0
  38. package/dist/homebridge-ui/endpoints/credentials.js +65 -0
  39. package/dist/homebridge-ui/endpoints/credentials.js.map +1 -0
  40. package/dist/homebridge-ui/endpoints/devices.d.ts +6 -0
  41. package/dist/homebridge-ui/endpoints/devices.d.ts.map +1 -0
  42. package/dist/homebridge-ui/endpoints/devices.js +430 -0
  43. package/dist/homebridge-ui/endpoints/devices.js.map +1 -0
  44. package/dist/homebridge-ui/endpoints/discovery.d.ts +7 -0
  45. package/dist/homebridge-ui/endpoints/discovery.d.ts.map +1 -0
  46. package/dist/homebridge-ui/endpoints/discovery.js +203 -0
  47. package/dist/homebridge-ui/endpoints/discovery.js.map +1 -0
  48. package/dist/homebridge-ui/public/css/styles.css +447 -0
  49. package/dist/homebridge-ui/public/index.html +144 -248
  50. package/dist/homebridge-ui/public/js/api.d.ts +59 -0
  51. package/dist/homebridge-ui/public/js/api.d.ts.map +1 -0
  52. package/dist/homebridge-ui/public/js/api.js +219 -0
  53. package/dist/homebridge-ui/public/js/api.js.map +1 -0
  54. package/dist/homebridge-ui/public/js/api.ts +272 -0
  55. package/dist/homebridge-ui/public/js/app.d.ts +2 -0
  56. package/dist/homebridge-ui/public/js/app.d.ts.map +1 -0
  57. package/dist/homebridge-ui/public/js/app.js +3475 -0
  58. package/dist/homebridge-ui/public/js/app.js.map +7 -0
  59. package/dist/homebridge-ui/public/js/app.ts +23 -0
  60. package/dist/homebridge-ui/public/js/constants.d.ts +2 -0
  61. package/dist/homebridge-ui/public/js/constants.d.ts.map +1 -0
  62. package/dist/homebridge-ui/public/js/constants.js +2 -0
  63. package/dist/homebridge-ui/public/js/constants.js.map +1 -0
  64. package/dist/homebridge-ui/public/js/constants.ts +1 -0
  65. package/dist/homebridge-ui/public/js/credentials.d.ts +3 -0
  66. package/dist/homebridge-ui/public/js/credentials.d.ts.map +1 -0
  67. package/dist/homebridge-ui/public/js/credentials.js +96 -0
  68. package/dist/homebridge-ui/public/js/credentials.js.map +1 -0
  69. package/dist/homebridge-ui/public/js/credentials.ts +100 -0
  70. package/dist/homebridge-ui/public/js/devices-delete.d.ts +3 -0
  71. package/dist/homebridge-ui/public/js/devices-delete.d.ts.map +1 -0
  72. package/dist/homebridge-ui/public/js/devices-delete.js +206 -0
  73. package/dist/homebridge-ui/public/js/devices-delete.js.map +1 -0
  74. package/dist/homebridge-ui/public/js/devices-delete.ts +236 -0
  75. package/dist/homebridge-ui/public/js/devices.d.ts +9 -0
  76. package/dist/homebridge-ui/public/js/devices.d.ts.map +1 -0
  77. package/dist/homebridge-ui/public/js/devices.js +93 -0
  78. package/dist/homebridge-ui/public/js/devices.js.map +1 -0
  79. package/dist/homebridge-ui/public/js/devices.ts +111 -0
  80. package/dist/homebridge-ui/public/js/discovery.d.ts +4 -0
  81. package/dist/homebridge-ui/public/js/discovery.d.ts.map +1 -0
  82. package/dist/homebridge-ui/public/js/discovery.js +1364 -0
  83. package/dist/homebridge-ui/public/js/discovery.js.map +1 -0
  84. package/dist/homebridge-ui/public/js/discovery.ts +1492 -0
  85. package/dist/homebridge-ui/public/js/logger.d.ts +6 -0
  86. package/dist/homebridge-ui/public/js/logger.d.ts.map +1 -0
  87. package/dist/homebridge-ui/public/js/logger.js +12 -0
  88. package/dist/homebridge-ui/public/js/logger.js.map +1 -0
  89. package/dist/homebridge-ui/public/js/logger.ts +11 -0
  90. package/dist/homebridge-ui/public/js/modal.d.ts +5 -0
  91. package/dist/homebridge-ui/public/js/modal.d.ts.map +1 -0
  92. package/dist/homebridge-ui/public/js/modal.js +26 -0
  93. package/dist/homebridge-ui/public/js/modal.js.map +1 -0
  94. package/dist/homebridge-ui/public/js/modal.ts +28 -0
  95. package/dist/homebridge-ui/public/js/modals.d.ts +7 -0
  96. package/dist/homebridge-ui/public/js/modals.d.ts.map +1 -0
  97. package/dist/homebridge-ui/public/js/modals.js +365 -0
  98. package/dist/homebridge-ui/public/js/modals.js.map +1 -0
  99. package/dist/homebridge-ui/public/js/modals.ts +416 -0
  100. package/dist/homebridge-ui/public/js/render.d.ts +68 -0
  101. package/dist/homebridge-ui/public/js/render.d.ts.map +1 -0
  102. package/dist/homebridge-ui/public/js/render.js +914 -0
  103. package/dist/homebridge-ui/public/js/render.js.map +1 -0
  104. package/dist/homebridge-ui/public/js/render.ts +1026 -0
  105. package/dist/homebridge-ui/public/js/toast.d.ts +6 -0
  106. package/dist/homebridge-ui/public/js/toast.d.ts.map +1 -0
  107. package/dist/homebridge-ui/public/js/toast.js +29 -0
  108. package/dist/homebridge-ui/public/js/toast.js.map +1 -0
  109. package/dist/homebridge-ui/public/js/toast.ts +37 -0
  110. package/dist/homebridge-ui/public/js/types.d.ts +23 -0
  111. package/dist/homebridge-ui/public/js/types.d.ts.map +1 -0
  112. package/dist/homebridge-ui/public/js/types.js +2 -0
  113. package/dist/homebridge-ui/public/js/types.js.map +1 -0
  114. package/dist/homebridge-ui/public/js/types.ts +26 -0
  115. package/dist/homebridge-ui/server.js +11 -41
  116. package/dist/homebridge-ui/server.js.map +1 -1
  117. package/dist/homebridge-ui/utils/config-parser.d.ts +35 -0
  118. package/dist/homebridge-ui/utils/config-parser.d.ts.map +1 -0
  119. package/dist/homebridge-ui/utils/config-parser.js +87 -0
  120. package/dist/homebridge-ui/utils/config-parser.js.map +1 -0
  121. package/dist/homebridge-ui/utils/device-migration.d.ts +35 -0
  122. package/dist/homebridge-ui/utils/device-migration.d.ts.map +1 -0
  123. package/dist/homebridge-ui/utils/device-migration.js +111 -0
  124. package/dist/homebridge-ui/utils/device-migration.js.map +1 -0
  125. package/dist/homebridge-ui/utils/logger.d.ts +7 -0
  126. package/dist/homebridge-ui/utils/logger.d.ts.map +1 -0
  127. package/dist/homebridge-ui/utils/logger.js +17 -0
  128. package/dist/homebridge-ui/utils/logger.js.map +1 -0
  129. package/dist/index.d.ts.map +1 -1
  130. package/dist/index.js +1 -3
  131. package/dist/index.js.map +1 -1
  132. package/dist/platform.d.ts +39 -0
  133. package/dist/platform.d.ts.map +1 -0
  134. package/dist/platform.js +1553 -0
  135. package/dist/platform.js.map +1 -0
  136. package/dist/settings.d.ts +10 -249
  137. package/dist/settings.d.ts.map +1 -1
  138. package/dist/settings.js +5 -30
  139. package/dist/settings.js.map +1 -1
  140. package/dist/switchbotClient.d.ts +32 -0
  141. package/dist/switchbotClient.d.ts.map +1 -0
  142. package/dist/switchbotClient.js +253 -0
  143. package/dist/switchbotClient.js.map +1 -0
  144. package/dist/utils.d.ts +36 -82
  145. package/dist/utils.d.ts.map +1 -1
  146. package/dist/utils.js +40 -786
  147. package/dist/utils.js.map +1 -1
  148. package/docs/assets/highlight.css +21 -0
  149. package/docs/assets/icons.js +1 -1
  150. package/docs/assets/icons.svg +1 -1
  151. package/docs/assets/main.js +2 -2
  152. package/docs/assets/style.css +3 -3
  153. package/docs/index.html +103 -13
  154. package/docs/variables/default.html +1 -1
  155. package/eslint.config.js +7 -8
  156. package/nodemon.json +2 -2
  157. package/package.json +36 -32
  158. package/scripts/build-ui.js +36 -0
  159. package/scripts/e2e/README.md +25 -0
  160. package/scripts/e2e/curtain-e2e.sh +70 -0
  161. package/scripts/e2e/fan-e2e.sh +75 -0
  162. package/scripts/e2e/light-advanced-e2e.sh +97 -0
  163. package/scripts/e2e/light-e2e.sh +75 -0
  164. package/scripts/e2e/list-accessories.sh +19 -0
  165. package/scripts/e2e/lock-e2e.sh +65 -0
  166. package/scripts/free-dev-ports.mjs +105 -0
  167. package/scripts/generate-matter-maps.js +60 -0
  168. package/scripts/run-e2e-local.sh +14 -0
  169. package/scripts/sync-device-types.mjs +28 -0
  170. package/src/device-types.ts +261 -0
  171. package/src/deviceFactory.ts +190 -0
  172. package/src/devices/deviceBase.ts +141 -0
  173. package/src/devices/genericDevice.ts +1258 -0
  174. package/src/errors.ts +43 -0
  175. package/src/homebridge-ui/endpoints/config.ts +126 -0
  176. package/src/homebridge-ui/endpoints/credentials.ts +74 -0
  177. package/src/homebridge-ui/endpoints/devices.ts +464 -0
  178. package/src/homebridge-ui/endpoints/discovery.ts +225 -0
  179. package/src/homebridge-ui/public/css/styles.css +447 -0
  180. package/src/homebridge-ui/public/index.html +144 -248
  181. package/src/homebridge-ui/public/js/api.ts +272 -0
  182. package/src/homebridge-ui/public/js/app.ts +23 -0
  183. package/src/homebridge-ui/public/js/constants.ts +1 -0
  184. package/src/homebridge-ui/public/js/credentials.ts +100 -0
  185. package/src/homebridge-ui/public/js/devices-delete.ts +236 -0
  186. package/src/homebridge-ui/public/js/devices.ts +111 -0
  187. package/src/homebridge-ui/public/js/discovery.ts +1492 -0
  188. package/src/homebridge-ui/public/js/logger.ts +11 -0
  189. package/src/homebridge-ui/public/js/modal.ts +28 -0
  190. package/src/homebridge-ui/public/js/modals.ts +416 -0
  191. package/src/homebridge-ui/public/js/render.ts +1026 -0
  192. package/src/homebridge-ui/public/js/toast.ts +37 -0
  193. package/src/homebridge-ui/public/js/types.ts +26 -0
  194. package/src/homebridge-ui/server.ts +11 -43
  195. package/src/homebridge-ui/utils/config-parser.ts +108 -0
  196. package/src/homebridge-ui/utils/device-migration.ts +144 -0
  197. package/src/homebridge-ui/utils/logger.ts +17 -0
  198. package/src/index.ts +1 -3
  199. package/src/platform.ts +1568 -0
  200. package/src/settings.ts +12 -277
  201. package/src/switchbotClient.ts +251 -0
  202. package/src/utils.ts +48 -812
  203. package/test/accessory-restore.spec.ts +73 -0
  204. package/test/device-mapping.spec.ts +37 -0
  205. package/test/deviceFactory.spec.ts +18 -0
  206. package/test/e2e/run-e2e.spec.ts +52 -0
  207. package/test/fan-swing.spec.ts +29 -0
  208. package/test/helpers/matter-harness.ts +53 -0
  209. package/test/lock-users.spec.ts +44 -0
  210. package/test/matter-childbridge.spec.ts +59 -0
  211. package/test/matter-descriptors.spec.ts +97 -0
  212. package/test/matter-device-state.spec.ts +101 -0
  213. package/test/matter-integration.spec.ts +136 -0
  214. package/test/platform.integration.spec.ts +55 -0
  215. package/test/switchbot-client-debounce.spec.ts +131 -0
  216. package/test/switchbot-client-openapi.spec.ts +56 -0
  217. package/test/switchbotClient.spec.ts +10 -0
  218. package/test/utils.spec.ts +36 -0
  219. package/todo/COMPLETED.md +542 -0
  220. package/todo/README.md +59 -0
  221. package/todo/TODO.md +190 -0
  222. package/todo/mockups/filtering-sorting.svg +112 -0
  223. package/todo/mockups/modal-switchbot-theme.svg +66 -0
  224. package/todo/mockups/signal-strength-visualization.svg +94 -0
  225. package/vitest.config.ts +7 -0
  226. package/coverage/base.css +0 -224
  227. package/coverage/block-navigation.js +0 -87
  228. package/coverage/clover.xml +0 -15847
  229. package/coverage/coverage-final.json +0 -42
  230. package/coverage/docs/assets/dmt/dmt-component-data.js.html +0 -85
  231. package/coverage/docs/assets/dmt/dmt-components.js.html +0 -286
  232. package/coverage/docs/assets/dmt/index.html +0 -131
  233. package/coverage/docs/assets/hierarchy.js.html +0 -85
  234. package/coverage/docs/assets/icons.js.html +0 -136
  235. package/coverage/docs/assets/index.html +0 -146
  236. package/coverage/docs/assets/main.js.html +0 -265
  237. package/coverage/favicon.png +0 -0
  238. package/coverage/index.html +0 -191
  239. package/coverage/prettify.css +0 -1
  240. package/coverage/prettify.js +0 -2
  241. package/coverage/sort-arrow-sprite.png +0 -0
  242. package/coverage/sorter.js +0 -196
  243. package/coverage/src/device/blindtilt.ts.html +0 -3238
  244. package/coverage/src/device/bot.ts.html +0 -2803
  245. package/coverage/src/device/ceilinglight.ts.html +0 -2338
  246. package/coverage/src/device/colorbulb.ts.html +0 -2824
  247. package/coverage/src/device/contact.ts.html +0 -1465
  248. package/coverage/src/device/curtain.ts.html +0 -2869
  249. package/coverage/src/device/device.ts.html +0 -2500
  250. package/coverage/src/device/fan.ts.html +0 -2242
  251. package/coverage/src/device/hub.ts.html +0 -1408
  252. package/coverage/src/device/humidifier.ts.html +0 -2116
  253. package/coverage/src/device/index.html +0 -416
  254. package/coverage/src/device/iosensor.ts.html +0 -1375
  255. package/coverage/src/device/lightstrip.ts.html +0 -2617
  256. package/coverage/src/device/lock.ts.html +0 -1963
  257. package/coverage/src/device/meter.ts.html +0 -1372
  258. package/coverage/src/device/meterplus.ts.html +0 -1384
  259. package/coverage/src/device/meterpro.ts.html +0 -1618
  260. package/coverage/src/device/motion.ts.html +0 -1264
  261. package/coverage/src/device/plug.ts.html +0 -1372
  262. package/coverage/src/device/relayswitch.ts.html +0 -2284
  263. package/coverage/src/device/robotvacuumcleaner.ts.html +0 -1810
  264. package/coverage/src/device/waterdetector.ts.html +0 -1294
  265. package/coverage/src/homebridge-ui/index.html +0 -116
  266. package/coverage/src/homebridge-ui/server.ts.html +0 -229
  267. package/coverage/src/index.html +0 -161
  268. package/coverage/src/index.ts.html +0 -124
  269. package/coverage/src/irdevice/airconditioner.ts.html +0 -1687
  270. package/coverage/src/irdevice/airpurifier.ts.html +0 -844
  271. package/coverage/src/irdevice/camera.ts.html +0 -475
  272. package/coverage/src/irdevice/fan.ts.html +0 -766
  273. package/coverage/src/irdevice/index.html +0 -251
  274. package/coverage/src/irdevice/irdevice.ts.html +0 -1117
  275. package/coverage/src/irdevice/light.ts.html +0 -826
  276. package/coverage/src/irdevice/other.ts.html +0 -2458
  277. package/coverage/src/irdevice/tv.ts.html +0 -1222
  278. package/coverage/src/irdevice/vacuumcleaner.ts.html +0 -466
  279. package/coverage/src/irdevice/waterheater.ts.html +0 -469
  280. package/coverage/src/platform.ts.html +0 -8776
  281. package/coverage/src/settings.ts.html +0 -934
  282. package/coverage/src/utils.ts.html +0 -2092
  283. package/dist/devices-hap/airpurifier.d.ts +0 -54
  284. package/dist/devices-hap/airpurifier.d.ts.map +0 -1
  285. package/dist/devices-hap/airpurifier.js +0 -527
  286. package/dist/devices-hap/airpurifier.js.map +0 -1
  287. package/dist/devices-hap/blindtilt.d.ts +0 -90
  288. package/dist/devices-hap/blindtilt.d.ts.map +0 -1
  289. package/dist/devices-hap/blindtilt.js +0 -974
  290. package/dist/devices-hap/blindtilt.js.map +0 -1
  291. package/dist/devices-hap/bot.d.ts +0 -102
  292. package/dist/devices-hap/bot.d.ts.map +0 -1
  293. package/dist/devices-hap/bot.js +0 -811
  294. package/dist/devices-hap/bot.js.map +0 -1
  295. package/dist/devices-hap/ceilinglight.d.ts +0 -85
  296. package/dist/devices-hap/ceilinglight.d.ts.map +0 -1
  297. package/dist/devices-hap/ceilinglight.js +0 -701
  298. package/dist/devices-hap/ceilinglight.js.map +0 -1
  299. package/dist/devices-hap/colorbulb.d.ts +0 -88
  300. package/dist/devices-hap/colorbulb.d.ts.map +0 -1
  301. package/dist/devices-hap/colorbulb.js +0 -881
  302. package/dist/devices-hap/colorbulb.js.map +0 -1
  303. package/dist/devices-hap/contact.d.ts +0 -44
  304. package/dist/devices-hap/contact.d.ts.map +0 -1
  305. package/dist/devices-hap/contact.js +0 -409
  306. package/dist/devices-hap/contact.js.map +0 -1
  307. package/dist/devices-hap/curtain.d.ts +0 -73
  308. package/dist/devices-hap/curtain.d.ts.map +0 -1
  309. package/dist/devices-hap/curtain.js +0 -869
  310. package/dist/devices-hap/curtain.js.map +0 -1
  311. package/dist/devices-hap/device.d.ts +0 -98
  312. package/dist/devices-hap/device.d.ts.map +0 -1
  313. package/dist/devices-hap/device.js +0 -749
  314. package/dist/devices-hap/device.js.map +0 -1
  315. package/dist/devices-hap/fan.d.ts +0 -69
  316. package/dist/devices-hap/fan.d.ts.map +0 -1
  317. package/dist/devices-hap/fan.js +0 -649
  318. package/dist/devices-hap/fan.js.map +0 -1
  319. package/dist/devices-hap/hub.d.ts +0 -37
  320. package/dist/devices-hap/hub.d.ts.map +0 -1
  321. package/dist/devices-hap/hub.js +0 -392
  322. package/dist/devices-hap/hub.js.map +0 -1
  323. package/dist/devices-hap/humidifier.d.ts +0 -68
  324. package/dist/devices-hap/humidifier.d.ts.map +0 -1
  325. package/dist/devices-hap/humidifier.js +0 -628
  326. package/dist/devices-hap/humidifier.js.map +0 -1
  327. package/dist/devices-hap/iosensor.d.ts +0 -42
  328. package/dist/devices-hap/iosensor.d.ts.map +0 -1
  329. package/dist/devices-hap/iosensor.js +0 -382
  330. package/dist/devices-hap/iosensor.js.map +0 -1
  331. package/dist/devices-hap/lightstrip.d.ts +0 -79
  332. package/dist/devices-hap/lightstrip.d.ts.map +0 -1
  333. package/dist/devices-hap/lightstrip.js +0 -797
  334. package/dist/devices-hap/lightstrip.js.map +0 -1
  335. package/dist/devices-hap/lock.d.ts +0 -53
  336. package/dist/devices-hap/lock.d.ts.map +0 -1
  337. package/dist/devices-hap/lock.js +0 -561
  338. package/dist/devices-hap/lock.js.map +0 -1
  339. package/dist/devices-hap/meter.d.ts +0 -37
  340. package/dist/devices-hap/meter.d.ts.map +0 -1
  341. package/dist/devices-hap/meter.js +0 -379
  342. package/dist/devices-hap/meter.js.map +0 -1
  343. package/dist/devices-hap/meterplus.d.ts +0 -42
  344. package/dist/devices-hap/meterplus.d.ts.map +0 -1
  345. package/dist/devices-hap/meterplus.js +0 -384
  346. package/dist/devices-hap/meterplus.js.map +0 -1
  347. package/dist/devices-hap/meterpro.d.ts +0 -43
  348. package/dist/devices-hap/meterpro.d.ts.map +0 -1
  349. package/dist/devices-hap/meterpro.js +0 -468
  350. package/dist/devices-hap/meterpro.js.map +0 -1
  351. package/dist/devices-hap/motion.d.ts +0 -42
  352. package/dist/devices-hap/motion.d.ts.map +0 -1
  353. package/dist/devices-hap/motion.js +0 -345
  354. package/dist/devices-hap/motion.js.map +0 -1
  355. package/dist/devices-hap/plug.d.ts +0 -49
  356. package/dist/devices-hap/plug.d.ts.map +0 -1
  357. package/dist/devices-hap/plug.js +0 -395
  358. package/dist/devices-hap/plug.js.map +0 -1
  359. package/dist/devices-hap/relayswitch.d.ts +0 -96
  360. package/dist/devices-hap/relayswitch.d.ts.map +0 -1
  361. package/dist/devices-hap/relayswitch.js +0 -642
  362. package/dist/devices-hap/relayswitch.js.map +0 -1
  363. package/dist/devices-hap/robotvacuumcleaner.d.ts +0 -54
  364. package/dist/devices-hap/robotvacuumcleaner.d.ts.map +0 -1
  365. package/dist/devices-hap/robotvacuumcleaner.js +0 -523
  366. package/dist/devices-hap/robotvacuumcleaner.js.map +0 -1
  367. package/dist/devices-hap/waterdetector.d.ts +0 -41
  368. package/dist/devices-hap/waterdetector.d.ts.map +0 -1
  369. package/dist/devices-hap/waterdetector.js +0 -356
  370. package/dist/devices-hap/waterdetector.js.map +0 -1
  371. package/dist/devices-matter/BaseMatterAccessory.d.ts +0 -63
  372. package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
  373. package/dist/devices-matter/BaseMatterAccessory.js +0 -100
  374. package/dist/devices-matter/BaseMatterAccessory.js.map +0 -1
  375. package/dist/devices-matter/ColorLightAccessory.d.ts +0 -20
  376. package/dist/devices-matter/ColorLightAccessory.d.ts.map +0 -1
  377. package/dist/devices-matter/ColorLightAccessory.js +0 -95
  378. package/dist/devices-matter/ColorLightAccessory.js.map +0 -1
  379. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +0 -18
  380. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +0 -1
  381. package/dist/devices-matter/ColorTemperatureLightAccessory.js +0 -78
  382. package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +0 -1
  383. package/dist/devices-matter/ContactSensorAccessory.d.ts +0 -12
  384. package/dist/devices-matter/ContactSensorAccessory.d.ts.map +0 -1
  385. package/dist/devices-matter/ContactSensorAccessory.js +0 -34
  386. package/dist/devices-matter/ContactSensorAccessory.js.map +0 -1
  387. package/dist/devices-matter/DimmableLightAccessory.d.ts +0 -58
  388. package/dist/devices-matter/DimmableLightAccessory.d.ts.map +0 -1
  389. package/dist/devices-matter/DimmableLightAccessory.js +0 -167
  390. package/dist/devices-matter/DimmableLightAccessory.js.map +0 -1
  391. package/dist/devices-matter/DoorLockAccessory.d.ts +0 -14
  392. package/dist/devices-matter/DoorLockAccessory.d.ts.map +0 -1
  393. package/dist/devices-matter/DoorLockAccessory.js +0 -50
  394. package/dist/devices-matter/DoorLockAccessory.js.map +0 -1
  395. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +0 -21
  396. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +0 -1
  397. package/dist/devices-matter/ExtendedColorLightAccessory.js +0 -107
  398. package/dist/devices-matter/ExtendedColorLightAccessory.js.map +0 -1
  399. package/dist/devices-matter/FanAccessory.d.ts +0 -16
  400. package/dist/devices-matter/FanAccessory.d.ts.map +0 -1
  401. package/dist/devices-matter/FanAccessory.js +0 -81
  402. package/dist/devices-matter/FanAccessory.js.map +0 -1
  403. package/dist/devices-matter/HumiditySensorAccessory.d.ts +0 -12
  404. package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +0 -1
  405. package/dist/devices-matter/HumiditySensorAccessory.js +0 -34
  406. package/dist/devices-matter/HumiditySensorAccessory.js.map +0 -1
  407. package/dist/devices-matter/LeakSensorAccessory.d.ts +0 -12
  408. package/dist/devices-matter/LeakSensorAccessory.d.ts.map +0 -1
  409. package/dist/devices-matter/LeakSensorAccessory.js +0 -33
  410. package/dist/devices-matter/LeakSensorAccessory.js.map +0 -1
  411. package/dist/devices-matter/LightSensorAccessory.d.ts +0 -12
  412. package/dist/devices-matter/LightSensorAccessory.d.ts.map +0 -1
  413. package/dist/devices-matter/LightSensorAccessory.js +0 -34
  414. package/dist/devices-matter/LightSensorAccessory.js.map +0 -1
  415. package/dist/devices-matter/OccupancySensorAccessory.d.ts +0 -12
  416. package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +0 -1
  417. package/dist/devices-matter/OccupancySensorAccessory.js +0 -39
  418. package/dist/devices-matter/OccupancySensorAccessory.js.map +0 -1
  419. package/dist/devices-matter/OnOffLightAccessory.d.ts +0 -38
  420. package/dist/devices-matter/OnOffLightAccessory.d.ts.map +0 -1
  421. package/dist/devices-matter/OnOffLightAccessory.js +0 -118
  422. package/dist/devices-matter/OnOffLightAccessory.js.map +0 -1
  423. package/dist/devices-matter/OnOffOutletAccessory.d.ts +0 -12
  424. package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +0 -1
  425. package/dist/devices-matter/OnOffOutletAccessory.js +0 -40
  426. package/dist/devices-matter/OnOffOutletAccessory.js.map +0 -1
  427. package/dist/devices-matter/OnOffSwitchAccessory.d.ts +0 -14
  428. package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +0 -1
  429. package/dist/devices-matter/OnOffSwitchAccessory.js +0 -42
  430. package/dist/devices-matter/OnOffSwitchAccessory.js.map +0 -1
  431. package/dist/devices-matter/RoboticVacuumAccessory.d.ts +0 -68
  432. package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +0 -1
  433. package/dist/devices-matter/RoboticVacuumAccessory.js +0 -334
  434. package/dist/devices-matter/RoboticVacuumAccessory.js.map +0 -1
  435. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +0 -11
  436. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +0 -1
  437. package/dist/devices-matter/SmokeCOAlarmAccessory.js +0 -49
  438. package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +0 -1
  439. package/dist/devices-matter/TemperatureSensorAccessory.d.ts +0 -12
  440. package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +0 -1
  441. package/dist/devices-matter/TemperatureSensorAccessory.js +0 -36
  442. package/dist/devices-matter/TemperatureSensorAccessory.js.map +0 -1
  443. package/dist/devices-matter/ThermostatAccessory.d.ts +0 -19
  444. package/dist/devices-matter/ThermostatAccessory.d.ts.map +0 -1
  445. package/dist/devices-matter/ThermostatAccessory.js +0 -95
  446. package/dist/devices-matter/ThermostatAccessory.js.map +0 -1
  447. package/dist/devices-matter/VenetianBlindAccessory.d.ts +0 -19
  448. package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +0 -1
  449. package/dist/devices-matter/VenetianBlindAccessory.js +0 -99
  450. package/dist/devices-matter/VenetianBlindAccessory.js.map +0 -1
  451. package/dist/devices-matter/WindowBlindAccessory.d.ts +0 -17
  452. package/dist/devices-matter/WindowBlindAccessory.d.ts.map +0 -1
  453. package/dist/devices-matter/WindowBlindAccessory.js +0 -80
  454. package/dist/devices-matter/WindowBlindAccessory.js.map +0 -1
  455. package/dist/devices-matter/custom/PowerStripAccessory.d.ts +0 -97
  456. package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +0 -1
  457. package/dist/devices-matter/custom/PowerStripAccessory.js +0 -265
  458. package/dist/devices-matter/custom/PowerStripAccessory.js.map +0 -1
  459. package/dist/devices-matter/custom/index.d.ts +0 -8
  460. package/dist/devices-matter/custom/index.d.ts.map +0 -1
  461. package/dist/devices-matter/custom/index.js +0 -8
  462. package/dist/devices-matter/custom/index.js.map +0 -1
  463. package/dist/devices-matter/index.d.ts +0 -29
  464. package/dist/devices-matter/index.d.ts.map +0 -1
  465. package/dist/devices-matter/index.js +0 -28
  466. package/dist/devices-matter/index.js.map +0 -1
  467. package/dist/index.test.d.ts +0 -2
  468. package/dist/index.test.d.ts.map +0 -1
  469. package/dist/index.test.js +0 -19
  470. package/dist/index.test.js.map +0 -1
  471. package/dist/irdevice/airconditioner.d.ts +0 -61
  472. package/dist/irdevice/airconditioner.d.ts.map +0 -1
  473. package/dist/irdevice/airconditioner.js +0 -472
  474. package/dist/irdevice/airconditioner.js.map +0 -1
  475. package/dist/irdevice/airpurifier.d.ts +0 -50
  476. package/dist/irdevice/airpurifier.d.ts.map +0 -1
  477. package/dist/irdevice/airpurifier.js +0 -213
  478. package/dist/irdevice/airpurifier.js.map +0 -1
  479. package/dist/irdevice/camera.d.ts +0 -32
  480. package/dist/irdevice/camera.d.ts.map +0 -1
  481. package/dist/irdevice/camera.js +0 -107
  482. package/dist/irdevice/camera.js.map +0 -1
  483. package/dist/irdevice/fan.d.ts +0 -36
  484. package/dist/irdevice/fan.d.ts.map +0 -1
  485. package/dist/irdevice/fan.js +0 -200
  486. package/dist/irdevice/fan.js.map +0 -1
  487. package/dist/irdevice/irdevice.d.ts +0 -68
  488. package/dist/irdevice/irdevice.d.ts.map +0 -1
  489. package/dist/irdevice/irdevice.js +0 -298
  490. package/dist/irdevice/irdevice.js.map +0 -1
  491. package/dist/irdevice/light.d.ts +0 -36
  492. package/dist/irdevice/light.d.ts.map +0 -1
  493. package/dist/irdevice/light.js +0 -206
  494. package/dist/irdevice/light.js.map +0 -1
  495. package/dist/irdevice/other.d.ts +0 -57
  496. package/dist/irdevice/other.d.ts.map +0 -1
  497. package/dist/irdevice/other.js +0 -778
  498. package/dist/irdevice/other.js.map +0 -1
  499. package/dist/irdevice/tv.d.ts +0 -45
  500. package/dist/irdevice/tv.d.ts.map +0 -1
  501. package/dist/irdevice/tv.js +0 -327
  502. package/dist/irdevice/tv.js.map +0 -1
  503. package/dist/irdevice/vacuumcleaner.d.ts +0 -28
  504. package/dist/irdevice/vacuumcleaner.d.ts.map +0 -1
  505. package/dist/irdevice/vacuumcleaner.js +0 -104
  506. package/dist/irdevice/vacuumcleaner.js.map +0 -1
  507. package/dist/irdevice/waterheater.d.ts +0 -30
  508. package/dist/irdevice/waterheater.d.ts.map +0 -1
  509. package/dist/irdevice/waterheater.js +0 -105
  510. package/dist/irdevice/waterheater.js.map +0 -1
  511. package/dist/platform-hap.d.ts +0 -149
  512. package/dist/platform-hap.d.ts.map +0 -1
  513. package/dist/platform-hap.js +0 -2861
  514. package/dist/platform-hap.js.map +0 -1
  515. package/dist/platform-matter.d.ts +0 -120
  516. package/dist/platform-matter.d.ts.map +0 -1
  517. package/dist/platform-matter.js +0 -984
  518. package/dist/platform-matter.js.map +0 -1
  519. package/dist/utils.test.d.ts +0 -2
  520. package/dist/utils.test.d.ts.map +0 -1
  521. package/dist/utils.test.js +0 -95
  522. package/dist/utils.test.js.map +0 -1
  523. package/dist/verifyconfig.test.d.ts +0 -2
  524. package/dist/verifyconfig.test.d.ts.map +0 -1
  525. package/dist/verifyconfig.test.js +0 -167
  526. package/dist/verifyconfig.test.js.map +0 -1
  527. package/src/custom.d.ts +0 -7
  528. package/src/devices-hap/airpurifier.ts +0 -563
  529. package/src/devices-hap/blindtilt.ts +0 -1049
  530. package/src/devices-hap/bot.ts +0 -900
  531. package/src/devices-hap/ceilinglight.ts +0 -742
  532. package/src/devices-hap/colorbulb.ts +0 -904
  533. package/src/devices-hap/contact.ts +0 -457
  534. package/src/devices-hap/curtain.ts +0 -944
  535. package/src/devices-hap/device.ts +0 -811
  536. package/src/devices-hap/fan.ts +0 -711
  537. package/src/devices-hap/hub.ts +0 -439
  538. package/src/devices-hap/humidifier.ts +0 -669
  539. package/src/devices-hap/iosensor.ts +0 -427
  540. package/src/devices-hap/lightstrip.ts +0 -836
  541. package/src/devices-hap/lock.ts +0 -620
  542. package/src/devices-hap/meter.ts +0 -426
  543. package/src/devices-hap/meterplus.ts +0 -430
  544. package/src/devices-hap/meterpro.ts +0 -522
  545. package/src/devices-hap/motion.ts +0 -390
  546. package/src/devices-hap/plug.ts +0 -423
  547. package/src/devices-hap/relayswitch.ts +0 -727
  548. package/src/devices-hap/robotvacuumcleaner.ts +0 -568
  549. package/src/devices-hap/waterdetector.ts +0 -400
  550. package/src/devices-matter/BaseMatterAccessory.ts +0 -131
  551. package/src/devices-matter/ColorLightAccessory.ts +0 -110
  552. package/src/devices-matter/ColorTemperatureLightAccessory.ts +0 -92
  553. package/src/devices-matter/ContactSensorAccessory.ts +0 -41
  554. package/src/devices-matter/DimmableLightAccessory.ts +0 -192
  555. package/src/devices-matter/DoorLockAccessory.ts +0 -60
  556. package/src/devices-matter/ExtendedColorLightAccessory.ts +0 -123
  557. package/src/devices-matter/FanAccessory.ts +0 -95
  558. package/src/devices-matter/HumiditySensorAccessory.ts +0 -41
  559. package/src/devices-matter/LeakSensorAccessory.ts +0 -40
  560. package/src/devices-matter/LightSensorAccessory.ts +0 -41
  561. package/src/devices-matter/OccupancySensorAccessory.ts +0 -48
  562. package/src/devices-matter/OnOffLightAccessory.ts +0 -133
  563. package/src/devices-matter/OnOffOutletAccessory.ts +0 -46
  564. package/src/devices-matter/OnOffSwitchAccessory.ts +0 -51
  565. package/src/devices-matter/RoboticVacuumAccessory.ts +0 -407
  566. package/src/devices-matter/SmokeCOAlarmAccessory.ts +0 -59
  567. package/src/devices-matter/TemperatureSensorAccessory.ts +0 -43
  568. package/src/devices-matter/ThermostatAccessory.ts +0 -110
  569. package/src/devices-matter/VenetianBlindAccessory.ts +0 -115
  570. package/src/devices-matter/WindowBlindAccessory.ts +0 -92
  571. package/src/devices-matter/custom/PowerStripAccessory.ts +0 -309
  572. package/src/devices-matter/custom/index.ts +0 -8
  573. package/src/devices-matter/index.ts +0 -29
  574. package/src/index.test.ts +0 -24
  575. package/src/irdevice/airconditioner.ts +0 -533
  576. package/src/irdevice/airpurifier.ts +0 -252
  577. package/src/irdevice/camera.ts +0 -129
  578. package/src/irdevice/fan.ts +0 -226
  579. package/src/irdevice/irdevice.ts +0 -344
  580. package/src/irdevice/light.ts +0 -246
  581. package/src/irdevice/other.ts +0 -790
  582. package/src/irdevice/tv.ts +0 -378
  583. package/src/irdevice/vacuumcleaner.ts +0 -126
  584. package/src/irdevice/waterheater.ts +0 -127
  585. package/src/platform-hap.ts +0 -2997
  586. package/src/platform-matter.ts +0 -1110
  587. package/src/utils.test.ts +0 -96
  588. package/src/verifyconfig.test.ts +0 -197
package/src/settings.ts CHANGED
@@ -1,283 +1,18 @@
1
- /* Copyright(C) 2017-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
- *
3
- * settings.ts: @switchbot/homebridge-switchbot platform class.
4
- */
5
- import type { IClientOptions } from 'async-mqtt'
6
- import type { PlatformConfig } from 'homebridge'
7
- /*
8
- * For Testing Locally:
9
- * import type { device, irdevice, SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '/Users/Shared/GitHub/OpenWonderLabs/node-switchbot/dist/index.js';
10
- */
11
- import type { device, irdevice, SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName, SwitchBotModel } from 'node-switchbot'
12
- /**
13
- * This is the name of the platform that users will use to register the plugin in the Homebridge config.json
14
- */
15
- export const PLATFORM_NAME = 'SwitchBot'
16
-
17
- /**
18
- * This must match the name of your plugin as defined the package.json
19
- */
20
1
  export const PLUGIN_NAME = '@switchbot/homebridge-switchbot'
2
+ export const PLATFORM_NAME = 'SwitchBot'
21
3
 
22
- // Config
23
- export interface SwitchBotPlatformConfig extends PlatformConfig {
24
- credentials?: credentials
25
- options?: options
26
- }
27
- interface credentials {
28
- token?: string
29
- secret?: string
30
- notice?: string
31
- }
32
-
33
- export interface options {
34
- devices?: devicesConfig[]
35
- deviceConfig?: { [deviceType: string]: devicesConfig }
36
- irdevices?: irDevicesConfig[]
37
- irdeviceConfig?: { [remoteType: string]: irDevicesConfig }
38
- allowInvalidCharacters?: boolean
39
- mqttURL?: string
40
- mqttOptions?: IClientOptions
41
- mqttPubOptions?: IClientOptions
42
- BLE?: boolean
43
- discoverBLE?: boolean
44
- disableLogsforBLE?: boolean
45
- disableLogsforOpenAPI?: boolean
46
- hostname?: string
47
- webhookURL?: string
48
- maxRetries?: number
49
- delayBetweenRetries?: number
50
- refreshRate?: number
51
- updateRate?: number
52
- pushRate?: number
53
- logging?: string
54
- };
55
-
56
- export type devicesConfig = botConfig | relaySwitch1Config | relaySwitch1PMConfig | meterConfig | meterProConfig | indoorOutdoorSensorConfig | humidifierConfig | curtainConfig | blindTiltConfig | contactConfig | motionConfig | waterDetectorConfig | plugConfig | colorBulbConfig | stripLightConfig | ceilingLightConfig | lockConfig | hubConfig
57
-
58
- export interface BaseDeviceConfig extends device {
59
- bleMac?: string
60
- model: SwitchBotModel
61
- bleModel: SwitchBotBLEModel
62
- bleModelName: SwitchBotBLEModelName
63
- bleModelFriednlyName: SwitchBotBLEModelFriendlyName
64
- configDeviceType: string
65
- configDeviceName?: string
66
- deviceId: string
67
- external?: boolean
68
- refreshRate?: number
69
- updateRate?: number
70
- pushRate?: number
71
- firmware?: string
72
- logging?: string
73
- connectionType?: string
74
- customBLEaddress?: string
75
- scanDuration?: number
76
- hide_device?: boolean
77
- offline?: boolean
78
- maxRetry?: number
79
- maxRetries?: number
80
- delayBetweenRetries?: number
81
- disableCaching?: boolean
82
- disablePlatformBLE?: boolean
83
- mqttURL?: string
84
- mqttOptions?: IClientOptions
85
- mqttPubOptions?: IClientOptions
86
- history?: boolean
87
- webhook?: boolean
4
+ export interface SwitchBotPluginConfig {
5
+ openApiToken?: string
6
+ openApiSecret?: string
7
+ preferMatter?: boolean
8
+ enableMatter?: boolean
9
+ // other plugin-specific configuration
10
+ [key: string]: any
88
11
  }
89
12
 
90
- export interface botConfig extends BaseDeviceConfig {
91
- configDeviceType: 'Bot'
92
- mode?: string
93
- type: string
94
- doublePress?: number
95
- pushRatePress?: number
96
- allowPush?: boolean
97
- multiPress?: boolean
98
- };
99
-
100
- export interface relaySwitch1Config extends BaseDeviceConfig {
101
- configDeviceType: 'Relay Switch 1'
102
- type: string
103
- allowPush?: boolean
104
- };
105
-
106
- export interface relaySwitch1PMConfig extends BaseDeviceConfig {
107
- configDeviceType: 'Relay Switch 1PM'
108
- type: string
109
- allowPush?: boolean
110
- };
111
-
112
- export interface meterConfig extends BaseDeviceConfig {
113
- configDeviceType: 'Meter' | 'MeterPlus'
114
- hide_temperature?: boolean
115
- convertUnitTo?: string
116
- hide_humidity?: boolean
117
- };
118
-
119
- export interface meterProConfig extends BaseDeviceConfig {
120
- configDeviceType: 'Meter Pro' | 'MeterPro(CO2)'
121
- hide_temperature?: boolean
122
- convertUnitTo?: string
123
- hide_humidity?: boolean
124
- hide_co2?: boolean
125
- };
126
-
127
- export interface indoorOutdoorSensorConfig extends BaseDeviceConfig {
128
- configDeviceType: 'WoIOSensor'
129
- hide_temperature?: boolean
130
- convertUnitTo?: string
131
- hide_humidity?: boolean
132
- };
133
-
134
- export interface humidifierConfig extends BaseDeviceConfig {
135
- configDeviceType: 'Humidifier' | 'Humidifier2'
136
- hide_temperature?: boolean
137
- convertUnitTo?: string
138
- set_minStep?: number
139
- };
140
-
141
- export interface curtainConfig extends BaseDeviceConfig {
142
- configDeviceType: 'Curtain' | 'Curtain3' | 'WoRollerShade' | 'Roller Shade'
143
- disable_group?: boolean
144
- hide_lightsensor?: boolean
145
- set_minLux?: number
146
- set_maxLux?: number
147
- set_max?: number
148
- set_min?: number
149
- set_minStep?: number
150
- setCloseMode?: string
151
- setOpenMode?: string
152
- silentModeSwitch?: boolean
153
- };
154
-
155
- export interface blindTiltConfig extends BaseDeviceConfig {
156
- configDeviceType: 'Blind Tilt'
157
- disable_group?: boolean
158
- mapping?: string
159
- hide_lightsensor?: boolean
160
- set_minLux?: number
161
- set_maxLux?: number
162
- set_max?: number
163
- set_min?: number
164
- set_minStep?: number
165
- setCloseMode?: string
166
- setOpenMode?: string
167
- silentModeSwitch?: boolean
168
- };
169
-
170
- export interface contactConfig extends BaseDeviceConfig {
171
- configDeviceType: 'Contact Sensor'
172
- hide_lightsensor?: boolean
173
- set_minLux?: number
174
- set_maxLux?: number
175
- hide_motionsensor?: boolean
176
- };
177
-
178
- export interface motionConfig extends BaseDeviceConfig {
179
- configDeviceType: 'Motion Sensor'
180
- hide_lightsensor?: boolean
181
- set_minLux?: number
182
- set_maxLux?: number
183
- };
184
-
185
- export interface waterDetectorConfig extends BaseDeviceConfig {
186
- configDeviceType: 'Water Detector'
187
- hide_leak?: boolean
188
- dry?: boolean
189
- };
190
-
191
- export interface plugConfig extends BaseDeviceConfig {
192
- configDeviceType: 'Plug' | 'Plug Mini (US)' | 'Plug Mini (JP)'
193
- };
194
-
195
- export interface colorBulbConfig extends BaseDeviceConfig {
196
- configDeviceType: 'Color Bulb'
197
- set_minStep?: number
198
- adaptiveLightingShift?: number
199
- };
200
-
201
- export interface stripLightConfig extends BaseDeviceConfig {
202
- configDeviceType: 'Strip Light'
203
- set_minStep?: number
204
- adaptiveLightingShift?: number
205
- };
206
-
207
- export interface ceilingLightConfig extends BaseDeviceConfig {
208
- configDeviceType: 'Ceiling Light' | 'Ceiling Light Pro'
209
- set_minStep?: number
210
- adaptiveLightingShift?: number
211
- };
212
-
213
- export interface lockConfig extends BaseDeviceConfig {
214
- configDeviceType: 'Smart Lock' | 'Smart Lock Pro'
215
- hide_contactsensor?: boolean
216
- activate_latchbutton?: boolean
217
- };
218
-
219
- export interface hubConfig extends BaseDeviceConfig {
220
- configDeviceType: 'Hub 2'
221
- hide_temperature?: boolean
222
- convertUnitTo?: string
223
- hide_humidity?: boolean
224
- hide_lightsensor?: boolean
225
- set_minLux?: number
226
- set_maxLux?: number
227
- };
228
-
229
- export type irDevicesConfig = irFanConfig | irLightConfig | irAirConfig | irOtherConfig
230
-
231
- export interface irBaseDeviceConfig extends irdevice {
232
- configDeviceName?: string
233
- configRemoteType?: string
234
- connectionType?: string
235
- hide_device?: boolean
236
- external?: boolean
237
- refreshRate?: number
238
- updateRate?: number
239
- pushRate?: number
240
- maxRetries?: number
241
- delayBetweenRetries?: number
242
- firmware?: string
243
- deviceId: string
244
- logging?: string
245
- customOn?: string
246
- customOff?: string
247
- customize?: boolean
248
- commandType?: string
249
- disablePushOn?: boolean
250
- disablePushOff?: boolean
251
- disablePushDetail?: boolean
13
+ export const DEFAULT_CONFIG: Partial<SwitchBotPluginConfig> = {
14
+ preferMatter: true,
15
+ enableMatter: true,
252
16
  }
253
17
 
254
- export interface irFanConfig extends irBaseDeviceConfig {
255
- configRemoteType?: 'Fan' | 'DIY Fan'
256
- swing_mode?: boolean
257
- rotation_speed?: boolean
258
- set_minStep?: number
259
- set_max?: number
260
- set_min?: number
261
- };
262
-
263
- export interface irLightConfig extends irBaseDeviceConfig {
264
- configRemoteType?: 'Light' | 'DIY Light'
265
- stateless?: boolean
266
- };
267
-
268
- export interface irAirConfig extends irBaseDeviceConfig {
269
- configRemoteType?: 'Air Conditioner' | 'DIY Air Conditioner'
270
- hide_automode?: boolean
271
- set_max_heat?: number
272
- set_min_heat?: number
273
- set_max_cool?: number
274
- set_min_cool?: number
275
- meterType?: string
276
- meterId?: string
277
- meterUuid?: string
278
- };
279
-
280
- export interface irOtherConfig extends irBaseDeviceConfig {
281
- configRemoteType?: 'Others'
282
- type?: string
283
- };
18
+ export type DeviceType = string
@@ -0,0 +1,251 @@
1
+ import type { SwitchBotPluginConfig } from './settings.js'
2
+ import { SwitchbotOperationError, SwitchbotAuthenticationError, CharacteristicMissingError } from './errors.js'
3
+
4
+ export interface ISwitchBotClient {
5
+ init(): Promise<void>
6
+ getDevice(id: string): Promise<any>
7
+ getDevices(): Promise<any[]>
8
+ setDeviceState(id: string, body: any): Promise<any>
9
+ destroy(): Promise<void>
10
+ }
11
+
12
+ /**
13
+ * Thin wrapper around node-switchbot v4.0.0-beta.2+
14
+ * Leverages upstream resilience features (retry, circuit breaker, connection intelligence)
15
+ * while maintaining plugin-specific features like write debouncing and OpenAPI fallback.
16
+ */
17
+ export class SwitchBotClient implements ISwitchBotClient {
18
+ private cfg: SwitchBotPluginConfig
19
+ private client: any | null = null
20
+ private baseUrl = 'https://api.switch-bot.com/v1.0'
21
+ private requestTimeout = 5000
22
+ private maxRetries = 2
23
+ private writeDebounceMs = 100
24
+ private logger: any
25
+ private pendingWrites: Map<string, { timer: any; body: any; resolvers: Array<{ resolve: (v:any)=>void; reject: (e:any)=>void }>; }> = new Map()
26
+
27
+ constructor(cfg: SwitchBotPluginConfig) {
28
+ this.cfg = cfg
29
+ this.logger = (cfg as any)?.logger ?? console
30
+ if (typeof (cfg as any)?.requestTimeout === 'number') this.requestTimeout = (cfg as any).requestTimeout
31
+ if (typeof (cfg as any)?.maxRetries === 'number') this.maxRetries = (cfg as any).maxRetries
32
+ if (typeof (cfg as any)?.writeDebounceMs === 'number') this.writeDebounceMs = (cfg as any).writeDebounceMs
33
+ }
34
+
35
+ async init(): Promise<void> {
36
+ try {
37
+ // Dynamic import of node-switchbot v4 with native resilience features
38
+ const { SwitchBot } = await import('node-switchbot')
39
+ this.client = new SwitchBot({
40
+ token: this.cfg.openApiToken,
41
+ secret: this.cfg.openApiSecret,
42
+ // Enable all built-in resilience features from node-switchbot v4
43
+ enableFallback: true, // Auto-fallback from BLE to API
44
+ enableRetry: true, // Retry with exponential backoff
45
+ enableCircuitBreaker: true, // Circuit breaker per connection type
46
+ enableMetrics: true, // Connection tracking and statistics
47
+ enableBLE: true, // Enable BLE scanning by default
48
+ scanDuration: 5000, // BLE scan duration in milliseconds
49
+ ...(typeof (this.cfg as any)?.nodeClientConfig === 'object' && (this.cfg as any).nodeClientConfig),
50
+ })
51
+ this.logger?.info?.('SwitchBot client initialized with native resilience features')
52
+ } catch (e) {
53
+ this.logger?.warn?.('Failed to load node-switchbot; will use OpenAPI fallback:', e)
54
+ this.client = null
55
+ }
56
+ }
57
+
58
+ private async fetchWithTimeoutAndRetry(url: string, opts: any = {}, timeoutMs?: number, retries?: number) {
59
+ const to = typeof timeoutMs === 'number' ? timeoutMs : this.requestTimeout
60
+ const max = typeof retries === 'number' ? retries : this.maxRetries
61
+
62
+ let attempt = 0
63
+ while (true) {
64
+ attempt += 1
65
+ const controller = new AbortController()
66
+ const timer = setTimeout(() => controller.abort(), to)
67
+ try {
68
+ const fetchOpts = Object.assign({}, opts)
69
+ try {
70
+ Object.defineProperty(fetchOpts, 'signal', { value: controller.signal, enumerable: false, configurable: true })
71
+ } catch (_e) {
72
+ // ignore
73
+ }
74
+ const resp = await fetch(url, fetchOpts)
75
+ clearTimeout(timer)
76
+ if (resp.ok) return resp
77
+ // server error / rate limit: retry
78
+ if (resp.status >= 500 || resp.status === 429) {
79
+ throw new Error(`retriable response: ${resp.status}`)
80
+ }
81
+ return resp
82
+ } catch (err: any) {
83
+ clearTimeout(timer)
84
+ if (attempt > max) throw err
85
+ // exponential backoff
86
+ const backoff = Math.min(100 * Math.pow(2, attempt - 1), 2000)
87
+ await new Promise((r) => setTimeout(r, backoff))
88
+ }
89
+ }
90
+ }
91
+
92
+ async getDevice(id: string): Promise<any> {
93
+ // Try client API first (with node-switchbot's smart fallback and retry)
94
+ if (this.client?.getDevice) {
95
+ try {
96
+ return await this.client.getDevice(id)
97
+ } catch (e: any) {
98
+ if (e instanceof SwitchbotAuthenticationError) {
99
+ this.logger?.error?.(`Authentication error for getDevice(${id}):`, e.message)
100
+ throw e
101
+ } else if (e instanceof SwitchbotOperationError) {
102
+ this.logger?.warn?.(`Operation error for getDevice(${id}):`, e.message, e.code)
103
+ } else if (e instanceof CharacteristicMissingError) {
104
+ this.logger?.warn?.(`Characteristic missing for getDevice(${id}):`, e.characteristic)
105
+ } else {
106
+ this.logger?.warn?.(`Client getDevice failed for ${id}, trying OpenAPI fallback:`, e)
107
+ }
108
+ }
109
+ }
110
+ // Fallback: call OpenAPI via HTTP
111
+ if (this.cfg.openApiToken) {
112
+ const url = `${this.baseUrl}/devices/${id}`
113
+ const opts = { headers: { Authorization: this.cfg.openApiToken } }
114
+ const resp = await this.fetchWithTimeoutAndRetry(url, opts)
115
+ return resp.json()
116
+ }
117
+ throw new SwitchbotOperationError('No SwitchBot client available', 'no_client')
118
+ }
119
+
120
+ async getDevices(): Promise<any[]> {
121
+ // Try client API first
122
+ if (this.client?.getDevices) {
123
+ try {
124
+ return await this.client.getDevices()
125
+ } catch (e) {
126
+ this.logger?.warn?.('Client getDevices failed, trying OpenAPI fallback:', e)
127
+ }
128
+ }
129
+ // Fallback: call OpenAPI
130
+ if (this.cfg.openApiToken) {
131
+ const url = `${this.baseUrl}/devices`
132
+ const opts = { headers: { Authorization: this.cfg.openApiToken } }
133
+ const resp = await this.fetchWithTimeoutAndRetry(url, opts)
134
+ const data = await resp.json()
135
+ return (data?.body || data) as any[]
136
+ }
137
+ return []
138
+ }
139
+
140
+ async setDeviceState(id: string, body: any): Promise<any> {
141
+ // Plugin-level debounce: coalesce rapid writes per device
142
+ if (!this.writeDebounceMs || this.writeDebounceMs <= 0) {
143
+ return this._doSetDeviceState(id, body)
144
+ }
145
+
146
+ return new Promise((resolve, reject) => {
147
+ const existing = this.pendingWrites.get(id)
148
+ if (existing) {
149
+ existing.body = body
150
+ existing.resolvers.push({ resolve, reject })
151
+ return
152
+ }
153
+
154
+ const resolvers: Array<{ resolve: (v:any)=>void; reject: (e:any)=>void }> = [{ resolve, reject }]
155
+ const timer = setTimeout(async () => {
156
+ const entry = this.pendingWrites.get(id)
157
+ if (!entry) return
158
+ this.pendingWrites.delete(id)
159
+ try {
160
+ const out = await this._doSetDeviceState(id, entry.body)
161
+ for (const r of entry.resolvers) r.resolve(out)
162
+ } catch (e: any) {
163
+ if (e instanceof SwitchbotAuthenticationError) {
164
+ this.logger?.error?.(`Authentication error for setDeviceState(${id}):`, e.message)
165
+ } else if (e instanceof SwitchbotOperationError) {
166
+ this.logger?.warn?.(`Operation error for setDeviceState(${id}):`, e.message, e.code)
167
+ } else if (e instanceof CharacteristicMissingError) {
168
+ this.logger?.warn?.(`Characteristic missing for setDeviceState(${id}):`, e.characteristic)
169
+ }
170
+ for (const r of entry.resolvers) r.reject(e)
171
+ }
172
+ }, this.writeDebounceMs)
173
+
174
+ this.pendingWrites.set(id, { timer, body, resolvers })
175
+ })
176
+ }
177
+
178
+ private async _doSetDeviceState(id: string, body: any): Promise<any> {
179
+ // Prefer client API (which has node-switchbot's native resilience)
180
+ if (this.client?.setDeviceState) {
181
+ try {
182
+ this.logger?.debug?.(`[${id}] Using client.setDeviceState()`)
183
+ const result = await this.client.setDeviceState(id, body)
184
+ this.logger?.debug?.(`[${id}] client.setDeviceState() response:`, result)
185
+ return result
186
+ } catch (e: any) {
187
+ if (e instanceof SwitchbotAuthenticationError) {
188
+ this.logger?.error?.(`Authentication error for setDeviceState(${id}):`, e.message)
189
+ throw e
190
+ } else if (e instanceof SwitchbotOperationError) {
191
+ this.logger?.warn?.(`Operation error for setDeviceState(${id}):`, e.message, e.code)
192
+ } else if (e instanceof CharacteristicMissingError) {
193
+ this.logger?.warn?.(`Characteristic missing for setDeviceState(${id}):`, e.characteristic)
194
+ } else {
195
+ this.logger?.warn?.(`Client setDeviceState failed for ${id}, trying fallback:`, e)
196
+ }
197
+ }
198
+ }
199
+
200
+ // Try generic sendCommand if available
201
+ if (this.client?.sendCommand) {
202
+ try {
203
+ this.logger?.debug?.(`[${id}] Using client.sendCommand()`)
204
+ const result = await this.client.sendCommand(id, body)
205
+ this.logger?.debug?.(`[${id}] client.sendCommand() response:`, result)
206
+ return result
207
+ } catch (e: any) {
208
+ if (e instanceof SwitchbotAuthenticationError) {
209
+ this.logger?.error?.(`Authentication error for sendCommand(${id}):`, e.message)
210
+ throw e
211
+ } else if (e instanceof SwitchbotOperationError) {
212
+ this.logger?.warn?.(`Operation error for sendCommand(${id}):`, e.message, e.code)
213
+ } else if (e instanceof CharacteristicMissingError) {
214
+ this.logger?.warn?.(`Characteristic missing for sendCommand(${id}):`, e.characteristic)
215
+ } else {
216
+ this.logger?.warn?.(`Client sendCommand failed for ${id}, trying OpenAPI:`, e)
217
+ }
218
+ }
219
+ }
220
+
221
+ // OpenAPI fallback
222
+ if (this.cfg.openApiToken) {
223
+ const url = `${this.baseUrl}/devices/${id}/commands`
224
+ const opts = {
225
+ method: 'POST',
226
+ headers: {
227
+ Authorization: this.cfg.openApiToken,
228
+ 'Content-Type': 'application/json',
229
+ },
230
+ body: JSON.stringify(body),
231
+ }
232
+ this.logger?.debug?.(`[${id}] Using OpenAPI fallback POST ${url}`)
233
+ this.logger?.debug?.(`[${id}] Request body:`, body)
234
+ const resp = await this.fetchWithTimeoutAndRetry(url, opts)
235
+ const result = await resp.json()
236
+ this.logger?.debug?.(`[${id}] OpenAPI response:`, result)
237
+ this.logger?.debug?.(`[${id}] Response status:`, resp.status, resp.statusText)
238
+ return result
239
+ }
240
+
241
+ throw new SwitchbotOperationError('No SwitchBot client available for setDeviceState', 'no_client')
242
+ }
243
+
244
+ async destroy(): Promise<void> {
245
+ if (this.client?.destroy) {
246
+ await this.client.destroy()
247
+ }
248
+ this.client = null
249
+ }
250
+ }
251
+