@switchbot/homebridge-switchbot 4.3.2-beta.8 → 5.0.0-beta.0

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 (410) 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} +32 -31
  269. package/dist/{platform.js.map → platform-hap.js.map} +1 -1
  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 +362 -0
  273. package/dist/platform-matter.js.map +1 -0
  274. package/dist/verifyconfig.test.d.ts +2 -0
  275. package/dist/verifyconfig.test.d.ts.map +1 -0
  276. package/dist/verifyconfig.test.js +167 -0
  277. package/dist/verifyconfig.test.js.map +1 -0
  278. package/docs/index.html +20 -11
  279. package/docs/variables/default.html +1 -1
  280. package/package.json +10 -10
  281. package/src/{device → devices-hap}/airpurifier.ts +2 -2
  282. package/src/{device → devices-hap}/blindtilt.ts +7 -3
  283. package/src/{device → devices-hap}/bot.ts +2 -2
  284. package/src/{device → devices-hap}/ceilinglight.ts +2 -2
  285. package/src/{device → devices-hap}/colorbulb.ts +2 -2
  286. package/src/{device → devices-hap}/contact.ts +2 -2
  287. package/src/{device → devices-hap}/curtain.ts +32 -10
  288. package/src/{device → devices-hap}/device.ts +12 -6
  289. package/src/{device → devices-hap}/fan.ts +2 -2
  290. package/src/{device → devices-hap}/hub.ts +7 -6
  291. package/src/{device → devices-hap}/humidifier.ts +2 -2
  292. package/src/{device → devices-hap}/iosensor.ts +2 -2
  293. package/src/{device → devices-hap}/lightstrip.ts +2 -2
  294. package/src/{device → devices-hap}/lock.ts +2 -2
  295. package/src/{device → devices-hap}/meter.ts +2 -2
  296. package/src/{device → devices-hap}/meterplus.ts +2 -2
  297. package/src/{device → devices-hap}/meterpro.ts +18 -5
  298. package/src/{device → devices-hap}/motion.ts +2 -2
  299. package/src/{device → devices-hap}/plug.ts +2 -2
  300. package/src/{device → devices-hap}/relayswitch.ts +2 -2
  301. package/src/{device → devices-hap}/robotvacuumcleaner.ts +2 -2
  302. package/src/{device → devices-hap}/waterdetector.ts +2 -2
  303. package/src/devices-matter/BaseMatterAccessory.ts +131 -0
  304. package/src/devices-matter/ColorLightAccessory.ts +113 -0
  305. package/src/devices-matter/ColorTemperatureLightAccessory.ts +98 -0
  306. package/src/devices-matter/ContactSensorAccessory.ts +37 -0
  307. package/src/devices-matter/DimmableLightAccessory.ts +196 -0
  308. package/src/devices-matter/DoorLockAccessory.ts +56 -0
  309. package/src/devices-matter/ExtendedColorLightAccessory.ts +127 -0
  310. package/src/devices-matter/FanAccessory.ts +87 -0
  311. package/src/devices-matter/HumiditySensorAccessory.ts +39 -0
  312. package/src/devices-matter/LeakSensorAccessory.ts +36 -0
  313. package/src/devices-matter/LightSensorAccessory.ts +39 -0
  314. package/src/devices-matter/OccupancySensorAccessory.ts +52 -0
  315. package/src/devices-matter/OnOffLightAccessory.ts +133 -0
  316. package/src/devices-matter/OnOffOutletAccessory.ts +52 -0
  317. package/src/devices-matter/OnOffSwitchAccessory.ts +52 -0
  318. package/src/devices-matter/RoboticVacuumAccessory.ts +484 -0
  319. package/src/devices-matter/SmokeCOAlarmAccessory.ts +59 -0
  320. package/src/devices-matter/TemperatureSensorAccessory.ts +39 -0
  321. package/src/devices-matter/ThermostatAccessory.ts +105 -0
  322. package/src/devices-matter/VenetianBlindAccessory.ts +118 -0
  323. package/src/devices-matter/WindowBlindAccessory.ts +94 -0
  324. package/src/devices-matter/custom/PowerStripAccessory.ts +309 -0
  325. package/src/devices-matter/custom/index.ts +8 -0
  326. package/src/devices-matter/index.ts +29 -0
  327. package/src/homebridge-ui/public/index.html +1 -1
  328. package/src/index.test.ts +2 -2
  329. package/src/index.ts +7 -2
  330. package/src/irdevice/airconditioner.ts +2 -2
  331. package/src/irdevice/airpurifier.ts +2 -2
  332. package/src/irdevice/camera.ts +2 -2
  333. package/src/irdevice/fan.ts +2 -2
  334. package/src/irdevice/irdevice.ts +2 -2
  335. package/src/irdevice/light.ts +2 -2
  336. package/src/irdevice/other.ts +2 -2
  337. package/src/irdevice/tv.ts +2 -2
  338. package/src/irdevice/vacuumcleaner.ts +2 -2
  339. package/src/irdevice/waterheater.ts +2 -2
  340. package/src/{platform.ts → platform-hap.ts} +31 -30
  341. package/src/platform-matter.ts +450 -0
  342. package/src/verifyconfig.test.ts +197 -0
  343. package/tsconfig.json +2 -1
  344. package/typedoc.json +1 -0
  345. package/.github/workflows/build.yml +0 -18
  346. package/.github/workflows/changerelease.yml +0 -11
  347. package/.github/workflows/labeler.yml +0 -16
  348. package/.github/workflows/release-drafter.yml +0 -14
  349. package/dist/device/airpurifier.d.ts.map +0 -1
  350. package/dist/device/airpurifier.js.map +0 -1
  351. package/dist/device/blindtilt.d.ts.map +0 -1
  352. package/dist/device/blindtilt.js.map +0 -1
  353. package/dist/device/bot.d.ts.map +0 -1
  354. package/dist/device/bot.js.map +0 -1
  355. package/dist/device/ceilinglight.d.ts.map +0 -1
  356. package/dist/device/ceilinglight.js.map +0 -1
  357. package/dist/device/colorbulb.d.ts.map +0 -1
  358. package/dist/device/colorbulb.js.map +0 -1
  359. package/dist/device/contact.d.ts.map +0 -1
  360. package/dist/device/contact.js.map +0 -1
  361. package/dist/device/curtain.d.ts.map +0 -1
  362. package/dist/device/curtain.js.map +0 -1
  363. package/dist/device/device.d.ts.map +0 -1
  364. package/dist/device/device.js.map +0 -1
  365. package/dist/device/fan.d.ts.map +0 -1
  366. package/dist/device/fan.js.map +0 -1
  367. package/dist/device/hub.d.ts.map +0 -1
  368. package/dist/device/hub.js.map +0 -1
  369. package/dist/device/humidifier.d.ts.map +0 -1
  370. package/dist/device/humidifier.js.map +0 -1
  371. package/dist/device/iosensor.d.ts.map +0 -1
  372. package/dist/device/iosensor.js.map +0 -1
  373. package/dist/device/lightstrip.d.ts.map +0 -1
  374. package/dist/device/lightstrip.js.map +0 -1
  375. package/dist/device/lock.d.ts.map +0 -1
  376. package/dist/device/lock.js.map +0 -1
  377. package/dist/device/meter.d.ts.map +0 -1
  378. package/dist/device/meter.js.map +0 -1
  379. package/dist/device/meterplus.d.ts.map +0 -1
  380. package/dist/device/meterplus.js.map +0 -1
  381. package/dist/device/meterpro.d.ts.map +0 -1
  382. package/dist/device/meterpro.js.map +0 -1
  383. package/dist/device/motion.d.ts.map +0 -1
  384. package/dist/device/motion.js.map +0 -1
  385. package/dist/device/plug.d.ts.map +0 -1
  386. package/dist/device/plug.js.map +0 -1
  387. package/dist/device/relayswitch.d.ts.map +0 -1
  388. package/dist/device/relayswitch.js.map +0 -1
  389. package/dist/device/robotvacuumcleaner.d.ts.map +0 -1
  390. package/dist/device/robotvacuumcleaner.js.map +0 -1
  391. package/dist/device/waterdetector.d.ts.map +0 -1
  392. package/dist/device/waterdetector.js.map +0 -1
  393. package/dist/platform.d.ts.map +0 -1
  394. /package/dist/{device → devices-hap}/airpurifier.js +0 -0
  395. /package/dist/{device → devices-hap}/bot.js +0 -0
  396. /package/dist/{device → devices-hap}/ceilinglight.js +0 -0
  397. /package/dist/{device → devices-hap}/colorbulb.js +0 -0
  398. /package/dist/{device → devices-hap}/contact.js +0 -0
  399. /package/dist/{device → devices-hap}/fan.js +0 -0
  400. /package/dist/{device → devices-hap}/humidifier.js +0 -0
  401. /package/dist/{device → devices-hap}/iosensor.js +0 -0
  402. /package/dist/{device → devices-hap}/lightstrip.js +0 -0
  403. /package/dist/{device → devices-hap}/lock.js +0 -0
  404. /package/dist/{device → devices-hap}/meter.js +0 -0
  405. /package/dist/{device → devices-hap}/meterplus.js +0 -0
  406. /package/dist/{device → devices-hap}/motion.js +0 -0
  407. /package/dist/{device → devices-hap}/plug.js +0 -0
  408. /package/dist/{device → devices-hap}/relayswitch.js +0 -0
  409. /package/dist/{device → devices-hap}/robotvacuumcleaner.js +0 -0
  410. /package/dist/{device → devices-hap}/waterdetector.js +0 -0
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Dimmable Light Accessory Class
3
+ *
4
+ * Example of a more complex device with multiple clusters.
5
+ * Shows how to handle devices with on/off + level control.
6
+ */
7
+
8
+ import type { API, Logger, MatterRequests } from 'homebridge'
9
+
10
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
11
+
12
+ /**
13
+ * Dimmable Light Device Class
14
+ *
15
+ * Demonstrates:
16
+ * - Multiple clusters (OnOff + LevelControl)
17
+ * - Type-safe request handlers
18
+ * - Value conversion (Matter level ↔ percentage)
19
+ * - Custom public methods for external control
20
+ */
21
+ export class DimmableLightAccessory extends BaseMatterAccessory {
22
+ // Track current state
23
+ private currentLevel: number = 127 // 50% brightness
24
+
25
+ constructor(api: API, log: Logger) {
26
+ const serialNumber = 'LIGHT-002'
27
+ const displayName = 'Dimmable Light'
28
+ const manufacturer = 'Homebridge Matter'
29
+ const model = 'HB-MATTER-LIGHT-DIMMABLE'
30
+ const firmwareRevision = '2.0.0'
31
+ const hardwareRevision = '1.0.0'
32
+
33
+ super(api, log, {
34
+ uuid: api.matter.uuid.generate(serialNumber),
35
+ displayName,
36
+ deviceType: api.matter.deviceTypes.DimmableLight,
37
+ serialNumber,
38
+ manufacturer,
39
+ model,
40
+ firmwareRevision,
41
+ hardwareRevision,
42
+
43
+ clusters: {
44
+ onOff: {
45
+ onOff: false,
46
+ },
47
+ levelControl: {
48
+ currentLevel: 127, // 50% brightness (range 1-254)
49
+ minLevel: 1,
50
+ maxLevel: 254,
51
+ },
52
+ },
53
+
54
+ handlers: {
55
+ onOff: {
56
+ on: async () => this.handleOn(),
57
+ off: async () => this.handleOff(),
58
+ },
59
+ levelControl: {
60
+ moveToLevelWithOnOff: async (request: MatterRequests.MoveToLevel) =>
61
+ this.handleSetLevel(request),
62
+ },
63
+ },
64
+ })
65
+
66
+ this.logInfo('initialized.')
67
+ }
68
+
69
+ /**
70
+ * Handle the "on" command
71
+ */
72
+ private async handleOn(): Promise<void> {
73
+ this.logInfo('turning on.')
74
+
75
+ try {
76
+ // TODO: Control your physical device
77
+ // await myLightAPI.turnOn()
78
+
79
+ this.logInfo('physical device turned on.')
80
+ } catch (error) {
81
+ this.logError('failed to turn on:', error)
82
+ throw error
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Handle the "off" command
88
+ */
89
+ private async handleOff(): Promise<void> {
90
+ this.logInfo('turning off.')
91
+
92
+ try {
93
+ // TODO: Control your physical device
94
+ // await myLightAPI.turnOff()
95
+
96
+ this.logInfo('physical device turned off.')
97
+ } catch (error) {
98
+ this.logError('failed to turn off:', error)
99
+ throw error
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Handle brightness level changes
105
+ */
106
+ private async handleSetLevel(request: MatterRequests.MoveToLevel): Promise<void> {
107
+ this.logInfo(`MoveToLevel request: ${JSON.stringify(request)}`)
108
+ const { level, transitionTime } = request
109
+
110
+ // Convert Matter level (1-254) to percentage (0-100%)
111
+ const brightnessPercent = Math.round((level / 254) * 100)
112
+ this.currentLevel = level
113
+
114
+ this.logInfo(`setting brightness to ${brightnessPercent}% (level: ${level}), transitionTime: ${transitionTime}.`)
115
+
116
+ try {
117
+ // TODO: Control your physical device
118
+ // await myLightAPI.setBrightness(brightnessPercent, transitionTime)
119
+
120
+ this.logInfo(`physical device brightness set to ${brightnessPercent}%.`)
121
+ } catch (error) {
122
+ this.logError('Failed to set brightness:', error)
123
+ throw error
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Update on/off state from external source
129
+ */
130
+ public updateOnOffState(isOn: boolean): void {
131
+ this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
132
+ this.logInfo(`state synced: ${isOn ? 'ON' : 'OFF'}.`)
133
+ }
134
+
135
+ /**
136
+ * Update brightness level from external source
137
+ * @param percent - Brightness percentage (0-100)
138
+ */
139
+ public updateBrightness(percent: number): void {
140
+ // Validate input
141
+ if (percent < 0 || percent > 100) {
142
+ this.logWarn(`Invalid brightness percentage: ${percent}. Must be 0-100.`)
143
+ return
144
+ }
145
+
146
+ // Convert percent to Matter level (1-254)
147
+ const matterLevel = Math.max(1, Math.round((percent / 100) * 254))
148
+ this.currentLevel = matterLevel
149
+
150
+ this.updateState(this.api.matter.clusterNames.LevelControl, {
151
+ currentLevel: matterLevel,
152
+ })
153
+
154
+ this.logInfo(`brightness synced: ${percent}% (level: ${matterLevel}).`)
155
+ }
156
+
157
+ /**
158
+ * Get current brightness as percentage
159
+ */
160
+ public getBrightness(): number {
161
+ return Math.round((this.currentLevel / 254) * 100)
162
+ }
163
+
164
+ /**
165
+ * Set brightness and power state together
166
+ * Useful for syncing complete state from external source
167
+ */
168
+ public updateFullState(isOn: boolean, percent: number): void {
169
+ this.updateOnOffState(isOn)
170
+ if (isOn) {
171
+ this.updateBrightness(percent)
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Example monitoring setup
177
+ */
178
+ public startMonitoring(): void {
179
+ // Example: MQTT listener
180
+ // mqttClient.on('message', (topic, message) => {
181
+ // const { state, brightness } = JSON.parse(message.toString())
182
+ // this.updateFullState(state === 'ON', brightness)
183
+ // })
184
+
185
+ // Example: Polling
186
+ // setInterval(async () => {
187
+ // try {
188
+ // const response = await fetch('https://api.mydevice.com/light/state')
189
+ // const data = await response.json()
190
+ // this.updateFullState(data.power === 'on', data.brightness)
191
+ // } catch (error) {
192
+ // this.logError('Polling error:', error)
193
+ // }
194
+ // }, 5000)
195
+ }
196
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Door Lock Accessory Class
3
+ */
4
+
5
+ import type { API, Logger } from 'homebridge'
6
+
7
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
8
+
9
+ export class DoorLockAccessory extends BaseMatterAccessory {
10
+ constructor(api: API, log: Logger) {
11
+ const serialNumber = 'LOCK-001'
12
+ super(api, log, {
13
+ uuid: api.matter.uuid.generate(serialNumber),
14
+ displayName: 'Door Lock',
15
+ deviceType: api.matter.deviceTypes.DoorLock,
16
+ serialNumber,
17
+ manufacturer: 'Homebridge Matter',
18
+ model: 'HB-MATTER-LOCK-DOOR',
19
+ firmwareRevision: '2.0.0',
20
+ hardwareRevision: '1.0.0',
21
+
22
+ clusters: {
23
+ doorLock: {
24
+ lockState: api.matter.types.DoorLock.LockState.Unlocked,
25
+ lockType: api.matter.types.DoorLock.LockType.DeadBolt,
26
+ actuatorEnabled: true,
27
+ operatingMode: api.matter.types.DoorLock.OperatingMode.Normal,
28
+ },
29
+ },
30
+
31
+ handlers: {
32
+ doorLock: {
33
+ lockDoor: async () => this.handleLock(),
34
+ unlockDoor: async () => this.handleUnlock(),
35
+ },
36
+ },
37
+ })
38
+
39
+ this.logInfo('initialized.')
40
+ }
41
+
42
+ private async handleLock(): Promise<void> {
43
+ this.logInfo('locked.')
44
+ }
45
+
46
+ private async handleUnlock(): Promise<void> {
47
+ this.logInfo('unlocked.')
48
+ }
49
+
50
+ public updateLockState(state: 0 | 1 | 2): void {
51
+ // 0 = Not fully locked, 1 = Locked, 2 = Unlocked
52
+ this.updateState('doorLock', { lockState: state })
53
+ const stateStr = ['Not Fully Locked', 'Locked', 'Unlocked'][state]
54
+ this.logInfo(`lock state: ${stateStr}.`)
55
+ }
56
+ }
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Extended Color Light Accessory Class (HS+CCT)
3
+ * Hue, Saturation, and Color Temperature control
4
+ */
5
+
6
+ import type { API, Logger, MatterRequests } from 'homebridge'
7
+
8
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
9
+
10
+ export class ExtendedColorLightAccessory extends BaseMatterAccessory {
11
+ constructor(api: API, log: Logger) {
12
+ const serialNumber = 'LIGHT-005'
13
+ super(api, log, {
14
+ uuid: api.matter.uuid.generate(serialNumber),
15
+ displayName: 'Extended Colour Light (HS+CCT)',
16
+ deviceType: api.matter.deviceTypes.ExtendedColorLight,
17
+ serialNumber,
18
+ manufacturer: 'Homebridge Matter',
19
+ model: 'HB-MATTER-LIGHT-EXTENDED-COLOUR',
20
+ firmwareRevision: '2.0.0',
21
+ hardwareRevision: '1.0.0',
22
+
23
+ clusters: {
24
+ onOff: { onOff: false },
25
+ levelControl: {
26
+ currentLevel: 127,
27
+ minLevel: 1,
28
+ maxLevel: 254,
29
+ },
30
+ colorControl: {
31
+ colorMode: api.matter.types.ColorControl.ColorMode.CurrentHueAndCurrentSaturation,
32
+ currentHue: 0,
33
+ currentSaturation: 254,
34
+ currentX: 41942,
35
+ currentY: 21626,
36
+ colorTemperatureMireds: 250,
37
+ colorTempPhysicalMinMireds: 147,
38
+ colorTempPhysicalMaxMireds: 454,
39
+ coupleColorTempToLevelMinMireds: 147,
40
+ },
41
+ },
42
+
43
+ handlers: {
44
+ onOff: {
45
+ on: async () => this.handleOn(),
46
+ off: async () => this.handleOff(),
47
+ },
48
+ levelControl: {
49
+ moveToLevelWithOnOff: async (request: MatterRequests.MoveToLevel) =>
50
+ this.handleSetLevel(request),
51
+ },
52
+ colorControl: {
53
+ moveToColorLogic: async (request: MatterRequests.MoveToColor) =>
54
+ this.handleSetColor(request),
55
+ moveToHueAndSaturationLogic: async (request: MatterRequests.MoveToHueAndSaturation) =>
56
+ this.handleSetHueSaturation(request),
57
+ moveToColorTemperatureLogic: async (request: MatterRequests.MoveToColorTemperature) =>
58
+ this.handleSetColorTemperature(request),
59
+ },
60
+ },
61
+ })
62
+
63
+ this.logInfo('initialized.')
64
+ }
65
+
66
+ private async handleOn(): Promise<void> {
67
+ this.logInfo('turning on.')
68
+ // TODO: await myLightAPI.turnOn()
69
+ }
70
+
71
+ private async handleOff(): Promise<void> {
72
+ this.logInfo('turning off.')
73
+ // TODO: await myLightAPI.turnOff()
74
+ }
75
+
76
+ private async handleSetLevel(request: MatterRequests.MoveToLevel): Promise<void> {
77
+ this.logInfo(`MoveToLevel request: ${JSON.stringify(request)}`)
78
+ const { level } = request
79
+ const brightnessPercent = Math.round((level / 254) * 100)
80
+ this.logInfo(`setting brightness to ${brightnessPercent}%.`)
81
+ // TODO: await myLightAPI.setBrightness(brightnessPercent)
82
+ }
83
+
84
+ private async handleSetColor(request: MatterRequests.MoveToColor): Promise<void> {
85
+ this.logInfo(`MoveToColor request: ${JSON.stringify(request)}`)
86
+ const { colorX, colorY, transitionTime } = request
87
+ const xFloat = (colorX / 65535).toFixed(4)
88
+ const yFloat = (colorY / 65535).toFixed(4)
89
+ this.logInfo(`setting xy color to (${xFloat}, ${yFloat}), ${transitionTime}ms.`)
90
+ // TODO: await myLightAPI.setXY(xFloat, yFloat, transitionTime)
91
+ }
92
+
93
+ private async handleSetHueSaturation(request: MatterRequests.MoveToHueAndSaturation): Promise<void> {
94
+ this.logInfo(`MoveToHueAndSaturation request: ${JSON.stringify(request)}`)
95
+ const { hue, saturation, transitionTime } = request
96
+ const hueDegrees = Math.round((hue / 254) * 360)
97
+ const saturationPercent = Math.round((saturation / 254) * 100)
98
+ this.logInfo(`setting color to ${hueDegrees}°, ${saturationPercent}%, ${transitionTime}ms.`)
99
+ // TODO: await myLightAPI.setColor(hueDegrees, saturationPercent, transitionTime)
100
+ }
101
+
102
+ private async handleSetColorTemperature(request: MatterRequests.MoveToColorTemperature): Promise<void> {
103
+ this.logInfo(`MoveToColorTemperature request: ${JSON.stringify(request)}`)
104
+ const { colorTemperatureMireds, transitionTime } = request
105
+ const kelvin = Math.round(1000000 / colorTemperatureMireds)
106
+ this.logInfo(`setting color temp to ${kelvin}k, ${transitionTime}ms.`)
107
+ // TODO: await myLightAPI.setColorTemperature(kelvin, transitionTime)
108
+ }
109
+
110
+ public updateOnOffState(isOn: boolean): void {
111
+ this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
112
+ }
113
+
114
+ public updateBrightness(percent: number): void {
115
+ const matterLevel = Math.max(1, Math.round((percent / 100) * 254))
116
+ this.updateState(this.api.matter.clusterNames.LevelControl, { currentLevel: matterLevel })
117
+ }
118
+
119
+ public updateHueSaturation(hue: number, saturation: number): void {
120
+ const matterHue = Math.round((hue / 360) * 254)
121
+ const matterSat = Math.round((saturation / 100) * 254)
122
+ this.updateState(this.api.matter.clusterNames.ColorControl, {
123
+ currentHue: matterHue,
124
+ currentSaturation: matterSat,
125
+ })
126
+ }
127
+ }
@@ -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
+ }