@switchbot/homebridge-switchbot 5.0.0-beta.70 → 5.0.0-beta.72

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 (534) hide show
  1. package/.github/ISSUE_TEMPLATE/e2e-verification.md +36 -0
  2. package/.github/workflows/ci.yml +61 -0
  3. package/.github/workflows/manual-e2e.yml +103 -0
  4. package/CHANGELOG.md +20 -0
  5. package/E2E-VERIFICATION.md +121 -0
  6. package/MIGRATION.md +44 -0
  7. package/README.md +11 -0
  8. package/config.schema.json +99 -1940
  9. package/dist/deviceFactory.d.ts +13 -0
  10. package/dist/deviceFactory.d.ts.map +1 -0
  11. package/dist/deviceFactory.js +81 -0
  12. package/dist/deviceFactory.js.map +1 -0
  13. package/dist/devices/deviceBase.d.ts +50 -0
  14. package/dist/devices/deviceBase.d.ts.map +1 -0
  15. package/dist/devices/deviceBase.js +119 -0
  16. package/dist/devices/deviceBase.js.map +1 -0
  17. package/dist/devices/genericDevice.d.ts +283 -0
  18. package/dist/devices/genericDevice.d.ts.map +1 -0
  19. package/dist/devices/genericDevice.js +1035 -0
  20. package/dist/devices/genericDevice.js.map +1 -0
  21. package/dist/homebridge-ui/public/index.html +72 -440
  22. package/dist/homebridge-ui/server.d.ts +3 -1
  23. package/dist/homebridge-ui/server.d.ts.map +1 -1
  24. package/dist/homebridge-ui/server.js +47 -10
  25. package/dist/homebridge-ui/server.js.map +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1 -3
  28. package/dist/index.js.map +1 -1
  29. package/dist/platform.d.ts +27 -0
  30. package/dist/platform.d.ts.map +1 -0
  31. package/dist/platform.js +404 -0
  32. package/dist/platform.js.map +1 -0
  33. package/dist/settings.d.ts +10 -317
  34. package/dist/settings.d.ts.map +1 -1
  35. package/dist/settings.js +5 -30
  36. package/dist/settings.js.map +1 -1
  37. package/dist/switchbotClient.d.ts +32 -0
  38. package/dist/switchbotClient.d.ts.map +1 -0
  39. package/dist/switchbotClient.js +259 -0
  40. package/dist/switchbotClient.js.map +1 -0
  41. package/dist/utils.d.ts +36 -248
  42. package/dist/utils.d.ts.map +1 -1
  43. package/dist/utils.js +38 -1367
  44. package/dist/utils.js.map +1 -1
  45. package/docs/assets/icons.js +1 -1
  46. package/docs/assets/icons.svg +1 -1
  47. package/docs/assets/style.css +3 -3
  48. package/docs/index.html +50 -15
  49. package/docs/variables/default.html +1 -1
  50. package/package.json +19 -18
  51. package/scripts/e2e/README.md +25 -0
  52. package/scripts/e2e/curtain-e2e.sh +70 -0
  53. package/scripts/e2e/fan-e2e.sh +75 -0
  54. package/scripts/e2e/light-advanced-e2e.sh +97 -0
  55. package/scripts/e2e/light-e2e.sh +75 -0
  56. package/scripts/e2e/list-accessories.sh +19 -0
  57. package/scripts/e2e/lock-e2e.sh +65 -0
  58. package/scripts/generate-matter-maps.js +60 -0
  59. package/scripts/run-e2e-local.sh +14 -0
  60. package/src/deviceFactory.ts +122 -0
  61. package/src/devices/deviceBase.ts +141 -0
  62. package/src/devices/genericDevice.ts +965 -0
  63. package/src/homebridge-ui/public/index.html +72 -440
  64. package/src/homebridge-ui/server.ts +52 -10
  65. package/src/index.ts +1 -3
  66. package/src/platform.ts +395 -0
  67. package/src/settings.ts +12 -352
  68. package/src/switchbotClient.ts +266 -0
  69. package/src/utils.ts +47 -1456
  70. package/test/accessory-restore.spec.ts +73 -0
  71. package/test/device-mapping.spec.ts +37 -0
  72. package/test/deviceFactory.spec.ts +18 -0
  73. package/test/e2e/run-e2e.spec.ts +50 -0
  74. package/test/fan-swing.spec.ts +29 -0
  75. package/test/helpers/matter-harness.ts +53 -0
  76. package/test/lock-users.spec.ts +44 -0
  77. package/test/matter-childbridge.spec.ts +55 -0
  78. package/test/matter-descriptors.spec.ts +97 -0
  79. package/test/matter-device-state.spec.ts +101 -0
  80. package/test/matter-integration.spec.ts +70 -0
  81. package/test/platform.integration.spec.ts +55 -0
  82. package/test/switchbot-client-debounce.spec.ts +131 -0
  83. package/test/switchbot-client-openapi.spec.ts +56 -0
  84. package/test/switchbotClient.spec.ts +10 -0
  85. package/test/utils.spec.ts +20 -0
  86. package/vitest.config.ts +7 -0
  87. package/coverage/base.css +0 -224
  88. package/coverage/block-navigation.js +0 -87
  89. package/coverage/clover.xml +0 -15847
  90. package/coverage/coverage-final.json +0 -42
  91. package/coverage/docs/assets/dmt/dmt-component-data.js.html +0 -85
  92. package/coverage/docs/assets/dmt/dmt-components.js.html +0 -286
  93. package/coverage/docs/assets/dmt/index.html +0 -131
  94. package/coverage/docs/assets/hierarchy.js.html +0 -85
  95. package/coverage/docs/assets/icons.js.html +0 -136
  96. package/coverage/docs/assets/index.html +0 -146
  97. package/coverage/docs/assets/main.js.html +0 -265
  98. package/coverage/favicon.png +0 -0
  99. package/coverage/index.html +0 -191
  100. package/coverage/prettify.css +0 -1
  101. package/coverage/prettify.js +0 -2
  102. package/coverage/sort-arrow-sprite.png +0 -0
  103. package/coverage/sorter.js +0 -196
  104. package/coverage/src/device/blindtilt.ts.html +0 -3238
  105. package/coverage/src/device/bot.ts.html +0 -2803
  106. package/coverage/src/device/ceilinglight.ts.html +0 -2338
  107. package/coverage/src/device/colorbulb.ts.html +0 -2824
  108. package/coverage/src/device/contact.ts.html +0 -1465
  109. package/coverage/src/device/curtain.ts.html +0 -2869
  110. package/coverage/src/device/device.ts.html +0 -2500
  111. package/coverage/src/device/fan.ts.html +0 -2242
  112. package/coverage/src/device/hub.ts.html +0 -1408
  113. package/coverage/src/device/humidifier.ts.html +0 -2116
  114. package/coverage/src/device/index.html +0 -416
  115. package/coverage/src/device/iosensor.ts.html +0 -1375
  116. package/coverage/src/device/lightstrip.ts.html +0 -2617
  117. package/coverage/src/device/lock.ts.html +0 -1963
  118. package/coverage/src/device/meter.ts.html +0 -1372
  119. package/coverage/src/device/meterplus.ts.html +0 -1384
  120. package/coverage/src/device/meterpro.ts.html +0 -1618
  121. package/coverage/src/device/motion.ts.html +0 -1264
  122. package/coverage/src/device/plug.ts.html +0 -1372
  123. package/coverage/src/device/relayswitch.ts.html +0 -2284
  124. package/coverage/src/device/robotvacuumcleaner.ts.html +0 -1810
  125. package/coverage/src/device/waterdetector.ts.html +0 -1294
  126. package/coverage/src/homebridge-ui/index.html +0 -116
  127. package/coverage/src/homebridge-ui/server.ts.html +0 -229
  128. package/coverage/src/index.html +0 -161
  129. package/coverage/src/index.ts.html +0 -124
  130. package/coverage/src/irdevice/airconditioner.ts.html +0 -1687
  131. package/coverage/src/irdevice/airpurifier.ts.html +0 -844
  132. package/coverage/src/irdevice/camera.ts.html +0 -475
  133. package/coverage/src/irdevice/fan.ts.html +0 -766
  134. package/coverage/src/irdevice/index.html +0 -251
  135. package/coverage/src/irdevice/irdevice.ts.html +0 -1117
  136. package/coverage/src/irdevice/light.ts.html +0 -826
  137. package/coverage/src/irdevice/other.ts.html +0 -2458
  138. package/coverage/src/irdevice/tv.ts.html +0 -1222
  139. package/coverage/src/irdevice/vacuumcleaner.ts.html +0 -466
  140. package/coverage/src/irdevice/waterheater.ts.html +0 -469
  141. package/coverage/src/platform.ts.html +0 -8776
  142. package/coverage/src/settings.ts.html +0 -934
  143. package/coverage/src/utils.ts.html +0 -2092
  144. package/dist/devices-hap/airpurifier.d.ts +0 -54
  145. package/dist/devices-hap/airpurifier.d.ts.map +0 -1
  146. package/dist/devices-hap/airpurifier.js +0 -533
  147. package/dist/devices-hap/airpurifier.js.map +0 -1
  148. package/dist/devices-hap/blindtilt.d.ts +0 -90
  149. package/dist/devices-hap/blindtilt.d.ts.map +0 -1
  150. package/dist/devices-hap/blindtilt.js +0 -974
  151. package/dist/devices-hap/blindtilt.js.map +0 -1
  152. package/dist/devices-hap/bot.d.ts +0 -102
  153. package/dist/devices-hap/bot.d.ts.map +0 -1
  154. package/dist/devices-hap/bot.js +0 -822
  155. package/dist/devices-hap/bot.js.map +0 -1
  156. package/dist/devices-hap/ceilinglight.d.ts +0 -85
  157. package/dist/devices-hap/ceilinglight.d.ts.map +0 -1
  158. package/dist/devices-hap/ceilinglight.js +0 -707
  159. package/dist/devices-hap/ceilinglight.js.map +0 -1
  160. package/dist/devices-hap/colorbulb.d.ts +0 -88
  161. package/dist/devices-hap/colorbulb.d.ts.map +0 -1
  162. package/dist/devices-hap/colorbulb.js +0 -921
  163. package/dist/devices-hap/colorbulb.js.map +0 -1
  164. package/dist/devices-hap/contact.d.ts +0 -44
  165. package/dist/devices-hap/contact.d.ts.map +0 -1
  166. package/dist/devices-hap/contact.js +0 -409
  167. package/dist/devices-hap/contact.js.map +0 -1
  168. package/dist/devices-hap/curtain.d.ts +0 -73
  169. package/dist/devices-hap/curtain.d.ts.map +0 -1
  170. package/dist/devices-hap/curtain.js +0 -869
  171. package/dist/devices-hap/curtain.js.map +0 -1
  172. package/dist/devices-hap/device.d.ts +0 -108
  173. package/dist/devices-hap/device.d.ts.map +0 -1
  174. package/dist/devices-hap/device.js +0 -821
  175. package/dist/devices-hap/device.js.map +0 -1
  176. package/dist/devices-hap/fan.d.ts +0 -69
  177. package/dist/devices-hap/fan.d.ts.map +0 -1
  178. package/dist/devices-hap/fan.js +0 -655
  179. package/dist/devices-hap/fan.js.map +0 -1
  180. package/dist/devices-hap/hub.d.ts +0 -37
  181. package/dist/devices-hap/hub.d.ts.map +0 -1
  182. package/dist/devices-hap/hub.js +0 -393
  183. package/dist/devices-hap/hub.js.map +0 -1
  184. package/dist/devices-hap/humidifier.d.ts +0 -73
  185. package/dist/devices-hap/humidifier.d.ts.map +0 -1
  186. package/dist/devices-hap/humidifier.js +0 -716
  187. package/dist/devices-hap/humidifier.js.map +0 -1
  188. package/dist/devices-hap/iosensor.d.ts +0 -42
  189. package/dist/devices-hap/iosensor.d.ts.map +0 -1
  190. package/dist/devices-hap/iosensor.js +0 -397
  191. package/dist/devices-hap/iosensor.js.map +0 -1
  192. package/dist/devices-hap/lightstrip.d.ts +0 -79
  193. package/dist/devices-hap/lightstrip.d.ts.map +0 -1
  194. package/dist/devices-hap/lightstrip.js +0 -827
  195. package/dist/devices-hap/lightstrip.js.map +0 -1
  196. package/dist/devices-hap/lock.d.ts +0 -53
  197. package/dist/devices-hap/lock.d.ts.map +0 -1
  198. package/dist/devices-hap/lock.js +0 -569
  199. package/dist/devices-hap/lock.js.map +0 -1
  200. package/dist/devices-hap/meter.d.ts +0 -37
  201. package/dist/devices-hap/meter.d.ts.map +0 -1
  202. package/dist/devices-hap/meter.js +0 -380
  203. package/dist/devices-hap/meter.js.map +0 -1
  204. package/dist/devices-hap/meterplus.d.ts +0 -42
  205. package/dist/devices-hap/meterplus.d.ts.map +0 -1
  206. package/dist/devices-hap/meterplus.js +0 -385
  207. package/dist/devices-hap/meterplus.js.map +0 -1
  208. package/dist/devices-hap/meterpro.d.ts +0 -43
  209. package/dist/devices-hap/meterpro.d.ts.map +0 -1
  210. package/dist/devices-hap/meterpro.js +0 -469
  211. package/dist/devices-hap/meterpro.js.map +0 -1
  212. package/dist/devices-hap/motion.d.ts +0 -42
  213. package/dist/devices-hap/motion.d.ts.map +0 -1
  214. package/dist/devices-hap/motion.js +0 -345
  215. package/dist/devices-hap/motion.js.map +0 -1
  216. package/dist/devices-hap/plug.d.ts +0 -49
  217. package/dist/devices-hap/plug.d.ts.map +0 -1
  218. package/dist/devices-hap/plug.js +0 -400
  219. package/dist/devices-hap/plug.js.map +0 -1
  220. package/dist/devices-hap/relayswitch.d.ts +0 -96
  221. package/dist/devices-hap/relayswitch.d.ts.map +0 -1
  222. package/dist/devices-hap/relayswitch.js +0 -642
  223. package/dist/devices-hap/relayswitch.js.map +0 -1
  224. package/dist/devices-hap/robotvacuumcleaner.d.ts +0 -54
  225. package/dist/devices-hap/robotvacuumcleaner.d.ts.map +0 -1
  226. package/dist/devices-hap/robotvacuumcleaner.js +0 -530
  227. package/dist/devices-hap/robotvacuumcleaner.js.map +0 -1
  228. package/dist/devices-hap/waterdetector.d.ts +0 -41
  229. package/dist/devices-hap/waterdetector.d.ts.map +0 -1
  230. package/dist/devices-hap/waterdetector.js +0 -356
  231. package/dist/devices-hap/waterdetector.js.map +0 -1
  232. package/dist/devices-matter/BaseMatterAccessory.d.ts +0 -90
  233. package/dist/devices-matter/BaseMatterAccessory.d.ts.map +0 -1
  234. package/dist/devices-matter/BaseMatterAccessory.js +0 -264
  235. package/dist/devices-matter/BaseMatterAccessory.js.map +0 -1
  236. package/dist/devices-matter/ColorLightAccessory.d.ts +0 -20
  237. package/dist/devices-matter/ColorLightAccessory.d.ts.map +0 -1
  238. package/dist/devices-matter/ColorLightAccessory.js +0 -95
  239. package/dist/devices-matter/ColorLightAccessory.js.map +0 -1
  240. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +0 -18
  241. package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +0 -1
  242. package/dist/devices-matter/ColorTemperatureLightAccessory.js +0 -76
  243. package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +0 -1
  244. package/dist/devices-matter/ContactSensorAccessory.d.ts +0 -12
  245. package/dist/devices-matter/ContactSensorAccessory.d.ts.map +0 -1
  246. package/dist/devices-matter/ContactSensorAccessory.js +0 -34
  247. package/dist/devices-matter/ContactSensorAccessory.js.map +0 -1
  248. package/dist/devices-matter/DimmableLightAccessory.d.ts +0 -58
  249. package/dist/devices-matter/DimmableLightAccessory.d.ts.map +0 -1
  250. package/dist/devices-matter/DimmableLightAccessory.js +0 -167
  251. package/dist/devices-matter/DimmableLightAccessory.js.map +0 -1
  252. package/dist/devices-matter/DoorLockAccessory.d.ts +0 -14
  253. package/dist/devices-matter/DoorLockAccessory.d.ts.map +0 -1
  254. package/dist/devices-matter/DoorLockAccessory.js +0 -50
  255. package/dist/devices-matter/DoorLockAccessory.js.map +0 -1
  256. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +0 -21
  257. package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +0 -1
  258. package/dist/devices-matter/ExtendedColorLightAccessory.js +0 -106
  259. package/dist/devices-matter/ExtendedColorLightAccessory.js.map +0 -1
  260. package/dist/devices-matter/FanAccessory.d.ts +0 -16
  261. package/dist/devices-matter/FanAccessory.d.ts.map +0 -1
  262. package/dist/devices-matter/FanAccessory.js +0 -81
  263. package/dist/devices-matter/FanAccessory.js.map +0 -1
  264. package/dist/devices-matter/HumiditySensorAccessory.d.ts +0 -12
  265. package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +0 -1
  266. package/dist/devices-matter/HumiditySensorAccessory.js +0 -34
  267. package/dist/devices-matter/HumiditySensorAccessory.js.map +0 -1
  268. package/dist/devices-matter/LeakSensorAccessory.d.ts +0 -12
  269. package/dist/devices-matter/LeakSensorAccessory.d.ts.map +0 -1
  270. package/dist/devices-matter/LeakSensorAccessory.js +0 -33
  271. package/dist/devices-matter/LeakSensorAccessory.js.map +0 -1
  272. package/dist/devices-matter/LightSensorAccessory.d.ts +0 -12
  273. package/dist/devices-matter/LightSensorAccessory.d.ts.map +0 -1
  274. package/dist/devices-matter/LightSensorAccessory.js +0 -34
  275. package/dist/devices-matter/LightSensorAccessory.js.map +0 -1
  276. package/dist/devices-matter/OccupancySensorAccessory.d.ts +0 -12
  277. package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +0 -1
  278. package/dist/devices-matter/OccupancySensorAccessory.js +0 -39
  279. package/dist/devices-matter/OccupancySensorAccessory.js.map +0 -1
  280. package/dist/devices-matter/OnOffLightAccessory.d.ts +0 -38
  281. package/dist/devices-matter/OnOffLightAccessory.d.ts.map +0 -1
  282. package/dist/devices-matter/OnOffLightAccessory.js +0 -110
  283. package/dist/devices-matter/OnOffLightAccessory.js.map +0 -1
  284. package/dist/devices-matter/OnOffOutletAccessory.d.ts +0 -14
  285. package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +0 -1
  286. package/dist/devices-matter/OnOffOutletAccessory.js +0 -43
  287. package/dist/devices-matter/OnOffOutletAccessory.js.map +0 -1
  288. package/dist/devices-matter/OnOffSwitchAccessory.d.ts +0 -14
  289. package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +0 -1
  290. package/dist/devices-matter/OnOffSwitchAccessory.js +0 -42
  291. package/dist/devices-matter/OnOffSwitchAccessory.js.map +0 -1
  292. package/dist/devices-matter/RoboticVacuumAccessory.d.ts +0 -61
  293. package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +0 -1
  294. package/dist/devices-matter/RoboticVacuumAccessory.js +0 -544
  295. package/dist/devices-matter/RoboticVacuumAccessory.js.map +0 -1
  296. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +0 -11
  297. package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +0 -1
  298. package/dist/devices-matter/SmokeCOAlarmAccessory.js +0 -49
  299. package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +0 -1
  300. package/dist/devices-matter/TemperatureSensorAccessory.d.ts +0 -12
  301. package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +0 -1
  302. package/dist/devices-matter/TemperatureSensorAccessory.js +0 -36
  303. package/dist/devices-matter/TemperatureSensorAccessory.js.map +0 -1
  304. package/dist/devices-matter/ThermostatAccessory.d.ts +0 -19
  305. package/dist/devices-matter/ThermostatAccessory.d.ts.map +0 -1
  306. package/dist/devices-matter/ThermostatAccessory.js +0 -95
  307. package/dist/devices-matter/ThermostatAccessory.js.map +0 -1
  308. package/dist/devices-matter/VenetianBlindAccessory.d.ts +0 -19
  309. package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +0 -1
  310. package/dist/devices-matter/VenetianBlindAccessory.js +0 -99
  311. package/dist/devices-matter/VenetianBlindAccessory.js.map +0 -1
  312. package/dist/devices-matter/WindowBlindAccessory.d.ts +0 -17
  313. package/dist/devices-matter/WindowBlindAccessory.d.ts.map +0 -1
  314. package/dist/devices-matter/WindowBlindAccessory.js +0 -131
  315. package/dist/devices-matter/WindowBlindAccessory.js.map +0 -1
  316. package/dist/devices-matter/custom/PowerStripAccessory.d.ts +0 -97
  317. package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +0 -1
  318. package/dist/devices-matter/custom/PowerStripAccessory.js +0 -265
  319. package/dist/devices-matter/custom/PowerStripAccessory.js.map +0 -1
  320. package/dist/devices-matter/custom/index.d.ts +0 -8
  321. package/dist/devices-matter/custom/index.d.ts.map +0 -1
  322. package/dist/devices-matter/custom/index.js +0 -8
  323. package/dist/devices-matter/custom/index.js.map +0 -1
  324. package/dist/devices-matter/index.d.ts +0 -29
  325. package/dist/devices-matter/index.d.ts.map +0 -1
  326. package/dist/devices-matter/index.js +0 -28
  327. package/dist/devices-matter/index.js.map +0 -1
  328. package/dist/irdevice/airconditioner.d.ts +0 -61
  329. package/dist/irdevice/airconditioner.d.ts.map +0 -1
  330. package/dist/irdevice/airconditioner.js +0 -472
  331. package/dist/irdevice/airconditioner.js.map +0 -1
  332. package/dist/irdevice/airpurifier.d.ts +0 -50
  333. package/dist/irdevice/airpurifier.d.ts.map +0 -1
  334. package/dist/irdevice/airpurifier.js +0 -213
  335. package/dist/irdevice/airpurifier.js.map +0 -1
  336. package/dist/irdevice/camera.d.ts +0 -32
  337. package/dist/irdevice/camera.d.ts.map +0 -1
  338. package/dist/irdevice/camera.js +0 -107
  339. package/dist/irdevice/camera.js.map +0 -1
  340. package/dist/irdevice/fan.d.ts +0 -36
  341. package/dist/irdevice/fan.d.ts.map +0 -1
  342. package/dist/irdevice/fan.js +0 -200
  343. package/dist/irdevice/fan.js.map +0 -1
  344. package/dist/irdevice/irdevice.d.ts +0 -69
  345. package/dist/irdevice/irdevice.d.ts.map +0 -1
  346. package/dist/irdevice/irdevice.js +0 -339
  347. package/dist/irdevice/irdevice.js.map +0 -1
  348. package/dist/irdevice/light.d.ts +0 -36
  349. package/dist/irdevice/light.d.ts.map +0 -1
  350. package/dist/irdevice/light.js +0 -206
  351. package/dist/irdevice/light.js.map +0 -1
  352. package/dist/irdevice/other.d.ts +0 -57
  353. package/dist/irdevice/other.d.ts.map +0 -1
  354. package/dist/irdevice/other.js +0 -778
  355. package/dist/irdevice/other.js.map +0 -1
  356. package/dist/irdevice/tv.d.ts +0 -45
  357. package/dist/irdevice/tv.d.ts.map +0 -1
  358. package/dist/irdevice/tv.js +0 -327
  359. package/dist/irdevice/tv.js.map +0 -1
  360. package/dist/irdevice/vacuumcleaner.d.ts +0 -28
  361. package/dist/irdevice/vacuumcleaner.d.ts.map +0 -1
  362. package/dist/irdevice/vacuumcleaner.js +0 -104
  363. package/dist/irdevice/vacuumcleaner.js.map +0 -1
  364. package/dist/irdevice/waterheater.d.ts +0 -30
  365. package/dist/irdevice/waterheater.d.ts.map +0 -1
  366. package/dist/irdevice/waterheater.js +0 -105
  367. package/dist/irdevice/waterheater.js.map +0 -1
  368. package/dist/platform-hap.d.ts +0 -160
  369. package/dist/platform-hap.d.ts.map +0 -1
  370. package/dist/platform-hap.js +0 -3041
  371. package/dist/platform-hap.js.map +0 -1
  372. package/dist/platform-matter.d.ts +0 -188
  373. package/dist/platform-matter.d.ts.map +0 -1
  374. package/dist/platform-matter.js +0 -2545
  375. package/dist/platform-matter.js.map +0 -1
  376. package/dist/test/apiRequestTracker.test.d.ts +0 -2
  377. package/dist/test/apiRequestTracker.test.d.ts.map +0 -1
  378. package/dist/test/apiRequestTracker.test.js +0 -392
  379. package/dist/test/apiRequestTracker.test.js.map +0 -1
  380. package/dist/test/hap/device-webhook-context.test.d.ts +0 -2
  381. package/dist/test/hap/device-webhook-context.test.d.ts.map +0 -1
  382. package/dist/test/hap/device-webhook-context.test.js +0 -128
  383. package/dist/test/hap/device-webhook-context.test.js.map +0 -1
  384. package/dist/test/hap/platform-hap.logging.test.d.ts +0 -2
  385. package/dist/test/hap/platform-hap.logging.test.d.ts.map +0 -1
  386. package/dist/test/hap/platform-hap.logging.test.js +0 -33
  387. package/dist/test/hap/platform-hap.logging.test.js.map +0 -1
  388. package/dist/test/hap/platform-hap.test.d.ts +0 -2
  389. package/dist/test/hap/platform-hap.test.d.ts.map +0 -1
  390. package/dist/test/hap/platform-hap.test.js +0 -62
  391. package/dist/test/hap/platform-hap.test.js.map +0 -1
  392. package/dist/test/helpers/platform-fixtures.d.ts +0 -9
  393. package/dist/test/helpers/platform-fixtures.d.ts.map +0 -1
  394. package/dist/test/helpers/platform-fixtures.js +0 -30
  395. package/dist/test/helpers/platform-fixtures.js.map +0 -1
  396. package/dist/test/homebridge-ui/server.test.d.ts +0 -2
  397. package/dist/test/homebridge-ui/server.test.d.ts.map +0 -1
  398. package/dist/test/homebridge-ui/server.test.js +0 -445
  399. package/dist/test/homebridge-ui/server.test.js.map +0 -1
  400. package/dist/test/index.test.d.ts +0 -2
  401. package/dist/test/index.test.d.ts.map +0 -1
  402. package/dist/test/index.test.js +0 -19
  403. package/dist/test/index.test.js.map +0 -1
  404. package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts +0 -2
  405. package/dist/test/matter/devices-matter/baseMatterAccessory.test.d.ts.map +0 -1
  406. package/dist/test/matter/devices-matter/baseMatterAccessory.test.js +0 -71
  407. package/dist/test/matter/devices-matter/baseMatterAccessory.test.js.map +0 -1
  408. package/dist/test/matter/platform-matter.additional.test.d.ts +0 -2
  409. package/dist/test/matter/platform-matter.additional.test.d.ts.map +0 -1
  410. package/dist/test/matter/platform-matter.additional.test.js +0 -35
  411. package/dist/test/matter/platform-matter.additional.test.js.map +0 -1
  412. package/dist/test/matter/platform-matter.bleparse.test.d.ts +0 -2
  413. package/dist/test/matter/platform-matter.bleparse.test.d.ts.map +0 -1
  414. package/dist/test/matter/platform-matter.bleparse.test.js +0 -43
  415. package/dist/test/matter/platform-matter.bleparse.test.js.map +0 -1
  416. package/dist/test/matter/platform-matter.cleanup.test.d.ts +0 -2
  417. package/dist/test/matter/platform-matter.cleanup.test.d.ts.map +0 -1
  418. package/dist/test/matter/platform-matter.cleanup.test.js +0 -70
  419. package/dist/test/matter/platform-matter.cleanup.test.js.map +0 -1
  420. package/dist/test/matter/platform-matter.keepstale.test.d.ts +0 -2
  421. package/dist/test/matter/platform-matter.keepstale.test.d.ts.map +0 -1
  422. package/dist/test/matter/platform-matter.keepstale.test.js +0 -27
  423. package/dist/test/matter/platform-matter.keepstale.test.js.map +0 -1
  424. package/dist/test/matter/platform-matter.logging.test.d.ts +0 -2
  425. package/dist/test/matter/platform-matter.logging.test.d.ts.map +0 -1
  426. package/dist/test/matter/platform-matter.logging.test.js +0 -29
  427. package/dist/test/matter/platform-matter.logging.test.js.map +0 -1
  428. package/dist/test/matter/platform-matter.mapping.test.d.ts +0 -2
  429. package/dist/test/matter/platform-matter.mapping.test.d.ts.map +0 -1
  430. package/dist/test/matter/platform-matter.mapping.test.js +0 -43
  431. package/dist/test/matter/platform-matter.mapping.test.js.map +0 -1
  432. package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts +0 -2
  433. package/dist/test/matter/platform-matter.openapi-mapping.test.d.ts.map +0 -1
  434. package/dist/test/matter/platform-matter.openapi-mapping.test.js +0 -84
  435. package/dist/test/matter/platform-matter.openapi-mapping.test.js.map +0 -1
  436. package/dist/test/matter/platform-matter.test.d.ts +0 -2
  437. package/dist/test/matter/platform-matter.test.d.ts.map +0 -1
  438. package/dist/test/matter/platform-matter.test.js +0 -117
  439. package/dist/test/matter/platform-matter.test.js.map +0 -1
  440. package/dist/test/matter/platform-matter.unregister.test.d.ts +0 -2
  441. package/dist/test/matter/platform-matter.unregister.test.d.ts.map +0 -1
  442. package/dist/test/matter/platform-matter.unregister.test.js +0 -30
  443. package/dist/test/matter/platform-matter.unregister.test.js.map +0 -1
  444. package/dist/test/matter/platform-matter.webhook.test.d.ts +0 -2
  445. package/dist/test/matter/platform-matter.webhook.test.d.ts.map +0 -1
  446. package/dist/test/matter/platform-matter.webhook.test.js +0 -46
  447. package/dist/test/matter/platform-matter.webhook.test.js.map +0 -1
  448. package/dist/test/utils.test.d.ts +0 -2
  449. package/dist/test/utils.test.d.ts.map +0 -1
  450. package/dist/test/utils.test.js +0 -95
  451. package/dist/test/utils.test.js.map +0 -1
  452. package/dist/test/verifyconfig.test.d.ts +0 -2
  453. package/dist/test/verifyconfig.test.d.ts.map +0 -1
  454. package/dist/test/verifyconfig.test.js +0 -167
  455. package/dist/test/verifyconfig.test.js.map +0 -1
  456. package/src/custom.d.ts +0 -7
  457. package/src/devices-hap/airpurifier.ts +0 -568
  458. package/src/devices-hap/blindtilt.ts +0 -1049
  459. package/src/devices-hap/bot.ts +0 -910
  460. package/src/devices-hap/ceilinglight.ts +0 -747
  461. package/src/devices-hap/colorbulb.ts +0 -940
  462. package/src/devices-hap/contact.ts +0 -457
  463. package/src/devices-hap/curtain.ts +0 -944
  464. package/src/devices-hap/device.ts +0 -890
  465. package/src/devices-hap/fan.ts +0 -716
  466. package/src/devices-hap/hub.ts +0 -440
  467. package/src/devices-hap/humidifier.ts +0 -762
  468. package/src/devices-hap/iosensor.ts +0 -442
  469. package/src/devices-hap/lightstrip.ts +0 -863
  470. package/src/devices-hap/lock.ts +0 -627
  471. package/src/devices-hap/meter.ts +0 -427
  472. package/src/devices-hap/meterplus.ts +0 -431
  473. package/src/devices-hap/meterpro.ts +0 -523
  474. package/src/devices-hap/motion.ts +0 -390
  475. package/src/devices-hap/plug.ts +0 -427
  476. package/src/devices-hap/relayswitch.ts +0 -727
  477. package/src/devices-hap/robotvacuumcleaner.ts +0 -574
  478. package/src/devices-hap/waterdetector.ts +0 -400
  479. package/src/devices-matter/BaseMatterAccessory.ts +0 -302
  480. package/src/devices-matter/ColorLightAccessory.ts +0 -110
  481. package/src/devices-matter/ColorTemperatureLightAccessory.ts +0 -90
  482. package/src/devices-matter/ContactSensorAccessory.ts +0 -41
  483. package/src/devices-matter/DimmableLightAccessory.ts +0 -192
  484. package/src/devices-matter/DoorLockAccessory.ts +0 -60
  485. package/src/devices-matter/ExtendedColorLightAccessory.ts +0 -122
  486. package/src/devices-matter/FanAccessory.ts +0 -95
  487. package/src/devices-matter/HumiditySensorAccessory.ts +0 -41
  488. package/src/devices-matter/LeakSensorAccessory.ts +0 -40
  489. package/src/devices-matter/LightSensorAccessory.ts +0 -41
  490. package/src/devices-matter/OccupancySensorAccessory.ts +0 -48
  491. package/src/devices-matter/OnOffLightAccessory.ts +0 -125
  492. package/src/devices-matter/OnOffOutletAccessory.ts +0 -51
  493. package/src/devices-matter/OnOffSwitchAccessory.ts +0 -51
  494. package/src/devices-matter/RoboticVacuumAccessory.ts +0 -621
  495. package/src/devices-matter/SmokeCOAlarmAccessory.ts +0 -59
  496. package/src/devices-matter/TemperatureSensorAccessory.ts +0 -43
  497. package/src/devices-matter/ThermostatAccessory.ts +0 -110
  498. package/src/devices-matter/VenetianBlindAccessory.ts +0 -115
  499. package/src/devices-matter/WindowBlindAccessory.ts +0 -135
  500. package/src/devices-matter/custom/PowerStripAccessory.ts +0 -309
  501. package/src/devices-matter/custom/index.ts +0 -8
  502. package/src/devices-matter/index.ts +0 -29
  503. package/src/irdevice/airconditioner.ts +0 -533
  504. package/src/irdevice/airpurifier.ts +0 -252
  505. package/src/irdevice/camera.ts +0 -129
  506. package/src/irdevice/fan.ts +0 -226
  507. package/src/irdevice/irdevice.ts +0 -383
  508. package/src/irdevice/light.ts +0 -246
  509. package/src/irdevice/other.ts +0 -790
  510. package/src/irdevice/tv.ts +0 -378
  511. package/src/irdevice/vacuumcleaner.ts +0 -126
  512. package/src/irdevice/waterheater.ts +0 -127
  513. package/src/platform-hap.ts +0 -3193
  514. package/src/platform-matter.ts +0 -2703
  515. package/src/test/apiRequestTracker.test.ts +0 -417
  516. package/src/test/hap/device-webhook-context.test.ts +0 -136
  517. package/src/test/hap/platform-hap.logging.test.ts +0 -36
  518. package/src/test/hap/platform-hap.test.ts +0 -70
  519. package/src/test/helpers/platform-fixtures.ts +0 -33
  520. package/src/test/homebridge-ui/server.test.ts +0 -486
  521. package/src/test/index.test.ts +0 -24
  522. package/src/test/matter/devices-matter/baseMatterAccessory.test.ts +0 -88
  523. package/src/test/matter/platform-matter.additional.test.ts +0 -44
  524. package/src/test/matter/platform-matter.bleparse.test.ts +0 -47
  525. package/src/test/matter/platform-matter.cleanup.test.ts +0 -86
  526. package/src/test/matter/platform-matter.keepstale.test.ts +0 -37
  527. package/src/test/matter/platform-matter.logging.test.ts +0 -33
  528. package/src/test/matter/platform-matter.mapping.test.ts +0 -57
  529. package/src/test/matter/platform-matter.openapi-mapping.test.ts +0 -109
  530. package/src/test/matter/platform-matter.test.ts +0 -144
  531. package/src/test/matter/platform-matter.unregister.test.ts +0 -39
  532. package/src/test/matter/platform-matter.webhook.test.ts +0 -54
  533. package/src/test/utils.test.ts +0 -96
  534. package/src/test/verifyconfig.test.ts +0 -198
