@switchbot/homebridge-switchbot 4.3.2-beta.9 → 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 +7 -7
  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,328 @@
1
+ # Homebridge SwitchBot Plugin Development Guide
2
+
3
+ Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.
4
+
5
+ ## Branch Targeting Strategy
6
+
7
+ When creating pull requests, ALWAYS follow this branch targeting strategy:
8
+
9
+ 1. **Primary Target:** Look for branches that start with "beta-" (e.g., `beta-4.3.2`, `beta-4.4.0`)
10
+ - If a beta branch exists, target the most recent beta branch for your PR
11
+ - Beta branches are used for testing and staging changes before they go to the main branch
12
+
13
+ 2. **Beta Branch Creation:** If no beta branches exist, create one based on the next possible version
14
+ - Parse the current version from `package.json` (e.g., "4.3.1")
15
+ - Determine version increment type using issue/PR labels (patch/minor/major)
16
+ - Calculate the appropriate next version based on detected labels
17
+ - Create a new beta branch with the format `beta-X.Y.Z` (e.g., `beta-4.3.2`)
18
+ - Base the new beta branch on the `latest` branch
19
+ - Push the new beta branch to origin and target it for the PR
20
+
21
+ 3. **Fallback Target:** Only if beta branch creation fails, target the `latest` branch
22
+ - The `latest` branch is the main development branch when no beta releases are in progress
23
+
24
+ 4. **Branch Detection and Creation:** Use these methods to check and create branches:
25
+ - **Detection:** GitHub API: Use `github-mcp-server-list_branches` to get all branches and filter for "beta-" prefix
26
+ - **Detection:** Git command: `git ls-remote --heads origin | grep beta | sort -V | tail -1` to find the latest beta branch
27
+ - **Version parsing:** Extract version from package.json: `node -p "require('./package.json').version"`
28
+ - **Label Detection:** Check for version increment labels on the issue/PR:
29
+ - Use GitHub API to get issue/PR labels
30
+ - Look for labels: `patch`, `minor`, `major`
31
+ - These labels should be set before assigning the issue to Copilot
32
+ - **Version Increment Logic:** Choose increment type based on detected labels:
33
+ - **patch label found:** `node -p "const v=require('./package.json').version.split('.'); v[2]=parseInt(v[2])+1; v.join('.')"` (4.3.1 → 4.3.2)
34
+ - **minor label found:** `node -p "const v=require('./package.json').version.split('.'); v[1]=parseInt(v[1])+1; v[2]='0'; v.join('.')"` (4.3.1 → 4.4.0)
35
+ - **major label found:** `node -p "const v=require('./package.json').version.split('.'); v[0]=parseInt(v[0])+1; v[1]='0'; v[2]='0'; v.join('.')"` (4.3.1 → 5.0.0)
36
+ - **No relevant labels:** Default to patch increment as fallback
37
+ - **Multiple increment labels:** Use highest priority (major > minor > patch)
38
+ - **Label-Based Beta Branch Creation:**
39
+ ```bash
40
+ # Detect version increment type from issue/PR labels
41
+ # Use GitHub API: github-mcp-server-get_issue or github-mcp-server-get_pull_request
42
+ # Check labels array for: patch, minor, major
43
+
44
+ # Calculate next version based on detected labels
45
+ if [[ labels contains "major" ]]; then
46
+ NEXT_VERSION=$(node -p "const v=require('./package.json').version.split('.'); v[0]=parseInt(v[0])+1; v[1]='0'; v[2]='0'; v.join('.')")
47
+ elif [[ labels contains "minor" ]]; then
48
+ NEXT_VERSION=$(node -p "const v=require('./package.json').version.split('.'); v[1]=parseInt(v[1])+1; v[2]='0'; v.join('.')")
49
+ else
50
+ # Default to patch increment (includes when "patch" label found or no labels)
51
+ NEXT_VERSION=$(node -p "const v=require('./package.json').version.split('.'); v[2]=parseInt(v[2])+1; v.join('.')")
52
+ fi
53
+
54
+ BETA_BRANCH="beta-${NEXT_VERSION}"
55
+
56
+ # Create and push the beta branch from latest
57
+ git fetch origin
58
+ git checkout -b "${BETA_BRANCH}" origin/latest
59
+ git push origin "${BETA_BRANCH}"
60
+ ```
61
+ - Always verify the target branch exists before creating the PR
62
+
63
+ **NEVER target other branches** unless specifically instructed, and avoid targeting:
64
+ - Individual feature branches (copilot/*, fix/*, etc.)
65
+ - Release branches that are not beta branches
66
+ - The main branch directly
67
+
68
+ This ensures proper workflow where changes are tested in beta branches before being merged to the main development line.
69
+
70
+ ### Branch Targeting Validation and Troubleshooting
71
+
72
+ **Before Starting Work:**
73
+ 1. **Verify Issue Labels:** Check that the assigned issue has appropriate version increment labels (`patch`, `minor`, or `major`)
74
+ 2. **Check Existing Beta Branches:** Use GitHub API or Git commands to identify current beta branches
75
+ 3. **Validate Target Branch:** Confirm the target beta branch exists or can be created successfully
76
+
77
+ **Validation Commands:**
78
+ ```bash
79
+ # Check for existing beta branches
80
+ git ls-remote --heads origin | grep "beta-" | sort -V
81
+
82
+ # Get current version for reference
83
+ node -p "require('./package.json').version"
84
+
85
+ # Example: Calculate next patch version
86
+ node -p "const v=require('./package.json').version.split('.'); v[2]=parseInt(v[2])+1; v.join('.')"
87
+ ```
88
+
89
+ **Troubleshooting Common Issues:**
90
+ - **No version labels on issue:** Proceed with patch increment but notify in PR description
91
+ - **Beta branch creation fails:** Fall back to targeting `latest` branch and document in PR
92
+ - **Multiple conflicting labels:** Use highest priority (major > minor > patch) and document decision
93
+ - **Network/API failures:** Use Git commands as fallback for branch detection
94
+
95
+ ### Label Requirements for Version Management
96
+
97
+ **⚠️ CRITICAL REQUIREMENT:** Before assigning issues to Copilot, project maintainers **MUST** set appropriate version increment labels. This is required for proper branch targeting and version management.
98
+
99
+ **Required Labels:**
100
+ - **`patch`** - Bug fixes, documentation updates, minor improvements (4.3.1 → 4.3.2)
101
+ - **`minor`** - New features, device support additions, non-breaking enhancements (4.3.1 → 4.4.0)
102
+ - **`major`** - Breaking changes, API modifications, major architectural updates (4.3.1 → 5.0.0)
103
+
104
+ **Label Priority:** If multiple increment labels are present, the highest priority is used (major > minor > patch).
105
+
106
+ **Fallback Behavior:** If no version increment labels are found, the system defaults to patch increment to ensure conservative version management.
107
+
108
+ **Validation Process:** Copilot will:
109
+ 1. Check for required labels on the assigned issue
110
+ 2. Log a warning if no version increment labels are found
111
+ 3. Proceed with patch increment as fallback
112
+ 4. Create or target the appropriate beta branch based on version increment
113
+
114
+ ## Working Effectively
115
+
116
+ ### Bootstrap and Build Process
117
+ Run these commands in sequence to set up and build the project:
118
+
119
+ 1. **Install dependencies:**
120
+ ```bash
121
+ npm install --legacy-peer-deps
122
+ ```
123
+ - CRITICAL: Must use `--legacy-peer-deps` flag due to TypeDoc dependency conflicts
124
+ - Takes approximately 30-45 seconds
125
+ - This is a known workaround documented in the codebase
126
+
127
+ 2. **Build the project:**
128
+ ```bash
129
+ npm run build
130
+ ```
131
+ - Takes approximately 7-10 seconds
132
+ - Compiles TypeScript and copies UI files
133
+ - Output goes to `dist/` directory
134
+
135
+ 3. **Run tests:**
136
+ ```bash
137
+ npm run test
138
+ ```
139
+ - Takes approximately 2-3 seconds
140
+ - Currently minimal test suite (1 test file)
141
+ - Use `npm run test:watch` for continuous testing during development
142
+
143
+ 4. **Generate documentation:**
144
+ ```bash
145
+ npm run docs
146
+ ```
147
+ - Takes approximately 5-10 seconds
148
+ - Generates TypeDoc documentation in `docs/` directory
149
+
150
+ ### Full Build and Validation Workflow
151
+ Complete validation workflow (approximately 30-45 seconds total):
152
+ ```bash
153
+ npm install --legacy-peer-deps && npm run build && npm run test && npm run docs && npm run docs:lint && npm run docs:theme
154
+ ```
155
+ - NEVER CANCEL: Set timeout to 90+ seconds for this complete workflow
156
+ - This validates TypeScript compilation, plugin loading, and documentation generation
157
+
158
+ ### Development Commands
159
+
160
+ - **Watch mode for development:**
161
+ ```bash
162
+ npm run watch
163
+ ```
164
+ - Builds, links plugin locally, and starts nodemon for file watching
165
+ - Requires local Homebridge installation
166
+
167
+ - **Clean build artifacts:**
168
+ ```bash
169
+ npm run clean
170
+ ```
171
+ - Removes `dist/` directory
172
+
173
+ - **Check for outdated dependencies:**
174
+ ```bash
175
+ npm run check
176
+ ```
177
+ - WARNING: This will fail due to dependency conflicts - use with `--legacy-peer-deps`
178
+
179
+ ### Known Issues and Workarounds
180
+
181
+ - **Linting fails:** `npm run lint` and `npm run lint:fix` currently fail due to ESLint configuration conflicts with import/extensions rule. Document any code style issues manually.
182
+
183
+ - **Dependency conflicts:** Always use `--legacy-peer-deps` flag for npm install due to TypeDoc theme dependency version mismatches.
184
+
185
+ - **Coverage and docs artifacts:** Add `coverage/` and `docs/` to `.gitignore` to prevent committing build artifacts.
186
+
187
+ ## Validation Scenarios
188
+
189
+ ### Manual Plugin Validation
190
+ After making changes, ALWAYS run these validation steps:
191
+
192
+ 1. **Verify plugin builds and loads:**
193
+ ```bash
194
+ npm run build && node -e "
195
+ try {
196
+ const plugin = require('./dist/index.js');
197
+ console.log('Plugin loads successfully');
198
+ console.log('Plugin type:', typeof plugin.default);
199
+ } catch (e) {
200
+ console.error('Plugin load failed:', e.message);
201
+ }"
202
+ ```
203
+
204
+ 2. **Test plugin registration:**
205
+ - Plugin exports a default function that registers with Homebridge
206
+ - Uses `PLUGIN_NAME = '@switchbot/homebridge-switchbot'` and `PLATFORM_NAME = 'SwitchBot'`
207
+ - Main platform class is `SwitchBotPlatform`
208
+
209
+ 3. **Validate TypeScript compilation:**
210
+ - Must have no TypeScript errors
211
+ - Check `dist/` directory contains all expected `.js`, `.d.ts`, and `.map` files
212
+
213
+ 4. **Test documentation generation:**
214
+ ```bash
215
+ npm run docs:lint
216
+ ```
217
+ - Must pass without warnings when using `--treatWarningsAsErrors`
218
+
219
+ ### Code Coverage Validation
220
+ Run comprehensive test coverage analysis:
221
+ ```bash
222
+ npm run test-coverage
223
+ ```
224
+ - Current coverage is minimal (~1.36% overall)
225
+ - Coverage reports generated in `coverage/` directory
226
+
227
+ ## Codebase Navigation
228
+
229
+ ### Project Structure
230
+ ```
231
+ ├── src/ # Source TypeScript files
232
+ │ ├── device/ # Device implementations (21 files)
233
+ │ │ ├── device.ts # Base device class (deviceBase)
234
+ │ │ ├── bot.ts # SwitchBot Bot device
235
+ │ │ ├── curtain.ts # SwitchBot Curtain device
236
+ │ │ └── ... # Other device implementations
237
+ │ ├── irdevice/ # IR device implementations (10 files)
238
+ │ │ ├── irdevice.ts # Base IR device class
239
+ │ │ ├── tv.ts # TV IR control
240
+ │ │ └── ... # Other IR device implementations
241
+ │ ├── homebridge-ui/ # Plugin configuration UI
242
+ │ │ ├── server.ts # UI backend server
243
+ │ │ └── public/ # UI frontend files
244
+ │ ├── platform.ts # Main platform class (SwitchBotPlatform)
245
+ │ ├── settings.ts # Configuration interfaces and constants
246
+ │ ├── utils.ts # Utility functions
247
+ │ └── index.ts # Plugin entry point
248
+ ├── config.schema.json # Homebridge configuration schema
249
+ ├── dist/ # Compiled JavaScript output
250
+ ├── docs/ # Generated TypeDoc documentation
251
+ └── coverage/ # Test coverage reports
252
+ ```
253
+
254
+ ### Key Development Areas
255
+
256
+ - **Adding new devices:** Extend `src/device/device.ts` base class, implement in new file under `src/device/`
257
+ - **Adding IR devices:** Extend `src/irdevice/irdevice.ts` base class, implement in new file under `src/irdevice/`
258
+ - **Configuration changes:** Update `src/settings.ts` and `config.schema.json`
259
+ - **Platform modifications:** Edit `src/platform.ts` (main class with 2800+ lines)
260
+ - **Utility functions:** Modify `src/utils.ts` for shared functionality
261
+
262
+ ### Device Connection Types
263
+ This plugin supports two connection methods to SwitchBot devices:
264
+ 1. **OpenAPI Connection:** Requires SwitchBot Cloud API token/secret, works through SwitchBot Hub
265
+ 2. **BLE (Bluetooth Low Energy):** Direct device connection, requires device MAC addresses
266
+
267
+ ### Common Development Tasks
268
+
269
+ - **Testing device implementations:** Focus on `src/device/` and `src/irdevice/` directories
270
+ - **Configuration UI changes:** Modify `src/homebridge-ui/` files and rebuild with `npm run plugin-ui`
271
+ - **Platform logic changes:** Edit `src/platform.ts` - the main orchestration file
272
+ - **Adding device support:** Create new device class extending `deviceBase` or IR device class
273
+
274
+ ### Important File Relationships
275
+ - Always update both device implementation AND platform.ts when adding new device types
276
+ - Configuration schema changes require updates to settings.ts interfaces
277
+ - Device MAC address validation is handled in utils.ts (`formatDeviceIdAsMac`)
278
+ - BLE connection handling is in the base device classes
279
+
280
+ ## Build Time Expectations
281
+
282
+ - **npm install --legacy-peer-deps:** 30-45 seconds
283
+ - **npm run build:** 7-10 seconds
284
+ - **npm run test:** 2-3 seconds
285
+ - **npm run docs:** 5-10 seconds
286
+ - **Complete validation workflow:** 30-45 seconds total
287
+ - **NEVER CANCEL:** Always wait for builds to complete, set timeouts to 90+ seconds for safety
288
+
289
+ ## CI/CD Integration
290
+
291
+ The project uses GitHub Actions for CI:
292
+ - **Build workflow:** `.github/workflows/build.yml` runs Node.js build and test, then ESLint
293
+ - **Required checks:** Build must pass, tests must pass
294
+ - **Known CI issue:** ESLint currently fails due to configuration conflicts
295
+
296
+ Always run the complete validation workflow locally before committing:
297
+ ```bash
298
+ npm run build && npm run test && npm run docs:lint
299
+ ```
300
+
301
+ ## Complete Workflow Examples
302
+
303
+ ### Example 1: Issue with Proper Labels
304
+ **Scenario:** Issue #1234 assigned to Copilot with `minor` label
305
+
306
+ **Workflow:**
307
+ 1. **Label Detection:** Copilot detects `minor` label → target version 4.4.0
308
+ 2. **Branch Check:** Look for existing beta branches: `git ls-remote --heads origin | grep beta-`
309
+ 3. **Beta Branch Creation:** No beta-4.4.0 exists → create from latest branch
310
+ 4. **PR Targeting:** Target the new beta-4.4.0 branch
311
+ 5. **Development:** Make changes, test, commit to beta branch
312
+
313
+ ### Example 2: Issue without Version Labels
314
+ **Scenario:** Issue #1276 assigned to Copilot with no version increment labels
315
+
316
+ **Workflow:**
317
+ 1. **Label Detection:** No version labels found → default to patch increment
318
+ 2. **Version Calculation:** Current 4.3.1 → next patch 4.3.2
319
+ 3. **Branch Check:** beta-4.3.2 already exists → target existing branch
320
+ 4. **Development:** Make changes, document label requirement in PR description
321
+
322
+ ### Example 3: Multiple Version Labels
323
+ **Scenario:** Issue assigned with both `minor` and `patch` labels
324
+
325
+ **Workflow:**
326
+ 1. **Label Priority:** minor (higher priority) overrides patch
327
+ 2. **Version Target:** Calculate minor increment instead of patch
328
+ 3. **Documentation:** Note in PR description why minor was chosen over patch
@@ -7,22 +7,20 @@ on:
7
7
 
8
8
  jobs:
9
9
  build_and_test:
10
- uses: OpenWonderLabs/.github/.github/workflows/nodejs-build-and-test.yml@latest
10
+ uses: homebridge/.github/.github/workflows/nodejs-build-and-test.yml@latest
11
11
  with:
12
- enable_coverage: true
12
+ enable_coverage: false
13
13
  secrets:
14
14
  token: ${{ secrets.GITHUB_TOKEN }}
15
-
16
15
  lint:
17
16
  needs: build_and_test
18
- uses: OpenWonderLabs/.github/.github/workflows/eslint.yml@latest
17
+ uses: homebridge/.github/.github/workflows/eslint.yml@latest
19
18
 
20
19
  publish:
21
20
  needs: lint
22
- if: ${{ github.repository == 'OpenWonderLabs/homebridge-switchbot' }}
23
21
  permissions:
24
22
  id-token: write
25
- uses: OpenWonderLabs/.github/.github/workflows/npm-publish-esm.yml@latest
23
+ uses: homebridge/.github/.github/workflows/npm-publish-esm.yml@latest
26
24
  with:
27
25
  tag: 'beta'
28
26
  dynamically_adjust_version: true
@@ -33,8 +31,7 @@ jobs:
33
31
 
34
32
  pre-release:
35
33
  needs: publish
36
- if: ${{ github.repository == 'OpenWonderLabs/homebridge-switchbot' }}
37
- uses: OpenWonderLabs/.github/.github/workflows/pre-release.yml@latest
34
+ uses: homebridge/.github/.github/workflows/pre-release.yml@latest
38
35
  with:
39
36
  npm_version: ${{ needs.publish.outputs.NPM_VERSION }}
40
37
  body: |
@@ -45,12 +42,11 @@ jobs:
45
42
  github-releases-to-discord:
46
43
  name: Discord Webhooks
47
44
  needs: [build_and_test,publish]
48
- if: ${{ github.repository == 'OpenWonderLabs/homebridge-switchbot' }}
49
- uses: OpenWonderLabs/.github/.github/workflows/discord-webhooks.yml@latest
45
+ uses: homebridge/.github/.github/workflows/discord-webhooks.yml@latest
50
46
  with:
51
47
  title: "SwitchBot Beta Release"
52
48
  description: |
53
49
  Version `v${{ needs.publish.outputs.NPM_VERSION }}`
54
- url: "https://github.com/homebridge/camera-utils/releases/tag/v${{ needs.publish.outputs.NPM_VERSION }}"
50
+ url: "https://github.com/OpenWonderLabs/homebridge-switchbot/releases/tag/v${{ needs.publish.outputs.NPM_VERSION }}"
55
51
  secrets:
56
- DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL_BETA || secrets.DISCORD_WEBHOOK_URL_LATEST }}
52
+ DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL_LATEST }}
@@ -1,39 +1,75 @@
1
- name: Release
1
+ name: Unified Release
2
2
 
3
3
  on:
4
- release:
5
- types: [published]
4
+ push:
5
+ branches:
6
+ #- "alpha-*"
7
+ #- "beta-*"
8
+ - latest
9
+ workflow_dispatch:
6
10
 
7
11
  jobs:
8
- build_and_test:
9
- uses: OpenWonderLabs/.github/.github/workflows/nodejs-build-and-test.yml@latest
12
+ # 1️⃣ Determine release type, ESM status, and branch name
13
+ determine-release-type:
14
+ uses: homebridge/.github/.github/workflows/determine-release-type.yml@latest
10
15
  with:
11
- enable_coverage: true
16
+ ref_name: ${{ github.ref_name }}
17
+
18
+ # 2️⃣ Update version and changelog using the scripts
19
+ update-version:
20
+ needs: determine-release-type
21
+ uses: homebridge/.github/.github/workflows/update-version.yml@latest
22
+ with:
23
+ release_type: ${{ needs.determine-release-type.outputs.release_type }}
24
+ is_esm: ${{ needs.determine-release-type.outputs.is_esm == 'true' }}
12
25
  secrets:
13
- token: ${{ secrets.GITHUB_TOKEN }}
26
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
14
27
 
15
- publish:
16
- needs: build_and_test
17
- if: ${{ github.repository == 'OpenWonderLabs/homebridge-switchbot' }}
28
+ # 3️⃣ Publish to NPM and create GitHub release
29
+ publish-release:
30
+ needs: [determine-release-type, update-version]
18
31
  permissions:
19
32
  id-token: write
20
- uses: OpenWonderLabs/.github/.github/workflows/npm-publish-esm.yml@latest
33
+ contents: write
34
+ uses: homebridge/.github/.github/workflows/publish-release.yml@latest
35
+ with:
36
+ release_type: ${{ needs.determine-release-type.outputs.release_type }}
37
+ version: ${{ needs.update-version.outputs.version }}
38
+ is_esm: ${{ needs.determine-release-type.outputs.is_esm == 'true' }}
39
+ secrets:
40
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
41
+
42
+ # 4️⃣ Promote branch if this is a prerelease (alpha/beta)
43
+ promote-branch:
44
+ needs: [determine-release-type, publish-release]
45
+ if: ${{ needs.determine-release-type.outputs.release_type != 'latest' && needs.determine-release-type.outputs.release_type != 'skip' }}
46
+ uses: homebridge/.github/.github/workflows/promote-branch.yml@latest
47
+ with:
48
+ branch_name: ${{ needs.determine-release-type.outputs.branch_name }}
49
+ release_type: ${{ needs.determine-release-type.outputs.release_type }}
50
+ is_esm: ${{ needs.determine-release-type.outputs.is_esm == 'true' }}
21
51
  secrets:
22
- npm_auth_token: ${{ secrets.npm_token }}
52
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
23
53
 
54
+ # 5️⃣ Notify if any previous job fails
55
+ workflow-failure:
56
+ if: ${{ failure() }}
57
+ needs: [determine-release-type, update-version, publish-release, promote-branch]
58
+ uses: homebridge/.github/.github/workflows/report-failure.yml@latest
59
+ with:
60
+ workflow_name: ${{ github.workflow }}
61
+ job_name: ${{ github.job }}
62
+ run_url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
63
+
64
+ # 6️⃣ Post to Discord
24
65
  github-releases-to-discord:
25
66
  name: Discord Webhooks
26
- needs: [build_and_test,publish]
27
- if: ${{ github.repository == 'OpenWonderLabs/homebridge-switchbot' }}
28
- uses: OpenWonderLabs/.github/.github/workflows/discord-webhooks.yml@latest
67
+ needs: [determine-release-type, update-version, publish-release]
68
+ uses: homebridge/.github/.github/workflows/discord-webhooks.yml@latest
29
69
  with:
30
70
  title: "SwitchBot Release"
31
71
  description: |
32
- Version `v${{ needs.publish.outputs.NPM_VERSION }}`
33
- url: "https://github.com/homebridge/camera-utils/releases/tag/v${{ needs.publish.outputs.NPM_VERSION }}"
72
+ Version `v${{ needs.update-version.outputs.version }}`
73
+ url: "https://github.com/OpenWonderLabs/homebridge-switchbot/releases/tag/v${{ needs.update-version.outputs.version }}"
34
74
  secrets:
35
75
  DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL_LATEST }}
36
-
37
-
38
-
39
-
package/README.md CHANGED
@@ -94,7 +94,7 @@
94
94
  - [SwitchBot Indoor/Outdoor Thermo-Hygrometer](https://www.switch-bot.com/products/switchbot-indoor-outdoor-thermo-hygrometer)
95
95
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
96
96
  - If using OpenAPI:
97
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
97
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
98
98
  - Enable Cloud Services for Device on SwitchBot App
99
99
  - If using Bluetooth Low Energy (BLE) only:
100
100
  - Must supply `deviceId` & `deviceName` to Device Config
@@ -102,7 +102,7 @@
102
102
  - [SwitchBot Motion Sensor](https://www.switch-bot.com/products/motion-sensor)
103
103
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
104
104
  - If using OpenAPI:
105
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
105
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
106
106
  - Enable Cloud Services for Device on SwitchBot App
107
107
  - If using Bluetooth Low Energy (BLE) only:
108
108
  - Must supply `deviceId` & `deviceName` to Device Config
@@ -110,7 +110,7 @@
110
110
  - [SwitchBot Contact Sensor](https://www.switch-bot.com/products/contact-sensor)
111
111
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
112
112
  - If using OpenAPI:
113
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
113
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
114
114
  - Enable Cloud Services for Device on SwitchBot App
115
115
  - If using Bluetooth Low Energy (BLE) only:
116
116
  - Must supply `deviceId` & `deviceName` to Device Config
@@ -119,7 +119,7 @@
119
119
  - [SwitchBot Curtain 3](https://www.switch-bot.com/products/switchbot-curtain-3)
120
120
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
121
121
  - If using OpenAPI:
122
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
122
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
123
123
  - Enable Cloud Services for Device on SwitchBot App
124
124
  - If using Bluetooth Low Energy (BLE) only:
125
125
  - Must supply `deviceId` & `deviceName` to Device Config
@@ -127,7 +127,7 @@
127
127
  - [SwitchBot Blind Tilt](https://us.switch-bot.com/products/switchbot-blind-tilt)
128
128
  - Supports OpenAPI & partial Bluetooth Low Energy (BLE) Connections
129
129
  - If using OpenAPI:
130
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
130
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
131
131
  - Enable Cloud Services for Device on SwitchBot App
132
132
  - [SwitchBot Bulb](https://www.switch-bot.com/products/switchbot-color-bulb)
133
133
  - [SwitchBot Ceiling Light](https://www.switchbot.jp/collections/all/products/switchbot-ceiling-light)
@@ -135,13 +135,13 @@
135
135
  - [SwitchBot Light Strip](https://www.switch-bot.com/products/switchbot-light-strip)
136
136
  - Supports OpenAPI & partial Bluetooth Low Energy (BLE) Connections
137
137
  - If using OpenAPI:
138
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
138
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
139
139
  - Enable Cloud Services for Device on SwitchBot App
140
140
  - [SwitchBot Lock](https://us.switch-bot.com/products/switchbot-lock)
141
141
  - [SwitchBot Lock Pro](https://www.switchbot.jp/products/switchbot-lock-pro)
142
142
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
143
143
  - If using OpenAPI:
144
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
144
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
145
145
  - Enable Cloud Services for Device on SwitchBot App
146
146
  - US: [SwitchBot Mini Robot Vacuum K10+](https://www.switch-bot.com/products/switchbot-mini-robot-vacuum-k10)
147
147
  - US: [SwitchBot Floor Cleaning Robot S10](https://www.switch-bot.com/products/switchbot-floor-cleaning-robot-s10)
@@ -153,12 +153,12 @@
153
153
  - [SwitchBot Plug Mini (JP)](https://www.switchbot.jp/products/switchbot-plug-mini)
154
154
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
155
155
  - If using OpenAPI:
156
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
156
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
157
157
  - Enable Cloud Services for Device on SwitchBot App
158
158
  - [SwitchBot Bot](https://www.switch-bot.com/products/switchbot-bot)
159
159
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
160
160
  - If using OpenAPI:
161
- - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini) or [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) Required
161
+ - [SwitchBot Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini), [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), or [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3) Required
162
162
  - Enable Cloud Services for Device on SwitchBot App
163
163
  - You must set your Bot's Device ID for either Press Mode or Switch Mode in Plugin Config (SwitchBot Device Settings > Bot Settings)
164
164
  - Press Mode - Turns on then instantly turn it off
@@ -171,6 +171,9 @@
171
171
  - [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2)
172
172
  - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
173
173
  - Enables Humidity, Temperature, and Light Sensor
174
+ - [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3)
175
+ - Supports OpenAPI & Bluetooth Low Energy (BLE) Connections
176
+ - Enables Humidity, Temperature, and Light Sensor
174
177
  - [SwitchBot Battery Circulator Fan](https://us.switch-bot.com/products/switchbot-battery-circulator-fan)
175
178
  - Supports OpenAPI Connection Only
176
179
  - [SwitchBot Water Leak Detector](https://us.switch-bot.com/products/switchbot-water-leak-detector)
@@ -178,7 +181,7 @@
178
181
 
179
182
  ## Supported IR Devices
180
183
 
181
- ### _(All IR Devices require [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2) or [Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini))_
184
+ ### _(All IR Devices require [SwitchBot Hub 2](https://us.switch-bot.com/products/switchbot-hub-2), [SwitchBot Hub 3](https://us.switch-bot.com/products/switchbot-hub-3), or [Hub Mini](https://www.switch-bot.com/products/switchbot-hub-mini))_
182
185
 
183
186
  - TV
184
187
  - Allows for On/Off and Volume Controls
@@ -32,18 +32,8 @@
32
32
  "x-schema-form": {
33
33
  "type": "secret"
34
34
  }
35
- },
36
- "notice": {
37
- "title": "Notice",
38
- "type": "string",
39
- "default": "Keep your Token & Secret a secret!"
40
35
  }
41
- },
42
- "required": [
43
- "token",
44
- "secret",
45
- "notice"
46
- ]
36
+ }
47
37
  },
48
38
  "options": {
49
39
  "type": "object",
@@ -13094,7 +13084,6 @@
13094
13084
  }
13095
13085
  },
13096
13086
  "required": [
13097
- "name",
13098
13087
  "logging"
13099
13088
  ]
13100
13089
  }