@switchbot/homebridge-switchbot 4.3.2-beta.9 → 5.0.0-beta.1

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 (416) hide show
  1. package/.github/copilot-instructions.md +328 -0
  2. package/.github/workflows/beta-release.yml +8 -12
  3. package/.github/workflows/release.yml +57 -21
  4. package/README.md +13 -10
  5. package/config.schema.json +1 -12
  6. package/coverage/base.css +224 -0
  7. package/coverage/block-navigation.js +87 -0
  8. package/coverage/clover.xml +15847 -0
  9. package/coverage/coverage-final.json +42 -0
  10. package/coverage/docs/assets/dmt/dmt-component-data.js.html +85 -0
  11. package/coverage/docs/assets/dmt/dmt-components.js.html +286 -0
  12. package/coverage/docs/assets/dmt/index.html +131 -0
  13. package/coverage/docs/assets/hierarchy.js.html +85 -0
  14. package/coverage/docs/assets/icons.js.html +136 -0
  15. package/coverage/docs/assets/index.html +146 -0
  16. package/coverage/docs/assets/main.js.html +265 -0
  17. package/coverage/favicon.png +0 -0
  18. package/coverage/index.html +191 -0
  19. package/coverage/prettify.css +1 -0
  20. package/coverage/prettify.js +2 -0
  21. package/coverage/sort-arrow-sprite.png +0 -0
  22. package/coverage/sorter.js +196 -0
  23. package/coverage/src/device/blindtilt.ts.html +3238 -0
  24. package/coverage/src/device/bot.ts.html +2803 -0
  25. package/coverage/src/device/ceilinglight.ts.html +2338 -0
  26. package/coverage/src/device/colorbulb.ts.html +2824 -0
  27. package/coverage/src/device/contact.ts.html +1465 -0
  28. package/coverage/src/device/curtain.ts.html +2869 -0
  29. package/coverage/src/device/device.ts.html +2500 -0
  30. package/coverage/src/device/fan.ts.html +2242 -0
  31. package/coverage/src/device/hub.ts.html +1408 -0
  32. package/coverage/src/device/humidifier.ts.html +2116 -0
  33. package/coverage/src/device/index.html +416 -0
  34. package/coverage/src/device/iosensor.ts.html +1375 -0
  35. package/coverage/src/device/lightstrip.ts.html +2617 -0
  36. package/coverage/src/device/lock.ts.html +1963 -0
  37. package/coverage/src/device/meter.ts.html +1372 -0
  38. package/coverage/src/device/meterplus.ts.html +1384 -0
  39. package/coverage/src/device/meterpro.ts.html +1618 -0
  40. package/coverage/src/device/motion.ts.html +1264 -0
  41. package/coverage/src/device/plug.ts.html +1372 -0
  42. package/coverage/src/device/relayswitch.ts.html +2284 -0
  43. package/coverage/src/device/robotvacuumcleaner.ts.html +1810 -0
  44. package/coverage/src/device/waterdetector.ts.html +1294 -0
  45. package/coverage/src/homebridge-ui/index.html +116 -0
  46. package/coverage/src/homebridge-ui/server.ts.html +229 -0
  47. package/coverage/src/index.html +161 -0
  48. package/coverage/src/index.ts.html +124 -0
  49. package/coverage/src/irdevice/airconditioner.ts.html +1687 -0
  50. package/coverage/src/irdevice/airpurifier.ts.html +844 -0
  51. package/coverage/src/irdevice/camera.ts.html +475 -0
  52. package/coverage/src/irdevice/fan.ts.html +766 -0
  53. package/coverage/src/irdevice/index.html +251 -0
  54. package/coverage/src/irdevice/irdevice.ts.html +1117 -0
  55. package/coverage/src/irdevice/light.ts.html +826 -0
  56. package/coverage/src/irdevice/other.ts.html +2458 -0
  57. package/coverage/src/irdevice/tv.ts.html +1222 -0
  58. package/coverage/src/irdevice/vacuumcleaner.ts.html +466 -0
  59. package/coverage/src/irdevice/waterheater.ts.html +469 -0
  60. package/coverage/src/platform.ts.html +8776 -0
  61. package/coverage/src/settings.ts.html +934 -0
  62. package/coverage/src/utils.ts.html +2092 -0
  63. package/dist/{device → devices-hap}/airpurifier.d.ts +3 -3
  64. package/dist/devices-hap/airpurifier.d.ts.map +1 -0
  65. package/dist/devices-hap/airpurifier.js.map +1 -0
  66. package/dist/{device → devices-hap}/blindtilt.d.ts +3 -3
  67. package/dist/devices-hap/blindtilt.d.ts.map +1 -0
  68. package/dist/{device → devices-hap}/blindtilt.js +6 -1
  69. package/dist/devices-hap/blindtilt.js.map +1 -0
  70. package/dist/{device → devices-hap}/bot.d.ts +3 -3
  71. package/dist/devices-hap/bot.d.ts.map +1 -0
  72. package/dist/devices-hap/bot.js.map +1 -0
  73. package/dist/{device → devices-hap}/ceilinglight.d.ts +3 -3
  74. package/dist/devices-hap/ceilinglight.d.ts.map +1 -0
  75. package/dist/devices-hap/ceilinglight.js.map +1 -0
  76. package/dist/{device → devices-hap}/colorbulb.d.ts +3 -3
  77. package/dist/devices-hap/colorbulb.d.ts.map +1 -0
  78. package/dist/devices-hap/colorbulb.js.map +1 -0
  79. package/dist/{device → devices-hap}/contact.d.ts +3 -3
  80. package/dist/devices-hap/contact.d.ts.map +1 -0
  81. package/dist/devices-hap/contact.js.map +1 -0
  82. package/dist/{device → devices-hap}/curtain.d.ts +3 -3
  83. package/dist/devices-hap/curtain.d.ts.map +1 -0
  84. package/dist/{device → devices-hap}/curtain.js +32 -8
  85. package/dist/devices-hap/curtain.js.map +1 -0
  86. package/dist/{device → devices-hap}/device.d.ts +3 -3
  87. package/dist/devices-hap/device.d.ts.map +1 -0
  88. package/dist/{device → devices-hap}/device.js +10 -4
  89. package/dist/devices-hap/device.js.map +1 -0
  90. package/dist/{device → devices-hap}/fan.d.ts +3 -3
  91. package/dist/devices-hap/fan.d.ts.map +1 -0
  92. package/dist/devices-hap/fan.js.map +1 -0
  93. package/dist/{device → devices-hap}/hub.d.ts +5 -5
  94. package/dist/devices-hap/hub.d.ts.map +1 -0
  95. package/dist/{device → devices-hap}/hub.js +2 -1
  96. package/dist/devices-hap/hub.js.map +1 -0
  97. package/dist/{device → devices-hap}/humidifier.d.ts +3 -3
  98. package/dist/devices-hap/humidifier.d.ts.map +1 -0
  99. package/dist/devices-hap/humidifier.js.map +1 -0
  100. package/dist/{device → devices-hap}/iosensor.d.ts +3 -3
  101. package/dist/devices-hap/iosensor.d.ts.map +1 -0
  102. package/dist/devices-hap/iosensor.js.map +1 -0
  103. package/dist/{device → devices-hap}/lightstrip.d.ts +3 -3
  104. package/dist/devices-hap/lightstrip.d.ts.map +1 -0
  105. package/dist/devices-hap/lightstrip.js.map +1 -0
  106. package/dist/{device → devices-hap}/lock.d.ts +3 -3
  107. package/dist/devices-hap/lock.d.ts.map +1 -0
  108. package/dist/devices-hap/lock.js.map +1 -0
  109. package/dist/{device → devices-hap}/meter.d.ts +3 -3
  110. package/dist/devices-hap/meter.d.ts.map +1 -0
  111. package/dist/devices-hap/meter.js.map +1 -0
  112. package/dist/{device → devices-hap}/meterplus.d.ts +3 -3
  113. package/dist/devices-hap/meterplus.d.ts.map +1 -0
  114. package/dist/devices-hap/meterplus.js.map +1 -0
  115. package/dist/{device → devices-hap}/meterpro.d.ts +3 -3
  116. package/dist/devices-hap/meterpro.d.ts.map +1 -0
  117. package/dist/{device → devices-hap}/meterpro.js +16 -3
  118. package/dist/devices-hap/meterpro.js.map +1 -0
  119. package/dist/{device → devices-hap}/motion.d.ts +3 -3
  120. package/dist/devices-hap/motion.d.ts.map +1 -0
  121. package/dist/devices-hap/motion.js.map +1 -0
  122. package/dist/{device → devices-hap}/plug.d.ts +3 -3
  123. package/dist/devices-hap/plug.d.ts.map +1 -0
  124. package/dist/devices-hap/plug.js.map +1 -0
  125. package/dist/{device → devices-hap}/relayswitch.d.ts +3 -3
  126. package/dist/devices-hap/relayswitch.d.ts.map +1 -0
  127. package/dist/devices-hap/relayswitch.js.map +1 -0
  128. package/dist/{device → devices-hap}/robotvacuumcleaner.d.ts +3 -3
  129. package/dist/devices-hap/robotvacuumcleaner.d.ts.map +1 -0
  130. package/dist/devices-hap/robotvacuumcleaner.js.map +1 -0
  131. package/dist/{device → devices-hap}/waterdetector.d.ts +3 -3
  132. package/dist/devices-hap/waterdetector.d.ts.map +1 -0
  133. package/dist/devices-hap/waterdetector.js.map +1 -0
  134. package/dist/devices-matter/BaseMatterAccessory.d.ts +63 -0
  135. package/dist/devices-matter/BaseMatterAccessory.d.ts.map +1 -0
  136. package/dist/devices-matter/BaseMatterAccessory.js +100 -0
  137. package/dist/devices-matter/BaseMatterAccessory.js.map +1 -0
  138. package/dist/devices-matter/ColorLightAccessory.d.ts +18 -0
  139. package/dist/devices-matter/ColorLightAccessory.d.ts.map +1 -0
  140. package/dist/devices-matter/ColorLightAccessory.js +96 -0
  141. package/dist/devices-matter/ColorLightAccessory.js.map +1 -0
  142. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +16 -0
  143. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +1 -0
  144. package/dist/devices-matter/ColorTemperatureLightAccessory.js +83 -0
  145. package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +1 -0
  146. package/dist/devices-matter/ContactSensorAccessory.d.ts +10 -0
  147. package/dist/devices-matter/ContactSensorAccessory.d.ts.map +1 -0
  148. package/dist/devices-matter/ContactSensorAccessory.js +31 -0
  149. package/dist/devices-matter/ContactSensorAccessory.js.map +1 -0
  150. package/dist/devices-matter/DimmableLightAccessory.d.ts +56 -0
  151. package/dist/devices-matter/DimmableLightAccessory.d.ts.map +1 -0
  152. package/dist/devices-matter/DimmableLightAccessory.js +170 -0
  153. package/dist/devices-matter/DimmableLightAccessory.js.map +1 -0
  154. package/dist/devices-matter/DoorLockAccessory.d.ts +12 -0
  155. package/dist/devices-matter/DoorLockAccessory.d.ts.map +1 -0
  156. package/dist/devices-matter/DoorLockAccessory.js +47 -0
  157. package/dist/devices-matter/DoorLockAccessory.js.map +1 -0
  158. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +19 -0
  159. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +1 -0
  160. package/dist/devices-matter/ExtendedColorLightAccessory.js +108 -0
  161. package/dist/devices-matter/ExtendedColorLightAccessory.js.map +1 -0
  162. package/dist/devices-matter/FanAccessory.d.ts +14 -0
  163. package/dist/devices-matter/FanAccessory.d.ts.map +1 -0
  164. package/dist/devices-matter/FanAccessory.js +73 -0
  165. package/dist/devices-matter/FanAccessory.js.map +1 -0
  166. package/dist/devices-matter/HumiditySensorAccessory.d.ts +10 -0
  167. package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +1 -0
  168. package/dist/devices-matter/HumiditySensorAccessory.js +33 -0
  169. package/dist/devices-matter/HumiditySensorAccessory.js.map +1 -0
  170. package/dist/devices-matter/LeakSensorAccessory.d.ts +10 -0
  171. package/dist/devices-matter/LeakSensorAccessory.d.ts.map +1 -0
  172. package/dist/devices-matter/LeakSensorAccessory.js +30 -0
  173. package/dist/devices-matter/LeakSensorAccessory.js.map +1 -0
  174. package/dist/devices-matter/LightSensorAccessory.d.ts +10 -0
  175. package/dist/devices-matter/LightSensorAccessory.d.ts.map +1 -0
  176. package/dist/devices-matter/LightSensorAccessory.js +33 -0
  177. package/dist/devices-matter/LightSensorAccessory.js.map +1 -0
  178. package/dist/devices-matter/OccupancySensorAccessory.d.ts +10 -0
  179. package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +1 -0
  180. package/dist/devices-matter/OccupancySensorAccessory.js +43 -0
  181. package/dist/devices-matter/OccupancySensorAccessory.js.map +1 -0
  182. package/dist/devices-matter/OnOffLightAccessory.d.ts +36 -0
  183. package/dist/devices-matter/OnOffLightAccessory.d.ts.map +1 -0
  184. package/dist/devices-matter/OnOffLightAccessory.js +117 -0
  185. package/dist/devices-matter/OnOffLightAccessory.js.map +1 -0
  186. package/dist/devices-matter/OnOffOutletAccessory.d.ts +12 -0
  187. package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +1 -0
  188. package/dist/devices-matter/OnOffOutletAccessory.js +43 -0
  189. package/dist/devices-matter/OnOffOutletAccessory.js.map +1 -0
  190. package/dist/devices-matter/OnOffSwitchAccessory.d.ts +12 -0
  191. package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +1 -0
  192. package/dist/devices-matter/OnOffSwitchAccessory.js +43 -0
  193. package/dist/devices-matter/OnOffSwitchAccessory.js.map +1 -0
  194. package/dist/devices-matter/RoboticVacuumAccessory.d.ts +66 -0
  195. package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +1 -0
  196. package/dist/devices-matter/RoboticVacuumAccessory.js +402 -0
  197. package/dist/devices-matter/RoboticVacuumAccessory.js.map +1 -0
  198. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +11 -0
  199. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +1 -0
  200. package/dist/devices-matter/SmokeCOAlarmAccessory.js +49 -0
  201. package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +1 -0
  202. package/dist/devices-matter/TemperatureSensorAccessory.d.ts +10 -0
  203. package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +1 -0
  204. package/dist/devices-matter/TemperatureSensorAccessory.js +33 -0
  205. package/dist/devices-matter/TemperatureSensorAccessory.js.map +1 -0
  206. package/dist/devices-matter/ThermostatAccessory.d.ts +17 -0
  207. package/dist/devices-matter/ThermostatAccessory.d.ts.map +1 -0
  208. package/dist/devices-matter/ThermostatAccessory.js +87 -0
  209. package/dist/devices-matter/ThermostatAccessory.js.map +1 -0
  210. package/dist/devices-matter/VenetianBlindAccessory.d.ts +17 -0
  211. package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +1 -0
  212. package/dist/devices-matter/VenetianBlindAccessory.js +100 -0
  213. package/dist/devices-matter/VenetianBlindAccessory.js.map +1 -0
  214. package/dist/devices-matter/WindowBlindAccessory.d.ts +15 -0
  215. package/dist/devices-matter/WindowBlindAccessory.d.ts.map +1 -0
  216. package/dist/devices-matter/WindowBlindAccessory.js +81 -0
  217. package/dist/devices-matter/WindowBlindAccessory.js.map +1 -0
  218. package/dist/devices-matter/custom/PowerStripAccessory.d.ts +97 -0
  219. package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +1 -0
  220. package/dist/devices-matter/custom/PowerStripAccessory.js +265 -0
  221. package/dist/devices-matter/custom/PowerStripAccessory.js.map +1 -0
  222. package/dist/devices-matter/custom/index.d.ts +8 -0
  223. package/dist/devices-matter/custom/index.d.ts.map +1 -0
  224. package/dist/devices-matter/custom/index.js +8 -0
  225. package/dist/devices-matter/custom/index.js.map +1 -0
  226. package/dist/devices-matter/index.d.ts +29 -0
  227. package/dist/devices-matter/index.d.ts.map +1 -0
  228. package/dist/devices-matter/index.js +28 -0
  229. package/dist/devices-matter/index.js.map +1 -0
  230. package/dist/homebridge-ui/public/index.html +1 -1
  231. package/dist/index.d.ts.map +1 -1
  232. package/dist/index.js +7 -2
  233. package/dist/index.js.map +1 -1
  234. package/dist/index.test.js +2 -2
  235. package/dist/index.test.js.map +1 -1
  236. package/dist/irdevice/airconditioner.d.ts +3 -3
  237. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  238. package/dist/irdevice/airconditioner.js.map +1 -1
  239. package/dist/irdevice/airpurifier.d.ts +3 -3
  240. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  241. package/dist/irdevice/airpurifier.js.map +1 -1
  242. package/dist/irdevice/camera.d.ts +3 -3
  243. package/dist/irdevice/camera.d.ts.map +1 -1
  244. package/dist/irdevice/camera.js.map +1 -1
  245. package/dist/irdevice/fan.d.ts +3 -3
  246. package/dist/irdevice/fan.d.ts.map +1 -1
  247. package/dist/irdevice/fan.js.map +1 -1
  248. package/dist/irdevice/irdevice.d.ts +3 -3
  249. package/dist/irdevice/irdevice.d.ts.map +1 -1
  250. package/dist/irdevice/irdevice.js.map +1 -1
  251. package/dist/irdevice/light.d.ts +3 -3
  252. package/dist/irdevice/light.d.ts.map +1 -1
  253. package/dist/irdevice/light.js.map +1 -1
  254. package/dist/irdevice/other.d.ts +3 -3
  255. package/dist/irdevice/other.d.ts.map +1 -1
  256. package/dist/irdevice/other.js.map +1 -1
  257. package/dist/irdevice/tv.d.ts +3 -3
  258. package/dist/irdevice/tv.d.ts.map +1 -1
  259. package/dist/irdevice/tv.js.map +1 -1
  260. package/dist/irdevice/vacuumcleaner.d.ts +3 -3
  261. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  262. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  263. package/dist/irdevice/waterheater.d.ts +3 -3
  264. package/dist/irdevice/waterheater.d.ts.map +1 -1
  265. package/dist/irdevice/waterheater.js.map +1 -1
  266. package/dist/{platform.d.ts → platform-hap.d.ts} +2 -2
  267. package/dist/platform-hap.d.ts.map +1 -0
  268. package/dist/{platform.js → platform-hap.js} +50 -32
  269. package/dist/platform-hap.js.map +1 -0
  270. package/dist/platform-matter.d.ts +75 -0
  271. package/dist/platform-matter.d.ts.map +1 -0
  272. package/dist/platform-matter.js +379 -0
  273. package/dist/platform-matter.js.map +1 -0
  274. package/dist/utils.d.ts +5 -0
  275. package/dist/utils.d.ts.map +1 -1
  276. package/dist/utils.js +43 -0
  277. package/dist/utils.js.map +1 -1
  278. package/dist/verifyconfig.test.d.ts +2 -0
  279. package/dist/verifyconfig.test.d.ts.map +1 -0
  280. package/dist/verifyconfig.test.js +167 -0
  281. package/dist/verifyconfig.test.js.map +1 -0
  282. package/docs/index.html +20 -11
  283. package/docs/variables/default.html +1 -1
  284. package/package.json +7 -7
  285. package/src/{device → devices-hap}/airpurifier.ts +2 -2
  286. package/src/{device → devices-hap}/blindtilt.ts +7 -3
  287. package/src/{device → devices-hap}/bot.ts +2 -2
  288. package/src/{device → devices-hap}/ceilinglight.ts +2 -2
  289. package/src/{device → devices-hap}/colorbulb.ts +2 -2
  290. package/src/{device → devices-hap}/contact.ts +2 -2
  291. package/src/{device → devices-hap}/curtain.ts +32 -10
  292. package/src/{device → devices-hap}/device.ts +12 -6
  293. package/src/{device → devices-hap}/fan.ts +2 -2
  294. package/src/{device → devices-hap}/hub.ts +7 -6
  295. package/src/{device → devices-hap}/humidifier.ts +2 -2
  296. package/src/{device → devices-hap}/iosensor.ts +2 -2
  297. package/src/{device → devices-hap}/lightstrip.ts +2 -2
  298. package/src/{device → devices-hap}/lock.ts +2 -2
  299. package/src/{device → devices-hap}/meter.ts +2 -2
  300. package/src/{device → devices-hap}/meterplus.ts +2 -2
  301. package/src/{device → devices-hap}/meterpro.ts +18 -5
  302. package/src/{device → devices-hap}/motion.ts +2 -2
  303. package/src/{device → devices-hap}/plug.ts +2 -2
  304. package/src/{device → devices-hap}/relayswitch.ts +2 -2
  305. package/src/{device → devices-hap}/robotvacuumcleaner.ts +2 -2
  306. package/src/{device → devices-hap}/waterdetector.ts +2 -2
  307. package/src/devices-matter/BaseMatterAccessory.ts +131 -0
  308. package/src/devices-matter/ColorLightAccessory.ts +113 -0
  309. package/src/devices-matter/ColorTemperatureLightAccessory.ts +98 -0
  310. package/src/devices-matter/ContactSensorAccessory.ts +37 -0
  311. package/src/devices-matter/DimmableLightAccessory.ts +196 -0
  312. package/src/devices-matter/DoorLockAccessory.ts +56 -0
  313. package/src/devices-matter/ExtendedColorLightAccessory.ts +127 -0
  314. package/src/devices-matter/FanAccessory.ts +87 -0
  315. package/src/devices-matter/HumiditySensorAccessory.ts +39 -0
  316. package/src/devices-matter/LeakSensorAccessory.ts +36 -0
  317. package/src/devices-matter/LightSensorAccessory.ts +39 -0
  318. package/src/devices-matter/OccupancySensorAccessory.ts +52 -0
  319. package/src/devices-matter/OnOffLightAccessory.ts +133 -0
  320. package/src/devices-matter/OnOffOutletAccessory.ts +52 -0
  321. package/src/devices-matter/OnOffSwitchAccessory.ts +52 -0
  322. package/src/devices-matter/RoboticVacuumAccessory.ts +484 -0
  323. package/src/devices-matter/SmokeCOAlarmAccessory.ts +59 -0
  324. package/src/devices-matter/TemperatureSensorAccessory.ts +39 -0
  325. package/src/devices-matter/ThermostatAccessory.ts +105 -0
  326. package/src/devices-matter/VenetianBlindAccessory.ts +118 -0
  327. package/src/devices-matter/WindowBlindAccessory.ts +94 -0
  328. package/src/devices-matter/custom/PowerStripAccessory.ts +309 -0
  329. package/src/devices-matter/custom/index.ts +8 -0
  330. package/src/devices-matter/index.ts +29 -0
  331. package/src/homebridge-ui/public/index.html +1 -1
  332. package/src/index.test.ts +2 -2
  333. package/src/index.ts +7 -2
  334. package/src/irdevice/airconditioner.ts +2 -2
  335. package/src/irdevice/airpurifier.ts +2 -2
  336. package/src/irdevice/camera.ts +2 -2
  337. package/src/irdevice/fan.ts +2 -2
  338. package/src/irdevice/irdevice.ts +2 -2
  339. package/src/irdevice/light.ts +2 -2
  340. package/src/irdevice/other.ts +2 -2
  341. package/src/irdevice/tv.ts +2 -2
  342. package/src/irdevice/vacuumcleaner.ts +2 -2
  343. package/src/irdevice/waterheater.ts +2 -2
  344. package/src/{platform.ts → platform-hap.ts} +47 -31
  345. package/src/platform-matter.ts +465 -0
  346. package/src/utils.ts +49 -0
  347. package/src/verifyconfig.test.ts +197 -0
  348. package/tsconfig.json +2 -1
  349. package/typedoc.json +1 -0
  350. package/.github/workflows/build.yml +0 -18
  351. package/.github/workflows/changerelease.yml +0 -11
  352. package/.github/workflows/labeler.yml +0 -16
  353. package/.github/workflows/release-drafter.yml +0 -14
  354. package/dist/device/airpurifier.d.ts.map +0 -1
  355. package/dist/device/airpurifier.js.map +0 -1
  356. package/dist/device/blindtilt.d.ts.map +0 -1
  357. package/dist/device/blindtilt.js.map +0 -1
  358. package/dist/device/bot.d.ts.map +0 -1
  359. package/dist/device/bot.js.map +0 -1
  360. package/dist/device/ceilinglight.d.ts.map +0 -1
  361. package/dist/device/ceilinglight.js.map +0 -1
  362. package/dist/device/colorbulb.d.ts.map +0 -1
  363. package/dist/device/colorbulb.js.map +0 -1
  364. package/dist/device/contact.d.ts.map +0 -1
  365. package/dist/device/contact.js.map +0 -1
  366. package/dist/device/curtain.d.ts.map +0 -1
  367. package/dist/device/curtain.js.map +0 -1
  368. package/dist/device/device.d.ts.map +0 -1
  369. package/dist/device/device.js.map +0 -1
  370. package/dist/device/fan.d.ts.map +0 -1
  371. package/dist/device/fan.js.map +0 -1
  372. package/dist/device/hub.d.ts.map +0 -1
  373. package/dist/device/hub.js.map +0 -1
  374. package/dist/device/humidifier.d.ts.map +0 -1
  375. package/dist/device/humidifier.js.map +0 -1
  376. package/dist/device/iosensor.d.ts.map +0 -1
  377. package/dist/device/iosensor.js.map +0 -1
  378. package/dist/device/lightstrip.d.ts.map +0 -1
  379. package/dist/device/lightstrip.js.map +0 -1
  380. package/dist/device/lock.d.ts.map +0 -1
  381. package/dist/device/lock.js.map +0 -1
  382. package/dist/device/meter.d.ts.map +0 -1
  383. package/dist/device/meter.js.map +0 -1
  384. package/dist/device/meterplus.d.ts.map +0 -1
  385. package/dist/device/meterplus.js.map +0 -1
  386. package/dist/device/meterpro.d.ts.map +0 -1
  387. package/dist/device/meterpro.js.map +0 -1
  388. package/dist/device/motion.d.ts.map +0 -1
  389. package/dist/device/motion.js.map +0 -1
  390. package/dist/device/plug.d.ts.map +0 -1
  391. package/dist/device/plug.js.map +0 -1
  392. package/dist/device/relayswitch.d.ts.map +0 -1
  393. package/dist/device/relayswitch.js.map +0 -1
  394. package/dist/device/robotvacuumcleaner.d.ts.map +0 -1
  395. package/dist/device/robotvacuumcleaner.js.map +0 -1
  396. package/dist/device/waterdetector.d.ts.map +0 -1
  397. package/dist/device/waterdetector.js.map +0 -1
  398. package/dist/platform.d.ts.map +0 -1
  399. package/dist/platform.js.map +0 -1
  400. /package/dist/{device → devices-hap}/airpurifier.js +0 -0
  401. /package/dist/{device → devices-hap}/bot.js +0 -0
  402. /package/dist/{device → devices-hap}/ceilinglight.js +0 -0
  403. /package/dist/{device → devices-hap}/colorbulb.js +0 -0
  404. /package/dist/{device → devices-hap}/contact.js +0 -0
  405. /package/dist/{device → devices-hap}/fan.js +0 -0
  406. /package/dist/{device → devices-hap}/humidifier.js +0 -0
  407. /package/dist/{device → devices-hap}/iosensor.js +0 -0
  408. /package/dist/{device → devices-hap}/lightstrip.js +0 -0
  409. /package/dist/{device → devices-hap}/lock.js +0 -0
  410. /package/dist/{device → devices-hap}/meter.js +0 -0
  411. /package/dist/{device → devices-hap}/meterplus.js +0 -0
  412. /package/dist/{device → devices-hap}/motion.js +0 -0
  413. /package/dist/{device → devices-hap}/plug.js +0 -0
  414. /package/dist/{device → devices-hap}/relayswitch.js +0 -0
  415. /package/dist/{device → devices-hap}/robotvacuumcleaner.js +0 -0
  416. /package/dist/{device → devices-hap}/waterdetector.js +0 -0
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Fan Accessory Class
3
+ */
4
+
5
+ import type { API, Logger, MatterRequests } from 'homebridge'
6
+
7
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
8
+
9
+ export class FanAccessory extends BaseMatterAccessory {
10
+ constructor(api: API, log: Logger) {
11
+ const serialNumber = 'FAN-001'
12
+ super(api, log, {
13
+ uuid: api.matter.uuid.generate(serialNumber),
14
+ displayName: 'Fan',
15
+ deviceType: api.matter.deviceTypes.Fan,
16
+ serialNumber,
17
+ manufacturer: 'Homebridge Matter',
18
+ model: 'HB-MATTER-FAN',
19
+ firmwareRevision: '2.0.0',
20
+ hardwareRevision: '1.0.0',
21
+
22
+ clusters: {
23
+ fanControl: {
24
+ fanMode: api.matter.types.FanControl.FanMode.Off,
25
+ fanModeSequence: api.matter.types.FanControl.FanModeSequence.OffLowMedHigh,
26
+ percentSetting: 0,
27
+ percentCurrent: 0,
28
+ },
29
+ },
30
+
31
+ handlers: {
32
+ fanControl: {
33
+ step: async (request: MatterRequests.FanStep) => this.handleStep(request),
34
+ fanModeChange: async (request: { fanMode: number, oldFanMode: number }) => this.handleFanModeChange(request),
35
+ percentSettingChange: async (request: { percentSetting: number | null, oldPercentSetting: number | null }) =>
36
+ this.handlePercentSettingChange(request),
37
+ },
38
+ },
39
+ })
40
+
41
+ this.logInfo('initialized.')
42
+ }
43
+
44
+ private async handleStep(request: MatterRequests.FanStep): Promise<void> {
45
+ this.logInfo(`FanStep request: ${JSON.stringify(request)}`)
46
+ const { direction, wrap, lowestOff } = request
47
+ const dirStr = direction === 0 ? 'increase' : 'decrease'
48
+ this.logInfo(`step ${dirStr} (wrap: ${wrap}, lowestoff: ${lowestOff}).`)
49
+ // TODO: await myFanAPI.step(direction, wrap, lowestOff)
50
+ }
51
+
52
+ private async handleFanModeChange(request: { fanMode: number, oldFanMode: number }): Promise<void> {
53
+ this.logInfo(`FanMode change: ${JSON.stringify(request)}`)
54
+ const modeNames = ['Off', 'Low', 'Medium', 'High', 'On', 'Auto', 'Smart']
55
+ const modeName = modeNames[request.fanMode] || `Unknown (${request.fanMode})`
56
+ this.logInfo(`fan mode changed to: ${modeName}.`)
57
+ // TODO: await myFanAPI.setMode(request.fanMode)
58
+ }
59
+
60
+ private async handlePercentSettingChange(request: { percentSetting: number | null, oldPercentSetting: number | null }): Promise<void> {
61
+ this.logInfo(`PercentSetting change: ${JSON.stringify(request)}`)
62
+ const percent = request.percentSetting ?? 0
63
+ const isOff = percent === 0
64
+ const wasOff = (request.oldPercentSetting ?? 0) === 0
65
+
66
+ if (isOff !== wasOff) {
67
+ this.logInfo(`fan turned ${isOff ? 'off' : 'on'}.`)
68
+ }
69
+
70
+ if (!isOff) {
71
+ this.logInfo(`fan speed changed to: ${percent}%.`)
72
+ }
73
+ // TODO: await myFanAPI.setSpeed(percent)
74
+ }
75
+
76
+ public updateFanMode(mode: number): void {
77
+ this.updateState(this.api.matter.clusterNames.FanControl, { fanMode: mode })
78
+ }
79
+
80
+ public updateFanSpeed(percent: number): void {
81
+ this.updateState(this.api.matter.clusterNames.FanControl, {
82
+ percentSetting: percent,
83
+ percentCurrent: percent,
84
+ })
85
+ this.logInfo(`fan speed: ${percent}%.`)
86
+ }
87
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Humidity Sensor Accessory Class
3
+ */
4
+
5
+ import type { API, Logger } from 'homebridge'
6
+
7
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
8
+
9
+ export class HumiditySensorAccessory extends BaseMatterAccessory {
10
+ constructor(api: API, log: Logger) {
11
+ const serialNumber = 'SENSOR-005'
12
+ super(api, log, {
13
+ uuid: api.matter.uuid.generate(serialNumber),
14
+ displayName: 'Humidity Sensor',
15
+ deviceType: api.matter.deviceTypes.HumiditySensor,
16
+ serialNumber,
17
+ manufacturer: 'Homebridge Matter',
18
+ model: 'HB-MATTER-SENSOR-HUMIDITY',
19
+ firmwareRevision: '2.0.0',
20
+ hardwareRevision: '1.0.0',
21
+
22
+ clusters: {
23
+ relativeHumidityMeasurement: {
24
+ measuredValue: 5500, // 55% (in hundredths of a percent)
25
+ minMeasuredValue: 0,
26
+ maxMeasuredValue: 10000,
27
+ },
28
+ },
29
+ })
30
+
31
+ this.logInfo('initialized.')
32
+ }
33
+
34
+ public updateHumidity(percent: number): void {
35
+ const value = Math.round(percent * 100) // convert to hundredths
36
+ this.updateState('relativeHumidityMeasurement', { measuredValue: value })
37
+ this.logInfo(`humidity: ${percent}%.`)
38
+ }
39
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Leak Sensor Accessory Class
3
+ */
4
+
5
+ import type { API, Logger } from 'homebridge'
6
+
7
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
8
+
9
+ export class LeakSensorAccessory extends BaseMatterAccessory {
10
+ constructor(api: API, log: Logger) {
11
+ const serialNumber = 'SENSOR-007'
12
+ super(api, log, {
13
+ uuid: api.matter.uuid.generate(serialNumber),
14
+ displayName: 'Leak Sensor',
15
+ deviceType: api.matter.deviceTypes.LeakSensor,
16
+ serialNumber,
17
+ manufacturer: 'Homebridge Matter',
18
+ model: 'HB-MATTER-SENSOR-LEAK',
19
+ firmwareRevision: '2.0.0',
20
+ hardwareRevision: '1.0.0',
21
+
22
+ clusters: {
23
+ booleanState: {
24
+ stateValue: false, // false = dry, true = leak
25
+ },
26
+ },
27
+ })
28
+
29
+ this.logInfo('initialized.')
30
+ }
31
+
32
+ public updateLeakState(leakDetected: boolean): void {
33
+ this.updateState(this.api.matter.clusterNames.BooleanState, { stateValue: leakDetected })
34
+ this.logInfo(`leak: ${leakDetected ? 'detected' : 'none'}.`)
35
+ }
36
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Light Sensor Accessory Class
3
+ */
4
+
5
+ import type { API, Logger } from 'homebridge'
6
+
7
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
8
+
9
+ export class LightSensorAccessory extends BaseMatterAccessory {
10
+ constructor(api: API, log: Logger) {
11
+ const serialNumber = 'SENSOR-002'
12
+ super(api, log, {
13
+ uuid: api.matter.uuid.generate(serialNumber),
14
+ displayName: 'Light Sensor',
15
+ deviceType: api.matter.deviceTypes.LightSensor,
16
+ serialNumber,
17
+ manufacturer: 'Homebridge Matter',
18
+ model: 'HB-MATTER-SENSOR-LIGHT',
19
+ firmwareRevision: '2.0.0',
20
+ hardwareRevision: '1.0.0',
21
+
22
+ clusters: {
23
+ illuminanceMeasurement: {
24
+ measuredValue: 5000,
25
+ minMeasuredValue: 1,
26
+ maxMeasuredValue: 65534,
27
+ },
28
+ },
29
+ })
30
+
31
+ this.logInfo('initialized.')
32
+ }
33
+
34
+ public updateIlluminance(lux: number): void {
35
+ const value = Math.round(10000 * Math.log10(lux))
36
+ this.updateState('illuminanceMeasurement', { measuredValue: value })
37
+ this.logInfo(`illuminance: ${lux} lux.`)
38
+ }
39
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Occupancy Sensor Accessory Class
3
+ */
4
+
5
+ import type { API, Logger } from 'homebridge'
6
+
7
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
8
+
9
+ export class OccupancySensorAccessory extends BaseMatterAccessory {
10
+ constructor(api: API, log: Logger) {
11
+ const serialNumber = 'SENSOR-003'
12
+ // Note: Matter.js API calls this "MotionSensor" but it's actually an Occupancy Sensor
13
+ const OccupancySensingServer = api.matter.deviceTypes.MotionSensor.requirements.OccupancySensingServer
14
+ const OccupancySensorWithPIR = api.matter.deviceTypes.MotionSensor.with(
15
+ OccupancySensingServer.with('PassiveInfrared'),
16
+ )
17
+
18
+ super(api, log, {
19
+ uuid: api.matter.uuid.generate(serialNumber),
20
+ displayName: 'Occupancy Sensor',
21
+ deviceType: OccupancySensorWithPIR,
22
+ serialNumber,
23
+ manufacturer: 'Homebridge Matter',
24
+ model: 'HB-MATTER-SENSOR-OCCUPANCY',
25
+ firmwareRevision: '2.0.0',
26
+ hardwareRevision: '1.0.0',
27
+
28
+ clusters: {
29
+ occupancySensing: {
30
+ occupancy: {
31
+ occupied: false,
32
+ },
33
+ occupancySensorType: 0,
34
+ occupancySensorTypeBitmap: {
35
+ pir: true,
36
+ ultrasonic: false,
37
+ physicalContact: false,
38
+ },
39
+ },
40
+ },
41
+ })
42
+
43
+ this.logInfo('initialized.')
44
+ }
45
+
46
+ public updateOccupancyDetected(detected: boolean): void {
47
+ this.updateState('occupancySensing', {
48
+ occupancy: { occupied: detected },
49
+ })
50
+ this.logInfo(`occupancy: ${detected ? 'detected' : 'clear'}.`)
51
+ }
52
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * On/Off Light Accessory Class
3
+ *
4
+ * Example implementation of a device class that extends BaseMatterAccessory.
5
+ * This shows the pattern for creating device-specific classes.
6
+ */
7
+
8
+ import type { API, Logger } from 'homebridge'
9
+
10
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
11
+
12
+ /**
13
+ * On/Off Light Device Class
14
+ *
15
+ * This class represents an on/off light accessory.
16
+ * It extends BaseMatterAccessory to inherit common functionality.
17
+ */
18
+ export class OnOffLightAccessory extends BaseMatterAccessory {
19
+ constructor(api: API, log: Logger) {
20
+ const serialNumber = 'LIGHT-001'
21
+ const displayName = 'On/Off Light'
22
+ const manufacturer = 'Homebridge Matter'
23
+ const model = 'HB-MATTER-LIGHT-ON-OFF'
24
+ const firmwareRevision = '2.0.0'
25
+ const hardwareRevision = '1.0.0'
26
+
27
+ // Call parent constructor with device configuration
28
+ super(api, log, {
29
+ uuid: api.matter.uuid.generate(serialNumber),
30
+ displayName,
31
+ deviceType: api.matter.deviceTypes.OnOffLight,
32
+ serialNumber,
33
+ manufacturer,
34
+ model,
35
+ firmwareRevision,
36
+ hardwareRevision,
37
+
38
+ // Initial cluster states
39
+ clusters: {
40
+ onOff: {
41
+ onOff: true, // initial state: light is on
42
+ },
43
+ },
44
+
45
+ // Command handlers
46
+ handlers: {
47
+ onOff: {
48
+ on: async () => this.handleOnCommand(),
49
+ off: async () => this.handleOffCommand(),
50
+ },
51
+ },
52
+ })
53
+
54
+ this.logInfo('initialized.')
55
+ }
56
+
57
+ /**
58
+ * Handle the "on" command from Matter
59
+ */
60
+ private async handleOnCommand(): Promise<void> {
61
+ this.logInfo('turning on.')
62
+
63
+ try {
64
+ // TODO: Control your physical device here
65
+ // Examples:
66
+ // await fetch('https://api.mydevice.com/light/on', { method: 'POST' })
67
+ // await fetch('http://192.168.1.50/api/light/on')
68
+ // mqttClient.publish('home/light/command', JSON.stringify({ state: 'ON' }))
69
+ // await myLightAPI.turnOn(this.context.deviceId)
70
+
71
+ this.logInfo('physical device turned on.')
72
+
73
+ // State automatically updated by Homebridge after handler completes
74
+ } catch (error) {
75
+ this.logError('failed to turn on:', error)
76
+ throw error
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Handle the "off" command from Matter
82
+ */
83
+ private async handleOffCommand(): Promise<void> {
84
+ this.logInfo('turning off.')
85
+
86
+ try {
87
+ // TODO: Control your physical device here
88
+ // await myLightAPI.turnOff(this.context.deviceId)
89
+
90
+ this.logInfo('physical device turned off.')
91
+
92
+ // State automatically updated by Homebridge after handler completes
93
+ } catch (error) {
94
+ this.logError('failed to turn off:', error)
95
+ throw error
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Update the on/off state from external source
101
+ * Call this when your physical device state changes externally
102
+ */
103
+ public updateOnOffState(isOn: boolean): void {
104
+ this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
105
+ this.logInfo(`state synced: ${isOn ? 'ON' : 'OFF'}.`)
106
+ }
107
+
108
+ /**
109
+ * Example: Start monitoring external state changes
110
+ * This shows how you might set up event listeners or polling
111
+ */
112
+ public startMonitoring(): void {
113
+ // Example: Event-based monitoring (recommended)
114
+ // mqttClient.subscribe('home/light/status')
115
+ // mqttClient.on('message', (topic, message) => {
116
+ // const { state } = JSON.parse(message.toString())
117
+ // const deviceIsOn = state === 'ON'
118
+ // this.updateOnOffState(deviceIsOn)
119
+ // })
120
+
121
+ // Example: Polling-based monitoring (fallback)
122
+ // setInterval(async () => {
123
+ // try {
124
+ // const response = await fetch('https://api.mydevice.com/light/state')
125
+ // const data = await response.json()
126
+ // const deviceIsOn = data.power === 'on'
127
+ // this.updateOnOffState(deviceIsOn)
128
+ // } catch (error) {
129
+ // this.logError('Polling error:', error)
130
+ // }
131
+ // }, 5000) // Poll every 5 seconds
132
+ }
133
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * On/Off Outlet Accessory Class
3
+ */
4
+
5
+ import type { API, Logger } from 'homebridge'
6
+
7
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
8
+
9
+ export class OnOffOutletAccessory extends BaseMatterAccessory {
10
+ constructor(api: API, log: Logger) {
11
+ const serialNumber = 'OUTLET-001'
12
+ super(api, log, {
13
+ uuid: api.matter.uuid.generate(serialNumber),
14
+ displayName: 'On/Off Outlet',
15
+ deviceType: api.matter.deviceTypes.OnOffOutlet,
16
+ serialNumber,
17
+ manufacturer: 'Homebridge Matter',
18
+ model: 'HB-MATTER-OUTLET-ON-OFF',
19
+ firmwareRevision: '2.0.0',
20
+ hardwareRevision: '1.0.0',
21
+
22
+ clusters: {
23
+ onOff: {
24
+ onOff: false,
25
+ },
26
+ },
27
+
28
+ handlers: {
29
+ onOff: {
30
+ on: async () => this.handleOn(),
31
+ off: async () => this.handleOff(),
32
+ },
33
+ },
34
+ })
35
+
36
+ this.logInfo('initialized.')
37
+ }
38
+
39
+ private async handleOn(): Promise<void> {
40
+ this.logInfo('turning on.')
41
+ // TODO: await myOutletAPI.turnOn()
42
+ }
43
+
44
+ private async handleOff(): Promise<void> {
45
+ this.logInfo('turning off.')
46
+ // TODO: await myOutletAPI.turnOff()
47
+ }
48
+
49
+ public updateOnOffState(isOn: boolean): void {
50
+ this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
51
+ }
52
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * On/Off Switch Accessory Class
3
+ */
4
+
5
+ import type { API, Logger } from 'homebridge'
6
+
7
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
8
+
9
+ export class OnOffSwitchAccessory extends BaseMatterAccessory {
10
+ constructor(api: API, log: Logger) {
11
+ const serialNumber = 'SWITCH-001'
12
+ super(api, log, {
13
+ uuid: api.matter.uuid.generate(serialNumber),
14
+ displayName: 'On/Off Switch',
15
+ deviceType: api.matter.deviceTypes.OnOffSwitch,
16
+ serialNumber,
17
+ manufacturer: 'Homebridge Matter',
18
+ model: 'HB-MATTER-SWITCH-ON-OFF',
19
+ firmwareRevision: '2.0.0',
20
+ hardwareRevision: '1.0.0',
21
+
22
+ clusters: {
23
+ onOff: {
24
+ onOff: false,
25
+ },
26
+ },
27
+
28
+ handlers: {
29
+ onOff: {
30
+ on: async () => this.handleOn(),
31
+ off: async () => this.handleOff(),
32
+ },
33
+ },
34
+ })
35
+
36
+ this.logInfo('initialized.')
37
+ }
38
+
39
+ private async handleOn(): Promise<void> {
40
+ this.logInfo('turning on.')
41
+ // TODO: await mySwitchAPI.turnOn()
42
+ }
43
+
44
+ private async handleOff(): Promise<void> {
45
+ this.logInfo('turning off.')
46
+ // TODO: await mySwitchAPI.turnOff()
47
+ }
48
+
49
+ public updateOnOffState(isOn: boolean): void {
50
+ this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
51
+ }
52
+ }