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

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 (269) hide show
  1. package/dist/ble.d.ts +10 -0
  2. package/dist/ble.d.ts.map +1 -1
  3. package/dist/ble.js +157 -29
  4. package/dist/ble.js.map +1 -1
  5. package/dist/devices/base.d.ts +45 -0
  6. package/dist/devices/base.d.ts.map +1 -1
  7. package/dist/devices/base.js +116 -0
  8. package/dist/devices/base.js.map +1 -1
  9. package/dist/devices/index.d.ts +7 -0
  10. package/dist/devices/index.d.ts.map +1 -1
  11. package/dist/devices/index.js +7 -0
  12. package/dist/devices/index.js.map +1 -1
  13. package/dist/devices/wo-ai-hub.d.ts +6 -0
  14. package/dist/devices/wo-ai-hub.d.ts.map +1 -0
  15. package/dist/devices/wo-ai-hub.js +7 -0
  16. package/dist/devices/wo-ai-hub.js.map +1 -0
  17. package/dist/devices/wo-air-purifier-pm25.d.ts +6 -0
  18. package/dist/devices/wo-air-purifier-pm25.d.ts.map +1 -0
  19. package/dist/devices/wo-air-purifier-pm25.js +7 -0
  20. package/dist/devices/wo-air-purifier-pm25.js.map +1 -0
  21. package/dist/devices/wo-air-purifier.d.ts +18 -1
  22. package/dist/devices/wo-air-purifier.d.ts.map +1 -1
  23. package/dist/devices/wo-air-purifier.js +74 -10
  24. package/dist/devices/wo-air-purifier.js.map +1 -1
  25. package/dist/devices/wo-blind-tilt.d.ts +1 -0
  26. package/dist/devices/wo-blind-tilt.d.ts.map +1 -1
  27. package/dist/devices/wo-blind-tilt.js +41 -2
  28. package/dist/devices/wo-blind-tilt.js.map +1 -1
  29. package/dist/devices/wo-bulb.d.ts +27 -1
  30. package/dist/devices/wo-bulb.d.ts.map +1 -1
  31. package/dist/devices/wo-bulb.js +124 -34
  32. package/dist/devices/wo-bulb.js.map +1 -1
  33. package/dist/devices/wo-candle-warmer-lamp.d.ts +6 -0
  34. package/dist/devices/wo-candle-warmer-lamp.d.ts.map +1 -0
  35. package/dist/devices/wo-candle-warmer-lamp.js +7 -0
  36. package/dist/devices/wo-candle-warmer-lamp.js.map +1 -0
  37. package/dist/devices/wo-curtain.d.ts +17 -1
  38. package/dist/devices/wo-curtain.d.ts.map +1 -1
  39. package/dist/devices/wo-curtain.js +106 -2
  40. package/dist/devices/wo-curtain.js.map +1 -1
  41. package/dist/devices/wo-hand.d.ts +1 -1
  42. package/dist/devices/wo-hand.d.ts.map +1 -1
  43. package/dist/devices/wo-hand.js +1 -2
  44. package/dist/devices/wo-hand.js.map +1 -1
  45. package/dist/devices/wo-humi.d.ts +17 -1
  46. package/dist/devices/wo-humi.d.ts.map +1 -1
  47. package/dist/devices/wo-humi.js +42 -2
  48. package/dist/devices/wo-humi.js.map +1 -1
  49. package/dist/devices/wo-humi2.d.ts +0 -12
  50. package/dist/devices/wo-humi2.d.ts.map +1 -1
  51. package/dist/devices/wo-humi2.js +0 -18
  52. package/dist/devices/wo-humi2.js.map +1 -1
  53. package/dist/devices/wo-pan-tilt-cam-plus-3k.d.ts +6 -0
  54. package/dist/devices/wo-pan-tilt-cam-plus-3k.d.ts.map +1 -0
  55. package/dist/devices/wo-pan-tilt-cam-plus-3k.js +7 -0
  56. package/dist/devices/wo-pan-tilt-cam-plus-3k.js.map +1 -0
  57. package/dist/devices/wo-relay-switch-1.d.ts +14 -0
  58. package/dist/devices/wo-relay-switch-1.d.ts.map +1 -1
  59. package/dist/devices/wo-relay-switch-1.js +47 -10
  60. package/dist/devices/wo-relay-switch-1.js.map +1 -1
  61. package/dist/devices/wo-relay-switch-2pm.d.ts.map +1 -1
  62. package/dist/devices/wo-relay-switch-2pm.js +4 -6
  63. package/dist/devices/wo-relay-switch-2pm.js.map +1 -1
  64. package/dist/devices/wo-remote-with-screen.d.ts +6 -0
  65. package/dist/devices/wo-remote-with-screen.d.ts.map +1 -0
  66. package/dist/devices/wo-remote-with-screen.js +7 -0
  67. package/dist/devices/wo-remote-with-screen.js.map +1 -0
  68. package/dist/devices/wo-rgbic-neon-wire-rope-light.d.ts +6 -0
  69. package/dist/devices/wo-rgbic-neon-wire-rope-light.d.ts.map +1 -0
  70. package/dist/devices/wo-rgbic-neon-wire-rope-light.js +7 -0
  71. package/dist/devices/wo-rgbic-neon-wire-rope-light.js.map +1 -0
  72. package/dist/devices/wo-water-detector.d.ts +6 -0
  73. package/dist/devices/wo-water-detector.d.ts.map +1 -0
  74. package/dist/devices/wo-water-detector.js +7 -0
  75. package/dist/devices/wo-water-detector.js.map +1 -0
  76. package/dist/errors.d.ts +20 -0
  77. package/dist/errors.d.ts.map +1 -1
  78. package/dist/errors.js +31 -1
  79. package/dist/errors.js.map +1 -1
  80. package/dist/index.d.ts +2 -2
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +1 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/settings.d.ts +5 -0
  85. package/dist/settings.d.ts.map +1 -1
  86. package/dist/settings.js +17 -1
  87. package/dist/settings.js.map +1 -1
  88. package/dist/switchbot.d.ts.map +1 -1
  89. package/dist/switchbot.js +14 -0
  90. package/dist/switchbot.js.map +1 -1
  91. package/dist/types/device.d.ts +28 -3
  92. package/dist/types/device.d.ts.map +1 -1
  93. package/dist/utils/index.d.ts +5 -0
  94. package/dist/utils/index.d.ts.map +1 -1
  95. package/dist/utils/index.js +9 -0
  96. package/dist/utils/index.js.map +1 -1
  97. package/dist/utils/relay-encryption.d.ts +10 -0
  98. package/dist/utils/relay-encryption.d.ts.map +1 -0
  99. package/dist/utils/relay-encryption.js +23 -0
  100. package/dist/utils/relay-encryption.js.map +1 -0
  101. package/dist/utils/retry.d.ts.map +1 -1
  102. package/dist/utils/retry.js +49 -6
  103. package/dist/utils/retry.js.map +1 -1
  104. package/docs/assets/hierarchy.js +1 -1
  105. package/docs/assets/navigation.js +1 -1
  106. package/docs/assets/search.js +1 -1
  107. package/docs/classes/APIError.html +2 -2
  108. package/docs/classes/APINotAvailableError.html +2 -2
  109. package/docs/classes/BLEConnection.html +11 -9
  110. package/docs/classes/BLENotAvailableError.html +2 -2
  111. package/docs/classes/BLEScanner.html +9 -9
  112. package/docs/classes/CommandFailedError.html +2 -2
  113. package/docs/classes/ConnectionTimeoutError.html +2 -2
  114. package/docs/classes/DeviceManager.html +13 -13
  115. package/docs/classes/DeviceNotFoundError.html +2 -2
  116. package/docs/classes/DeviceOverrideStateDuringConnection.html +55 -28
  117. package/docs/classes/DiscoveryError.html +2 -2
  118. package/docs/classes/OpenAPIClient.html +24 -24
  119. package/docs/classes/SequenceDevice.html +56 -29
  120. package/docs/classes/SwitchBot.html +11 -11
  121. package/docs/classes/SwitchBotDevice.html +55 -28
  122. package/docs/classes/SwitchBotError.html +2 -2
  123. package/docs/classes/ValidationError.html +2 -2
  124. package/docs/classes/WoAIHub.html +83 -0
  125. package/docs/classes/WoAirPurifier.html +56 -33
  126. package/docs/classes/WoAirPurifierPM25.html +83 -0
  127. package/docs/classes/WoAirPurifierTable.html +56 -33
  128. package/docs/classes/WoArtFrame.html +67 -35
  129. package/docs/classes/WoBlindTilt.html +63 -34
  130. package/docs/classes/WoBulb.html +67 -35
  131. package/docs/classes/WoCandleWarmerLamp.html +83 -0
  132. package/docs/classes/WoCeilingLight.html +67 -35
  133. package/docs/classes/WoCirculatorFan.html +56 -33
  134. package/docs/classes/WoClimatePanel.html +56 -33
  135. package/docs/classes/WoContact.html +55 -28
  136. package/docs/classes/WoCurtain.html +64 -32
  137. package/docs/classes/WoFloorLamp.html +67 -35
  138. package/docs/classes/WoGarageDoorOpener.html +62 -32
  139. package/docs/classes/WoHand.html +56 -38
  140. package/docs/classes/WoHub2.html +55 -28
  141. package/docs/classes/WoHub3.html +55 -28
  142. package/docs/classes/WoHubMiniMatter.html +55 -28
  143. package/docs/classes/WoHumi.html +58 -32
  144. package/docs/classes/WoHumi2.html +58 -38
  145. package/docs/classes/WoIOSensorTH.html +55 -28
  146. package/docs/classes/WoKeypad.html +55 -28
  147. package/docs/classes/WoKeypadVision.html +55 -28
  148. package/docs/classes/WoKeypadVisionPro.html +55 -28
  149. package/docs/classes/WoLeak.html +55 -28
  150. package/docs/classes/WoPanTiltCamPlus3K.html +83 -0
  151. package/docs/classes/WoPlugMiniJP.html +58 -31
  152. package/docs/classes/WoPlugMiniUS.html +58 -31
  153. package/docs/classes/WoPresence.html +55 -28
  154. package/docs/classes/WoRGBICBulb.html +69 -37
  155. package/docs/classes/WoRGBICNeonWireRopeLight.html +83 -0
  156. package/docs/classes/WoRGBICWWFloorLamp.html +69 -37
  157. package/docs/classes/WoRGBICWWStripLight.html +69 -37
  158. package/docs/classes/WoRelaySwitch1.html +62 -32
  159. package/docs/classes/WoRelaySwitch1PM.html +62 -32
  160. package/docs/classes/WoRelaySwitch2PM.html +64 -34
  161. package/docs/classes/WoRemote.html +55 -28
  162. package/docs/classes/WoRemoteWithScreen.html +83 -0
  163. package/docs/classes/WoRollerShade.html +64 -32
  164. package/docs/classes/WoSensorTH.html +55 -28
  165. package/docs/classes/WoSensorTHPlus.html +55 -28
  166. package/docs/classes/WoSensorTHPro.html +55 -28
  167. package/docs/classes/WoSensorTHProCO2.html +55 -28
  168. package/docs/classes/WoSmartLock.html +58 -31
  169. package/docs/classes/WoSmartLockLite.html +58 -31
  170. package/docs/classes/WoSmartLockPro.html +60 -33
  171. package/docs/classes/WoSmartLockProWiFi.html +60 -33
  172. package/docs/classes/WoSmartLockVision.html +58 -31
  173. package/docs/classes/WoSmartLockVisionPro.html +60 -33
  174. package/docs/classes/WoSmartThermostatRadiator.html +56 -33
  175. package/docs/classes/WoStrip.html +67 -35
  176. package/docs/classes/WoStripLight3.html +67 -35
  177. package/docs/classes/WoVacuum.html +63 -36
  178. package/docs/classes/WoVacuumK10Plus.html +63 -36
  179. package/docs/classes/WoVacuumK10Pro.html +63 -36
  180. package/docs/classes/WoVacuumK10ProCombo.html +63 -36
  181. package/docs/classes/WoVacuumK11Plus.html +63 -36
  182. package/docs/classes/WoVacuumK20.html +63 -36
  183. package/docs/classes/WoVacuumS10.html +63 -36
  184. package/docs/classes/WoVacuumS20.html +63 -36
  185. package/docs/classes/WoWaterDetector.html +83 -0
  186. package/docs/enums/LogLevel.html +2 -2
  187. package/docs/enums/SwitchBotBLEModel.html +2 -2
  188. package/docs/enums/SwitchBotBLEModelName.html +2 -2
  189. package/docs/functions/updateBaseURL.html +1 -1
  190. package/docs/hierarchy.html +1 -1
  191. package/docs/interfaces/APICommandRequest.html +2 -2
  192. package/docs/interfaces/APICommandResponse.html +2 -2
  193. package/docs/interfaces/APIDevice.html +2 -2
  194. package/docs/interfaces/APIDeviceStatus.html +2 -2
  195. package/docs/interfaces/APIErrorResponse.html +2 -2
  196. package/docs/interfaces/APIResponse.html +2 -2
  197. package/docs/interfaces/AirPurifierCommands.html +3 -2
  198. package/docs/interfaces/AirPurifierServiceData.html +14 -14
  199. package/docs/interfaces/AirPurifierStatus.html +7 -7
  200. package/docs/interfaces/BLEAdvertisement.html +2 -2
  201. package/docs/interfaces/BLEScanOptions.html +5 -5
  202. package/docs/interfaces/BLEServiceData.html +14 -14
  203. package/docs/interfaces/BlindTiltCommands.html +2 -2
  204. package/docs/interfaces/BlindTiltServiceData.html +14 -14
  205. package/docs/interfaces/BlindTiltStatus.html +7 -6
  206. package/docs/interfaces/BotCommands.html +2 -2
  207. package/docs/interfaces/BotServiceData.html +14 -14
  208. package/docs/interfaces/BotStatus.html +6 -6
  209. package/docs/interfaces/BulbCommands.html +4 -2
  210. package/docs/interfaces/BulbServiceData.html +14 -14
  211. package/docs/interfaces/BulbStatus.html +6 -6
  212. package/docs/interfaces/CeilingLightCommands.html +4 -2
  213. package/docs/interfaces/CeilingLightServiceData.html +14 -14
  214. package/docs/interfaces/CeilingLightStatus.html +6 -6
  215. package/docs/interfaces/CommandResult.html +6 -6
  216. package/docs/interfaces/ContactServiceData.html +14 -14
  217. package/docs/interfaces/ContactStatus.html +6 -6
  218. package/docs/interfaces/CurtainCommands.html +5 -2
  219. package/docs/interfaces/CurtainExtendedInfo.html +4 -0
  220. package/docs/interfaces/CurtainServiceData.html +14 -14
  221. package/docs/interfaces/CurtainStatus.html +6 -6
  222. package/docs/interfaces/DeviceInfo.html +18 -18
  223. package/docs/interfaces/DeviceListResponse.html +2 -2
  224. package/docs/interfaces/DeviceStatus.html +6 -6
  225. package/docs/interfaces/DiscoveryOptions.html +7 -7
  226. package/docs/interfaces/HubServiceData.html +14 -14
  227. package/docs/interfaces/HubStatus.html +6 -6
  228. package/docs/interfaces/HumidifierCommands.html +6 -2
  229. package/docs/interfaces/HumidifierServiceData.html +15 -15
  230. package/docs/interfaces/HumidifierStatus.html +6 -6
  231. package/docs/interfaces/KeypadStatus.html +6 -6
  232. package/docs/interfaces/LeakServiceData.html +14 -14
  233. package/docs/interfaces/LeakStatus.html +6 -6
  234. package/docs/interfaces/LockCommands.html +2 -2
  235. package/docs/interfaces/LockServiceData.html +15 -15
  236. package/docs/interfaces/LockStatus.html +6 -6
  237. package/docs/interfaces/MeterServiceData.html +14 -14
  238. package/docs/interfaces/MeterStatus.html +6 -6
  239. package/docs/interfaces/MotionServiceData.html +14 -14
  240. package/docs/interfaces/MotionStatus.html +6 -6
  241. package/docs/interfaces/PlugCommands.html +2 -2
  242. package/docs/interfaces/PlugServiceData.html +14 -14
  243. package/docs/interfaces/PlugStatus.html +6 -6
  244. package/docs/interfaces/PresenceServiceData.html +14 -14
  245. package/docs/interfaces/PresenceStatus.html +6 -6
  246. package/docs/interfaces/RelaySwitchCommands.html +2 -2
  247. package/docs/interfaces/RelaySwitchServiceData.html +14 -14
  248. package/docs/interfaces/RelaySwitchStatus.html +6 -6
  249. package/docs/interfaces/RemoteStatus.html +6 -6
  250. package/docs/interfaces/SceneListResponse.html +2 -2
  251. package/docs/interfaces/StripCommands.html +4 -2
  252. package/docs/interfaces/StripServiceData.html +14 -14
  253. package/docs/interfaces/StripStatus.html +6 -6
  254. package/docs/interfaces/SwitchBotConfig.html +15 -15
  255. package/docs/interfaces/VacuumCommands.html +2 -2
  256. package/docs/interfaces/VacuumStatus.html +6 -6
  257. package/docs/interfaces/WebhookConfig.html +2 -2
  258. package/docs/interfaces/WebhookDetails.html +2 -2
  259. package/docs/interfaces/WebhookQueryResponse.html +2 -2
  260. package/docs/interfaces/WebhookSetupResponse.html +2 -2
  261. package/docs/modules.html +1 -1
  262. package/docs/types/ConnectionType.html +1 -1
  263. package/docs/types/PhysicalDeviceType.html +1 -1
  264. package/docs/types/VirtualDeviceType.html +1 -1
  265. package/docs/variables/urls.html +1 -1
  266. package/package.json +2 -2
  267. package/todo/PYSWITCHBOT_COMPARISON.md +5 -9
  268. package/todo/completed.md +179 -0
  269. package/todo/todo.md +54 -122
