@switchbot/homebridge-switchbot 5.0.0-beta.99 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/.changeset/config.json +14 -0
  2. package/.github/copilot-instructions.md +39 -0
  3. package/.github/workflows/ci.yml +4 -1
  4. package/.github/workflows/manual-e2e.yml +6 -3
  5. package/.github/workflows/release.yml +64 -15
  6. package/.github/workflows/stale.yml +2 -4
  7. package/.husky/pre-push +15 -0
  8. package/CHANGELOG.md +126 -134
  9. package/MIGRATION.md +16 -6
  10. package/README.md +84 -3
  11. package/TODO.md +263 -0
  12. package/config.schema.json +229 -36
  13. package/dist/SwitchBotHAPPlatform.d.ts +133 -0
  14. package/dist/SwitchBotHAPPlatform.d.ts.map +1 -0
  15. package/dist/SwitchBotHAPPlatform.js +555 -0
  16. package/dist/SwitchBotHAPPlatform.js.map +1 -0
  17. package/dist/SwitchBotMatterPlatform.d.ts +141 -0
  18. package/dist/SwitchBotMatterPlatform.d.ts.map +1 -0
  19. package/dist/SwitchBotMatterPlatform.js +536 -0
  20. package/dist/SwitchBotMatterPlatform.js.map +1 -0
  21. package/dist/device-types.d.ts +31 -0
  22. package/dist/device-types.d.ts.map +1 -0
  23. package/dist/device-types.js +246 -0
  24. package/dist/device-types.js.map +1 -0
  25. package/dist/deviceCommandMapper.d.ts +10 -0
  26. package/dist/deviceCommandMapper.d.ts.map +1 -0
  27. package/dist/deviceCommandMapper.js +319 -0
  28. package/dist/deviceCommandMapper.js.map +1 -0
  29. package/dist/deviceFactory.d.ts +3 -2
  30. package/dist/deviceFactory.d.ts.map +1 -1
  31. package/dist/deviceFactory.js +107 -29
  32. package/dist/deviceFactory.js.map +1 -1
  33. package/dist/devices/genericDevice.d.ts +59 -37
  34. package/dist/devices/genericDevice.d.ts.map +1 -1
  35. package/dist/devices/genericDevice.js +376 -78
  36. package/dist/devices/genericDevice.js.map +1 -1
  37. package/dist/errors.d.ts +38 -0
  38. package/dist/errors.d.ts.map +1 -0
  39. package/dist/errors.js +32 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/homebridge-ui/device-types.js +246 -0
  42. package/dist/homebridge-ui/device-types.js.map +1 -0
  43. package/dist/homebridge-ui/deviceCommandMapper.js +319 -0
  44. package/dist/homebridge-ui/deviceCommandMapper.js.map +1 -0
  45. package/dist/homebridge-ui/endpoints/config.d.ts +3 -0
  46. package/dist/homebridge-ui/endpoints/config.d.ts.map +1 -0
  47. package/dist/homebridge-ui/endpoints/config.js +90 -0
  48. package/dist/homebridge-ui/endpoints/config.js.map +1 -0
  49. package/dist/homebridge-ui/endpoints/devices.d.ts +6 -0
  50. package/dist/homebridge-ui/endpoints/devices.d.ts.map +1 -0
  51. package/dist/homebridge-ui/endpoints/devices.js +144 -0
  52. package/dist/homebridge-ui/endpoints/devices.js.map +1 -0
  53. package/dist/homebridge-ui/endpoints/discovery.d.ts +7 -0
  54. package/dist/homebridge-ui/endpoints/discovery.d.ts.map +1 -0
  55. package/dist/homebridge-ui/endpoints/discovery.js +219 -0
  56. package/dist/homebridge-ui/endpoints/discovery.js.map +1 -0
  57. package/dist/homebridge-ui/errors.js +32 -0
  58. package/dist/homebridge-ui/errors.js.map +1 -0
  59. package/dist/homebridge-ui/homebridge-ui/endpoints/config.js +90 -0
  60. package/dist/homebridge-ui/homebridge-ui/endpoints/config.js.map +1 -0
  61. package/dist/homebridge-ui/homebridge-ui/endpoints/devices.js +144 -0
  62. package/dist/homebridge-ui/homebridge-ui/endpoints/devices.js.map +1 -0
  63. package/dist/homebridge-ui/homebridge-ui/endpoints/discovery.js +219 -0
  64. package/dist/homebridge-ui/homebridge-ui/endpoints/discovery.js.map +1 -0
  65. package/dist/homebridge-ui/homebridge-ui/server.js +11 -0
  66. package/dist/homebridge-ui/homebridge-ui/server.js.map +1 -0
  67. package/dist/homebridge-ui/homebridge-ui/utils/config-parser.js +108 -0
  68. package/dist/homebridge-ui/homebridge-ui/utils/config-parser.js.map +1 -0
  69. package/dist/homebridge-ui/homebridge-ui/utils/device-migration.js +111 -0
  70. package/dist/homebridge-ui/homebridge-ui/utils/device-migration.js.map +1 -0
  71. package/dist/homebridge-ui/homebridge-ui/utils/logger.js +17 -0
  72. package/dist/homebridge-ui/homebridge-ui/utils/logger.js.map +1 -0
  73. package/dist/homebridge-ui/public/css/styles.css +483 -0
  74. package/dist/homebridge-ui/public/index.html +197 -621
  75. package/dist/homebridge-ui/public/js/advanced-settings.d.ts +3 -0
  76. package/dist/homebridge-ui/public/js/advanced-settings.d.ts.map +1 -0
  77. package/dist/homebridge-ui/public/js/advanced-settings.js +95 -0
  78. package/dist/homebridge-ui/public/js/advanced-settings.js.map +1 -0
  79. package/dist/homebridge-ui/public/js/advanced-settings.ts +94 -0
  80. package/dist/homebridge-ui/public/js/api.d.ts +66 -0
  81. package/dist/homebridge-ui/public/js/api.d.ts.map +1 -0
  82. package/dist/homebridge-ui/public/js/api.js +295 -0
  83. package/dist/homebridge-ui/public/js/api.js.map +1 -0
  84. package/dist/homebridge-ui/public/js/api.ts +355 -0
  85. package/dist/homebridge-ui/public/js/app.d.ts +2 -0
  86. package/dist/homebridge-ui/public/js/app.d.ts.map +1 -0
  87. package/dist/homebridge-ui/public/js/app.js +3722 -0
  88. package/dist/homebridge-ui/public/js/app.js.map +7 -0
  89. package/dist/homebridge-ui/public/js/app.ts +22 -0
  90. package/dist/homebridge-ui/public/js/constants.d.ts +2 -0
  91. package/dist/homebridge-ui/public/js/constants.d.ts.map +1 -0
  92. package/dist/homebridge-ui/public/js/constants.js +2 -0
  93. package/dist/homebridge-ui/public/js/constants.js.map +1 -0
  94. package/dist/homebridge-ui/public/js/constants.ts +1 -0
  95. package/dist/homebridge-ui/public/js/credentials.d.ts +3 -0
  96. package/dist/homebridge-ui/public/js/credentials.d.ts.map +1 -0
  97. package/dist/homebridge-ui/public/js/credentials.js +99 -0
  98. package/dist/homebridge-ui/public/js/credentials.js.map +1 -0
  99. package/dist/homebridge-ui/public/js/credentials.ts +105 -0
  100. package/dist/homebridge-ui/public/js/devices-delete.d.ts +3 -0
  101. package/dist/homebridge-ui/public/js/devices-delete.d.ts.map +1 -0
  102. package/dist/homebridge-ui/public/js/devices-delete.js +199 -0
  103. package/dist/homebridge-ui/public/js/devices-delete.js.map +1 -0
  104. package/dist/homebridge-ui/public/js/devices-delete.ts +227 -0
  105. package/dist/homebridge-ui/public/js/devices.d.ts +9 -0
  106. package/dist/homebridge-ui/public/js/devices.d.ts.map +1 -0
  107. package/dist/homebridge-ui/public/js/devices.js +98 -0
  108. package/dist/homebridge-ui/public/js/devices.js.map +1 -0
  109. package/dist/homebridge-ui/public/js/devices.ts +106 -0
  110. package/dist/homebridge-ui/public/js/discovery.d.ts +9 -0
  111. package/dist/homebridge-ui/public/js/discovery.d.ts.map +1 -0
  112. package/dist/homebridge-ui/public/js/discovery.js +1201 -0
  113. package/dist/homebridge-ui/public/js/discovery.js.map +1 -0
  114. package/dist/homebridge-ui/public/js/discovery.ts +1335 -0
  115. package/dist/homebridge-ui/public/js/logger.d.ts +7 -0
  116. package/dist/homebridge-ui/public/js/logger.d.ts.map +1 -0
  117. package/dist/homebridge-ui/public/js/logger.js +17 -0
  118. package/dist/homebridge-ui/public/js/logger.js.map +1 -0
  119. package/dist/homebridge-ui/public/js/logger.ts +17 -0
  120. package/dist/homebridge-ui/public/js/modal.d.ts +5 -0
  121. package/dist/homebridge-ui/public/js/modal.d.ts.map +1 -0
  122. package/dist/homebridge-ui/public/js/modal.js +35 -0
  123. package/dist/homebridge-ui/public/js/modal.js.map +1 -0
  124. package/dist/homebridge-ui/public/js/modal.ts +35 -0
  125. package/dist/homebridge-ui/public/js/modals.d.ts +15 -0
  126. package/dist/homebridge-ui/public/js/modals.d.ts.map +1 -0
  127. package/dist/homebridge-ui/public/js/modals.js +675 -0
  128. package/dist/homebridge-ui/public/js/modals.js.map +1 -0
  129. package/dist/homebridge-ui/public/js/modals.ts +765 -0
  130. package/dist/homebridge-ui/public/js/render.d.ts +71 -0
  131. package/dist/homebridge-ui/public/js/render.d.ts.map +1 -0
  132. package/dist/homebridge-ui/public/js/render.js +960 -0
  133. package/dist/homebridge-ui/public/js/render.js.map +1 -0
  134. package/dist/homebridge-ui/public/js/render.ts +1084 -0
  135. package/dist/homebridge-ui/public/js/toast.d.ts +6 -0
  136. package/dist/homebridge-ui/public/js/toast.d.ts.map +1 -0
  137. package/dist/homebridge-ui/public/js/toast.js +38 -0
  138. package/dist/homebridge-ui/public/js/toast.js.map +1 -0
  139. package/dist/homebridge-ui/public/js/toast.ts +44 -0
  140. package/dist/homebridge-ui/public/js/types.d.ts +23 -0
  141. package/dist/homebridge-ui/public/js/types.d.ts.map +1 -0
  142. package/dist/homebridge-ui/public/js/types.js +2 -0
  143. package/dist/homebridge-ui/public/js/types.js.map +1 -0
  144. package/dist/homebridge-ui/public/js/types.ts +26 -0
  145. package/dist/homebridge-ui/server.d.ts +1 -3
  146. package/dist/homebridge-ui/server.d.ts.map +1 -1
  147. package/dist/homebridge-ui/server.js +8 -471
  148. package/dist/homebridge-ui/server.js.map +1 -1
  149. package/dist/homebridge-ui/settings.js +8 -0
  150. package/dist/homebridge-ui/settings.js.map +1 -0
  151. package/dist/homebridge-ui/switchbotClient.js +247 -0
  152. package/dist/homebridge-ui/switchbotClient.js.map +1 -0
  153. package/dist/homebridge-ui/utils/config-parser.d.ts +39 -0
  154. package/dist/homebridge-ui/utils/config-parser.d.ts.map +1 -0
  155. package/dist/homebridge-ui/utils/config-parser.js +108 -0
  156. package/dist/homebridge-ui/utils/config-parser.js.map +1 -0
  157. package/dist/homebridge-ui/utils/device-migration.d.ts +35 -0
  158. package/dist/homebridge-ui/utils/device-migration.d.ts.map +1 -0
  159. package/dist/homebridge-ui/utils/device-migration.js +111 -0
  160. package/dist/homebridge-ui/utils/device-migration.js.map +1 -0
  161. package/dist/homebridge-ui/utils/logger.d.ts +7 -0
  162. package/dist/homebridge-ui/utils/logger.d.ts.map +1 -0
  163. package/dist/homebridge-ui/utils/logger.js +17 -0
  164. package/dist/homebridge-ui/utils/logger.js.map +1 -0
  165. package/dist/index.d.ts +10 -0
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +12 -2
  168. package/dist/index.js.map +1 -1
  169. package/dist/settings.d.ts +1 -0
  170. package/dist/settings.d.ts.map +1 -1
  171. package/dist/settings.js +1 -0
  172. package/dist/settings.js.map +1 -1
  173. package/dist/switchbotClient.d.ts +12 -10
  174. package/dist/switchbotClient.d.ts.map +1 -1
  175. package/dist/switchbotClient.js +156 -103
  176. package/dist/switchbotClient.js.map +1 -1
  177. package/dist/utils.d.ts +76 -1
  178. package/dist/utils.d.ts.map +1 -1
  179. package/dist/utils.js +1121 -4
  180. package/dist/utils.js.map +1 -1
  181. package/docs/assets/highlight.css +16 -2
  182. package/docs/assets/main.js +1 -1
  183. package/docs/index.html +82 -5
  184. package/docs/variables/default.html +3 -1
  185. package/eslint.config.js +9 -5
  186. package/nodemon.json +2 -2
  187. package/package.json +34 -21
  188. package/scripts/build-ui.js +37 -0
  189. package/scripts/free-dev-ports.mjs +105 -0
  190. package/scripts/generate-matter-maps.js +34 -17
  191. package/scripts/sync-device-types.mjs +31 -0
  192. package/src/SwitchBotHAPPlatform.ts +558 -0
  193. package/src/SwitchBotMatterPlatform.ts +538 -0
  194. package/src/device-types.js +246 -0
  195. package/src/device-types.js.map +1 -0
  196. package/src/device-types.ts +261 -0
  197. package/src/deviceCommandMapper.js +319 -0
  198. package/src/deviceCommandMapper.js.map +1 -0
  199. package/src/deviceCommandMapper.ts +333 -0
  200. package/src/deviceFactory.ts +125 -45
  201. package/src/devices/genericDevice.ts +411 -69
  202. package/src/errors.js +32 -0
  203. package/src/errors.js.map +1 -0
  204. package/src/errors.ts +35 -0
  205. package/src/homebridge-ui/endpoints/config.ts +110 -0
  206. package/src/homebridge-ui/endpoints/devices.ts +153 -0
  207. package/src/homebridge-ui/endpoints/discovery.ts +240 -0
  208. package/src/homebridge-ui/public/css/styles.css +483 -0
  209. package/src/homebridge-ui/public/index.html +197 -621
  210. package/src/homebridge-ui/public/js/advanced-settings.ts +94 -0
  211. package/src/homebridge-ui/public/js/api.ts +355 -0
  212. package/src/homebridge-ui/public/js/app.ts +22 -0
  213. package/src/homebridge-ui/public/js/constants.ts +1 -0
  214. package/src/homebridge-ui/public/js/credentials.ts +105 -0
  215. package/src/homebridge-ui/public/js/devices-delete.ts +227 -0
  216. package/src/homebridge-ui/public/js/devices.ts +106 -0
  217. package/src/homebridge-ui/public/js/discovery.ts +1335 -0
  218. package/src/homebridge-ui/public/js/logger.ts +17 -0
  219. package/src/homebridge-ui/public/js/modal.ts +35 -0
  220. package/src/homebridge-ui/public/js/modals.ts +765 -0
  221. package/src/homebridge-ui/public/js/render.ts +1084 -0
  222. package/src/homebridge-ui/public/js/toast.ts +44 -0
  223. package/src/homebridge-ui/public/js/types.ts +26 -0
  224. package/src/homebridge-ui/server.ts +9 -554
  225. package/src/homebridge-ui/utils/config-parser.ts +125 -0
  226. package/src/homebridge-ui/utils/device-migration.ts +144 -0
  227. package/src/homebridge-ui/utils/logger.ts +17 -0
  228. package/src/index.ts +12 -2
  229. package/src/settings.js +8 -0
  230. package/src/settings.js.map +1 -0
  231. package/src/settings.ts +2 -0
  232. package/src/switchbotClient.js +247 -0
  233. package/src/switchbotClient.js.map +1 -0
  234. package/src/switchbotClient.ts +177 -114
  235. package/src/utils.ts +1133 -5
  236. package/test/client/switchbot-client-debounce.spec.ts +35 -0
  237. package/test/client/switchbot-client-openapi.spec.ts +19 -0
  238. package/test/client/switchbotClient.spec.ts +64 -0
  239. package/test/device/device-mapping.spec.ts +23 -0
  240. package/test/device/deviceBase.spec.ts +26 -0
  241. package/test/device/deviceFactory-edge.spec.ts +15 -0
  242. package/test/device/deviceFactory.spec.ts +33 -0
  243. package/test/device/fan-swing.spec.ts +34 -0
  244. package/test/device/genericDevice-blepoll.spec.ts +47 -0
  245. package/test/device/irdevice.spec.ts +9 -0
  246. package/test/device/lock-users.spec.ts +35 -0
  247. package/test/device/matter-descriptors.spec.ts +22 -0
  248. package/test/device/matter-device-state.spec.ts +37 -0
  249. package/test/e2e/run-e2e.spec.ts +18 -19
  250. package/test/errors/errors.spec.ts +10 -0
  251. package/test/helpers/matter-harness.ts +20 -9
  252. package/test/homebridge-ui/server.spec.ts +9 -0
  253. package/test/platform/accessory-restore.spec.ts +37 -0
  254. package/test/platform/matter-childbridge.spec.ts +34 -0
  255. package/test/platform/matter-integration.spec.ts +33 -0
  256. package/test/platform/platform-edge.spec.ts +73 -0
  257. package/test/platform/platform.integration.spec.ts +34 -0
  258. package/test/utils/utils-extra.spec.ts +10 -0
  259. package/test/utils/utils.spec.ts +53 -0
  260. package/todo/TODO.md +80 -0
  261. package/tsconfig.ui.json +11 -0
  262. package/.github/npm-version-script-esm.js +0 -97
  263. package/.github/workflows/beta-release.yml +0 -52
  264. package/dist/platform.d.ts +0 -35
  265. package/dist/platform.d.ts.map +0 -1
  266. package/dist/platform.js +0 -945
  267. package/dist/platform.js.map +0 -1
  268. package/src/platform.ts +0 -963
  269. package/test/accessory-restore.spec.ts +0 -73
  270. package/test/device-mapping.spec.ts +0 -37
  271. package/test/deviceFactory.spec.ts +0 -18
  272. package/test/fan-swing.spec.ts +0 -29
  273. package/test/lock-users.spec.ts +0 -44
  274. package/test/matter-childbridge.spec.ts +0 -55
  275. package/test/matter-descriptors.spec.ts +0 -97
  276. package/test/matter-device-state.spec.ts +0 -101
  277. package/test/matter-integration.spec.ts +0 -70
  278. package/test/platform.integration.spec.ts +0 -55
  279. package/test/switchbot-client-debounce.spec.ts +0 -131
  280. package/test/switchbot-client-openapi.spec.ts +0 -56
  281. package/test/switchbotClient.spec.ts +0 -10
  282. package/test/utils.spec.ts +0 -20
