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