node-switchbot 4.0.0-beta.11 → 4.0.0-beta.12

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 (261) hide show
  1. package/dist/ble.d.ts +10 -0
  2. package/dist/ble.d.ts.map +1 -1
  3. package/dist/ble.js +69 -3
  4. package/dist/ble.js.map +1 -1
  5. package/dist/devices/index.d.ts +7 -0
  6. package/dist/devices/index.d.ts.map +1 -1
  7. package/dist/devices/index.js +7 -0
  8. package/dist/devices/index.js.map +1 -1
  9. package/dist/devices/wo-ai-hub.d.ts +6 -0
  10. package/dist/devices/wo-ai-hub.d.ts.map +1 -0
  11. package/dist/devices/wo-ai-hub.js +7 -0
  12. package/dist/devices/wo-ai-hub.js.map +1 -0
  13. package/dist/devices/wo-air-purifier-pm25.d.ts +6 -0
  14. package/dist/devices/wo-air-purifier-pm25.d.ts.map +1 -0
  15. package/dist/devices/wo-air-purifier-pm25.js +7 -0
  16. package/dist/devices/wo-air-purifier-pm25.js.map +1 -0
  17. package/dist/devices/wo-air-purifier.d.ts +17 -0
  18. package/dist/devices/wo-air-purifier.d.ts.map +1 -1
  19. package/dist/devices/wo-air-purifier.js +74 -9
  20. package/dist/devices/wo-air-purifier.js.map +1 -1
  21. package/dist/devices/wo-blind-tilt.d.ts +1 -0
  22. package/dist/devices/wo-blind-tilt.d.ts.map +1 -1
  23. package/dist/devices/wo-blind-tilt.js +41 -2
  24. package/dist/devices/wo-blind-tilt.js.map +1 -1
  25. package/dist/devices/wo-bulb.d.ts +27 -1
  26. package/dist/devices/wo-bulb.d.ts.map +1 -1
  27. package/dist/devices/wo-bulb.js +124 -34
  28. package/dist/devices/wo-bulb.js.map +1 -1
  29. package/dist/devices/wo-candle-warmer-lamp.d.ts +6 -0
  30. package/dist/devices/wo-candle-warmer-lamp.d.ts.map +1 -0
  31. package/dist/devices/wo-candle-warmer-lamp.js +7 -0
  32. package/dist/devices/wo-candle-warmer-lamp.js.map +1 -0
  33. package/dist/devices/wo-curtain.d.ts +17 -1
  34. package/dist/devices/wo-curtain.d.ts.map +1 -1
  35. package/dist/devices/wo-curtain.js +106 -2
  36. package/dist/devices/wo-curtain.js.map +1 -1
  37. package/dist/devices/wo-humi.d.ts +16 -0
  38. package/dist/devices/wo-humi.d.ts.map +1 -1
  39. package/dist/devices/wo-humi.js +39 -0
  40. package/dist/devices/wo-humi.js.map +1 -1
  41. package/dist/devices/wo-humi2.d.ts +0 -12
  42. package/dist/devices/wo-humi2.d.ts.map +1 -1
  43. package/dist/devices/wo-humi2.js +0 -18
  44. package/dist/devices/wo-humi2.js.map +1 -1
  45. package/dist/devices/wo-pan-tilt-cam-plus-3k.d.ts +6 -0
  46. package/dist/devices/wo-pan-tilt-cam-plus-3k.d.ts.map +1 -0
  47. package/dist/devices/wo-pan-tilt-cam-plus-3k.js +7 -0
  48. package/dist/devices/wo-pan-tilt-cam-plus-3k.js.map +1 -0
  49. package/dist/devices/wo-relay-switch-1.d.ts +14 -0
  50. package/dist/devices/wo-relay-switch-1.d.ts.map +1 -1
  51. package/dist/devices/wo-relay-switch-1.js +47 -10
  52. package/dist/devices/wo-relay-switch-1.js.map +1 -1
  53. package/dist/devices/wo-relay-switch-2pm.d.ts.map +1 -1
  54. package/dist/devices/wo-relay-switch-2pm.js +4 -6
  55. package/dist/devices/wo-relay-switch-2pm.js.map +1 -1
  56. package/dist/devices/wo-remote-with-screen.d.ts +6 -0
  57. package/dist/devices/wo-remote-with-screen.d.ts.map +1 -0
  58. package/dist/devices/wo-remote-with-screen.js +7 -0
  59. package/dist/devices/wo-remote-with-screen.js.map +1 -0
  60. package/dist/devices/wo-rgbic-neon-wire-rope-light.d.ts +6 -0
  61. package/dist/devices/wo-rgbic-neon-wire-rope-light.d.ts.map +1 -0
  62. package/dist/devices/wo-rgbic-neon-wire-rope-light.js +7 -0
  63. package/dist/devices/wo-rgbic-neon-wire-rope-light.js.map +1 -0
  64. package/dist/devices/wo-water-detector.d.ts +6 -0
  65. package/dist/devices/wo-water-detector.d.ts.map +1 -0
  66. package/dist/devices/wo-water-detector.js +7 -0
  67. package/dist/devices/wo-water-detector.js.map +1 -0
  68. package/dist/errors.d.ts +20 -0
  69. package/dist/errors.d.ts.map +1 -1
  70. package/dist/errors.js +31 -1
  71. package/dist/errors.js.map +1 -1
  72. package/dist/index.d.ts +2 -2
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +1 -1
  75. package/dist/index.js.map +1 -1
  76. package/dist/settings.d.ts +1 -0
  77. package/dist/settings.d.ts.map +1 -1
  78. package/dist/settings.js +10 -0
  79. package/dist/settings.js.map +1 -1
  80. package/dist/switchbot.d.ts.map +1 -1
  81. package/dist/switchbot.js +14 -0
  82. package/dist/switchbot.js.map +1 -1
  83. package/dist/types/device.d.ts +25 -0
  84. package/dist/types/device.d.ts.map +1 -1
  85. package/dist/utils/index.d.ts +5 -0
  86. package/dist/utils/index.d.ts.map +1 -1
  87. package/dist/utils/index.js +9 -0
  88. package/dist/utils/index.js.map +1 -1
  89. package/dist/utils/relay-encryption.d.ts +10 -0
  90. package/dist/utils/relay-encryption.d.ts.map +1 -0
  91. package/dist/utils/relay-encryption.js +23 -0
  92. package/dist/utils/relay-encryption.js.map +1 -0
  93. package/dist/utils/retry.d.ts.map +1 -1
  94. package/dist/utils/retry.js +49 -6
  95. package/dist/utils/retry.js.map +1 -1
  96. package/docs/assets/hierarchy.js +1 -1
  97. package/docs/assets/navigation.js +1 -1
  98. package/docs/assets/search.js +1 -1
  99. package/docs/classes/APIError.html +2 -2
  100. package/docs/classes/APINotAvailableError.html +2 -2
  101. package/docs/classes/BLEConnection.html +11 -9
  102. package/docs/classes/BLENotAvailableError.html +2 -2
  103. package/docs/classes/BLEScanner.html +9 -9
  104. package/docs/classes/CommandFailedError.html +2 -2
  105. package/docs/classes/ConnectionTimeoutError.html +2 -2
  106. package/docs/classes/DeviceManager.html +13 -13
  107. package/docs/classes/DeviceNotFoundError.html +2 -2
  108. package/docs/classes/DeviceOverrideStateDuringConnection.html +28 -28
  109. package/docs/classes/DiscoveryError.html +2 -2
  110. package/docs/classes/OpenAPIClient.html +24 -24
  111. package/docs/classes/SequenceDevice.html +29 -29
  112. package/docs/classes/SwitchBot.html +11 -11
  113. package/docs/classes/SwitchBotDevice.html +28 -28
  114. package/docs/classes/SwitchBotError.html +2 -2
  115. package/docs/classes/ValidationError.html +2 -2
  116. package/docs/classes/WoAIHub.html +56 -0
  117. package/docs/classes/WoAirPurifier.html +38 -33
  118. package/docs/classes/WoAirPurifierPM25.html +56 -0
  119. package/docs/classes/WoAirPurifierTable.html +38 -33
  120. package/docs/classes/WoArtFrame.html +46 -35
  121. package/docs/classes/WoBlindTilt.html +36 -34
  122. package/docs/classes/WoBulb.html +46 -35
  123. package/docs/classes/WoCandleWarmerLamp.html +56 -0
  124. package/docs/classes/WoCeilingLight.html +46 -35
  125. package/docs/classes/WoCirculatorFan.html +38 -33
  126. package/docs/classes/WoClimatePanel.html +38 -33
  127. package/docs/classes/WoContact.html +28 -28
  128. package/docs/classes/WoCurtain.html +43 -32
  129. package/docs/classes/WoFloorLamp.html +46 -35
  130. package/docs/classes/WoGarageDoorOpener.html +35 -32
  131. package/docs/classes/WoHand.html +38 -38
  132. package/docs/classes/WoHub2.html +28 -28
  133. package/docs/classes/WoHub3.html +28 -28
  134. package/docs/classes/WoHubMiniMatter.html +28 -28
  135. package/docs/classes/WoHumi.html +40 -32
  136. package/docs/classes/WoHumi2.html +40 -38
  137. package/docs/classes/WoIOSensorTH.html +28 -28
  138. package/docs/classes/WoKeypad.html +28 -28
  139. package/docs/classes/WoKeypadVision.html +28 -28
  140. package/docs/classes/WoKeypadVisionPro.html +28 -28
  141. package/docs/classes/WoLeak.html +28 -28
  142. package/docs/classes/WoPanTiltCamPlus3K.html +56 -0
  143. package/docs/classes/WoPlugMiniJP.html +31 -31
  144. package/docs/classes/WoPlugMiniUS.html +31 -31
  145. package/docs/classes/WoPresence.html +28 -28
  146. package/docs/classes/WoRGBICBulb.html +48 -37
  147. package/docs/classes/WoRGBICNeonWireRopeLight.html +56 -0
  148. package/docs/classes/WoRGBICWWFloorLamp.html +48 -37
  149. package/docs/classes/WoRGBICWWStripLight.html +48 -37
  150. package/docs/classes/WoRelaySwitch1.html +35 -32
  151. package/docs/classes/WoRelaySwitch1PM.html +35 -32
  152. package/docs/classes/WoRelaySwitch2PM.html +37 -34
  153. package/docs/classes/WoRemote.html +28 -28
  154. package/docs/classes/WoRemoteWithScreen.html +56 -0
  155. package/docs/classes/WoRollerShade.html +43 -32
  156. package/docs/classes/WoSensorTH.html +28 -28
  157. package/docs/classes/WoSensorTHPlus.html +28 -28
  158. package/docs/classes/WoSensorTHPro.html +28 -28
  159. package/docs/classes/WoSensorTHProCO2.html +28 -28
  160. package/docs/classes/WoSmartLock.html +31 -31
  161. package/docs/classes/WoSmartLockLite.html +31 -31
  162. package/docs/classes/WoSmartLockPro.html +33 -33
  163. package/docs/classes/WoSmartLockProWiFi.html +33 -33
  164. package/docs/classes/WoSmartLockVision.html +31 -31
  165. package/docs/classes/WoSmartLockVisionPro.html +33 -33
  166. package/docs/classes/WoSmartThermostatRadiator.html +38 -33
  167. package/docs/classes/WoStrip.html +46 -35
  168. package/docs/classes/WoStripLight3.html +46 -35
  169. package/docs/classes/WoVacuum.html +36 -36
  170. package/docs/classes/WoVacuumK10Plus.html +36 -36
  171. package/docs/classes/WoVacuumK10Pro.html +36 -36
  172. package/docs/classes/WoVacuumK10ProCombo.html +36 -36
  173. package/docs/classes/WoVacuumK11Plus.html +36 -36
  174. package/docs/classes/WoVacuumK20.html +36 -36
  175. package/docs/classes/WoVacuumS10.html +36 -36
  176. package/docs/classes/WoVacuumS20.html +36 -36
  177. package/docs/classes/WoWaterDetector.html +56 -0
  178. package/docs/enums/LogLevel.html +2 -2
  179. package/docs/enums/SwitchBotBLEModel.html +2 -2
  180. package/docs/enums/SwitchBotBLEModelName.html +2 -2
  181. package/docs/functions/updateBaseURL.html +1 -1
  182. package/docs/hierarchy.html +1 -1
  183. package/docs/interfaces/APICommandRequest.html +2 -2
  184. package/docs/interfaces/APICommandResponse.html +2 -2
  185. package/docs/interfaces/APIDevice.html +2 -2
  186. package/docs/interfaces/APIDeviceStatus.html +2 -2
  187. package/docs/interfaces/APIErrorResponse.html +2 -2
  188. package/docs/interfaces/APIResponse.html +2 -2
  189. package/docs/interfaces/AirPurifierCommands.html +3 -2
  190. package/docs/interfaces/AirPurifierServiceData.html +14 -14
  191. package/docs/interfaces/AirPurifierStatus.html +7 -7
  192. package/docs/interfaces/BLEAdvertisement.html +2 -2
  193. package/docs/interfaces/BLEScanOptions.html +5 -5
  194. package/docs/interfaces/BLEServiceData.html +14 -14
  195. package/docs/interfaces/BlindTiltCommands.html +2 -2
  196. package/docs/interfaces/BlindTiltServiceData.html +14 -14
  197. package/docs/interfaces/BlindTiltStatus.html +7 -6
  198. package/docs/interfaces/BotCommands.html +2 -2
  199. package/docs/interfaces/BotServiceData.html +14 -14
  200. package/docs/interfaces/BotStatus.html +6 -6
  201. package/docs/interfaces/BulbCommands.html +4 -2
  202. package/docs/interfaces/BulbServiceData.html +14 -14
  203. package/docs/interfaces/BulbStatus.html +6 -6
  204. package/docs/interfaces/CeilingLightCommands.html +4 -2
  205. package/docs/interfaces/CeilingLightServiceData.html +14 -14
  206. package/docs/interfaces/CeilingLightStatus.html +6 -6
  207. package/docs/interfaces/CommandResult.html +6 -6
  208. package/docs/interfaces/ContactServiceData.html +14 -14
  209. package/docs/interfaces/ContactStatus.html +6 -6
  210. package/docs/interfaces/CurtainCommands.html +5 -2
  211. package/docs/interfaces/CurtainExtendedInfo.html +4 -0
  212. package/docs/interfaces/CurtainServiceData.html +14 -14
  213. package/docs/interfaces/CurtainStatus.html +6 -6
  214. package/docs/interfaces/DeviceInfo.html +18 -18
  215. package/docs/interfaces/DeviceListResponse.html +2 -2
  216. package/docs/interfaces/DeviceStatus.html +6 -6
  217. package/docs/interfaces/DiscoveryOptions.html +7 -7
  218. package/docs/interfaces/HubServiceData.html +14 -14
  219. package/docs/interfaces/HubStatus.html +6 -6
  220. package/docs/interfaces/HumidifierCommands.html +6 -2
  221. package/docs/interfaces/HumidifierServiceData.html +15 -15
  222. package/docs/interfaces/HumidifierStatus.html +6 -6
  223. package/docs/interfaces/KeypadStatus.html +6 -6
  224. package/docs/interfaces/LeakServiceData.html +14 -14
  225. package/docs/interfaces/LeakStatus.html +6 -6
  226. package/docs/interfaces/LockCommands.html +2 -2
  227. package/docs/interfaces/LockServiceData.html +15 -15
  228. package/docs/interfaces/LockStatus.html +6 -6
  229. package/docs/interfaces/MeterServiceData.html +14 -14
  230. package/docs/interfaces/MeterStatus.html +6 -6
  231. package/docs/interfaces/MotionServiceData.html +14 -14
  232. package/docs/interfaces/MotionStatus.html +6 -6
  233. package/docs/interfaces/PlugCommands.html +2 -2
  234. package/docs/interfaces/PlugServiceData.html +14 -14
  235. package/docs/interfaces/PlugStatus.html +6 -6
  236. package/docs/interfaces/PresenceServiceData.html +14 -14
  237. package/docs/interfaces/PresenceStatus.html +6 -6
  238. package/docs/interfaces/RelaySwitchCommands.html +2 -2
  239. package/docs/interfaces/RelaySwitchServiceData.html +14 -14
  240. package/docs/interfaces/RelaySwitchStatus.html +6 -6
  241. package/docs/interfaces/RemoteStatus.html +6 -6
  242. package/docs/interfaces/SceneListResponse.html +2 -2
  243. package/docs/interfaces/StripCommands.html +4 -2
  244. package/docs/interfaces/StripServiceData.html +14 -14
  245. package/docs/interfaces/StripStatus.html +6 -6
  246. package/docs/interfaces/SwitchBotConfig.html +15 -15
  247. package/docs/interfaces/VacuumCommands.html +2 -2
  248. package/docs/interfaces/VacuumStatus.html +6 -6
  249. package/docs/interfaces/WebhookConfig.html +2 -2
  250. package/docs/interfaces/WebhookDetails.html +2 -2
  251. package/docs/interfaces/WebhookQueryResponse.html +2 -2
  252. package/docs/interfaces/WebhookSetupResponse.html +2 -2
  253. package/docs/modules.html +1 -1
  254. package/docs/types/ConnectionType.html +1 -1
  255. package/docs/types/PhysicalDeviceType.html +1 -1
  256. package/docs/types/VirtualDeviceType.html +1 -1
  257. package/docs/variables/urls.html +1 -1
  258. package/package.json +2 -2
  259. package/todo/PYSWITCHBOT_COMPARISON.md +4 -4
  260. package/todo/completed.md +161 -0
  261. package/todo/todo.md +54 -117
