@switchbot/homebridge-switchbot 5.0.0-beta.11 → 5.0.0-beta.111

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 (578) 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 +44 -0
  9. package/README.md +56 -3
  10. package/config.schema.json +170 -14787
  11. package/dist/device-types.d.ts +31 -0
  12. package/dist/device-types.d.ts.map +1 -0
  13. package/dist/device-types.js +216 -0
  14. package/dist/device-types.js.map +1 -0
  15. package/dist/deviceFactory.d.ts +13 -0
  16. package/dist/deviceFactory.d.ts.map +1 -0
  17. package/dist/deviceFactory.js +120 -0
  18. package/dist/deviceFactory.js.map +1 -0
  19. package/dist/devices/deviceBase.d.ts +50 -0
  20. package/dist/devices/deviceBase.d.ts.map +1 -0
  21. package/dist/devices/deviceBase.js +119 -0
  22. package/dist/devices/deviceBase.js.map +1 -0
  23. package/dist/devices/genericDevice.d.ts +298 -0
  24. package/dist/devices/genericDevice.d.ts.map +1 -0
  25. package/dist/devices/genericDevice.js +1067 -0
  26. package/dist/devices/genericDevice.js.map +1 -0
  27. package/dist/homebridge-ui/endpoints/config.d.ts +3 -0
  28. package/dist/homebridge-ui/endpoints/config.d.ts.map +1 -0
  29. package/dist/homebridge-ui/endpoints/config.js +104 -0
  30. package/dist/homebridge-ui/endpoints/config.js.map +1 -0
  31. package/dist/homebridge-ui/endpoints/credentials.d.ts +6 -0
  32. package/dist/homebridge-ui/endpoints/credentials.d.ts.map +1 -0
  33. package/dist/homebridge-ui/endpoints/credentials.js +65 -0
  34. package/dist/homebridge-ui/endpoints/credentials.js.map +1 -0
  35. package/dist/homebridge-ui/endpoints/devices.d.ts +6 -0
  36. package/dist/homebridge-ui/endpoints/devices.d.ts.map +1 -0
  37. package/dist/homebridge-ui/endpoints/devices.js +351 -0
  38. package/dist/homebridge-ui/endpoints/devices.js.map +1 -0
  39. package/dist/homebridge-ui/endpoints/discovery.d.ts +7 -0
  40. package/dist/homebridge-ui/endpoints/discovery.d.ts.map +1 -0
  41. package/dist/homebridge-ui/endpoints/discovery.js +171 -0
  42. package/dist/homebridge-ui/endpoints/discovery.js.map +1 -0
  43. package/dist/homebridge-ui/public/css/styles.css +254 -0
  44. package/dist/homebridge-ui/public/index.html +112 -247
  45. package/dist/homebridge-ui/public/js/api.d.ts +23 -0
  46. package/dist/homebridge-ui/public/js/api.d.ts.map +1 -0
  47. package/dist/homebridge-ui/public/js/api.js +188 -0
  48. package/dist/homebridge-ui/public/js/api.js.map +1 -0
  49. package/dist/homebridge-ui/public/js/api.ts +215 -0
  50. package/dist/homebridge-ui/public/js/app.d.ts +2 -0
  51. package/dist/homebridge-ui/public/js/app.d.ts.map +1 -0
  52. package/dist/homebridge-ui/public/js/app.js +1815 -0
  53. package/dist/homebridge-ui/public/js/app.js.map +7 -0
  54. package/dist/homebridge-ui/public/js/app.ts +22 -0
  55. package/dist/homebridge-ui/public/js/constants.d.ts +2 -0
  56. package/dist/homebridge-ui/public/js/constants.d.ts.map +1 -0
  57. package/dist/homebridge-ui/public/js/constants.js +2 -0
  58. package/dist/homebridge-ui/public/js/constants.js.map +1 -0
  59. package/dist/homebridge-ui/public/js/constants.ts +1 -0
  60. package/dist/homebridge-ui/public/js/credentials.d.ts +3 -0
  61. package/dist/homebridge-ui/public/js/credentials.d.ts.map +1 -0
  62. package/dist/homebridge-ui/public/js/credentials.js +96 -0
  63. package/dist/homebridge-ui/public/js/credentials.js.map +1 -0
  64. package/dist/homebridge-ui/public/js/credentials.ts +100 -0
  65. package/dist/homebridge-ui/public/js/devices-delete.d.ts +3 -0
  66. package/dist/homebridge-ui/public/js/devices-delete.d.ts.map +1 -0
  67. package/dist/homebridge-ui/public/js/devices-delete.js +206 -0
  68. package/dist/homebridge-ui/public/js/devices-delete.js.map +1 -0
  69. package/dist/homebridge-ui/public/js/devices-delete.ts +236 -0
  70. package/dist/homebridge-ui/public/js/devices.d.ts +9 -0
  71. package/dist/homebridge-ui/public/js/devices.d.ts.map +1 -0
  72. package/dist/homebridge-ui/public/js/devices.js +90 -0
  73. package/dist/homebridge-ui/public/js/devices.js.map +1 -0
  74. package/dist/homebridge-ui/public/js/devices.ts +98 -0
  75. package/dist/homebridge-ui/public/js/discovery.d.ts +3 -0
  76. package/dist/homebridge-ui/public/js/discovery.d.ts.map +1 -0
  77. package/dist/homebridge-ui/public/js/discovery.js +244 -0
  78. package/dist/homebridge-ui/public/js/discovery.js.map +1 -0
  79. package/dist/homebridge-ui/public/js/discovery.ts +290 -0
  80. package/dist/homebridge-ui/public/js/logger.d.ts +6 -0
  81. package/dist/homebridge-ui/public/js/logger.d.ts.map +1 -0
  82. package/dist/homebridge-ui/public/js/logger.js +12 -0
  83. package/dist/homebridge-ui/public/js/logger.js.map +1 -0
  84. package/dist/homebridge-ui/public/js/logger.ts +11 -0
  85. package/dist/homebridge-ui/public/js/modal.d.ts +5 -0
  86. package/dist/homebridge-ui/public/js/modal.d.ts.map +1 -0
  87. package/dist/homebridge-ui/public/js/modal.js +26 -0
  88. package/dist/homebridge-ui/public/js/modal.js.map +1 -0
  89. package/dist/homebridge-ui/public/js/modal.ts +28 -0
  90. package/dist/homebridge-ui/public/js/modals.d.ts +7 -0
  91. package/dist/homebridge-ui/public/js/modals.d.ts.map +1 -0
  92. package/dist/homebridge-ui/public/js/modals.js +323 -0
  93. package/dist/homebridge-ui/public/js/modals.js.map +1 -0
  94. package/dist/homebridge-ui/public/js/modals.ts +367 -0
  95. package/dist/homebridge-ui/public/js/render.d.ts +65 -0
  96. package/dist/homebridge-ui/public/js/render.d.ts.map +1 -0
  97. package/dist/homebridge-ui/public/js/render.js +499 -0
  98. package/dist/homebridge-ui/public/js/render.js.map +1 -0
  99. package/dist/homebridge-ui/public/js/render.ts +579 -0
  100. package/dist/homebridge-ui/public/js/toast.d.ts +6 -0
  101. package/dist/homebridge-ui/public/js/toast.d.ts.map +1 -0
  102. package/dist/homebridge-ui/public/js/toast.js +29 -0
  103. package/dist/homebridge-ui/public/js/toast.js.map +1 -0
  104. package/dist/homebridge-ui/public/js/toast.ts +37 -0
  105. package/dist/homebridge-ui/public/js/types.d.ts +23 -0
  106. package/dist/homebridge-ui/public/js/types.d.ts.map +1 -0
  107. package/dist/homebridge-ui/public/js/types.js +2 -0
  108. package/dist/homebridge-ui/public/js/types.js.map +1 -0
  109. package/dist/homebridge-ui/public/js/types.ts +26 -0
  110. package/dist/homebridge-ui/server.js +11 -41
  111. package/dist/homebridge-ui/server.js.map +1 -1
  112. package/dist/homebridge-ui/utils/config-parser.d.ts +35 -0
  113. package/dist/homebridge-ui/utils/config-parser.d.ts.map +1 -0
  114. package/dist/homebridge-ui/utils/config-parser.js +87 -0
  115. package/dist/homebridge-ui/utils/config-parser.js.map +1 -0
  116. package/dist/homebridge-ui/utils/device-migration.d.ts +35 -0
  117. package/dist/homebridge-ui/utils/device-migration.d.ts.map +1 -0
  118. package/dist/homebridge-ui/utils/device-migration.js +111 -0
  119. package/dist/homebridge-ui/utils/device-migration.js.map +1 -0
  120. package/dist/homebridge-ui/utils/logger.d.ts +7 -0
  121. package/dist/homebridge-ui/utils/logger.d.ts.map +1 -0
  122. package/dist/homebridge-ui/utils/logger.js +17 -0
  123. package/dist/homebridge-ui/utils/logger.js.map +1 -0
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +4 -65
  126. package/dist/index.js.map +1 -1
  127. package/dist/platform.d.ts +35 -0
  128. package/dist/platform.d.ts.map +1 -0
  129. package/dist/platform.js +1527 -0
  130. package/dist/platform.js.map +1 -0
  131. package/dist/settings.d.ts +10 -249
  132. package/dist/settings.d.ts.map +1 -1
  133. package/dist/settings.js +5 -30
  134. package/dist/settings.js.map +1 -1
  135. package/dist/switchbotClient.d.ts +32 -0
  136. package/dist/switchbotClient.d.ts.map +1 -0
  137. package/dist/switchbotClient.js +207 -0
  138. package/dist/switchbotClient.js.map +1 -0
  139. package/dist/utils.d.ts +39 -50
  140. package/dist/utils.d.ts.map +1 -1
  141. package/dist/utils.js +40 -688
  142. package/dist/utils.js.map +1 -1
  143. package/docs/assets/highlight.css +14 -0
  144. package/docs/assets/icons.js +1 -1
  145. package/docs/assets/icons.svg +1 -1
  146. package/docs/assets/main.js +2 -2
  147. package/docs/assets/style.css +3 -3
  148. package/docs/index.html +77 -13
  149. package/docs/variables/default.html +1 -1
  150. package/eslint.config.js +7 -8
  151. package/nodemon.json +2 -2
  152. package/package.json +35 -32
  153. package/scripts/build-ui.js +36 -0
  154. package/scripts/e2e/README.md +25 -0
  155. package/scripts/e2e/curtain-e2e.sh +70 -0
  156. package/scripts/e2e/fan-e2e.sh +75 -0
  157. package/scripts/e2e/light-advanced-e2e.sh +97 -0
  158. package/scripts/e2e/light-e2e.sh +75 -0
  159. package/scripts/e2e/list-accessories.sh +19 -0
  160. package/scripts/e2e/lock-e2e.sh +65 -0
  161. package/scripts/free-dev-ports.mjs +105 -0
  162. package/scripts/generate-matter-maps.js +60 -0
  163. package/scripts/run-e2e-local.sh +14 -0
  164. package/scripts/sync-device-types.mjs +28 -0
  165. package/src/device-types.ts +230 -0
  166. package/src/deviceFactory.ts +163 -0
  167. package/src/devices/deviceBase.ts +141 -0
  168. package/src/devices/genericDevice.ts +998 -0
  169. package/src/homebridge-ui/endpoints/config.ts +123 -0
  170. package/src/homebridge-ui/endpoints/credentials.ts +74 -0
  171. package/src/homebridge-ui/endpoints/devices.ts +383 -0
  172. package/src/homebridge-ui/endpoints/discovery.ts +191 -0
  173. package/src/homebridge-ui/public/css/styles.css +254 -0
  174. package/src/homebridge-ui/public/index.html +112 -247
  175. package/src/homebridge-ui/public/js/api.ts +215 -0
  176. package/src/homebridge-ui/public/js/app.ts +22 -0
  177. package/src/homebridge-ui/public/js/constants.ts +1 -0
  178. package/src/homebridge-ui/public/js/credentials.ts +100 -0
  179. package/src/homebridge-ui/public/js/devices-delete.ts +236 -0
  180. package/src/homebridge-ui/public/js/devices.ts +98 -0
  181. package/src/homebridge-ui/public/js/discovery.ts +290 -0
  182. package/src/homebridge-ui/public/js/logger.ts +11 -0
  183. package/src/homebridge-ui/public/js/modal.ts +28 -0
  184. package/src/homebridge-ui/public/js/modals.ts +367 -0
  185. package/src/homebridge-ui/public/js/render.ts +579 -0
  186. package/src/homebridge-ui/public/js/toast.ts +37 -0
  187. package/src/homebridge-ui/public/js/types.ts +26 -0
  188. package/src/homebridge-ui/server.ts +11 -43
  189. package/src/homebridge-ui/utils/config-parser.ts +108 -0
  190. package/src/homebridge-ui/utils/device-migration.ts +144 -0
  191. package/src/homebridge-ui/utils/logger.ts +17 -0
  192. package/src/index.ts +4 -66
  193. package/src/platform.ts +1539 -0
  194. package/src/settings.ts +12 -277
  195. package/src/switchbotClient.ts +216 -0
  196. package/src/utils.ts +46 -713
  197. package/switchbot-homebridge-switchbot-5.0.0.tgz +0 -0
  198. package/test/accessory-restore.spec.ts +73 -0
  199. package/test/device-mapping.spec.ts +37 -0
  200. package/test/deviceFactory.spec.ts +18 -0
  201. package/test/e2e/run-e2e.spec.ts +50 -0
  202. package/test/fan-swing.spec.ts +29 -0
  203. package/test/helpers/matter-harness.ts +53 -0
  204. package/test/lock-users.spec.ts +44 -0
  205. package/test/matter-childbridge.spec.ts +59 -0
  206. package/test/matter-descriptors.spec.ts +97 -0
  207. package/test/matter-device-state.spec.ts +101 -0
  208. package/test/matter-integration.spec.ts +111 -0
  209. package/test/platform.integration.spec.ts +55 -0
  210. package/test/switchbot-client-debounce.spec.ts +131 -0
  211. package/test/switchbot-client-openapi.spec.ts +56 -0
  212. package/test/switchbotClient.spec.ts +10 -0
  213. package/test/utils.spec.ts +36 -0
  214. package/todo/COMPLETED.md +229 -0
  215. package/todo/README.md +59 -0
  216. package/todo/TODO.md +176 -0
  217. package/todo/mockups/filtering-sorting.svg +112 -0
  218. package/todo/mockups/modal-switchbot-theme.svg +66 -0
  219. package/todo/mockups/signal-strength-visualization.svg +94 -0
  220. package/vitest.config.ts +7 -0
  221. package/coverage/base.css +0 -224
  222. package/coverage/block-navigation.js +0 -87
  223. package/coverage/clover.xml +0 -15847
  224. package/coverage/coverage-final.json +0 -42
  225. package/coverage/docs/assets/dmt/dmt-component-data.js.html +0 -85
  226. package/coverage/docs/assets/dmt/dmt-components.js.html +0 -286
  227. package/coverage/docs/assets/dmt/index.html +0 -131
  228. package/coverage/docs/assets/hierarchy.js.html +0 -85
  229. package/coverage/docs/assets/icons.js.html +0 -136
  230. package/coverage/docs/assets/index.html +0 -146
  231. package/coverage/docs/assets/main.js.html +0 -265
  232. package/coverage/favicon.png +0 -0
  233. package/coverage/index.html +0 -191
  234. package/coverage/prettify.css +0 -1
  235. package/coverage/prettify.js +0 -2
  236. package/coverage/sort-arrow-sprite.png +0 -0
  237. package/coverage/sorter.js +0 -196
  238. package/coverage/src/device/blindtilt.ts.html +0 -3238
  239. package/coverage/src/device/bot.ts.html +0 -2803
  240. package/coverage/src/device/ceilinglight.ts.html +0 -2338
  241. package/coverage/src/device/colorbulb.ts.html +0 -2824
  242. package/coverage/src/device/contact.ts.html +0 -1465
  243. package/coverage/src/device/curtain.ts.html +0 -2869
  244. package/coverage/src/device/device.ts.html +0 -2500
  245. package/coverage/src/device/fan.ts.html +0 -2242
  246. package/coverage/src/device/hub.ts.html +0 -1408
  247. package/coverage/src/device/humidifier.ts.html +0 -2116
  248. package/coverage/src/device/index.html +0 -416
  249. package/coverage/src/device/iosensor.ts.html +0 -1375
  250. package/coverage/src/device/lightstrip.ts.html +0 -2617
  251. package/coverage/src/device/lock.ts.html +0 -1963
  252. package/coverage/src/device/meter.ts.html +0 -1372
  253. package/coverage/src/device/meterplus.ts.html +0 -1384
  254. package/coverage/src/device/meterpro.ts.html +0 -1618
  255. package/coverage/src/device/motion.ts.html +0 -1264
  256. package/coverage/src/device/plug.ts.html +0 -1372
  257. package/coverage/src/device/relayswitch.ts.html +0 -2284
  258. package/coverage/src/device/robotvacuumcleaner.ts.html +0 -1810
  259. package/coverage/src/device/waterdetector.ts.html +0 -1294
  260. package/coverage/src/homebridge-ui/index.html +0 -116
  261. package/coverage/src/homebridge-ui/server.ts.html +0 -229
  262. package/coverage/src/index.html +0 -161
  263. package/coverage/src/index.ts.html +0 -124
  264. package/coverage/src/irdevice/airconditioner.ts.html +0 -1687
  265. package/coverage/src/irdevice/airpurifier.ts.html +0 -844
  266. package/coverage/src/irdevice/camera.ts.html +0 -475
  267. package/coverage/src/irdevice/fan.ts.html +0 -766
  268. package/coverage/src/irdevice/index.html +0 -251
  269. package/coverage/src/irdevice/irdevice.ts.html +0 -1117
  270. package/coverage/src/irdevice/light.ts.html +0 -826
  271. package/coverage/src/irdevice/other.ts.html +0 -2458
  272. package/coverage/src/irdevice/tv.ts.html +0 -1222
  273. package/coverage/src/irdevice/vacuumcleaner.ts.html +0 -466
  274. package/coverage/src/irdevice/waterheater.ts.html +0 -469
  275. package/coverage/src/platform.ts.html +0 -8776
  276. package/coverage/src/settings.ts.html +0 -934
  277. package/coverage/src/utils.ts.html +0 -2092
  278. package/dist/devices-hap/airpurifier.d.ts +0 -54
  279. package/dist/devices-hap/airpurifier.d.ts.map +0 -1
  280. package/dist/devices-hap/airpurifier.js +0 -527
  281. package/dist/devices-hap/airpurifier.js.map +0 -1
  282. package/dist/devices-hap/blindtilt.d.ts +0 -90
  283. package/dist/devices-hap/blindtilt.d.ts.map +0 -1
  284. package/dist/devices-hap/blindtilt.js +0 -974
  285. package/dist/devices-hap/blindtilt.js.map +0 -1
  286. package/dist/devices-hap/bot.d.ts +0 -102
  287. package/dist/devices-hap/bot.d.ts.map +0 -1
  288. package/dist/devices-hap/bot.js +0 -811
  289. package/dist/devices-hap/bot.js.map +0 -1
  290. package/dist/devices-hap/ceilinglight.d.ts +0 -85
  291. package/dist/devices-hap/ceilinglight.d.ts.map +0 -1
  292. package/dist/devices-hap/ceilinglight.js +0 -701
  293. package/dist/devices-hap/ceilinglight.js.map +0 -1
  294. package/dist/devices-hap/colorbulb.d.ts +0 -88
  295. package/dist/devices-hap/colorbulb.d.ts.map +0 -1
  296. package/dist/devices-hap/colorbulb.js +0 -881
  297. package/dist/devices-hap/colorbulb.js.map +0 -1
  298. package/dist/devices-hap/contact.d.ts +0 -44
  299. package/dist/devices-hap/contact.d.ts.map +0 -1
  300. package/dist/devices-hap/contact.js +0 -409
  301. package/dist/devices-hap/contact.js.map +0 -1
  302. package/dist/devices-hap/curtain.d.ts +0 -73
  303. package/dist/devices-hap/curtain.d.ts.map +0 -1
  304. package/dist/devices-hap/curtain.js +0 -869
  305. package/dist/devices-hap/curtain.js.map +0 -1
  306. package/dist/devices-hap/device.d.ts +0 -98
  307. package/dist/devices-hap/device.d.ts.map +0 -1
  308. package/dist/devices-hap/device.js +0 -749
  309. package/dist/devices-hap/device.js.map +0 -1
  310. package/dist/devices-hap/fan.d.ts +0 -69
  311. package/dist/devices-hap/fan.d.ts.map +0 -1
  312. package/dist/devices-hap/fan.js +0 -649
  313. package/dist/devices-hap/fan.js.map +0 -1
  314. package/dist/devices-hap/hub.d.ts +0 -37
  315. package/dist/devices-hap/hub.d.ts.map +0 -1
  316. package/dist/devices-hap/hub.js +0 -392
  317. package/dist/devices-hap/hub.js.map +0 -1
  318. package/dist/devices-hap/humidifier.d.ts +0 -68
  319. package/dist/devices-hap/humidifier.d.ts.map +0 -1
  320. package/dist/devices-hap/humidifier.js +0 -628
  321. package/dist/devices-hap/humidifier.js.map +0 -1
  322. package/dist/devices-hap/iosensor.d.ts +0 -42
  323. package/dist/devices-hap/iosensor.d.ts.map +0 -1
  324. package/dist/devices-hap/iosensor.js +0 -382
  325. package/dist/devices-hap/iosensor.js.map +0 -1
  326. package/dist/devices-hap/lightstrip.d.ts +0 -79
  327. package/dist/devices-hap/lightstrip.d.ts.map +0 -1
  328. package/dist/devices-hap/lightstrip.js +0 -797
  329. package/dist/devices-hap/lightstrip.js.map +0 -1
  330. package/dist/devices-hap/lock.d.ts +0 -53
  331. package/dist/devices-hap/lock.d.ts.map +0 -1
  332. package/dist/devices-hap/lock.js +0 -561
  333. package/dist/devices-hap/lock.js.map +0 -1
  334. package/dist/devices-hap/meter.d.ts +0 -37
  335. package/dist/devices-hap/meter.d.ts.map +0 -1
  336. package/dist/devices-hap/meter.js +0 -379
  337. package/dist/devices-hap/meter.js.map +0 -1
  338. package/dist/devices-hap/meterplus.d.ts +0 -42
  339. package/dist/devices-hap/meterplus.d.ts.map +0 -1
  340. package/dist/devices-hap/meterplus.js +0 -384
  341. package/dist/devices-hap/meterplus.js.map +0 -1
  342. package/dist/devices-hap/meterpro.d.ts +0 -43
  343. package/dist/devices-hap/meterpro.d.ts.map +0 -1
  344. package/dist/devices-hap/meterpro.js +0 -468
  345. package/dist/devices-hap/meterpro.js.map +0 -1
  346. package/dist/devices-hap/motion.d.ts +0 -42
  347. package/dist/devices-hap/motion.d.ts.map +0 -1
  348. package/dist/devices-hap/motion.js +0 -345
  349. package/dist/devices-hap/motion.js.map +0 -1
  350. package/dist/devices-hap/plug.d.ts +0 -49
  351. package/dist/devices-hap/plug.d.ts.map +0 -1
  352. package/dist/devices-hap/plug.js +0 -395
  353. package/dist/devices-hap/plug.js.map +0 -1
  354. package/dist/devices-hap/relayswitch.d.ts +0 -96
  355. package/dist/devices-hap/relayswitch.d.ts.map +0 -1
  356. package/dist/devices-hap/relayswitch.js +0 -642
  357. package/dist/devices-hap/relayswitch.js.map +0 -1
  358. package/dist/devices-hap/robotvacuumcleaner.d.ts +0 -54
  359. package/dist/devices-hap/robotvacuumcleaner.d.ts.map +0 -1
  360. package/dist/devices-hap/robotvacuumcleaner.js +0 -523
  361. package/dist/devices-hap/robotvacuumcleaner.js.map +0 -1
  362. package/dist/devices-hap/waterdetector.d.ts +0 -41
  363. package/dist/devices-hap/waterdetector.d.ts.map +0 -1
  364. package/dist/devices-hap/waterdetector.js +0 -356
  365. package/dist/devices-hap/waterdetector.js.map +0 -1
  366. package/dist/devices-matter/BaseMatterAccessory.d.ts +0 -63
  367. package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
  368. package/dist/devices-matter/BaseMatterAccessory.js +0 -100
  369. package/dist/devices-matter/BaseMatterAccessory.js.map +0 -1
  370. package/dist/devices-matter/ColorLightAccessory.d.ts +0 -20
  371. package/dist/devices-matter/ColorLightAccessory.d.ts.map +0 -1
  372. package/dist/devices-matter/ColorLightAccessory.js +0 -95
  373. package/dist/devices-matter/ColorLightAccessory.js.map +0 -1
  374. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +0 -18
  375. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +0 -1
  376. package/dist/devices-matter/ColorTemperatureLightAccessory.js +0 -78
  377. package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +0 -1
  378. package/dist/devices-matter/ContactSensorAccessory.d.ts +0 -12
  379. package/dist/devices-matter/ContactSensorAccessory.d.ts.map +0 -1
  380. package/dist/devices-matter/ContactSensorAccessory.js +0 -34
  381. package/dist/devices-matter/ContactSensorAccessory.js.map +0 -1
  382. package/dist/devices-matter/DimmableLightAccessory.d.ts +0 -58
  383. package/dist/devices-matter/DimmableLightAccessory.d.ts.map +0 -1
  384. package/dist/devices-matter/DimmableLightAccessory.js +0 -167
  385. package/dist/devices-matter/DimmableLightAccessory.js.map +0 -1
  386. package/dist/devices-matter/DoorLockAccessory.d.ts +0 -14
  387. package/dist/devices-matter/DoorLockAccessory.d.ts.map +0 -1
  388. package/dist/devices-matter/DoorLockAccessory.js +0 -50
  389. package/dist/devices-matter/DoorLockAccessory.js.map +0 -1
  390. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +0 -21
  391. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +0 -1
  392. package/dist/devices-matter/ExtendedColorLightAccessory.js +0 -107
  393. package/dist/devices-matter/ExtendedColorLightAccessory.js.map +0 -1
  394. package/dist/devices-matter/FanAccessory.d.ts +0 -16
  395. package/dist/devices-matter/FanAccessory.d.ts.map +0 -1
  396. package/dist/devices-matter/FanAccessory.js +0 -81
  397. package/dist/devices-matter/FanAccessory.js.map +0 -1
  398. package/dist/devices-matter/HumiditySensorAccessory.d.ts +0 -12
  399. package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +0 -1
  400. package/dist/devices-matter/HumiditySensorAccessory.js +0 -34
  401. package/dist/devices-matter/HumiditySensorAccessory.js.map +0 -1
  402. package/dist/devices-matter/LeakSensorAccessory.d.ts +0 -12
  403. package/dist/devices-matter/LeakSensorAccessory.d.ts.map +0 -1
  404. package/dist/devices-matter/LeakSensorAccessory.js +0 -33
  405. package/dist/devices-matter/LeakSensorAccessory.js.map +0 -1
  406. package/dist/devices-matter/LightSensorAccessory.d.ts +0 -12
  407. package/dist/devices-matter/LightSensorAccessory.d.ts.map +0 -1
  408. package/dist/devices-matter/LightSensorAccessory.js +0 -34
  409. package/dist/devices-matter/LightSensorAccessory.js.map +0 -1
  410. package/dist/devices-matter/OccupancySensorAccessory.d.ts +0 -12
  411. package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +0 -1
  412. package/dist/devices-matter/OccupancySensorAccessory.js +0 -39
  413. package/dist/devices-matter/OccupancySensorAccessory.js.map +0 -1
  414. package/dist/devices-matter/OnOffLightAccessory.d.ts +0 -38
  415. package/dist/devices-matter/OnOffLightAccessory.d.ts.map +0 -1
  416. package/dist/devices-matter/OnOffLightAccessory.js +0 -118
  417. package/dist/devices-matter/OnOffLightAccessory.js.map +0 -1
  418. package/dist/devices-matter/OnOffOutletAccessory.d.ts +0 -12
  419. package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +0 -1
  420. package/dist/devices-matter/OnOffOutletAccessory.js +0 -40
  421. package/dist/devices-matter/OnOffOutletAccessory.js.map +0 -1
  422. package/dist/devices-matter/OnOffSwitchAccessory.d.ts +0 -14
  423. package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +0 -1
  424. package/dist/devices-matter/OnOffSwitchAccessory.js +0 -42
  425. package/dist/devices-matter/OnOffSwitchAccessory.js.map +0 -1
  426. package/dist/devices-matter/RoboticVacuumAccessory.d.ts +0 -68
  427. package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +0 -1
  428. package/dist/devices-matter/RoboticVacuumAccessory.js +0 -334
  429. package/dist/devices-matter/RoboticVacuumAccessory.js.map +0 -1
  430. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +0 -11
  431. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +0 -1
  432. package/dist/devices-matter/SmokeCOAlarmAccessory.js +0 -49
  433. package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +0 -1
  434. package/dist/devices-matter/TemperatureSensorAccessory.d.ts +0 -12
  435. package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +0 -1
  436. package/dist/devices-matter/TemperatureSensorAccessory.js +0 -36
  437. package/dist/devices-matter/TemperatureSensorAccessory.js.map +0 -1
  438. package/dist/devices-matter/ThermostatAccessory.d.ts +0 -19
  439. package/dist/devices-matter/ThermostatAccessory.d.ts.map +0 -1
  440. package/dist/devices-matter/ThermostatAccessory.js +0 -95
  441. package/dist/devices-matter/ThermostatAccessory.js.map +0 -1
  442. package/dist/devices-matter/VenetianBlindAccessory.d.ts +0 -19
  443. package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +0 -1
  444. package/dist/devices-matter/VenetianBlindAccessory.js +0 -99
  445. package/dist/devices-matter/VenetianBlindAccessory.js.map +0 -1
  446. package/dist/devices-matter/WindowBlindAccessory.d.ts +0 -17
  447. package/dist/devices-matter/WindowBlindAccessory.d.ts.map +0 -1
  448. package/dist/devices-matter/WindowBlindAccessory.js +0 -80
  449. package/dist/devices-matter/WindowBlindAccessory.js.map +0 -1
  450. package/dist/devices-matter/custom/PowerStripAccessory.d.ts +0 -97
  451. package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +0 -1
  452. package/dist/devices-matter/custom/PowerStripAccessory.js +0 -265
  453. package/dist/devices-matter/custom/PowerStripAccessory.js.map +0 -1
  454. package/dist/devices-matter/custom/index.d.ts +0 -8
  455. package/dist/devices-matter/custom/index.d.ts.map +0 -1
  456. package/dist/devices-matter/custom/index.js +0 -8
  457. package/dist/devices-matter/custom/index.js.map +0 -1
  458. package/dist/devices-matter/index.d.ts +0 -29
  459. package/dist/devices-matter/index.d.ts.map +0 -1
  460. package/dist/devices-matter/index.js +0 -28
  461. package/dist/devices-matter/index.js.map +0 -1
  462. package/dist/index.test.d.ts +0 -2
  463. package/dist/index.test.d.ts.map +0 -1
  464. package/dist/index.test.js +0 -19
  465. package/dist/index.test.js.map +0 -1
  466. package/dist/irdevice/airconditioner.d.ts +0 -61
  467. package/dist/irdevice/airconditioner.d.ts.map +0 -1
  468. package/dist/irdevice/airconditioner.js +0 -472
  469. package/dist/irdevice/airconditioner.js.map +0 -1
  470. package/dist/irdevice/airpurifier.d.ts +0 -50
  471. package/dist/irdevice/airpurifier.d.ts.map +0 -1
  472. package/dist/irdevice/airpurifier.js +0 -213
  473. package/dist/irdevice/airpurifier.js.map +0 -1
  474. package/dist/irdevice/camera.d.ts +0 -32
  475. package/dist/irdevice/camera.d.ts.map +0 -1
  476. package/dist/irdevice/camera.js +0 -107
  477. package/dist/irdevice/camera.js.map +0 -1
  478. package/dist/irdevice/fan.d.ts +0 -36
  479. package/dist/irdevice/fan.d.ts.map +0 -1
  480. package/dist/irdevice/fan.js +0 -200
  481. package/dist/irdevice/fan.js.map +0 -1
  482. package/dist/irdevice/irdevice.d.ts +0 -68
  483. package/dist/irdevice/irdevice.d.ts.map +0 -1
  484. package/dist/irdevice/irdevice.js +0 -298
  485. package/dist/irdevice/irdevice.js.map +0 -1
  486. package/dist/irdevice/light.d.ts +0 -36
  487. package/dist/irdevice/light.d.ts.map +0 -1
  488. package/dist/irdevice/light.js +0 -206
  489. package/dist/irdevice/light.js.map +0 -1
  490. package/dist/irdevice/other.d.ts +0 -57
  491. package/dist/irdevice/other.d.ts.map +0 -1
  492. package/dist/irdevice/other.js +0 -778
  493. package/dist/irdevice/other.js.map +0 -1
  494. package/dist/irdevice/tv.d.ts +0 -45
  495. package/dist/irdevice/tv.d.ts.map +0 -1
  496. package/dist/irdevice/tv.js +0 -327
  497. package/dist/irdevice/tv.js.map +0 -1
  498. package/dist/irdevice/vacuumcleaner.d.ts +0 -28
  499. package/dist/irdevice/vacuumcleaner.d.ts.map +0 -1
  500. package/dist/irdevice/vacuumcleaner.js +0 -104
  501. package/dist/irdevice/vacuumcleaner.js.map +0 -1
  502. package/dist/irdevice/waterheater.d.ts +0 -30
  503. package/dist/irdevice/waterheater.d.ts.map +0 -1
  504. package/dist/irdevice/waterheater.js +0 -105
  505. package/dist/irdevice/waterheater.js.map +0 -1
  506. package/dist/platform-hap.d.ts +0 -149
  507. package/dist/platform-hap.d.ts.map +0 -1
  508. package/dist/platform-hap.js +0 -2861
  509. package/dist/platform-hap.js.map +0 -1
  510. package/dist/platform-matter.d.ts +0 -120
  511. package/dist/platform-matter.d.ts.map +0 -1
  512. package/dist/platform-matter.js +0 -984
  513. package/dist/platform-matter.js.map +0 -1
  514. package/dist/verifyconfig.test.d.ts +0 -2
  515. package/dist/verifyconfig.test.d.ts.map +0 -1
  516. package/dist/verifyconfig.test.js +0 -167
  517. package/dist/verifyconfig.test.js.map +0 -1
  518. package/src/custom.d.ts +0 -7
  519. package/src/devices-hap/airpurifier.ts +0 -563
  520. package/src/devices-hap/blindtilt.ts +0 -1049
  521. package/src/devices-hap/bot.ts +0 -900
  522. package/src/devices-hap/ceilinglight.ts +0 -742
  523. package/src/devices-hap/colorbulb.ts +0 -904
  524. package/src/devices-hap/contact.ts +0 -457
  525. package/src/devices-hap/curtain.ts +0 -944
  526. package/src/devices-hap/device.ts +0 -811
  527. package/src/devices-hap/fan.ts +0 -711
  528. package/src/devices-hap/hub.ts +0 -439
  529. package/src/devices-hap/humidifier.ts +0 -669
  530. package/src/devices-hap/iosensor.ts +0 -427
  531. package/src/devices-hap/lightstrip.ts +0 -836
  532. package/src/devices-hap/lock.ts +0 -620
  533. package/src/devices-hap/meter.ts +0 -426
  534. package/src/devices-hap/meterplus.ts +0 -430
  535. package/src/devices-hap/meterpro.ts +0 -522
  536. package/src/devices-hap/motion.ts +0 -390
  537. package/src/devices-hap/plug.ts +0 -423
  538. package/src/devices-hap/relayswitch.ts +0 -727
  539. package/src/devices-hap/robotvacuumcleaner.ts +0 -568
  540. package/src/devices-hap/waterdetector.ts +0 -400
  541. package/src/devices-matter/BaseMatterAccessory.ts +0 -131
  542. package/src/devices-matter/ColorLightAccessory.ts +0 -110
  543. package/src/devices-matter/ColorTemperatureLightAccessory.ts +0 -92
  544. package/src/devices-matter/ContactSensorAccessory.ts +0 -41
  545. package/src/devices-matter/DimmableLightAccessory.ts +0 -192
  546. package/src/devices-matter/DoorLockAccessory.ts +0 -60
  547. package/src/devices-matter/ExtendedColorLightAccessory.ts +0 -123
  548. package/src/devices-matter/FanAccessory.ts +0 -95
  549. package/src/devices-matter/HumiditySensorAccessory.ts +0 -41
  550. package/src/devices-matter/LeakSensorAccessory.ts +0 -40
  551. package/src/devices-matter/LightSensorAccessory.ts +0 -41
  552. package/src/devices-matter/OccupancySensorAccessory.ts +0 -48
  553. package/src/devices-matter/OnOffLightAccessory.ts +0 -133
  554. package/src/devices-matter/OnOffOutletAccessory.ts +0 -46
  555. package/src/devices-matter/OnOffSwitchAccessory.ts +0 -51
  556. package/src/devices-matter/RoboticVacuumAccessory.ts +0 -407
  557. package/src/devices-matter/SmokeCOAlarmAccessory.ts +0 -59
  558. package/src/devices-matter/TemperatureSensorAccessory.ts +0 -43
  559. package/src/devices-matter/ThermostatAccessory.ts +0 -110
  560. package/src/devices-matter/VenetianBlindAccessory.ts +0 -115
  561. package/src/devices-matter/WindowBlindAccessory.ts +0 -92
  562. package/src/devices-matter/custom/PowerStripAccessory.ts +0 -309
  563. package/src/devices-matter/custom/index.ts +0 -8
  564. package/src/devices-matter/index.ts +0 -29
  565. package/src/index.test.ts +0 -24
  566. package/src/irdevice/airconditioner.ts +0 -533
  567. package/src/irdevice/airpurifier.ts +0 -252
  568. package/src/irdevice/camera.ts +0 -129
  569. package/src/irdevice/fan.ts +0 -226
  570. package/src/irdevice/irdevice.ts +0 -344
  571. package/src/irdevice/light.ts +0 -246
  572. package/src/irdevice/other.ts +0 -790
  573. package/src/irdevice/tv.ts +0 -378
  574. package/src/irdevice/vacuumcleaner.ts +0 -126
  575. package/src/irdevice/waterheater.ts +0 -127
  576. package/src/platform-hap.ts +0 -2997
  577. package/src/platform-matter.ts +0 -1110
  578. package/src/verifyconfig.test.ts +0 -197
