@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
package/docs/index.html CHANGED
@@ -113,7 +113,7 @@ Without this step, then you will receive the following error when the swichbot p
113
113
  <li>Supports OpenAPI &amp; Bluetooth Low Energy (BLE) Connections</li>
114
114
  <li>If using OpenAPI:
115
115
  <ul>
116
- <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a> or <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a> Required</li>
116
+ <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a>, <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a>, or <a href="https://us.switch-bot.com/products/switchbot-hub-3">SwitchBot Hub 3</a> Required</li>
117
117
  <li>Enable Cloud Services for Device on SwitchBot App</li>
118
118
  </ul>
119
119
  </li>
@@ -130,7 +130,7 @@ Without this step, then you will receive the following error when the swichbot p
130
130
  <li>Supports OpenAPI &amp; Bluetooth Low Energy (BLE) Connections</li>
131
131
  <li>If using OpenAPI:
132
132
  <ul>
133
- <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a> or <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a> Required</li>
133
+ <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a>, <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a>, or <a href="https://us.switch-bot.com/products/switchbot-hub-3">SwitchBot Hub 3</a> Required</li>
134
134
  <li>Enable Cloud Services for Device on SwitchBot App</li>
135
135
  </ul>
136
136
  </li>
@@ -147,7 +147,7 @@ Without this step, then you will receive the following error when the swichbot p
147
147
  <li>Supports OpenAPI &amp; Bluetooth Low Energy (BLE) Connections</li>
148
148
  <li>If using OpenAPI:
149
149
  <ul>
150
- <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a> or <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a> Required</li>
150
+ <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a>, <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a>, or <a href="https://us.switch-bot.com/products/switchbot-hub-3">SwitchBot Hub 3</a> Required</li>
151
151
  <li>Enable Cloud Services for Device on SwitchBot App</li>
152
152
  </ul>
153
153
  </li>
@@ -165,7 +165,7 @@ Without this step, then you will receive the following error when the swichbot p
165
165
  <li>Supports OpenAPI &amp; Bluetooth Low Energy (BLE) Connections</li>
166
166
  <li>If using OpenAPI:
167
167
  <ul>
168
- <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a> or <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a> Required</li>
168
+ <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a>, <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a>, or <a href="https://us.switch-bot.com/products/switchbot-hub-3">SwitchBot Hub 3</a> Required</li>
169
169
  <li>Enable Cloud Services for Device on SwitchBot App</li>
170
170
  </ul>
171
171
  </li>
@@ -182,7 +182,7 @@ Without this step, then you will receive the following error when the swichbot p
182
182
  <li>Supports OpenAPI &amp; partial Bluetooth Low Energy (BLE) Connections</li>
183
183
  <li>If using OpenAPI:
184
184
  <ul>
185
- <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a> or <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a> Required</li>
185
+ <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a>, <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a>, or <a href="https://us.switch-bot.com/products/switchbot-hub-3">SwitchBot Hub 3</a> Required</li>
186
186
  <li>Enable Cloud Services for Device on SwitchBot App</li>
187
187
  </ul>
188
188
  </li>
@@ -196,7 +196,7 @@ Without this step, then you will receive the following error when the swichbot p
196
196
  <li>Supports OpenAPI &amp; partial Bluetooth Low Energy (BLE) Connections</li>
197
197
  <li>If using OpenAPI:
198
198
  <ul>
199
- <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a> or <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a> Required</li>
199
+ <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a>, <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a>, or <a href="https://us.switch-bot.com/products/switchbot-hub-3">SwitchBot Hub 3</a> Required</li>
200
200
  <li>Enable Cloud Services for Device on SwitchBot App</li>
201
201
  </ul>
202
202
  </li>
@@ -208,7 +208,7 @@ Without this step, then you will receive the following error when the swichbot p
208
208
  <li>Supports OpenAPI &amp; Bluetooth Low Energy (BLE) Connections</li>
209
209
  <li>If using OpenAPI:
210
210
  <ul>
211
- <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a> or <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a> Required</li>
211
+ <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a>, <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a>, or <a href="https://us.switch-bot.com/products/switchbot-hub-3">SwitchBot Hub 3</a> Required</li>
212
212
  <li>Enable Cloud Services for Device on SwitchBot App</li>
213
213
  </ul>
214
214
  </li>
@@ -229,7 +229,7 @@ Without this step, then you will receive the following error when the swichbot p
229
229
  <li>Supports OpenAPI &amp; Bluetooth Low Energy (BLE) Connections</li>
230
230
  <li>If using OpenAPI:
231
231
  <ul>
232
- <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a> or <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a> Required</li>
232
+ <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a>, <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a>, or <a href="https://us.switch-bot.com/products/switchbot-hub-3">SwitchBot Hub 3</a> Required</li>
233
233
  <li>Enable Cloud Services for Device on SwitchBot App</li>