@@ -2,6 +2,7 @@
2
2
  *
3
3
  * devices/wo-curtain.ts: SwitchBot v4.0.0 - Curtain Device
4
4
  */
5
+ import { Buffer } from 'node:buffer';
5
6
  import { DEVICE_COMMANDS } from '../settings.js';
6
7
  import { clamp } from '../utils/index.js';
7
8
  import { SwitchBotDevice } from './base.js';
@@ -46,15 +47,29 @@ export class WoCurtain extends SwitchBotDevice {
46
47
  /**
47
48
  * Get device status
48
49
  */
50
+ _lastPosition;
49
51
  async getStatus() {
50
52
  try {
53
+ let direction;
54
+ let position = 0;
51
55
  // Try API first if available
52
56
  if (this.hasAPI()) {
53
57
  const apiStatus = await this.getAPIStatus();
58
+ position = typeof apiStatus.slidePosition === 'number' ? apiStatus.slidePosition : 0;
59
+ if (typeof this._lastPosition === 'number') {
60
+ if (position > this._lastPosition) {
61
+ direction = 'opening';
62
+ }
63
+ else if (position < this._lastPosition) {
64
+ direction = 'closing';
65
+ }
66
+ }
67
+ this._lastPosition = position;
54
68
  return {
55
69
  deviceId: this.info.id,
56
70
  connectionType: 'api',
57
- position: apiStatus.slidePosition || 0,
71
+ position,
72
+ direction,
58
73
  calibrated: apiStatus.calibrate,
59
74
  moving: apiStatus.moving,
60
75
  battery: apiStatus.battery,
@@ -65,10 +80,21 @@ export class WoCurtain extends SwitchBotDevice {
65
80
  // Fallback to BLE
66
81
  if (this.hasBLE()) {
67
82
  const bleData = await this.getBLEStatus().catch(() => this.normalizeBLEStatusData(undefined));
83
+ position = typeof bleData.position === 'number' ? bleData.position : 0;
84
+ if (typeof this._lastPosition === 'number') {
85
+ if (position > this._lastPosition) {
86
+ direction = 'opening';
87
+ }
88
+ else if (position < this._lastPosition) {
89
+ direction = 'closing';
90
+ }
91
+ }
92
+ this._lastPosition = position;
68
93
  return {
69
94
  deviceId: this.info.id,
70
95
  connectionType: 'ble',
71
- position: bleData.position || 0,
96
+ position,
97
+ direction,
72
98
  calibrated: bleData.calibration,
73
99
  battery: bleData.battery,
74
100
  updatedAt: new Date(),
@@ -81,5 +107,83 @@ export class WoCurtain extends SwitchBotDevice {
81
107
  throw error;
82
108
  }
83
109
  }
110
+ /**
111
+ * Get extended device information (Curtain 3)
112
+ * Returns device chain information and grouped curtain status
113
+ */
114
+ async getExtendedInfo() {
115
+ if (!this.hasBLE()) {
116
+ throw new Error('Extended info only available via BLE');
117
+ }
118
+ try {
119
+ const result = await this.sendBLECommand(DEVICE_COMMANDS.CURTAIN.EXTENDED_INFO);
120
+ if (!result.success || !result.data) {
121
+ throw new Error('Failed to get extended info');
122
+ }
123
+ const response = Buffer.isBuffer(result.data) ? result.data : Buffer.from(result.data);
124
+ // Parse extended info from response
125
+ // Response format (example): [device_chain_info, group_status_bytes]
126
+ // This is a simplified implementation - actual parsing depends on device response format
127
+ return {
128
+ deviceChain: {
129
+ masterDevice: this.info.id,
130
+ slaveDevices: [], // Would parse from response bytes
131
+ },
132
+ groupStatus: {
133
+ position: response.length > 2 ? response[2] : 0,
134
+ calibrated: response.length > 3 ? (response[3] & 0x40) !== 0 : false,
135
+ moving: response.length > 3 ? (response[3] & 0x03) !== 0 : false,
136
+ },
137
+ };
138
+ }
139
+ catch (error) {
140
+ this.logger.error('Failed to get extended info', error);
141
+ throw error;
142
+ }
143
+ }
144
+ /**
145
+ * Send multiple commands in sequence (all must succeed)
146
+ * Used for Curtain 3 complex operations
147
+ */
148
+ async sendCommandSequence(commands) {
149
+ try {
150
+ for (const command of commands) {
151
+ const success = await command();
152
+ if (!success) {
153
+ this.logger.warn('Command in sequence failed, stopping execution');
154
+ return false;
155
+ }
156
+ // Small delay between commands
157
+ await new Promise(resolve => setTimeout(resolve, 100));
158
+ }
159
+ return true;
160
+ }
161
+ catch (error) {
162
+ this.logger.error('Command sequence failed', error);
163
+ return false;
164
+ }
165
+ }
166
+ /**
167
+ * Send multiple commands (returns true if any succeed)
168
+ * Used for Curtain 3 fallback operations
169
+ */
170
+ async sendMultipleCommands(commands) {
171
+ let anySucceeded = false;
172
+ for (const command of commands) {
173
+ try {
174
+ const success = await command();
175
+ if (success) {
176
+ anySucceeded = true;
177
+ }
178
+ // Small delay between commands
179
+ await new Promise(resolve => setTimeout(resolve, 100));
180
+ }
181
+ catch (error) {
182
+ this.logger.debug('Command in multi-command attempt failed', error);
183
+ // Continue trying other commands
184
+ }
185
+ }
186
+ return anySucceeded;
187
+ }
84
188
  }
85
189
  //# sourceMappingURL=wo-curtain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wo-curtain.js","sourceRoot":"","sources":["../../src/devices/wo-curtain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wo-curtain.js","sourceRoot":"","sources":["../../src/devices/wo-curtain.ts"],"names":[],"mappings":"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"}
@@ -20,9 +20,25 @@ export declare class WoHumi extends SwitchBotDevice implements HumidifierCommand
20
20
  * Set nebulization efficiency (0-100)
21
21
  */
22
22
  setEfficiency(level: number): Promise<boolean>;
23
+ /**
24
+ * Set target humidity level (1-100)
25
+ */
26
+ setLevel(level: number): Promise<boolean>;
23
27
  /**
24
28
  * Get device status
25
29
  */
26
30
  getStatus(): Promise<HumidifierStatus>;
31
+ /**
32
+ * Set auto mode
33
+ */
34
+ setAuto(): Promise<boolean>;
35
+ /**
36
+ * Set manual mode
37
+ */
38
+ setManual(): Promise<boolean>;
39
+ /**
40
+ * Get target humidity level (if available)
41
+ */
42
+ getTargetLevel(): Promise<number | undefined>;
27
43
  }
28
44
  //# sourceMappingURL=wo-humi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wo-humi.d.ts","sourceRoot":"","sources":["../../src/devices/wo-humi.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAI9E,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,MAAO,SAAQ,eAAgB,YAAW,kBAAkB;IACvE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQjC;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAaxD;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBpD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAuC7C"}
1
+ {"version":3,"file":"wo-humi.d.ts","sourceRoot":"","sources":["../../src/devices/wo-humi.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAI9E,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,MAAO,SAAQ,eAAgB,YAAW,kBAAkB;IACvE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQjC;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAaxD;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBpD;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/C;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAwC5C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAIjC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAiBpD"}
@@ -46,6 +46,13 @@ export class WoHumi extends SwitchBotDevice {
46
46
  const result = await this.sendCommand(bleCommand, 'setMode', clampedLevel.toString());
47
47
  return result.success;
48
48
  }
49
+ /**
50
+ * Set target humidity level (1-100)
51
+ */
52
+ async setLevel(level) {
53
+ const clampedLevel = clamp(level, 1, 100);
54
+ return this.setEfficiency(clampedLevel);
55
+ }
49
56
  /**
50
57
  * Get device status
51
58
  */
@@ -87,5 +94,37 @@ export class WoHumi extends SwitchBotDevice {
87
94
  throw error;
88
95
  }
89
96
  }
97
+ /**
98
+ * Set auto mode
99
+ */
100
+ async setAuto() {
101
+ return this.setMode('auto');
102
+ }
103
+ /**
104
+ * Set manual mode
105
+ */
106
+ async setManual() {
107
+ return this.setMode('manual');
108
+ }
109
+ /**
110
+ * Get target humidity level (if available)
111
+ */
112
+ async getTargetLevel() {
113
+ // Try API first if available
114
+ if (this.hasAPI()) {
115
+ const apiStatus = await this.getAPIStatus();
116
+ if (typeof apiStatus.humidity === 'number') {
117
+ return apiStatus.humidity;
118
+ }
119
+ }
120
+ // Fallback to BLE if available
121
+ if (this.hasBLE()) {
122
+ const bleData = await this.getBLEStatus();
123
+ if (typeof bleData.percentage === 'number') {
124
+ return bleData.percentage;
125
+ }
126
+ }
127
+ return undefined;
128
+ }
90
129
  }
91
130
  //# sourceMappingURL=wo-humi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wo-humi.js","sourceRoot":"","sources":["../../src/devices/wo-humi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wo-humi.js","sourceRoot":"","sources":["../../src/devices/wo-humi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,MAAM,OAAO,MAAO,SAAQ,eAAe;IACzC;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,EAC/C,QAAQ,CACT,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAChD,SAAS,CACV,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,IAAuB;QACnC,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM;YAChC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,aAAa;YAC1C,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,eAAe,CAAA;QAE9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,WAAW,CAAC,UAAU,CAAC,EACvB,SAAS,EACT,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CACjC,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;QAEzC,iEAAiE;QACjE,gFAAgF;QAChF,MAAM,UAAU,GAAG,YAAY,GAAG,EAAE;YAClC,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC;YAClD,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAEpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,UAAU,EACV,SAAS,EACT,YAAY,CAAC,QAAQ,EAAE,CACxB,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;QACzC,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAA;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,6BAA6B;YAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;gBAC3C,OAAO;oBACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;oBACtB,cAAc,EAAE,KAAK;oBACrB,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,KAAK;oBAC/B,QAAQ,EAAE,SAAS,CAAC,QAAQ;oBAC5B,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;oBACxC,sBAAsB,EAAE,SAAS,CAAC,sBAAsB;oBACxD,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,WAAW,EAAE,SAAS,CAAC,WAAW;oBAClC,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAA;YACH,CAAC;YAED,kBAAkB;YAClB,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;gBACzC,OAAO;oBACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;oBACtB,cAAc,EAAE,KAAK;oBACrB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;oBACrC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;oBAC1C,sBAAsB,EAAE,OAAO,CAAC,UAAU;oBAC1C,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAA;YACH,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;YAChD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,6BAA6B;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;YAC3C,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC3C,OAAO,SAAS,CAAC,QAAQ,CAAA;YAC3B,CAAC;QACH,CAAC;QACD,+BAA+B;QAC/B,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;YACzC,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC3C,OAAO,OAAO,CAAC,UAAU,CAAA;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;CACF"}
@@ -4,17 +4,5 @@ import { WoHumi } from './wo-humi.js';
4
4
  * Uses same logic as Humidifier
5
5
  */
6
6
  export declare class WoHumi2 extends WoHumi {
7
- /**
8
- * Set auto mode
9
- */
10
- setAuto(): Promise<boolean>;
11
- /**
12
- * Set manual mode
13
- */
14
- setManual(): Promise<boolean>;
15
- /**
16
- * Set target humidity level (mapped to nebulization efficiency)
17
- */
18
- setLevel(level: number): Promise<boolean>;
19
7
  }
20
8
  //# sourceMappingURL=wo-humi2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wo-humi2.d.ts","sourceRoot":"","sources":["../../src/devices/wo-humi2.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC;;;GAGG;AACH,qBAAa,OAAQ,SAAQ,MAAM;IACjC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAIjC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGhD"}
1
+ {"version":3,"file":"wo-humi2.d.ts","sourceRoot":"","sources":["../../src/devices/wo-humi2.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC;;;GAGG;AACH,qBAAa,OAAQ,SAAQ,MAAM;CAElC"}
@@ -8,23 +8,5 @@ import { WoHumi } from './wo-humi.js';
8
8
  * Uses same logic as Humidifier
9
9
  */
10
10
  export class WoHumi2 extends WoHumi {
11
- /**
12
- * Set auto mode
13
- */
14
- async setAuto() {
15
- return this.setMode('auto');
16
- }
17
- /**
18
- * Set manual mode
19
- */
20
- async setManual() {
21
- return this.setMode('manual');
22
- }
23
- /**
24
- * Set target humidity level (mapped to nebulization efficiency)
25
- */
26
- async setLevel(level) {
27
- return this.setEfficiency(level);
28
- }
29
11
  }
30
12
  //# sourceMappingURL=wo-humi2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wo-humi2.js","sourceRoot":"","sources":["../../src/devices/wo-humi2.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC;;;GAGG;AACH,MAAM,OAAO,OAAQ,SAAQ,MAAM;IACjC;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC;CACF"}
1
+ {"version":3,"file":"wo-humi2.js","sourceRoot":"","sources":["../../src/devices/wo-humi2.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC;;;GAGG;AACH,MAAM,OAAO,OAAQ,SAAQ,MAAM;CAElC"}
@@ -0,0 +1,6 @@
1
+ import type { DeviceStatus } from '../types/index.js';
2
+ import { SwitchBotDevice } from './base.js';
3
+ export declare class WoPanTiltCamPlus3K extends SwitchBotDevice {
4
+ getStatus(): Promise<DeviceStatus>;
5
+ }
6
+ //# sourceMappingURL=wo-pan-tilt-cam-plus-3k.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-pan-tilt-cam-plus-3k.d.ts","sourceRoot":"","sources":["../../src/devices/wo-pan-tilt-cam-plus-3k.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,qBAAa,kBAAmB,SAAQ,eAAe;IAC/C,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;CAGzC"}
@@ -0,0 +1,7 @@
1
+ import { SwitchBotDevice } from './base.js';
2
+ export class WoPanTiltCamPlus3K extends SwitchBotDevice {
3
+ async getStatus() {
4
+ throw new Error('WoPanTiltCamPlus3K.getStatus not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=wo-pan-tilt-cam-plus-3k.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-pan-tilt-cam-plus-3k.js","sourceRoot":"","sources":["../../src/devices/wo-pan-tilt-cam-plus-3k.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,MAAM,OAAO,kBAAmB,SAAQ,eAAe;IACrD,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;CACF"}
@@ -1,9 +1,23 @@
1
1
  import type { RelaySwitchCommands, RelaySwitchStatus } from '../types/device.js';
2
+ import { Buffer } from 'node:buffer';
2
3
  import { SequenceDevice } from './sequence-device.js';
3
4
  /**
4
5
  * Relay Switch 1 Device (1-channel)
5
6
  */
6
7
  export declare class WoRelaySwitch1 extends SequenceDevice implements RelaySwitchCommands {
8
+ /**
9
+ * Returns true if this relay switch requires BLE encryption (encryptionKey present)
10
+ */
11
+ private needsEncryption;
12
+ /**
13
+ * Encrypts a command if encryption is required for this device
14
+ */
15
+ protected maybeEncryptCommand(cmd: Buffer | readonly number[]): Buffer;
16
+ /**
17
+ * Verifies the BLE encryption key by attempting a status read with encryption.
18
+ * Throws an error if the key is invalid or the device rejects the command.
19
+ */
20
+ verifyEncryptionKey(): Promise<boolean>;
7
21
  private parseRelayPowerResponse;
8
22
  private getRelayPowerMonitoring;
9
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"wo-relay-switch-1.d.ts","sourceRoot":"","sources":["../../src/devices/wo-relay-switch-1.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAKhF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAe,YAAW,mBAAmB;IAC/E,OAAO,CAAC,uBAAuB;YAqBjB,uBAAuB;IAiBrC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQjC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC;CA0C9C"}
1
+ {"version":3,"file":"wo-relay-switch-1.d.ts","sourceRoot":"","sources":["../../src/devices/wo-relay-switch-1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAIpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAe,YAAW,mBAAmB;IAC/E;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,MAAM;IAStE;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAiB7C,OAAO,CAAC,uBAAuB;YAmBjB,uBAAuB;IAiBrC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAMhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAMjC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAMhC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC;CA0C9C"}
@@ -1,18 +1,52 @@
1
- /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
- *
3
- * devices/wo-relay-switch-1.ts: SwitchBot v4.0.0 - Relay Switch 1 Device
4
- */
5
1
  import { Buffer } from 'node:buffer';
6
2
  import { DEVICE_COMMANDS } from '../settings.js';
3
+ import { validateResponseLength } from '../utils/index.js';
4
+ import { encryptRelayCommandIfNeeded } from '../utils/relay-encryption.js';
7
5
  import { SequenceDevice } from './sequence-device.js';
8
6
  /**
9
7
  * Relay Switch 1 Device (1-channel)
10
8
  */
11
9
  export class WoRelaySwitch1 extends SequenceDevice {
12
- parseRelayPowerResponse(buffer) {
13
- if (!buffer || buffer.length < 11) {
14
- return {};
10
+ /**
11
+ * Returns true if this relay switch requires BLE encryption (encryptionKey present)
12
+ */
13
+ needsEncryption() {
14
+ return !!this.info.encryptionKey;
15
+ }
16
+ /**
17
+ * Encrypts a command if encryption is required for this device
18
+ */
19
+ maybeEncryptCommand(cmd) {
20
+ // Convert readonly arrays to mutable arrays for compatibility
21
+ const arr = Buffer.isBuffer(cmd) ? cmd : Buffer.from([...cmd]);
22
+ if (!this.needsEncryption()) {
23
+ return arr;
24
+ }
25
+ return encryptRelayCommandIfNeeded(arr, this.info.encryptionKey, this.info.encryptionIV);
26
+ }
27
+ /**
28
+ * Verifies the BLE encryption key by attempting a status read with encryption.
29
+ * Throws an error if the key is invalid or the device rejects the command.
30
+ */
31
+ async verifyEncryptionKey() {
32
+ if (!this.needsEncryption()) {
33
+ throw new Error('No encryptionKey set for this device');
15
34
  }
35
+ try {
36
+ // Try to get status with encryption; if the key is wrong, device will reject or return invalid data
37
+ const command = this.maybeEncryptCommand([...DEVICE_COMMANDS.COMMON.POWER_ON]);
38
+ const result = await this.sendCommand(command, 'verifyEncryptionKey');
39
+ if (!result.success) {
40
+ throw new Error('Encryption key verification failed: device did not accept encrypted command');
41
+ }
42
+ return true;
43
+ }
44
+ catch (err) {
45
+ throw new Error(`Encryption key verification failed: ${err?.message || err}`);
46
+ }
47
+ }
48
+ parseRelayPowerResponse(buffer) {
49
+ validateResponseLength(buffer, 11, 'WoRelaySwitch1:parseRelayPowerResponse');
16
50
  // Best-effort parsing aligned with relay basic-info responses.
17
51
  const voltageRaw = buffer.readUInt16BE(5);
18
52
  const currentRaw = buffer.readUInt16BE(7);
@@ -37,21 +71,24 @@ export class WoRelaySwitch1 extends SequenceDevice {
37
71
  * Turn on
38
72
  */
39
73
  async turnOn() {
40
- const result = await this.sendCommand(DEVICE_COMMANDS.COMMON.POWER_ON, 'turnOn');
74
+ const command = this.maybeEncryptCommand([...DEVICE_COMMANDS.COMMON.POWER_ON]);
75
+ const result = await this.sendCommand(command, 'turnOn');
41
76
  return result.success;
42
77
  }
43
78
  /**
44
79
  * Turn off
45
80
  */
46
81
  async turnOff() {
47
- const result = await this.sendCommand(DEVICE_COMMANDS.COMMON.POWER_OFF, 'turnOff');
82
+ const command = this.maybeEncryptCommand([...DEVICE_COMMANDS.COMMON.POWER_OFF]);
83
+ const result = await this.sendCommand(command, 'turnOff');
48
84
  return result.success;
49
85
  }
50
86
  /**
51
87
  * Toggle power
52
88
  */
53
89
  async toggle() {
54
- const result = await this.sendCommand(DEVICE_COMMANDS.PLUG.TOGGLE, 'toggle');
90
+ const command = this.maybeEncryptCommand([...DEVICE_COMMANDS.PLUG.TOGGLE]);
91
+ const result = await this.sendCommand(command, 'toggle');
55
92
  return result.success;
56
93
  }
57
94
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"wo-relay-switch-1.js","sourceRoot":"","sources":["../../src/devices/wo-relay-switch-1.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wo-relay-switch-1.js","sourceRoot":"","sources":["../../src/devices/wo-relay-switch-1.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wo-relay-switch-2pm.d.ts","sourceRoot":"","sources":["../../src/devices/wo-relay-switch-2pm.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAGvF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,cAAe,YAAW,0BAA0B;IACxF;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IASnD;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IASnD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAG9C"}
1
+ {"version":3,"file":"wo-relay-switch-2pm.d.ts","sourceRoot":"","sources":["../../src/devices/wo-relay-switch-2pm.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAGvF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,cAAe,YAAW,0BAA0B;IACxF;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAOnD;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAOnD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAG9C"}
@@ -13,9 +13,8 @@ export class WoRelaySwitch2PM extends WoRelaySwitch1 {
13
13
  * Set channel 1 state
14
14
  */
15
15
  async setChannel1(state) {
16
- const command = state
17
- ? DEVICE_COMMANDS.RELAY.CHANNEL1_ON
18
- : DEVICE_COMMANDS.RELAY.CHANNEL1_OFF;
16
+ const raw = state ? DEVICE_COMMANDS.RELAY.CHANNEL1_ON : DEVICE_COMMANDS.RELAY.CHANNEL1_OFF;
17
+ const command = this.maybeEncryptCommand([...raw]);
19
18
  const result = await this.sendCommand(command, `setChannel1:${state}`);
20
19
  return result.success;
21
20
  }
@@ -23,9 +22,8 @@ export class WoRelaySwitch2PM extends WoRelaySwitch1 {
23
22
  * Set channel 2 state
24
23
  */
25
24
  async setChannel2(state) {
26
- const command = state
27
- ? DEVICE_COMMANDS.RELAY.CHANNEL2_ON
28
- : DEVICE_COMMANDS.RELAY.CHANNEL2_OFF;
25
+ const raw = state ? DEVICE_COMMANDS.RELAY.CHANNEL2_ON : DEVICE_COMMANDS.RELAY.CHANNEL2_OFF;
26
+ const command = this.maybeEncryptCommand([...raw]);
29
27
  const result = await this.sendCommand(command, `setChannel2:${state}`);
30
28
  return result.success;
31
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wo-relay-switch-2pm.js","sourceRoot":"","sources":["../../src/devices/wo-relay-switch-2pm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAClD;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAc;QAC9B,MAAM,OAAO,GAAG,KAAK;YACnB,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW;YACnC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,YAAY,CAAA;QAEtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,KAAK,EAAE,CAAC,CAAA;QACtE,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAc;QAC9B,MAAM,OAAO,GAAG,KAAK;YACnB,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW;YACnC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,YAAY,CAAA;QAEtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,KAAK,EAAE,CAAC,CAAA;QACtE,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,KAAK,CAAC,SAAS,EAAE,CAAA;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"wo-relay-switch-2pm.js","sourceRoot":"","sources":["../../src/devices/wo-relay-switch-2pm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAClD;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAc;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,YAAY,CAAA;QAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,KAAK,EAAE,CAAC,CAAA;QACtE,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAc;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,YAAY,CAAA;QAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,KAAK,EAAE,CAAC,CAAA;QACtE,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,KAAK,CAAC,SAAS,EAAE,CAAA;IAC1B,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { DeviceStatus } from '../types/index.js';
2
+ import { SwitchBotDevice } from './base.js';
3
+ export declare class WoRemoteWithScreen extends SwitchBotDevice {
4
+ getStatus(): Promise<DeviceStatus>;
5
+ }
6
+ //# sourceMappingURL=wo-remote-with-screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-remote-with-screen.d.ts","sourceRoot":"","sources":["../../src/devices/wo-remote-with-screen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,qBAAa,kBAAmB,SAAQ,eAAe;IAC/C,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;CAGzC"}
@@ -0,0 +1,7 @@
1
+ import { SwitchBotDevice } from './base.js';
2
+ export class WoRemoteWithScreen extends SwitchBotDevice {
3
+ async getStatus() {
4
+ throw new Error('WoRemoteWithScreen.getStatus not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=wo-remote-with-screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-remote-with-screen.js","sourceRoot":"","sources":["../../src/devices/wo-remote-with-screen.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,MAAM,OAAO,kBAAmB,SAAQ,eAAe;IACrD,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { DeviceStatus } from '../types/index.js';
2
+ import { SwitchBotDevice } from './base.js';
3
+ export declare class WoRGBICNeonWireRopeLight extends SwitchBotDevice {
4
+ getStatus(): Promise<DeviceStatus>;
5
+ }
6
+ //# sourceMappingURL=wo-rgbic-neon-wire-rope-light.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-rgbic-neon-wire-rope-light.d.ts","sourceRoot":"","sources":["../../src/devices/wo-rgbic-neon-wire-rope-light.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,qBAAa,wBAAyB,SAAQ,eAAe;IACrD,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;CAGzC"}
@@ -0,0 +1,7 @@
1
+ import { SwitchBotDevice } from './base.js';
2
+ export class WoRGBICNeonWireRopeLight extends SwitchBotDevice {
3
+ async getStatus() {
4
+ throw new Error('WoRGBICNeonWireRopeLight.getStatus not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=wo-rgbic-neon-wire-rope-light.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-rgbic-neon-wire-rope-light.js","sourceRoot":"","sources":["../../src/devices/wo-rgbic-neon-wire-rope-light.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,MAAM,OAAO,wBAAyB,SAAQ,eAAe;IAC3D,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;IACvE,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { DeviceStatus } from '../types/index.js';
2
+ import { SwitchBotDevice } from './base.js';
3
+ export declare class WoWaterDetector extends SwitchBotDevice {
4
+ getStatus(): Promise<DeviceStatus>;
5
+ }
6
+ //# sourceMappingURL=wo-water-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-water-detector.d.ts","sourceRoot":"","sources":["../../src/devices/wo-water-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,qBAAa,eAAgB,SAAQ,eAAe;IAC5C,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;CAGzC"}
@@ -0,0 +1,7 @@
1
+ import { SwitchBotDevice } from './base.js';
2
+ export class WoWaterDetector extends SwitchBotDevice {
3
+ async getStatus() {
4
+ throw new Error('WoWaterDetector.getStatus not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=wo-water-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-water-detector.js","sourceRoot":"","sources":["../../src/devices/wo-water-detector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,MAAM,OAAO,eAAgB,SAAQ,eAAe;IAClD,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAC9D,CAAC;CACF"}
package/dist/errors.d.ts CHANGED
@@ -5,6 +5,26 @@ export declare class SwitchBotError extends Error {
5
5
  readonly code?: string | undefined;
6
6
  constructor(message: string, code?: string | undefined);
7
7
  }
8
+ /**
9
+ * Error thrown for generic BLE operation failures
10
+ */
11
+ export declare class SwitchbotOperationError extends SwitchBotError {
12
+ readonly originalError?: Error | undefined;
13
+ constructor(message: string, originalError?: Error | undefined);
14
+ }
15
+ /**
16
+ * Error thrown for BLE authentication failures (e.g., encryption key invalid)
17
+ */
18
+ export declare class SwitchbotAuthenticationError extends SwitchBotError {
19
+ readonly originalError?: Error | undefined;
20
+ constructor(message: string, originalError?: Error | undefined);
21
+ }
22
+ /**
23
+ * Error thrown when a required BLE characteristic is missing
24
+ */
25
+ export declare class CharacteristicMissingError extends SwitchBotError {
26
+ constructor(characteristic: string);
27
+ }
8
28
  /**
9
29
  * Error thrown when BLE is not available or supported
10
30
  */