@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,113 @@
1
+ /**
2
+ * Color Light Accessory Class (HS only)
3
+ * Hue and Saturation color control
4
+ */
5
+
6
+ import type { API, Logger, MatterRequests } from 'homebridge'
7
+
8
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
9
+
10
+ export class ColorLightAccessory extends BaseMatterAccessory {
11
+ constructor(api: API, log: Logger) {
12
+ const serialNumber = 'LIGHT-004'
13
+ super(api, log, {
14
+ uuid: api.matter.uuid.generate(serialNumber),
15
+ displayName: 'Colour Light (HS)',
16
+ deviceType: api.matter.deviceTypes.ExtendedColorLight,
17
+ serialNumber,
18
+ manufacturer: 'Homebridge Matter',
19
+ model: 'HB-MATTER-LIGHT-COLOUR-HS',
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
+ },
37
+ },
38
+
39
+ handlers: {
40
+ onOff: {
41
+ on: async () => this.handleOn(),
42
+ off: async () => this.handleOff(),
43
+ },
44
+ levelControl: {
45
+ moveToLevelWithOnOff: async (request: MatterRequests.MoveToLevel) =>
46
+ this.handleSetLevel(request),
47
+ },
48
+ colorControl: {
49
+ moveToColorLogic: async (request: MatterRequests.MoveToColor) =>
50
+ this.handleSetColor(request),
51
+ moveToHueAndSaturationLogic: async (request: MatterRequests.MoveToHueAndSaturation) =>
52
+ this.handleSetHueSaturation(request),
53
+ },
54
+ },
55
+ })
56
+
57
+ this.logInfo('initialized.')
58
+ }
59
+
60
+ private async handleOn(): Promise<void> {
61
+ this.logInfo('turning on.')
62
+ // TODO: await myLightAPI.turnOn()
63
+ }
64
+
65
+ private async handleOff(): Promise<void> {
66
+ this.logInfo('turning off.')
67
+ // TODO: await myLightAPI.turnOff()
68
+ }
69
+
70
+ private async handleSetLevel(request: MatterRequests.MoveToLevel): Promise<void> {
71
+ this.logInfo(`MoveToLevel request: ${JSON.stringify(request)}`)
72
+ const { level } = request
73
+ const brightnessPercent = Math.round((level / 254) * 100)
74
+ this.logInfo(`setting brightness to ${brightnessPercent}%.`)
75
+ // TODO: await myLightAPI.setBrightness(brightnessPercent)
76
+ }
77
+
78
+ private async handleSetColor(request: MatterRequests.MoveToColor): Promise<void> {
79
+ this.logInfo(`MoveToColor request: ${JSON.stringify(request)}`)
80
+ const { colorX, colorY, transitionTime } = request
81
+ const xFloat = (colorX / 65535).toFixed(4)
82
+ const yFloat = (colorY / 65535).toFixed(4)
83
+ this.logInfo(`setting xy color to (${xFloat}, ${yFloat}) with transition ${transitionTime}.`)
84
+ // TODO: await myLightAPI.setXY(xFloat, yFloat, transitionTime)
85
+ }
86
+
87
+ private async handleSetHueSaturation(request: MatterRequests.MoveToHueAndSaturation): Promise<void> {
88
+ this.logInfo(`MoveToHueAndSaturation request: ${JSON.stringify(request)}`)
89
+ const { hue, saturation, transitionTime } = request
90
+ const hueDegrees = Math.round((hue / 254) * 360)
91
+ const saturationPercent = Math.round((saturation / 254) * 100)
92
+ this.logInfo(`setting color to ${hueDegrees}°, ${saturationPercent}% with transition ${transitionTime}.`)
93
+ // TODO: await myLightAPI.setColor(hueDegrees, saturationPercent, transitionTime)
94
+ }
95
+
96
+ public updateOnOffState(isOn: boolean): void {
97
+ this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
98
+ }
99
+
100
+ public updateBrightness(percent: number): void {
101
+ const matterLevel = Math.max(1, Math.round((percent / 100) * 254))
102
+ this.updateState(this.api.matter.clusterNames.LevelControl, { currentLevel: matterLevel })
103
+ }
104
+
105
+ public updateHueSaturation(hue: number, saturation: number): void {
106
+ const matterHue = Math.round((hue / 360) * 254)
107
+ const matterSat = Math.round((saturation / 100) * 254)
108
+ this.updateState(this.api.matter.clusterNames.ColorControl, {
109
+ currentHue: matterHue,
110
+ currentSaturation: matterSat,
111
+ })
112
+ }
113
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Color Temperature Light Accessory Class
3
+ */
4
+
5
+ import type { API, Logger, MatterRequests } from 'homebridge'
6
+
7
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
8
+
9
+ export class ColorTemperatureLightAccessory extends BaseMatterAccessory {
10
+ constructor(api: API, log: Logger) {
11
+ const serialNumber = 'LIGHT-003'
12
+ super(api, log, {
13
+ uuid: api.matter.uuid.generate(serialNumber),
14
+ displayName: 'Colour Temperature Light',
15
+ deviceType: api.matter.deviceTypes.ColorTemperatureLight,
16
+ serialNumber,
17
+ manufacturer: 'Homebridge Matter',
18
+ model: 'HB-MATTER-LIGHT-COLOUR-TEMP',
19
+ firmwareRevision: '2.0.0',
20
+ hardwareRevision: '1.0.0',
21
+
22
+ clusters: {
23
+ onOff: {
24
+ onOff: false,
25
+ },
26
+ levelControl: {
27
+ currentLevel: 127,
28
+ minLevel: 1,
29
+ maxLevel: 254,
30
+ },
31
+ colorControl: {
32
+ colorMode: api.matter.types.ColorControl.ColorMode.ColorTemperatureMireds,
33
+ colorTemperatureMireds: 250,
34
+ colorTempPhysicalMinMireds: 147,
35
+ colorTempPhysicalMaxMireds: 454,
36
+ coupleColorTempToLevelMinMireds: 147,
37
+ },
38
+ },
39
+
40
+ handlers: {
41
+ onOff: {
42
+ on: async () => this.handleOn(),
43
+ off: async () => this.handleOff(),
44
+ },
45
+ levelControl: {
46
+ moveToLevelWithOnOff: async (request: MatterRequests.MoveToLevel) =>
47
+ this.handleSetLevel(request),
48
+ },
49
+ colorControl: {
50
+ moveToColorTemperatureLogic: async (request: MatterRequests.MoveToColorTemperature) =>
51
+ this.handleSetColorTemperature(request),
52
+ },
53
+ },
54
+ })
55
+
56
+ this.logInfo('initialized.')
57
+ }
58
+
59
+ private async handleOn(): Promise<void> {
60
+ this.logInfo('turning on.')
61
+ // TODO: await myLightAPI.turnOn()
62
+ }
63
+
64
+ private async handleOff(): Promise<void> {
65
+ this.logInfo('turning off.')
66
+ // TODO: await myLightAPI.turnOff()
67
+ }
68
+
69
+ private async handleSetLevel(request: MatterRequests.MoveToLevel): Promise<void> {
70
+ this.logInfo(`MoveToLevel request: ${JSON.stringify(request)}`)
71
+ const { level } = request
72
+ const brightnessPercent = Math.round((level / 254) * 100)
73
+ this.logInfo(`setting brightness to ${brightnessPercent}% (level: ${level}).`)
74
+ // TODO: await myLightAPI.setBrightness(brightnessPercent)
75
+ }
76
+
77
+ private async handleSetColorTemperature(request: MatterRequests.MoveToColorTemperature): Promise<void> {
78
+ this.logInfo(`MoveToColorTemperature request: ${JSON.stringify(request)}`)
79
+ const { colorTemperatureMireds, transitionTime } = request
80
+ const kelvin = Math.round(1000000 / colorTemperatureMireds)
81
+ this.logInfo(`setting color temp to ${kelvin}k (${colorTemperatureMireds} mireds) with transitionTime=${transitionTime}.`)
82
+ // TODO: await myLightAPI.setColorTemperature(kelvin, transitionTime)
83
+ }
84
+
85
+ public updateOnOffState(isOn: boolean): void {
86
+ this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
87
+ }
88
+
89
+ public updateBrightness(percent: number): void {
90
+ const matterLevel = Math.max(1, Math.round((percent / 100) * 254))
91
+ this.updateState(this.api.matter.clusterNames.LevelControl, { currentLevel: matterLevel })
92
+ }
93
+
94
+ public updateColorTemperature(kelvin: number): void {
95
+ const mireds = Math.round(1000000 / kelvin)
96
+ this.updateState(this.api.matter.clusterNames.ColorControl, { colorTemperatureMireds: mireds })
97
+ }
98
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Contact Sensor Accessory Class
3
+ */
4
+
5
+ import type { API, Logger } from 'homebridge'
6
+
7
+ import { BaseMatterAccessory } from './BaseMatterAccessory.js'
8
+
9
+ export class ContactSensorAccessory extends BaseMatterAccessory {
10
+ constructor(api: API, log: Logger) {
11
+ const serialNumber = 'SENSOR-001'
12
+ super(api, log, {
13
+ uuid: api.matter.uuid.generate(serialNumber),
14
+ displayName: 'Contact Sensor',
15
+ deviceType: api.matter.deviceTypes.ContactSensor,
16
+ serialNumber,
17
+ manufacturer: 'Homebridge Matter',
18
+ model: 'HB-MATTER-SENSOR-CONTACT',
19
+ firmwareRevision: '2.0.0',
20
+ hardwareRevision: '1.0.0',
21
+
22
+ clusters: {
23
+ booleanState: {
24
+ stateValue: true, // matter: true = closed/normal, false = open/triggered
25
+ },
26
+ },
27
+ })
28
+
29
+ this.logInfo('initialized.')
30
+ }
31
+
32
+ public updateContactState(isOpen: boolean): void {
33
+ // Matter BooleanState: false = open/triggered, true = closed/normal (inverted!)
34
+ this.updateState(this.api.matter.clusterNames.BooleanState, { stateValue: !isOpen })
35
+ this.logInfo(`contact state: ${isOpen ? 'OPEN' : 'CLOSED'}.`)
36
+ }
37
+ }
@@ -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
+ }