234
234
  </ul>
235
235
  </li>
@@ -240,7 +240,7 @@ Without this step, then you will receive the following error when the swichbot p
240
240
  <li>Supports OpenAPI &amp; Bluetooth Low Energy (BLE) Connections</li>
241
241
  <li>If using OpenAPI:
242
242
  <ul>
243
- <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a> or <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a> Required</li>
243
+ <li><a href="https://www.switch-bot.com/products/switchbot-hub-mini">SwitchBot Hub Mini</a>, <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a>, or <a href="https://us.switch-bot.com/products/switchbot-hub-3">SwitchBot Hub 3</a> Required</li>
244
244
  <li>Enable Cloud Services for Device on SwitchBot App</li>
245
245
  <li>You must set your Bot's Device ID for either Press Mode or Switch Mode in Plugin Config (SwitchBot Device Settings &gt; Bot Settings)
246
246
  <ul>
@@ -272,6 +272,15 @@ Without this step, then you will receive the following error when the swichbot p
272
272
  </li>
273
273
  </ul>
274
274
  </li>
275
+ <li><a href="https://us.switch-bot.com/products/switchbot-hub-3">SwitchBot Hub 3</a>
276
+ <ul>
277
+ <li>Supports OpenAPI &amp; Bluetooth Low Energy (BLE) Connections
278
+ <ul>
279
+ <li>Enables Humidity, Temperature, and Light Sensor</li>
280
+ </ul>
281
+ </li>
282
+ </ul>
283
+ </li>
275
284
  <li><a href="https://us.switch-bot.com/products/switchbot-battery-circulator-fan">SwitchBot Battery Circulator Fan</a>
276
285
  <ul>
277
286
  <li>Supports OpenAPI Connection Only</li>
@@ -283,7 +292,7 @@ Without this step, then you will receive the following error when the swichbot p
283
292
  </ul>
284
293
  </li>
285
294
  </ul>
286
- <h2 id="supported-ir-devices" class="tsd-anchor-link">Supported IR Devices<a href="#supported-ir-devices" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><h3 id="all-ir-devices-require-switchbot-hub-2-or-hub-mini" class="tsd-anchor-link"><em>(All IR Devices require <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a> or <a href="https://www.switch-bot.com/products/switchbot-hub-mini">Hub Mini</a>)</em><a href="#all-ir-devices-require-switchbot-hub-2-or-hub-mini" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><ul>
295
+ <h2 id="supported-ir-devices" class="tsd-anchor-link">Supported IR Devices<a href="#supported-ir-devices" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><h3 id="all-ir-devices-require-switchbot-hub-2-switchbot-hub-3-or-hub-mini" class="tsd-anchor-link"><em>(All IR Devices require <a href="https://us.switch-bot.com/products/switchbot-hub-2">SwitchBot Hub 2</a>, <a href="https://us.switch-bot.com/products/switchbot-hub-3">SwitchBot Hub 3</a>, or <a href="https://www.switch-bot.com/products/switchbot-hub-mini">Hub Mini</a>)</em><a href="#all-ir-devices-require-switchbot-hub-2-switchbot-hub-3-or-hub-mini" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><ul>
287
296
  <li>TV
288
297
  <ul>
289
298
  <li>Allows for On/Off and Volume Controls</li>
@@ -377,4 +386,4 @@ Without this step, then you will receive the following error when the swichbot p
377
386
  <li><a href="https://www.facebook.com/SwitchBotRobot/">Facebook @SwitchBotRobot</a></li>
378
387
  <li><a href="https://twitter.com/switchbot">Twitter @SwitchBot</a></li>
379
388
  </ul>