@@ -1,890 +0,0 @@
1
- /* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
- *
3
- * device.ts: @switchbot/homebridge-switchbot.
4
- */
5
-
6
- import type { API, CharacteristicValue, HAP, Logging, PlatformAccessory, Service } from 'homebridge'
7
- import type { MqttClient } from 'mqtt'
8
- import type { ad, bodyChange, device, deviceStatus, deviceStatusRequest, pushResponse, SwitchBotBLE } from 'node-switchbot'
9
-
10
- import type { SwitchBotHAPPlatform } from '../platform-hap.js'
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
-
13
- import { hostname } from 'node:os'
14
-
15
- import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName, SwitchBotModel } from 'node-switchbot'
16
-
17
- import { deviceLoggingEnabled, deviceLoggingIsDebug, formatDeviceIdAsMac, isSuccessfulStatusCode, logDeviceStatusCode, safeStringify, sleep } from '../utils.js'
18
-
19
- export abstract class deviceBase {
20
- public readonly api: API
21
- public readonly log: Logging
22
- public readonly config!: SwitchBotPlatformConfig
23
- protected readonly hap: HAP
24
-
25
- // Config
26
- protected deviceLogging!: string
27
- protected deviceRefreshRate!: number
28
- protected deviceUpdateRate!: number
29
- protected devicePushRate!: number
30
- protected deviceMaxRetries!: number
31
- protected deviceDelayBetweenRetries!: number
32
-
33
- // Connection
34
- protected readonly BLE: boolean
35
- protected readonly OpenAPI: boolean
36
-
37
- // Accsrroy Information
38
- protected deviceModel!: SwitchBotModel
39
- protected deviceBLEModel!: SwitchBotBLEModel
40
-
41
- // MQTT
42
- protected deviceMqttURL!: string
43
- protected deviceMqttOptions!: any
44
- protected deviceMqttPubOptions!: any
45
-
46
- // BLE
47
- protected scanDuration!: number
48
-
49
- // EVE history service handler
50
- protected historyService?: any = null
51
-
52
- // MQTT stuff
53
- protected mqttClient: MqttClient | null = null
54
-
55
- constructor(
56
- protected readonly platform: SwitchBotHAPPlatform,
57
- protected accessory: PlatformAccessory,
58
- protected device: device & devicesConfig,
59
- ) {
60
- this.api = this.platform.api
61
- this.log = this.platform.log
62
- this.config = this.platform.config
63
- this.hap = this.api.hap
64
-
65
- // Connection
66
- this.BLE = this.device.connectionType === 'BLE' || this.device.connectionType === 'BLE/OpenAPI'
67
- this.OpenAPI = this.device.connectionType === 'OpenAPI' || this.device.connectionType === 'BLE/OpenAPI'
68
-
69
- this.getDeviceLogSettings(device)
70
- this.getDeviceRateSettings(device)
71
- this.getDeviceConfigSettings(device)
72
- this.getDeviceContext(accessory, device)
73
- this.getMqttSettings(device)
74
-
75
- // Set accessory information
76
- accessory
77
- .getService(this.hap.Service.AccessoryInformation)!
78
- .setCharacteristic(this.hap.Characteristic.Manufacturer, 'SwitchBot')
79
- .setCharacteristic(this.hap.Characteristic.AppMatchingIdentifier, 'id1087374760')
80
- .setCharacteristic(this.hap.Characteristic.Name, accessory.displayName)
81
- .setCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName)
82
- .setCharacteristic(this.hap.Characteristic.Model, device.model)
83
- .setCharacteristic(this.hap.Characteristic.ProductData, device.deviceId)
84
- .setCharacteristic(this.hap.Characteristic.SerialNumber, device.deviceId)
85
- }
86
-
87
- async getDeviceLogSettings(device: device & devicesConfig): Promise<void> {
88
- this.deviceLogging = this.platform.debugMode ? 'debugMode' : device.logging ?? this.platform.platformLogging ?? 'standard'
89
- const logging = this.platform.debugMode ? 'Debug Mode' : device.logging ? 'Device Config' : this.platform.platformLogging ? 'Platform Config' : 'Default'
90
- this.debugLog(`Using ${logging} Logging: ${this.deviceLogging}`)
91
- }
92
-
93
- async getDeviceRateSettings(device: device & devicesConfig): Promise<void> {
94
- // refreshRate
95
- this.deviceRefreshRate = device.refreshRate ?? this.platform.platformRefreshRate ?? 300
96
- const refreshRate = device.refreshRate ? 'Device Config' : this.platform.platformRefreshRate ? 'Platform Config' : 'Default'
97
- this.accessory.context.refreshRate = this.deviceRefreshRate
98
- // updateRate
99
- this.deviceUpdateRate = device.updateRate ?? this.platform.platformUpdateRate ?? 5
100
- const updateRate = device.updateRate ? 'Device Config' : this.platform.platformUpdateRate ? 'Platform Config' : 'Default'
101
- this.accessory.context.updateRate = this.deviceUpdateRate
102
- // pushRate
103
- this.devicePushRate = device.pushRate ?? this.platform.platformPushRate ?? 0.1
104
- const pushRate = device.pushRate ? 'Device Config' : this.platform.platformPushRate ? 'Platform Config' : 'Default'
105
- this.accessory.context.pushRate = this.devicePushRate
106
- this.debugLog(`Using ${refreshRate} refreshRate: ${this.deviceRefreshRate}, ${updateRate} updateRate: ${this.deviceUpdateRate}, ${pushRate} pushRate: ${this.devicePushRate}`)
107
- // maxRetries
108
- this.deviceMaxRetries = device.maxRetries ?? this.platform.platformMaxRetries ?? 2
109
- const maxRetries = device.maxRetries ? 'Device' : this.platform.platformMaxRetries ? 'Platform' : 'Default'
110
- this.debugLog(`Using ${maxRetries} Max Retries: ${this.deviceMaxRetries}`)
111
- // delayBetweenRetries
112
- this.deviceDelayBetweenRetries = device.delayBetweenRetries ? (device.delayBetweenRetries * 1000) : this.platform.platformDelayBetweenRetries ?? 3000
113
- const delayBetweenRetries = device.delayBetweenRetries ? 'Device' : this.platform.platformDelayBetweenRetries ? 'Platform' : 'Default'
114
- this.debugLog(`Using ${delayBetweenRetries} Delay Between Retries: ${this.deviceDelayBetweenRetries}`)
115
- // scanDuration
116
- this.scanDuration = Math.max(device.scanDuration ?? 1, this.deviceUpdateRate > 1 ? this.deviceUpdateRate : 1)
117
- if (this.BLE) {
118
- this.debugLog(`Using ${device.scanDuration ? 'Device Config' : 'Default'} scanDuration: ${this.scanDuration}`)
119
- if (device.scanDuration && this.deviceUpdateRate > device.scanDuration) {
120
- this.warnLog('scanDuration is less than updateRate, overriding scanDuration with updateRate')
121
- }
122
- }
123
- }
124
-
125
- async retryBLE({ max, fn }: { max: number, fn: { (): any, (): Promise<any> } }): Promise<null> {
126
- return fn().catch(async (e: any) => {
127
- if (max === 0) {
128
- throw e
129
- }
130
- this.warnLog(e)
131
- this.infoLog('Retrying')
132
- await sleep(1000)
133
- return this.retryBLE({ max: max - 1, fn })
134
- })
135
- }
136
-
137
- maxRetryBLE(): number {
138
- return this.device.maxRetry !== undefined ? this.device.maxRetry : 5
139
- }
140
-
141
- async getDeviceConfigSettings(device: device & devicesConfig): Promise<void> {
142
- const deviceConfig = Object.assign(
143
- {},
144
- device.logging !== 'standard' && { logging: device.logging },
145
- device.refreshRate !== 0 && { refreshRate: device.refreshRate },
146
- device.updateRate !== 0 && { updateRate: device.updateRate },
147
- device.scanDuration !== 0 && { scanDuration: device.scanDuration },
148
- device.offline === true && { offline: device.offline },
149
- device.maxRetry !== 0 && { maxRetry: device.maxRetry },
150
- (device.webhook === true || (device.webhook === undefined && this.config.options?.webhook === true)) && {
151
- webhook: device.webhook !== undefined ? device.webhook : this.config.options?.webhook,
152
- },
153
- device.connectionType !== '' && { connectionType: device.connectionType },
154
- device.disablePlatformBLE !== false && { disablePlatformBLE: device.disablePlatformBLE },
155
- device.external === true && { external: device.external },
156
- device.mqttURL !== '' && { mqttURL: device.mqttURL },
157
- device.mqttOptions && { mqttOptions: device.mqttOptions },
158
- device.mqttPubOptions && { mqttPubOptions: device.mqttPubOptions },
159
- device.maxRetries !== 0 && { maxRetries: device.maxRetries },
160
- device.delayBetweenRetries !== 0 && { delayBetweenRetries: device.delayBetweenRetries },
161
- )
162
- let deviceSpecificConfig = {}
163
- switch (device.configDeviceType) {
164
- case 'Bot':
165
- deviceSpecificConfig = device as botConfig
166
- break
167
- case 'Relay Switch 1':
168
- deviceSpecificConfig = device as relaySwitch1Config
169
- break
170
- case 'Relay Switch 1PM':
171
- deviceSpecificConfig = device as relaySwitch1PMConfig
172
- break
173
- case 'Meter':
174
- case 'MeterPlus':
175
- deviceSpecificConfig = device as meterConfig
176
- break
177
- case 'WoIOSensor':
178
- deviceSpecificConfig = device as indoorOutdoorSensorConfig
179
- break
180
- case 'Humidifier':
181
- case 'Humidifier2':
182
- deviceSpecificConfig = device as humidifierConfig
183
- break
184
- case 'Curtain':
185
- case 'Curtain3':
186
- deviceSpecificConfig = device as curtainConfig
187
- break
188
- case 'Blind Tilt':
189
- deviceSpecificConfig = device as blindTiltConfig
190
- break
191
- case 'Contact Sensor':
192
- deviceSpecificConfig = device as contactConfig
193
- break
194
- case 'Motion Sensor':
195
- deviceSpecificConfig = device as motionConfig
196
- break
197
- case 'Water Detector':
198
- deviceSpecificConfig = device as waterDetectorConfig
199
- break
200
- case 'Plug':
201
- case 'Plug Mini (US)':
202
- case 'Plug Mini (JP)':
203
- deviceSpecificConfig = device as plugConfig
204
- break
205
- case 'Color Bulb':
206
- deviceSpecificConfig = device as colorBulbConfig
207
- break
208
- case 'Strip Light':
209
- deviceSpecificConfig = device as stripLightConfig
210
- break
211
- case 'Ceiling Light':
212
- case 'Ceiling Light Pro':
213
- deviceSpecificConfig = device as ceilingLightConfig
214
- break
215
- case 'Smart Lock':
216
- case 'Smart Lock Pro':
217
- deviceSpecificConfig = device as lockConfig
218
- break
219
- case 'Hub 2':
220
- deviceSpecificConfig = device as hubConfig
221
- break
222
- default:
223
- }
224
- const config = Object.assign(
225
- {},
226
- deviceConfig,
227
- deviceSpecificConfig,
228
- )
229
-
230
- if (Object.keys(config).length !== 0) {
231
- this.debugSuccessLog(`Config: ${JSON.stringify(config)}`)
232
- }
233
- }
234
-
235
- /**
236
- * Get the current ambient light level based on the light level, set_minLux, set_maxLux, and spaceBetweenLevels.
237
- * @param lightLevel number
238
- * @param set_minLux number
239
- * @param set_maxLux number
240
- * @param spaceBetweenLevels number
241
- * @returns CurrentAmbientLightLevel
242
- */
243
- getLightLevel(lightLevel: number, set_minLux: number, set_maxLux: number, spaceBetweenLevels: number): number {
244
- const numberOfLevels = spaceBetweenLevels + 1
245
- this.debugLog(`LightLevel: ${lightLevel}, set_minLux: ${set_minLux}, set_maxLux: ${set_maxLux}, spaceBetweenLevels: ${spaceBetweenLevels}, numberOfLevels: ${numberOfLevels}`)
246
- const CurrentAmbientLightLevel = lightLevel === 1
247
- ? set_minLux
248
- : lightLevel === numberOfLevels
249
- ? set_maxLux
250
- : ((set_maxLux - set_minLux) / spaceBetweenLevels) * (Number(lightLevel) - 1)
251
- this.debugLog(`CurrentAmbientLightLevel: ${CurrentAmbientLightLevel}, LightLevel: ${lightLevel}, set_minLux: ${set_minLux}, set_maxLux: ${set_maxLux}`)
252
- return CurrentAmbientLightLevel
253
- }
254
-
255
- /*
256
- * Publish MQTT message for topics of
257
- * 'homebridge-switchbot/${this.device.deviceType}/xx:xx:xx:xx:xx:xx'
258
- */
259
- async mqttPublish(message: string, topic?: string) {
260
- const mac = this.device.deviceId?.toLowerCase().match(/[\s\S]{1,2}/g)?.join(':')
261
- const options = this.deviceMqttPubOptions ?? {}
262
- const mqttTopic = topic ? `/${topic}` : ''
263
- const mqttMessageTopic = topic ? `${topic}/` : ''
264
- this.mqttClient?.publish(`homebridge-switchbot/${this.device.deviceType}/${mac}${mqttTopic}`, `${message}`, options)
265
- this.debugLog(`MQTT message: ${mqttMessageTopic}${message} options:${JSON.stringify(options)}`)
266
- }
267
-
268
- /*
269
- * MQTT Settings
270
- */
271
- async getMqttSettings(device: device & devicesConfig): Promise<void> {
272
- // mqttURL
273
- this.deviceMqttURL = device.mqttURL ?? this.config.options?.mqttURL ?? ''
274
- const mqttURL = device.mqttURL ? 'Device Config' : this.config.options?.mqttURL ? 'Platform Config' : 'Default'
275
- // mqttOptions
276
- this.deviceMqttOptions = device.mqttOptions ?? this.config.options?.mqttOptions ?? {}
277
- const mqttOptions = device.mqttOptions ? 'Device Config' : this.config.options?.mqttOptions ? 'Platform Config' : 'Default'
278
- // mqttPubOptions
279
- this.deviceMqttPubOptions = device.mqttPubOptions ?? this.config.options?.mqttPubOptions ?? {}
280
- const mqttPubOptions = device.mqttPubOptions ? 'Device Config' : this.config.options?.mqttPubOptions ? 'Platform Config' : 'Default'
281
- this.debugLog(`Using ${mqttURL} MQTT URL: ${this.deviceMqttURL}, ${mqttOptions} mqttOptions: ${JSON.stringify(this.deviceMqttOptions)}, ${mqttPubOptions} mqttPubOptions: ${JSON.stringify(this.deviceMqttPubOptions)}`)
282
- }
283
-
284
- /*
285
- * Setup EVE history graph feature if enabled.
286
- */
287
- async setupHistoryService(accessory: PlatformAccessory, device: device & devicesConfig): Promise<void> {
288
- try {
289
- const formattedDeviceId = formatDeviceIdAsMac(this.device.deviceId)
290
- this.device.bleMac = formattedDeviceId
291
- this.debugLog(`bleMac: ${this.device.bleMac}`)
292
- this.historyService = device.history
293
- ? new this.platform.fakegatoAPI('room', accessory, { log: this.platform.log, storage: 'fs', filename: `${hostname().split('.')[0]}_${this.device.bleMac}_persist.json` })
294
- : null
295
- } catch (error) {
296
- this.errorLog(`failed to format device ID as MAC, Error: ${error}`)
297
- }
298
- }
299
-
300
- async switchbotBLE(): Promise<any> {
301
- const switchBotBLE = await this.platform.connectBLE(this.accessory, this.device)
302
- // Convert to BLE Address
303
- try {
304
- const formattedDeviceId = formatDeviceIdAsMac(this.device.deviceId)
305
- this.device.bleMac = formattedDeviceId
306
- await this.getCustomBLEAddress(switchBotBLE)
307
- this.debugLog(`bleMac: ${this.device.bleMac}`)
308
- return switchBotBLE
309
- } catch (error) {
310
- this.errorLog(`failed to format device ID as MAC, Error: ${error}`)
311
- }
312
- }
313
-
314
- async monitorAdvertisementPackets(switchbot: SwitchBotBLE): Promise<ad['serviceData']> {
315
- this.debugLog(`Scanning for deviceID: ${this.device.bleMac} Model: ${this.device.bleModel} ModelName: ${this.device.bleModelName}...`)
316
- try {
317
- await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac })
318
- } catch (e: any) {
319
- this.errorLog(`Failed to start BLE scanning. Error: ${e.message ?? e}`)
320
- }
321
- // Set an event handler
322
- let serviceData = { model: this.device.bleModel, modelName: this.device.bleModelName } as ad['serviceData']
323
- switchbot.onadvertisement = (ad: ad) => {
324
- if (ad.address === this.device.bleMac && ad.serviceData.model === this.device.bleModel) {
325
- this.debugLog(`ad: ${safeStringify(ad)}`)
326
- this.debugLog(`${JSON.stringify(ad, null, ' ')}`)
327
- this.debugLog(`address: ${ad.address}, model: ${ad.serviceData.model}`)
328
- this.debugLog(`serviceData: ${JSON.stringify(ad.serviceData)}`)
329
- serviceData = ad.serviceData
330
- }
331
- }
332
- // Wait
333
- await switchbot.wait(this.scanDuration * 1000)
334
- // Stop to monitor
335
- try {
336
- await switchbot.stopScan()
337
- } catch (e: any) {
338
- this.errorLog(`Failed to stop BLE scanning. Error: ${e.message ?? e}`)
339
- }
340
- return serviceData
341
- }
342
-
343
- async getCustomBLEAddress(switchbot: SwitchBotBLE): Promise<void> {
344
- if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
345
- this.debugLog(`customBLEaddress: ${this.device.customBLEaddress}`);
346
- (async () => {
347
- // Start to monitor advertisement packets
348
- try {
349
- await switchbot.startScan({ model: this.device.bleModel })
350
- } catch (e: any) {
351
- this.errorLog(`Failed to start BLE scanning. Error: ${e.message ?? e}`)
352
- }
353
- // Set an event handler
354
- switchbot.onadvertisement = (ad: ad) => {
355
- this.warnLog(`ad: ${JSON.stringify(ad, null, ' ')}`)
356
- }
357
- await sleep(10000)
358
- // Stop to monitor
359
- try {
360
- switchbot.stopScan()
361
- } catch (e: any) {
362
- this.errorLog(`Failed to stop BLE scanning. Error: ${e.message ?? e}`)
363
- }
364
- })()
365
- }
366
- }
367
-
368
- async pushChangeRequest<T extends pushResponse['body']>(bodyChange: bodyChange): Promise<{ body: T, statusCode: pushResponse['statusCode'] }> {
369
- const { response, statusCode } = await this.platform.retryCommand(this.device, bodyChange, this.deviceMaxRetries, this.deviceDelayBetweenRetries)
370
- return { body: response, statusCode }
371
- }
372
-
373
- async deviceRefreshStatus<T extends deviceStatus>(): Promise<{ body: T, statusCode: deviceStatusRequest['statusCode'] }> {
374
- const { response, statusCode } = await this.platform.retryRequest(this.device, this.deviceMaxRetries, this.deviceDelayBetweenRetries)
375
- return { body: response, statusCode }
376
- }
377
-
378
- /**
379
- * Check if status code indicates success (100 or 200)
380
- * @deprecated Use isSuccessfulStatusCode from utils.ts instead
381
- */
382
- async successfulStatusCodes<T extends { statusCode: number }>(deviceStatus: T): Promise<boolean> {
383
- return isSuccessfulStatusCode(deviceStatus.statusCode)
384
- }
385
-
386
- /**
387
- * Update the characteristic value and log the change.
388
- *
389
- * @param Service Service
390
- * @param Characteristic Characteristic
391
- * @param CharacteristicValue CharacteristicValue | undefined
392
- * @param CharacteristicName string
393
- * @param history object
394
- * @return: void
395
- *
396
- */
397
- async updateCharacteristic(Service: Service, Characteristic: any, CharacteristicValue: CharacteristicValue | undefined, CharacteristicName: string, history?: object): Promise<void> {
398
- if (CharacteristicValue === undefined || CharacteristicValue === null) {
399
- this.debugLog(`${CharacteristicName}: ${CharacteristicValue}`)
400
- } else {
401
- await this.mqtt(CharacteristicName, CharacteristicValue)
402
- if (this.device.history) {
403
- this.historyService?.addEntry(history)
404
- }
405
- Service.updateCharacteristic(Characteristic, CharacteristicValue)
406
- this.debugLog(`updateCharacteristic ${CharacteristicName}: ${CharacteristicValue}`)
407
- this.debugWarnLog(`${CharacteristicName} context before: ${this.accessory.context[CharacteristicName]}`)
408
- this.accessory.context[CharacteristicName] = CharacteristicValue
409
- this.debugWarnLog(`${CharacteristicName} context after: ${this.accessory.context[CharacteristicName]}`)
410
- }
411
- }
412
-
413
- async mqtt(CharacteristicName: string, CharacteristicValue: CharacteristicValue) {
414
- if (this.device.mqttURL) {
415
- this.mqttPublish(CharacteristicName, CharacteristicValue.toString())
416
- }
417
- }
418
-
419
- async getDeviceContext(accessory: PlatformAccessory, device: device & devicesConfig): Promise<void> {
420
- const deviceMapping = {
421
- 'Humidifier': {
422
- model: SwitchBotModel.Humidifier,
423
- bleModel: SwitchBotBLEModel.Humidifier,
424
- bleModelName: SwitchBotBLEModelName.Humidifier,
425
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Humidifier,
426
- },
427
- 'Humidifier2': {
428
- model: SwitchBotModel.Humidifier2,
429
- bleModel: SwitchBotBLEModel.Humidifier2,
430
- bleModelName: SwitchBotBLEModelName.Humidifier2,
431
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Humidifier2,
432
- },
433
- 'Hub Mini': {
434
- model: SwitchBotModel.HubMini,
435
- bleModel: SwitchBotBLEModel.Unknown,
436
- bleModelName: SwitchBotBLEModelName.Unknown,
437
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
438
- },
439
- 'Hub Plus': {
440
- model: SwitchBotModel.HubPlus,
441
- bleModel: SwitchBotBLEModel.Unknown,
442
- bleModelName: SwitchBotBLEModelName.Unknown,
443
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
444
- },
445
- 'Hub 2': {
446
- model: SwitchBotModel.Hub2,
447
- bleModel: SwitchBotBLEModel.Hub2,
448
- bleModelName: SwitchBotBLEModelName.Hub2,
449
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Hub2,
450
- },
451
- 'Hub 3': {
452
- model: SwitchBotModel.Hub3,
453
- bleModel: SwitchBotBLEModel.Hub3,
454
- bleModelName: SwitchBotBLEModelName.Hub3,
455
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Hub3,
456
- },
457
- 'Bot': {
458
- model: SwitchBotModel.Bot,
459
- bleModel: SwitchBotBLEModel.Bot,
460
- bleModelName: SwitchBotBLEModelName.Bot,
461
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Bot,
462
- },
463
- 'Relay Switch 1': {
464
- model: SwitchBotModel.RelaySwitch1,
465
- bleModel: SwitchBotBLEModel.RelaySwitch1,
466
- bleModelName: SwitchBotBLEModelName.RelaySwitch1,
467
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.RelaySwitch1,
468
- },
469
- 'Relay Switch 1PM': {
470
- model: SwitchBotModel.RelaySwitch1PM,
471
- bleModel: SwitchBotBLEModel.RelaySwitch1PM,
472
- bleModelName: SwitchBotBLEModelName.RelaySwitch1PM,
473
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.RelaySwitch1PM,
474
- },
475
- 'Meter': {
476
- model: SwitchBotModel.Meter,
477
- bleModel: SwitchBotBLEModel.Meter,
478
- bleModelName: SwitchBotBLEModelName.Meter,
479
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Meter,
480
- },
481
- 'MeterPlus': {
482
- model: SwitchBotModel.MeterPlusUS,
483
- bleModel: SwitchBotBLEModel.MeterPlus,
484
- bleModelName: SwitchBotBLEModelName.MeterPlus,
485
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.MeterPlus,
486
- },
487
- 'Meter Plus (JP)': {
488
- model: SwitchBotModel.MeterPlusJP,
489
- bleModel: SwitchBotBLEModel.MeterPlus,
490
- bleModelName: SwitchBotBLEModelName.MeterPlus,
491
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.MeterPlus,
492
- },
493
- 'MeterPro': {
494
- model: SwitchBotModel.MeterPro,
495
- bleModel: SwitchBotBLEModel.MeterPro,
496
- bleModelName: SwitchBotBLEModelName.MeterPro,
497
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.MeterPro,
498
- },
499
- 'MeterPro(CO2)': {
500
- model: SwitchBotModel.MeterProCO2,
501
- bleModel: SwitchBotBLEModel.MeterProCO2,
502
- bleModelName: SwitchBotBLEModelName.MeterProCO2,
503
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.MeterProCO2,
504
- },
505
- 'WoIOSensor': {
506
- model: SwitchBotModel.OutdoorMeter,
507
- bleModel: SwitchBotBLEModel.OutdoorMeter,
508
- bleModelName: SwitchBotBLEModelName.OutdoorMeter,
509
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.OutdoorMeter,
510
- },
511
- 'Water Detector': {
512
- model: SwitchBotModel.WaterDetector,
513
- bleModel: SwitchBotBLEModel.Leak,
514
- bleModelName: SwitchBotBLEModelName.Leak,
515
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Leak,
516
- },
517
- 'Motion Sensor': {
518
- model: SwitchBotModel.MotionSensor,
519
- bleModel: SwitchBotBLEModel.MotionSensor,
520
- bleModelName: SwitchBotBLEModelName.MotionSensor,
521
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.MotionSensor,
522
- },
523
- 'Contact Sensor': {
524
- model: SwitchBotModel.ContactSensor,
525
- bleModel: SwitchBotBLEModel.ContactSensor,
526
- bleModelName: SwitchBotBLEModelName.ContactSensor,
527
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.ContactSensor,
528
- },
529
- 'Curtain': {
530
- model: SwitchBotModel.Curtain,
531
- bleModel: SwitchBotBLEModel.Curtain,
532
- bleModelName: SwitchBotBLEModelName.Curtain,
533
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Curtain,
534
- },
535
- 'Curtain3': {
536
- model: SwitchBotModel.Curtain3,
537
- bleModel: SwitchBotBLEModel.Curtain3,
538
- bleModelName: SwitchBotBLEModelName.Curtain3,
539
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Curtain3,
540
- },
541
- 'WoRollerShade': {
542
- model: SwitchBotModel.Curtain3,
543
- bleModel: SwitchBotBLEModel.Curtain3,
544
- bleModelName: SwitchBotBLEModelName.Curtain3,
545
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Curtain3,
546
- },
547
- 'Roller Shade': {
548
- model: SwitchBotModel.Curtain3,
549
- bleModel: SwitchBotBLEModel.Curtain3,
550
- bleModelName: SwitchBotBLEModelName.Curtain3,
551
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Curtain3,
552
- },
553
- 'Blind Tilt': {
554
- model: SwitchBotModel.BlindTilt,
555
- bleModel: SwitchBotBLEModel.BlindTilt,
556
- bleModelName: SwitchBotBLEModelName.BlindTilt,
557
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.BlindTilt,
558
- },
559
- 'Plug': {
560
- model: SwitchBotModel.Plug,
561
- bleModel: SwitchBotBLEModel.PlugMiniUS,
562
- bleModelName: SwitchBotBLEModelName.PlugMini,
563
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.PlugMini,
564
- },
565
- 'Plug Mini (US)': {
566
- model: SwitchBotModel.PlugMiniUS,
567
- bleModel: SwitchBotBLEModel.PlugMiniUS,
568
- bleModelName: SwitchBotBLEModelName.PlugMini,
569
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.PlugMini,
570
- },
571
- 'Plug Mini (JP)': {
572
- model: SwitchBotModel.PlugMiniJP,
573
- bleModel: SwitchBotBLEModel.PlugMiniJP,
574
- bleModelName: SwitchBotBLEModelName.PlugMini,
575
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.PlugMini,
576
- },
577
- 'Smart Lock': {
578
- model: SwitchBotModel.Lock,
579
- bleModel: SwitchBotBLEModel.Lock,
580
- bleModelName: SwitchBotBLEModelName.Lock,
581
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Lock,
582
- },
583
- 'Smart Lock Pro': {
584
- model: SwitchBotModel.LockPro,
585
- bleModel: SwitchBotBLEModel.LockPro,
586
- bleModelName: SwitchBotBLEModelName.LockPro,
587
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.LockPro,
588
- },
589
- 'Smart Lock Ultra': {
590
- model: SwitchBotModel.LockPro,
591
- bleModel: SwitchBotBLEModel.LockPro,
592
- bleModelName: SwitchBotBLEModelName.LockPro,
593
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.LockPro,
594
- },
595
- 'Color Bulb': {
596
- model: SwitchBotModel.ColorBulb,
597
- bleModel: SwitchBotBLEModel.ColorBulb,
598
- bleModelName: SwitchBotBLEModelName.ColorBulb,
599
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.ColorBulb,
600
- },
601
- 'K10+': {
602
- model: SwitchBotModel.K10,
603
- bleModel: SwitchBotBLEModel.Unknown,
604
- bleModelName: SwitchBotBLEModelName.Unknown,
605
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
606
- },
607
- 'K10+ Pro': {
608
- model: SwitchBotModel.K10Pro,
609
- bleModel: SwitchBotBLEModel.Unknown,
610
- bleModelName: SwitchBotBLEModelName.Unknown,
611
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
612
- },
613
- 'WoSweeper': {
614
- model: SwitchBotModel.WoSweeper,
615
- bleModel: SwitchBotBLEModel.Unknown,
616
- bleModelName: SwitchBotBLEModelName.Unknown,
617
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
618
- },
619
- 'WoSweeperMini': {
620
- model: SwitchBotModel.WoSweeperMini,
621
- bleModel: SwitchBotBLEModel.Unknown,
622
- bleModelName: SwitchBotBLEModelName.Unknown,
623
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
624
- },
625
- 'Robot Vacuum Cleaner S1': {
626
- model: SwitchBotModel.RobotVacuumCleanerS1,
627
- bleModel: SwitchBotBLEModel.Unknown,
628
- bleModelName: SwitchBotBLEModelName.Unknown,
629
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
630
- },
631
- 'Robot Vacuum Cleaner S1 Plus': {
632
- model: SwitchBotModel.RobotVacuumCleanerS1Plus,
633
- bleModel: SwitchBotBLEModel.Unknown,
634
- bleModelName: SwitchBotBLEModelName.Unknown,
635
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
636
- },
637
- 'Robot Vacuum Cleaner S10': {
638
- model: SwitchBotModel.RobotVacuumCleanerS10,
639
- bleModel: SwitchBotBLEModel.Unknown,
640
- bleModelName: SwitchBotBLEModelName.Unknown,
641
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
642
- },
643
- 'Ceiling Light': {
644
- model: SwitchBotModel.CeilingLight,
645
- bleModel: SwitchBotBLEModel.CeilingLight,
646
- bleModelName: SwitchBotBLEModelName.CeilingLight,
647
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.CeilingLight,
648
- },
649
- 'Ceiling Light Pro': {
650
- model: SwitchBotModel.CeilingLightPro,
651
- bleModel: SwitchBotBLEModel.CeilingLightPro,
652
- bleModelName: SwitchBotBLEModelName.CeilingLightPro,
653
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.CeilingLightPro,
654
- },
655
- 'Strip Light': {
656
- model: SwitchBotModel.StripLight,
657
- bleModel: SwitchBotBLEModel.StripLight,
658
- bleModelName: SwitchBotBLEModelName.StripLight,
659
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.StripLight,
660
- },
661
- 'Indoor Cam': {
662
- model: SwitchBotModel.IndoorCam,
663
- bleModel: SwitchBotBLEModel.Unknown,
664
- bleModelName: SwitchBotBLEModelName.Unknown,
665
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
666
- },
667
- 'Remote': {
668
- model: SwitchBotModel.Remote,
669
- bleModel: SwitchBotBLEModel.Unknown,
670
- bleModelName: SwitchBotBLEModelName.Unknown,
671
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
672
- },
673
- 'remote with screen+': {
674
- model: SwitchBotModel.UniversalRemote,
675
- bleModel: SwitchBotBLEModel.Unknown,
676
- bleModelName: SwitchBotBLEModelName.Unknown,
677
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
678
- },
679
- 'Battery Circulator Fan': {
680
- model: SwitchBotModel.BatteryCirculatorFan,
681
- bleModel: SwitchBotBLEModel.Unknown,
682
- bleModelName: SwitchBotBLEModelName.Unknown,
683
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
684
- },
685
- }
686
- const defaultDevice = {
687
- model: SwitchBotModel.Unknown,
688
- bleModel: SwitchBotBLEModel.Unknown,
689
- bleModelName: SwitchBotBLEModelName.Unknown,
690
- bleModelFriendlyName: SwitchBotBLEModelFriendlyName.Unknown,
691
- }
692
- const deviceConfig = deviceMapping[device.deviceType] || defaultDevice
693
- device.model = deviceConfig.model
694
- device.bleModel = deviceConfig.bleModel
695
- device.bleModelName = deviceConfig.bleModelName
696
- device.bleModelFriednlyName = deviceConfig.bleModelFriednlyName
697
- this.debugLog(`Model: ${device.model}, BLE Model: ${device.bleModel}, BLE Model Name: ${device.bleModelName}, BLE Model Friendly Name: ${device.bleModelFriednlyName}`)
698
-
699
- const deviceFirmwareVersion = device.firmware ?? device.version ?? accessory.context.version ?? this.platform.version ?? '0.0.0'
700
- const version = deviceFirmwareVersion.toString()
701
- this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`)
702
- let deviceVersion: string
703
- if (version?.includes('.') === false) {
704
- const replace = version?.replace(/^V|-.*$/g, '')
705
- const match = replace?.match(/./g)
706
- const validVersion = match?.join('.')
707
- deviceVersion = validVersion ?? '0.0.0'
708
- } else {
709
- deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0'
710
- }
711
- accessory
712
- .getService(this.hap.Service.AccessoryInformation)!
713
- .setCharacteristic(this.hap.Characteristic.HardwareRevision, deviceVersion)
714
- .setCharacteristic(this.hap.Characteristic.SoftwareRevision, deviceVersion)
715
- .setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
716
- .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
717
- .updateValue(deviceVersion)
718
- accessory.context.version = deviceVersion
719
- this.debugSuccessLog(`version: ${accessory.context.version}`)
720
-
721
- // Expose effective webhook setting on accessory context (parity with Matter)
722
- try {
723
- const effectiveWebhook = device.webhook !== undefined ? device.webhook : (this.config.options?.webhook === true ? true : undefined)
724
- if (effectiveWebhook !== undefined) {
725
- accessory.context.webhook = effectiveWebhook
726
- this.debugLog(`Effective webhook for ${device.deviceId}: ${String(effectiveWebhook)}`)
727
- }
728
- } catch (e: any) {
729
- this.debugLog(`Failed to set webhook context for ${device.deviceId}: ${e?.message ?? e}`)
730
- }
731
- }
732
-
733
- async statusCode(statusCode: number): Promise<void> {
734
- await logDeviceStatusCode(
735
- statusCode,
736
- {
737
- debugLog: this.debugLog.bind(this),
738
- debugErrorLog: this.debugErrorLog.bind(this),
739
- errorLog: this.errorLog.bind(this),
740
- infoLog: this.infoLog.bind(this),
741
- },
742
- this.device.deviceId,
743
- this.device.hubDeviceId,
744
- )
745
- }
746
-
747
- /**
748
- * Logging for Device
749
- * Modernized logging methods with improved type safety and formatting
750
- */
751
- infoLog(message: string, ...args: unknown[]): void {
752
- if (!this.enablingDeviceLogging()) {
753
- return
754
- }
755
- const prefix = `${this.device.deviceType}: ${this.accessory.displayName}`
756
- this.logWith('info', prefix, undefined, this.formatLogMessage(message, ...args))
757
- }
758
-
759
- successLog(message: string, ...args: unknown[]): void {
760
- if (!this.enablingDeviceLogging()) {
761
- return
762
- }
763
- const prefix = `${this.device.deviceType}: ${this.accessory.displayName}`
764
- this.logWith('success', prefix, undefined, this.formatLogMessage(message, ...args))
765
- }
766
-
767
- debugSuccessLog(message: string, ...args: unknown[]): void {
768
- if (!this.enablingDeviceLogging() || !this.loggingIsDebug()) {
769
- return
770
- }
771
- const prefix = `[DEBUG] ${this.device.deviceType}: ${this.accessory.displayName}`
772
- this.logWith('success', prefix, 'debugSuccessLog', this.formatLogMessage(message, ...args))
773
- }
774
-
775
- warnLog(message: string, ...args: unknown[]): void {
776
- if (!this.enablingDeviceLogging()) {
777
- return
778
- }
779
- const prefix = `${this.device.deviceType}: ${this.accessory.displayName}`
780
- this.logWith('warn', prefix, undefined, this.formatLogMessage(message, ...args))
781
- }
782
-
783
- debugWarnLog(message: string, ...args: unknown[]): void {
784
- if (!this.enablingDeviceLogging() || !this.loggingIsDebug()) {
785
- return
786
- }
787
- const prefix = `[DEBUG] ${this.device.deviceType}: ${this.accessory.displayName}`
788
- this.logWith('warn', prefix, 'debugWarnLog', this.formatLogMessage(message, ...args))
789
- }
790
-
791
- errorLog(message: string, ...args: unknown[]): void {
792
- if (!this.enablingDeviceLogging()) {
793
- return
794
- }
795
- const prefix = `${this.device.deviceType}: ${this.accessory.displayName}`
796
- this.logWith('error', prefix, undefined, this.formatLogMessage(message, ...args))
797
- }
798
-
799
- debugErrorLog(message: string, ...args: unknown[]): void {
800
- if (!this.enablingDeviceLogging() || !this.loggingIsDebug()) {
801
- return
802
- }
803
- const prefix = `[DEBUG] ${this.device.deviceType}: ${this.accessory.displayName}`
804
- this.logWith('error', prefix, 'debugErrorLog', this.formatLogMessage(message, ...args))
805
- }
806
-
807
- debugLog(message: string, ...args: unknown[]): void {
808
- if (!this.enablingDeviceLogging()) {
809
- return
810
- }
811
- // debug behaves differently depending on debug vs debugMode
812
- const prefix = this.deviceLogging === 'debug'
813
- ? `[DEBUG] ${this.device.deviceType}: ${this.accessory.displayName}`
814
- : `${this.device.deviceType}: ${this.accessory.displayName}`
815
- this.logWith('debug', prefix, 'debugLog', this.formatLogMessage(message, ...args))
816
- }
817
-
818
- /**
819
- * Format log message with arguments - handles both legacy and modern patterns
820
- */
821
- private formatLogMessage(message: string | any, ...args: unknown[]): string {
822
- // Handle legacy String(...log) pattern for backward compatibility
823
- if (typeof message !== 'string' && args.length === 0) {
824
- return String(message)
825
- }
826
-
827
- // Modern pattern: format message with arguments
828
- if (args.length === 0) {
829
- return String(message)
830
- }
831
-
832
- // Format arguments similar to how platform logging works
833
- const formattedArgs = args.map((arg) => {
834
- if (typeof arg === 'string') {
835
- return arg
836
- }
837
- try {
838
- return JSON.stringify(arg)
839
- } catch {
840
- return String(arg)
841
- }
842
- })
843
-
844
- return args.length > 0 ? `${message} ${formattedArgs.join(' ')}` : String(message)
845
- }
846
-
847
- // Generic logger used by device log helpers. Attempts to call a platform
848
- // helper method first (if present), then falls back to the local logger.
849
- protected logWith(level: string, message: string, platformMethodName?: string, payload?: string): void {
850
- const method = platformMethodName ?? `${level}Log`
851
- const pFn = (this.platform as any)?.[method]
852
- if (typeof pFn === 'function') {
853
- try {
854
- // Forward both a short message (title) and optional payload to the
855
- // platform logger so it can format/attach metadata consistently.
856
- if (payload !== undefined) {
857
- pFn(message, payload)
858
- } else {
859
- pFn(message)
860
- }
861
- return
862
- } catch (_err) {
863
- // fallthrough to local logger
864
- }
865
- }
866
- const map: Record<string, string> = {
867
- info: 'info',
868
- success: 'success',
869
- debug: 'debug',
870
- warn: 'warn',
871
- error: 'error',
872
- }
873
- const local = (this.log as any)[map[level] ?? level]
874
- if (typeof local === 'function') {
875
- if (payload !== undefined) {
876
- local.call(this.log, message, payload)
877
- } else {
878
- local.call(this.log, message)
879
- }
880
- }
881
- }
882
-
883
- loggingIsDebug(): boolean {
884
- return deviceLoggingIsDebug(this.deviceLogging)
885
- }
886
-
887
- enablingDeviceLogging(): boolean {
888
- return deviceLoggingEnabled(this.deviceLogging, this.platform.platformLogging)
889
- }
890
- }