@@ -0,0 +1,230 @@
1
+ export const DEVICE_TYPES = {
2
+ 'Window Coverings': ['Blind Tilt', 'Curtain', 'Curtain3', 'Roller Shade'],
3
+ 'Locks & Access': [
4
+ 'Keypad',
5
+ 'Keypad Touch',
6
+ 'Keypad Vision',
7
+ 'Keypad Vision Pro',
8
+ 'Lock Vision Pro',
9
+ 'Lock Lite',
10
+ 'Smart Lock',
11
+ 'Smart Lock Pro',
12
+ 'Smart Lock Ultra',
13
+ 'Video Doorbell',
14
+ ],
15
+ 'Sensors': ['Contact Sensor', 'Motion Sensor', 'Presence Sensor', 'Water Detector'],
16
+ 'Lighting': [
17
+ 'Candle Warmer Lamp',
18
+ 'Ceiling Light',
19
+ 'Ceiling Light Pro',
20
+ 'Color Bulb',
21
+ 'Floor Lamp',
22
+ 'RGBIC Neon Rope Light',
23
+ 'RGBIC Neon Wire Rope Light',
24
+ 'RGBICWW Floor Lamp',
25
+ 'RGBICWW Strip Light',
26
+ 'Strip Light',
27
+ 'Strip Light 3',
28
+ ],
29
+ 'Climate Control': [
30
+ 'Air Purifier PM2.5',
31
+ 'Air Purifier Table PM2.5',
32
+ 'Air Purifier VOC',
33
+ 'Air Purifier Table VOC',
34
+ 'Battery Circulator Fan',
35
+ 'Circulator Fan',
36
+ 'Humidifier',
37
+ 'Humidifier2',
38
+ 'Meter',
39
+ 'MeterPlus',
40
+ 'Meter Plus',
41
+ 'MeterPro',
42
+ 'Meter Pro',
43
+ 'MeterPro(CO2)',
44
+ 'Meter Pro (CO2)',
45
+ 'Smart Radiator Thermostat',
46
+ 'Standing Circulator Fan',
47
+ 'WoIOSensor',
48
+ ],
49
+ 'Plugs & Switches': [
50
+ 'Garage Door Opener',
51
+ 'Plug',
52
+ 'Plug Mini (EU)',
53
+ 'Plug Mini (JP)',
54
+ 'Plug Mini (US)',
55
+ 'Relay Switch 1',
56
+ 'Relay Switch 1PM',
57
+ 'Relay Switch 2PM',
58
+ ],
59
+ 'Robot Vacuums': [
60
+ 'K10+',
61
+ 'K10+ Pro',
62
+ 'Robot Vacuum Cleaner K10+ Pro Combo',
63
+ 'Robot Vacuum Cleaner K11+',
64
+ 'Robot Vacuum Cleaner K20 Plus Pro',
65
+ 'Robot Vacuum Cleaner S1',
66
+ 'Robot Vacuum Cleaner S1 Plus',
67
+ 'Robot Vacuum Cleaner S10',
68
+ 'Robot Vacuum Cleaner S20',
69
+ ],
70
+ 'Hubs': ['AI Hub', 'Hub', 'Hub 2', 'Hub 3', 'Hub Mini', 'Hub Plus'],
71
+ 'Cameras': [
72
+ 'Indoor Cam',
73
+ 'Pan/Tilt Cam',
74
+ 'Pan/Tilt Cam 2K',
75
+ 'Pan/Tilt Cam Plus 2K',
76
+ 'Pan/Tilt Cam Plus 3K',
77
+ ],
78
+ 'IR Devices': [
79
+ 'Air Conditioner',
80
+ 'Air Purifier',
81
+ 'Camera',
82
+ 'DVD',
83
+ 'Fan',
84
+ 'Light',
85
+ 'Others',
86
+ 'Projector',
87
+ 'Set Top Box',
88
+ 'Speaker',
89
+ 'Streamer',
90
+ 'TV',
91
+ 'Vacuum Cleaner',
92
+ 'Water Heater',
93
+ ],
94
+ 'Other Devices': ['AI Art Frame', 'Bot', 'Home Climate Panel', 'Remote', 'remote with screen'],
95
+ } as const
96
+
97
+ export const DEVICE_TYPE_NORMALIZATION_MAP: Record<string, string> = {
98
+ // Sensor type conversions
99
+ 'motion sensor': 'motion',
100
+ 'contact sensor': 'contact',
101
+ 'presence sensor': 'contact',
102
+ 'water detector': 'water detector',
103
+
104
+ // Climate control conversions
105
+ 'humidifier2': 'humidifier',
106
+ 'circulator fan': 'fan',
107
+ 'battery circulator fan': 'fan',
108
+ 'standing circulator fan': 'fan',
109
+
110
+ // Lock/keypad conversions
111
+ 'smart lock': 'lock',
112
+ 'smart lock pro': 'lock',
113
+ 'smart lock ultra': 'lock',
114
+ 'lock lite': 'lock',
115
+ 'keypad': 'lock',
116
+ 'keypad touch': 'lock',
117
+ 'keypad vision': 'lock',
118
+ 'keypad vision pro': 'lock',
119
+
120
+ // Light conversions
121
+ 'color bulb': 'light',
122
+ 'ceiling light': 'light',
123
+ 'ceiling light pro': 'light',
124
+ 'candle warmer lamp': 'light',
125
+ 'floor lamp': 'light',
126
+ 'rgbic neon rope light': 'lightstrip',
127
+ 'rgbic neon wire rope light': 'lightstrip',
128
+ 'rgbicww floor lamp': 'lightstrip',
129
+ 'rgbicww strip light': 'lightstrip',
130
+ 'strip light': 'strip light',
131
+ 'strip light 3': 'strip light',
132
+
133
+ // Vacuum conversions
134
+ 'robot vacuum cleaner s1': 'vacuum',
135
+ 'robot vacuum cleaner s1 plus': 'vacuum',
136
+ 'robot vacuum cleaner s10': 'vacuum',
137
+ 'robot vacuum cleaner s20': 'vacuum',
138
+ 'robot vacuum cleaner k10+ pro combo': 'wosweeper',
139
+ 'robot vacuum cleaner k11+': 'wosweeper',
140
+ 'robot vacuum cleaner k20 plus pro': 'wosweeper',
141
+
142
+ // Exact device type mappings (API format → canonical format)
143
+ 'plug mini (eu)': 'plug mini (eu)',
144
+ 'plug mini (jp)': 'plug mini (jp)',
145
+ 'plug mini (us)': 'plug mini (us)',
146
+ 'relay switch 1': 'relay switch 1',
147
+ 'relay switch 1pm': 'relay switch 1pm',
148
+ 'relay switch 2pm': 'relay switch 2pm',
149
+ 'blind tilt': 'blind tilt',
150
+ 'roller shade': 'roller shade',
151
+ 'curtain3': 'curtain3',
152
+ 'hub 2': 'hub 2',
153
+ 'meterplus': 'meterplus',
154
+ 'meterpro': 'meterpro',
155
+ 'meterpro(co2)': 'meterpro(co2)',
156
+ 'walletfinder': 'walletfinder',
157
+ 'k10+': 'k10+',
158
+ 'k10+ pro': 'k10+ pro',
159
+ 'k10+ pro (wosweeperminipro)': 'k10+ pro (wosweeperminipro)',
160
+
161
+ // Handle spaced variants from config files (normalize back to API format)
162
+ 'meter pro': 'meterpro',
163
+ 'meter pro (co2)': 'meterpro(co2)',
164
+ 'meter plus': 'meterplus',
165
+ 'relay switch 1 pm': 'relay switch 1pm',
166
+ 'relay switch 2 pm': 'relay switch 2pm',
167
+ 'plug mini eu': 'plug mini (eu)',
168
+ 'plug mini jp': 'plug mini (jp)',
169
+ 'plug mini us': 'plug mini (us)',
170
+
171
+ // Migration mappings for invalid/legacy device types
172
+ 'lock vision pro': 'lock', // Valid alias; map to lock behavior
173
+ 'lock vision': 'Keypad Vision', // Invalid type
174
+ 'lock touch': 'Keypad Touch', // Invalid type
175
+ }
176
+
177
+ /**
178
+ * Get all valid device types as a flat set for validation
179
+ */
180
+ export function getValidDeviceTypes(): Set<string> {
181
+ const validTypes = new Set<string>()
182
+ for (const category of Object.values(DEVICE_TYPES)) {
183
+ for (const type of category) {
184
+ validTypes.add(type)
185
+ }
186
+ }
187
+ return validTypes
188
+ }
189
+
190
+ /**
191
+ * Normalize and validate a device type, returning a valid type or null
192
+ * @param deviceType The device type to validate/normalize
193
+ * @returns Valid device type string or null if no valid mapping found
194
+ */
195
+ export function normalizeDeviceType(deviceType: string | undefined | null): string | null {
196
+ if (!deviceType || typeof deviceType !== 'string') {
197
+ return null
198
+ }
199
+
200
+ const trimmed = deviceType.trim()
201
+ const lowercase = trimmed.toLowerCase()
202
+
203
+ // Check if already valid
204
+ const validTypes = getValidDeviceTypes()
205
+ if (validTypes.has(trimmed)) {
206
+ return trimmed
207
+ }
208
+
209
+ // Check normalization map
210
+ const normalized = DEVICE_TYPE_NORMALIZATION_MAP[lowercase]
211
+ if (normalized && validTypes.has(normalized)) {
212
+ return normalized
213
+ }
214
+
215
+ // No valid mapping found
216
+ return null
217
+ }
218
+
219
+ /**
220
+ * Check if a device type is valid
221
+ * @param deviceType The device type to check
222
+ * @returns true if device type is in DEVICE_TYPES
223
+ */
224
+ export function isValidDeviceType(deviceType: string | undefined | null): boolean {
225
+ if (!deviceType || typeof deviceType !== 'string') {
226
+ return false
227
+ }
228
+ const validTypes = getValidDeviceTypes()
229
+ return validTypes.has(deviceType.trim())
230
+ }
@@ -0,0 +1,163 @@
1
+ import type { DeviceType, SwitchBotPluginConfig } from './settings.js'
2
+
3
+ import { DEVICE_TYPE_NORMALIZATION_MAP } from './device-types.js'
4
+ import {
5
+ BlindTiltDevice,
6
+ BotDevice,
7
+ ContactSensorDevice,
8
+ Curtain3Device,
9
+ CurtainDevice,
10
+ FanDevice,
11
+ GenericDevice,
12
+ Hub2Device,
13
+ HumidifierDevice,
14
+ LightDevice,
15
+ LightStripDevice,
16
+ LockDevice,
17
+ MeterDevice,
18
+ MotionSensorDevice,
19
+ PlugDevice,
20
+ PlugMiniDevice,
21
+ RelaySwitch1PMDevice,
22
+ RelaySwitchDevice,
23
+ RollerShadeDevice,
24
+ SmartFanDevice,
25
+ StripLightDevice,
26
+ TemperatureSensorDevice,
27
+ VacuumDevice,
28
+ WalletFinderDevice,
29
+ WaterDetectorDevice,
30
+ WoSweeperDevice,
31
+ WoSweeperMiniDevice,
32
+ WoSweeperMiniProDevice,
33
+ } from './devices/genericDevice.js'
34
+ import { SwitchBotClient } from './switchbotClient.js'
35
+
36
+ export interface DeviceOptions {
37
+ id: string
38
+ type: DeviceType
39
+ name?: string
40
+ [key: string]: any
41
+ }
42
+
43
+ const DEVICE_CLASS_MAP: Record<string, any> = {
44
+ // Primary device type keys (lowercase, simplified)
45
+ 'bot': BotDevice,
46
+ 'curtain': CurtainDevice,
47
+ 'fan': FanDevice,
48
+ 'light': LightDevice,
49
+ 'lightstrip': LightStripDevice,
50
+ 'motion': MotionSensorDevice,
51
+ 'contact': ContactSensorDevice,
52
+ 'vacuum': VacuumDevice,
53
+ 'lock': LockDevice,
54
+ 'humidifier': HumidifierDevice,
55
+ 'temperature': TemperatureSensorDevice,
56
+ 'relay switch 1': RelaySwitchDevice,
57
+ 'relay switch 1pm': RelaySwitch1PMDevice,
58
+ 'relay switch 2pm': RelaySwitch1PMDevice,
59
+ 'plug': PlugDevice,
60
+ 'plug mini (jp)': PlugMiniDevice,
61
+ 'plug mini (us)': PlugMiniDevice,
62
+ 'plug mini (eu)': PlugMiniDevice,
63
+ 'blind tilt': BlindTiltDevice,
64
+ 'curtain3': Curtain3Device,
65
+ 'worollershade': RollerShadeDevice,
66
+ 'wo rollershade': RollerShadeDevice,
67
+ 'roller shade': RollerShadeDevice,
68
+ 'rollershade': RollerShadeDevice,
69
+ 'hub 2': Hub2Device,
70
+ 'meter': MeterDevice,
71
+ 'meterplus': MeterDevice,
72
+ 'meter plus (jp)': MeterDevice,
73
+ 'meterpro': MeterDevice,
74
+ 'meterpro(co2)': MeterDevice,
75
+ 'water detector': WaterDetectorDevice,
76
+ 'smart fan': SmartFanDevice,
77
+ 'strip light': StripLightDevice,
78
+ 'strip light 3': StripLightDevice,
79
+ 'walletfinder': WalletFinderDevice,
80
+ 'wosweeper': WoSweeperDevice,
81
+ 'wosweepermini': WoSweeperMiniDevice,
82
+ 'wosweeperminipro': WoSweeperMiniProDevice,
83
+ 'k10+': WoSweeperDevice,
84
+ 'k10+ pro': WoSweeperDevice,
85
+ 'k10+ pro (wosweeperminipro)': WoSweeperMiniProDevice,
86
+ // API display name aliases (for UI compatibility)
87
+ 'motion sensor': MotionSensorDevice,
88
+ 'contact sensor': ContactSensorDevice,
89
+ 'humidifier2': HumidifierDevice,
90
+ 'circulator fan': FanDevice,
91
+ 'battery circulator fan': FanDevice,
92
+ 'standing circulator fan': FanDevice,
93
+ 'smart lock': LockDevice,
94
+ 'smart lock pro': LockDevice,
95
+ 'smart lock ultra': LockDevice,
96
+ 'lock lite': LockDevice,
97
+ 'keypad': LockDevice,
98
+ 'keypad touch': LockDevice,
99
+ 'keypad vision': LockDevice,
100
+ 'keypad vision pro': LockDevice,
101
+ 'lock vision pro': LockDevice,
102
+ 'color bulb': LightDevice,
103
+ 'ceiling light': LightDevice,
104
+ 'ceiling light pro': LightDevice,
105
+ 'candle warmer lamp': LightDevice,
106
+ 'floor lamp': LightDevice,
107
+ 'rgbic neon rope light': LightStripDevice,
108
+ 'rgbic neon wire rope light': LightStripDevice,
109
+ 'rgbicww floor lamp': LightStripDevice,
110
+ 'rgbicww strip light': LightStripDevice,
111
+ 'robot vacuum cleaner s1': VacuumDevice,
112
+ 'robot vacuum cleaner s1 plus': VacuumDevice,
113
+ 'robot vacuum cleaner s10': VacuumDevice,
114
+ 'robot vacuum cleaner s20': VacuumDevice,
115
+ 'robot vacuum cleaner k10+ pro combo': WoSweeperDevice,
116
+ 'robot vacuum cleaner k11+': WoSweeperDevice,
117
+ 'robot vacuum cleaner k20 plus pro': WoSweeperDevice,
118
+ }
119
+
120
+ function classForType(type: string) {
121
+ const rawKey = (type || '').toLowerCase()
122
+ const key = DEVICE_TYPE_NORMALIZATION_MAP[rawKey] ?? rawKey
123
+ return DEVICE_CLASS_MAP[key] ?? GenericDevice
124
+ }
125
+
126
+ export async function createDevice(opts: DeviceOptions, cfg: SwitchBotPluginConfig, useMatter: boolean) {
127
+ // Reuse existing client when provided via config to avoid creating
128
+ // a new SwitchBotClient per device (which can be expensive).
129
+ let client: any = (cfg as any)?._client ?? null
130
+ if (!client) {
131
+ client = new SwitchBotClient(cfg)
132
+ await client.init()
133
+ }
134
+
135
+ // Pass client via config so devices can access it
136
+ const mergedCfg = { ...(cfg as any), _client: client }
137
+
138
+ const DeviceCtor = classForType(opts.type)
139
+ const device = new DeviceCtor(opts, mergedCfg)
140
+ await device.init()
141
+
142
+ // Attach a simple getState delegator to the client where appropriate
143
+ const originalGetState = device.getState.bind(device)
144
+ device.getState = async () => {
145
+ try {
146
+ // Prefer client-backed getDevice when available
147
+ const dev = await client.getDevice(opts.id)
148
+ if (dev) {
149
+ return dev
150
+ }
151
+ } catch (e) {
152
+ // ignore and fallback to device implementation
153
+ }
154
+ return originalGetState()
155
+ }
156
+
157
+ // Provide accessory factory based on platform selection
158
+ return {
159
+ instance: device,
160
+ createAccessory: (api: any) => (useMatter ? device.createMatterAccessory(api) : device.createHAPAccessory(api)),
161
+ protocol: useMatter ? 'matter' : 'hap',
162
+ }
163
+ }
@@ -0,0 +1,141 @@
1
+ import type { SwitchBotPluginConfig } from '../settings.js'
2
+
3
+ import { MATTER_ATTRIBUTE_IDS, MATTER_CLUSTER_IDS } from '../utils.js'
4
+
5
+ export interface DeviceOptions {
6
+ id: string
7
+ type: string
8
+ name?: string
9
+ [key: string]: any
10
+ }
11
+
12
+ export abstract class DeviceBase {
13
+ protected opts: DeviceOptions
14
+ protected cfg: SwitchBotPluginConfig
15
+ protected client: any | null
16
+
17
+ constructor(opts: DeviceOptions, cfg: SwitchBotPluginConfig) {
18
+ this.opts = opts
19
+ this.cfg = cfg
20
+ this.client = (cfg as any)?._client ?? null
21
+ }
22
+
23
+ // Initialize any connections/resources
24
+ async init(): Promise<void> {}
25
+
26
+ // Return current device state from SwitchBot or cache
27
+ abstract getState(): Promise<any>
28
+
29
+ // Apply a state change to the device
30
+ abstract setState(change: any): Promise<any>
31
+
32
+ /**
33
+ * Create and return a HAP accessory descriptor.
34
+ *
35
+ * This method returns a descriptor object (not a platformAccessory instance).
36
+ * The platform will use this descriptor to construct a real HAP accessory.
37
+ *
38
+ * Default descriptor provides a simple Switch service with an `On` characteristic
39
+ * backed by `getState()` / `setState()` so most simple devices work out of the box.
40
+ *
41
+ * If the Homebridge `api` is passed, `Service` and `Characteristic` constructors
42
+ * are included under `_resolved` for callers that need them.
43
+ *
44
+ * @example
45
+ * {
46
+ * id: 'd1',
47
+ * name: 'My Device',
48
+ * protocol: 'hap',
49
+ * services: [ { type: 'Switch', characteristics: { On: { get: async ()=>true, set: async v=>{} } } } ]
50
+ * }
51
+ */
52
+ createHAPAccessory(api: any): any {
53
+ const base: any = {
54
+ id: this.opts.id,
55
+ name: this.opts.name ?? this.opts.type,
56
+ protocol: 'hap',
57
+ services: [
58
+ {
59
+ type: 'Switch',
60
+ characteristics: {
61
+ On: {
62
+ get: async () => {
63
+ const s = await this.getState()
64
+ return !!(s && (s.on === true || s.state === 'on' || s.power === 'on'))
65
+ },
66
+ set: async (v: any) => {
67
+ await this.setState({ on: !!v })
68
+ },
69
+ },
70
+ },
71
+ },
72
+ ],
73
+ }
74
+
75
+ try {
76
+ const hap = api?.hap
77
+ if (hap && hap.Service && hap.Characteristic) {
78
+ base._resolved = { Service: hap.Service, Characteristic: hap.Characteristic }
79
+ }
80
+ } catch (e) {
81
+ // ignore
82
+ }
83
+
84
+ return base
85
+ }
86
+
87
+ /**
88
+ * Create and return a Matter accessory descriptor.
89
+ *
90
+ * Returns a descriptor containing `clusters` and attribute read/write handlers
91
+ * which the platform will serialize when registering Matter accessories. The
92
+ * default provides an `OnOff` cluster wired to `getState()` / `setState()`.
93
+ *
94
+ * If the Homebridge `api` provides a `matter` namespace it is attached under
95
+ * `_resolved.matter` for callers that need direct access to the Matter API.
96
+ */
97
+ createMatterAccessory(api: any): any {
98
+ const base: any = {
99
+ id: this.opts.id,
100
+ name: this.opts.name ?? this.opts.type,
101
+ protocol: 'matter',
102
+ clusters: [
103
+ {
104
+ type: 'OnOff',
105
+ clusterId: MATTER_CLUSTER_IDS.OnOff,
106
+ attributes: {
107
+ onOff: {
108
+ read: async () => {
109
+ const s = await this.getState()
110
+ return !!(s && (s.on === true || s.state === 'on' || s.power === 'on'))
111
+ },
112
+ write: async (v: any) => this.setState({ on: !!v }),
113
+ },
114
+ [MATTER_ATTRIBUTE_IDS.OnOff.OnOff]: {
115
+ read: async () => {
116
+ const s = await this.getState()
117
+ return !!(s && (s.on === true || s.state === 'on' || s.power === 'on'))
118
+ },
119
+ write: async (v: any) => this.setState({ on: !!v }),
120
+ },
121
+ },
122
+ },
123
+ ],
124
+ }
125
+
126
+ try {
127
+ const matter = api?.matter
128
+ if (matter) {
129
+ base._resolved = {
130
+ matter,
131
+ }
132
+ }
133
+ } catch (e) {
134
+ // ignore
135
+ }
136
+
137
+ return base
138
+ }
139
+
140
+ async destroy(): Promise<void> {}
141
+ }