380
- </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#switchbothomebridge-switchbot"><span>@switchbot/homebridge-<wbr/>switchbot</span></a><ul><li><a href="#installation"><span>Installation</span></a></li><li><a href="#configuration"><span>Configuration</span></a></li><li><ul><li><a href="#if-using-openapi-connection"><span>If using <wbr/>Open<wbr/>API <wbr/>Connection</span></a></li><li><a href="#if-using-ble-connection"><span>If using <wbr/>BLE <wbr/>Connection</span></a></li></ul></li><li><a href="#troubleshooting"><span>Troubleshooting</span></a></li><li><ul><li><a href="#if-using-linux--raspberry-pi-os"><span>If using <wbr/>Linux / <wbr/>Raspberry <wbr/>Pi <wbr/>OS</span></a></li><li><a href="#if-using-macos"><span>If using <wbr/>Mac<wbr/>OS</span></a></li></ul></li><li><a href="#supported-switchbot-devices"><span>Supported <wbr/>Switch<wbr/>Bot <wbr/>Devices</span></a></li><li><a href="#supported-ir-devices"><span>Supported <wbr/>IR <wbr/>Devices</span></a></li><li><ul><li><a href="#all-ir-devices-require-switchbot-hub-2-or-hub-mini"><span>(<wbr/>All <wbr/>IR <wbr/>Devices require <wbr/>Switch<wbr/>Bot <wbr/>Hub 2 or <wbr/>Hub <wbr/>Mini)</span></a></li></ul></li><li><a href="#switchbot-apis"><span>Switch<wbr/>Bot <wbr/>AP<wbr/>Is</span></a></li><li><a href="#community"><span>Community</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">@switchbot/homebridge-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
389
+ </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#switchbothomebridge-switchbot"><span>@switchbot/homebridge-<wbr/>switchbot</span></a><ul><li><a href="#installation"><span>Installation</span></a></li><li><a href="#configuration"><span>Configuration</span></a></li><li><ul><li><a href="#if-using-openapi-connection"><span>If using <wbr/>Open<wbr/>API <wbr/>Connection</span></a></li><li><a href="#if-using-ble-connection"><span>If using <wbr/>BLE <wbr/>Connection</span></a></li></ul></li><li><a href="#troubleshooting"><span>Troubleshooting</span></a></li><li><ul><li><a href="#if-using-linux--raspberry-pi-os"><span>If using <wbr/>Linux / <wbr/>Raspberry <wbr/>Pi <wbr/>OS</span></a></li><li><a href="#if-using-macos"><span>If using <wbr/>Mac<wbr/>OS</span></a></li></ul></li><li><a href="#supported-switchbot-devices"><span>Supported <wbr/>Switch<wbr/>Bot <wbr/>Devices</span></a></li><li><a href="#supported-ir-devices"><span>Supported <wbr/>IR <wbr/>Devices</span></a></li><li><ul><li><a href="#all-ir-devices-require-switchbot-hub-2-switchbot-hub-3-or-hub-mini"><span>(<wbr/>All <wbr/>IR <wbr/>Devices require <wbr/>Switch<wbr/>Bot <wbr/>Hub 2, <wbr/>Switch<wbr/>Bot <wbr/>Hub 3, or <wbr/>Hub <wbr/>Mini)</span></a></li></ul></li><li><a href="#switchbot-apis"><span>Switch<wbr/>Bot <wbr/>AP<wbr/>Is</span></a></li><li><a href="#community"><span>Community</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">@switchbot/homebridge-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>default | @switchbot/homebridge-switchbot</title><meta name="description" content="Documentation for @switchbot/homebridge-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">@switchbot/homebridge-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">default</a></li></ul><h1>Variable default</h1></div><div class="tsd-signature"><span class="tsd-kind-variable">default</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span> <span class="tsd-signature-symbol">=&gt;</span> <span class="tsd-signature-type">void</span></div><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures"><li class="tsd-signature" id="__type"><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">api</span>: <span class="tsd-signature-type">API</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/7e3b3e0843eb31b84cba5bb94876f5beb0d0657b/src/index.ts#L11">index.ts:11</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@switchbot/homebridge-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
1
+ <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>default | @switchbot/homebridge-switchbot</title><meta name="description" content="Documentation for @switchbot/homebridge-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">@switchbot/homebridge-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">default</a></li></ul><h1>Variable default</h1></div><div class="tsd-signature"><span class="tsd-kind-variable">default</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span> <span class="tsd-signature-symbol">=&gt;</span> <span class="tsd-signature-type">void</span></div><div class="tsd-type-declaration"><h4>Type Declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures"><li class="tsd-signature" id="__type"><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">api</span>: <span class="tsd-signature-type">API</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/c586403210ae94803ca6e83cf6a0f787d3e16315/src/index.ts#L12">index.ts:12</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@switchbot/homebridge-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@switchbot/homebridge-switchbot",
3
3
  "displayName": "SwitchBot",
4
4
  "type": "module",
5
- "version": "4.3.2-beta.9",
5
+ "version": "5.0.0-beta.0",
6
6
  "description": "The SwitchBot plugin allows you to access your SwitchBot device(s) from HomeKit.",
7
7
  "author": "SwitchBot <support@wondertechlabs.com> (https://github.com/SwitchBot)",
