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

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 (577) hide show
  1. package/.github/ISSUE_TEMPLATE/e2e-verification.md +36 -0
  2. package/.github/workflows/ci.yml +32 -0
  3. package/.github/workflows/manual-e2e.yml +115 -0
  4. package/.github/workflows/release.yml +0 -4
  5. package/CHANGELOG.md +35 -0
  6. package/E2E-VERIFICATION.md +121 -0
  7. package/MIGRATION.md +44 -0
  8. package/README.md +56 -3
  9. package/config.schema.json +170 -14787
  10. package/dist/device-types.d.ts +31 -0
  11. package/dist/device-types.d.ts.map +1 -0
  12. package/dist/device-types.js +216 -0
  13. package/dist/device-types.js.map +1 -0
  14. package/dist/deviceFactory.d.ts +13 -0
  15. package/dist/deviceFactory.d.ts.map +1 -0
  16. package/dist/deviceFactory.js +120 -0
  17. package/dist/deviceFactory.js.map +1 -0
  18. package/dist/devices/deviceBase.d.ts +50 -0
  19. package/dist/devices/deviceBase.d.ts.map +1 -0
  20. package/dist/devices/deviceBase.js +119 -0
  21. package/dist/devices/deviceBase.js.map +1 -0
  22. package/dist/devices/genericDevice.d.ts +298 -0
  23. package/dist/devices/genericDevice.d.ts.map +1 -0
  24. package/dist/devices/genericDevice.js +1067 -0
  25. package/dist/devices/genericDevice.js.map +1 -0
  26. package/dist/homebridge-ui/endpoints/config.d.ts +3 -0
  27. package/dist/homebridge-ui/endpoints/config.d.ts.map +1 -0
  28. package/dist/homebridge-ui/endpoints/config.js +104 -0
  29. package/dist/homebridge-ui/endpoints/config.js.map +1 -0
  30. package/dist/homebridge-ui/endpoints/credentials.d.ts +6 -0
  31. package/dist/homebridge-ui/endpoints/credentials.d.ts.map +1 -0
  32. package/dist/homebridge-ui/endpoints/credentials.js +65 -0
  33. package/dist/homebridge-ui/endpoints/credentials.js.map +1 -0
  34. package/dist/homebridge-ui/endpoints/devices.d.ts +6 -0
  35. package/dist/homebridge-ui/endpoints/devices.d.ts.map +1 -0
  36. package/dist/homebridge-ui/endpoints/devices.js +342 -0
  37. package/dist/homebridge-ui/endpoints/devices.js.map +1 -0
  38. package/dist/homebridge-ui/endpoints/discovery.d.ts +7 -0
  39. package/dist/homebridge-ui/endpoints/discovery.d.ts.map +1 -0
  40. package/dist/homebridge-ui/endpoints/discovery.js +171 -0
  41. package/dist/homebridge-ui/endpoints/discovery.js.map +1 -0
  42. package/dist/homebridge-ui/public/css/styles.css +254 -0
  43. package/dist/homebridge-ui/public/index.html +112 -247
  44. package/dist/homebridge-ui/public/js/api.d.ts +19 -0
  45. package/dist/homebridge-ui/public/js/api.d.ts.map +1 -0
  46. package/dist/homebridge-ui/public/js/api.js +178 -0
  47. package/dist/homebridge-ui/public/js/api.js.map +1 -0
  48. package/dist/homebridge-ui/public/js/api.ts +205 -0
  49. package/dist/homebridge-ui/public/js/app.d.ts +2 -0
  50. package/dist/homebridge-ui/public/js/app.d.ts.map +1 -0
  51. package/dist/homebridge-ui/public/js/app.js +1581 -0
  52. package/dist/homebridge-ui/public/js/app.js.map +7 -0
  53. package/dist/homebridge-ui/public/js/app.ts +22 -0
  54. package/dist/homebridge-ui/public/js/constants.d.ts +2 -0
  55. package/dist/homebridge-ui/public/js/constants.d.ts.map +1 -0
  56. package/dist/homebridge-ui/public/js/constants.js +2 -0
  57. package/dist/homebridge-ui/public/js/constants.js.map +1 -0
  58. package/dist/homebridge-ui/public/js/constants.ts +1 -0
  59. package/dist/homebridge-ui/public/js/credentials.d.ts +3 -0
  60. package/dist/homebridge-ui/public/js/credentials.d.ts.map +1 -0
  61. package/dist/homebridge-ui/public/js/credentials.js +96 -0
  62. package/dist/homebridge-ui/public/js/credentials.js.map +1 -0
  63. package/dist/homebridge-ui/public/js/credentials.ts +100 -0
  64. package/dist/homebridge-ui/public/js/devices-delete.d.ts +3 -0
  65. package/dist/homebridge-ui/public/js/devices-delete.d.ts.map +1 -0
  66. package/dist/homebridge-ui/public/js/devices-delete.js +206 -0
  67. package/dist/homebridge-ui/public/js/devices-delete.js.map +1 -0
  68. package/dist/homebridge-ui/public/js/devices-delete.ts +236 -0
  69. package/dist/homebridge-ui/public/js/devices.d.ts +9 -0
  70. package/dist/homebridge-ui/public/js/devices.d.ts.map +1 -0
  71. package/dist/homebridge-ui/public/js/devices.js +81 -0
  72. package/dist/homebridge-ui/public/js/devices.js.map +1 -0
  73. package/dist/homebridge-ui/public/js/devices.ts +88 -0
  74. package/dist/homebridge-ui/public/js/discovery.d.ts +3 -0
  75. package/dist/homebridge-ui/public/js/discovery.d.ts.map +1 -0
  76. package/dist/homebridge-ui/public/js/discovery.js +233 -0
  77. package/dist/homebridge-ui/public/js/discovery.js.map +1 -0
  78. package/dist/homebridge-ui/public/js/discovery.ts +277 -0
  79. package/dist/homebridge-ui/public/js/logger.d.ts +6 -0
  80. package/dist/homebridge-ui/public/js/logger.d.ts.map +1 -0
  81. package/dist/homebridge-ui/public/js/logger.js +12 -0
  82. package/dist/homebridge-ui/public/js/logger.js.map +1 -0
  83. package/dist/homebridge-ui/public/js/logger.ts +11 -0
  84. package/dist/homebridge-ui/public/js/modal.d.ts +5 -0
  85. package/dist/homebridge-ui/public/js/modal.d.ts.map +1 -0
  86. package/dist/homebridge-ui/public/js/modal.js +26 -0
  87. package/dist/homebridge-ui/public/js/modal.js.map +1 -0
  88. package/dist/homebridge-ui/public/js/modal.ts +28 -0
  89. package/dist/homebridge-ui/public/js/modals.d.ts +2 -0
  90. package/dist/homebridge-ui/public/js/modals.d.ts.map +1 -0
  91. package/dist/homebridge-ui/public/js/modals.js +177 -0
  92. package/dist/homebridge-ui/public/js/modals.js.map +1 -0
  93. package/dist/homebridge-ui/public/js/modals.ts +200 -0
  94. package/dist/homebridge-ui/public/js/render.d.ts +63 -0
  95. package/dist/homebridge-ui/public/js/render.d.ts.map +1 -0
  96. package/dist/homebridge-ui/public/js/render.js +439 -0
  97. package/dist/homebridge-ui/public/js/render.js.map +1 -0
  98. package/dist/homebridge-ui/public/js/render.ts +510 -0
  99. package/dist/homebridge-ui/public/js/toast.d.ts +6 -0
  100. package/dist/homebridge-ui/public/js/toast.d.ts.map +1 -0
  101. package/dist/homebridge-ui/public/js/toast.js +29 -0
  102. package/dist/homebridge-ui/public/js/toast.js.map +1 -0
  103. package/dist/homebridge-ui/public/js/toast.ts +37 -0
  104. package/dist/homebridge-ui/public/js/types.d.ts +23 -0
  105. package/dist/homebridge-ui/public/js/types.d.ts.map +1 -0
  106. package/dist/homebridge-ui/public/js/types.js +2 -0
  107. package/dist/homebridge-ui/public/js/types.js.map +1 -0
  108. package/dist/homebridge-ui/public/js/types.ts +26 -0
  109. package/dist/homebridge-ui/server.js +11 -41
  110. package/dist/homebridge-ui/server.js.map +1 -1
  111. package/dist/homebridge-ui/utils/config-parser.d.ts +35 -0
  112. package/dist/homebridge-ui/utils/config-parser.d.ts.map +1 -0
  113. package/dist/homebridge-ui/utils/config-parser.js +87 -0
  114. package/dist/homebridge-ui/utils/config-parser.js.map +1 -0
  115. package/dist/homebridge-ui/utils/device-migration.d.ts +35 -0
  116. package/dist/homebridge-ui/utils/device-migration.d.ts.map +1 -0
  117. package/dist/homebridge-ui/utils/device-migration.js +111 -0
  118. package/dist/homebridge-ui/utils/device-migration.js.map +1 -0
  119. package/dist/homebridge-ui/utils/logger.d.ts +7 -0
  120. package/dist/homebridge-ui/utils/logger.d.ts.map +1 -0
  121. package/dist/homebridge-ui/utils/logger.js +17 -0
  122. package/dist/homebridge-ui/utils/logger.js.map +1 -0
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +4 -65
  125. package/dist/index.js.map +1 -1
  126. package/dist/platform.d.ts +35 -0
  127. package/dist/platform.d.ts.map +1 -0
  128. package/dist/platform.js +1567 -0
  129. package/dist/platform.js.map +1 -0
  130. package/dist/settings.d.ts +10 -249
  131. package/dist/settings.d.ts.map +1 -1
  132. package/dist/settings.js +5 -30
  133. package/dist/settings.js.map +1 -1
  134. package/dist/switchbotClient.d.ts +32 -0
  135. package/dist/switchbotClient.d.ts.map +1 -0
  136. package/dist/switchbotClient.js +207 -0
  137. package/dist/switchbotClient.js.map +1 -0
  138. package/dist/utils.d.ts +39 -50
  139. package/dist/utils.d.ts.map +1 -1
  140. package/dist/utils.js +39 -688
  141. package/dist/utils.js.map +1 -1
  142. package/docs/assets/highlight.css +14 -0
  143. package/docs/assets/icons.js +1 -1
  144. package/docs/assets/icons.svg +1 -1
  145. package/docs/assets/main.js +2 -2
  146. package/docs/assets/style.css +3 -3
  147. package/docs/index.html +77 -13
  148. package/docs/variables/default.html +1 -1
  149. package/eslint.config.js +7 -8
  150. package/nodemon.json +2 -2
  151. package/package.json +35 -32
  152. package/scripts/build-ui.js +36 -0
  153. package/scripts/e2e/README.md +25 -0
  154. package/scripts/e2e/curtain-e2e.sh +70 -0
  155. package/scripts/e2e/fan-e2e.sh +75 -0
  156. package/scripts/e2e/light-advanced-e2e.sh +97 -0
  157. package/scripts/e2e/light-e2e.sh +75 -0
  158. package/scripts/e2e/list-accessories.sh +19 -0
  159. package/scripts/e2e/lock-e2e.sh +65 -0
  160. package/scripts/free-dev-ports.mjs +105 -0
  161. package/scripts/generate-matter-maps.js +60 -0
  162. package/scripts/run-e2e-local.sh +14 -0
  163. package/scripts/sync-device-types.mjs +28 -0
  164. package/src/device-types.ts +230 -0
  165. package/src/deviceFactory.ts +163 -0
  166. package/src/devices/deviceBase.ts +141 -0
  167. package/src/devices/genericDevice.ts +998 -0
  168. package/src/homebridge-ui/endpoints/config.ts +123 -0
  169. package/src/homebridge-ui/endpoints/credentials.ts +74 -0
  170. package/src/homebridge-ui/endpoints/devices.ts +380 -0
  171. package/src/homebridge-ui/endpoints/discovery.ts +191 -0
  172. package/src/homebridge-ui/public/css/styles.css +254 -0
  173. package/src/homebridge-ui/public/index.html +112 -247
  174. package/src/homebridge-ui/public/js/api.ts +205 -0
  175. package/src/homebridge-ui/public/js/app.ts +22 -0
  176. package/src/homebridge-ui/public/js/constants.ts +1 -0
  177. package/src/homebridge-ui/public/js/credentials.ts +100 -0
  178. package/src/homebridge-ui/public/js/devices-delete.ts +236 -0
  179. package/src/homebridge-ui/public/js/devices.ts +88 -0
  180. package/src/homebridge-ui/public/js/discovery.ts +277 -0
  181. package/src/homebridge-ui/public/js/logger.ts +11 -0
  182. package/src/homebridge-ui/public/js/modal.ts +28 -0
  183. package/src/homebridge-ui/public/js/modals.ts +200 -0
  184. package/src/homebridge-ui/public/js/render.ts +510 -0
  185. package/src/homebridge-ui/public/js/toast.ts +37 -0
  186. package/src/homebridge-ui/public/js/types.ts +26 -0
  187. package/src/homebridge-ui/server.ts +11 -43
  188. package/src/homebridge-ui/utils/config-parser.ts +108 -0
  189. package/src/homebridge-ui/utils/device-migration.ts +144 -0
  190. package/src/homebridge-ui/utils/logger.ts +17 -0
  191. package/src/index.ts +4 -66
  192. package/src/platform.ts +1566 -0
  193. package/src/settings.ts +12 -277
  194. package/src/switchbotClient.ts +216 -0
  195. package/src/utils.ts +45 -713
  196. package/switchbot-homebridge-switchbot-5.0.0.tgz +0 -0
  197. package/test/accessory-restore.spec.ts +73 -0
  198. package/test/device-mapping.spec.ts +37 -0
  199. package/test/deviceFactory.spec.ts +18 -0
  200. package/test/e2e/run-e2e.spec.ts +50 -0
  201. package/test/fan-swing.spec.ts +29 -0
  202. package/test/helpers/matter-harness.ts +53 -0
  203. package/test/lock-users.spec.ts +44 -0
  204. package/test/matter-childbridge.spec.ts +55 -0
  205. package/test/matter-descriptors.spec.ts +97 -0
  206. package/test/matter-device-state.spec.ts +101 -0
  207. package/test/matter-integration.spec.ts +70 -0
  208. package/test/platform.integration.spec.ts +55 -0
  209. package/test/switchbot-client-debounce.spec.ts +131 -0
  210. package/test/switchbot-client-openapi.spec.ts +56 -0
  211. package/test/switchbotClient.spec.ts +10 -0
  212. package/test/utils.spec.ts +20 -0
  213. package/todo/COMPLETED.md +189 -0
  214. package/todo/README.md +59 -0
  215. package/todo/TODO.md +205 -0
  216. package/todo/mockups/filtering-sorting.svg +112 -0
  217. package/todo/mockups/modal-switchbot-theme.svg +66 -0
  218. package/todo/mockups/signal-strength-visualization.svg +94 -0
  219. package/vitest.config.ts +7 -0
  220. package/coverage/base.css +0 -224
  221. package/coverage/block-navigation.js +0 -87
  222. package/coverage/clover.xml +0 -15847
  223. package/coverage/coverage-final.json +0 -42
  224. package/coverage/docs/assets/dmt/dmt-component-data.js.html +0 -85
  225. package/coverage/docs/assets/dmt/dmt-components.js.html +0 -286
  226. package/coverage/docs/assets/dmt/index.html +0 -131
  227. package/coverage/docs/assets/hierarchy.js.html +0 -85
  228. package/coverage/docs/assets/icons.js.html +0 -136
  229. package/coverage/docs/assets/index.html +0 -146
  230. package/coverage/docs/assets/main.js.html +0 -265
  231. package/coverage/favicon.png +0 -0
  232. package/coverage/index.html +0 -191
  233. package/coverage/prettify.css +0 -1
  234. package/coverage/prettify.js +0 -2
  235. package/coverage/sort-arrow-sprite.png +0 -0
  236. package/coverage/sorter.js +0 -196
  237. package/coverage/src/device/blindtilt.ts.html +0 -3238
  238. package/coverage/src/device/bot.ts.html +0 -2803
  239. package/coverage/src/device/ceilinglight.ts.html +0 -2338
  240. package/coverage/src/device/colorbulb.ts.html +0 -2824
  241. package/coverage/src/device/contact.ts.html +0 -1465
  242. package/coverage/src/device/curtain.ts.html +0 -2869
  243. package/coverage/src/device/device.ts.html +0 -2500
  244. package/coverage/src/device/fan.ts.html +0 -2242
  245. package/coverage/src/device/hub.ts.html +0 -1408
  246. package/coverage/src/device/humidifier.ts.html +0 -2116
  247. package/coverage/src/device/index.html +0 -416
  248. package/coverage/src/device/iosensor.ts.html +0 -1375
  249. package/coverage/src/device/lightstrip.ts.html +0 -2617
  250. package/coverage/src/device/lock.ts.html +0 -1963
  251. package/coverage/src/device/meter.ts.html +0 -1372
  252. package/coverage/src/device/meterplus.ts.html +0 -1384
  253. package/coverage/src/device/meterpro.ts.html +0 -1618
  254. package/coverage/src/device/motion.ts.html +0 -1264
  255. package/coverage/src/device/plug.ts.html +0 -1372
  256. package/coverage/src/device/relayswitch.ts.html +0 -2284
  257. package/coverage/src/device/robotvacuumcleaner.ts.html +0 -1810
  258. package/coverage/src/device/waterdetector.ts.html +0 -1294
  259. package/coverage/src/homebridge-ui/index.html +0 -116
  260. package/coverage/src/homebridge-ui/server.ts.html +0 -229
  261. package/coverage/src/index.html +0 -161
  262. package/coverage/src/index.ts.html +0 -124
  263. package/coverage/src/irdevice/airconditioner.ts.html +0 -1687
  264. package/coverage/src/irdevice/airpurifier.ts.html +0 -844
  265. package/coverage/src/irdevice/camera.ts.html +0 -475
  266. package/coverage/src/irdevice/fan.ts.html +0 -766
  267. package/coverage/src/irdevice/index.html +0 -251
  268. package/coverage/src/irdevice/irdevice.ts.html +0 -1117
  269. package/coverage/src/irdevice/light.ts.html +0 -826
  270. package/coverage/src/irdevice/other.ts.html +0 -2458
  271. package/coverage/src/irdevice/tv.ts.html +0 -1222
  272. package/coverage/src/irdevice/vacuumcleaner.ts.html +0 -466
  273. package/coverage/src/irdevice/waterheater.ts.html +0 -469
  274. package/coverage/src/platform.ts.html +0 -8776
  275. package/coverage/src/settings.ts.html +0 -934
  276. package/coverage/src/utils.ts.html +0 -2092
  277. package/dist/devices-hap/airpurifier.d.ts +0 -54
  278. package/dist/devices-hap/airpurifier.d.ts.map +0 -1
  279. package/dist/devices-hap/airpurifier.js +0 -527
  280. package/dist/devices-hap/airpurifier.js.map +0 -1
  281. package/dist/devices-hap/blindtilt.d.ts +0 -90
  282. package/dist/devices-hap/blindtilt.d.ts.map +0 -1
  283. package/dist/devices-hap/blindtilt.js +0 -974
  284. package/dist/devices-hap/blindtilt.js.map +0 -1
  285. package/dist/devices-hap/bot.d.ts +0 -102
  286. package/dist/devices-hap/bot.d.ts.map +0 -1
  287. package/dist/devices-hap/bot.js +0 -811
  288. package/dist/devices-hap/bot.js.map +0 -1
  289. package/dist/devices-hap/ceilinglight.d.ts +0 -85
  290. package/dist/devices-hap/ceilinglight.d.ts.map +0 -1
  291. package/dist/devices-hap/ceilinglight.js +0 -701
  292. package/dist/devices-hap/ceilinglight.js.map +0 -1
  293. package/dist/devices-hap/colorbulb.d.ts +0 -88
  294. package/dist/devices-hap/colorbulb.d.ts.map +0 -1
  295. package/dist/devices-hap/colorbulb.js +0 -881
  296. package/dist/devices-hap/colorbulb.js.map +0 -1
  297. package/dist/devices-hap/contact.d.ts +0 -44
  298. package/dist/devices-hap/contact.d.ts.map +0 -1
  299. package/dist/devices-hap/contact.js +0 -409
  300. package/dist/devices-hap/contact.js.map +0 -1
  301. package/dist/devices-hap/curtain.d.ts +0 -73
  302. package/dist/devices-hap/curtain.d.ts.map +0 -1
  303. package/dist/devices-hap/curtain.js +0 -869
  304. package/dist/devices-hap/curtain.js.map +0 -1
  305. package/dist/devices-hap/device.d.ts +0 -98
  306. package/dist/devices-hap/device.d.ts.map +0 -1
  307. package/dist/devices-hap/device.js +0 -749
  308. package/dist/devices-hap/device.js.map +0 -1
  309. package/dist/devices-hap/fan.d.ts +0 -69
  310. package/dist/devices-hap/fan.d.ts.map +0 -1
  311. package/dist/devices-hap/fan.js +0 -649
  312. package/dist/devices-hap/fan.js.map +0 -1
  313. package/dist/devices-hap/hub.d.ts +0 -37
  314. package/dist/devices-hap/hub.d.ts.map +0 -1
  315. package/dist/devices-hap/hub.js +0 -392
  316. package/dist/devices-hap/hub.js.map +0 -1
  317. package/dist/devices-hap/humidifier.d.ts +0 -68
  318. package/dist/devices-hap/humidifier.d.ts.map +0 -1
  319. package/dist/devices-hap/humidifier.js +0 -628
  320. package/dist/devices-hap/humidifier.js.map +0 -1
  321. package/dist/devices-hap/iosensor.d.ts +0 -42
  322. package/dist/devices-hap/iosensor.d.ts.map +0 -1
  323. package/dist/devices-hap/iosensor.js +0 -382
  324. package/dist/devices-hap/iosensor.js.map +0 -1
  325. package/dist/devices-hap/lightstrip.d.ts +0 -79
  326. package/dist/devices-hap/lightstrip.d.ts.map +0 -1
  327. package/dist/devices-hap/lightstrip.js +0 -797
  328. package/dist/devices-hap/lightstrip.js.map +0 -1
  329. package/dist/devices-hap/lock.d.ts +0 -53
  330. package/dist/devices-hap/lock.d.ts.map +0 -1
  331. package/dist/devices-hap/lock.js +0 -561
  332. package/dist/devices-hap/lock.js.map +0 -1
  333. package/dist/devices-hap/meter.d.ts +0 -37
  334. package/dist/devices-hap/meter.d.ts.map +0 -1
  335. package/dist/devices-hap/meter.js +0 -379
  336. package/dist/devices-hap/meter.js.map +0 -1
  337. package/dist/devices-hap/meterplus.d.ts +0 -42
  338. package/dist/devices-hap/meterplus.d.ts.map +0 -1
  339. package/dist/devices-hap/meterplus.js +0 -384
  340. package/dist/devices-hap/meterplus.js.map +0 -1
  341. package/dist/devices-hap/meterpro.d.ts +0 -43
  342. package/dist/devices-hap/meterpro.d.ts.map +0 -1
  343. package/dist/devices-hap/meterpro.js +0 -468
  344. package/dist/devices-hap/meterpro.js.map +0 -1
  345. package/dist/devices-hap/motion.d.ts +0 -42
  346. package/dist/devices-hap/motion.d.ts.map +0 -1
  347. package/dist/devices-hap/motion.js +0 -345
  348. package/dist/devices-hap/motion.js.map +0 -1
  349. package/dist/devices-hap/plug.d.ts +0 -49
  350. package/dist/devices-hap/plug.d.ts.map +0 -1
  351. package/dist/devices-hap/plug.js +0 -395
  352. package/dist/devices-hap/plug.js.map +0 -1
  353. package/dist/devices-hap/relayswitch.d.ts +0 -96
  354. package/dist/devices-hap/relayswitch.d.ts.map +0 -1
  355. package/dist/devices-hap/relayswitch.js +0 -642
  356. package/dist/devices-hap/relayswitch.js.map +0 -1
  357. package/dist/devices-hap/robotvacuumcleaner.d.ts +0 -54
  358. package/dist/devices-hap/robotvacuumcleaner.d.ts.map +0 -1
  359. package/dist/devices-hap/robotvacuumcleaner.js +0 -523
  360. package/dist/devices-hap/robotvacuumcleaner.js.map +0 -1
  361. package/dist/devices-hap/waterdetector.d.ts +0 -41
  362. package/dist/devices-hap/waterdetector.d.ts.map +0 -1
  363. package/dist/devices-hap/waterdetector.js +0 -356
  364. package/dist/devices-hap/waterdetector.js.map +0 -1
  365. package/dist/devices-matter/BaseMatterAccessory.d.ts +0 -63
  366. package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
  367. package/dist/devices-matter/BaseMatterAccessory.js +0 -100
  368. package/dist/devices-matter/BaseMatterAccessory.js.map +0 -1
  369. package/dist/devices-matter/ColorLightAccessory.d.ts +0 -20
  370. package/dist/devices-matter/ColorLightAccessory.d.ts.map +0 -1
  371. package/dist/devices-matter/ColorLightAccessory.js +0 -95
  372. package/dist/devices-matter/ColorLightAccessory.js.map +0 -1
  373. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +0 -18
  374. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +0 -1
  375. package/dist/devices-matter/ColorTemperatureLightAccessory.js +0 -78
  376. package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +0 -1
  377. package/dist/devices-matter/ContactSensorAccessory.d.ts +0 -12
  378. package/dist/devices-matter/ContactSensorAccessory.d.ts.map +0 -1
  379. package/dist/devices-matter/ContactSensorAccessory.js +0 -34
  380. package/dist/devices-matter/ContactSensorAccessory.js.map +0 -1
  381. package/dist/devices-matter/DimmableLightAccessory.d.ts +0 -58
  382. package/dist/devices-matter/DimmableLightAccessory.d.ts.map +0 -1
  383. package/dist/devices-matter/DimmableLightAccessory.js +0 -167
  384. package/dist/devices-matter/DimmableLightAccessory.js.map +0 -1
  385. package/dist/devices-matter/DoorLockAccessory.d.ts +0 -14
  386. package/dist/devices-matter/DoorLockAccessory.d.ts.map +0 -1
  387. package/dist/devices-matter/DoorLockAccessory.js +0 -50
  388. package/dist/devices-matter/DoorLockAccessory.js.map +0 -1
  389. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +0 -21
  390. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +0 -1
  391. package/dist/devices-matter/ExtendedColorLightAccessory.js +0 -107
  392. package/dist/devices-matter/ExtendedColorLightAccessory.js.map +0 -1
  393. package/dist/devices-matter/FanAccessory.d.ts +0 -16
  394. package/dist/devices-matter/FanAccessory.d.ts.map +0 -1
  395. package/dist/devices-matter/FanAccessory.js +0 -81
  396. package/dist/devices-matter/FanAccessory.js.map +0 -1
  397. package/dist/devices-matter/HumiditySensorAccessory.d.ts +0 -12
  398. package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +0 -1
  399. package/dist/devices-matter/HumiditySensorAccessory.js +0 -34
  400. package/dist/devices-matter/HumiditySensorAccessory.js.map +0 -1
  401. package/dist/devices-matter/LeakSensorAccessory.d.ts +0 -12
  402. package/dist/devices-matter/LeakSensorAccessory.d.ts.map +0 -1
  403. package/dist/devices-matter/LeakSensorAccessory.js +0 -33
  404. package/dist/devices-matter/LeakSensorAccessory.js.map +0 -1
  405. package/dist/devices-matter/LightSensorAccessory.d.ts +0 -12
  406. package/dist/devices-matter/LightSensorAccessory.d.ts.map +0 -1
  407. package/dist/devices-matter/LightSensorAccessory.js +0 -34
  408. package/dist/devices-matter/LightSensorAccessory.js.map +0 -1
  409. package/dist/devices-matter/OccupancySensorAccessory.d.ts +0 -12
  410. package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +0 -1
  411. package/dist/devices-matter/OccupancySensorAccessory.js +0 -39
  412. package/dist/devices-matter/OccupancySensorAccessory.js.map +0 -1
  413. package/dist/devices-matter/OnOffLightAccessory.d.ts +0 -38
  414. package/dist/devices-matter/OnOffLightAccessory.d.ts.map +0 -1
  415. package/dist/devices-matter/OnOffLightAccessory.js +0 -118
  416. package/dist/devices-matter/OnOffLightAccessory.js.map +0 -1
  417. package/dist/devices-matter/OnOffOutletAccessory.d.ts +0 -12
  418. package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +0 -1
  419. package/dist/devices-matter/OnOffOutletAccessory.js +0 -40
  420. package/dist/devices-matter/OnOffOutletAccessory.js.map +0 -1
  421. package/dist/devices-matter/OnOffSwitchAccessory.d.ts +0 -14
  422. package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +0 -1
  423. package/dist/devices-matter/OnOffSwitchAccessory.js +0 -42
  424. package/dist/devices-matter/OnOffSwitchAccessory.js.map +0 -1
  425. package/dist/devices-matter/RoboticVacuumAccessory.d.ts +0 -68
  426. package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +0 -1
  427. package/dist/devices-matter/RoboticVacuumAccessory.js +0 -334
  428. package/dist/devices-matter/RoboticVacuumAccessory.js.map +0 -1
  429. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +0 -11
  430. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +0 -1
  431. package/dist/devices-matter/SmokeCOAlarmAccessory.js +0 -49
  432. package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +0 -1
  433. package/dist/devices-matter/TemperatureSensorAccessory.d.ts +0 -12
  434. package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +0 -1
  435. package/dist/devices-matter/TemperatureSensorAccessory.js +0 -36
  436. package/dist/devices-matter/TemperatureSensorAccessory.js.map +0 -1
  437. package/dist/devices-matter/ThermostatAccessory.d.ts +0 -19
  438. package/dist/devices-matter/ThermostatAccessory.d.ts.map +0 -1
  439. package/dist/devices-matter/ThermostatAccessory.js +0 -95
  440. package/dist/devices-matter/ThermostatAccessory.js.map +0 -1
  441. package/dist/devices-matter/VenetianBlindAccessory.d.ts +0 -19
  442. package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +0 -1
  443. package/dist/devices-matter/VenetianBlindAccessory.js +0 -99
  444. package/dist/devices-matter/VenetianBlindAccessory.js.map +0 -1
  445. package/dist/devices-matter/WindowBlindAccessory.d.ts +0 -17
  446. package/dist/devices-matter/WindowBlindAccessory.d.ts.map +0 -1
  447. package/dist/devices-matter/WindowBlindAccessory.js +0 -80
  448. package/dist/devices-matter/WindowBlindAccessory.js.map +0 -1
  449. package/dist/devices-matter/custom/PowerStripAccessory.d.ts +0 -97
  450. package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +0 -1
  451. package/dist/devices-matter/custom/PowerStripAccessory.js +0 -265
  452. package/dist/devices-matter/custom/PowerStripAccessory.js.map +0 -1
  453. package/dist/devices-matter/custom/index.d.ts +0 -8
  454. package/dist/devices-matter/custom/index.d.ts.map +0 -1
  455. package/dist/devices-matter/custom/index.js +0 -8
  456. package/dist/devices-matter/custom/index.js.map +0 -1
  457. package/dist/devices-matter/index.d.ts +0 -29
  458. package/dist/devices-matter/index.d.ts.map +0 -1
  459. package/dist/devices-matter/index.js +0 -28
  460. package/dist/devices-matter/index.js.map +0 -1
  461. package/dist/index.test.d.ts +0 -2
  462. package/dist/index.test.d.ts.map +0 -1
  463. package/dist/index.test.js +0 -19
  464. package/dist/index.test.js.map +0 -1
  465. package/dist/irdevice/airconditioner.d.ts +0 -61
  466. package/dist/irdevice/airconditioner.d.ts.map +0 -1
  467. package/dist/irdevice/airconditioner.js +0 -472
  468. package/dist/irdevice/airconditioner.js.map +0 -1
  469. package/dist/irdevice/airpurifier.d.ts +0 -50
  470. package/dist/irdevice/airpurifier.d.ts.map +0 -1
  471. package/dist/irdevice/airpurifier.js +0 -213
  472. package/dist/irdevice/airpurifier.js.map +0 -1
  473. package/dist/irdevice/camera.d.ts +0 -32
  474. package/dist/irdevice/camera.d.ts.map +0 -1
  475. package/dist/irdevice/camera.js +0 -107
  476. package/dist/irdevice/camera.js.map +0 -1
  477. package/dist/irdevice/fan.d.ts +0 -36
  478. package/dist/irdevice/fan.d.ts.map +0 -1
  479. package/dist/irdevice/fan.js +0 -200
  480. package/dist/irdevice/fan.js.map +0 -1
  481. package/dist/irdevice/irdevice.d.ts +0 -68
  482. package/dist/irdevice/irdevice.d.ts.map +0 -1
  483. package/dist/irdevice/irdevice.js +0 -298
  484. package/dist/irdevice/irdevice.js.map +0 -1
  485. package/dist/irdevice/light.d.ts +0 -36
  486. package/dist/irdevice/light.d.ts.map +0 -1
  487. package/dist/irdevice/light.js +0 -206
  488. package/dist/irdevice/light.js.map +0 -1
  489. package/dist/irdevice/other.d.ts +0 -57
  490. package/dist/irdevice/other.d.ts.map +0 -1
  491. package/dist/irdevice/other.js +0 -778
  492. package/dist/irdevice/other.js.map +0 -1
  493. package/dist/irdevice/tv.d.ts +0 -45
  494. package/dist/irdevice/tv.d.ts.map +0 -1
  495. package/dist/irdevice/tv.js +0 -327
  496. package/dist/irdevice/tv.js.map +0 -1
  497. package/dist/irdevice/vacuumcleaner.d.ts +0 -28
  498. package/dist/irdevice/vacuumcleaner.d.ts.map +0 -1
  499. package/dist/irdevice/vacuumcleaner.js +0 -104
  500. package/dist/irdevice/vacuumcleaner.js.map +0 -1
  501. package/dist/irdevice/waterheater.d.ts +0 -30
  502. package/dist/irdevice/waterheater.d.ts.map +0 -1
  503. package/dist/irdevice/waterheater.js +0 -105
  504. package/dist/irdevice/waterheater.js.map +0 -1
  505. package/dist/platform-hap.d.ts +0 -149
  506. package/dist/platform-hap.d.ts.map +0 -1
  507. package/dist/platform-hap.js +0 -2861
  508. package/dist/platform-hap.js.map +0 -1
  509. package/dist/platform-matter.d.ts +0 -120
  510. package/dist/platform-matter.d.ts.map +0 -1
  511. package/dist/platform-matter.js +0 -984
  512. package/dist/platform-matter.js.map +0 -1
  513. package/dist/verifyconfig.test.d.ts +0 -2
  514. package/dist/verifyconfig.test.d.ts.map +0 -1
  515. package/dist/verifyconfig.test.js +0 -167
  516. package/dist/verifyconfig.test.js.map +0 -1
  517. package/src/custom.d.ts +0 -7
  518. package/src/devices-hap/airpurifier.ts +0 -563
  519. package/src/devices-hap/blindtilt.ts +0 -1049
  520. package/src/devices-hap/bot.ts +0 -900
  521. package/src/devices-hap/ceilinglight.ts +0 -742
  522. package/src/devices-hap/colorbulb.ts +0 -904
  523. package/src/devices-hap/contact.ts +0 -457
  524. package/src/devices-hap/curtain.ts +0 -944
  525. package/src/devices-hap/device.ts +0 -811
  526. package/src/devices-hap/fan.ts +0 -711
  527. package/src/devices-hap/hub.ts +0 -439
  528. package/src/devices-hap/humidifier.ts +0 -669
  529. package/src/devices-hap/iosensor.ts +0 -427
  530. package/src/devices-hap/lightstrip.ts +0 -836
  531. package/src/devices-hap/lock.ts +0 -620
  532. package/src/devices-hap/meter.ts +0 -426
  533. package/src/devices-hap/meterplus.ts +0 -430
  534. package/src/devices-hap/meterpro.ts +0 -522
  535. package/src/devices-hap/motion.ts +0 -390
  536. package/src/devices-hap/plug.ts +0 -423
  537. package/src/devices-hap/relayswitch.ts +0 -727
  538. package/src/devices-hap/robotvacuumcleaner.ts +0 -568
  539. package/src/devices-hap/waterdetector.ts +0 -400
  540. package/src/devices-matter/BaseMatterAccessory.ts +0 -131
  541. package/src/devices-matter/ColorLightAccessory.ts +0 -110
  542. package/src/devices-matter/ColorTemperatureLightAccessory.ts +0 -92
  543. package/src/devices-matter/ContactSensorAccessory.ts +0 -41
  544. package/src/devices-matter/DimmableLightAccessory.ts +0 -192
  545. package/src/devices-matter/DoorLockAccessory.ts +0 -60
  546. package/src/devices-matter/ExtendedColorLightAccessory.ts +0 -123
  547. package/src/devices-matter/FanAccessory.ts +0 -95
  548. package/src/devices-matter/HumiditySensorAccessory.ts +0 -41
  549. package/src/devices-matter/LeakSensorAccessory.ts +0 -40
  550. package/src/devices-matter/LightSensorAccessory.ts +0 -41
  551. package/src/devices-matter/OccupancySensorAccessory.ts +0 -48
  552. package/src/devices-matter/OnOffLightAccessory.ts +0 -133
  553. package/src/devices-matter/OnOffOutletAccessory.ts +0 -46
  554. package/src/devices-matter/OnOffSwitchAccessory.ts +0 -51
  555. package/src/devices-matter/RoboticVacuumAccessory.ts +0 -407
  556. package/src/devices-matter/SmokeCOAlarmAccessory.ts +0 -59
  557. package/src/devices-matter/TemperatureSensorAccessory.ts +0 -43
  558. package/src/devices-matter/ThermostatAccessory.ts +0 -110
  559. package/src/devices-matter/VenetianBlindAccessory.ts +0 -115
  560. package/src/devices-matter/WindowBlindAccessory.ts +0 -92
  561. package/src/devices-matter/custom/PowerStripAccessory.ts +0 -309
  562. package/src/devices-matter/custom/index.ts +0 -8
  563. package/src/devices-matter/index.ts +0 -29
  564. package/src/index.test.ts +0 -24
  565. package/src/irdevice/airconditioner.ts +0 -533
  566. package/src/irdevice/airpurifier.ts +0 -252
  567. package/src/irdevice/camera.ts +0 -129
  568. package/src/irdevice/fan.ts +0 -226
  569. package/src/irdevice/irdevice.ts +0 -344
  570. package/src/irdevice/light.ts +0 -246
  571. package/src/irdevice/other.ts +0 -790
  572. package/src/irdevice/tv.ts +0 -378
  573. package/src/irdevice/vacuumcleaner.ts +0 -126
  574. package/src/irdevice/waterheater.ts +0 -127
  575. package/src/platform-hap.ts +0 -2997
  576. package/src/platform-matter.ts +0 -1110
  577. package/src/verifyconfig.test.ts +0 -197
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env bash
2
+ # Advanced light E2E helper: exercises On/Off, Brightness steps, Color Temperature and RGB color where supported.
3
+ # Usage:
4
+ # 1) Ensure Homebridge is running and the plugin is installed/linked.
5
+ # 2) Populate `HB_URL`, `HB_TOKEN`, and `ACCESSORY_ID` below (or export them).
6
+ # 3) Run: `bash scripts/e2e/light-advanced-e2e.sh`
7
+
8
+ set -euo pipefail
9
+
10
+ : ${HB_URL:="http://localhost:8581"}
11
+ : ${HB_TOKEN:=""}
12
+ : ${ACCESSORY_ID:=""}
13
+ : ${ACCESSORY_NAME:=""}
14
+
15
+ # Resolve accessory id (aid) from Homebridge API when ACCESSORY_NAME supplied
16
+ resolve_accessory_id() {
17
+ if [[ -n "$ACCESSORY_ID" ]]; then
18
+ return 0
19
+ fi
20
+ if [[ -z "$ACCESSORY_NAME" ]]; then
21
+ return 1
22
+ fi
23
+ local resp
24
+ resp=$(curl -sS -H "Authorization: Bearer ${HB_TOKEN}" "${HB_URL}/api/accessories") || return 1
25
+ ACCESSORY_ID=$(printf '%s' "$resp" | node -e "const fs=require('fs');const name=process.argv[1];const j=JSON.parse(fs.readFileSync(0,'utf8'));const arr=Array.isArray(j)?j:(j.accessories||j);for(const a of arr||[]){if(a.displayName===name||a.name===name||(a.context&&a.context.deviceId===name)){if(a.aid){console.log(a.aid);process.exit(0);}else if(a.UUID){console.log(a.UUID);process.exit(0);}}}process.exit(1);" "$ACCESSORY_NAME") || return 1
26
+ return 0
27
+ }
28
+
29
+ if [[ -z "$HB_TOKEN" ]]; then
30
+ echo "Please set HB_TOKEN environment variable or edit the top of this script."
31
+ exit 1
32
+ fi
33
+
34
+ if [[ -z "$ACCESSORY_ID" ]]; then
35
+ if resolve_accessory_id; then
36
+ echo "Discovered ACCESSORY_ID=${ACCESSORY_ID} for name '${ACCESSORY_NAME}'"
37
+ else
38
+ echo "No ACCESSORY_ID or ACCESSORY_NAME resolved. Please set one." && exit 1
39
+ fi
40
+ fi
41
+
42
+ echo "Running advanced light E2E script against $HB_URL (accessory $ACCESSORY_ID)"
43
+
44
+ curl_common() {
45
+ local method="$1" path="$2" data="$3"
46
+ if [[ "$method" == "GET" ]]; then
47
+ curl -sS -H "Authorization: Bearer ${HB_TOKEN}" "${HB_URL}${path}"
48
+ else
49
+ curl -sS -X "$method" -H "Authorization: Bearer ${HB_TOKEN}" -H "Content-Type: application/json" -d "$data" "${HB_URL}${path}"
50
+ fi
51
+ }
52
+
53
+ echo "1) Fetch accessories listing"
54
+ curl_common GET "/api/accessories" ""
55
+
56
+ echo
57
+ echo "2) Toggle On"
58
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":11,"value":true}] }'
59
+ sleep 1
60
+
61
+ echo
62
+ echo "3) Brightness sweep: 10% -> 50% -> 100%"
63
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":12,"value":10}] }'
64
+ sleep 1
65
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":12,"value":50}] }'
66
+ sleep 1
67
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":12,"value":100}] }'
68
+ sleep 1
69
+
70
+ echo
71
+ echo "4) Color Temperature test (if supported): 2700K -> 4000K -> 6500K"
72
+ # HomeKit uses Mireds for color temperature; approximate conversions used here
73
+ MIREDS_2700=370
74
+ MIREDS_4000=250
75
+ MIREDS_6500=154
76
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" "{ \"characteristics\": [{\"aid\":1,\"iid\":14,\"value\":${MIREDS_2700}}] }"
77
+ sleep 1
78
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" "{ \"characteristics\": [{\"aid\":1,\"iid\":14,\"value\":${MIREDS_4000}}] }"
79
+ sleep 1
80
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" "{ \"characteristics\": [{\"aid\":1,\"iid\":14,\"value\":${MIREDS_6500}}] }"
81
+ sleep 1
82
+
83
+ echo
84
+ echo "5) Color (RGB) test (if supported): Red -> Green -> Blue"
85
+ # Many HomeKit bridges expose Hue (iid 15) and Saturation (iid 16). We'll set hue and sat values accordingly.
86
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":15,"value":0},{"aid":1,"iid":16,"value":100}] }'
87
+ sleep 1
88
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":15,"value":120},{"aid":1,"iid":16,"value":100}] }'
89
+ sleep 1
90
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":15,"value":240},{"aid":1,"iid":16,"value":100}] }'
91
+ sleep 1
92
+
93
+ echo
94
+ echo "6) Toggle Off"
95
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":11,"value":false}] }'
96
+
97
+ echo "Done. Review Homebridge logs and physical device behavior."
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env bash
2
+ # Lightweight automated E2E helper for lights.
3
+ # Usage:
4
+ # 1) Ensure Homebridge is running and the plugin is installed/linked.
5
+ # 2) Populate `HB_URL`, `HB_TOKEN`, and `ACCESSORY_ID` below (or export them).
6
+ # 3) Run: `bash scripts/e2e/light-e2e.sh`
7
+
8
+ set -euo pipefail
9
+
10
+ : ${HB_URL:="http://localhost:8581"}
11
+ : ${HB_TOKEN:=""}
12
+ : ${ACCESSORY_ID:=""}
13
+ : ${ACCESSORY_NAME:=""}
14
+
15
+ # Resolve accessory id (aid) from Homebridge API when ACCESSORY_NAME supplied
16
+ resolve_accessory_id() {
17
+ if [[ -n "$ACCESSORY_ID" ]]; then
18
+ return 0
19
+ fi
20
+ if [[ -z "$ACCESSORY_NAME" ]]; then
21
+ return 1
22
+ fi
23
+ local resp
24
+ resp=$(curl -sS -H "Authorization: Bearer ${HB_TOKEN}" "${HB_URL}/api/accessories") || return 1
25
+ ACCESSORY_ID=$(printf '%s' "$resp" | node -e "const fs=require('fs');const name=process.argv[1];const j=JSON.parse(fs.readFileSync(0,'utf8'));const arr=Array.isArray(j)?j:(j.accessories||j);for(const a of arr||[]){if(a.displayName===name||a.name===name||(a.context&&a.context.deviceId===name)){if(a.aid){console.log(a.aid);process.exit(0);}else if(a.UUID){console.log(a.UUID);process.exit(0);}}}process.exit(1);" "$ACCESSORY_NAME") || return 1
26
+ return 0
27
+ }
28
+
29
+ if [[ -z "$HB_TOKEN" ]]; then
30
+ echo "Please set HB_TOKEN environment variable or edit the top of this script."
31
+ exit 1
32
+ fi
33
+
34
+ if [[ -z "$ACCESSORY_ID" ]]; then
35
+ if resolve_accessory_id; then
36
+ echo "Discovered ACCESSORY_ID=${ACCESSORY_ID} for name '${ACCESSORY_NAME}'"
37
+ else
38
+ echo "No ACCESSORY_ID or ACCESSORY_NAME resolved. Please set one." && exit 1
39
+ fi
40
+ fi
41
+
42
+ echo "Running light E2E script against $HB_URL (accessory $ACCESSORY_ID)"
43
+
44
+ curl_common() {
45
+ local method="$1" path="$2" data="$3"
46
+ if [[ "$method" == "GET" ]]; then
47
+ curl -sS -H "Authorization: Bearer ${HB_TOKEN}" "${HB_URL}${path}"
48
+ else
49
+ curl -sS -X "$method" -H "Authorization: Bearer ${HB_TOKEN}" -H "Content-Type: application/json" -d "$data" "${HB_URL}${path}"
50
+ fi
51
+ }
52
+
53
+ echo "1) Fetch accessories listing (to verify connectivity)"
54
+ curl_common GET "/api/accessories" ""
55
+
56
+ echo
57
+ echo "2) Toggle On"
58
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":11,"value":true}] }'
59
+ sleep 1
60
+
61
+ echo
62
+ echo "3) Set Brightness to 25%"
63
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":12,"value":25}] }'
64
+ sleep 1
65
+
66
+ echo
67
+ echo "4) Set Brightness to 100%"
68
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":12,"value":100}] }'
69
+ sleep 1
70
+
71
+ echo
72
+ echo "5) Toggle Off"
73
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":11,"value":false}] }'
74
+
75
+ echo "Done. Review Homebridge logs and physical device behavior."
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+ # List accessories from Homebridge UI and print name, aid/UUID, and context.deviceId
3
+ # Usage:
4
+ # export HB_URL=http://localhost:8581
5
+ # export HB_TOKEN=your_token
6
+ # bash scripts/e2e/list-accessories.sh
7
+
8
+ set -euo pipefail
9
+
10
+ : ${HB_URL:="http://localhost:8581"}
11
+ : ${HB_TOKEN:=""}
12
+
13
+ if [[ -z "$HB_TOKEN" ]]; then
14
+ echo "Please set HB_TOKEN environment variable (Homebridge UI token)."
15
+ exit 1
16
+ fi
17
+
18
+ resp=$(curl -sS -H "Authorization: Bearer ${HB_TOKEN}" "${HB_URL}/api/accessories")
19
+ node -e "const fs=require('fs');const j=JSON.parse(fs.readFileSync(0,'utf8'));const arr=Array.isArray(j)?j:(j.accessories||j)||[];console.log('Name | aid/UUID | context.deviceId');for(const a of arr){const name=a.displayName||a.name||'(unknown)';const id=a.aid||a.UUID||'';const ctx=(a.context&&a.context.deviceId)||'';console.log(`${name} | ${id} | ${ctx}`);}" <<< "$resp"
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env bash
2
+ # Lightweight automated E2E helper for locks.
3
+ # Usage:
4
+ # 1) Ensure Homebridge is running and the plugin is installed/linked.
5
+ # 2) Populate `HB_URL`, `HB_TOKEN`, and `ACCESSORY_ID` below (or export them).
6
+ # 3) Run: `bash scripts/e2e/lock-e2e.sh`
7
+
8
+ set -euo pipefail
9
+
10
+ : ${HB_URL:="http://localhost:8581"}
11
+ : ${HB_TOKEN:=""}
12
+ : ${ACCESSORY_ID:=""}
13
+ : ${ACCESSORY_NAME:=""}
14
+
15
+ # Resolve accessory id (aid) from Homebridge API when ACCESSORY_NAME supplied
16
+ resolve_accessory_id() {
17
+ if [[ -n "$ACCESSORY_ID" ]]; then
18
+ return 0
19
+ fi
20
+ if [[ -z "$ACCESSORY_NAME" ]]; then
21
+ return 1
22
+ fi
23
+ local resp
24
+ resp=$(curl -sS -H "Authorization: Bearer ${HB_TOKEN}" "${HB_URL}/api/accessories") || return 1
25
+ ACCESSORY_ID=$(printf '%s' "$resp" | node -e "const fs=require('fs');const name=process.argv[1];const j=JSON.parse(fs.readFileSync(0,'utf8'));const arr=Array.isArray(j)?j:(j.accessories||j);for(const a of arr||[]){if(a.displayName===name||a.name===name||(a.context&&a.context.deviceId===name)){if(a.aid){console.log(a.aid);process.exit(0);}else if(a.UUID){console.log(a.UUID);process.exit(0);}}}process.exit(1);" "$ACCESSORY_NAME") || return 1
26
+ return 0
27
+ }
28
+
29
+ if [[ -z "$HB_TOKEN" ]]; then
30
+ echo "Please set HB_TOKEN environment variable or edit the top of this script."
31
+ exit 1
32
+ fi
33
+
34
+ if [[ -z "$ACCESSORY_ID" ]]; then
35
+ if resolve_accessory_id; then
36
+ echo "Discovered ACCESSORY_ID=${ACCESSORY_ID} for name '${ACCESSORY_NAME}'"
37
+ else
38
+ echo "No ACCESSORY_ID or ACCESSORY_NAME resolved. Please set one." && exit 1
39
+ fi
40
+ fi
41
+
42
+ echo "Running lock E2E script against $HB_URL (accessory $ACCESSORY_ID)"
43
+
44
+ curl_common() {
45
+ local method="$1" path="$2" data="$3"
46
+ if [[ "$method" == "GET" ]]; then
47
+ curl -sS -H "Authorization: Bearer ${HB_TOKEN}" "${HB_URL}${path}"
48
+ else
49
+ curl -sS -X "$method" -H "Authorization: Bearer ${HB_TOKEN}" -H "Content-Type: application/json" -d "$data" "${HB_URL}${path}"
50
+ fi
51
+ }
52
+
53
+ echo "1) Fetch accessories listing"
54
+ curl_common GET "/api/accessories" ""
55
+
56
+ echo
57
+ echo "2) Lock"
58
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":11,"value":1}] }'
59
+ sleep 1
60
+
61
+ echo
62
+ echo "3) Unlock"
63
+ curl_common POST "/api/accessories/${ACCESSORY_ID}/characteristics" '{ "characteristics": [{"aid":1,"iid":11,"value":0}] }'
64
+
65
+ echo "Done. Review Homebridge logs and physical device behavior."
@@ -0,0 +1,105 @@
1
+ import { execSync } from 'node:child_process'
2
+ import { readFileSync } from 'node:fs'
3
+ import { homedir } from 'node:os'
4
+ import { resolve } from 'node:path'
5
+
6
+ function resolvePorts() {
7
+ let bridgePort = 51829
8
+ let uiPort = 8581
9
+
10
+ try {
11
+ const configPath = resolve(homedir(), '.homebridge-dev', 'config.json')
12
+ const config = JSON.parse(readFileSync(configPath, 'utf8'))
13
+
14
+ if (typeof config?.bridge?.port === 'number') {
15
+ bridgePort = config.bridge.port
16
+ }
17
+
18
+ const configUiPlatform = Array.isArray(config?.platforms)
19
+ ? config.platforms.find(platform => platform?.platform === 'config')
20
+ : undefined
21
+
22
+ if (typeof configUiPlatform?.port === 'number') {
23
+ uiPort = configUiPlatform.port
24
+ }
25
+ } catch {}
26
+
27
+ return [...new Set([bridgePort, uiPort])]
28
+ }
29
+
30
+ function pidsForPort(port) {
31
+ try {
32
+ const output = execSync(`lsof -ti tcp:${port}`, { stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim()
33
+ return output ? output.split('\n').filter(Boolean) : []
34
+ } catch {
35
+ return []
36
+ }
37
+ }
38
+
39
+ function freePort(port) {
40
+ const initialPids = pidsForPort(port)
41
+ if (initialPids.length === 0) {
42
+ return
43
+ }
44
+
45
+ try {
46
+ execSync(`lsof -ti tcp:${port} | xargs -r kill -TERM`, { stdio: ['ignore', 'ignore', 'ignore'] })
47
+ } catch {}
48
+
49
+ const remainingPids = pidsForPort(port)
50
+ if (remainingPids.length > 0) {
51
+ try {
52
+ execSync(`lsof -ti tcp:${port} | xargs -r kill -KILL`, { stdio: ['ignore', 'ignore', 'ignore'] })
53
+ } catch {}
54
+ }
55
+ }
56
+
57
+ function cleanupDevProcesses() {
58
+ let output = ''
59
+ try {
60
+ output = execSync('ps -axo pid=,command=', { stdio: ['ignore', 'pipe', 'ignore'] }).toString()
61
+ } catch {
62
+ return
63
+ }
64
+
65
+ const targetPids = output
66
+ .split('\n')
67
+ .map(line => line.trim())
68
+ .filter(Boolean)
69
+ .map((line) => {
70
+ const firstSpace = line.indexOf(' ')
71
+ if (firstSpace === -1) {
72
+ return null
73
+ }
74
+
75
+ const pid = Number(line.slice(0, firstSpace).trim())
76
+ const command = line.slice(firstSpace + 1)
77
+ return Number.isFinite(pid) ? { pid, command } : null
78
+ })
79
+ .filter((entry) => {
80
+ if (!entry) {
81
+ return false
82
+ }
83
+
84
+ if (entry.pid === process.pid || entry.pid === process.ppid) {
85
+ return false
86
+ }
87
+
88
+ const isNodemonProcess = entry.command.includes('homebridge-switchbot/node_modules/.bin/nodemon')
89
+ const isConfigUiProcess = entry.command.trim().startsWith('homebridge-config-ui-x')
90
+ return isNodemonProcess || isConfigUiProcess
91
+ })
92
+ .map(entry => entry.pid)
93
+
94
+ for (const pid of targetPids) {
95
+ try {
96
+ process.kill(pid, 'SIGTERM')
97
+ } catch {}
98
+ }
99
+ }
100
+
101
+ cleanupDevProcesses()
102
+
103
+ for (const port of resolvePorts()) {
104
+ freePort(port)
105
+ }
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ const fs = require('fs')
3
+ const path = require('path')
4
+
5
+ function usage() {
6
+ console.error('Usage: node scripts/generate-matter-maps.js <input-json> [output-file]')
7
+ process.exit(2)
8
+ }
9
+
10
+ const input = process.argv[2]
11
+ const outFile = process.argv[3] || path.join(__dirname, '..', 'src', 'matter-maps.generated.ts')
12
+
13
+ if (!input) usage()
14
+ if (!fs.existsSync(input)) {
15
+ console.error('Input file not found:', input)
16
+ process.exit(2)
17
+ }
18
+
19
+ const json = JSON.parse(fs.readFileSync(input, 'utf8'))
20
+
21
+ // Expecting structure: { clusters: [{ name, id, attributes: [{ name, id }, ...] }, ...] }
22
+ const clusters = json.clusters || []
23
+
24
+ const clusterMapEntries = []
25
+ const attrGroups = {}
26
+
27
+ for (const c of clusters) {
28
+ if (!c.name || typeof c.id === 'undefined') continue
29
+ const key = c.name.replace(/[^A-Za-z0-9_]/g, '')
30
+ clusterMapEntries.push(` ${key}: 0x${parseInt(String(c.id), 10).toString(16)}`)
31
+ const attrs = {}
32
+ if (Array.isArray(c.attributes)) {
33
+ for (const a of c.attributes) {
34
+ if (!a.name || typeof a.id === 'undefined') continue
35
+ const an = a.name.replace(/[^A-Za-z0-9_]/g, '')
36
+ attrs[an] = `0x${parseInt(String(a.id), 10).toString(16)}`
37
+ }
38
+ }
39
+ if (Object.keys(attrs).length) attrGroups[key] = attrs
40
+ }
41
+
42
+ const clusterMap = `export const MATTER_CLUSTER_IDS = {
43
+ ${clusterMapEntries.join(',\n')}
44
+ } as const
45
+ \n`
46
+
47
+ let attrText = 'export const MATTER_ATTRIBUTE_IDS = {\n'
48
+ for (const [k, v] of Object.entries(attrGroups)) {
49
+ attrText += ` ${k}: {\n`
50
+ for (const [an, aid] of Object.entries(v)) {
51
+ attrText += ` ${an}: ${aid},\n`
52
+ }
53
+ attrText += ` },\n`
54
+ }
55
+ attrText += `} as const\n`
56
+
57
+ const fileContent = `// GENERATED FILE - do not edit by hand.\n// Run: node scripts/generate-matter-maps.js <zap-matter.json>\n\n${clusterMap}\n${attrText}`
58
+
59
+ fs.writeFileSync(outFile, fileContent, 'utf8')
60
+ console.log('Wrote', outFile)
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+ # Wrapper to run the repository's E2E vitest harness locally.
3
+ # Usage: export HB_URL HB_TOKEN [LIGHT_ACCESSORY_ID ...]; export RUN_E2E=1; bash scripts/run-e2e-local.sh
4
+
5
+ set -euo pipefail
6
+
7
+ : ${RUN_E2E:=1}
8
+
9
+ echo "Running E2E vitest harness (RUN_E2E=${RUN_E2E})"
10
+
11
+ # Run only the e2e spec file so the full unit test suite isn't executed
12
+ npx vitest run test/e2e/run-e2e.spec.ts
13
+
14
+ echo "E2E harness finished. Check logs for per-script output."
@@ -0,0 +1,28 @@
1
+ import fs from 'node:fs'
2
+ import path from 'node:path'
3
+
4
+ const root = process.cwd()
5
+ const sourcePath = path.join(root, 'src/device-types.ts')
6
+ const schemaPath = path.join(root, 'config.schema.json')
7
+
8
+ const source = fs.readFileSync(sourcePath, 'utf8')
9
+ const schemaRaw = fs.readFileSync(schemaPath, 'utf8')
10
+ const schema = JSON.parse(schemaRaw)
11
+
12
+ const match = source.match(/export const DEVICE_TYPES = (\{[\s\S]*?\}) as const/)
13
+ if (!match) {
14
+ throw new Error('Could not find DEVICE_TYPES in src/device-types.ts')
15
+ }
16
+
17
+ const deviceTypesByCategory = Function(`return (${match[1]})`)()
18
+ const enumValues = [...new Set(Object.values(deviceTypesByCategory).flat())]
19
+
20
+ const configDeviceType = schema?.schema?.properties?.devices?.items?.properties?.configDeviceType
21
+ if (!configDeviceType) {
22
+ throw new Error('Could not locate schema.properties.devices.items.properties.configDeviceType')
23
+ }
24
+
25
+ configDeviceType.enum = enumValues
26
+
27
+ fs.writeFileSync(schemaPath, `${JSON.stringify(schema, null, 2)}\n`, 'utf8')
28
+ console.log(`Synchronized ${enumValues.length} device types into config.schema.json`)