node-switchbot 2.5.0-beta.2 → 2.5.0-beta.21

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 (197) hide show
  1. package/dist/advertising.d.ts +31 -20
  2. package/dist/advertising.d.ts.map +1 -1
  3. package/dist/advertising.js +72 -75
  4. package/dist/advertising.js.map +1 -1
  5. package/dist/device/woblindtilt.d.ts +19 -50
  6. package/dist/device/woblindtilt.d.ts.map +1 -1
  7. package/dist/device/woblindtilt.js +39 -98
  8. package/dist/device/woblindtilt.js.map +1 -1
  9. package/dist/device/wobulb.d.ts +41 -15
  10. package/dist/device/wobulb.d.ts.map +1 -1
  11. package/dist/device/wobulb.js +71 -127
  12. package/dist/device/wobulb.js.map +1 -1
  13. package/dist/device/woceilinglight.d.ts +47 -21
  14. package/dist/device/woceilinglight.d.ts.map +1 -1
  15. package/dist/device/woceilinglight.js +94 -169
  16. package/dist/device/woceilinglight.js.map +1 -1
  17. package/dist/device/wocontact.d.ts +11 -1
  18. package/dist/device/wocontact.d.ts.map +1 -1
  19. package/dist/device/wocontact.js +22 -21
  20. package/dist/device/wocontact.js.map +1 -1
  21. package/dist/device/wocurtain.d.ts +39 -1
  22. package/dist/device/wocurtain.d.ts.map +1 -1
  23. package/dist/device/wocurtain.js +68 -102
  24. package/dist/device/wocurtain.js.map +1 -1
  25. package/dist/device/wohand.d.ts +37 -2
  26. package/dist/device/wohand.d.ts.map +1 -1
  27. package/dist/device/wohand.js +54 -88
  28. package/dist/device/wohand.js.map +1 -1
  29. package/dist/device/wohub2.d.ts +11 -1
  30. package/dist/device/wohub2.d.ts.map +1 -1
  31. package/dist/device/wohub2.js +20 -28
  32. package/dist/device/wohub2.js.map +1 -1
  33. package/dist/device/wohumi.d.ts +37 -2
  34. package/dist/device/wohumi.d.ts.map +1 -1
  35. package/dist/device/wohumi.js +51 -82
  36. package/dist/device/wohumi.js.map +1 -1
  37. package/dist/device/woiosensorth.d.ts +12 -1
  38. package/dist/device/woiosensorth.d.ts.map +1 -1
  39. package/dist/device/woiosensorth.js +24 -28
  40. package/dist/device/woiosensorth.js.map +1 -1
  41. package/dist/device/woplugmini.d.ts +45 -12
  42. package/dist/device/woplugmini.d.ts.map +1 -1
  43. package/dist/device/woplugmini.js +69 -75
  44. package/dist/device/woplugmini.js.map +1 -1
  45. package/dist/device/wopresence.d.ts +11 -1
  46. package/dist/device/wopresence.d.ts.map +1 -1
  47. package/dist/device/wopresence.js +20 -26
  48. package/dist/device/wopresence.js.map +1 -1
  49. package/dist/device/wosensorth.d.ts +18 -2
  50. package/dist/device/wosensorth.d.ts.map +1 -1
  51. package/dist/device/wosensorth.js +32 -48
  52. package/dist/device/wosensorth.js.map +1 -1
  53. package/dist/device/wosmartlock.d.ts +56 -13
  54. package/dist/device/wosmartlock.d.ts.map +1 -1
  55. package/dist/device/wosmartlock.js +106 -194
  56. package/dist/device/wosmartlock.js.map +1 -1
  57. package/dist/device/wosmartlockpro.d.ts +61 -18
  58. package/dist/device/wosmartlockpro.d.ts.map +1 -1
  59. package/dist/device/wosmartlockpro.js +114 -203
  60. package/dist/device/wosmartlockpro.js.map +1 -1
  61. package/dist/device/wostrip.d.ts +37 -18
  62. package/dist/device/wostrip.d.ts.map +1 -1
  63. package/dist/device/wostrip.js +78 -124
  64. package/dist/device/wostrip.js.map +1 -1
  65. package/dist/device.d.ts +87 -224
  66. package/dist/device.d.ts.map +1 -1
  67. package/dist/device.js +123 -407
  68. package/dist/device.js.map +1 -1
  69. package/dist/index.d.ts +8 -0
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +8 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/parameter-checker.d.ts +78 -18
  74. package/dist/parameter-checker.d.ts.map +1 -1
  75. package/dist/parameter-checker.js +139 -334
  76. package/dist/parameter-checker.js.map +1 -1
  77. package/dist/settings.d.ts +46 -0
  78. package/dist/settings.d.ts.map +1 -1
  79. package/dist/settings.js +46 -2
  80. package/dist/settings.js.map +1 -1
  81. package/dist/switchbot-openapi.d.ts +56 -0
  82. package/dist/switchbot-openapi.d.ts.map +1 -0
  83. package/dist/switchbot-openapi.js +241 -0
  84. package/dist/switchbot-openapi.js.map +1 -0
  85. package/dist/switchbot.d.ts +41 -17
  86. package/dist/switchbot.d.ts.map +1 -1
  87. package/dist/switchbot.js +311 -176
  88. package/dist/switchbot.js.map +1 -1
  89. package/dist/test/woblindtilt.test.d.ts.map +1 -0
  90. package/dist/test/woblindtilt.test.js +97 -0
  91. package/dist/test/woblindtilt.test.js.map +1 -0
  92. package/dist/{device → test}/wobulb.test.d.ts.map +1 -1
  93. package/dist/test/wobulb.test.js +104 -0
  94. package/dist/test/wobulb.test.js.map +1 -0
  95. package/dist/test/woceilinglight.test.d.ts.map +1 -0
  96. package/dist/test/woceilinglight.test.js +95 -0
  97. package/dist/test/woceilinglight.test.js.map +1 -0
  98. package/dist/test/wocontact.test.d.ts.map +1 -0
  99. package/dist/test/wocontact.test.js +38 -0
  100. package/dist/test/wocontact.test.js.map +1 -0
  101. package/dist/test/wocurtain.test.d.ts.map +1 -0
  102. package/dist/test/wocurtain.test.js +76 -0
  103. package/dist/test/wocurtain.test.js.map +1 -0
  104. package/dist/{device → test}/wohand.test.d.ts.map +1 -1
  105. package/dist/test/wohand.test.js +76 -0
  106. package/dist/test/wohand.test.js.map +1 -0
  107. package/dist/test/wohub2.test.d.ts +2 -0
  108. package/dist/test/wohub2.test.d.ts.map +1 -0
  109. package/dist/{device/wohand2.test.js → test/wohub2.test.js} +10 -8
  110. package/dist/test/wohub2.test.js.map +1 -0
  111. package/dist/{device → test}/wohumi.test.d.ts.map +1 -1
  112. package/dist/{device → test}/wohumi.test.js +5 -2
  113. package/dist/test/wohumi.test.js.map +1 -0
  114. package/dist/test/woiosensorth.test.d.ts.map +1 -0
  115. package/dist/{device → test}/woiosensorth.test.js +11 -9
  116. package/dist/test/woiosensorth.test.js.map +1 -0
  117. package/dist/test/woplugmini.test.d.ts.map +1 -0
  118. package/dist/{device → test}/woplugmini.test.js +10 -5
  119. package/dist/test/woplugmini.test.js.map +1 -0
  120. package/dist/test/wopresence.test.d.ts.map +1 -0
  121. package/dist/{device → test}/wopresence.test.js +5 -1
  122. package/dist/test/wopresence.test.js.map +1 -0
  123. package/dist/test/wosensorth.test.d.ts.map +1 -0
  124. package/dist/{device → test}/wosensorth.test.js +5 -14
  125. package/dist/test/wosensorth.test.js.map +1 -0
  126. package/dist/test/wosmartlock.test.d.ts.map +1 -0
  127. package/dist/test/wosmartlock.test.js +147 -0
  128. package/dist/test/wosmartlock.test.js.map +1 -0
  129. package/dist/test/wosmartlockpro.test.d.ts.map +1 -0
  130. package/dist/{device → test}/wosmartlockpro.test.js +30 -26
  131. package/dist/test/wosmartlockpro.test.js.map +1 -0
  132. package/dist/{device → test}/wostrip.test.d.ts.map +1 -1
  133. package/dist/{device → test}/wostrip.test.js +18 -19
  134. package/dist/test/wostrip.test.js.map +1 -0
  135. package/dist/types/bledevicestatus.d.ts +4 -12
  136. package/dist/types/bledevicestatus.d.ts.map +1 -1
  137. package/dist/types/devicelist.d.ts.map +1 -1
  138. package/dist/types/devicelist.js +0 -4
  139. package/dist/types/devicelist.js.map +1 -1
  140. package/dist/types/deviceresponse.d.ts.map +1 -1
  141. package/dist/types/devicestatus.d.ts.map +1 -1
  142. package/dist/types/irdevicelist.d.ts.map +1 -1
  143. package/dist/types/pushbody.d.ts +1 -1
  144. package/dist/types/pushbody.d.ts.map +1 -1
  145. package/dist/types/types.d.ts +71 -120
  146. package/dist/types/types.d.ts.map +1 -1
  147. package/dist/types/types.js +10 -0
  148. package/dist/types/types.js.map +1 -1
  149. package/package.json +6 -4
  150. package/dist/device/woblindtilt.test.d.ts.map +0 -1
  151. package/dist/device/woblindtilt.test.js +0 -26
  152. package/dist/device/woblindtilt.test.js.map +0 -1
  153. package/dist/device/wobulb.test.js +0 -52
  154. package/dist/device/wobulb.test.js.map +0 -1
  155. package/dist/device/woceilinglight.test.d.ts.map +0 -1
  156. package/dist/device/woceilinglight.test.js +0 -63
  157. package/dist/device/woceilinglight.test.js.map +0 -1
  158. package/dist/device/wocontact.test.d.ts.map +0 -1
  159. package/dist/device/wocontact.test.js +0 -34
  160. package/dist/device/wocontact.test.js.map +0 -1
  161. package/dist/device/wocurtain.test.d.ts.map +0 -1
  162. package/dist/device/wocurtain.test.js +0 -33
  163. package/dist/device/wocurtain.test.js.map +0 -1
  164. package/dist/device/wohand.test.js +0 -62
  165. package/dist/device/wohand.test.js.map +0 -1
  166. package/dist/device/wohand2.test.d.ts +0 -2
  167. package/dist/device/wohand2.test.d.ts.map +0 -1
  168. package/dist/device/wohand2.test.js.map +0 -1
  169. package/dist/device/wohumi.test.js.map +0 -1
  170. package/dist/device/woiosensorth.test.d.ts.map +0 -1
  171. package/dist/device/woiosensorth.test.js.map +0 -1
  172. package/dist/device/woplugmini.test.d.ts.map +0 -1
  173. package/dist/device/woplugmini.test.js.map +0 -1
  174. package/dist/device/wopresence.test.d.ts.map +0 -1
  175. package/dist/device/wopresence.test.js.map +0 -1
  176. package/dist/device/wosensorth.test.d.ts.map +0 -1
  177. package/dist/device/wosensorth.test.js.map +0 -1
  178. package/dist/device/wosmartlock.test.d.ts.map +0 -1
  179. package/dist/device/wosmartlock.test.js +0 -84
  180. package/dist/device/wosmartlock.test.js.map +0 -1
  181. package/dist/device/wosmartlockpro.test.d.ts.map +0 -1
  182. package/dist/device/wosmartlockpro.test.js.map +0 -1
  183. package/dist/device/wostrip.test.js.map +0 -1
  184. /package/dist/{device → test}/woblindtilt.test.d.ts +0 -0
  185. /package/dist/{device → test}/wobulb.test.d.ts +0 -0
  186. /package/dist/{device → test}/woceilinglight.test.d.ts +0 -0
  187. /package/dist/{device → test}/wocontact.test.d.ts +0 -0
  188. /package/dist/{device → test}/wocurtain.test.d.ts +0 -0
  189. /package/dist/{device → test}/wohand.test.d.ts +0 -0
  190. /package/dist/{device → test}/wohumi.test.d.ts +0 -0
  191. /package/dist/{device → test}/woiosensorth.test.d.ts +0 -0
  192. /package/dist/{device → test}/woplugmini.test.d.ts +0 -0
  193. /package/dist/{device → test}/wopresence.test.d.ts +0 -0
  194. /package/dist/{device → test}/wosensorth.test.d.ts +0 -0
  195. /package/dist/{device → test}/wosmartlock.test.d.ts +0 -0
  196. /package/dist/{device → test}/wosmartlockpro.test.d.ts +0 -0
  197. /package/dist/{device → test}/wostrip.test.d.ts +0 -0