@@ -2,6 +2,7 @@
2
2
  *
3
3
  * devices/wo-blind-tilt.ts: SwitchBot v4.0.0 - Blind Tilt 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';
@@ -57,16 +58,31 @@ export class WoBlindTilt extends SwitchBotDevice {
57
58
  /**
58
59
  * Get device status
59
60
  */
61
+ _lastPosition;
60
62
  async getStatus() {
61
63
  try {
64
+ let direction;
65
+ let position = 0;
62
66
  // Try API first if available
63
67
  if (this.hasAPI()) {
64
68
  const apiStatus = await this.getAPIStatus();
69
+ position = typeof apiStatus.slidePosition === 'number' ? apiStatus.slidePosition : 0;
70
+ if (typeof this._lastPosition === 'number') {
71
+ if (position > this._lastPosition) {
72
+ direction = 'opening';
73
+ }
74
+ else if (position < this._lastPosition) {
75
+ direction = 'closing';
76
+ }
77
+ }
78
+ this._lastPosition = position;
65
79
  return {
66
80
  deviceId: this.info.id,
67
81
  connectionType: 'api',
68
- position: apiStatus.slidePosition || 0,
82
+ position,
83
+ direction,
69
84
  moving: apiStatus.moving,
85
+ calibrated: apiStatus.calibrate ?? undefined,
70
86
  battery: apiStatus.battery,
71
87
  version: apiStatus.version,
72
88
  updatedAt: new Date(),
@@ -75,11 +91,34 @@ export class WoBlindTilt extends SwitchBotDevice {
75
91
  // Fallback to BLE
76
92
  if (this.hasBLE()) {
77
93
  const bleData = await this.getBLEStatus();
94
+ // Calibration bit: usually in a status byte, e.g., bit 6 of 4th byte (like Curtain)
95
+ let calibrated;
96
+ position = typeof bleData.position === 'number' ? bleData.position : 0;
97
+ if (bleData.rawData && Buffer.isBuffer(bleData.rawData) && bleData.rawData.length > 3) {
98
+ calibrated = (bleData.rawData[3] & 0x40) !== 0;
99
+ }
100
+ else if (typeof bleData.calibration === 'boolean') {
101
+ calibrated = bleData.calibration;
102
+ }
103
+ if (typeof this._lastPosition === 'number') {
104
+ if (position > this._lastPosition) {
105
+ direction = 'opening';
106
+ }
107
+ else if (position < this._lastPosition) {
108
+ direction = 'closing';
109
+ }
110
+ }
111
+ this._lastPosition = position;
112
+ if (calibrated === false) {
113
+ this.logger.warn('Blind Tilt not calibrated!');
114
+ }
78
115
  return {
79
116
  deviceId: this.info.id,
80
117
  connectionType: 'ble',
81
- position: bleData.position || 0,
118
+ position,
119
+ direction,
82
120
  moving: bleData.inMotion,
121
+ calibrated,
83
122
  battery: bleData.battery,
84
123
  updatedAt: new Date(),
85
124
  };
@@ -1 +1 @@
1
- {"version":3,"file":"wo-blind-tilt.js","sourceRoot":"","sources":["../../src/devices/wo-blind-tilt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wo-blind-tilt.js","sourceRoot":"","sources":["../../src/devices/wo-blind-tilt.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,19 @@ import { SwitchBotDevice } from './base.js';
4
4
  * Color Bulb Device
5
5
  */
6
6
  export declare class WoBulb extends SwitchBotDevice implements BulbCommands {
7
- private static readonly EFFECTS;
7
+ /**
8
+ * Returns true if this bulb/strip requires BLE encryption (encryptionKey present)
9
+ */
10
+ private needsEncryption;
11
+ /**
12
+ * Encrypts a command if encryption is required for this device
13
+ */
14
+ private maybeEncryptCommand;
15
+ /**
16
+ * Verifies the BLE encryption key by attempting a status read with encryption.
17
+ * Throws an error if the key is invalid or the device rejects the command.
18
+ */
19
+ verifyEncryptionKey(): Promise<boolean>;
8
20
  /**
9
21
  * Turn on
10
22
  */
@@ -30,6 +42,10 @@ export declare class WoBulb extends SwitchBotDevice implements BulbCommands {
30
42
  * Set RGB color
31
43
  */
32
44
  setColor(red: number, green: number, blue: number): Promise<boolean>;
45
+ /**
46
+ * Preset effect name to effect ID mapping
47
+ */
48
+ static EFFECTS: Record<string, number>;
33
49
  /**
34
50
  * Set preset light effect
35
51
  */
@@ -38,5 +54,15 @@ export declare class WoBulb extends SwitchBotDevice implements BulbCommands {
38
54
  * Get device status
39
55
  */
40
56
  getStatus(): Promise<BulbStatus>;
57
+ /**
58
+ * Send multiple commands in sequence (all must succeed)
59
+ * Used for Strip Light 3 and complex light patterns
60
+ */
61
+ sendCommandSequence(commands: Array<() => Promise<boolean>>): Promise<boolean>;
62
+ /**
63
+ * Send multiple commands (returns true if any succeed)
64
+ * Used for fallback operations with complex light patterns
65
+ */
66
+ sendMultipleCommands(commands: Array<() => Promise<boolean>>): Promise<boolean>;
41
67
  }
42
68
  //# sourceMappingURL=wo-bulb.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wo-bulb.d.ts","sourceRoot":"","sources":["../../src/devices/wo-bulb.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAIlE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,MAAO,SAAQ,eAAgB,YAAW,YAAY;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAqB9B;IAED;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQjC;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAazD;;OAEG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAehE;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuCpF;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe1E;;OAEG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBlE;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;CAmDvC"}
1
+ {"version":3,"file":"wo-bulb.d.ts","sourceRoot":"","sources":["../../src/devices/wo-bulb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAKlE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,MAAO,SAAQ,eAAgB,YAAW,YAAY;IACjE;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAiB7C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAMhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAMjC;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASzD;;OAEG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmCpF;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1E;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBrC;IAED;;OAEG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAalE;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAwDtC;;;OAGG;IACG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBpF;;;OAGG;IACG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAmBtF"}
@@ -1,48 +1,63 @@
1
- /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
- *
3
- * devices/wo-bulb.ts: SwitchBot v4.0.0 - Color Bulb
4
- */
1
+ import { Buffer } from 'node:buffer';
5
2
  import { DEVICE_COMMANDS } from '../settings.js';
6
- import { clamp } from '../utils/index.js';
3
+ import { clamp, validateResponseLength } from '../utils/index.js';
4
+ import { encryptRelayCommandIfNeeded } from '../utils/relay-encryption.js';
7
5
  import { SwitchBotDevice } from './base.js';
8
6
  /**
9
7
  * Color Bulb Device
10
8
  */
11
9
  export class WoBulb extends SwitchBotDevice {
12
- static EFFECTS = {
13
- christmas: 0x00,
14
- candle: 0x01,
15
- halloween: 0x02,
16
- sunset: 0x03,
17
- party: 0x04,
18
- reading: 0x05,
19
- rainbow: 0x06,
20
- forest: 0x07,
21
- ocean: 0x08,
22
- spring: 0x09,
23
- summer: 0x0A,
24
- autumn: 0x0B,
25
- winter: 0x0C,
26
- aurora: 0x0D,
27
- meteor: 0x0E,
28
- firework: 0x0F,
29
- breathe: 0x10,
30
- pulse: 0x11,
31
- flicker: 0x12,
32
- pet: 0x13,
33
- };
10
+ /**
11
+ * Returns true if this bulb/strip 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
+ const arr = Buffer.isBuffer(cmd) ? cmd : Buffer.from([...cmd]);
21
+ if (!this.needsEncryption()) {
22
+ return arr;
23
+ }
24
+ return encryptRelayCommandIfNeeded(arr, this.info.encryptionKey, this.info.encryptionIV);
25
+ }
26
+ /**
27
+ * Verifies the BLE encryption key by attempting a status read with encryption.
28
+ * Throws an error if the key is invalid or the device rejects the command.
29
+ */
30
+ async verifyEncryptionKey() {
31
+ if (!this.needsEncryption()) {
32
+ throw new Error('No encryptionKey set for this device');
33
+ }
34
+ try {
35
+ // Try to turn on with encryption; if the key is wrong, device will reject or return invalid data
36
+ const command = this.maybeEncryptCommand([...DEVICE_COMMANDS.BULB.BASE, ...DEVICE_COMMANDS.BULB.TURN_ON]);
37
+ const result = await this.sendCommand(command, 'verifyEncryptionKey');
38
+ if (!result.success) {
39
+ throw new Error('Encryption key verification failed: device did not accept encrypted command');
40
+ }
41
+ return true;
42
+ }
43
+ catch (err) {
44
+ throw new Error(`Encryption key verification failed: ${err?.message || err}`);
45
+ }
46
+ }
34
47
  /**
35
48
  * Turn on
36
49
  */
37
50
  async turnOn() {
38
- const result = await this.sendCommand([...DEVICE_COMMANDS.BULB.BASE, ...DEVICE_COMMANDS.BULB.TURN_ON], 'turnOn');
51
+ const command = this.maybeEncryptCommand([...DEVICE_COMMANDS.BULB.BASE, ...DEVICE_COMMANDS.BULB.TURN_ON]);
52
+ const result = await this.sendCommand(command, 'turnOn');
39
53
  return result.success;
40
54
  }
41
55
  /**
42
56
  * Turn off
43
57
  */
44
58
  async turnOff() {
45
- const result = await this.sendCommand([...DEVICE_COMMANDS.BULB.BASE, ...DEVICE_COMMANDS.BULB.TURN_OFF], 'turnOff');
59
+ const command = this.maybeEncryptCommand([...DEVICE_COMMANDS.BULB.BASE, ...DEVICE_COMMANDS.BULB.TURN_OFF]);
60
+ const result = await this.sendCommand(command, 'turnOff');
46
61
  return result.success;
47
62
  }
48
63
  /**
@@ -51,7 +66,8 @@ export class WoBulb extends SwitchBotDevice {
51
66
  async setBrightness(brightness) {
52
67
  const clampedBrightness = clamp(brightness, 0, 100);
53
68
  const bleCommand = [...DEVICE_COMMANDS.BULB.BASE, ...DEVICE_COMMANDS.BULB.SET_BRIGHTNESS, clampedBrightness];
54
- const result = await this.sendCommand(bleCommand, 'setBrightness', clampedBrightness);
69
+ const command = this.maybeEncryptCommand(bleCommand);
70
+ const result = await this.sendCommand(command, 'setBrightness', clampedBrightness);
55
71
  return result.success;
56
72
  }
57
73
  /**
@@ -62,7 +78,8 @@ export class WoBulb extends SwitchBotDevice {
62
78
  // Convert to bytes for BLE
63
79
  const tempBytes = [(clampedTemp >> 8) & 0xFF, clampedTemp & 0xFF];
64
80
  const bleCommand = [...DEVICE_COMMANDS.BULB.BASE, ...DEVICE_COMMANDS.BULB.SET_COLOR_TEMP, ...tempBytes];
65
- const result = await this.sendCommand(bleCommand, 'setColorTemperature', clampedTemp);
81
+ const command = this.maybeEncryptCommand(bleCommand);
82
+ const result = await this.sendCommand(command, 'setColorTemperature', clampedTemp);
66
83
  return result.success;
67
84
  }
68
85
  /**
@@ -96,7 +113,8 @@ export class WoBulb extends SwitchBotDevice {
96
113
  ...maxTempBytes,
97
114
  ...tempBytes,
98
115
  ];
99
- const result = await this.sendCommand(bleCommand, 'setColorTemp', `${finalMinTemp}-${finalMaxTemp}:${clampedTemp}`);
116
+ const command = this.maybeEncryptCommand(bleCommand);
117
+ const result = await this.sendCommand(command, 'setColorTemp', `${finalMinTemp}-${finalMaxTemp}:${clampedTemp}`);
100
118
  return result.success;
101
119
  }
102
120
  /**
@@ -107,9 +125,32 @@ export class WoBulb extends SwitchBotDevice {
107
125
  const g = clamp(green, 0, 255);
108
126
  const b = clamp(blue, 0, 255);
109
127
  const bleCommand = [...DEVICE_COMMANDS.BULB.BASE, ...DEVICE_COMMANDS.BULB.SET_RGB, r, g, b];
110
- const result = await this.sendCommand(bleCommand, 'setColor', `${r}:${g}:${b}`);
128
+ const command = this.maybeEncryptCommand(bleCommand);
129
+ const result = await this.sendCommand(command, 'setColor', `${r}:${g}:${b}`);
111
130
  return result.success;
112
131
  }
132
+ /**
133
+ * Preset effect name to effect ID mapping
134
+ */
135
+ static EFFECTS = {
136
+ rainbow: 0x01,
137
+ sunrise: 0x02,
138
+ sunset: 0x03,
139
+ ocean: 0x04,
140
+ forest: 0x05,
141
+ party: 0x06,
142
+ christmas: 0x07,
143
+ birthday: 0x08,
144
+ romantic: 0x09,
145
+ candlelight: 0x0A,
146
+ reading: 0x0B,
147
+ night: 0x0C,
148
+ relax: 0x0D,
149
+ soft: 0x0E,
150
+ colorful: 0x0F,
151
+ flicker: 0x10,
152
+ // Add more as needed
153
+ };
113
154
  /**
114
155
  * Set preset light effect
115
156
  */
@@ -120,7 +161,8 @@ export class WoBulb extends SwitchBotDevice {
120
161
  }
121
162
  const effectSpeed = clamp(speed, 1, 100);
122
163
  const bleCommand = [...DEVICE_COMMANDS.BULB.BASE, effectId, 0xFF, effectSpeed, 0x00, 0x00, 0x00];
123
- const result = await this.sendCommand(bleCommand, 'setEffect', `${effectName}:${effectSpeed}`);
164
+ const command = this.maybeEncryptCommand(bleCommand);
165
+ const result = await this.sendCommand(command, 'setEffect', `${effectName}:${effectSpeed}`);
124
166
  return result.success;
125
167
  }
126
168
  /**
@@ -151,6 +193,10 @@ export class WoBulb extends SwitchBotDevice {
151
193
  // Fallback to BLE
152
194
  if (this.hasBLE()) {
153
195
  const bleData = await this.getBLEStatus();
196
+ // Validate minimum expected length for BLE status (example: 8 bytes, adjust as needed)
197
+ if (bleData.rawData && Buffer.isBuffer(bleData.rawData)) {
198
+ validateResponseLength(bleData.rawData, 8, 'WoBulb:getStatus BLE');
199
+ }
154
200
  return {
155
201
  deviceId: this.info.id,
156
202
  connectionType: 'ble',
@@ -174,5 +220,49 @@ export class WoBulb extends SwitchBotDevice {
174
220
  throw error;
175
221
  }
176
222
  }
223
+ /**
224
+ * Send multiple commands in sequence (all must succeed)
225
+ * Used for Strip Light 3 and complex light patterns
226
+ */
227
+ async sendCommandSequence(commands) {
228
+ try {
229
+ for (const command of commands) {
230
+ const success = await command();
231
+ if (!success) {
232
+ this.logger.warn('Command in sequence failed, stopping execution');
233
+ return false;
234
+ }
235
+ // Small delay between commands for device processing
236
+ await new Promise(resolve => setTimeout(resolve, 100));
237
+ }
238
+ return true;
239
+ }
240
+ catch (error) {
241
+ this.logger.error('Command sequence failed', error);
242
+ return false;
243
+ }
244
+ }
245
+ /**
246
+ * Send multiple commands (returns true if any succeed)
247
+ * Used for fallback operations with complex light patterns
248
+ */
249
+ async sendMultipleCommands(commands) {
250
+ let anySucceeded = false;
251
+ for (const command of commands) {
252
+ try {
253
+ const success = await command();
254
+ if (success) {
255
+ anySucceeded = true;
256
+ }
257
+ // Small delay between commands
258
+ await new Promise(resolve => setTimeout(resolve, 100));
259
+ }
260
+ catch (error) {
261
+ this.logger.debug('Command in multi-command attempt failed', error);
262
+ // Continue trying other commands
263
+ }
264
+ }
265
+ return anySucceeded;
266
+ }
177
267
  }
178
268
  //# sourceMappingURL=wo-bulb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wo-bulb.js","sourceRoot":"","sources":["../../src/devices/wo-bulb.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wo-bulb.js","sourceRoot":"","sources":["../../src/devices/wo-bulb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { DeviceStatus } from '../types/index.js';
2
+ import { SwitchBotDevice } from './base.js';
3
+ export declare class WoCandleWarmerLamp extends SwitchBotDevice {
4
+ getStatus(): Promise<DeviceStatus>;
5
+ }
6
+ //# sourceMappingURL=wo-candle-warmer-lamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-candle-warmer-lamp.d.ts","sourceRoot":"","sources":["../../src/devices/wo-candle-warmer-lamp.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 WoCandleWarmerLamp extends SwitchBotDevice {
3
+ async getStatus() {
4
+ throw new Error('WoCandleWarmerLamp.getStatus not implemented');
5
+ }
6
+ }
7
+ //# sourceMappingURL=wo-candle-warmer-lamp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wo-candle-warmer-lamp.js","sourceRoot":"","sources":["../../src/devices/wo-candle-warmer-lamp.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,4 +1,4 @@
1
- import type { CurtainCommands, CurtainStatus } from '../types/device.js';
1
+ import type { CurtainCommands, CurtainExtendedInfo, CurtainStatus } from '../types/device.js';
2
2
  import { SwitchBotDevice } from './base.js';
3
3
  /**
4
4
  * Curtain Device - Smart curtain controller
@@ -23,6 +23,22 @@ export declare class WoCurtain extends SwitchBotDevice implements CurtainCommand
23
23
  /**
24
24
  * Get device status
25
25
  */
26
+ _lastPosition?: number;
26
27
  getStatus(): Promise<CurtainStatus>;
28
+ /**
29
+ * Get extended device information (Curtain 3)
30
+ * Returns device chain information and grouped curtain status
31
+ */
32
+ getExtendedInfo(): Promise<CurtainExtendedInfo>;
33
+ /**
34
+ * Send multiple commands in sequence (all must succeed)
35
+ * Used for Curtain 3 complex operations
36
+ */
37
+ sendCommandSequence(commands: Array<() => Promise<boolean>>): Promise<boolean>;
38
+ /**
39
+ * Send multiple commands (returns true if any succeed)
40
+ * Used for Curtain 3 fallback operations
41
+ */
42
+ sendMultipleCommands(commands: Array<() => Promise<boolean>>): Promise<boolean>;
27
43
  }
28
44
  //# sourceMappingURL=wo-curtain.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wo-curtain.d.ts","sourceRoot":"","sources":["../../src/devices/wo-curtain.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIxE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,SAAU,SAAQ,eAAgB,YAAW,eAAe;IACvE;;OAEG;IACG,IAAI,CAAC,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzC;;OAEG;IACG,KAAK,CAAC,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ/B;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAelE;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;CAoC1C"}
1
+ {"version":3,"file":"wo-curtain.d.ts","sourceRoot":"","sources":["../../src/devices/wo-curtain.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAM7F,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,SAAU,SAAQ,eAAgB,YAAW,eAAe;IACvE;;OAEG;IACG,IAAI,CAAC,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzC;;OAEG;IACG,KAAK,CAAC,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ/B;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAelE;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IAEhB,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IA2DzC;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAkCrD;;;OAGG;IACG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBpF;;;OAGG;IACG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAmBtF"}
@@ -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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"}