@@ -1,35 +1,39 @@
1
- import type { SwitchBotPluginConfig, DeviceType } from './settings.js'
2
- import { SwitchBotClient } from './switchbotClient.js'
1
+ import type { Logger } from 'homebridge'
2
+
3
+ import type { DeviceType, SwitchBotPluginConfig } from './settings.js'
4
+
5
+ import { DEVICE_TYPE_NORMALIZATION_MAP } from './device-types.js'
3
6
  import {
4
- GenericDevice,
7
+ BlindTiltDevice,
5
8
  BotDevice,
9
+ ContactSensorDevice,
10
+ Curtain3Device,
6
11
  CurtainDevice,
7
12
  FanDevice,
13
+ GenericDevice,
14
+ Hub2Device,
15
+ HumidifierDevice,
8
16
  LightDevice,
9
17
  LightStripDevice,
10
- MotionSensorDevice,
11
- ContactSensorDevice,
12
- VacuumDevice,
13
18
  LockDevice,
14
- HumidifierDevice,
15
- TemperatureSensorDevice,
16
- RelaySwitchDevice,
17
- RelaySwitch1PMDevice,
19
+ MeterDevice,
20
+ MotionSensorDevice,
18
21
  PlugDevice,
19
22
  PlugMiniDevice,
20
- BlindTiltDevice,
21
- Curtain3Device,
23
+ RelaySwitch1PMDevice,
24
+ RelaySwitchDevice,
22
25
  RollerShadeDevice,
23
- Hub2Device,
24
- MeterDevice,
25
- WaterDetectorDevice,
26
26
  SmartFanDevice,
27
27
  StripLightDevice,
28
+ TemperatureSensorDevice,
29
+ VacuumDevice,
28
30
  WalletFinderDevice,
31
+ WaterDetectorDevice,
29
32
  WoSweeperDevice,
30
33
  WoSweeperMiniDevice,
31
34
  WoSweeperMiniProDevice,
32
35
  } from './devices/genericDevice.js'