@@ -1,23 +1,16 @@
1
1
  import { Buffer } from 'node:buffer';
2
2
  import * as Crypto from 'node:crypto';
3
- /*
4
- * wosmartlock.ts: Switchbot BLE API registration.
5
- * adapted off the work done by [pySwitchbot](https://github.com/Danielhiversen/pySwitchbot)
6
- */
7
3
  import { SwitchbotDevice } from '../device.js';
4
+ import { WoSmartLockCommands } from '../settings.js';
8
5
  import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js';
9
- import { WoSmartLockPro } from './wosmartlockpro.js';
6
+ /**
7
+ * Class representing a WoSmartLock device.
8
+ * @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/lock.md
9
+ */
10
10
  export class WoSmartLock extends SwitchbotDevice {
11
- iv;
12
- key_id;
13
- encryption_key;
14
- static COMMAND_GET_CKiv = '570f2103';
15
- static COMMAND_LOCK_INFO = '570f4f8101';
16
- static COMMAND_UNLOCK = '570f4e01011080';
17
- static COMMAND_UNLOCK_NO_UNLATCH = '570f4e010110a0';
18
- static COMMAND_LOCK = '570f4e01011000';
19
- static COMMAND_ENABLE_NOTIFICATIONS = '570e01001e00008101';
20
- static COMMAND_DISABLE_NOTIFICATIONS = '570e00';
11
+ iv = null;
12
+ key_id = '';
13
+ encryption_key = null;
21
14
  static Result = {
22
15
  ERROR: 0x00,
23
16
  SUCCESS: 0x01,
@@ -25,227 +18,146 @@ export class WoSmartLock extends SwitchbotDevice {
25
18
  };
26
19
  static async validateResponse(res) {
27
20
  if (res.length >= 3) {
28
- switch (res.readUInt8(0)) {
29
- case WoSmartLock.Result.SUCCESS:
30
- return WoSmartLock.Result.SUCCESS;
31
- case WoSmartLock.Result.SUCCESS_LOW_BATTERY:
32
- return WoSmartLock.Result.SUCCESS_LOW_BATTERY;
21
+ const result = res.readUInt8(0);
22
+ if (result === WoSmartLock.Result.SUCCESS || result === WoSmartLock.Result.SUCCESS_LOW_BATTERY) {
23
+ return result;
33
24
  }
34
25
  }
35
26
  return WoSmartLock.Result.ERROR;
36
27
  }
37
28
  static getLockStatus(code) {
38
- switch (code) {
39
- case 0b0000000:
40
- return 'LOCKED';
41
- case 0b0010000:
42
- return 'UNLOCKED';
43
- case 0b0100000:
44
- return 'LOCKING';
45
- case 0b0110000:
46
- return 'UNLOCKING';
47
- case 0b1000000:
48
- return 'LOCKING_STOP';
49
- case 0b1010000:
50
- return 'UNLOCKING_STOP';
51
- case 0b1100000: // Only EU lock type
52
- return 'NOT_FULLY_LOCKED';
53
- default:
54
- return 'UNKNOWN';
55
- }
29
+ const statusMap = {
30
+ 0b0000000: 'LOCKED',
31
+ 0b0010000: 'UNLOCKED',
32
+ 0b0100000: 'LOCKING',
33
+ 0b0110000: 'UNLOCKING',
34
+ 0b1000000: 'LOCKING_STOP',
35
+ 0b1010000: 'UNLOCKING_STOP',
36
+ 0b1100000: 'NOT_FULLY_LOCKED', // Only EU lock type
37
+ };
38
+ return statusMap[code] || 'UNKNOWN';
56
39
  }
57
40
  static async parseServiceData(serviceData, manufacturerData, onlog) {
58
41
  if (manufacturerData.length < 11) {
59
- if (onlog && typeof onlog === 'function') {
60
- onlog(`[parseServiceDataForWoSmartLock] Buffer length ${manufacturerData.length} is too short!`);
61
- }
42
+ onlog?.(`[parseServiceDataForWoSmartLock] Buffer length ${manufacturerData.length} is too short!`);
62
43
  return null;
63
44
  }
64
- // adv data needs both service data and manufacturer data
65
- // byte var names based on documentation
66
45
  const byte2 = serviceData.readUInt8(2);
67
46
  const byte15 = manufacturerData.readUInt8(9);
68
47
  const byte16 = manufacturerData.readUInt8(10);
69
- const battery = byte2 & 0b01111111; // %
70
- const calibration = !!(byte15 & 0b10000000);
71
- const status = WoSmartLock.getLockStatus(byte15 & 0b01110000);
72
- const update_from_secondary_lock = !!(byte15 & 0b00001000);
73
- const door_open = !!(byte15 & 0b00000100);
74
- const double_lock_mode = !!(byte16 & 0b10000000);
75
- const unclosed_alarm = !!(byte16 & 0b00100000);
76
- const unlocked_alarm = !!(byte16 & 0b00010000);
77
- const auto_lock_paused = !!(byte16 & 0b00000010);
78
- const night_latch = !!(manufacturerData.length > 11 && manufacturerData.readUInt8(11) & 0b00000001);
79
48
  const data = {
80
49
  model: SwitchBotBLEModel.Lock,
81
50
  modelName: SwitchBotBLEModelName.Lock,
82
51
  modelFriendlyName: SwitchBotBLEModelFriendlyName.Lock,
83
- battery,
84
- calibration,
85
- status,
86
- update_from_secondary_lock,
87
- door_open,
88
- double_lock_mode,
89
- unclosed_alarm,
90
- unlocked_alarm,
91
- auto_lock_paused,
92
- night_latch,
52
+ battery: byte2 & 0b01111111,
53
+ calibration: !!(byte15 & 0b10000000),
54
+ status: WoSmartLock.getLockStatus(byte15 & 0b01110000),
55
+ update_from_secondary_lock: !!(byte15 & 0b00001000),
56
+ door_open: !!(byte15 & 0b00000100),
57
+ double_lock_mode: !!(byte16 & 0b10000000),
58
+ unclosed_alarm: !!(byte16 & 0b00100000),
59
+ unlocked_alarm: !!(byte16 & 0b00010000),
60
+ auto_lock_paused: !!(byte16 & 0b00000010),
61
+ night_latch: !!(manufacturerData.length > 11 && manufacturerData.readUInt8(11) & 0b00000001),
93
62
  };
94
63
  return data;
95
64
  }
96
65
  constructor(peripheral, noble) {
97
66
  super(peripheral, noble);
98
- this.iv = null;
99
- this.key_id = '';
100
- this.encryption_key = null;
101
67
  }
102
- /* ------------------------------------------------------------------
103
- * setKey()
104
- * - initialise the encryption key info for valid lock communication, this currently must be retrived externally
105
- *
106
- * [Arguments]
107
- * - keyId, encryptionKey
108
- *
109
- * [Return value]
110
- * - void
111
- * ---------------------------------------------------------------- */
68
+ /**
69
+ * Initializes the encryption key info for valid lock communication.
70
+ * @param {string} keyId - The key ID.
71
+ * @param {string} encryptionKey - The encryption key.
72
+ */
112
73
  async setKey(keyId, encryptionKey) {
113
74
  this.iv = null;
114
75
  this.key_id = keyId;
115
76
  this.encryption_key = Buffer.from(encryptionKey, 'hex');
116
77
  }
117
- /* ------------------------------------------------------------------
118
- * unlock()
119
- * - Unlock the Smart Lock
120
- *
121
- * [Arguments]
122
- * - none
123
- *
124
- * [Return value]
125
- * - Promise object
126
- * WoSmartLock.LockResult will be passed to the `resolve()`.
127
- * ---------------------------------------------------------------- */
78
+ /**
79
+ * Unlocks the Smart Lock.
80
+ * @returns {Promise<number>} - The result of the unlock operation.
81
+ */
128
82
  async unlock() {
129
- await this.operateLock(WoSmartLock.COMMAND_UNLOCK)
130
- .then((resBuf) => {
131
- if (resBuf) {
132
- return WoSmartLock.validateResponse(resBuf);
133
- }
134
- else {
135
- return WoSmartLockPro.Result.ERROR;
136
- }
137
- })
138
- .catch((error) => {
139
- return error;
140
- });
83
+ const resBuf = await this.operateLock(WoSmartLockCommands.UNLOCK);
84
+ return resBuf ? WoSmartLock.validateResponse(resBuf) : WoSmartLock.Result.ERROR;
141
85
  }
142
- /* ------------------------------------------------------------------
143
- * unlockNoUnlatch()
144
- * - Unlock the Smart Lock without unlatching door
145
- *
146
- * [Arguments]
147
- * - none
148
- *
149
- * [Return value]
150
- * - Promise object
151
- * WoSmartLock.LockResult will be passed to the `resolve()`.
152
- * ---------------------------------------------------------------- */
86
+ /**
87
+ * Unlocks the Smart Lock without unlatching the door.
88
+ * @returns {Promise<number>} - The result of the unlock operation.
89
+ */
153
90
  async unlockNoUnlatch() {
154
- await this.operateLock(WoSmartLock.COMMAND_UNLOCK_NO_UNLATCH)
155
- .then((resBuf) => {
156
- if (resBuf) {
157
- return WoSmartLock.validateResponse(resBuf);
158
- }
159
- else {
160
- throw new Error('Failed to retrieve response buffer from the device.');
161
- }
162
- })
163
- .catch((error) => {
164
- return error;
165
- });
91
+ const resBuf = await this.operateLock(WoSmartLockCommands.UNLOCK_NO_UNLATCH);
92
+ return resBuf ? WoSmartLock.validateResponse(resBuf) : WoSmartLock.Result.ERROR;
166
93
  }
167
- /* ------------------------------------------------------------------
168
- * lock()
169
- * - Lock the Smart Lock
170
- *
171
- * [Arguments]
172
- * - none
173
- *
174
- * [Return value]
175
- * - Promise object
176
- * WoSmartLock.LockResult will be passed to the `resolve()`.
177
- * ---------------------------------------------------------------- */
94
+ /**
95
+ * Locks the Smart Lock.
96
+ * @returns {Promise<number>} - The result of the lock operation.
97
+ */
178
98
  async lock() {
179
- await this.operateLock(WoSmartLock.COMMAND_LOCK)
180
- .then((resBuf) => {
181
- if (resBuf) {
182
- return WoSmartLock.validateResponse(resBuf);
183
- }
184
- else {
185
- throw new Error('Failed to retrieve response buffer from the device.');
186
- }
187
- })
188
- .catch((error) => {
189
- return error;
190
- });
99
+ const resBuf = await this.operateLock(WoSmartLockCommands.LOCK);
100
+ return resBuf ? WoSmartLock.validateResponse(resBuf) : WoSmartLock.Result.ERROR;
191
101
  }
192
- /* ------------------------------------------------------------------
193
- * info()
194
- * - Get general state info from the Smart Lock
195
- *
196
- * [Arguments]
197
- * - none
198
- *
199
- * [Return value]
200
- * - Promise object
201
- * state object will be passed to the `resolve()`
202
- * ---------------------------------------------------------------- */
102
+ /**
103
+ * Gets general state info from the Smart Lock.
104
+ * @returns {Promise<object | null>} - The state object or null if an error occurred.
105
+ */
203
106
  async info() {
204
- await this.operateLock(WoSmartLock.COMMAND_LOCK_INFO)
205
- .then((resBuf) => {
206
- if (resBuf) {
207
- const data = {
208
- calibration: Boolean(resBuf[1] & 0b10000000),
209
- status: WoSmartLock.getLockStatus((resBuf[1] & 0b01110000)),
210
- door_open: Boolean(resBuf[1] & 0b00000100),
211
- unclosed_alarm: Boolean(resBuf[2] & 0b00100000),
212
- unlocked_alarm: Boolean(resBuf[2] & 0b00010000),
213
- };
214
- return data;
215
- }
216
- else {
217
- throw new Error('Failed to retrieve response buffer from the device.');
218
- }
219
- })
220
- .catch((error) => {
221
- return error;
222
- });
107
+ const resBuf = await this.operateLock(WoSmartLockCommands.LOCK_INFO);
108
+ if (resBuf) {
109
+ return {
110
+ calibration: Boolean(resBuf[1] & 0b10000000),
111
+ status: WoSmartLock.getLockStatus((resBuf[1] & 0b01110000)),
112
+ door_open: Boolean(resBuf[1] & 0b00000100),
113
+ unclosed_alarm: Boolean(resBuf[2] & 0b00100000),
114
+ unlocked_alarm: Boolean(resBuf[2] & 0b00010000),
115
+ };
116
+ }
117
+ return null;
223
118
  }
119
+ /**
120
+ * Encrypts a string using AES-128-CTR.
121
+ * @param {string} str - The string to encrypt.
122
+ * @returns {Promise<string>} - The encrypted string in hex format.
123
+ */
224
124
  async encrypt(str) {
225
125
  const cipher = Crypto.createCipheriv('aes-128-ctr', this.encryption_key, this.iv);
226
126
  return Buffer.concat([cipher.update(str, 'hex'), cipher.final()]).toString('hex');
227
127
  }
128
+ /**
129
+ * Decrypts a buffer using AES-128-CTR.
130
+ * @param {Buffer} data - The data to decrypt.
131
+ * @returns {Promise<Buffer>} - The decrypted data.
132
+ */
228
133
  async decrypt(data) {
229
134
  const decipher = Crypto.createDecipheriv('aes-128-ctr', this.encryption_key, this.iv);
230
135
  return Buffer.concat([decipher.update(data), decipher.final()]);
231
136
  }
137
+ /**
138
+ * Retrieves the IV from the device.
139
+ * @returns {Promise<Buffer>} - The IV buffer.
140
+ */
232
141
  async getIv() {
233
- if (this.iv === null) {
234
- const res = await this.operateLock(WoSmartLock.COMMAND_GET_CKiv + this.key_id, false);
142
+ if (!this.iv) {
143
+ const res = await this.operateLock(WoSmartLockCommands.GET_CKIV + this.key_id, false);
235
144
  if (res) {
236
145
  this.iv = res.subarray(4);
237
146
  }
238
147
  else {
239
- // Handle the case when 'res' is undefined
240
- // For example, you can throw an error or set a default value for 'this.iv'
241
148
  throw new Error('Failed to retrieve IV from the device.');
242
149
  }
243
150
  }
244
151
  return this.iv;
245
152
  }
153
+ /**
154
+ * Sends an encrypted command to the device.
155
+ * @param {string} key - The command key.
156
+ * @returns {Promise<Buffer>} - The response buffer.
157
+ */
246
158
  async encryptedCommand(key) {
247
159
  const iv = await this.getIv();
248
- const req = Buffer.from(key.substring(0, 2) + this.key_id + Buffer.from(iv.subarray(0, 2)).toString('hex') + this.encrypt(key.substring(2)), 'hex');
160
+ const req = Buffer.from(key.substring(0, 2) + this.key_id + Buffer.from(iv.subarray(0, 2)).toString('hex') + await this.encrypt(key.substring(2)), 'hex');
249
161
  const bytes = await this.command(req);
250
162
  const buf = Buffer.from(bytes);
251
163
  const code = WoSmartLock.validateResponse(buf);
@@ -256,24 +168,24 @@ export class WoSmartLock extends SwitchbotDevice {
256
168
  throw new Error(`The device returned an error: 0x${buf.toString('hex')}`);
257
169
  }
258
170
  }
171
+ /**
172
+ * Operates the lock with the given command.
173
+ * @param {string} key - The command key.
174
+ * @param {boolean} [encrypt] - Whether to encrypt the command.
175
+ * @returns {Promise<Buffer>} - The response buffer.
176
+ */
259
177
  async operateLock(key, encrypt = true) {
260
- // encrypted command
261
178
  if (encrypt) {
262
- return await this.encryptedCommand(key);
179
+ return this.encryptedCommand(key);
263
180
  }
264
181
  const req = Buffer.from(`${key.substring(0, 2)}000000${key.substring(2)}`, 'hex');
265
- await this.command(req).then(async (bytes) => {
266
- const buf = Buffer.from(bytes);
267
- const code = WoSmartLock.validateResponse(buf);
268
- if (await code === WoSmartLock.Result.ERROR) {
269
- return new Error(`The device returned an error: 0x${buf.toString('hex')}`);
270
- }
271
- else {
272
- return buf;
273
- }
274
- }).catch((error) => {
275
- return error;
276
- });
182
+ const bytes = await this.command(req);
183
+ const buf = Buffer.from(bytes);
184
+ const code = WoSmartLock.validateResponse(buf);
185
+ if (await code === WoSmartLock.Result.ERROR) {
186
+ throw new Error(`The device returned an error: 0x${buf.toString('hex')}`);
187
+ }
188
+ return buf;
277
189
  }
278
190
  }
279
191
  //# sourceMappingURL=wosmartlock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wosmartlock.js","sourceRoot":"","sources":["../../src/device/wosmartlock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wosmartlock.js","sourceRoot":"","sources":["../../src/device/wosmartlock.ts"],"names":[],"mappings":"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"}
@@ -2,35 +2,78 @@ import type * as Noble from '@stoprocent/noble';
2
2
  import type { lockProServiceData } from '../types/bledevicestatus.js';
3
3
  import { Buffer } from 'node:buffer';
4
4
  import { SwitchbotDevice } from '../device.js';
5
+ /**
6
+ * Class representing a WoSmartLockPro device.
7
+ * @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/lock.md
8
+ */
5
9
  export declare class WoSmartLockPro extends SwitchbotDevice {
6
- _iv: Buffer | null;
7
- _key_id: string;
8
- _encryption_key: Buffer | null;
9
- static COMMAND_GET_CK_IV: string;
10
- static COMMAND_LOCK_INFO: string;
11
- static COMMAND_UNLOCK: string;
12
- static COMMAND_UNLOCK_NO_UNLATCH: string;
13
- static COMMAND_LOCK: string;
14
- static COMMAND_ENABLE_NOTIFICATIONS: string;
15
- static COMMAND_DISABLE_NOTIFICATIONS: string;
10
+ iv: Buffer | null;
11
+ key_id: string;
12
+ encryption_key: Buffer | null;
16
13
  static Result: {
17
14
  ERROR: number;
18
15
  SUCCESS: number;
19
16
  SUCCESS_LOW_BATTERY: number;
20
17
  };
21
- static validateResponse(res: Buffer): number;
22
- static getLockStatus(code: number): "LOCKED" | "UNLOCKED" | "LOCKING" | "UNLOCKING" | "LOCKING_STOP" | "UNLOCKING_STOP" | "NOT_FULLY_LOCKED" | "UNKNOWN";
23
- static parseServiceData(serviceData: Buffer, manufacturerData: Buffer, onlog: ((message: string) => void) | undefined): Promise<lockProServiceData | null>;
18
+ static validateResponse(res: Buffer): Promise<number>;
19
+ static getLockStatus(code: number): string;
20
+ static parseServiceData(serviceData: Buffer, manufacturerData: Buffer, onlog?: (message: string) => void): Promise<lockProServiceData | null>;
24
21
  constructor(peripheral: Noble.Peripheral, noble: typeof Noble);
22
+ /**
23
+ * Initializes the encryption key info for valid lock communication.
24
+ * @param {string} keyId - The key ID.
25
+ * @param {string} encryptionKey - The encryption key.
26
+ */
25
27
  setKey(keyId: string, encryptionKey: string): Promise<void>;
26
- unlock(): Promise<void>;
27
- unlockNoUnlatch(): Promise<void>;
28
- lock(): Promise<void>;
29
- info(): Promise<void>;
28
+ /**
29
+ * Unlocks the Smart Lock.
30
+ * @returns {Promise<number>} - The result of the unlock operation.
31
+ */
32
+ unlock(): Promise<number>;
33
+ /**
34
+ * Unlocks the Smart Lock without unlatching the door.
35
+ * @returns {Promise<number>} - The result of the unlock operation.
36
+ */
37
+ unlockNoUnlatch(): Promise<number>;
38
+ /**
39
+ * Locks the Smart Lock.
40
+ * @returns {Promise<number>} - The result of the lock operation.
41
+ */
42
+ lock(): Promise<number>;
43
+ /**
44
+ * Gets general state info from the Smart Lock.
45
+ * @returns {Promise<object | null>} - The state object or null if an error occurred.
46
+ */
47
+ info(): Promise<object | null>;
48
+ /**
49
+ * Encrypts a string using AES-128-CTR.
50
+ * @param {string} str - The string to encrypt.
51
+ * @returns {Promise<string>} - The encrypted string in hex format.
52
+ */
30
53
  encrypt(str: string): Promise<string>;
54
+ /**
55
+ * Decrypts a buffer using AES-128-CTR.
56
+ * @param {Buffer} data - The data to decrypt.
57
+ * @returns {Promise<Buffer>} - The decrypted data.
58
+ */
31
59
  decrypt(data: Buffer): Promise<Buffer>;
60
+ /**
61
+ * Retrieves the IV from the device.
62
+ * @returns {Promise<Buffer>} - The IV buffer.
63
+ */
32
64
  getIv(): Promise<Buffer>;
65
+ /**
66
+ * Sends an encrypted command to the device.
67
+ * @param {string} key - The command key.
68
+ * @returns {Promise<Buffer>} - The response buffer.
69
+ */
33
70
  encryptedCommand(key: string): Promise<Buffer>;
34
- operateLockPro(key: string, encrypt?: boolean): Promise<Buffer | undefined>;
71
+ /**
72
+ * Operates the lock with the given command.
73
+ * @param {string} key - The command key.
74
+ * @param {boolean} [encrypt] - Whether to encrypt the command.
75
+ * @returns {Promise<Buffer>} - The response buffer.
76
+ */
77
+ operateLockPro(key: string, encrypt?: boolean): Promise<Buffer>;
35
78
  }
36
79
  //# sourceMappingURL=wosmartlockpro.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wosmartlockpro.d.ts","sourceRoot":"","sources":["../../src/device/wosmartlockpro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,mBAAmB,CAAA;AAE/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAErE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAOpC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C,qBAAa,cAAe,SAAQ,eAAe;IACjD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAO;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAE9B,MAAM,CAAC,iBAAiB,SAAa;IACrC,MAAM,CAAC,iBAAiB,SAAe;IACvC,MAAM,CAAC,cAAc,SAAqB;IAC1C,MAAM,CAAC,yBAAyB,SAAqB;IACrD,MAAM,CAAC,YAAY,SAAqB;IACxC,MAAM,CAAC,4BAA4B,SAAuB;IAC1D,MAAM,CAAC,6BAA6B,SAAW;IAE/C,MAAM,CAAC,MAAM;;;;MAIZ;IAED,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM;IAYnC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM;WAqBpB,gBAAgB,CAC3B,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GAC7C,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAgDzB,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,KAAK;IAiBvD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAiB3C,MAAM;IAyBN,eAAe;IAyBf,IAAI;IAyBJ,IAAI;IAqBJ,OAAO,CAAC,GAAG,EAAE,MAAM;IAKnB,OAAO,CAAC,IAAI,EAAE,MAAM;IAKpB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAYxB,gBAAgB,CAAC,GAAG,EAAE,MAAM;IAkB5B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc;CAqB1D"}
1
+ {"version":3,"file":"wosmartlockpro.d.ts","sourceRoot":"","sources":["../../src/device/wosmartlockpro.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,KAAK,MAAM,mBAAmB,CAAA;AAE/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAErE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAI9C;;;GAGG;AACH,qBAAa,cAAe,SAAQ,eAAe;IAC1C,EAAE,EAAE,MAAM,GAAG,IAAI,CAAO;IACxB,MAAM,EAAE,MAAM,CAAK;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAO;IAE3C,MAAM,CAAC,MAAM;;;;MAIZ;WAEY,gBAAgB,CAAC,GAAG,EAAE,MAAM;IAUzC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM;WAapB,gBAAgB,CAC3B,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,EACxB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBA+BzB,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,KAAK;IAI7D;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAMjD;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAK/B;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAKxC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAK7B;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAcpC;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK3C;;;;OAIG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK5C;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAY9B;;;;OAIG;IACG,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBpD;;;;;OAKG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CAc5E"}