node-switchbot 2.4.0 → 2.5.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/npm-version-script.cjs +81 -0
- package/CHANGELOG.md +1 -1
- package/dist/advertising.d.ts +14 -148
- package/dist/advertising.d.ts.map +1 -1
- package/dist/advertising.js +36 -92
- package/dist/advertising.js.map +1 -1
- package/dist/device/woblindtilt.d.ts +98 -13
- package/dist/device/woblindtilt.d.ts.map +1 -1
- package/dist/device/woblindtilt.js +192 -86
- package/dist/device/woblindtilt.js.map +1 -1
- package/dist/device/woblindtilt.test.d.ts +2 -0
- package/dist/device/woblindtilt.test.d.ts.map +1 -0
- package/dist/device/woblindtilt.test.js +26 -0
- package/dist/device/woblindtilt.test.js.map +1 -0
- package/dist/device/wobulb.d.ts +17 -34
- package/dist/device/wobulb.d.ts.map +1 -1
- package/dist/device/wobulb.js +53 -61
- package/dist/device/wobulb.js.map +1 -1
- package/dist/device/wobulb.test.d.ts +2 -0
- package/dist/device/wobulb.test.d.ts.map +1 -0
- package/dist/device/wobulb.test.js +52 -0
- package/dist/device/wobulb.test.js.map +1 -0
- package/dist/device/woceilinglight.d.ts +21 -51
- package/dist/device/woceilinglight.d.ts.map +1 -1
- package/dist/device/woceilinglight.js +53 -64
- package/dist/device/woceilinglight.js.map +1 -1
- package/dist/device/woceilinglight.test.d.ts +2 -0
- package/dist/device/woceilinglight.test.d.ts.map +1 -0
- package/dist/device/woceilinglight.test.js +63 -0
- package/dist/device/woceilinglight.test.js.map +1 -0
- package/dist/device/wocontact.d.ts +1 -14
- package/dist/device/wocontact.d.ts.map +1 -1
- package/dist/device/wocontact.js +13 -13
- package/dist/device/wocontact.js.map +1 -1
- package/dist/device/wocontact.test.d.ts +2 -0
- package/dist/device/wocontact.test.d.ts.map +1 -0
- package/dist/device/wocontact.test.js +34 -0
- package/dist/device/wocontact.test.js.map +1 -0
- package/dist/device/wocurtain.d.ts +5 -16
- package/dist/device/wocurtain.d.ts.map +1 -1
- package/dist/device/wocurtain.js +58 -47
- package/dist/device/wocurtain.js.map +1 -1
- package/dist/device/wocurtain.test.d.ts +2 -0
- package/dist/device/wocurtain.test.d.ts.map +1 -0
- package/dist/device/wocurtain.test.js +33 -0
- package/dist/device/wocurtain.test.js.map +1 -0
- package/dist/device/wohand.d.ts +2 -10
- package/dist/device/wohand.d.ts.map +1 -1
- package/dist/device/wohand.js +31 -33
- package/dist/device/wohand.js.map +1 -1
- package/dist/device/wohand.test.d.ts +2 -0
- package/dist/device/wohand.test.d.ts.map +1 -0
- package/dist/device/wohand.test.js +62 -0
- package/dist/device/wohand.test.js.map +1 -0
- package/dist/device/wohand2.test.d.ts +2 -0
- package/dist/device/wohand2.test.d.ts.map +1 -0
- package/dist/device/wohand2.test.js +50 -0
- package/dist/device/wohand2.test.js.map +1 -0
- package/dist/device/wohub2.d.ts +1 -19
- package/dist/device/wohub2.d.ts.map +1 -1
- package/dist/device/wohub2.js +6 -2
- package/dist/device/wohub2.js.map +1 -1
- package/dist/device/wohumi.d.ts +2 -11
- package/dist/device/wohumi.d.ts.map +1 -1
- package/dist/device/wohumi.js +31 -33
- package/dist/device/wohumi.js.map +1 -1
- package/dist/device/wohumi.test.d.ts +2 -0
- package/dist/device/wohumi.test.d.ts.map +1 -0
- package/dist/device/wohumi.test.js +61 -0
- package/dist/device/wohumi.test.js.map +1 -0
- package/dist/device/woiosensorth.d.ts +1 -19
- package/dist/device/woiosensorth.d.ts.map +1 -1
- package/dist/device/woiosensorth.js +14 -10
- package/dist/device/woiosensorth.js.map +1 -1
- package/dist/device/woiosensorth.test.d.ts +2 -0
- package/dist/device/woiosensorth.test.d.ts.map +1 -0
- package/dist/device/woiosensorth.test.js +39 -0
- package/dist/device/woiosensorth.test.js.map +1 -0
- package/dist/device/woplugmini.d.ts +12 -38
- package/dist/device/woplugmini.d.ts.map +1 -1
- package/dist/device/woplugmini.js +35 -40
- package/dist/device/woplugmini.js.map +1 -1
- package/dist/device/woplugmini.test.d.ts +2 -0
- package/dist/device/woplugmini.test.d.ts.map +1 -0
- package/dist/device/woplugmini.test.js +91 -0
- package/dist/device/woplugmini.test.js.map +1 -0
- package/dist/device/wopresence.d.ts +2 -14
- package/dist/device/wopresence.d.ts.map +1 -1
- package/dist/device/wopresence.js +11 -7
- package/dist/device/wopresence.js.map +1 -1
- package/dist/device/wopresence.test.d.ts +2 -0
- package/dist/device/wopresence.test.d.ts.map +1 -0
- package/dist/device/wopresence.test.js +42 -0
- package/dist/device/wopresence.test.js.map +1 -0
- package/dist/device/wosensorth.d.ts +3 -37
- package/dist/device/wosensorth.d.ts.map +1 -1
- package/dist/device/wosensorth.js +24 -20
- package/dist/device/wosensorth.js.map +1 -1
- package/dist/device/wosensorth.test.d.ts +2 -0
- package/dist/device/wosensorth.test.d.ts.map +1 -0
- package/dist/device/wosensorth.test.js +59 -0
- package/dist/device/wosensorth.test.js.map +1 -0
- package/dist/device/wosmartlock.d.ts +19 -33
- package/dist/device/wosmartlock.d.ts.map +1 -1
- package/dist/device/wosmartlock.js +104 -83
- package/dist/device/wosmartlock.js.map +1 -1
- package/dist/device/wosmartlock.test.d.ts +2 -0
- package/dist/device/wosmartlock.test.d.ts.map +1 -0
- package/dist/device/wosmartlock.test.js +84 -0
- package/dist/device/wosmartlock.test.js.map +1 -0
- package/dist/device/wosmartlockpro.d.ts +13 -27
- package/dist/device/wosmartlockpro.d.ts.map +1 -1
- package/dist/device/wosmartlockpro.js +90 -70
- package/dist/device/wosmartlockpro.js.map +1 -1
- package/dist/device/wosmartlockpro.test.d.ts +2 -0
- package/dist/device/wosmartlockpro.test.d.ts.map +1 -0
- package/dist/device/wosmartlockpro.test.js +124 -0
- package/dist/device/wosmartlockpro.test.js.map +1 -0
- package/dist/device/wostrip.d.ts +18 -32
- package/dist/device/wostrip.d.ts.map +1 -1
- package/dist/device/wostrip.js +58 -70
- package/dist/device/wostrip.js.map +1 -1
- package/dist/device/wostrip.test.d.ts +2 -0
- package/dist/device/wostrip.test.d.ts.map +1 -0
- package/dist/device/wostrip.test.js +115 -0
- package/dist/device/wostrip.test.js.map +1 -0
- package/dist/device.d.ts +237 -39
- package/dist/device.d.ts.map +1 -1
- package/dist/device.js +478 -366
- package/dist/device.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/parameter-checker.d.ts.map +1 -1
- package/dist/parameter-checker.js.map +1 -1
- package/dist/settings.d.ts +8 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +12 -0
- package/dist/settings.js.map +1 -0
- package/dist/switchbot.d.ts +30 -10
- package/dist/switchbot.d.ts.map +1 -1
- package/dist/switchbot.js +39 -86
- package/dist/switchbot.js.map +1 -1
- package/dist/types/bledevicestatus.d.ts +288 -0
- package/dist/types/bledevicestatus.d.ts.map +1 -0
- package/dist/types/bledevicestatus.js +2 -0
- package/dist/types/bledevicestatus.js.map +1 -0
- package/dist/types/devicelist.d.ts +89 -0
- package/dist/types/devicelist.d.ts.map +1 -0
- package/dist/types/devicelist.js +6 -0
- package/dist/types/devicelist.js.map +1 -0
- package/dist/types/deviceresponse.d.ts +13 -0
- package/dist/types/deviceresponse.d.ts.map +1 -0
- package/dist/types/deviceresponse.js +2 -0
- package/dist/types/deviceresponse.js.map +1 -0
- package/dist/types/devicestatus.d.ts +149 -0
- package/dist/types/devicestatus.d.ts.map +1 -0
- package/dist/types/devicestatus.js +3 -0
- package/dist/types/devicestatus.js.map +1 -0
- package/dist/types/devicewebhookstatus.d.ts +156 -0
- package/dist/types/devicewebhookstatus.d.ts.map +1 -0
- package/dist/types/devicewebhookstatus.js +2 -0
- package/dist/types/devicewebhookstatus.js.map +1 -0
- package/dist/types/irdevicelist.d.ts +10 -0
- package/dist/types/irdevicelist.d.ts.map +1 -0
- package/dist/types/irdevicelist.js +2 -0
- package/dist/types/irdevicelist.js.map +1 -0
- package/dist/types/pushbody.d.ts +6 -0
- package/dist/types/pushbody.d.ts.map +1 -0
- package/dist/types/pushbody.js +2 -0
- package/dist/types/pushbody.js.map +1 -0
- package/dist/{types.d.ts → types/types.d.ts} +9 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js.map +1 -0
- package/jest.config.js +3 -0
- package/package.json +22 -14
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{types.js → types/types.js} +0 -0
|
@@ -1,9 +1,13 @@
|
|
|
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
|
+
*/
|
|
3
7
|
import { SwitchbotDevice } from '../device.js';
|
|
4
|
-
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
|
|
8
|
+
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js';
|
|
5
9
|
export class WoSmartLockPro extends SwitchbotDevice {
|
|
6
|
-
_iv;
|
|
10
|
+
_iv = null;
|
|
7
11
|
_key_id;
|
|
8
12
|
_encryption_key;
|
|
9
13
|
static COMMAND_GET_CK_IV = '570f2103';
|
|
@@ -49,7 +53,7 @@ export class WoSmartLockPro extends SwitchbotDevice {
|
|
|
49
53
|
return 'UNKNOWN';
|
|
50
54
|
}
|
|
51
55
|
}
|
|
52
|
-
static parseServiceData(serviceData, manufacturerData, onlog) {
|
|
56
|
+
static async parseServiceData(serviceData, manufacturerData, onlog) {
|
|
53
57
|
if (manufacturerData.length < 11) {
|
|
54
58
|
if (onlog && typeof onlog === 'function') {
|
|
55
59
|
onlog(`[parseServiceDataForWoSmartLockPro] Buffer length ${manufacturerData.length} is too short!`);
|
|
@@ -68,8 +72,8 @@ export class WoSmartLockPro extends SwitchbotDevice {
|
|
|
68
72
|
const status = WoSmartLockPro.getLockStatus((byte7 & 0b00111000) >> 3);
|
|
69
73
|
const door_open = !!(byte8 & 0b01100000);
|
|
70
74
|
// Double lock mode is not supported on Lock Pro
|
|
71
|
-
const update_from_secondary_lock = false; // byte7 & 0b00001000
|
|
72
|
-
const double_lock_mode = false; // byte8 & 0b10000000
|
|
75
|
+
const update_from_secondary_lock = false; // !!(byte7 & 0b00001000)
|
|
76
|
+
const double_lock_mode = false; // !!(byte8 & 0b10000000)
|
|
73
77
|
const unclosed_alarm = !!(byte11 & 0b10000000);
|
|
74
78
|
const unlocked_alarm = !!(byte11 & 0b01000000);
|
|
75
79
|
const auto_lock_paused = !!(byte8 & 0b100000);
|
|
@@ -108,7 +112,7 @@ export class WoSmartLockPro extends SwitchbotDevice {
|
|
|
108
112
|
* [Return value]
|
|
109
113
|
* - void
|
|
110
114
|
* ---------------------------------------------------------------- */
|
|
111
|
-
setKey(keyId, encryptionKey) {
|
|
115
|
+
async setKey(keyId, encryptionKey) {
|
|
112
116
|
this._iv = null;
|
|
113
117
|
this._key_id = keyId;
|
|
114
118
|
this._encryption_key = Buffer.from(encryptionKey, 'hex');
|
|
@@ -124,15 +128,18 @@ export class WoSmartLockPro extends SwitchbotDevice {
|
|
|
124
128
|
* - Promise object
|
|
125
129
|
* WoSmartLockPro.LockResult will be passed to the `resolve()`.
|
|
126
130
|
* ---------------------------------------------------------------- */
|
|
127
|
-
unlock() {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
131
|
+
async unlock() {
|
|
132
|
+
await this.operateLockPro(WoSmartLockPro.COMMAND_UNLOCK)
|
|
133
|
+
.then((resBuf) => {
|
|
134
|
+
if (resBuf) {
|
|
135
|
+
return WoSmartLockPro.validateResponse(resBuf);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
return WoSmartLockPro.Result.ERROR;
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
.catch((error) => {
|
|
142
|
+
throw error;
|
|
136
143
|
});
|
|
137
144
|
}
|
|
138
145
|
/* ------------------------------------------------------------------
|
|
@@ -146,15 +153,18 @@ export class WoSmartLockPro extends SwitchbotDevice {
|
|
|
146
153
|
* - Promise object
|
|
147
154
|
* WoSmartLockPro.LockResult will be passed to the `resolve()`.
|
|
148
155
|
* ---------------------------------------------------------------- */
|
|
149
|
-
unlockNoUnlatch() {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
156
|
+
async unlockNoUnlatch() {
|
|
157
|
+
await this.operateLockPro(WoSmartLockPro.COMMAND_UNLOCK_NO_UNLATCH)
|
|
158
|
+
.then((resBuf) => {
|
|
159
|
+
if (resBuf) {
|
|
160
|
+
return WoSmartLockPro.validateResponse(resBuf);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
return WoSmartLockPro.Result.ERROR;
|
|
164
|
+
}
|
|
165
|
+
})
|
|
166
|
+
.catch((error) => {
|
|
167
|
+
throw error;
|
|
158
168
|
});
|
|
159
169
|
}
|
|
160
170
|
/* ------------------------------------------------------------------
|
|
@@ -168,15 +178,18 @@ export class WoSmartLockPro extends SwitchbotDevice {
|
|
|
168
178
|
* - Promise object
|
|
169
179
|
* WoSmartLockPro.LockResult will be passed to the `resolve()`.
|
|
170
180
|
* ---------------------------------------------------------------- */
|
|
171
|
-
lock() {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}
|
|
181
|
+
async lock() {
|
|
182
|
+
this.operateLockPro(WoSmartLockPro.COMMAND_LOCK)
|
|
183
|
+
.then((resBuf) => {
|
|
184
|
+
if (resBuf) {
|
|
185
|
+
return WoSmartLockPro.validateResponse(resBuf);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
return WoSmartLockPro.Result.ERROR;
|
|
189
|
+
}
|
|
190
|
+
})
|
|
191
|
+
.catch((error) => {
|
|
192
|
+
throw error;
|
|
180
193
|
});
|
|
181
194
|
}
|
|
182
195
|
/* ------------------------------------------------------------------
|
|
@@ -190,10 +203,10 @@ export class WoSmartLockPro extends SwitchbotDevice {
|
|
|
190
203
|
* - Promise object
|
|
191
204
|
* state object will be passed to the `resolve()`
|
|
192
205
|
* ---------------------------------------------------------------- */
|
|
193
|
-
info() {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
206
|
+
async info() {
|
|
207
|
+
await this.operateLockPro(WoSmartLockPro.COMMAND_LOCK_INFO)
|
|
208
|
+
.then((resBuf) => {
|
|
209
|
+
if (resBuf) {
|
|
197
210
|
const data = {
|
|
198
211
|
calibration: Boolean(resBuf[0] & 0b10000000),
|
|
199
212
|
status: WoSmartLockPro.getLockStatus((resBuf[0] & 0b01110000) >> 4),
|
|
@@ -201,61 +214,68 @@ export class WoSmartLockPro extends SwitchbotDevice {
|
|
|
201
214
|
unclosed_alarm: Boolean(resBuf[1] & 0b00100000),
|
|
202
215
|
unlocked_alarm: Boolean(resBuf[1] & 0b00010000),
|
|
203
216
|
};
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
}
|
|
217
|
+
return data;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
})
|
|
223
|
+
.catch((error) => {
|
|
224
|
+
throw error;
|
|
209
225
|
});
|
|
210
226
|
}
|
|
211
|
-
|
|
227
|
+
async encrypt(str) {
|
|
212
228
|
const cipher = Crypto.createCipheriv('aes-128-ctr', this._encryption_key, this._iv);
|
|
213
229
|
return Buffer.concat([cipher.update(str, 'hex'), cipher.final()]).toString('hex');
|
|
214
230
|
}
|
|
215
|
-
|
|
231
|
+
async decrypt(data) {
|
|
216
232
|
const decipher = Crypto.createDecipheriv('aes-128-ctr', this._encryption_key, this._iv);
|
|
217
233
|
return Buffer.concat([decipher.update(data), decipher.final()]);
|
|
218
234
|
}
|
|
219
|
-
async
|
|
235
|
+
async getIv() {
|
|
220
236
|
if (this._iv === null) {
|
|
221
|
-
const res = await this.
|
|
222
|
-
|
|
237
|
+
const res = await this.operateLockPro(WoSmartLockPro.COMMAND_GET_CK_IV + this._key_id, false);
|
|
238
|
+
if (res) {
|
|
239
|
+
this._iv = res.subarray(4);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
throw new Error('Failed to retrieve IV from the device.');
|
|
243
|
+
}
|
|
223
244
|
}
|
|
224
245
|
return this._iv;
|
|
225
246
|
}
|
|
226
|
-
async
|
|
227
|
-
const iv = await this.
|
|
228
|
-
const req = Buffer.from(key.substring(0, 2) + this._key_id + Buffer.from(iv.subarray(0, 2)).toString('hex') + this.
|
|
229
|
-
const bytes = await this.
|
|
247
|
+
async encryptedCommand(key) {
|
|
248
|
+
const iv = await this.getIv();
|
|
249
|
+
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');
|
|
250
|
+
const bytes = await this.command(req);
|
|
230
251
|
const buf = Buffer.from(bytes);
|
|
231
252
|
const code = WoSmartLockPro.validateResponse(buf);
|
|
232
253
|
if (code !== WoSmartLockPro.Result.ERROR) {
|
|
233
|
-
return Buffer.concat([buf.subarray(0, 1), this.
|
|
254
|
+
return Buffer.concat([buf.subarray(0, 1), await this.decrypt(buf.subarray(4))]);
|
|
234
255
|
}
|
|
235
256
|
else {
|
|
236
|
-
throw
|
|
257
|
+
throw new Error(`The device returned an error: 0x${buf.toString('hex')}`);
|
|
237
258
|
}
|
|
238
259
|
}
|
|
239
|
-
|
|
260
|
+
async operateLockPro(key, encrypt = true) {
|
|
240
261
|
// encrypted command
|
|
241
262
|
if (encrypt) {
|
|
242
|
-
return this.
|
|
263
|
+
return this.encryptedCommand(key);
|
|
243
264
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
});
|
|
265
|
+
const req = Buffer.from(`${key.substring(0, 2)}000000${key.substring(2)}`, 'hex');
|
|
266
|
+
await this.command(req)
|
|
267
|
+
.then((bytes) => {
|
|
268
|
+
const buf = Buffer.from(bytes);
|
|
269
|
+
const code = WoSmartLockPro.validateResponse(buf);
|
|
270
|
+
if (code === WoSmartLockPro.Result.ERROR) {
|
|
271
|
+
throw new Error(`The device returned an error: 0x${buf.toString('hex')}`);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
return buf;
|
|
275
|
+
}
|
|
276
|
+
})
|
|
277
|
+
.catch((error) => {
|
|
278
|
+
throw error;
|
|
259
279
|
});
|
|
260
280
|
}
|
|
261
281
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wosmartlockpro.js","sourceRoot":"","sources":["../../src/device/wosmartlockpro.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wosmartlockpro.js","sourceRoot":"","sources":["../../src/device/wosmartlockpro.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wosmartlockpro.test.d.ts","sourceRoot":"","sources":["../../src/device/wosmartlockpro.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import * as Noble from '@stoprocent/noble';
|
|
3
|
+
import { expect } from 'chai';
|
|
4
|
+
import sinon from 'sinon';
|
|
5
|
+
import { WoSmartLockPro } from './wosmartlockpro.js';
|
|
6
|
+
describe('woSmartLockPro', () => {
|
|
7
|
+
let lock;
|
|
8
|
+
let mockPeripheral;
|
|
9
|
+
let mockNoble;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
mockPeripheral = {};
|
|
12
|
+
mockNoble = sinon.stub(Noble);
|
|
13
|
+
lock = new WoSmartLockPro(mockPeripheral, mockNoble);
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
sinon.restore();
|
|
17
|
+
});
|
|
18
|
+
describe('setKey', () => {
|
|
19
|
+
it('should set the key id and encryption key', async () => {
|
|
20
|
+
const keyId = 'testKeyId';
|
|
21
|
+
const encryptionKey = '0123456789abcdef0123456789abcdef';
|
|
22
|
+
await lock.setKey(keyId, encryptionKey);
|
|
23
|
+
expect(lock._key_id).to.equal(keyId);
|
|
24
|
+
expect(lock._encryption_key?.toString('hex')).to.equal(encryptionKey);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe('unlock', () => {
|
|
28
|
+
it('should unlock the smart lock', async () => {
|
|
29
|
+
const operateLockProStub = sinon.stub(lock, 'operateLockPro').resolves(Buffer.from([0x01]));
|
|
30
|
+
const result = await lock.unlock();
|
|
31
|
+
expect(result).to.equal(WoSmartLockPro.Result.SUCCESS);
|
|
32
|
+
return expect(operateLockProStub.calledOnceWith(WoSmartLockPro.COMMAND_UNLOCK)).to.be.true;
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('unlockNoUnlatch', () => {
|
|
36
|
+
it('should unlock the smart lock without unlatching', async () => {
|
|
37
|
+
const operateLockProStub = sinon.stub(lock, 'operateLockPro').resolves(Buffer.from([0x01]));
|
|
38
|
+
const result = await lock.unlockNoUnlatch();
|
|
39
|
+
expect(result).to.equal(WoSmartLockPro.Result.SUCCESS);
|
|
40
|
+
return expect(operateLockProStub.calledOnceWith(WoSmartLockPro.COMMAND_UNLOCK_NO_UNLATCH)).to.be.true;
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('lock', () => {
|
|
44
|
+
it('should lock the smart lock', async () => {
|
|
45
|
+
const operateLockProStub = sinon.stub(lock, 'operateLockPro').resolves(Buffer.from([0x01]));
|
|
46
|
+
const result = await lock.lock();
|
|
47
|
+
expect(result).to.equal(WoSmartLockPro.Result.SUCCESS);
|
|
48
|
+
return expect(operateLockProStub.calledOnceWith(WoSmartLockPro.COMMAND_LOCK)).to.be.true;
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('info', () => {
|
|
52
|
+
it('should get the lock info', async () => {
|
|
53
|
+
const resBuf = Buffer.from([0b10000000, 0b00100000]);
|
|
54
|
+
const operateLockProStub = sinon.stub(lock, 'operateLockPro').resolves(resBuf);
|
|
55
|
+
const result = await lock.info();
|
|
56
|
+
expect(result).to.deep.equal({
|
|
57
|
+
calibration: true,
|
|
58
|
+
status: 'LOCKED',
|
|
59
|
+
door_open: false,
|
|
60
|
+
unclosed_alarm: true,
|
|
61
|
+
unlocked_alarm: false,
|
|
62
|
+
});
|
|
63
|
+
return expect(operateLockProStub.calledOnceWith(WoSmartLockPro.COMMAND_LOCK_INFO)).to.be.true;
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('encrypt', () => {
|
|
67
|
+
it('should encrypt a string', async () => {
|
|
68
|
+
const str = 'test';
|
|
69
|
+
lock._encryption_key = Buffer.from('0123456789abcdef0123456789abcdef', 'hex');
|
|
70
|
+
lock._iv = Buffer.from('0123456789abcdef', 'hex');
|
|
71
|
+
const encrypted = await lock.encrypt(str);
|
|
72
|
+
expect(encrypted).to.be.a('string');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('decrypt', () => {
|
|
76
|
+
it('should decrypt a buffer', async () => {
|
|
77
|
+
const data = Buffer.from('test', 'hex');
|
|
78
|
+
lock._encryption_key = Buffer.from('0123456789abcdef0123456789abcdef', 'hex');
|
|
79
|
+
lock._iv = Buffer.from('0123456789abcdef', 'hex');
|
|
80
|
+
const decrypted = await lock.decrypt(data);
|
|
81
|
+
expect(decrypted).to.be.instanceOf(Buffer);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('getIv', () => {
|
|
85
|
+
it('should get the IV', async () => {
|
|
86
|
+
const res = Buffer.from('00000000000000000000000000000000', 'hex');
|
|
87
|
+
const operateLockProStub = sinon.stub(lock, 'operateLockPro').resolves(res);
|
|
88
|
+
const iv = await lock.getIv();
|
|
89
|
+
expect(iv).to.deep.equal(res.subarray(4));
|
|
90
|
+
return expect(operateLockProStub.calledOnceWith(WoSmartLockPro.COMMAND_GET_CK_IV + lock._key_id, false)).to.be.true;
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('encryptedCommand', () => {
|
|
94
|
+
it('should send an encrypted command', async () => {
|
|
95
|
+
const key = 'testKey';
|
|
96
|
+
const iv = Buffer.from('0123456789abcdef', 'hex');
|
|
97
|
+
const encrypted = 'encryptedString';
|
|
98
|
+
const resBuf = Buffer.from('01000000', 'hex');
|
|
99
|
+
sinon.stub(lock, 'getIv').resolves(iv);
|
|
100
|
+
sinon.stub(lock, 'encrypt').resolves(encrypted);
|
|
101
|
+
sinon.stub(lock, 'command').resolves(resBuf);
|
|
102
|
+
sinon.stub(lock, 'decrypt').resolves(Buffer.from('decrypted', 'hex'));
|
|
103
|
+
const result = await lock.encryptedCommand(key);
|
|
104
|
+
expect(result).to.be.instanceOf(Buffer);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('operateLockPro', () => {
|
|
108
|
+
it('should operate the lock with encryption', async () => {
|
|
109
|
+
const key = 'testKey';
|
|
110
|
+
const encryptedCommandStub = sinon.stub(lock, 'encryptedCommand').resolves(Buffer.from('01000000', 'hex'));
|
|
111
|
+
const result = await lock.operateLockPro(key);
|
|
112
|
+
expect(result).to.be.instanceOf(Buffer);
|
|
113
|
+
return expect(encryptedCommandStub.calledOnceWith(key)).to.be.true;
|
|
114
|
+
});
|
|
115
|
+
it('should operate the lock without encryption', async () => {
|
|
116
|
+
const key = 'testKey';
|
|
117
|
+
const resBuf = Buffer.from('01000000', 'hex');
|
|
118
|
+
sinon.stub(lock, 'command').resolves(resBuf);
|
|
119
|
+
const result = await lock.operateLockPro(key, false);
|
|
120
|
+
expect(result).to.be.instanceOf(Buffer);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=wosmartlockpro.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wosmartlockpro.test.js","sourceRoot":"","sources":["../../src/device/wosmartlockpro.test.ts"],"names":[],"mappings":"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"}
|
package/dist/device/wostrip.d.ts
CHANGED
|
@@ -1,56 +1,42 @@
|
|
|
1
|
+
import type { stripLightServiceData } from '../types/bledevicestatus.js';
|
|
1
2
|
import { Buffer } from 'node:buffer';
|
|
2
3
|
import { SwitchbotDevice } from '../device.js';
|
|
3
|
-
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
|
|
4
4
|
/**
|
|
5
5
|
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/colorbulb.md
|
|
6
6
|
*/
|
|
7
7
|
export declare class WoStrip extends SwitchbotDevice {
|
|
8
|
-
static parseServiceData(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
brightness: number;
|
|
14
|
-
red: number;
|
|
15
|
-
green: number;
|
|
16
|
-
blue: number;
|
|
17
|
-
delay: number;
|
|
18
|
-
preset: number;
|
|
19
|
-
color_mode: number;
|
|
20
|
-
speed: number;
|
|
21
|
-
loop_index: number;
|
|
22
|
-
} | null;
|
|
23
|
-
/**
|
|
24
|
-
* @returns {Promise<boolean>} resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
25
|
-
*/
|
|
26
|
-
readState(): Promise<unknown>;
|
|
8
|
+
static parseServiceData(serviceData: Buffer, onlog: ((message: string) => void) | undefined): Promise<stripLightServiceData | null>;
|
|
9
|
+
/**
|
|
10
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
11
|
+
*/
|
|
12
|
+
readState(): Promise<void>;
|
|
27
13
|
/**
|
|
28
14
|
* @private
|
|
29
15
|
*/
|
|
30
|
-
|
|
16
|
+
setState(reqByteArray: number[]): Promise<void>;
|
|
31
17
|
/**
|
|
32
|
-
* @returns
|
|
18
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
33
19
|
*/
|
|
34
|
-
turnOn(): Promise<
|
|
20
|
+
turnOn(): Promise<void>;
|
|
35
21
|
/**
|
|
36
|
-
* @returns
|
|
22
|
+
* @returns resolves with a boolean that tells whether the plug in ON(true) or OFF(false)
|
|
37
23
|
*/
|
|
38
|
-
turnOff(): Promise<
|
|
24
|
+
turnOff(): Promise<void>;
|
|
39
25
|
/**
|
|
40
|
-
* @returns
|
|
26
|
+
* @returns resolves with brightness percent
|
|
41
27
|
*/
|
|
42
|
-
setBrightness(brightness: number): Promise<
|
|
28
|
+
setBrightness(brightness: number): Promise<void>;
|
|
43
29
|
/**
|
|
44
|
-
*
|
|
30
|
+
* @returns resolves with color temperature
|
|
45
31
|
*/
|
|
46
|
-
setColorTemperature(color_temperature: unknown): Promise<
|
|
32
|
+
setColorTemperature(color_temperature: unknown): Promise<void>;
|
|
47
33
|
/**
|
|
48
|
-
* @returns
|
|
34
|
+
* @returns resolves with brightness + rgb
|
|
49
35
|
*/
|
|
50
|
-
setRGB(brightness: number, red: number, green: number, blue: number): Promise<
|
|
36
|
+
setRGB(brightness: number, red: number, green: number, blue: number): Promise<void>;
|
|
51
37
|
/**
|
|
52
38
|
* @private
|
|
53
39
|
*/
|
|
54
|
-
|
|
40
|
+
operateStripLight(bytes: number[]): Promise<void>;
|
|
55
41
|
}
|
|
56
42
|
//# sourceMappingURL=wostrip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wostrip.d.ts","sourceRoot":"","sources":["../../src/device/wostrip.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wostrip.d.ts","sourceRoot":"","sources":["../../src/device/wostrip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAExE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAMpC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C;;GAEG;AACH,qBAAa,OAAQ,SAAQ,eAAe;WAC7B,gBAAgB,CAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GAC7C,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAkDxC;;OAEG;IACG,SAAS;IAIf;;OAEG;IACG,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE;IAKrC;;OAEG;IACG,MAAM;IAIZ;;OAEG;IACG,OAAO;IAIb;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM;IAYtC;;OAEG;IACG,mBAAmB,CAAC,iBAAiB,EAAE,OAAO;IAMpD;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAoCzE;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE;CAqBxC"}
|