@switchbot/homebridge-switchbot 5.0.0-beta.70 → 5.0.0-beta.71

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 (534) hide show
  1. package/.github/ISSUE_TEMPLATE/e2e-verification.md +36 -0
  2. package/.github/workflows/ci.yml +61 -0
  3. package/.github/workflows/manual-e2e.yml +103 -0
  4. package/CHANGELOG.md +20 -0
  5. package/E2E-VERIFICATION.md +121 -0
  6. package/MIGRATION.md +44 -0
  7. package/README.md +11 -0
  8. package/config.schema.json +99 -1940
  9. package/dist/deviceFactory.d.ts +13 -0
  10. package/dist/deviceFactory.d.ts.map +1 -0
  11. package/dist/deviceFactory.js +81 -0
  12. package/dist/deviceFactory.js.map +1 -0
  13. package/dist/devices/deviceBase.d.ts +50 -0
  14. package/dist/devices/deviceBase.d.ts.map +1 -0
  15. package/dist/devices/deviceBase.js +119 -0
  16. package/dist/devices/deviceBase.js.map +1 -0
  17. package/dist/devices/genericDevice.d.ts +283 -0
  18. package/dist/devices/genericDevice.d.ts.map +1 -0
  19. package/dist/devices/genericDevice.js +1035 -0
  20. package/dist/devices/genericDevice.js.map +1 -0
  21. package/dist/homebridge-ui/public/index.html +72 -440
  22. package/dist/homebridge-ui/server.d.ts +3 -1
  23. package/dist/homebridge-ui/server.d.ts.map +1 -1
  24. package/dist/homebridge-ui/server.js +47 -10
  25. package/dist/homebridge-ui/server.js.map +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -5
  28. package/dist/index.js.map +1 -1
  29. package/dist/platform.d.ts +27 -0
  30. package/dist/platform.d.ts.map +1 -0
  31. package/dist/platform.js +404 -0
  32. package/dist/platform.js.map +1 -0
  33. package/dist/settings.d.ts +10 -317
  34. package/dist/settings.d.ts.map +1 -1
  35. package/dist/settings.js +5 -30
  36. package/dist/settings.js.map +1 -1
  37. package/dist/switchbotClient.d.ts +32 -0
  38. package/dist/switchbotClient.d.ts.map +1 -0
  39. package/dist/switchbotClient.js +259 -0
  40. package/dist/switchbotClient.js.map +1 -0
  41. package/dist/utils.d.ts +36 -248
  42. package/dist/utils.d.ts.map +1 -1
  43. package/dist/utils.js +38 -1367
  44. package/dist/utils.js.map +1 -1
  45. package/docs/assets/icons.js +1 -1
  46. package/docs/assets/icons.svg +1 -1
  47. package/docs/assets/style.css +3 -3
  48. package/docs/index.html +50 -15
  49. package/docs/variables/default.html +1 -1
  50. package/package.json +19 -18
  51. package/scripts/e2e/README.md +25 -0
  52. package/scripts/e2e/curtain-e2e.sh +70 -0
  53. package/scripts/e2e/fan-e2e.sh +75 -0
  54. package/scripts/e2e/light-advanced-e2e.sh +97 -0
  55. package/scripts/e2e/light-e2e.sh +75 -0
  56. package/scripts/e2e/list-accessories.sh +19 -0
  57. package/scripts/e2e/lock-e2e.sh +65 -0
  58. package/scripts/generate-matter-maps.js +60 -0
  59. package/scripts/run-e2e-local.sh +14 -0
  60. package/src/deviceFactory.ts +122 -0
  61. package/src/devices/deviceBase.ts +141 -0
  62. package/src/devices/genericDevice.ts +965 -0
  63. package/src/homebridge-ui/public/index.html +72 -440
  64. package/src/homebridge-ui/server.ts +52 -10
  65. package/src/index.ts +3 -5
  66. package/src/platform.ts +395 -0
  67. package/src/settings.ts +12 -352
  68. package/src/switchbotClient.ts +266 -0
  69. package/src/utils.ts +47 -1456
  70. package/test/accessory-restore.spec.ts +73 -0
  71. package/test/device-mapping.spec.ts +37 -0
  72. package/test/deviceFactory.spec.ts +18 -0
  73. package/test/e2e/run-e2e.spec.ts +50 -0
  74. package/test/fan-swing.spec.ts +29 -0
  75. package/test/helpers/matter-harness.ts +53 -0
  76. package/test/lock-users.spec.ts +44 -0
  77. package/test/matter-childbridge.spec.ts +55 -0
  78. package/test/matter-descriptors.spec.ts +97 -0
  79. package/test/matter-device-state.spec.ts +101 -0
  80. package/test/matter-integration.spec.ts +70 -0
  81. package/test/platform.integration.spec.ts +55 -0
  82. package/test/switchbot-client-debounce.spec.ts +131 -0
  83. package/test/switchbot-client-openapi.spec.ts +56 -0
  84. package/test/switchbotClient.spec.ts +10 -0
  85. package/test/utils.spec.ts +20 -0
  86. package/vitest.config.ts +7 -0
  87. package/coverage/base.css +0 -224
  88. package/coverage/block-navigation.js +0 -87
  89. package/coverage/clover.xml +0 -15847
  90. package/coverage/coverage-final.json +0 -42
  91. package/coverage/docs/assets/dmt/dmt-component-data.js.html +0 -85
  92. package/coverage/docs/assets/dmt/dmt-components.js.html +0 -286
  93. package/coverage/docs/assets/dmt/index.html +0 -131
  94. package/coverage/docs/assets/hierarchy.js.html +0 -85
  95. package/coverage/docs/assets/icons.js.html +0 -136
  96. package/coverage/docs/assets/index.html +0 -146
  97. package/coverage/docs/assets/main.js.html +0 -265
  98. package/coverage/favicon.png +0 -0
  99. package/coverage/index.html +0 -191
  100. package/coverage/prettify.css +0 -1
  101. package/coverage/prettify.js +0 -2
  102. package/coverage/sort-arrow-sprite.png +0 -0
  103. package/coverage/sorter.js +0 -196
  104. package/coverage/src/device/blindtilt.ts.html +0 -3238
  105. package/coverage/src/device/bot.ts.html +0 -2803
  106. package/coverage/src/device/ceilinglight.ts.html +0 -2338
  107. package/coverage/src/device/colorbulb.ts.html +0 -2824
  108. package/coverage/src/device/contact.ts.html +0 -1465
  109. package/coverage/src/device/curtain.ts.html +0 -2869
  110. package/coverage/src/device/device.ts.html +0 -2500
  111. package/coverage/src/device/fan.ts.html +0 -2242
  112. package/coverage/src/device/hub.ts.html +0 -1408
  113. package/coverage/src/device/humidifier.ts.html +0 -2116
  114. package/coverage/src/device/index.html +0 -416
  115. package/coverage/src/device/iosensor.ts.html +0 -1375
  116. package/coverage/src/device/lightstrip.ts.html +0 -2617
  117. package/coverage/src/device/lock.ts.html +0 -1963
  118. package/coverage/src/device/meter.ts.html +0 -1372
  119. package/coverage/src/device/meterplus.ts.html +0 -1384
  120. package/coverage/src/device/meterpro.ts.html +0 -1618
  121. package/coverage/src/device/motion.ts.html +0 -1264
  122. package/coverage/src/device/plug.ts.html +0 -1372
  123. package/coverage/src/device/relayswitch.ts.html +0 -2284
  124. package/coverage/src/device/robotvacuumcleaner.ts.html +0 -1810
  125. package/coverage/src/device/waterdetector.ts.html +0 -1294
  126. package/coverage/src/homebridge-ui/index.html +0 -116
  127. package/coverage/src/homebridge-ui/server.ts.html +0 -229
  128. package/coverage/src/index.html +0 -161
  129. package/coverage/src/index.ts.html +0 -124
  130. package/coverage/src/irdevice/airconditioner.ts.html +0 -1687
  131. package/coverage/src/irdevice/airpurifier.ts.html +0 -844
  132. package/coverage/src/irdevice/camera.ts.html +0 -475
  133. package/coverage/src/irdevice/fan.ts.html +0 -766
  134. package/coverage/src/irdevice/index.html +0 -251
  135. package/coverage/src/irdevice/irdevice.ts.html +0 -1117
  136. package/coverage/src/irdevice/light.ts.html +0 -826
  137. package/coverage/src/irdevice/other.ts.html +0 -2458
  138. package/coverage/src/irdevice/tv.ts.html +0 -1222
  139. package/coverage/src/irdevice/vacuumcleaner.ts.html +0 -466
  140. package/coverage/src/irdevice/waterheater.ts.html +0 -469
  141. package/coverage/src/platform.ts.html +0 -8776
  142. package/coverage/src/settings.ts.html +0 -934
  143. package/coverage/src/utils.ts.html +0 -2092
  144. package/dist/devices-hap/airpurifier.d.ts +0 -54
  145. package/dist/devices-hap/airpurifier.d.ts.map +0 -1
  146. package/dist/devices-hap/airpurifier.js +0 -533
  147. package/dist/devices-hap/airpurifier.js.map +0 -1
  148. package/dist/devices-hap/blindtilt.d.ts +0 -90
  149. package/dist/devices-hap/blindtilt.d.ts.map +0 -1
  150. package/dist/devices-hap/blindtilt.js +0 -974
  151. package/dist/devices-hap/blindtilt.js.map +0 -1
  152. package/dist/devices-hap/bot.d.ts +0 -102
  153. package/dist/devices-hap/bot.d.ts.map +0 -1
  154. package/dist/devices-hap/bot.js +0 -822
  155. package/dist/devices-hap/bot.js.map +0 -1
  156. package/dist/devices-hap/ceilinglight.d.ts +0 -85
  157. package/dist/devices-hap/ceilinglight.d.ts.map +0 -1
  158. package/dist/devices-hap/ceilinglight.js +0 -707
  159. package/dist/devices-hap/ceilinglight.js.map +0 -1
  160. package/dist/devices-hap/colorbulb.d.ts +0 -88
  161. package/dist/devices-hap/colorbulb.d.ts.map +0 -1
  162. package/dist/devices-hap/colorbulb.js +0 -921
  163. package/dist/devices-hap/colorbulb.js.map +0 -1
  164. package/dist/devices-hap/contact.d.ts +0 -44
  165. package/dist/devices-hap/contact.d.ts.map +0 -1
  166. package/dist/devices-hap/contact.js +0 -409
  167. package/dist/devices-hap/contact.js.map +0 -1
  168. package/dist/devices-hap/curtain.d.ts +0 -73
  169. package/dist/devices-hap/curtain.d.ts.map +0 -1
  170. package/dist/devices-hap/curtain.js +0 -869
  171. package/dist/devices-hap/curtain.js.map +0 -1
  172. package/dist/devices-hap/device.d.ts +0 -108
  173. package/dist/devices-hap/device.d.ts.map +0 -1
  174. package/dist/devices-hap/device.js +0 -821
  175. package/dist/devices-hap/device.js.map +0 -1
  176. package/dist/devices-hap/fan.d.ts +0 -69
  177. package/dist/devices-hap/fan.d.ts.map +0 -1
  178. package/dist/devices-hap/fan.js +0 -655
  179. package/dist/devices-hap/fan.js.map +0 -1
  180. package/dist/devices-hap/hub.d.ts +0 -37
  181. package/dist/devices-hap/hub.d.ts.map +0 -1
  182. package/dist/devices-hap/hub.js +0 -393
  183. package/dist/devices-hap/hub.js.map +0 -1
  184. package/dist/devices-hap/humidifier.d.ts +0 -73
  185. package/dist/devices-hap/humidifier.d.ts.map +0 -1
  186. package/dist/devices-hap/humidifier.js +0 -716
  187. package/dist/devices-hap/humidifier.js.map +0 -1
  188. package/dist/devices-hap/iosensor.d.ts +0 -42
  189. package/dist/devices-hap/iosensor.d.ts.map +0 -1
  190. package/dist/devices-hap/iosensor.js +0 -397
  191. package/dist/devices-hap/iosensor.js.map +0 -1
  192. package/dist/devices-hap/lightstrip.d.ts +0 -79
  193. package/dist/devices-hap/lightstrip.d.ts.map +0 -1
  194. package/dist/devices-hap/lightstrip.js +0 -827
  195. package/dist/devices-hap/lightstrip.js.map +0 -1
  196. package/dist/devices-hap/lock.d.ts +0 -53
  197. package/dist/devices-hap/lock.d.ts.map +0 -1
  198. package/dist/devices-hap/lock.js +0 -569
  199. package/dist/devices-hap/lock.js.map +0 -1
  200. package/dist/devices-hap/meter.d.ts +0 -37
  201. package/dist/devices-hap/meter.d.ts.map +0 -1
  202. package/dist/devices-hap/meter.js +0 -380
  203. package/dist/devices-hap/meter.js.map +0 -1
  204. package/dist/devices-hap/meterplus.d.ts +0 -42
  205. package/dist/devices-hap/meterplus.d.ts.map +0 -1
  206. package/dist/devices-hap/meterplus.js +0 -385
  207. package/dist/devices-hap/meterplus.js.map +0 -1
  208. package/dist/devices-hap/meterpro.d.ts +0 -43
  209. package/dist/devices-hap/meterpro.d.ts.map +0 -1
  210. package/dist/devices-hap/meterpro.js +0 -469
  211. package/dist/devices-hap/meterpro.js.map +0 -1
  212. package/dist/devices-hap/motion.d.ts +0 -42
  213. package/dist/devices-hap/motion.d.ts.map +0 -1
  214. package/dist/devices-hap/motion.js +0 -345
  215. package/dist/devices-hap/motion.js.map +0 -1
  216. package/dist/devices-hap/plug.d.ts +0 -49
  217. package/dist/devices-hap/plug.d.ts.map +0 -1
  218. package/dist/devices-hap/plug.js +0 -400
  219. package/dist/devices-hap/plug.js.map +0 -1
  220. package/dist/devices-hap/relayswitch.d.ts +0 -96
  221. package/dist/devices-hap/relayswitch.d.ts.map +0 -1
  222. package/dist/devices-hap/relayswitch.js +0 -642
  223. package/dist/devices-hap/relayswitch.js.map +0 -1
  224. package/dist/devices-hap/robotvacuumcleaner.d.ts +0 -54
  225. package/dist/devices-hap/robotvacuumcleaner.d.ts.map +0 -1
  226. package/dist/devices-hap/robotvacuumcleaner.js +0 -530
  227. package/dist/devices-hap/robotvacuumcleaner.js.map +0 -1
  228. package/dist/devices-hap/waterdetector.d.ts +0 -41
  229. package/dist/devices-hap/waterdetector.d.ts.map +0 -1
  230. package/dist/devices-hap/waterdetector.js +0 -356
  231. package/dist/devices-hap/waterdetector.js.map +0 -1
  232. package/dist/devices-matter/BaseMatterAccessory.d.ts +0 -90
  233. package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
  234. package/dist/devices-matter/BaseMatterAccessory.js +0 -264
  235. package/dist/devices-matter/BaseMatterAccessory.js.map +0 -1
  236. package/dist/devices-matter/ColorLightAccessory.d.ts +0 -20
  237. package/dist/devices-matter/ColorLightAccessory.d.ts.map +0 -1
  238. package/dist/devices-matter/ColorLightAccessory.js +0 -95
  239. package/dist/devices-matter/ColorLightAccessory.js.map +0 -1
  240. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +0 -18
  241. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +0 -1
  242. package/dist/devices-matter/ColorTemperatureLightAccessory.js +0 -76
  243. package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +0 -1
  244. package/dist/devices-matter/ContactSensorAccessory.d.ts +0 -12
  245. package/dist/devices-matter/ContactSensorAccessory.d.ts.map +0 -1
  246. package/dist/devices-matter/ContactSensorAccessory.js +0 -34
  247. package/dist/devices-matter/ContactSensorAccessory.js.map +0 -1
  248. package/dist/devices-matter/DimmableLightAccessory.d.ts +0 -58
  249. package/dist/devices-matter/DimmableLightAccessory.d.ts.map +0 -1
  250. package/dist/devices-matter/DimmableLightAccessory.js +0 -167
  251. package/dist/devices-matter/DimmableLightAccessory.js.map +0 -1
  252. package/dist/devices-matter/DoorLockAccessory.d.ts +0 -14
  253. package/dist/devices-matter/DoorLockAccessory.d.ts.map +0 -1
  254. package/dist/devices-matter/DoorLockAccessory.js +0 -50
  255. package/dist/devices-matter/DoorLockAccessory.js.map +0 -1
  256. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +0 -21
  257. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +0 -1
  258. package/dist/devices-matter/ExtendedColorLightAccessory.js +0 -106
  259. package/dist/devices-matter/ExtendedColorLightAccessory.js.map +0 -1
  260. package/dist/devices-matter/FanAccessory.d.ts +0 -16
  261. package/dist/devices-matter/FanAccessory.d.ts.map +0 -1
  262. package/dist/devices-matter/FanAccessory.js +0 -81
  263. package/dist/devices-matter/FanAccessory.js.map +0 -1
  264. package/dist/devices-matter/HumiditySensorAccessory.d.ts +0 -12
  265. package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +0 -1
  266. package/dist/devices-matter/HumiditySensorAccessory.js +0 -34
  267. package/dist/devices-matter/HumiditySensorAccessory.js.map +0 -1
  268. package/dist/devices-matter/LeakSensorAccessory.d.ts +0 -12
  269. package/dist/devices-matter/LeakSensorAccessory.d.ts.map +0 -1
  270. package/dist/devices-matter/LeakSensorAccessory.js +0 -33
  271. package/dist/devices-matter/LeakSensorAccessory.js.map +0 -1
  272. package/dist/devices-matter/LightSensorAccessory.d.ts +0 -12
  273. package/dist/devices-matter/LightSensorAccessory.d.ts.map +0 -1
  274. package/dist/devices-matter/LightSensorAccessory.js +0 -34
  275. package/dist/devices-matter/LightSensorAccessory.js.map +0 -1
  276. package/dist/devices-matter/OccupancySensorAccessory.d.ts +0 -12
  277. package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +0 -1
  278. package/dist/devices-matter/OccupancySensorAccessory.js +0 -39
  279. package/dist/devices-matter/OccupancySensorAccessory.js.map +0 -1
  280. package/dist/devices-matter/OnOffLightAccessory.d.ts +0 -38
  281. package/dist/devices-matter/OnOffLightAccessory.d.ts.map +0 -1
  282. package/dist/devices-matter/OnOffLightAccessory.js +0 -110
  283. package/dist/devices-matter/OnOffLightAccessory.js.map +0 -1
  284. package/dist/devices-matter/OnOffOutletAccessory.d.ts +0 -14
  285. package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +0 -1
  286. package/dist/devices-matter/OnOffOutletAccessory.js +0 -43
  287. package/dist/devices-matter/OnOffOutletAccessory.js.map +0 -1
  288. package/dist/devices-matter/OnOffSwitchAccessory.d.ts +0 -14
  289. package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +0 -1
  290. package/dist/devices-matter/OnOffSwitchAccessory.js +0 -42
  291. package/dist/devices-matter/OnOffSwitchAccessory.js.map +0 -1
  292. package/dist/devices-matter/RoboticVacuumAccessory.d.ts +0 -61
  293. package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +0 -1
  294. package/dist/devices-matter/RoboticVacuumAccessory.js +0 -544
  295. package/dist/devices-matter/RoboticVacuumAccessory.js.map +0 -1
  296. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +0 -11
  297. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +0 -1
  298. package/dist/devices-matter/SmokeCOAlarmAccessory.js +0 -49
  299. package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +0 -1
  300. package/dist/devices-matter/TemperatureSensorAccessory.d.ts +0 -12
  301. package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +0 -1
  302. package/dist/devices-matter/TemperatureSensorAccessory.js +0 -36
  303. package/dist/devices-matter/TemperatureSensorAccessory.js.map +0 -1
  304. package/dist/devices-matter/ThermostatAccessory.d.ts +0 -19
  305. package/dist/devices-matter/ThermostatAccessory.d.ts.map +0 -1
  306. package/dist/devices-matter/ThermostatAccessory.js +0 -95
  307. package/dist/devices-matter/ThermostatAccessory.js.map +0 -1
  308. package/dist/devices-matter/VenetianBlindAccessory.d.ts +0 -19
  309. package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +0 -1
  310. package/dist/devices-matter/VenetianBlindAccessory.js +0 -99
  311. package/dist/devices-matter/VenetianBlindAccessory.js.map +0 -1
  312. package/dist/devices-matter/WindowBlindAccessory.d.ts +0 -17
  313. package/dist/devices-matter/WindowBlindAccessory.d.ts.map +0 -1
  314. package/dist/devices-matter/WindowBlindAccessory.js +0 -131
  315. package/dist/devices-matter/WindowBlindAccessory.js.map +0 -1
  316. package/dist/devices-matter/custom/PowerStripAccessory.d.ts +0 -97
  317. package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +0 -1
  318. package/dist/devices-matter/custom/PowerStripAccessory.js +0 -265
  319. package/dist/devices-matter/custom/PowerStripAccessory.js.map +0 -1
  320. package/dist/devices-matter/custom/index.d.ts +0 -8
  321. package/dist/devices-matter/custom/index.d.ts.map +0 -1
  322. package/dist/devices-matter/custom/index.js +0 -8
  323. package/dist/devices-matter/custom/index.js.map +0 -1
  324. package/dist/devices-matter/index.d.ts +0 -29
  325. package/dist/devices-matter/index.d.ts.map +0 -1
  326. package/dist/devices-matter/index.js +0 -28
  327. package/dist/devices-matter/index.js.map +0 -1
  328. package/dist/irdevice/airconditioner.d.ts +0 -61
  329. package/dist/irdevice/airconditioner.d.ts.map +0 -1
  330. package/dist/irdevice/airconditioner.js +0 -472
  331. package/dist/irdevice/airconditioner.js.map +0 -1
  332. package/dist/irdevice/airpurifier.d.ts +0 -50
  333. package/dist/irdevice/airpurifier.d.ts.map +0 -1
  334. package/dist/irdevice/airpurifier.js +0 -213
  335. package/dist/irdevice/airpurifier.js.map +0 -1
  336. package/dist/irdevice/camera.d.ts +0 -32
  337. package/dist/irdevice/camera.d.ts.map +0 -1
  338. package/dist/irdevice/camera.js +0 -107
  339. package/dist/irdevice/camera.js.map +0 -1
  340. package/dist/irdevice/fan.d.ts +0 -36
  341. package/dist/irdevice/fan.d.ts.map +0 -1
  342. package/dist/irdevice/fan.js +0 -200
  343. package/dist/irdevice/fan.js.map +0 -1
  344. package/dist/irdevice/irdevice.d.ts +0 -69
  345. package/dist/irdevice/irdevice.d.ts.map +0 -1
  346. package/dist/irdevice/irdevice.js +0 -339
  347. package/dist/irdevice/irdevice.js.map +0 -1
  348. package/dist/irdevice/light.d.ts +0 -36
  349. package/dist/irdevice/light.d.ts.map +0 -1
  350. package/dist/irdevice/light.js +0 -206
  351. package/dist/irdevice/light.js.map +0 -1
  352. package/dist/irdevice/other.d.ts +0 -57
  353. package/dist/irdevice/other.d.ts.map +0 -1
  354. package/dist/irdevice/other.js +0 -778
  355. package/dist/irdevice/other.js.map +0 -1
  356. package/dist/irdevice/tv.d.ts +0 -45
  357. package/dist/irdevice/tv.d.ts.map +0 -1
  358. package/dist/irdevice/tv.js +0 -327
  359. package/dist/irdevice/tv.js.map +0 -1
  360. package/dist/irdevice/vacuumcleaner.d.ts +0 -28
  361. package/dist/irdevice/vacuumcleaner.d.ts.map +0 -1
  362. package/dist/irdevice/vacuumcleaner.js +0 -104
  363. package/dist/irdevice/vacuumcleaner.js.map +0 -1
  364. package/dist/irdevice/waterheater.d.ts +0 -30
  365. package/dist/irdevice/waterheater.d.ts.map +0 -1
  366. package/dist/irdevice/waterheater.js +0 -105
  367. package/dist/irdevice/waterheater.js.map +0 -1
  368. package/dist/platform-hap.d.ts +0 -160
  369. package/dist/platform-hap.d.ts.map +0 -1
  370. package/dist/platform-hap.js +0 -3041
  371. package/dist/platform-hap.js.map +0 -1
  372. package/dist/platform-matter.d.ts +0 -188
  373. package/dist/platform-matter.d.ts.map +0 -1
  374. package/dist/platform-matter.js +0 -2545
  375. package/dist/platform-matter.js.map +0 -1
  376. package/dist/test/apiRequestTracker.test.d.ts +0 -2
  377. package/dist/test/apiRequestTracker.test.d.ts.map +0 -1
  378. package/dist/test/apiRequestTracker.test.js +0 -392
  379. package/dist/test/apiRequestTracker.test.js.map +0 -1
  380. package/dist/test/hap/device-webhook-context.test.d.ts +0 -2
  381. package/dist/test/hap/device-webhook-context.test.d.ts.map +0 -1
  382. package/dist/test/hap/device-webhook-context.test.js +0 -128
  383. package/dist/test/hap/device-webhook-context.test.js.map +0 -1
  384. package/dist/test/hap/platform-hap.logging.test.d.ts +0 -2
  385. package/dist/test/hap/platform-hap.logging.test.d.ts.map +0 -1
  386. package/dist/test/hap/platform-hap.logging.test.js +0 -33
  387. package/dist/test/hap/platform-hap.logging.test.js.map +0 -1
  388. package/dist/test/hap/platform-hap.test.d.ts +0 -2
  389. package/dist/test/hap/platform-hap.test.d.ts.map +0 -1
  390. package/dist/test/hap/platform-hap.test.js +0 -62
  391. package/dist/test/hap/platform-hap.test.js.map +0 -1
  392. package/dist/test/helpers/platform-fixtures.d.ts +0 -9
  393. package/dist/test/helpers/platform-fixtures.d.ts.map +0 -1
  394. package/dist/test/helpers/platform-fixtures.js +0 -30
  395. package/dist/test/helpers/platform-fixtures.js.map +0 -1
  396. package/dist/test/homebridge-ui/server.test.d.ts +0 -2
  397. package/dist/test/homebridge-ui/server.test.d.ts.map +0 -1
  398. package/dist/test/homebridge-ui/server.test.js +0 -445
  399. package/dist/test/homebridge-ui/server.test.js.map +0 -1
  400. package/dist/test/index.test.d.ts +0 -2
  401. package/dist/test/index.test.d.ts.map +0 -1
  402. package/dist/test/index.test.js +0 -19
  403. package/dist/test/index.test.js.map +0 -1
  404. package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts +0 -2
  405. package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts.map +0 -1
  406. package/dist/test/matter/devices-matter/baseMatterAccessory.test.js +0 -71
  407. package/dist/test/matter/devices-matter/baseMatterAccessory.test.js.map +0 -1
  408. package/dist/test/matter/platform-matter.additional.test.d.ts +0 -2
  409. package/dist/test/matter/platform-matter.additional.test.d.ts.map +0 -1
  410. package/dist/test/matter/platform-matter.additional.test.js +0 -35
  411. package/dist/test/matter/platform-matter.additional.test.js.map +0 -1
  412. package/dist/test/matter/platform-matter.bleparse.test.d.ts +0 -2
  413. package/dist/test/matter/platform-matter.bleparse.test.d.ts.map +0 -1
  414. package/dist/test/matter/platform-matter.bleparse.test.js +0 -43
  415. package/dist/test/matter/platform-matter.bleparse.test.js.map +0 -1
  416. package/dist/test/matter/platform-matter.cleanup.test.d.ts +0 -2
  417. package/dist/test/matter/platform-matter.cleanup.test.d.ts.map +0 -1
  418. package/dist/test/matter/platform-matter.cleanup.test.js +0 -70
  419. package/dist/test/matter/platform-matter.cleanup.test.js.map +0 -1
  420. package/dist/test/matter/platform-matter.keepstale.test.d.ts +0 -2
  421. package/dist/test/matter/platform-matter.keepstale.test.d.ts.map +0 -1
  422. package/dist/test/matter/platform-matter.keepstale.test.js +0 -27
  423. package/dist/test/matter/platform-matter.keepstale.test.js.map +0 -1
  424. package/dist/test/matter/platform-matter.logging.test.d.ts +0 -2
  425. package/dist/test/matter/platform-matter.logging.test.d.ts.map +0 -1
  426. package/dist/test/matter/platform-matter.logging.test.js +0 -29
  427. package/dist/test/matter/platform-matter.logging.test.js.map +0 -1
  428. package/dist/test/matter/platform-matter.mapping.test.d.ts +0 -2
  429. package/dist/test/matter/platform-matter.mapping.test.d.ts.map +0 -1
  430. package/dist/test/matter/platform-matter.mapping.test.js +0 -43
  431. package/dist/test/matter/platform-matter.mapping.test.js.map +0 -1
  432. package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts +0 -2
  433. package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts.map +0 -1
  434. package/dist/test/matter/platform-matter.openapi-mapping.test.js +0 -84
  435. package/dist/test/matter/platform-matter.openapi-mapping.test.js.map +0 -1
  436. package/dist/test/matter/platform-matter.test.d.ts +0 -2
  437. package/dist/test/matter/platform-matter.test.d.ts.map +0 -1
  438. package/dist/test/matter/platform-matter.test.js +0 -117
  439. package/dist/test/matter/platform-matter.test.js.map +0 -1
  440. package/dist/test/matter/platform-matter.unregister.test.d.ts +0 -2
  441. package/dist/test/matter/platform-matter.unregister.test.d.ts.map +0 -1
  442. package/dist/test/matter/platform-matter.unregister.test.js +0 -30
  443. package/dist/test/matter/platform-matter.unregister.test.js.map +0 -1
  444. package/dist/test/matter/platform-matter.webhook.test.d.ts +0 -2
  445. package/dist/test/matter/platform-matter.webhook.test.d.ts.map +0 -1
  446. package/dist/test/matter/platform-matter.webhook.test.js +0 -46
  447. package/dist/test/matter/platform-matter.webhook.test.js.map +0 -1
  448. package/dist/test/utils.test.d.ts +0 -2
  449. package/dist/test/utils.test.d.ts.map +0 -1
  450. package/dist/test/utils.test.js +0 -95
  451. package/dist/test/utils.test.js.map +0 -1
  452. package/dist/test/verifyconfig.test.d.ts +0 -2
  453. package/dist/test/verifyconfig.test.d.ts.map +0 -1
  454. package/dist/test/verifyconfig.test.js +0 -167
  455. package/dist/test/verifyconfig.test.js.map +0 -1
  456. package/src/custom.d.ts +0 -7
  457. package/src/devices-hap/airpurifier.ts +0 -568
  458. package/src/devices-hap/blindtilt.ts +0 -1049
  459. package/src/devices-hap/bot.ts +0 -910
  460. package/src/devices-hap/ceilinglight.ts +0 -747
  461. package/src/devices-hap/colorbulb.ts +0 -940
  462. package/src/devices-hap/contact.ts +0 -457
  463. package/src/devices-hap/curtain.ts +0 -944
  464. package/src/devices-hap/device.ts +0 -890
  465. package/src/devices-hap/fan.ts +0 -716
  466. package/src/devices-hap/hub.ts +0 -440
  467. package/src/devices-hap/humidifier.ts +0 -762
  468. package/src/devices-hap/iosensor.ts +0 -442
  469. package/src/devices-hap/lightstrip.ts +0 -863
  470. package/src/devices-hap/lock.ts +0 -627
  471. package/src/devices-hap/meter.ts +0 -427
  472. package/src/devices-hap/meterplus.ts +0 -431
  473. package/src/devices-hap/meterpro.ts +0 -523
  474. package/src/devices-hap/motion.ts +0 -390
  475. package/src/devices-hap/plug.ts +0 -427
  476. package/src/devices-hap/relayswitch.ts +0 -727
  477. package/src/devices-hap/robotvacuumcleaner.ts +0 -574
  478. package/src/devices-hap/waterdetector.ts +0 -400
  479. package/src/devices-matter/BaseMatterAccessory.ts +0 -302
  480. package/src/devices-matter/ColorLightAccessory.ts +0 -110
  481. package/src/devices-matter/ColorTemperatureLightAccessory.ts +0 -90
  482. package/src/devices-matter/ContactSensorAccessory.ts +0 -41
  483. package/src/devices-matter/DimmableLightAccessory.ts +0 -192
  484. package/src/devices-matter/DoorLockAccessory.ts +0 -60
  485. package/src/devices-matter/ExtendedColorLightAccessory.ts +0 -122
  486. package/src/devices-matter/FanAccessory.ts +0 -95
  487. package/src/devices-matter/HumiditySensorAccessory.ts +0 -41
  488. package/src/devices-matter/LeakSensorAccessory.ts +0 -40
  489. package/src/devices-matter/LightSensorAccessory.ts +0 -41
  490. package/src/devices-matter/OccupancySensorAccessory.ts +0 -48
  491. package/src/devices-matter/OnOffLightAccessory.ts +0 -125
  492. package/src/devices-matter/OnOffOutletAccessory.ts +0 -51
  493. package/src/devices-matter/OnOffSwitchAccessory.ts +0 -51
  494. package/src/devices-matter/RoboticVacuumAccessory.ts +0 -621
  495. package/src/devices-matter/SmokeCOAlarmAccessory.ts +0 -59
  496. package/src/devices-matter/TemperatureSensorAccessory.ts +0 -43
  497. package/src/devices-matter/ThermostatAccessory.ts +0 -110
  498. package/src/devices-matter/VenetianBlindAccessory.ts +0 -115
  499. package/src/devices-matter/WindowBlindAccessory.ts +0 -135
  500. package/src/devices-matter/custom/PowerStripAccessory.ts +0 -309
  501. package/src/devices-matter/custom/index.ts +0 -8
  502. package/src/devices-matter/index.ts +0 -29
  503. package/src/irdevice/airconditioner.ts +0 -533
  504. package/src/irdevice/airpurifier.ts +0 -252
  505. package/src/irdevice/camera.ts +0 -129
  506. package/src/irdevice/fan.ts +0 -226
  507. package/src/irdevice/irdevice.ts +0 -383
  508. package/src/irdevice/light.ts +0 -246
  509. package/src/irdevice/other.ts +0 -790
  510. package/src/irdevice/tv.ts +0 -378
  511. package/src/irdevice/vacuumcleaner.ts +0 -126
  512. package/src/irdevice/waterheater.ts +0 -127
  513. package/src/platform-hap.ts +0 -3193
  514. package/src/platform-matter.ts +0 -2703
  515. package/src/test/apiRequestTracker.test.ts +0 -417
  516. package/src/test/hap/device-webhook-context.test.ts +0 -136
  517. package/src/test/hap/platform-hap.logging.test.ts +0 -36
  518. package/src/test/hap/platform-hap.test.ts +0 -70
  519. package/src/test/helpers/platform-fixtures.ts +0 -33
  520. package/src/test/homebridge-ui/server.test.ts +0 -486
  521. package/src/test/index.test.ts +0 -24
  522. package/src/test/matter/devices-matter/baseMatterAccessory.test.ts +0 -88
  523. package/src/test/matter/platform-matter.additional.test.ts +0 -44
  524. package/src/test/matter/platform-matter.bleparse.test.ts +0 -47
  525. package/src/test/matter/platform-matter.cleanup.test.ts +0 -86
  526. package/src/test/matter/platform-matter.keepstale.test.ts +0 -37
  527. package/src/test/matter/platform-matter.logging.test.ts +0 -33
  528. package/src/test/matter/platform-matter.mapping.test.ts +0 -57
  529. package/src/test/matter/platform-matter.openapi-mapping.test.ts +0 -109
  530. package/src/test/matter/platform-matter.test.ts +0 -144
  531. package/src/test/matter/platform-matter.unregister.test.ts +0 -39
  532. package/src/test/matter/platform-matter.webhook.test.ts +0 -54
  533. package/src/test/utils.test.ts +0 -96
  534. package/src/test/verifyconfig.test.ts +0 -198