36
+ import { SwitchBotClient } from './switchbotClient.js'
33
37
 
34
38
  export interface DeviceOptions {
35
39
  id: string
@@ -39,52 +43,110 @@ export interface DeviceOptions {
39
43
  }
40
44
 
41
45
  const DEVICE_CLASS_MAP: Record<string, any> = {
42
- bot: BotDevice,
43
- curtain: CurtainDevice,
44
- fan: FanDevice,
45
- light: LightDevice,
46
- lightstrip: LightStripDevice,
47
- motion: MotionSensorDevice,
48
- contact: ContactSensorDevice,
49
- vacuum: VacuumDevice,
50
- lock: LockDevice,
51
- humidifier: HumidifierDevice,
52
- temperature: TemperatureSensorDevice,
53
- 'relay switch 1': RelaySwitchDevice,
54
- 'relay switch 1pm': RelaySwitch1PMDevice,
55
- plug: PlugDevice,
46
+ // Primary device type keys (lowercase, simplified)
47
+ 'bot': BotDevice,
48
+ 'curtain': CurtainDevice,
49
+ 'curtain3': Curtain3Device,
50
+ 'fan': FanDevice,
51
+ 'light': LightDevice,
52
+ 'lightstrip': LightStripDevice,
53
+ 'motion': MotionSensorDevice,
54
+ 'contact': ContactSensorDevice,
55
+ 'vacuum': VacuumDevice,
56
+ // Canonical, normalized device type keys (lowercase, mapped to device classes)
57
+ 'video doorbell': GenericDevice,
58
+ 'smart radiator thermostat': GenericDevice,
59
+ 'woiosensor': GenericDevice,
60
+ 'garage door opener': GenericDevice,
61
+ 'air purifier table pm2.5': GenericDevice,
62
+ 'air purifier voc': GenericDevice,
63
+ 'air purifier table voc': GenericDevice,
64
+ 'meterplus': MeterDevice,
65
+ 'meterpro': MeterDevice,
66
+ 'meterpro(co2)': MeterDevice,
67
+ 'walletfinder': WalletFinderDevice,
68
+ 'plug': PlugDevice,
69
+ 'plug mini (eu)': PlugMiniDevice,
56
70
  'plug mini (jp)': PlugMiniDevice,
57
71
  'plug mini (us)': PlugMiniDevice,
72
+ 'relay switch 1pm': RelaySwitch1PMDevice,
73
+ 'relay switch 2pm': RelaySwitch1PMDevice,
74
+ 'k10+ pro': WoSweeperDevice,
75
+ 'robot vacuum cleaner k10+ pro combo': WoSweeperDevice,
76
+ 'robot vacuum cleaner k11+': WoSweeperDevice,
77
+ 'robot vacuum cleaner k20 plus pro': WoSweeperDevice,
78
+ 'ai hub': GenericDevice,
79
+ 'hub': GenericDevice,
80
+ 'hub 2': Hub2Device,
81
+ 'hub 3': GenericDevice,
82
+ 'hub mini': GenericDevice,
83
+ 'hub plus': GenericDevice,
84
+ 'indoor cam': GenericDevice,
85
+ 'pan/tilt cam': GenericDevice,
86
+ 'pan/tilt cam 2k': GenericDevice,
87
+ 'pan/tilt cam plus 2k': GenericDevice,
88
+ 'pan/tilt cam plus 3k': GenericDevice,
89
+ 'humidifier': HumidifierDevice, // Includes evaporative humidifier mapping
90
+ 'roller shade': RollerShadeDevice,
91
+ 'strip light 3': StripLightDevice,
92
+ 'circulator fan': FanDevice,
93
+ 'smart lock pro': LockDevice,
94
+ 'lock lite': LockDevice,
95
+ 'keypad': LockDevice,
96
+ 'lock vision pro': LockDevice,
97
+ 'floor lamp': LightDevice,
98
+ 'rgbicww floor lamp': LightStripDevice,
99
+ 'rgbicww strip light': LightStripDevice,
100
+ 'home climate panel': GenericDevice, // Climate panel family
101
+ 'lock': LockDevice,
102
+ 'humidifier2': HumidifierDevice,
103
+ 'temperature': TemperatureSensorDevice,
104
+ 'relay switch 1': RelaySwitchDevice,
58
105
  'blind tilt': BlindTiltDevice,
59
- curtain3: Curtain3Device,
60
106
  'worollershade': RollerShadeDevice,
61
107
  'wo rollershade': RollerShadeDevice,
62
- 'roller shade': RollerShadeDevice,
63
108
  'rollershade': RollerShadeDevice,
64
- 'hub 2': Hub2Device,
65
- meter: MeterDevice,
66
- 'meterplus': MeterDevice,
109
+ 'meter': MeterDevice,
67
110
  'meter plus (jp)': MeterDevice,
68
- 'meterpro': MeterDevice,
69
- 'meterpro(co2)': MeterDevice,
70
111
  'water detector': WaterDetectorDevice,
71
112
  'smart fan': SmartFanDevice,
72
113
  'strip light': StripLightDevice,
73
- 'walletfinder': WalletFinderDevice,
74
114
  'wosweeper': WoSweeperDevice,
75
115
  'wosweepermini': WoSweeperMiniDevice,
76
116
  'wosweeperminipro': WoSweeperMiniProDevice,
77
117
  'k10+': WoSweeperDevice,
78
- 'k10+ pro': WoSweeperDevice,
79
118
  'k10+ pro (wosweeperminipro)': WoSweeperMiniProDevice,
119
+ 'battery circulator fan': FanDevice,
120
+ 'standing circulator fan': FanDevice,
121
+ 'smart lock': LockDevice,
122
+ 'smart lock ultra': LockDevice,
123
+ 'keypad touch': LockDevice,
124
+ 'keypad vision': LockDevice,
125
+ 'keypad vision pro': LockDevice,
126
+ 'color bulb': LightDevice,
127
+ 'ceiling light': LightDevice,
128
+ 'ceiling light pro': LightDevice,
129
+ 'candle warmer lamp': LightDevice,
130
+ 'rgbic neon rope light': LightStripDevice,
131
+ 'rgbic neon wire rope light': LightStripDevice,
132
+ 'robot vacuum cleaner s1': VacuumDevice,
133
+ 'robot vacuum cleaner s1 plus': VacuumDevice,
134
+ 'robot vacuum cleaner s10': VacuumDevice,
135
+ 'robot vacuum cleaner s20': VacuumDevice,
80
136
  }
81
137
 
82
138
  function classForType(type: string) {
83
- const key = (type || '').toLowerCase()
139
+ const rawKey = (type || '').toLowerCase()
140
+ const key = DEVICE_TYPE_NORMALIZATION_MAP[rawKey] ?? rawKey
84
141
  return DEVICE_CLASS_MAP[key] ?? GenericDevice
85
142
  }
86
143
 
87
- export async function createDevice(opts: DeviceOptions, cfg: SwitchBotPluginConfig, useMatter: boolean) {
144
+ export async function createDevice(opts: DeviceOptions, cfg: SwitchBotPluginConfig, useMatter: boolean, log?: Logger) {
145
+ // Always pass the logger to both device opts and config
146
+ const logger = log || (cfg as any)?.logger || (cfg as any)?.log
147
+ if (opts && opts.name && logger && typeof logger.info === 'function') {
148
+ logger.info(`[Matter/Debug] createDevice: Passing opts for ${opts.name}:`, JSON.stringify(opts, null, 2))
149
+ }
88
150
  // Reuse existing client when provided via config to avoid creating
89
151
  // a new SwitchBotClient per device (which can be expensive).
90
152
  let client: any = (cfg as any)?._client ?? null
@@ -92,12 +154,26 @@ export async function createDevice(opts: DeviceOptions, cfg: SwitchBotPluginConf
92
154
  client = new SwitchBotClient(cfg)
93
155
  await client.init()
94
156
  }
95
-
96
157
  // Pass client via config so devices can access it
97
158
  const mergedCfg = { ...(cfg as any), _client: client }
98
-
159
+ // Always pass logger to mergedCfg
160
+ if (logger) {
161
+ mergedCfg.log = logger
162
+ }
163
+ // Pass encryptionKey and keyId to device opts if present
164
+ const deviceOpts = { ...opts }
165
+ if (opts.encryptionKey) {
166
+ deviceOpts.encryptionKey = opts.encryptionKey
167
+ }
168
+ if (opts.keyId) {
169
+ deviceOpts.keyId = opts.keyId
170
+ }
171
+ // Always pass logger to deviceOpts
172
+ if (logger) {
173
+ deviceOpts.log = logger
174
+ }
99
175
  const DeviceCtor = classForType(opts.type)
100
- const device = new DeviceCtor(opts, mergedCfg)
176
+ const device = new DeviceCtor(deviceOpts, mergedCfg)
101
177
  await device.init()
102
178
 
103
179
  // Attach a simple getState delegator to the client where appropriate
@@ -106,7 +182,9 @@ export async function createDevice(opts: DeviceOptions, cfg: SwitchBotPluginConf
106
182
  try {
107
183
  // Prefer client-backed getDevice when available
108
184
  const dev = await client.getDevice(opts.id)
109
- if (dev) return dev
185
+ if (dev) {
186
+ return dev
187
+ }
110
188
  } catch (e) {
111
189
  // ignore and fallback to device implementation
112
190
  }
@@ -116,7 +194,9 @@ export async function createDevice(opts: DeviceOptions, cfg: SwitchBotPluginConf
116
194
  // Provide accessory factory based on platform selection
117
195
  return {
118
196
  instance: device,
119
- createAccessory: (api: any) => (useMatter ? device.createMatterAccessory(api) : device.createHAPAccessory(api)),
197
+ createAccessory: useMatter
198
+ ? async (api: any) => await device.createMatterAccessory(api)
199
+ : (api: any) => device.createHAPAccessory(api),
120
200
  protocol: useMatter ? 'matter' : 'hap',
121
201
  }
122
202
  }