@switchbot/homebridge-switchbot 5.0.0-beta.13 → 5.0.0-beta.131

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 (593) 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 +198 -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 +165 -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 +277 -0
  25. package/dist/devices/genericDevice.d.ts.map +1 -0
  26. package/dist/devices/genericDevice.js +1396 -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 +212 -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 +62 -0
  51. package/dist/homebridge-ui/public/js/api.d.ts.map +1 -0
  52. package/dist/homebridge-ui/public/js/api.js +225 -0
  53. package/dist/homebridge-ui/public/js/api.js.map +1 -0
  54. package/dist/homebridge-ui/public/js/api.ts +279 -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 +3600 -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 +94 -0
  78. package/dist/homebridge-ui/public/js/devices.js.map +1 -0
  79. package/dist/homebridge-ui/public/js/devices.ts +114 -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 +494 -0
  98. package/dist/homebridge-ui/public/js/modals.js.map +1 -0
  99. package/dist/homebridge-ui/public/js/modals.ts +546 -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 +1587 -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 +208 -0
  172. package/src/devices/deviceBase.ts +141 -0
  173. package/src/devices/genericDevice.ts +1345 -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 +233 -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 +279 -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 +114 -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 +546 -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 +1601 -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 +110 -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/baseMatterAccessory.test.d.ts +0 -2
  284. package/dist/baseMatterAccessory.test.d.ts.map +0 -1
  285. package/dist/baseMatterAccessory.test.js +0 -71
  286. package/dist/baseMatterAccessory.test.js.map +0 -1
  287. package/dist/devices-hap/airpurifier.d.ts +0 -54
  288. package/dist/devices-hap/airpurifier.d.ts.map +0 -1
  289. package/dist/devices-hap/airpurifier.js +0 -527
  290. package/dist/devices-hap/airpurifier.js.map +0 -1
  291. package/dist/devices-hap/blindtilt.d.ts +0 -90
  292. package/dist/devices-hap/blindtilt.d.ts.map +0 -1
  293. package/dist/devices-hap/blindtilt.js +0 -974
  294. package/dist/devices-hap/blindtilt.js.map +0 -1
  295. package/dist/devices-hap/bot.d.ts +0 -102
  296. package/dist/devices-hap/bot.d.ts.map +0 -1
  297. package/dist/devices-hap/bot.js +0 -811
  298. package/dist/devices-hap/bot.js.map +0 -1
  299. package/dist/devices-hap/ceilinglight.d.ts +0 -85
  300. package/dist/devices-hap/ceilinglight.d.ts.map +0 -1
  301. package/dist/devices-hap/ceilinglight.js +0 -701
  302. package/dist/devices-hap/ceilinglight.js.map +0 -1
  303. package/dist/devices-hap/colorbulb.d.ts +0 -88
  304. package/dist/devices-hap/colorbulb.d.ts.map +0 -1
  305. package/dist/devices-hap/colorbulb.js +0 -881
  306. package/dist/devices-hap/colorbulb.js.map +0 -1
  307. package/dist/devices-hap/contact.d.ts +0 -44
  308. package/dist/devices-hap/contact.d.ts.map +0 -1
  309. package/dist/devices-hap/contact.js +0 -409
  310. package/dist/devices-hap/contact.js.map +0 -1
  311. package/dist/devices-hap/curtain.d.ts +0 -73
  312. package/dist/devices-hap/curtain.d.ts.map +0 -1
  313. package/dist/devices-hap/curtain.js +0 -869
  314. package/dist/devices-hap/curtain.js.map +0 -1
  315. package/dist/devices-hap/device.d.ts +0 -98
  316. package/dist/devices-hap/device.d.ts.map +0 -1
  317. package/dist/devices-hap/device.js +0 -749
  318. package/dist/devices-hap/device.js.map +0 -1
  319. package/dist/devices-hap/fan.d.ts +0 -69
  320. package/dist/devices-hap/fan.d.ts.map +0 -1
  321. package/dist/devices-hap/fan.js +0 -649
  322. package/dist/devices-hap/fan.js.map +0 -1
  323. package/dist/devices-hap/hub.d.ts +0 -37
  324. package/dist/devices-hap/hub.d.ts.map +0 -1
  325. package/dist/devices-hap/hub.js +0 -392
  326. package/dist/devices-hap/hub.js.map +0 -1
  327. package/dist/devices-hap/humidifier.d.ts +0 -68
  328. package/dist/devices-hap/humidifier.d.ts.map +0 -1
  329. package/dist/devices-hap/humidifier.js +0 -628
  330. package/dist/devices-hap/humidifier.js.map +0 -1
  331. package/dist/devices-hap/iosensor.d.ts +0 -42
  332. package/dist/devices-hap/iosensor.d.ts.map +0 -1
  333. package/dist/devices-hap/iosensor.js +0 -382
  334. package/dist/devices-hap/iosensor.js.map +0 -1
  335. package/dist/devices-hap/lightstrip.d.ts +0 -79
  336. package/dist/devices-hap/lightstrip.d.ts.map +0 -1
  337. package/dist/devices-hap/lightstrip.js +0 -797
  338. package/dist/devices-hap/lightstrip.js.map +0 -1
  339. package/dist/devices-hap/lock.d.ts +0 -53
  340. package/dist/devices-hap/lock.d.ts.map +0 -1
  341. package/dist/devices-hap/lock.js +0 -561
  342. package/dist/devices-hap/lock.js.map +0 -1
  343. package/dist/devices-hap/meter.d.ts +0 -37
  344. package/dist/devices-hap/meter.d.ts.map +0 -1
  345. package/dist/devices-hap/meter.js +0 -379
  346. package/dist/devices-hap/meter.js.map +0 -1
  347. package/dist/devices-hap/meterplus.d.ts +0 -42
  348. package/dist/devices-hap/meterplus.d.ts.map +0 -1
  349. package/dist/devices-hap/meterplus.js +0 -384
  350. package/dist/devices-hap/meterplus.js.map +0 -1
  351. package/dist/devices-hap/meterpro.d.ts +0 -43
  352. package/dist/devices-hap/meterpro.d.ts.map +0 -1
  353. package/dist/devices-hap/meterpro.js +0 -468
  354. package/dist/devices-hap/meterpro.js.map +0 -1
  355. package/dist/devices-hap/motion.d.ts +0 -42
  356. package/dist/devices-hap/motion.d.ts.map +0 -1
  357. package/dist/devices-hap/motion.js +0 -345
  358. package/dist/devices-hap/motion.js.map +0 -1
  359. package/dist/devices-hap/plug.d.ts +0 -49
  360. package/dist/devices-hap/plug.d.ts.map +0 -1
  361. package/dist/devices-hap/plug.js +0 -395
  362. package/dist/devices-hap/plug.js.map +0 -1
  363. package/dist/devices-hap/relayswitch.d.ts +0 -96
  364. package/dist/devices-hap/relayswitch.d.ts.map +0 -1
  365. package/dist/devices-hap/relayswitch.js +0 -642
  366. package/dist/devices-hap/relayswitch.js.map +0 -1
  367. package/dist/devices-hap/robotvacuumcleaner.d.ts +0 -54
  368. package/dist/devices-hap/robotvacuumcleaner.d.ts.map +0 -1
  369. package/dist/devices-hap/robotvacuumcleaner.js +0 -523
  370. package/dist/devices-hap/robotvacuumcleaner.js.map +0 -1
  371. package/dist/devices-hap/waterdetector.d.ts +0 -41
  372. package/dist/devices-hap/waterdetector.d.ts.map +0 -1
  373. package/dist/devices-hap/waterdetector.js +0 -356
  374. package/dist/devices-hap/waterdetector.js.map +0 -1
  375. package/dist/devices-matter/BaseMatterAccessory.d.ts +0 -78
  376. package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
  377. package/dist/devices-matter/BaseMatterAccessory.js +0 -220
  378. package/dist/devices-matter/BaseMatterAccessory.js.map +0 -1
  379. package/dist/devices-matter/ColorLightAccessory.d.ts +0 -20
  380. package/dist/devices-matter/ColorLightAccessory.d.ts.map +0 -1
  381. package/dist/devices-matter/ColorLightAccessory.js +0 -95
  382. package/dist/devices-matter/ColorLightAccessory.js.map +0 -1
  383. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +0 -18
  384. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +0 -1
  385. package/dist/devices-matter/ColorTemperatureLightAccessory.js +0 -76
  386. package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +0 -1
  387. package/dist/devices-matter/ContactSensorAccessory.d.ts +0 -12
  388. package/dist/devices-matter/ContactSensorAccessory.d.ts.map +0 -1
  389. package/dist/devices-matter/ContactSensorAccessory.js +0 -34
  390. package/dist/devices-matter/ContactSensorAccessory.js.map +0 -1
  391. package/dist/devices-matter/DimmableLightAccessory.d.ts +0 -58
  392. package/dist/devices-matter/DimmableLightAccessory.d.ts.map +0 -1
  393. package/dist/devices-matter/DimmableLightAccessory.js +0 -167
  394. package/dist/devices-matter/DimmableLightAccessory.js.map +0 -1
  395. package/dist/devices-matter/DoorLockAccessory.d.ts +0 -14
  396. package/dist/devices-matter/DoorLockAccessory.d.ts.map +0 -1
  397. package/dist/devices-matter/DoorLockAccessory.js +0 -50
  398. package/dist/devices-matter/DoorLockAccessory.js.map +0 -1
  399. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +0 -21
  400. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +0 -1
  401. package/dist/devices-matter/ExtendedColorLightAccessory.js +0 -106
  402. package/dist/devices-matter/ExtendedColorLightAccessory.js.map +0 -1
  403. package/dist/devices-matter/FanAccessory.d.ts +0 -16
  404. package/dist/devices-matter/FanAccessory.d.ts.map +0 -1
  405. package/dist/devices-matter/FanAccessory.js +0 -81
  406. package/dist/devices-matter/FanAccessory.js.map +0 -1
  407. package/dist/devices-matter/HumiditySensorAccessory.d.ts +0 -12
  408. package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +0 -1
  409. package/dist/devices-matter/HumiditySensorAccessory.js +0 -34
  410. package/dist/devices-matter/HumiditySensorAccessory.js.map +0 -1
  411. package/dist/devices-matter/LeakSensorAccessory.d.ts +0 -12
  412. package/dist/devices-matter/LeakSensorAccessory.d.ts.map +0 -1
  413. package/dist/devices-matter/LeakSensorAccessory.js +0 -33
  414. package/dist/devices-matter/LeakSensorAccessory.js.map +0 -1
  415. package/dist/devices-matter/LightSensorAccessory.d.ts +0 -12
  416. package/dist/devices-matter/LightSensorAccessory.d.ts.map +0 -1
  417. package/dist/devices-matter/LightSensorAccessory.js +0 -34
  418. package/dist/devices-matter/LightSensorAccessory.js.map +0 -1
  419. package/dist/devices-matter/OccupancySensorAccessory.d.ts +0 -12
  420. package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +0 -1
  421. package/dist/devices-matter/OccupancySensorAccessory.js +0 -39
  422. package/dist/devices-matter/OccupancySensorAccessory.js.map +0 -1
  423. package/dist/devices-matter/OnOffLightAccessory.d.ts +0 -38
  424. package/dist/devices-matter/OnOffLightAccessory.d.ts.map +0 -1
  425. package/dist/devices-matter/OnOffLightAccessory.js +0 -110
  426. package/dist/devices-matter/OnOffLightAccessory.js.map +0 -1
  427. package/dist/devices-matter/OnOffOutletAccessory.d.ts +0 -14
  428. package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +0 -1
  429. package/dist/devices-matter/OnOffOutletAccessory.js +0 -43
  430. package/dist/devices-matter/OnOffOutletAccessory.js.map +0 -1
  431. package/dist/devices-matter/OnOffSwitchAccessory.d.ts +0 -14
  432. package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +0 -1
  433. package/dist/devices-matter/OnOffSwitchAccessory.js +0 -42
  434. package/dist/devices-matter/OnOffSwitchAccessory.js.map +0 -1
  435. package/dist/devices-matter/RoboticVacuumAccessory.d.ts +0 -68
  436. package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +0 -1
  437. package/dist/devices-matter/RoboticVacuumAccessory.js +0 -334
  438. package/dist/devices-matter/RoboticVacuumAccessory.js.map +0 -1
  439. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +0 -11
  440. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +0 -1
  441. package/dist/devices-matter/SmokeCOAlarmAccessory.js +0 -49
  442. package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +0 -1
  443. package/dist/devices-matter/TemperatureSensorAccessory.d.ts +0 -12
  444. package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +0 -1
  445. package/dist/devices-matter/TemperatureSensorAccessory.js +0 -36
  446. package/dist/devices-matter/TemperatureSensorAccessory.js.map +0 -1
  447. package/dist/devices-matter/ThermostatAccessory.d.ts +0 -19
  448. package/dist/devices-matter/ThermostatAccessory.d.ts.map +0 -1
  449. package/dist/devices-matter/ThermostatAccessory.js +0 -95
  450. package/dist/devices-matter/ThermostatAccessory.js.map +0 -1
  451. package/dist/devices-matter/VenetianBlindAccessory.d.ts +0 -19
  452. package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +0 -1
  453. package/dist/devices-matter/VenetianBlindAccessory.js +0 -99
  454. package/dist/devices-matter/VenetianBlindAccessory.js.map +0 -1
  455. package/dist/devices-matter/WindowBlindAccessory.d.ts +0 -17
  456. package/dist/devices-matter/WindowBlindAccessory.d.ts.map +0 -1
  457. package/dist/devices-matter/WindowBlindAccessory.js +0 -80
  458. package/dist/devices-matter/WindowBlindAccessory.js.map +0 -1
  459. package/dist/devices-matter/custom/PowerStripAccessory.d.ts +0 -97
  460. package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +0 -1
  461. package/dist/devices-matter/custom/PowerStripAccessory.js +0 -265
  462. package/dist/devices-matter/custom/PowerStripAccessory.js.map +0 -1
  463. package/dist/devices-matter/custom/index.d.ts +0 -8
  464. package/dist/devices-matter/custom/index.d.ts.map +0 -1
  465. package/dist/devices-matter/custom/index.js +0 -8
  466. package/dist/devices-matter/custom/index.js.map +0 -1
  467. package/dist/devices-matter/index.d.ts +0 -29
  468. package/dist/devices-matter/index.d.ts.map +0 -1
  469. package/dist/devices-matter/index.js +0 -28
  470. package/dist/devices-matter/index.js.map +0 -1
  471. package/dist/index.test.d.ts +0 -2
  472. package/dist/index.test.d.ts.map +0 -1
  473. package/dist/index.test.js +0 -19
  474. package/dist/index.test.js.map +0 -1
  475. package/dist/irdevice/airconditioner.d.ts +0 -61
  476. package/dist/irdevice/airconditioner.d.ts.map +0 -1
  477. package/dist/irdevice/airconditioner.js +0 -472
  478. package/dist/irdevice/airconditioner.js.map +0 -1
  479. package/dist/irdevice/airpurifier.d.ts +0 -50
  480. package/dist/irdevice/airpurifier.d.ts.map +0 -1
  481. package/dist/irdevice/airpurifier.js +0 -213
  482. package/dist/irdevice/airpurifier.js.map +0 -1
  483. package/dist/irdevice/camera.d.ts +0 -32
  484. package/dist/irdevice/camera.d.ts.map +0 -1
  485. package/dist/irdevice/camera.js +0 -107
  486. package/dist/irdevice/camera.js.map +0 -1
  487. package/dist/irdevice/fan.d.ts +0 -36
  488. package/dist/irdevice/fan.d.ts.map +0 -1
  489. package/dist/irdevice/fan.js +0 -200
  490. package/dist/irdevice/fan.js.map +0 -1
  491. package/dist/irdevice/irdevice.d.ts +0 -68
  492. package/dist/irdevice/irdevice.d.ts.map +0 -1
  493. package/dist/irdevice/irdevice.js +0 -298
  494. package/dist/irdevice/irdevice.js.map +0 -1
  495. package/dist/irdevice/light.d.ts +0 -36
  496. package/dist/irdevice/light.d.ts.map +0 -1
  497. package/dist/irdevice/light.js +0 -206
  498. package/dist/irdevice/light.js.map +0 -1
  499. package/dist/irdevice/other.d.ts +0 -57
  500. package/dist/irdevice/other.d.ts.map +0 -1
  501. package/dist/irdevice/other.js +0 -778
  502. package/dist/irdevice/other.js.map +0 -1
  503. package/dist/irdevice/tv.d.ts +0 -45
  504. package/dist/irdevice/tv.d.ts.map +0 -1
  505. package/dist/irdevice/tv.js +0 -327
  506. package/dist/irdevice/tv.js.map +0 -1
  507. package/dist/irdevice/vacuumcleaner.d.ts +0 -28
  508. package/dist/irdevice/vacuumcleaner.d.ts.map +0 -1
  509. package/dist/irdevice/vacuumcleaner.js +0 -104
  510. package/dist/irdevice/vacuumcleaner.js.map +0 -1
  511. package/dist/irdevice/waterheater.d.ts +0 -30
  512. package/dist/irdevice/waterheater.d.ts.map +0 -1
  513. package/dist/irdevice/waterheater.js +0 -105
  514. package/dist/irdevice/waterheater.js.map +0 -1
  515. package/dist/platform-hap.d.ts +0 -149
  516. package/dist/platform-hap.d.ts.map +0 -1
  517. package/dist/platform-hap.js +0 -2861
  518. package/dist/platform-hap.js.map +0 -1
  519. package/dist/platform-matter.d.ts +0 -120
  520. package/dist/platform-matter.d.ts.map +0 -1
  521. package/dist/platform-matter.js +0 -999
  522. package/dist/platform-matter.js.map +0 -1
  523. package/dist/utils.test.d.ts +0 -2
  524. package/dist/utils.test.d.ts.map +0 -1
  525. package/dist/utils.test.js +0 -95
  526. package/dist/utils.test.js.map +0 -1
  527. package/dist/verifyconfig.test.d.ts +0 -2
  528. package/dist/verifyconfig.test.d.ts.map +0 -1
  529. package/dist/verifyconfig.test.js +0 -167
  530. package/dist/verifyconfig.test.js.map +0 -1
  531. package/src/baseMatterAccessory.test.ts +0 -88
  532. package/src/custom.d.ts +0 -7
  533. package/src/devices-hap/airpurifier.ts +0 -563
  534. package/src/devices-hap/blindtilt.ts +0 -1049
  535. package/src/devices-hap/bot.ts +0 -900
  536. package/src/devices-hap/ceilinglight.ts +0 -742
  537. package/src/devices-hap/colorbulb.ts +0 -904
  538. package/src/devices-hap/contact.ts +0 -457
  539. package/src/devices-hap/curtain.ts +0 -944
  540. package/src/devices-hap/device.ts +0 -811
  541. package/src/devices-hap/fan.ts +0 -711
  542. package/src/devices-hap/hub.ts +0 -439
  543. package/src/devices-hap/humidifier.ts +0 -669
  544. package/src/devices-hap/iosensor.ts +0 -427
  545. package/src/devices-hap/lightstrip.ts +0 -836
  546. package/src/devices-hap/lock.ts +0 -620
  547. package/src/devices-hap/meter.ts +0 -426
  548. package/src/devices-hap/meterplus.ts +0 -430
  549. package/src/devices-hap/meterpro.ts +0 -522
  550. package/src/devices-hap/motion.ts +0 -390
  551. package/src/devices-hap/plug.ts +0 -423
  552. package/src/devices-hap/relayswitch.ts +0 -727
  553. package/src/devices-hap/robotvacuumcleaner.ts +0 -568
  554. package/src/devices-hap/waterdetector.ts +0 -400
  555. package/src/devices-matter/BaseMatterAccessory.ts +0 -249
  556. package/src/devices-matter/ColorLightAccessory.ts +0 -110
  557. package/src/devices-matter/ColorTemperatureLightAccessory.ts +0 -90
  558. package/src/devices-matter/ContactSensorAccessory.ts +0 -41
  559. package/src/devices-matter/DimmableLightAccessory.ts +0 -192
  560. package/src/devices-matter/DoorLockAccessory.ts +0 -60
  561. package/src/devices-matter/ExtendedColorLightAccessory.ts +0 -122
  562. package/src/devices-matter/FanAccessory.ts +0 -95
  563. package/src/devices-matter/HumiditySensorAccessory.ts +0 -41
  564. package/src/devices-matter/LeakSensorAccessory.ts +0 -40
  565. package/src/devices-matter/LightSensorAccessory.ts +0 -41
  566. package/src/devices-matter/OccupancySensorAccessory.ts +0 -48
  567. package/src/devices-matter/OnOffLightAccessory.ts +0 -125
  568. package/src/devices-matter/OnOffOutletAccessory.ts +0 -51
  569. package/src/devices-matter/OnOffSwitchAccessory.ts +0 -51
  570. package/src/devices-matter/RoboticVacuumAccessory.ts +0 -407
  571. package/src/devices-matter/SmokeCOAlarmAccessory.ts +0 -59
  572. package/src/devices-matter/TemperatureSensorAccessory.ts +0 -43
  573. package/src/devices-matter/ThermostatAccessory.ts +0 -110
  574. package/src/devices-matter/VenetianBlindAccessory.ts +0 -115
  575. package/src/devices-matter/WindowBlindAccessory.ts +0 -92
  576. package/src/devices-matter/custom/PowerStripAccessory.ts +0 -309
  577. package/src/devices-matter/custom/index.ts +0 -8
  578. package/src/devices-matter/index.ts +0 -29
  579. package/src/index.test.ts +0 -24
  580. package/src/irdevice/airconditioner.ts +0 -533
  581. package/src/irdevice/airpurifier.ts +0 -252
  582. package/src/irdevice/camera.ts +0 -129
  583. package/src/irdevice/fan.ts +0 -226
  584. package/src/irdevice/irdevice.ts +0 -344
  585. package/src/irdevice/light.ts +0 -246
  586. package/src/irdevice/other.ts +0 -790
  587. package/src/irdevice/tv.ts +0 -378
  588. package/src/irdevice/vacuumcleaner.ts +0 -126
  589. package/src/irdevice/waterheater.ts +0 -127
  590. package/src/platform-hap.ts +0 -2997
  591. package/src/platform-matter.ts +0 -1124
  592. package/src/utils.test.ts +0 -96
  593. 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
+