node-switchbot 2.5.0-beta.7 → 2.5.0-beta.8
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/dist/device/wosmartlockpro.d.ts +53 -7
- package/dist/device/wosmartlockpro.d.ts.map +1 -1
- package/dist/device/wosmartlockpro.js +97 -184
- package/dist/device/wosmartlockpro.js.map +1 -1
- package/dist/device/wosmartlockpro.test.js +2 -2
- package/dist/device/wosmartlockpro.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -19,18 +19,64 @@ export declare class WoSmartLockPro extends SwitchbotDevice {
|
|
|
19
19
|
SUCCESS_LOW_BATTERY: number;
|
|
20
20
|
};
|
|
21
21
|
static validateResponse(res: Buffer): number;
|
|
22
|
-
static getLockStatus(code: number):
|
|
23
|
-
static parseServiceData(serviceData: Buffer, manufacturerData: Buffer, onlog
|
|
22
|
+
static getLockStatus(code: number): string;
|
|
23
|
+
static parseServiceData(serviceData: Buffer, manufacturerData: Buffer, onlog?: (message: string) => void): Promise<lockProServiceData | null>;
|
|
24
24
|
constructor(peripheral: Noble.Peripheral, noble: typeof Noble);
|
|
25
|
+
/**
|
|
26
|
+
* Initializes the encryption key info for valid lock communication.
|
|
27
|
+
* @param {string} keyId - The key ID.
|
|
28
|
+
* @param {string} encryptionKey - The encryption key.
|
|
29
|
+
*/
|
|
25
30
|
setKey(keyId: string, encryptionKey: string): Promise<void>;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Unlocks the Smart Lock.
|
|
33
|
+
* @returns {Promise<number>} - The result of the unlock operation.
|
|
34
|
+
*/
|
|
35
|
+
unlock(): Promise<number>;
|
|
36
|
+
/**
|
|
37
|
+
* Unlocks the Smart Lock without unlatching the door.
|
|
38
|
+
* @returns {Promise<number>} - The result of the unlock operation.
|
|
39
|
+
*/
|
|
40
|
+
unlockNoUnlatch(): Promise<number>;
|
|
41
|
+
/**
|
|
42
|
+
* Locks the Smart Lock.
|
|
43
|
+
* @returns {Promise<number>} - The result of the lock operation.
|
|
44
|
+
*/
|
|
45
|
+
lock(): Promise<number>;
|
|
46
|
+
/**
|
|
47
|
+
* Gets general state info from the Smart Lock.
|
|
48
|
+
* @returns {Promise<object | null>} - The state object or null if an error occurred.
|
|
49
|
+
*/
|
|
50
|
+
info(): Promise<object | null>;
|
|
51
|
+
/**
|
|
52
|
+
* Encrypts a string using AES-128-CTR.
|
|
53
|
+
* @param {string} str - The string to encrypt.
|
|
54
|
+
* @returns {Promise<string>} - The encrypted string in hex format.
|
|
55
|
+
*/
|
|
30
56
|
encrypt(str: string): Promise<string>;
|
|
57
|
+
/**
|
|
58
|
+
* Decrypts a buffer using AES-128-CTR.
|
|
59
|
+
* @param {Buffer} data - The data to decrypt.
|
|
60
|
+
* @returns {Promise<Buffer>} - The decrypted data.
|
|
61
|
+
*/
|
|
31
62
|
decrypt(data: Buffer): Promise<Buffer>;
|
|
63
|
+
/**
|
|
64
|
+
* Retrieves the IV from the device.
|
|
65
|
+
* @returns {Promise<Buffer>} - The IV buffer.
|
|
66
|
+
*/
|
|
32
67
|
getIv(): Promise<Buffer>;
|
|
68
|
+
/**
|
|
69
|
+
* Sends an encrypted command to the device.
|
|
70
|
+
* @param {string} key - The command key.
|
|
71
|
+
* @returns {Promise<Buffer>} - The response buffer.
|
|
72
|
+
*/
|
|
33
73
|
encryptedCommand(key: string): Promise<Buffer>;
|
|
34
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Operates the lock with the given command.
|
|
76
|
+
* @param {string} key - The command key.
|
|
77
|
+
* @param {boolean} [encrypt] - Whether to encrypt the command.
|
|
78
|
+
* @returns {Promise<Buffer>} - The response buffer.
|
|
79
|
+
*/
|
|
80
|
+
operateLockPro(key: string, encrypt?: boolean): Promise<Buffer>;
|
|
35
81
|
}
|
|
36
82
|
//# sourceMappingURL=wosmartlockpro.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wosmartlockpro.d.ts","sourceRoot":"","sources":["../../src/device/wosmartlockpro.ts"],"names":[],"mappings":"
|
|
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;AAG9C,qBAAa,cAAe,SAAQ,eAAe;IAC1C,GAAG,EAAE,MAAM,GAAG,IAAI,CAAO;IACzB,OAAO,EAAE,MAAM,CAAK;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAO;IAE5C,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;IAUnC,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"}
|
|
@@ -1,15 +1,11 @@
|
|
|
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';
|
|
8
4
|
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js';
|
|
9
5
|
export class WoSmartLockPro extends SwitchbotDevice {
|
|
10
6
|
_iv = null;
|
|
11
|
-
_key_id;
|
|
12
|
-
_encryption_key;
|
|
7
|
+
_key_id = '';
|
|
8
|
+
_encryption_key = null;
|
|
13
9
|
static COMMAND_GET_CK_IV = '570f2103';
|
|
14
10
|
static COMMAND_LOCK_INFO = '570f4f8102';
|
|
15
11
|
static COMMAND_UNLOCK = '570f4e0101000080';
|
|
@@ -24,216 +20,130 @@ export class WoSmartLockPro extends SwitchbotDevice {
|
|
|
24
20
|
};
|
|
25
21
|
static validateResponse(res) {
|
|
26
22
|
if (res.length >= 3) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
case WoSmartLockPro.Result.SUCCESS_LOW_BATTERY:
|
|
31
|
-
return WoSmartLockPro.Result.SUCCESS_LOW_BATTERY;
|
|
23
|
+
const result = res.readUInt8(0);
|
|
24
|
+
if (result === WoSmartLockPro.Result.SUCCESS || result === WoSmartLockPro.Result.SUCCESS_LOW_BATTERY) {
|
|
25
|
+
return result;
|
|
32
26
|
}
|
|
33
27
|
}
|
|
34
28
|
return WoSmartLockPro.Result.ERROR;
|
|
35
29
|
}
|
|
36
30
|
static getLockStatus(code) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return 'LOCKING_STOP';
|
|
48
|
-
case 0b1010000:
|
|
49
|
-
return 'UNLOCKING_STOP';
|
|
50
|
-
case 0b01100000: // Only EU lock type
|
|
51
|
-
return 'NOT_FULLY_LOCKED';
|
|
52
|
-
default:
|
|
53
|
-
return 'UNKNOWN';
|
|
54
|
-
}
|
|
31
|
+
const statusMap = {
|
|
32
|
+
0b0000000: 'LOCKED',
|
|
33
|
+
0b0010000: 'UNLOCKED',
|
|
34
|
+
0b0100000: 'LOCKING',
|
|
35
|
+
0b0110000: 'UNLOCKING',
|
|
36
|
+
0b1000000: 'LOCKING_STOP',
|
|
37
|
+
0b1010000: 'UNLOCKING_STOP',
|
|
38
|
+
0b01100000: 'NOT_FULLY_LOCKED', // Only EU lock type
|
|
39
|
+
};
|
|
40
|
+
return statusMap[code] || 'UNKNOWN';
|
|
55
41
|
}
|
|
56
42
|
static async parseServiceData(serviceData, manufacturerData, onlog) {
|
|
57
43
|
if (manufacturerData.length < 11) {
|
|
58
|
-
|
|
59
|
-
onlog(`[parseServiceDataForWoSmartLockPro] Buffer length ${manufacturerData.length} is too short!`);
|
|
60
|
-
}
|
|
44
|
+
onlog?.(`[parseServiceDataForWoSmartLockPro] Buffer length ${manufacturerData.length} is too short!`);
|
|
61
45
|
return null;
|
|
62
46
|
}
|
|
63
|
-
// adv data needs both service data and manufacturer data
|
|
64
|
-
// byte var names based on documentation
|
|
65
47
|
const byte2 = serviceData.readUInt8(2);
|
|
66
48
|
const byte7 = manufacturerData.readUInt8(7);
|
|
67
49
|
const byte8 = manufacturerData.readUInt8(8);
|
|
68
50
|
const byte9 = manufacturerData.readUInt8(9);
|
|
69
51
|
const byte11 = manufacturerData.readUInt8(11);
|
|
70
|
-
const battery = byte2 & 0b01111111; // %
|
|
71
|
-
const calibration = !!(byte7 & 0b10000000);
|
|
72
|
-
const status = WoSmartLockPro.getLockStatus((byte7 & 0b00111000) >> 3);
|
|
73
|
-
const door_open = !!(byte8 & 0b01100000);
|
|
74
|
-
// Double lock mode is not supported on Lock Pro
|
|
75
|
-
const update_from_secondary_lock = false; // !!(byte7 & 0b00001000)
|
|
76
|
-
const double_lock_mode = false; // !!(byte8 & 0b10000000)
|
|
77
|
-
const unclosed_alarm = !!(byte11 & 0b10000000);
|
|
78
|
-
const unlocked_alarm = !!(byte11 & 0b01000000);
|
|
79
|
-
const auto_lock_paused = !!(byte8 & 0b100000);
|
|
80
|
-
const night_latch = !!(byte9 & 0b00000001);
|
|
81
|
-
// const manual = byte7 & 0b100000;
|
|
82
52
|
const data = {
|
|
83
53
|
model: SwitchBotBLEModel.LockPro,
|
|
84
54
|
modelName: SwitchBotBLEModelName.LockPro,
|
|
85
55
|
modelFriendlyName: SwitchBotBLEModelFriendlyName.LockPro,
|
|
86
|
-
battery,
|
|
87
|
-
calibration,
|
|
88
|
-
status,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
double_lock_mode,
|
|
92
|
-
unclosed_alarm,
|
|
93
|
-
unlocked_alarm,
|
|
94
|
-
auto_lock_paused,
|
|
95
|
-
night_latch,
|
|
56
|
+
battery: byte2 & 0b01111111,
|
|
57
|
+
calibration: !!(byte7 & 0b10000000),
|
|
58
|
+
status: WoSmartLockPro.getLockStatus((byte7 & 0b00111000) >> 3),
|
|
59
|
+
door_open: !!(byte8 & 0b01100000),
|
|
60
|
+
update_from_secondary_lock: false,
|
|
61
|
+
double_lock_mode: false,
|
|
62
|
+
unclosed_alarm: !!(byte11 & 0b10000000),
|
|
63
|
+
unlocked_alarm: !!(byte11 & 0b01000000),
|
|
64
|
+
auto_lock_paused: !!(byte8 & 0b100000),
|
|
65
|
+
night_latch: !!(byte9 & 0b00000001),
|
|
96
66
|
};
|
|
97
67
|
return data;
|
|
98
68
|
}
|
|
99
69
|
constructor(peripheral, noble) {
|
|
100
70
|
super(peripheral, noble);
|
|
101
|
-
this._iv = null;
|
|
102
|
-
this._key_id = '';
|
|
103
|
-
this._encryption_key = null;
|
|
104
71
|
}
|
|
105
|
-
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
|
|
110
|
-
* - keyId, encryptionKey
|
|
111
|
-
*
|
|
112
|
-
* [Return value]
|
|
113
|
-
* - void
|
|
114
|
-
* ---------------------------------------------------------------- */
|
|
72
|
+
/**
|
|
73
|
+
* Initializes the encryption key info for valid lock communication.
|
|
74
|
+
* @param {string} keyId - The key ID.
|
|
75
|
+
* @param {string} encryptionKey - The encryption key.
|
|
76
|
+
*/
|
|
115
77
|
async setKey(keyId, encryptionKey) {
|
|
116
78
|
this._iv = null;
|
|
117
79
|
this._key_id = keyId;
|
|
118
80
|
this._encryption_key = Buffer.from(encryptionKey, 'hex');
|
|
119
81
|
}
|
|
120
|
-
|
|
121
|
-
*
|
|
122
|
-
* -
|
|
123
|
-
|
|
124
|
-
* [Arguments]
|
|
125
|
-
* - none
|
|
126
|
-
*
|
|
127
|
-
* [Return value]
|
|
128
|
-
* - Promise object
|
|
129
|
-
* WoSmartLockPro.LockResult will be passed to the `resolve()`.
|
|
130
|
-
* ---------------------------------------------------------------- */
|
|
82
|
+
/**
|
|
83
|
+
* Unlocks the Smart Lock.
|
|
84
|
+
* @returns {Promise<number>} - The result of the unlock operation.
|
|
85
|
+
*/
|
|
131
86
|
async unlock() {
|
|
132
|
-
await this.operateLockPro(WoSmartLockPro.COMMAND_UNLOCK)
|
|
133
|
-
|
|
134
|
-
if (resBuf) {
|
|
135
|
-
return WoSmartLockPro.validateResponse(resBuf);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
return WoSmartLockPro.Result.ERROR;
|
|
139
|
-
}
|
|
140
|
-
})
|
|
141
|
-
.catch((error) => {
|
|
142
|
-
throw error;
|
|
143
|
-
});
|
|
87
|
+
const resBuf = await this.operateLockPro(WoSmartLockPro.COMMAND_UNLOCK);
|
|
88
|
+
return resBuf ? WoSmartLockPro.validateResponse(resBuf) : WoSmartLockPro.Result.ERROR;
|
|
144
89
|
}
|
|
145
|
-
|
|
146
|
-
*
|
|
147
|
-
* -
|
|
148
|
-
|
|
149
|
-
* [Arguments]
|
|
150
|
-
* - none
|
|
151
|
-
*
|
|
152
|
-
* [Return value]
|
|
153
|
-
* - Promise object
|
|
154
|
-
* WoSmartLockPro.LockResult will be passed to the `resolve()`.
|
|
155
|
-
* ---------------------------------------------------------------- */
|
|
90
|
+
/**
|
|
91
|
+
* Unlocks the Smart Lock without unlatching the door.
|
|
92
|
+
* @returns {Promise<number>} - The result of the unlock operation.
|
|
93
|
+
*/
|
|
156
94
|
async unlockNoUnlatch() {
|
|
157
|
-
await this.operateLockPro(WoSmartLockPro.COMMAND_UNLOCK_NO_UNLATCH)
|
|
158
|
-
|
|
159
|
-
if (resBuf) {
|
|
160
|
-
return WoSmartLockPro.validateResponse(resBuf);
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
return WoSmartLockPro.Result.ERROR;
|
|
164
|
-
}
|
|
165
|
-
})
|
|
166
|
-
.catch((error) => {
|
|
167
|
-
throw error;
|
|
168
|
-
});
|
|
95
|
+
const resBuf = await this.operateLockPro(WoSmartLockPro.COMMAND_UNLOCK_NO_UNLATCH);
|
|
96
|
+
return resBuf ? WoSmartLockPro.validateResponse(resBuf) : WoSmartLockPro.Result.ERROR;
|
|
169
97
|
}
|
|
170
|
-
|
|
171
|
-
*
|
|
172
|
-
* -
|
|
173
|
-
|
|
174
|
-
* [Arguments]
|
|
175
|
-
* - none
|
|
176
|
-
*
|
|
177
|
-
* [Return value]
|
|
178
|
-
* - Promise object
|
|
179
|
-
* WoSmartLockPro.LockResult will be passed to the `resolve()`.
|
|
180
|
-
* ---------------------------------------------------------------- */
|
|
98
|
+
/**
|
|
99
|
+
* Locks the Smart Lock.
|
|
100
|
+
* @returns {Promise<number>} - The result of the lock operation.
|
|
101
|
+
*/
|
|
181
102
|
async lock() {
|
|
182
|
-
this.operateLockPro(WoSmartLockPro.COMMAND_LOCK)
|
|
183
|
-
|
|
184
|
-
if (resBuf) {
|
|
185
|
-
return WoSmartLockPro.validateResponse(resBuf);
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
return WoSmartLockPro.Result.ERROR;
|
|
189
|
-
}
|
|
190
|
-
})
|
|
191
|
-
.catch((error) => {
|
|
192
|
-
throw error;
|
|
193
|
-
});
|
|
103
|
+
const resBuf = await this.operateLockPro(WoSmartLockPro.COMMAND_LOCK);
|
|
104
|
+
return resBuf ? WoSmartLockPro.validateResponse(resBuf) : WoSmartLockPro.Result.ERROR;
|
|
194
105
|
}
|
|
195
|
-
|
|
196
|
-
* info
|
|
197
|
-
* -
|
|
198
|
-
|
|
199
|
-
* [Arguments]
|
|
200
|
-
* - none
|
|
201
|
-
*
|
|
202
|
-
* [Return value]
|
|
203
|
-
* - Promise object
|
|
204
|
-
* state object will be passed to the `resolve()`
|
|
205
|
-
* ---------------------------------------------------------------- */
|
|
106
|
+
/**
|
|
107
|
+
* Gets general state info from the Smart Lock.
|
|
108
|
+
* @returns {Promise<object | null>} - The state object or null if an error occurred.
|
|
109
|
+
*/
|
|
206
110
|
async info() {
|
|
207
|
-
await this.operateLockPro(WoSmartLockPro.COMMAND_LOCK_INFO)
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
return null;
|
|
221
|
-
}
|
|
222
|
-
})
|
|
223
|
-
.catch((error) => {
|
|
224
|
-
throw error;
|
|
225
|
-
});
|
|
111
|
+
const resBuf = await this.operateLockPro(WoSmartLockPro.COMMAND_LOCK_INFO);
|
|
112
|
+
if (resBuf) {
|
|
113
|
+
return {
|
|
114
|
+
calibration: Boolean(resBuf[0] & 0b10000000),
|
|
115
|
+
status: WoSmartLockPro.getLockStatus((resBuf[0] & 0b01110000) >> 4),
|
|
116
|
+
door_open: Boolean(resBuf[0] & 0b00000100),
|
|
117
|
+
unclosed_alarm: Boolean(resBuf[1] & 0b00100000),
|
|
118
|
+
unlocked_alarm: Boolean(resBuf[1] & 0b00010000),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
226
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* Encrypts a string using AES-128-CTR.
|
|
125
|
+
* @param {string} str - The string to encrypt.
|
|
126
|
+
* @returns {Promise<string>} - The encrypted string in hex format.
|
|
127
|
+
*/
|
|
227
128
|
async encrypt(str) {
|
|
228
129
|
const cipher = Crypto.createCipheriv('aes-128-ctr', this._encryption_key, this._iv);
|
|
229
130
|
return Buffer.concat([cipher.update(str, 'hex'), cipher.final()]).toString('hex');
|
|
230
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Decrypts a buffer using AES-128-CTR.
|
|
134
|
+
* @param {Buffer} data - The data to decrypt.
|
|
135
|
+
* @returns {Promise<Buffer>} - The decrypted data.
|
|
136
|
+
*/
|
|
231
137
|
async decrypt(data) {
|
|
232
138
|
const decipher = Crypto.createDecipheriv('aes-128-ctr', this._encryption_key, this._iv);
|
|
233
139
|
return Buffer.concat([decipher.update(data), decipher.final()]);
|
|
234
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Retrieves the IV from the device.
|
|
143
|
+
* @returns {Promise<Buffer>} - The IV buffer.
|
|
144
|
+
*/
|
|
235
145
|
async getIv() {
|
|
236
|
-
if (this._iv
|
|
146
|
+
if (!this._iv) {
|
|
237
147
|
const res = await this.operateLockPro(WoSmartLockPro.COMMAND_GET_CK_IV + this._key_id, false);
|
|
238
148
|
if (res) {
|
|
239
149
|
this._iv = res.subarray(4);
|
|
@@ -244,6 +154,11 @@ export class WoSmartLockPro extends SwitchbotDevice {
|
|
|
244
154
|
}
|
|
245
155
|
return this._iv;
|
|
246
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Sends an encrypted command to the device.
|
|
159
|
+
* @param {string} key - The command key.
|
|
160
|
+
* @returns {Promise<Buffer>} - The response buffer.
|
|
161
|
+
*/
|
|
247
162
|
async encryptedCommand(key) {
|
|
248
163
|
const iv = await this.getIv();
|
|
249
164
|
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');
|
|
@@ -257,26 +172,24 @@ export class WoSmartLockPro extends SwitchbotDevice {
|
|
|
257
172
|
throw new Error(`The device returned an error: 0x${buf.toString('hex')}`);
|
|
258
173
|
}
|
|
259
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Operates the lock with the given command.
|
|
177
|
+
* @param {string} key - The command key.
|
|
178
|
+
* @param {boolean} [encrypt] - Whether to encrypt the command.
|
|
179
|
+
* @returns {Promise<Buffer>} - The response buffer.
|
|
180
|
+
*/
|
|
260
181
|
async operateLockPro(key, encrypt = true) {
|
|
261
|
-
// encrypted command
|
|
262
182
|
if (encrypt) {
|
|
263
183
|
return this.encryptedCommand(key);
|
|
264
184
|
}
|
|
265
185
|
const req = Buffer.from(`${key.substring(0, 2)}000000${key.substring(2)}`, 'hex');
|
|
266
|
-
await this.command(req)
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
else {
|
|
274
|
-
return buf;
|
|
275
|
-
}
|
|
276
|
-
})
|
|
277
|
-
.catch((error) => {
|
|
278
|
-
throw error;
|
|
279
|
-
});
|
|
186
|
+
const bytes = await this.command(req);
|
|
187
|
+
const buf = Buffer.from(bytes);
|
|
188
|
+
const code = WoSmartLockPro.validateResponse(buf);
|
|
189
|
+
if (code === WoSmartLockPro.Result.ERROR) {
|
|
190
|
+
throw new Error(`The device returned an error: 0x${buf.toString('hex')}`);
|
|
191
|
+
}
|
|
192
|
+
return buf;
|
|
280
193
|
}
|
|
281
194
|
}
|
|
282
195
|
//# sourceMappingURL=wosmartlockpro.js.map
|
|
@@ -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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"}
|
|
@@ -74,11 +74,11 @@ describe('woSmartLockPro', () => {
|
|
|
74
74
|
});
|
|
75
75
|
describe('decrypt', () => {
|
|
76
76
|
it('should decrypt a buffer', async () => {
|
|
77
|
-
const data = Buffer.from('
|
|
77
|
+
const data = Buffer.from('74657374', 'hex'); // 'test' in hex
|
|
78
78
|
lock._encryption_key = Buffer.from('0123456789abcdef0123456789abcdef', 'hex');
|
|
79
79
|
lock._iv = Buffer.from('0123456789abcdef', 'hex');
|
|
80
80
|
const decrypted = await lock.decrypt(data);
|
|
81
|
-
expect(decrypted).to.
|
|
81
|
+
expect(decrypted.toString()).to.equal('test');
|
|
82
82
|
});
|
|
83
83
|
});
|
|
84
84
|
describe('getIv', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wosmartlockpro.test.js","sourceRoot":"","sources":["../../src/device/wosmartlockpro.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"wosmartlockpro.test.js","sourceRoot":"","sources":["../../src/device/wosmartlockpro.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-switchbot",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "2.5.0-beta.
|
|
4
|
+
"version": "2.5.0-beta.8",
|
|
5
5
|
"description": "The node-switchbot is a Node.js module which allows you to control your Switchbot Devices through Bluetooth (BLE).",
|
|
6
6
|
"author": "OpenWonderLabs (https://github.com/OpenWonderLabs)",
|
|
7
7
|
"license": "MIT",
|