8
8
  "contributors": [
@@ -55,7 +55,7 @@
55
55
  "icon": "https://raw.githubusercontent.com/OpenWonderLabs/homebridge-switchbot/latest/branding/icon.png",
56
56
  "engineStrict": true,
57
57
  "engines": {
58
- "homebridge": "^1.9.0 || ^2.0.0 || ^2.0.0-beta.23 || ^2.0.0-alpha.37",
58
+ "homebridge": "^2.0.0-beta.38",
59
59
  "node": "^20 || ^22 || ^24"
60
60
  },
61
61
  "scripts": {
@@ -81,8 +81,8 @@
81
81
  "@homebridge/plugin-ui-utils": "^2.1.0",
82
82
  "async-mqtt": "^2.6.3",
83
83
  "fakegato-history": "^0.6.7",
84
- "homebridge-lib": "^7.1.6",
85
- "node-switchbot": "^3.6.0-beta.7",
84
+ "homebridge-lib": "^7.1.7",
85
+ "node-switchbot": "^3.6.0",
86
86
  "rxjs": "^7.8.2"
87
87
  },
88
88
  "devDependencies": {
@@ -91,19 +91,19 @@
91
91
  "@types/debug": "^4.1.12",
92
92
  "@types/fs-extra": "^11.0.4",
93
93
  "@types/mdast": "^4.0.4",
94
- "@types/node": "^24.2.1",
94
+ "@types/node": "^24.3.0",
95
95
  "@types/semver": "^7.7.0",
96
96
  "@types/source-map-support": "^0.5.10",
97
97
  "@vitest/coverage-v8": "^3.2.4",
98
98
  "eslint": "^9.33.0",
99
99
  "eslint-plugin-format": "^1.0.1",
100
100
  "eslint-plugin-import": "^2.32.0",
101
- "homebridge": "^1.11.0",
101
+ "homebridge": "^2.0.0-beta.38",
102
102
  "homebridge-config-ui-x": "5.4.1",
103
103
  "nodemon": "^3.1.10",
104
104
  "shx": "^0.4.0",
105
105
  "ts-node": "^10.9.2",
106
- "typedoc": "^0.28.10",
106
+ "typedoc": "^0.28.11",
107
107
  "typescript": "^5.9.2",
108
108
  "vitest": "^3.2.4"
109
109
  },
@@ -5,7 +5,7 @@
5
5
  import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge'
6
6
  import type { airPurifierServiceData, airPurifierStatus, airPurifierTableServiceData, airPurifierTableStatus, airPurifierTableWebhookContext, airPurifierWebhookContext, bodyChange, device, SwitchBotBLE, SwitchbotDevice } from 'node-switchbot'
7
7
 
8
- import type { SwitchBotPlatform } from '../platform.js'
8
+ import type { SwitchBotHAPPlatform } from '../platform-hap.js'
9
9
  import type { devicesConfig } from '../settings.js'
10
10
 
11
11
  /*
@@ -44,7 +44,7 @@ export class AirPurifier extends deviceBase {
44
44
  doAirPurifierUpdate!: Subject<void>
45
45
 
46
46
  constructor(
47
- readonly platform: SwitchBotPlatform,
47
+ readonly platform: SwitchBotHAPPlatform,
48
48
  accessory: PlatformAccessory,
49
49
  device: device & devicesConfig,
50
50
  ) {
@@ -5,7 +5,7 @@
5
5
  import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge'
6
6
  import type { blindTiltServiceData, blindTiltStatus, blindTiltWebhookContext, bodyChange, device, SwitchBotBLE, SwitchbotDevice, WoBlindTilt } from 'node-switchbot'
7
7
 
8
- import type { SwitchBotPlatform } from '../platform.js'
8
+ import type { SwitchBotHAPPlatform } from '../platform-hap.js'
9
9
  import type { blindTiltConfig, devicesConfig } from '../settings.js'
10
10
 
11
11
  /*
@@ -76,7 +76,7 @@ export class BlindTilt extends deviceBase {
76
76
  doBlindTiltUpdate: Subject<void>
77
77
 
78
78
  constructor(
79
- readonly platform: SwitchBotPlatform,
79
+ readonly platform: SwitchBotHAPPlatform,
80
80
  accessory: PlatformAccessory,
81
81
  device: device & devicesConfig,
82
82
  ) {
@@ -589,7 +589,11 @@ export class BlindTilt extends deviceBase {
589
589
  return await this.retryBLE({
590
590
  max: this.maxRetryBLE(),
591
591
  fn: async () => {
592
- return await deviceList[0].runToPos(100 - Number(this.WindowCovering.TargetPosition), setPositionMode)
592
+ if (deviceList && Array.isArray(deviceList) && deviceList.length > 0) {
593
+ return await deviceList[0].runToPos(100 - Number(this.WindowCovering.TargetPosition), setPositionMode)
594
+ } else {
595
+ throw new Error('No device found')
596
+ }
593
597
  },
594
598
  })
595
599
  })
@@ -5,7 +5,7 @@
5
5
  import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge'
6
6
  import type { bodyChange, botServiceData, botStatus, botWebhookContext, device, SwitchBotBLE, SwitchbotDevice, WoHand } from 'node-switchbot'
7
7
 
8
- import type { SwitchBotPlatform } from '../platform.js'
8
+ import type { SwitchBotHAPPlatform } from '../platform-hap.js'
9
9
  import type { botConfig, devicesConfig } from '../settings.js'
10
10
 
11
11
  /*
@@ -118,7 +118,7 @@ export class Bot extends deviceBase {
118
118
  * @constructor
119
119
  */
120
120
  constructor(
121
- readonly platform: SwitchBotPlatform,
121
+ readonly platform: SwitchBotHAPPlatform,
122
122
  accessory: PlatformAccessory,
123
123
  device: device & devicesConfig,
124
124
  ) {
@@ -5,7 +5,7 @@
5
5
  import type { CharacteristicValue, Controller, ControllerConstructor, ControllerServiceMap, PlatformAccessory, Service } from 'homebridge'
6
6
  import type { bodyChange, ceilingLightProServiceData, ceilingLightProStatus, ceilingLightProWebhookContext, ceilingLightServiceData, ceilingLightStatus, ceilingLightWebhookContext, device, SwitchBotBLE, SwitchbotDevice, WoCeilingLight } from 'node-switchbot'
7
7
 
8
- import type { SwitchBotPlatform } from '../platform.js'
8
+ import type { SwitchBotHAPPlatform } from '../platform-hap.js'
9
9
  import type { ceilingLightConfig, devicesConfig } from '../settings.js'
10
10
 
11
11
  /*
@@ -54,7 +54,7 @@ export class CeilingLight extends deviceBase {
54
54
  doCeilingLightUpdate!: Subject<void>
55
55
 
56
56
  constructor(
57
- readonly platform: SwitchBotPlatform,
57
+ readonly platform: SwitchBotHAPPlatform,
58
58
  accessory: PlatformAccessory,
59
59
  device: device & devicesConfig,
60
60
  ) {
@@ -5,7 +5,7 @@
5
5
  import type { CharacteristicValue, Controller, ControllerConstructor, ControllerServiceMap, PlatformAccessory, Service } from 'homebridge'
6
6
  import type { bodyChange, colorBulbServiceData, colorBulbStatus, colorBulbWebhookContext, device, SwitchBotBLE, SwitchbotDevice, WoBulb } from 'node-switchbot'
7
7
 
8
- import type { SwitchBotPlatform } from '../platform.js'
8
+ import type { SwitchBotHAPPlatform } from '../platform-hap.js'
9
9
  import type { colorBulbConfig, devicesConfig } from '../settings.js'
10
10
 
11
11
  /*
@@ -54,7 +54,7 @@ export class ColorBulb extends deviceBase {
54
54
  doColorBulbUpdate!: Subject<void>
55
55
 
56
56
  constructor(
57
- readonly platform: SwitchBotPlatform,
57
+ readonly platform: SwitchBotHAPPlatform,
58
58
  accessory: PlatformAccessory,
59
59
  device: device & devicesConfig,
60
60
  ) {
@@ -5,7 +5,7 @@
5
5
  import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge'
6
6
  import type { contactSensorServiceData, contactSensorStatus, contactSensorWebhookContext, device, SwitchBotBLE } from 'node-switchbot'
7
7
 
8
- import type { SwitchBotPlatform } from '../platform.js'
8
+ import type { SwitchBotHAPPlatform } from '../platform-hap.js'
9
9
  import type { contactConfig, devicesConfig } from '../settings.js'
10
10
 
11
11
  /*
@@ -64,7 +64,7 @@ export class Contact extends deviceBase {
64
64
  doContactUpdate!: Subject<void>
65
65
 
66
66
  constructor(
67
- readonly platform: SwitchBotPlatform,
67
+ readonly platform: SwitchBotHAPPlatform,
68
68
  accessory: PlatformAccessory,
69
69
  device: device & devicesConfig,
70
70
  ) {
@@ -5,7 +5,7 @@
5
5
  import type { CharacteristicChange, CharacteristicValue, PlatformAccessory, Service } from 'homebridge'
6
6
  import type { bodyChange, curtain3ServiceData, curtain3WebhookContext, curtainServiceData, curtainStatus, curtainWebhookContext, device, SwitchBotBLE, SwitchbotDevice, WoCurtain } from 'node-switchbot'
7
7
 
8
- import type { SwitchBotPlatform } from '../platform.js'
8
+ import type { SwitchBotHAPPlatform } from '../platform-hap.js'
9
9
  import type { curtainConfig, devicesConfig } from '../settings.js'
10
10
 
11
11
  import { hostname } from 'node:os'
@@ -77,7 +77,7 @@ export class Curtain extends deviceBase {
77
77
  doCurtainUpdate!: Subject<void>
78
78
 
79
79
  constructor(
80
- readonly platform: SwitchBotPlatform,
80
+ readonly platform: SwitchBotHAPPlatform,
81
81
  accessory: PlatformAccessory,
82
82
  device: device & devicesConfig,
83
83
  ) {
@@ -378,9 +378,11 @@ export class Curtain extends deviceBase {
378
378
  this.debugLog('BLEparseStatus')
379
379
  this.debugLog(`(position, battery) = BLE:(${this.serviceData.position}, ${this.serviceData.battery}), current:(${this.WindowCovering.CurrentPosition}, ${this.Battery.BatteryLevel})`)
380
380
  // CurrentPosition
381
- if ('position' in this.serviceData) {
382
- this.WindowCovering.CurrentPosition = 100 - this.serviceData.position
381
+ if ('position' in this.serviceData && this.serviceData.position !== undefined && this.serviceData.position !== null && !Number.isNaN(Number(this.serviceData.position))) {
382
+ this.WindowCovering.CurrentPosition = 100 - Number(this.serviceData.position)
383
383
  await this.getCurrentPostion()
384
+ } else {
385
+ this.warnLog(`Invalid position data from BLE: ${this.serviceData.position}`)
384
386
  }
385
387
  // CurrentAmbientLightLevel
386
388
  if (!(this.device as curtainConfig).hide_lightsensor && this.LightSensor?.Service && 'lightLevel' in this.serviceData) {
@@ -489,10 +491,10 @@ export class Curtain extends deviceBase {
489
491
  // Start to monitor advertisement packets
490
492
  const serviceData = await this.monitorAdvertisementPackets(switchBotBLE) as curtainServiceData | curtain3ServiceData
491
493
  // Update HomeKit
492
- if ((serviceData.model === SwitchBotBLEModel.Curtain || SwitchBotBLEModel.Curtain3)
493
- && (serviceData.modelName === SwitchBotBLEModelName.Curtain || SwitchBotBLEModelName.Curtain3)) {
494
+ if ((serviceData.model === SwitchBotBLEModel.Curtain || serviceData.model === SwitchBotBLEModel.Curtain3)
495
+ && (serviceData.modelName === SwitchBotBLEModelName.Curtain || serviceData.modelName === SwitchBotBLEModelName.Curtain3)) {
494
496
  this.serviceData = serviceData
495
- if (serviceData !== undefined || serviceData !== null) {
497
+ if (serviceData !== undefined && serviceData !== null) {
496
498
  await this.BLEparseStatus()
497
499
  await this.updateHomeKitCharacteristics()
498
500
  } else {
@@ -559,7 +561,7 @@ export class Curtain extends deviceBase {
559
561
  this.platform.bleEventHandler[this.device.bleMac] = async (context: curtainServiceData | curtain3ServiceData) => {
560
562
  try {
561
563
  this.serviceData = context
562
- if (context !== undefined || context !== null) {
564
+ if (context !== undefined && context !== null) {
563
565
  this.debugLog(`received BLE: ${JSON.stringify(context)}`)
564
566
  await this.BLEparseStatus()
565
567
  await this.updateHomeKitCharacteristics()
@@ -619,7 +621,11 @@ export class Curtain extends deviceBase {
619
621
  return await this.retryBLE({
620
622
  max: this.maxRetryBLE(),
621
623
  fn: async () => {
622
- return await deviceList[0].runToPos(100 - Number(this.WindowCovering.TargetPosition), adjustedMode)
624
+ if (deviceList && Array.isArray(deviceList) && deviceList.length > 0) {
625
+ return await deviceList[0].runToPos(100 - Number(this.WindowCovering.TargetPosition), adjustedMode)
626
+ } else {
627
+ throw new Error('No device found')
628
+ }
623
629
  },
624
630
  })
625
631
  })
@@ -777,6 +783,17 @@ export class Curtain extends deviceBase {
777
783
 
778
784
  async updateHomeKitCharacteristics(): Promise<void> {
779
785
  await this.setMinMax()
786
+
787
+ // Validate position values to prevent NaN
788
+ if (Number.isNaN(Number(this.WindowCovering.CurrentPosition))) {
789
+ this.warnLog(`CurrentPosition is NaN, keeping previous value`)
790
+ this.WindowCovering.CurrentPosition = this.accessory.context.CurrentPosition ?? 100
791
+ }
792
+ if (Number.isNaN(Number(this.WindowCovering.TargetPosition))) {
793
+ this.warnLog(`TargetPosition is NaN, keeping previous value`)
794
+ this.WindowCovering.TargetPosition = this.accessory.context.TargetPosition ?? 100
795
+ }
796
+
780
797
  // CurrentPosition
781
798
  await this.updateCharacteristic(this.WindowCovering.Service, this.hap.Characteristic.CurrentPosition, this.WindowCovering.CurrentPosition, 'CurrentPosition')
782
799
  // PositionState
@@ -799,17 +816,22 @@ export class Curtain extends deviceBase {
799
816
  }
800
817
 
801
818
  async BLEPushConnection() {
819
+ this.warnLog('BLE connection failed for push operation')
802
820
  if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
803
821
  this.warnLog('Using OpenAPI Connection to Push Changes')
804
822
  await this.openAPIpushChanges()
823
+ } else {
824
+ this.errorLog('No fallback available for BLE push failure. Consider using BLE/OpenAPI connection type.')
805
825
  }
806
826
  }
807
827
 
808
828
  async BLERefreshConnection(switchbot: SwitchBotBLE): Promise<void> {
809
- this.errorLog(`wasn't able to establish BLE Connection, node-switchbot: ${switchbot}`)
829
+ this.warnLog(`BLE connection failed for refresh operation, node-switchbot: ${switchbot}`)
810
830
  if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
811
831
  this.warnLog('Using OpenAPI Connection to Refresh Status')
812
832
  await this.openAPIRefreshStatus()
833
+ } else {
834
+ this.errorLog('No fallback available for BLE refresh failure. Consider using BLE/OpenAPI connection type.')
813
835
  }
814
836
  }
815
837
 
@@ -7,7 +7,7 @@ import type { API, CharacteristicValue, HAP, Logging, PlatformAccessory, Service
7
7
  import type { MqttClient } from 'mqtt'
8
8
  import type { ad, bodyChange, device, deviceStatus, deviceStatusRequest, pushResponse, SwitchBotBLE } from 'node-switchbot'
9
9
 
10
- import type { SwitchBotPlatform } from '../platform.js'
10
+ import type { SwitchBotHAPPlatform } from '../platform-hap.js'
11
11
  import type { blindTiltConfig, botConfig, ceilingLightConfig, colorBulbConfig, contactConfig, curtainConfig, devicesConfig, hubConfig, humidifierConfig, indoorOutdoorSensorConfig, lockConfig, meterConfig, motionConfig, plugConfig, relaySwitch1Config, relaySwitch1PMConfig, stripLightConfig, SwitchBotPlatformConfig, waterDetectorConfig } from '../settings.js'
12
12
 
13
13
  import { hostname } from 'node:os'
@@ -53,7 +53,7 @@ export abstract class deviceBase {
53
53
  protected mqttClient: MqttClient | null = null
54
54
 
55
55
  constructor(
56
- protected readonly platform: SwitchBotPlatform,
56
+ protected readonly platform: SwitchBotHAPPlatform,
57
57
  protected accessory: PlatformAccessory,
58
58
  protected device: device & devicesConfig,
59
59
  ) {
@@ -318,7 +318,7 @@ export abstract class deviceBase {
318
318
  try {
319
319
  await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac })
320
320
  } catch (e: any) {
321
- this.errorLog(`Failed to start BLE scanning. Error:${e.message ?? e}`)
321
+ this.errorLog(`Failed to start BLE scanning. Error: ${e.message ?? e}`)
322
322
  }
323
323
  // Set an event handler
324
324
  let serviceData = { model: this.device.bleModel, modelName: this.device.bleModelName } as ad['serviceData']
@@ -337,7 +337,7 @@ export abstract class deviceBase {
337
337
  try {
338
338
  await switchbot.stopScan()
339
339
  } catch (e: any) {
340
- this.errorLog(`Failed to stop BLE scanning. Error:${e.message ?? e}`)
340
+ this.errorLog(`Failed to stop BLE scanning. Error: ${e.message ?? e}`)
341
341
  }
342
342
  return serviceData
343
343
  }
@@ -350,7 +350,7 @@ export abstract class deviceBase {
350
350
  try {
351
351
  await switchbot.startScan({ model: this.device.bleModel })
352
352
  } catch (e: any) {
353
- this.errorLog(`Failed to start BLE scanning. Error:${e.message ?? e}`)
353
+ this.errorLog(`Failed to start BLE scanning. Error: ${e.message ?? e}`)
354
354
  }
355
355
  // Set an event handler
356
356
  switchbot.onadvertisement = (ad: ad) => {
@@ -361,7 +361,7 @@ export abstract class deviceBase {
361
361
  try {
362
362
  switchbot.stopScan()
363
363
  } catch (e: any) {
364
- this.errorLog(`Failed to stop BLE scanning. Error:${e.message ?? e}`)
364
+ this.errorLog(`Failed to stop BLE scanning. Error: ${e.message ?? e}`)
365
365
  }
366
366
  })()
367
367
  }
@@ -446,6 +446,12 @@ export abstract class deviceBase {
446
446
  bleModelName: SwitchBotBLEModelName.Hub2,
447
447
  bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Hub2,
448
448
  },
449
+ 'Hub 3': {
450
+ model: SwitchBotModel.Hub3,
451
+ bleModel: SwitchBotBLEModel.Hub3,
452
+ bleModelName: SwitchBotBLEModelName.Hub3,
453
+ bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Hub3,
454
+ },
449
455
  'Bot': {
450
456
  model: SwitchBotModel.Bot,
451
457
  bleModel: SwitchBotBLEModel.Bot,
@@ -5,7 +5,7 @@
5
5
  import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge'
6
6
  import type { batteryCirculatorFanServiceData, batteryCirculatorFanStatus, batteryCirculatorFanWebhookContext, bodyChange, device, SwitchBotBLE, SwitchbotDevice } from 'node-switchbot'
7
7
 
8
- import type { SwitchBotPlatform } from '../platform.js'
8
+ import type { SwitchBotHAPPlatform } from '../platform-hap.js'
9
9
  import type { devicesConfig } from '../settings.js'
10
10
 
11
11
  /*
@@ -57,7 +57,7 @@ export class Fan extends deviceBase {
57
57
  doFanUpdate!: Subject<void>
58
58
 
59
59
  constructor(
60
- readonly platform: SwitchBotPlatform,
60
+ readonly platform: SwitchBotHAPPlatform,
61
61
  accessory: PlatformAccessory,
62
62
  device: device & devicesConfig,
63
63
  ) {
@@ -3,9 +3,9 @@
3
3
  * hub.ts: @switchbot/homebridge-switchbot.
4
4
  */
5
5
  import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge'
6
- import type { device, hub2ServiceData, hub2Status, hub2WebhookContext, SwitchBotBLE } from 'node-switchbot'
6
+ import type { device, hub2ServiceData, hub2Status, hub2WebhookContext, hub3ServiceData, SwitchBotBLE } from 'node-switchbot'
7
7
 
8
- import type { SwitchBotPlatform } from '../platform.js'
8
+ import type { SwitchBotHAPPlatform } from '../platform-hap.js'
9
9
  import type { devicesConfig, hubConfig } from '../settings.js'
10
10
 
11
11
  import { Units } from 'homebridge'
@@ -46,14 +46,14 @@ export class Hub extends deviceBase {
46
46
  webhookContext!: hub2WebhookContext
47
47
 
48
48
  // BLE
49
- serviceData!: hub2ServiceData
49
+ serviceData!: hub2ServiceData | hub3ServiceData
50
50
 
51
51
  // Updates
52
52
  hubUpdateInProgress!: boolean
53
53
  doHubUpdate!: Subject<void>
54
54
 
55
55
  constructor(
56
- readonly platform: SwitchBotPlatform,
56
+ readonly platform: SwitchBotHAPPlatform,
57
57
  accessory: PlatformAccessory,
58
58
  device: device & devicesConfig,
59
59
  ) {
@@ -292,9 +292,10 @@ export class Hub extends deviceBase {
292
292
  // Start to monitor advertisement packets
293
293
  (async () => {
294
294
  // Start to monitor advertisement packets
295
- const serviceData = await this.monitorAdvertisementPackets(switchBotBLE) as hub2ServiceData
295
+ const serviceData = await this.monitorAdvertisementPackets(switchBotBLE) as hub2ServiceData | hub3ServiceData
296
296
  // Update HomeKit
297
- if (serviceData.model === SwitchBotBLEModel.Hub2 && serviceData.modelName === SwitchBotBLEModelName.Hub2) {
297
+ if ((serviceData.model === SwitchBotBLEModel.Hub2 && serviceData.modelName === SwitchBotBLEModelName.Hub2)
298
+ || (serviceData.model === SwitchBotBLEModel.Hub3 && serviceData.modelName === SwitchBotBLEModelName.Hub3)) {
298
299
  this.serviceData = serviceData
299
300
  if (serviceData !== undefined || serviceData !== null) {
300
301
  await this.BLEparseStatus()
@@ -5,7 +5,7 @@
5
5
  import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge'
6
6
  import type { bodyChange, device, humidifier2ServiceData, humidifier2Status, humidifier2WebhookContext, humidifierServiceData, humidifierStatus, humidifierWebhookContext, SwitchBotBLE, SwitchbotDevice, WoHumi } from 'node-switchbot'
7
7
 
8
- import type { SwitchBotPlatform } from '../platform.js'
8
+ import type { SwitchBotHAPPlatform } from '../platform-hap.js'
9
9
  import type { devicesConfig, humidifierConfig } from '../settings.js'
10
10
 
11
11
  /*
@@ -56,7 +56,7 @@ export class Humidifier extends deviceBase {
56
56
  doHumidifierUpdate!: Subject<void>
57
57
 
58
58
  constructor(
59
- readonly platform: SwitchBotPlatform,
59
+ readonly platform: SwitchBotHAPPlatform,
60
60
  accessory: PlatformAccessory,
61
61
  device: device & devicesConfig,
62
62
  ) {