@@ -1,621 +0,0 @@
1
- //
2
-
3
- /**
4
- * Robotic Vacuum Cleaner Accessory (SwitchBot-aligned)
5
- *
6
- * This implementation is intentionally limited to SwitchBot OpenAPI-supported
7
- * behaviors for Robot Vacuum families. We expose only commands and modes that
8
- * exist in the public API docs:
9
- * https://github.com/OpenWonderLabs/SwitchBotAPI
10
- *
11
- * Capability matrix (derived from OpenAPI v1.1):
12
- * - S1 / S1 Plus / K10+ / K10+ Pro
13
- * • Commands: start, stop, dock, PowLevel {0-3}
14
- * • No pause/resume, no mop, no area selection
15
- * - K10+ Pro Combo
16
- * • Commands: startClean {action: sweep|mop, param: {fanLevel 1-4}}, pause, dock
17
- * • changeParam {fanLevel}, setVolume
18
- * - S10 / S20 / K11+ / K20+ Pro
19
- * • Commands: startClean {action: sweep|sweep_mop|mop (model-dependent), param: {fanLevel 1-4, waterLevel 1-2?}},
20
- * pause, dock, changeParam, setVolume, (S10/S20) selfClean/addWaterForHumi
21
- * • Some models support waterLevel, some do not (e.g. K10+ Pro Combo)
22
- *
23
- * Matter clusters exposed:
24
- * - rvcRunMode: Idle/Cleaning only (no Mapping mode via OpenAPI)
25
- * - rvcCleanMode: Interpreted per model:
26
- * • Basic vac (S1/K10 family): suction levels → Quiet/Standard/Strong/MAX
27
- * • Mop-capable (K10+ Pro Combo/K11+/K20+ Pro): action → Vacuum or Mop
28
- * • Mop+Vac-capable (S10/S20): action → Vacuum or Vacuum & Mop
29
- * - rvcOperationalState: start/stop/pause/goHome handlers are attached only when supported
30
- * - serviceArea: NOT exposed (area/room selection isn’t in public OpenAPI)
31
- */
32
-
33
- import type { API, Logger, MatterRequests } from 'homebridge'
34
-
35
- import { BaseMatterAccessory } from './BaseMatterAccessory.js'
36
-
37
- type SwitchBotVacuumModel
38
- = 'S1'
39
- | 'S1 Plus'
40
- | 'S1 Pro'
41
- | 'S1 Mini'
42
- | 'WoSweeper'
43
- | 'WoSweeperMini'
44
- | 'K10+'
45
- | 'K10+ Pro'
46
- | 'K10+ Pro Combo'
47
- | 'S10'
48
- | 'S20'
49
- | 'K11+'
50
- | 'K20+ Pro'
51
-
52
- interface VacuumCapabilities {
53
- // Whether pause/resume is available
54
- pause: boolean
55
- resume: boolean
56
- // Clean action type exposed via rvcCleanMode
57
- cleanAction: 'vacuum-only' | 'vacuum-or-mop' | 'vacuum-or-vacmop'
58
- // Suction mapping: basic uses PowLevel 0-3; advanced uses fanLevel 1-4
59
- suctionKind: 'powLevel-0-3' | 'fanLevel-1-4' | 'none'
60
- // Whether waterLevel parameter is supported on start/changeParam
61
- waterLevel: boolean
62
- // Advanced commands available (S10/S20 only)
63
- advancedCommands?: {
64
- setVolume?: boolean
65
- selfClean?: boolean
66
- addWaterForHumi?: boolean
67
- }
68
- }
69
-
70
- function detectModelFromContext(ctx?: Record<string, unknown>): SwitchBotVacuumModel | undefined {
71
- const t = (ctx?.deviceType as string | undefined)?.trim()
72
- switch (t) {
73
- case 'Robot Vacuum Cleaner S1':
74
- return 'S1'
75
- case 'Robot Vacuum Cleaner S1 Plus':
76
- return 'S1 Plus'
77
- case 'Robot Vacuum Cleaner S1 Pro':
78
- return 'S1 Pro'
79
- case 'Robot Vacuum Cleaner S1 Mini':
80
- return 'S1 Mini'
81
- case 'WoSweeper':
82
- return 'WoSweeper'
83
- case 'WoSweeperMini':
84
- return 'WoSweeperMini'
85
- case 'K10+':
86
- return 'K10+'
87
- case 'K10+ Pro':
88
- return 'K10+ Pro'
89
- case 'Robot Vacuum Cleaner K10+ Pro Combo':
90
- case 'K10+ Pro Combo':
91
- return 'K10+ Pro Combo'
92
- case 'Robot Vacuum Cleaner S10':
93
- return 'S10'
94
- case 'Robot Vacuum Cleaner S20':
95
- case 'S20':
96
- return 'S20'
97
- case 'Robot Vacuum Cleaner K11+':
98
- case 'K11+':
99
- return 'K11+'
100
- case 'Robot Vacuum Cleaner K20 Plus Pro':
101
- case 'K20+ Pro':
102
- return 'K20+ Pro'
103
- default:
104
- return undefined
105
- }
106
- }
107
-
108
- function capabilitiesFor(model?: SwitchBotVacuumModel): VacuumCapabilities {
109
- // Defaults: conservative basic vac
110
- if (!model) {
111
- return { pause: false, resume: false, cleanAction: 'vacuum-only', suctionKind: 'powLevel-0-3', waterLevel: false }
112
- }
113
-
114
- // Basic vacuum models (S1 family, WoSweeper family, K10 family without Combo)
115
- if (model === 'S1' || model === 'S1 Plus' || model === 'S1 Pro' || model === 'S1 Mini'
116
- || model === 'WoSweeper' || model === 'WoSweeperMini'
117
- || model === 'K10+' || model === 'K10+ Pro') {
118
- return { pause: false, resume: false, cleanAction: 'vacuum-only', suctionKind: 'powLevel-0-3', waterLevel: false }
119
- }
120
-
121
- // K10+ Pro Combo: vacuum or mop, fanLevel, no waterLevel
122
- if (model === 'K10+ Pro Combo') {
123
- return { pause: true, resume: false, cleanAction: 'vacuum-or-mop', suctionKind: 'fanLevel-1-4', waterLevel: false }
124
- }
125
-
126
- // S10/S20: vacuum or vacuum+mop combo, fanLevel, waterLevel, plus advanced commands
127
- if (model === 'S10' || model === 'S20') {
128
- return {
129
- pause: true,
130
- resume: false,
131
- cleanAction: 'vacuum-or-vacmop',
132
- suctionKind: 'fanLevel-1-4',
133
- waterLevel: true,
134
- advancedCommands: {
135
- setVolume: true,
136
- selfClean: true,
137
- addWaterForHumi: true,
138
- },
139
- }
140
- }
141
-
142
- // K11+/K20+ Pro: vacuum or mop, fanLevel, waterLevel, volume control
143
- return {
144
- pause: true,
145
- resume: false,
146
- cleanAction: 'vacuum-or-mop',
147
- suctionKind: 'fanLevel-1-4',
148
- waterLevel: true,
149
- advancedCommands: {
150
- setVolume: true,
151
- },
152
- }
153
- }
154
-
155
- export class RoboticVacuumAccessory extends BaseMatterAccessory {
156
- // Track current high-level preferences that affect OpenAPI payloads
157
- private currentCleanAction: 'vacuum' | 'mop' | 'vacuum_mop' = 'vacuum'
158
- private currentFanLevel: 1 | 2 | 3 | 4 = 2
159
- private capabilities: VacuumCapabilities
160
-
161
- constructor(api: API, log: Logger, opts?: Partial<import('./BaseMatterAccessory').BaseMatterAccessoryConfig & { deviceId?: string }>) {
162
- const serialNumber = opts?.serialNumber ?? 'VACUUM-001'
163
- const model = detectModelFromContext(opts?.context)
164
- const capabilities = capabilitiesFor(model)
165
- super(api, log, {
166
- uuid: opts?.uuid ?? api.matter.uuid.generate(serialNumber),
167
- displayName: opts?.displayName ?? 'Robot Vacuum',
168
- deviceType: api.matter.deviceTypes.RoboticVacuumCleaner,
169
- serialNumber,
170
- manufacturer: opts?.manufacturer ?? 'Homebridge Matter',
171
- model: opts?.model ?? 'HB-MATTER-VACUUM-ROBOTIC',
172
- firmwareRevision: opts?.firmwareRevision ?? '2.0.0',
173
- hardwareRevision: opts?.hardwareRevision ?? '1.0.0',
174
- clusters: {
175
- rvcRunMode: {
176
- supportedModes: [
177
- { label: 'Idle', mode: 0, modeTags: [{ value: 16384 }] },
178
- { label: 'Cleaning', mode: 1, modeTags: [{ value: 16385 }] },
179
- ],
180
- currentMode: 0,
181
- },
182
- rvcCleanMode: (() => {
183
- switch (model as string) {
184
- case 'K10':
185
- return {
186
- supportedModes: [
187
- { label: 'Vacuum', mode: 0, modeTags: [{ value: 16385 }] },
188
- ],
189
- currentMode: 0,
190
- }
191
- case 'Robot Vacuum Cleaner S1':
192
- case 'Robot Vacuum Cleaner S1 Plus':
193
- return {
194
- supportedModes: [
195
- { label: 'Quiet', mode: 0, modeTags: [{ value: 2 }] },
196
- { label: 'Standard', mode: 1, modeTags: [{ value: 16384 }] },
197
- { label: 'Strong', mode: 2, modeTags: [{ value: 7 }] },
198
- { label: 'MAX', mode: 3, modeTags: [{ value: 8 }] },
199
- ],
200
- currentMode: 1,
201
- }
202
- case 'Mini Robot Vacuum K10+':
203
- case 'Mini Robot Vacuum K10+ Pro':
204
- case 'K10+ Pro Combo':
205
- return {
206
- supportedModes: [
207
- { label: 'Vacuum', mode: 0, modeTags: [{ value: 16385 }] },
208
- { label: 'Mop', mode: 1, modeTags: [{ value: 16386 }] },
209
- { label: 'Sweep & Mop', mode: 2, modeTags: [{ value: 16385 }, { value: 16386 }] },
210
- ],
211
- currentMode: 0,
212
- }
213
- case 'Multitasking Household Robot K20+ Pro':
214
- return {
215
- supportedModes: [
216
- { label: 'Vacuum', mode: 0, modeTags: [{ value: 16385 }] },
217
- { label: 'Vacuum & Mop', mode: 1, modeTags: [{ value: 16385 }, { value: 16386 }] },
218
- { label: 'Deep Clean', mode: 2, modeTags: [{ value: 16384 }] },
219
- ],
220
- currentMode: 0,
221
- }
222
- case 'Floor Cleaning Robot S10':
223
- case 'Floor Cleaning Robot S20':
224
- return {
225
- supportedModes: [
226
- { label: 'Vacuum', mode: 0, modeTags: [{ value: 16385 }] },
227
- { label: 'Mop', mode: 1, modeTags: [{ value: 16386 }] },
228
- ],
229
- currentMode: 0,
230
- }
231
- case 'Robot Vacuum K11+':
232
- return {
233
- supportedModes: [
234
- { label: 'Quiet', mode: 0, modeTags: [{ value: 2 }] },
235
- { label: 'Standard', mode: 1, modeTags: [{ value: 16384 }] },
236
- { label: 'Strong', mode: 2, modeTags: [{ value: 7 }] },
237
- { label: 'MAX', mode: 3, modeTags: [{ value: 8 }] },
238
- { label: 'Deep Clean', mode: 4, modeTags: [{ value: 16384 }, { value: 16385 }] },
239
- ],
240
- currentMode: 1,
241
- }
242
- default:
243
- return {
244
- supportedModes: [
245
- { label: 'Vacuum', mode: 0, modeTags: [{ value: 16385 }] },
246
- { label: 'Vacuum & Mop', mode: 1, modeTags: [{ value: 16385 }, { value: 16386 }] },
247
- { label: 'Deep Clean', mode: 2, modeTags: [{ value: 16384 }] },
248
- ],
249
- currentMode: 0,
250
- }
251
- }
252
- })(),
253
- rvcOperationalState: {
254
- operationalStateList: [
255
- { operationalStateId: 0 }, // Stopped
256
- { operationalStateId: 1 }, // Running
257
- { operationalStateId: 2 }, // Paused
258
- { operationalStateId: 3 }, // Error
259
- { operationalStateId: 64 }, // Seeking Charger
260
- { operationalStateId: 65 }, // Charging
261
- { operationalStateId: 66 }, // Docked
262
- { operationalStateId: 67 }, // In Remote Control
263
- { operationalStateId: 68 }, // In Dust Collecting
264
- ],
265
- operationalState: 66,
266
- },
267
- },
268
- handlers: (() => {
269
- const opHandlers: Record<string, any> = {
270
- stop: async () => this.handleStop(),
271
- start: async () => this.handleStart(),
272
- goHome: async () => this.handleGoHome(),
273
- // Always register resume handler, log warning if not supported
274
- resume: async () => {
275
- if (capabilities.resume) {
276
- await this.handleResume()
277
- } else {
278
- this.logWarn(`Resume operation is not supported for model: ${this.model}`)
279
- }
280
- },
281
- }
282
- if (capabilities.pause) {
283
- opHandlers.pause = async () => this.handlePause()
284
- }
285
- return {
286
- rvcRunMode: { changeToMode: async (request: MatterRequests.ChangeToMode) => this.handleChangeRunMode(request) },
287
- rvcCleanMode: { changeToMode: async (request: MatterRequests.ChangeToMode) => this.handleChangeCleanMode(request) },
288
- rvcOperationalState: opHandlers as any,
289
- }
290
- })(),
291
- context: { deviceId: opts?.deviceId, ...(opts?.context ?? {}), deviceType: (opts?.context as any)?.deviceType },
292
- })
293
-
294
- this.capabilities = capabilities
295
- this.logInfo('initialized and ready.')
296
- }
297
-
298
- private async handleChangeRunMode(request: MatterRequests.ChangeToMode): Promise<void> {
299
- this.logInfo(`ChangeToMode (run) request received: ${JSON.stringify(request)}`)
300
- const { newMode } = request
301
- const modeStr = ['Idle', 'Cleaning', 'Returning to Dock'][newMode] || `Unknown (mode=${newMode})`
302
- this.logInfo(`Changing run mode to: ${modeStr}`)
303
-
304
- switch (this.model) {
305
- case 'Robot Vacuum Cleaner S1':
306
- case 'Robot Vacuum Cleaner S1 Plus': {
307
- if (newMode === 1) {
308
- await this.handleStart()
309
- } else if (newMode === 0) {
310
- await this.handleGoHome()
311
- }
312
- break
313
- }
314
- case 'Mini Robot Vacuum K10+':
315
- case 'Mini Robot Vacuum K10+ Pro':
316
- case 'K10+ Pro Combo': {
317
- if (newMode === 1) {
318
- await this.handleStart()
319
- } else if (newMode === 2) {
320
- await this.handleDock()
321
- }
322
- break
323
- }
324
- case 'Multitasking Household Robot K20+ Pro': {
325
- if (newMode === 1) {
326
- await this.handleStart()
327
- } else if (newMode === 0) {
328
- await this.handleGoHome()
329
- } else if (newMode === 2) {
330
- await this.handlePause()
331
- }
332
- break
333
- }
334
- case 'Floor Cleaning Robot S10':
335
- case 'Floor Cleaning Robot S20': {
336
- if (newMode === 1) {
337
- await this.handleStart()
338
- } else if (newMode === 0) {
339
- await this.handleGoHome()
340
- }
341
- break
342
- }
343
- case 'Robot Vacuum K11+': {
344
- if (newMode === 1) {
345
- await this.handleStart()
346
- } else if (newMode === 0) {
347
- await this.handleGoHome()
348
- } else if (newMode === 2) {
349
- await this.handleDock()
350
- }
351
- break
352
- }
353
- default:
354
- this.logWarn(`Run mode change not supported for model: ${this.model}`)
355
- }
356
- }
357
-
358
- private async handleChangeCleanMode(request: MatterRequests.ChangeToMode): Promise<void> {
359
- this.logInfo(`ChangeToMode (clean) request received: ${JSON.stringify(request)}`)
360
- const { newMode } = request
361
-
362
- switch (this.model) {
363
- case 'Robot Vacuum Cleaner S1':
364
- case 'Robot Vacuum Cleaner S1 Plus': {
365
- const mapPowS1 = ['Quiet', 'Standard', 'Strong', 'MAX'] as const
366
- const labelS1 = mapPowS1[newMode] ?? `Unknown (${newMode})`
367
- this.logInfo(`Changing suction level to: ${labelS1}`)
368
- await this.sendOpenAPICommand('PowLevel', String(newMode))
369
- break
370
- }
371
- case 'Mini Robot Vacuum K10+':
372
- case 'Mini Robot Vacuum K10+ Pro':
373
- case 'K10+ Pro Combo': {
374
- const mapPowK10 = ['Vacuum', 'Mop', 'Sweep & Mop'] as const
375
- const labelK10 = mapPowK10[newMode] ?? `Unknown (${newMode})`
376
- this.logInfo(`Changing cleaning mode to: ${labelK10}`)
377
- await this.sendOpenAPICommand('CleanMode', String(newMode))
378
- break
379
- }
380
- case 'Multitasking Household Robot K20+ Pro': {
381
- const mapPowK20 = ['Vacuum', 'Vacuum & Mop', 'Deep Clean'] as const
382
- const labelK20 = mapPowK20[newMode] ?? `Unknown (${newMode})`
383
- this.logInfo(`Changing cleaning mode to: ${labelK20}`)
384
- await this.sendOpenAPICommand('CleanMode', String(newMode))
385
- break
386
- }
387
- case 'Floor Cleaning Robot S10':
388
- case 'Floor Cleaning Robot S20': {
389
- const mapPowS10 = ['Vacuum', 'Mop'] as const
390
- const labelS10 = mapPowS10[newMode] ?? `Unknown (${newMode})`
391
- this.logInfo(`Changing cleaning mode to: ${labelS10}`)
392
- await this.sendOpenAPICommand('CleanMode', String(newMode))
393
- break
394
- }
395
- case 'Robot Vacuum K11+': {
396
- const mapPowK11 = ['Quiet', 'Standard', 'Strong', 'MAX', 'Deep Clean'] as const
397
- const labelK11 = mapPowK11[newMode] ?? `Unknown (${newMode})`
398
- this.logInfo(`Changing suction level to: ${labelK11}`)
399
- await this.sendOpenAPICommand('PowLevel', String(newMode))
400
- break
401
- }
402
- default:
403
- this.logWarn(`Clean mode change not supported for model: ${this.model}`)
404
- }
405
- }
406
-
407
- private async handlePause(): Promise<void> {
408
- this.logInfo('pausing.')
409
- try {
410
- this.logInfo(`[OpenAPI] Sending pause command`)
411
- await this.sendOpenAPICommand('pause')
412
- this.logInfo(`[OpenAPI] pause command sent`)
413
- } catch (e: any) {
414
- this.logWarn(`OpenAPI pause failed: ${String(e?.message ?? e)}`)
415
- }
416
- this.updateOperationalState(2)
417
- }
418
-
419
- private async handleStop(): Promise<void> {
420
- this.logInfo('stopping.')
421
- try {
422
- if (this.capabilities.cleanAction === 'vacuum-only' && this.capabilities.suctionKind === 'powLevel-0-3') {
423
- this.logInfo(`[OpenAPI] Sending stop command`)
424
- await this.sendOpenAPICommand('stop')
425
- this.logInfo(`[OpenAPI] stop command sent`)
426
- } else {
427
- this.logInfo(`[OpenAPI] Sending pause command (for stop)`)
428
- await this.sendOpenAPICommand('pause')
429
- this.logInfo(`[OpenAPI] pause command sent (for stop)`)
430
- }
431
- } catch (e: any) {
432
- this.logWarn(`OpenAPI stop/pause failed: ${String(e?.message ?? e)}`)
433
- }
434
- this.updateRunMode(0)
435
- this.updateOperationalState(0)
436
- }
437
-
438
- private async handleStart(): Promise<void> {
439
- this.logInfo('starting clean.')
440
- try {
441
- if (this.capabilities.cleanAction === 'vacuum-only' && this.capabilities.suctionKind === 'powLevel-0-3') {
442
- this.logInfo(`[OpenAPI] Sending start command`)
443
- await this.sendOpenAPICommand('start')
444
- this.logInfo(`[OpenAPI] start command sent`)
445
- } else {
446
- const action = this.currentCleanAction === 'vacuum_mop' ? 'sweep_mop' : this.currentCleanAction
447
- const param: any = { action, param: { fanLevel: this.currentFanLevel } }
448
- if (this.capabilities.waterLevel) {
449
- param.param.waterLevel = 1
450
- }
451
- this.logInfo(`[OpenAPI] Sending startClean: ${JSON.stringify(param)}`)
452
- await this.sendOpenAPICommand('startClean', JSON.stringify(param))
453
- this.logInfo(`[OpenAPI] startClean command sent: ${JSON.stringify(param)}`)
454
- }
455
- } catch (e: any) {
456
- this.logWarn(`OpenAPI start/startClean failed: ${String(e?.message ?? e)}`)
457
- }
458
- this.updateRunMode(1)
459
- this.updateOperationalState(1)
460
- }
461
-
462
- private async handleResume(): Promise<void> {
463
- this.logInfo('resume requested.')
464
- try {
465
- this.logInfo(`[OpenAPI] Sending resume command`)
466
- await this.sendOpenAPICommand('resume')
467
- this.logInfo(`[OpenAPI] resume command sent`)
468
- } catch (e: any) {
469
- this.logWarn(`OpenAPI resume failed: ${String(e?.message ?? e)}`)
470
- }
471
- this.updateRunMode(1)
472
- this.updateOperationalState(1)
473
- }
474
-
475
- private async handleGoHome(): Promise<void> {
476
- this.logInfo('returning to dock.')
477
- try {
478
- this.logInfo(`[OpenAPI] Sending dock command`)
479
- await this.sendOpenAPICommand('dock')
480
- this.logInfo(`[OpenAPI] dock command sent`)
481
- } catch (e: any) {
482
- this.logWarn(`OpenAPI dock failed: ${String(e?.message ?? e)}`)
483
- }
484
- this.updateRunMode(0)
485
- this.updateOperationalState(64)
486
- }
487
-
488
- public updateOperationalState(state: number): void {
489
- this.updateState('rvcOperationalState', { operationalState: state })
490
- const states = [
491
- 'Stopped',
492
- 'Running',
493
- 'Paused',
494
- ...Array.from({ length: 61 }).fill(null),
495
- 'Seeking Charger',
496
- 'Charging',
497
- 'Docked',
498
- ]
499
- this.logInfo(`operational state updated to: ${states[state] || `Unknown (${state})`}`)
500
- }
501
-
502
- public updateRunMode(mode: number): void {
503
- this.updateState('rvcRunMode', { currentMode: mode })
504
- const modes = ['Idle', 'Cleaning']
505
- this.logInfo(`run mode updated to: ${modes[mode] || `Unknown (${mode})`}`)
506
- }
507
-
508
- public updateCleanMode(mode: number): void {
509
- this.updateState('rvcCleanMode', { currentMode: mode })
510
- const label = mode === 0 ? 'Vacuum' : mode === 1 ? 'Mop' : mode === 2 ? 'Vacuum & Mop' : 'Unknown'
511
- this.logInfo(`clean mode updated to: ${label}`)
512
- }
513
-
514
- /**
515
- * Update battery percentage (no PowerSource cluster for this device type)
516
- */
517
- public async updateBatteryPercentage(percentageOrBatPercentRemaining: number): Promise<void> {
518
- const isBatPercent = Number(percentageOrBatPercentRemaining) > 100
519
- const percentage = isBatPercent
520
- ? Math.max(0, Math.min(100, Math.round(Number(percentageOrBatPercentRemaining) / 2)))
521
- : Math.max(0, Math.min(100, Math.round(Number(percentageOrBatPercentRemaining))))
522
-
523
- let chargeLevel = 0 // Ok
524
- if (percentage < 20) {
525
- chargeLevel = 2 // Critical
526
- } else if (percentage < 40) {
527
- chargeLevel = 1 // Warning
528
- }
529
-
530
- this.logInfo(`battery status: ${percentage}% (${chargeLevel === 0 ? 'Ok' : chargeLevel === 1 ? 'Warning' : 'Critical'})`)
531
-
532
- if (this.context) {
533
- (this.context as any).batteryPercentage = percentage
534
- ;(this.context as any).batteryChargeLevel = chargeLevel
535
- }
536
- }
537
-
538
- private async handleDock(): Promise<void> {
539
- this.logInfo('Docking the vacuum.')
540
- try {
541
- this.logInfo('[OpenAPI] Sending dock command')
542
- await this.sendOpenAPICommand('dock')
543
- this.logInfo('[OpenAPI] Dock command sent successfully')
544
- this.updateRunMode(0) // Set to Idle after docking
545
- this.updateOperationalState(64) // Seeking Charger state
546
- } catch (error: any) {
547
- this.logWarn(`Docking failed: ${String(error?.message ?? error)}`)
548
- }
549
- }
550
-
551
- private async handleServiceArea(): Promise<void> {
552
- this.logWarn(`Service area functionality is not supported for model: ${this.model}`)
553
- // Placeholder for potential future support.
554
- }
555
-
556
- private async simulateCleaningSequence(): Promise<void> {
557
- this.logInfo('Starting cleaning sequence simulation.')
558
- this.updateOperationalState(1) // Set to Running
559
-
560
- setTimeout(async () => {
561
- this.logInfo('Cleaning sequence timer expired. Requesting device status update.')
562
- try {
563
- const status = await this.requestDeviceStatus()
564
- if (status && status.operationalState) {
565
- this.logInfo(`Device status found: ${status.operationalState}`)
566
- this.updateOperationalState(status.operationalState)
567
- } else {
568
- this.logWarn('Device status not found. Setting operational state to Stopped.')
569
- this.updateOperationalState(0) // Default to Stopped
570
- }
571
- } catch (error: any) {
572
- this.logWarn(`Failed to fetch device status: ${String(error?.message ?? error)}`)
573
- this.updateOperationalState(0) // Default to Stopped
574
- }
575
- }, 5000) // Simulate a 5-second cleaning sequence
576
- }
577
-
578
- private async simulateDockingSequence(): Promise<void> {
579
- this.logInfo('Starting docking sequence simulation.')
580
- this.updateOperationalState(64) // Set to Seeking Charger
581
-
582
- setTimeout(async () => {
583
- this.logInfo('Docking sequence timer expired. Requesting device status update.')
584
- try {
585
- const status = await this.requestDeviceStatus()
586
- if (status && status.operationalState) {
587
- this.logInfo(`Device status found: ${status.operationalState}`)
588
- this.updateOperationalState(status.operationalState)
589
- } else {
590
- this.logWarn('Device status not found. Setting operational state to Docked.')
591
- this.updateOperationalState(66) // Default to Docked
592
- }
593
- } catch (error: any) {
594
- this.logWarn(`Failed to fetch device status: ${String(error?.message ?? error)}`)
595
- this.updateOperationalState(66) // Default to Docked
596
- }
597
- }, 5000) // Simulate a 5-second docking sequence
598
- }
599
-
600
- private async requestDeviceStatus(): Promise<{ operationalState?: number } | null> {
601
- this.logInfo('Requesting device status from OpenAPI.')
602
- try {
603
- const response = await this.sendOpenAPICommand('getDeviceStatus')
604
- this.logInfo(`Device status response: ${JSON.stringify(response)}`)
605
- return response
606
- } catch (error: any) {
607
- this.logWarn(`Failed to request device status: ${String(error?.message ?? error)}`)
608
- return null
609
- }
610
- }
611
-
612
- public async startCleaningSimulation(): Promise<void> {
613
- this.logInfo('Initiating cleaning simulation.')
614
- await this.simulateCleaningSequence()
615
- }
616
-
617
- public async startDockingSimulation(): Promise<void> {
618
- this.logInfo('Initiating docking simulation.')
619
- await this.simulateDockingSequence()
620
- }
621
- }
@@ -1,59 +0,0 @@
1
- /**
2
- * Smoke/CO Alarm Accessory Class
3
- */
4
-
5
- import type { API, Logger } from 'homebridge'
6
-
7
- import { BaseMatterAccessory } from './BaseMatterAccessory.js'
8
-
9
- export class SmokeCOAlarmAccessory extends BaseMatterAccessory {
10
- constructor(api: API, log: Logger) {
11
- const serialNumber = 'SENSOR-006'
12
- const SmokeCoAlarmServer = api.matter.deviceTypes.SmokeSensor.requirements.SmokeCoAlarmServer
13
- const SmokeSensorWithBoth = api.matter.deviceTypes.SmokeSensor.with(
14
- SmokeCoAlarmServer.with('SmokeAlarm', 'CoAlarm'),
15
- )
16
-
17
- super(api, log, {
18
- uuid: api.matter.uuid.generate(serialNumber),
19
- displayName: 'Smoke Sensor',
20
- deviceType: SmokeSensorWithBoth,
21
- serialNumber,
22
- manufacturer: 'Homebridge Matter',
23
- model: 'HB-MATTER-SENSOR-SMOKE-CO',
24
- firmwareRevision: '2.0.0',
25
- hardwareRevision: '1.0.0',
26
-
27
- clusters: {
28
- smokeCoAlarm: {
29
- smokeState: 0, // 0 = normal, 1 = warning, 2 = critical
30
- coState: 0,
31
- batteryAlert: 0,
32
- deviceMuted: 0,
33
- testInProgress: false,
34
- hardwareFaultAlert: false,
35
- endOfServiceAlert: 0,
36
- interconnectSmokeAlarm: 0,
37
- interconnectCoAlarm: 0,
38
- contaminationState: 0,
39
- smokeSensitivityLevel: 1,
40
- expressedState: 0,
41
- },
42
- },
43
- })
44
-
45
- this.logInfo('initialized.')
46
- }
47
-
48
- public updateSmokeState(state: 0 | 1 | 2): void {
49
- this.updateState('smokeCoAlarm', { smokeState: state })
50
- const stateStr = ['Normal', 'Warning', 'Critical'][state]
51
- this.logInfo(`smoke state: ${stateStr}.`)
52
- }
53
-
54
- public updateCOState(state: 0 | 1 | 2): void {
55
- this.updateState('smokeCoAlarm', { coState: state })
56
- const stateStr = ['Normal', 'Warning', 'Critical'][state]
57
- this.logInfo(`co state: ${stateStr}.`)
58
- }
59
- }