node-switchbot 3.4.2-beta.0 → 3.4.2-beta.10
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/BLE.md +14 -13
- package/CHANGELOG.md +7 -0
- package/OpenAPI.md +13 -12
- package/branding/Node_x_SwitchBot.svg +2 -3
- package/dist/advertising.d.ts.map +1 -1
- package/dist/advertising.js +3 -0
- package/dist/advertising.js.map +1 -1
- package/dist/device/woblindtilt.d.ts +1 -1
- package/dist/device/woblindtilt.d.ts.map +1 -1
- package/dist/device/woblindtilt.js +4 -4
- package/dist/device/woblindtilt.js.map +1 -1
- package/dist/device/wohand.d.ts.map +1 -1
- package/dist/device/wohand.js +5 -4
- package/dist/device/wohand.js.map +1 -1
- package/dist/device/wohumi.d.ts +22 -11
- package/dist/device/wohumi.d.ts.map +1 -1
- package/dist/device/wohumi.js +45 -20
- package/dist/device/wohumi.js.map +1 -1
- package/dist/device/wohumi2.d.ts +61 -0
- package/dist/device/wohumi2.d.ts.map +1 -0
- package/dist/device/wohumi2.js +114 -0
- package/dist/device/wohumi2.js.map +1 -0
- package/dist/device/woleak.d.ts.map +1 -1
- package/dist/device/woleak.js +4 -12
- package/dist/device/woleak.js.map +1 -1
- package/dist/device/worelayswitch1.d.ts +4 -20
- package/dist/device/worelayswitch1.d.ts.map +1 -1
- package/dist/device/worelayswitch1.js +1 -108
- package/dist/device/worelayswitch1.js.map +1 -1
- package/dist/device/worelayswitch1pm.d.ts +1 -17
- package/dist/device/worelayswitch1pm.d.ts.map +1 -1
- package/dist/device/worelayswitch1pm.js +1 -108
- package/dist/device/worelayswitch1pm.js.map +1 -1
- package/dist/device.d.ts +0 -1
- package/dist/device.d.ts.map +1 -1
- package/dist/device.js.map +1 -1
- package/dist/settings.d.ts +12 -28
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +24 -22
- package/dist/settings.js.map +1 -1
- package/dist/switchbot-ble.d.ts.map +1 -1
- package/dist/switchbot-ble.js +2 -0
- package/dist/switchbot-ble.js.map +1 -1
- package/dist/switchbot-openapi.d.ts +1 -1
- package/dist/switchbot-openapi.d.ts.map +1 -1
- package/dist/switchbot-openapi.js +11 -8
- package/dist/switchbot-openapi.js.map +1 -1
- package/dist/test/settings.test.js +6 -6
- package/dist/test/settings.test.js.map +1 -1
- package/dist/test/wohumi.test.js +25 -73
- package/dist/test/wohumi.test.js.map +1 -1
- package/dist/test/wohumi2.test.d.ts +2 -0
- package/dist/test/wohumi2.test.d.ts.map +1 -0
- package/dist/test/wohumi2.test.js +34 -0
- package/dist/test/wohumi2.test.js.map +1 -0
- package/dist/types/bledevicestatus.d.ts +17 -8
- package/dist/types/bledevicestatus.d.ts.map +1 -1
- package/dist/types/devicestatus.d.ts +10 -0
- package/dist/types/devicestatus.d.ts.map +1 -1
- package/dist/types/devicewebhookstatus.d.ts +5 -0
- package/dist/types/devicewebhookstatus.d.ts.map +1 -1
- package/dist/types/types.d.ts +6 -2
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +4 -0
- package/dist/types/types.js.map +1 -1
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/main.js +4 -4
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/assets/style.css +6 -6
- package/docs/classes/Advertising.html +4 -4
- package/docs/classes/SwitchBotBLE.html +8 -8
- package/docs/classes/SwitchBotOpenAPI.html +8 -8
- package/docs/classes/SwitchbotDevice.html +11 -11
- package/docs/classes/WoBlindTilt.html +21 -21
- package/docs/classes/WoBulb.html +19 -19
- package/docs/classes/WoCeilingLight.html +22 -22
- package/docs/classes/WoContact.html +13 -13
- package/docs/classes/WoCurtain.html +19 -19
- package/docs/classes/WoHand.html +18 -18
- package/docs/classes/WoHub2.html +13 -13
- package/docs/classes/WoHumi.html +26 -24
- package/docs/classes/WoIOSensorTH.html +13 -13
- package/docs/classes/WoPlugMiniUS.html +18 -18
- package/docs/classes/WoPresence.html +13 -13
- package/docs/classes/WoSensorTH.html +12 -12
- package/docs/classes/WoSmartLock.html +23 -23
- package/docs/classes/WoSmartLockPro.html +23 -23
- package/docs/classes/WoStrip.html +20 -20
- package/docs/enums/LogLevel.html +2 -2
- package/docs/enums/SwitchBotBLEModel.html +4 -3
- package/docs/enums/SwitchBotBLEModelFriendlyName.html +4 -3
- package/docs/enums/SwitchBotBLEModelName.html +4 -3
- package/docs/enums/SwitchBotModel.html +3 -2
- package/docs/hierarchy.html +1 -1
- package/docs/index.html +9 -9
- package/docs/interfaces/AdvertisementData.html +2 -2
- package/docs/interfaces/Chars.html +2 -2
- package/docs/interfaces/ErrorObject.html +2 -2
- package/docs/interfaces/NobleTypes.html +2 -2
- package/docs/interfaces/Params.html +2 -2
- package/docs/interfaces/Rule.html +2 -2
- package/docs/interfaces/ServiceData.html +2 -2
- package/docs/interfaces/SwitchBotBLEDevice.html +2 -2
- package/docs/interfaces/WebhookDetail.html +2 -2
- package/docs/interfaces/ad.html +2 -2
- package/docs/interfaces/body.html +2 -2
- package/docs/interfaces/bodyChange.html +2 -2
- package/docs/interfaces/deleteWebhookResponse.html +2 -2
- package/docs/interfaces/device.html +2 -2
- package/docs/interfaces/deviceList.html +2 -2
- package/docs/interfaces/deviceStatus.html +2 -2
- package/docs/interfaces/deviceStatusRequest.html +2 -2
- package/docs/interfaces/deviceWebhook.html +2 -2
- package/docs/interfaces/deviceWebhookContext.html +2 -2
- package/docs/interfaces/devices.html +2 -2
- package/docs/interfaces/infraredRemoteList.html +2 -2
- package/docs/interfaces/irdevice.html +2 -2
- package/docs/interfaces/pushResponse.html +2 -2
- package/docs/interfaces/queryWebhookResponse.html +2 -2
- package/docs/interfaces/setupWebhookResponse.html +2 -2
- package/docs/interfaces/switchbot.html +2 -2
- package/docs/interfaces/updateWebhookResponse.html +2 -2
- package/docs/interfaces/webhookRequest.html +2 -2
- package/docs/media/BLE.md +14 -13
- package/docs/media/OpenAPI.md +13 -12
- package/docs/modules.html +1 -1
- package/docs/types/MacAddress.html +1 -1
- package/docs/types/batteryCirculatorFan.html +1 -1
- package/docs/types/batteryCirculatorFanServiceData.html +1 -1
- package/docs/types/batteryCirculatorFanStatus.html +1 -1
- package/docs/types/batteryCirculatorFanWebhookContext.html +1 -1
- package/docs/types/blindTilt.html +1 -1
- package/docs/types/blindTiltServiceData.html +1 -1
- package/docs/types/blindTiltStatus.html +1 -1
- package/docs/types/blindTiltWebhookContext.html +1 -1
- package/docs/types/bot.html +1 -1
- package/docs/types/botServiceData.html +1 -1
- package/docs/types/botStatus.html +1 -1
- package/docs/types/botWebhookContext.html +1 -1
- package/docs/types/ceilingLight.html +1 -1
- package/docs/types/ceilingLightPro.html +1 -1
- package/docs/types/ceilingLightProServiceData.html +1 -1
- package/docs/types/ceilingLightProStatus.html +1 -1
- package/docs/types/ceilingLightProWebhookContext.html +1 -1
- package/docs/types/ceilingLightServiceData.html +1 -1
- package/docs/types/ceilingLightStatus.html +1 -1
- package/docs/types/ceilingLightWebhookContext.html +1 -1
- package/docs/types/colorBulb.html +1 -1
- package/docs/types/colorBulbServiceData.html +1 -1
- package/docs/types/colorBulbStatus.html +1 -1
- package/docs/types/colorBulbWebhookContext.html +1 -1
- package/docs/types/contactSensor.html +1 -1
- package/docs/types/contactSensorServiceData.html +1 -1
- package/docs/types/contactSensorStatus.html +1 -1
- package/docs/types/contactSensorWebhookContext.html +1 -1
- package/docs/types/curtain.html +1 -1
- package/docs/types/curtain3.html +1 -1
- package/docs/types/curtain3ServiceData.html +1 -1
- package/docs/types/curtain3WebhookContext.html +1 -1
- package/docs/types/curtainServiceData.html +1 -1
- package/docs/types/curtainStatus.html +1 -1
- package/docs/types/curtainWebhookContext.html +1 -1
- package/docs/types/floorCleaningRobotS10.html +1 -1
- package/docs/types/floorCleaningRobotS10Status.html +1 -1
- package/docs/types/floorCleaningRobotS10WebhookContext.html +1 -1
- package/docs/types/hub2.html +1 -1
- package/docs/types/hub2ServiceData.html +1 -1
- package/docs/types/hub2Status.html +1 -1
- package/docs/types/hub2WebhookContext.html +1 -1
- package/docs/types/humidifier.html +1 -1
- package/docs/types/humidifier2ServiceData.html +1 -0
- package/docs/types/humidifier2Status.html +1 -0
- package/docs/types/humidifier2WebhookContext.html +1 -0
- package/docs/types/humidifierServiceData.html +1 -1
- package/docs/types/humidifierStatus.html +1 -1
- package/docs/types/humidifierWebhookContext.html +1 -1
- package/docs/types/indoorCam.html +1 -1
- package/docs/types/indoorCameraWebhookContext.html +1 -1
- package/docs/types/keypad.html +1 -1
- package/docs/types/keypadDetectorServiceData.html +1 -1
- package/docs/types/keypadTouch.html +1 -1
- package/docs/types/keypadTouchWebhookContext.html +1 -1
- package/docs/types/keypadWebhookContext.html +1 -1
- package/docs/types/lock.html +1 -1
- package/docs/types/lockPro.html +1 -1
- package/docs/types/lockProServiceData.html +1 -1
- package/docs/types/lockProStatus.html +1 -1
- package/docs/types/lockProWebhookContext.html +1 -1
- package/docs/types/lockServiceData.html +1 -1
- package/docs/types/lockStatus.html +1 -1
- package/docs/types/lockWebhookContext.html +1 -1
- package/docs/types/meter.html +1 -1
- package/docs/types/meterPlus.html +1 -1
- package/docs/types/meterPlusServiceData.html +1 -1
- package/docs/types/meterPlusStatus.html +1 -1
- package/docs/types/meterPlusWebhookContext.html +1 -1
- package/docs/types/meterPro.html +1 -1
- package/docs/types/meterProCO2ServiceData.html +1 -1
- package/docs/types/meterProCO2Status.html +1 -1
- package/docs/types/meterProCO2WebhookContext.html +1 -1
- package/docs/types/meterProServiceData.html +1 -1
- package/docs/types/meterProStatus.html +1 -1
- package/docs/types/meterProWebhookContext.html +1 -1
- package/docs/types/meterServiceData.html +1 -1
- package/docs/types/meterStatus.html +1 -1
- package/docs/types/meterWebhookContext.html +1 -1
- package/docs/types/motionSensor.html +1 -1
- package/docs/types/motionSensorServiceData.html +1 -1
- package/docs/types/motionSensorStatus.html +1 -1
- package/docs/types/motionSensorWebhookContext.html +1 -1
- package/docs/types/onadvertisement.html +1 -1
- package/docs/types/ondiscover.html +1 -1
- package/docs/types/outdoorMeter.html +1 -1
- package/docs/types/outdoorMeterServiceData.html +1 -1
- package/docs/types/outdoorMeterStatus.html +1 -1
- package/docs/types/outdoorMeterWebhookContext.html +1 -1
- package/docs/types/panTiltCamWebhookContext.html +1 -1
- package/docs/types/pantiltCam.html +1 -1
- package/docs/types/pantiltCam2k.html +1 -1
- package/docs/types/plug.html +1 -1
- package/docs/types/plugMini.html +1 -1
- package/docs/types/plugMiniJPServiceData.html +1 -1
- package/docs/types/plugMiniJPWebhookContext.html +1 -1
- package/docs/types/plugMiniStatus.html +1 -1
- package/docs/types/plugMiniUSServiceData.html +1 -1
- package/docs/types/plugMiniUSWebhookContext.html +1 -1
- package/docs/types/plugStatus.html +1 -1
- package/docs/types/plugWebhookContext.html +1 -1
- package/docs/types/relaySwitch1PMServiceData.html +1 -1
- package/docs/types/relaySwitch1ServiceData.html +1 -0
- package/docs/types/remote.html +1 -1
- package/docs/types/robotVacuumCleanerS1.html +1 -1
- package/docs/types/robotVacuumCleanerS1Plus.html +1 -1
- package/docs/types/robotVacuumCleanerS1PlusStatus.html +1 -1
- package/docs/types/robotVacuumCleanerS1PlusWebhookContext.html +1 -1
- package/docs/types/robotVacuumCleanerS1Status.html +1 -1
- package/docs/types/robotVacuumCleanerS1WebhookContext.html +1 -1
- package/docs/types/robotVacuumCleanerServiceData.html +1 -1
- package/docs/types/stripLight.html +1 -1
- package/docs/types/stripLightServiceData.html +1 -1
- package/docs/types/stripLightStatus.html +1 -1
- package/docs/types/stripLightWebhookContext.html +1 -1
- package/docs/types/waterLeakDetector.html +1 -1
- package/docs/types/waterLeakDetectorServiceData.html +1 -1
- package/docs/types/waterLeakDetectorStatus.html +1 -1
- package/docs/types/waterLeakDetectorWebhookContext.html +1 -1
- package/package.json +12 -12
- package/docs/types/relaySwitch1PlusServiceData.html +0 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import { SwitchbotDevice } from '../device.js';
|
|
3
|
+
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js';
|
|
4
|
+
const HUMIDIFIER_COMMAND_HEADER = '5701';
|
|
5
|
+
const TURN_ON_KEY = `${HUMIDIFIER_COMMAND_HEADER}0101`;
|
|
6
|
+
const TURN_OFF_KEY = `${HUMIDIFIER_COMMAND_HEADER}0102`;
|
|
7
|
+
const INCREASE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0103`;
|
|
8
|
+
const DECREASE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0104`;
|
|
9
|
+
const SET_AUTO_MODE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0105`;
|
|
10
|
+
const SET_MANUAL_MODE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0106`;
|
|
11
|
+
/**
|
|
12
|
+
* Class representing a WoHumi device.
|
|
13
|
+
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/tree/latest/devicetypes
|
|
14
|
+
*/
|
|
15
|
+
export class WoHumi2 extends SwitchbotDevice {
|
|
16
|
+
constructor(peripheral, noble) {
|
|
17
|
+
super(peripheral, noble);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parses the service data for WoHumi.
|
|
21
|
+
* @param {Buffer} serviceData - The service data buffer.
|
|
22
|
+
* @param {Function} emitLog - The function to emit log messages.
|
|
23
|
+
* @returns {Promise<humidifier2ServiceData | null>} - Parsed service data or null if invalid.
|
|
24
|
+
*/
|
|
25
|
+
static async parseServiceData(serviceData, emitLog) {
|
|
26
|
+
if (serviceData.length !== 8) {
|
|
27
|
+
emitLog('debugerror', `[parseServiceDataForWoHumi] Buffer length ${serviceData.length} !== 8!`);
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const byte1 = serviceData.readUInt8(1);
|
|
31
|
+
const byte4 = serviceData.readUInt8(4);
|
|
32
|
+
const onState = !!(byte1 & 0b10000000); // 1 - on
|
|
33
|
+
const autoMode = !!(byte4 & 0b10000000); // 1 - auto
|
|
34
|
+
const percentage = byte4 & 0b01111111; // 0-100%, 101/102/103 - Quick gear 1/2/3
|
|
35
|
+
const humidity = autoMode ? 0 : percentage === 101 ? 33 : percentage === 102 ? 66 : percentage === 103 ? 100 : percentage;
|
|
36
|
+
const data = {
|
|
37
|
+
model: SwitchBotBLEModel.Humidifier2,
|
|
38
|
+
modelName: SwitchBotBLEModelName.Humidifier2,
|
|
39
|
+
modelFriendlyName: SwitchBotBLEModelFriendlyName.Humidifier2,
|
|
40
|
+
onState,
|
|
41
|
+
autoMode,
|
|
42
|
+
percentage: autoMode ? 0 : percentage,
|
|
43
|
+
humidity,
|
|
44
|
+
};
|
|
45
|
+
return data;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Sends a command to the humidifier.
|
|
49
|
+
* @param {Buffer} reqBuf - The command buffer.
|
|
50
|
+
* @returns {Promise<void>}
|
|
51
|
+
*/
|
|
52
|
+
async operateHumi(reqBuf) {
|
|
53
|
+
const resBuf = await this.command(reqBuf);
|
|
54
|
+
const code = resBuf.readUInt8(0);
|
|
55
|
+
if (resBuf.length !== 3 || (code !== 0x01 && code !== 0x05)) {
|
|
56
|
+
throw new Error(`The device returned an error: 0x${resBuf.toString('hex')}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Turns on the humidifier.
|
|
61
|
+
* @returns {Promise<void>}
|
|
62
|
+
*/
|
|
63
|
+
async turnOn() {
|
|
64
|
+
await this.operateHumi(Buffer.from(TURN_ON_KEY, 'hex'));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Turns off the humidifier.
|
|
68
|
+
* @returns {Promise<void>}
|
|
69
|
+
*/
|
|
70
|
+
async turnOff() {
|
|
71
|
+
await this.operateHumi(Buffer.from(TURN_OFF_KEY, 'hex'));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Increases the humidifier setting.
|
|
75
|
+
* @returns {Promise<void>}
|
|
76
|
+
*/
|
|
77
|
+
async increase() {
|
|
78
|
+
await this.operateHumi(Buffer.from(INCREASE_KEY, 'hex'));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Decreases the humidifier setting.
|
|
82
|
+
* @returns {Promise<void>}
|
|
83
|
+
*/
|
|
84
|
+
async decrease() {
|
|
85
|
+
await this.operateHumi(Buffer.from(DECREASE_KEY, 'hex'));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Sets the humidifier to auto mode.
|
|
89
|
+
* @returns {Promise<void>}
|
|
90
|
+
*/
|
|
91
|
+
async setAutoMode() {
|
|
92
|
+
await this.operateHumi(Buffer.from(SET_AUTO_MODE_KEY, 'hex'));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Sets the humidifier to manual mode.
|
|
96
|
+
* @returns {Promise<void>}
|
|
97
|
+
*/
|
|
98
|
+
async setManualMode() {
|
|
99
|
+
await this.operateHumi(Buffer.from(SET_MANUAL_MODE_KEY, 'hex'));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Sets the humidifier level.
|
|
103
|
+
* @param {number} level - The level to set (0-100).
|
|
104
|
+
* @returns {Promise<void>}
|
|
105
|
+
*/
|
|
106
|
+
async percentage(level) {
|
|
107
|
+
if (level < 0 || level > 100) {
|
|
108
|
+
throw new Error('Level must be between 0 and 100');
|
|
109
|
+
}
|
|
110
|
+
const levelKey = `${HUMIDIFIER_COMMAND_HEADER}0107${level.toString(16).padStart(2, '0')}`;
|
|
111
|
+
await this.operateHumi(Buffer.from(levelKey, 'hex'));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=wohumi2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wohumi2.js","sourceRoot":"","sources":["../../src/device/wohumi2.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"woleak.d.ts","sourceRoot":"","sources":["../../src/device/woleak.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C;;;GAGG;AACH,qBAAa,MAAO,SAAQ,eAAe;IACzC;;;;;;OAMG;WACU,gBAAgB,CAC3B,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAChD,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"woleak.d.ts","sourceRoot":"","sources":["../../src/device/woleak.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C;;;GAGG;AACH,qBAAa,MAAO,SAAQ,eAAe;IACzC;;;;;;OAMG;WACU,gBAAgB,CAC3B,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAChD,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC;gBA+BnC,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;CAG7E"}
|
package/dist/device/woleak.js
CHANGED
|
@@ -21,18 +21,10 @@ export class WoLeak extends SwitchbotDevice {
|
|
|
21
21
|
emitLog('debugerror', `[parseServiceDataForWoLeakDetector] Manufacturer Data Buffer length ${manufacturerData?.length ?? 0} < 2!`);
|
|
22
22
|
return null;
|
|
23
23
|
}
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
const eventFlags = serviceData.readUInt8(1);
|
|
31
|
-
const waterLeakDetected = !!(eventFlags & 0b00000001); // Bit 0
|
|
32
|
-
const deviceTampered = !!(eventFlags & 0b00000010); // Bit 1
|
|
33
|
-
const batteryInfo = serviceData.readUInt8(2);
|
|
34
|
-
const batteryLevel = batteryInfo & 0b01111111; // Bits 0-6
|
|
35
|
-
const lowBattery = !!(batteryInfo & 0b10000000); // Bit 7
|
|
24
|
+
const waterLeakDetected = !!(manufacturerData.readUInt8(8) & 0b00000001); // Bit 0
|
|
25
|
+
const deviceTampered = !!(manufacturerData.readUInt8(8) & 0b00000010); // Bit 1
|
|
26
|
+
const batteryLevel = manufacturerData.readUInt8(7) & 0b01111111; // Bits 0-6
|
|
27
|
+
const lowBattery = !!(manufacturerData.readUInt8(7) & 0b10000000); // Bit 7
|
|
36
28
|
// Manufacturer data can be processed here if needed
|
|
37
29
|
const data = {
|
|
38
30
|
model: SwitchBotBLEModel.Leak,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"woleak.js","sourceRoot":"","sources":["../../src/device/woleak.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAE3G;;;GAGG;AACH,MAAM,OAAO,MAAO,SAAQ,eAAe;IACzC;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAC3B,WAAmB,EACnB,gBAAwB,EACxB,OAAiD;QAEjD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,YAAY,EAAE,kEAAkE,WAAW,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA;YACxH,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,YAAY,EAAE,uEAAuE,gBAAgB,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA;YAClI,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,
|
|
1
|
+
{"version":3,"file":"woleak.js","sourceRoot":"","sources":["../../src/device/woleak.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAE3G;;;GAGG;AACH,MAAM,OAAO,MAAO,SAAQ,eAAe;IACzC;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAC3B,WAAmB,EACnB,gBAAwB,EACxB,OAAiD;QAEjD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,YAAY,EAAE,kEAAkE,WAAW,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA;YACxH,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,YAAY,EAAE,uEAAuE,gBAAgB,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA;YAClI,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAA,CAAC,QAAQ;QACjF,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAA,CAAC,QAAQ;QAC9E,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAA,CAAC,WAAW;QAC3E,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAA,CAAC,QAAQ;QAE1E,oDAAoD;QAEpD,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,iBAAiB,CAAC,IAAI;YAC7B,SAAS,EAAE,qBAAqB,CAAC,IAAI;YACrC,iBAAiB,EAAE,6BAA6B,CAAC,IAAI;YACrD,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE,YAAY;YACrB,WAAW,EAAE,UAAU;SACxB,CAAA;QAED,OAAO,IAAoC,CAAA;IAC7C,CAAC;IAED,YAAY,UAAoC,EAAE,KAA0B;QAC1E,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC1B,CAAC;CACF"}
|
|
@@ -1,36 +1,20 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Buffer } from 'node:buffer';
|
|
2
|
+
import type { relaySwitch1ServiceData } from '../types/bledevicestatus.js';
|
|
2
3
|
import type { NobleTypes } from '../types/types.js';
|
|
3
|
-
import { Buffer } from 'node:buffer';
|
|
4
4
|
import { SwitchbotDevice } from '../device.js';
|
|
5
5
|
/**
|
|
6
6
|
* Class representing a WoRelaySwitch1 device.
|
|
7
7
|
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/
|
|
8
8
|
*/
|
|
9
9
|
export declare class WoRelaySwitch1 extends SwitchbotDevice {
|
|
10
|
-
private _iv;
|
|
11
|
-
private _cipher;
|
|
12
|
-
private _keyId;
|
|
13
|
-
private _encryptionKey;
|
|
14
10
|
constructor(peripheral: NobleTypes['peripheral'], noble: NobleTypes['noble']);
|
|
15
11
|
/**
|
|
16
12
|
* Parses the service data for WoRelaySwitch1.
|
|
17
13
|
* @param {Buffer} serviceData - The service data buffer.
|
|
18
14
|
* @param {Buffer} manufacturerData - The manufacturer data buffer.
|
|
19
15
|
* @param {Function} emitLog - The function to emit log messages.
|
|
20
|
-
* @returns {Promise<
|
|
16
|
+
* @returns {Promise<relaySwitch1ServiceData | null>} - Parsed service data or null if invalid.
|
|
21
17
|
*/
|
|
22
|
-
static parseServiceData(serviceData: Buffer, manufacturerData: Buffer, emitLog: (level: string, message: string) => void): Promise<
|
|
23
|
-
turnOn(): Promise<boolean>;
|
|
24
|
-
turnOff(): Promise<boolean>;
|
|
25
|
-
toggle(): Promise<boolean>;
|
|
26
|
-
getVoltageAndCurrent(): Promise<{
|
|
27
|
-
voltage: number;
|
|
28
|
-
current: number;
|
|
29
|
-
} | null>;
|
|
30
|
-
private _sendCommand;
|
|
31
|
-
private _ensureEncryptionInitialized;
|
|
32
|
-
private _getCipher;
|
|
33
|
-
private _encrypt;
|
|
34
|
-
private _decrypt;
|
|
18
|
+
static parseServiceData(serviceData: Buffer, manufacturerData: Buffer, emitLog: (level: string, message: string) => void): Promise<relaySwitch1ServiceData | null>;
|
|
35
19
|
}
|
|
36
20
|
//# sourceMappingURL=worelayswitch1.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worelayswitch1.d.ts","sourceRoot":"","sources":["../../src/device/worelayswitch1.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"worelayswitch1.d.ts","sourceRoot":"","sources":["../../src/device/worelayswitch1.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C;;;GAGG;AACH,qBAAa,cAAe,SAAQ,eAAe;gBACrC,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;IAI5E;;;;;;OAMG;WACU,gBAAgB,CAC3B,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAChD,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;CAiB3C"}
|
|
@@ -1,48 +1,19 @@
|
|
|
1
|
-
import { Buffer } from 'node:buffer';
|
|
2
|
-
import { createCipheriv } from 'node:crypto';
|
|
3
1
|
import { SwitchbotDevice } from '../device.js';
|
|
4
2
|
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js';
|
|
5
|
-
const COMMAND_HEADER = '57';
|
|
6
|
-
const COMMAND_GET_CK_IV = `${COMMAND_HEADER}0f2103`;
|
|
7
|
-
const COMMAND_TURN_OFF = `${COMMAND_HEADER}0f70010000`;
|
|
8
|
-
const COMMAND_TURN_ON = `${COMMAND_HEADER}0f70010100`;
|
|
9
|
-
const COMMAND_TOGGLE = `${COMMAND_HEADER}0f70010200`;
|
|
10
|
-
const COMMAND_GET_VOLTAGE_AND_CURRENT = `${COMMAND_HEADER}0f7106000000`;
|
|
11
|
-
// const PASSIVE_POLL_INTERVAL = 1 * 60
|
|
12
3
|
/**
|
|
13
4
|
* Class representing a WoRelaySwitch1 device.
|
|
14
5
|
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/
|
|
15
6
|
*/
|
|
16
7
|
export class WoRelaySwitch1 extends SwitchbotDevice {
|
|
17
|
-
_iv = null;
|
|
18
|
-
_cipher = null;
|
|
19
|
-
_keyId;
|
|
20
|
-
_encryptionKey;
|
|
21
8
|
constructor(peripheral, noble) {
|
|
22
9
|
super(peripheral, noble);
|
|
23
|
-
const keyId = peripheral.advertisement.localName?.slice(-2) || '';
|
|
24
|
-
const encryptionKey = peripheral.advertisement.localName?.slice(0, 32) || '';
|
|
25
|
-
if (keyId.length === 0) {
|
|
26
|
-
throw new Error('key_id is missing');
|
|
27
|
-
}
|
|
28
|
-
else if (keyId.length !== 2) {
|
|
29
|
-
throw new Error('key_id is invalid');
|
|
30
|
-
}
|
|
31
|
-
if (encryptionKey.length === 0) {
|
|
32
|
-
throw new Error('encryption_key is missing');
|
|
33
|
-
}
|
|
34
|
-
else if (encryptionKey.length !== 32) {
|
|
35
|
-
throw new Error('encryption_key is invalid');
|
|
36
|
-
}
|
|
37
|
-
this._keyId = keyId;
|
|
38
|
-
this._encryptionKey = Buffer.from(encryptionKey, 'hex');
|
|
39
10
|
}
|
|
40
11
|
/**
|
|
41
12
|
* Parses the service data for WoRelaySwitch1.
|
|
42
13
|
* @param {Buffer} serviceData - The service data buffer.
|
|
43
14
|
* @param {Buffer} manufacturerData - The manufacturer data buffer.
|
|
44
15
|
* @param {Function} emitLog - The function to emit log messages.
|
|
45
|
-
* @returns {Promise<
|
|
16
|
+
* @returns {Promise<relaySwitch1ServiceData | null>} - Parsed service data or null if invalid.
|
|
46
17
|
*/
|
|
47
18
|
static async parseServiceData(serviceData, manufacturerData, emitLog) {
|
|
48
19
|
if (serviceData.length < 8 || manufacturerData.length === null) {
|
|
@@ -59,83 +30,5 @@ export class WoRelaySwitch1 extends SwitchbotDevice {
|
|
|
59
30
|
};
|
|
60
31
|
return data;
|
|
61
32
|
}
|
|
62
|
-
async turnOn() {
|
|
63
|
-
const result = await this._sendCommand(COMMAND_TURN_ON);
|
|
64
|
-
const ok = this._checkCommandResult(result, 0, new Set([1]));
|
|
65
|
-
if (ok) {
|
|
66
|
-
this._overrideState({ isOn: true });
|
|
67
|
-
this._fireCallbacks();
|
|
68
|
-
}
|
|
69
|
-
return ok;
|
|
70
|
-
}
|
|
71
|
-
async turnOff() {
|
|
72
|
-
const result = await this._sendCommand(COMMAND_TURN_OFF);
|
|
73
|
-
const ok = this._checkCommandResult(result, 0, new Set([1]));
|
|
74
|
-
if (ok) {
|
|
75
|
-
this._overrideState({ isOn: false });
|
|
76
|
-
this._fireCallbacks();
|
|
77
|
-
}
|
|
78
|
-
return ok;
|
|
79
|
-
}
|
|
80
|
-
async toggle() {
|
|
81
|
-
const result = await this._sendCommand(COMMAND_TOGGLE);
|
|
82
|
-
return this._checkCommandResult(result, 0, new Set([1]));
|
|
83
|
-
}
|
|
84
|
-
async getVoltageAndCurrent() {
|
|
85
|
-
const result = await this._sendCommand(COMMAND_GET_VOLTAGE_AND_CURRENT);
|
|
86
|
-
const ok = this._checkCommandResult(result, 0, new Set([1]));
|
|
87
|
-
if (ok) {
|
|
88
|
-
return {
|
|
89
|
-
voltage: result ? (result[9] << 8) + result[10] : 0,
|
|
90
|
-
current: result ? (result[11] << 8) + result[12] : 0,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
async _sendCommand(key, retry = null, encrypt = true) {
|
|
96
|
-
if (!encrypt) {
|
|
97
|
-
return await super._sendCommand(`${key.slice(0, 2)}000000${key.slice(2)}`, retry);
|
|
98
|
-
}
|
|
99
|
-
const result = await this._ensureEncryptionInitialized();
|
|
100
|
-
if (!result) {
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
const encrypted = key.slice(0, 2) + this._keyId + this._iv.slice(0, 2).toString('hex') + this._encrypt(key.slice(2));
|
|
104
|
-
const response = await super._sendCommand(encrypted, retry);
|
|
105
|
-
return response ? Buffer.concat([response.slice(0, 1), this._decrypt(response.slice(4))]) : null;
|
|
106
|
-
}
|
|
107
|
-
async _ensureEncryptionInitialized() {
|
|
108
|
-
if (this._iv !== null) {
|
|
109
|
-
return true;
|
|
110
|
-
}
|
|
111
|
-
const result = await this._sendCommand(COMMAND_GET_CK_IV + this._keyId, null, false);
|
|
112
|
-
const ok = this._checkCommandResult(result, 0, new Set([1]));
|
|
113
|
-
if (ok) {
|
|
114
|
-
this._iv = result.slice(4);
|
|
115
|
-
}
|
|
116
|
-
return ok;
|
|
117
|
-
}
|
|
118
|
-
_getCipher() {
|
|
119
|
-
if (this._cipher === null) {
|
|
120
|
-
this._cipher = createCipheriv('aes-128-ctr', this._encryptionKey, this._iv);
|
|
121
|
-
}
|
|
122
|
-
return this._cipher;
|
|
123
|
-
}
|
|
124
|
-
_encrypt(data) {
|
|
125
|
-
if (data.length === 0) {
|
|
126
|
-
return '';
|
|
127
|
-
}
|
|
128
|
-
const cipher = this._getCipher();
|
|
129
|
-
const encrypted = Buffer.concat([cipher.update(Buffer.from(data, 'hex')), cipher.final()]);
|
|
130
|
-
return encrypted.toString('hex');
|
|
131
|
-
}
|
|
132
|
-
_decrypt(data) {
|
|
133
|
-
if (data.length === 0) {
|
|
134
|
-
return Buffer.alloc(0);
|
|
135
|
-
}
|
|
136
|
-
const decipher = createCipheriv('aes-128-ctr', this._encryptionKey, this._iv);
|
|
137
|
-
const decrypted = Buffer.concat([decipher.update(data), decipher.final()]);
|
|
138
|
-
return decrypted;
|
|
139
|
-
}
|
|
140
33
|
}
|
|
141
34
|
//# sourceMappingURL=worelayswitch1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worelayswitch1.js","sourceRoot":"","sources":["../../src/device/worelayswitch1.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worelayswitch1.js","sourceRoot":"","sources":["../../src/device/worelayswitch1.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAE3G;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD,YAAY,UAAoC,EAAE,KAA0B;QAC1E,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC1B,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAC3B,WAAmB,EACnB,gBAAwB,EACxB,OAAiD;QAEjD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC/D,OAAO,CAAC,YAAY,EAAE,yDAAyD,WAAW,CAAC,MAAM,OAAO,CAAC,CAAA;YACzG,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,IAAI,GAA4B;YACpC,KAAK,EAAE,iBAAiB,CAAC,YAAY;YACrC,SAAS,EAAE,qBAAqB,CAAC,YAAY;YAC7C,iBAAiB,EAAE,6BAA6B,CAAC,YAAY;YAC7D,IAAI,EAAE,IAAI,EAAE,6BAA6B;YACzC,KAAK,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;YAC3C,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC;SACrC,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
+
import type { Buffer } from 'node:buffer';
|
|
1
2
|
import type { relaySwitch1PMServiceData } from '../types/bledevicestatus.js';
|
|
2
3
|
import type { NobleTypes } from '../types/types.js';
|
|
3
|
-
import { Buffer } from 'node:buffer';
|
|
4
4
|
import { SwitchbotDevice } from '../device.js';
|
|
5
5
|
/**
|
|
6
6
|
* Class representing a WoRelaySwitch1PM device.
|
|
7
7
|
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/
|
|
8
8
|
*/
|
|
9
9
|
export declare class WoRelaySwitch1PM extends SwitchbotDevice {
|
|
10
|
-
private _iv;
|
|
11
|
-
private _cipher;
|
|
12
|
-
private _keyId;
|
|
13
|
-
private _encryptionKey;
|
|
14
10
|
constructor(peripheral: NobleTypes['peripheral'], noble: NobleTypes['noble']);
|
|
15
11
|
/**
|
|
16
12
|
* Parses the service data for WoRelaySwitch1PM.
|
|
@@ -20,17 +16,5 @@ export declare class WoRelaySwitch1PM extends SwitchbotDevice {
|
|
|
20
16
|
* @returns {Promise<relaySwitch1PMServiceData | null>} - Parsed service data or null if invalid.
|
|
21
17
|
*/
|
|
22
18
|
static parseServiceData(serviceData: Buffer, manufacturerData: Buffer, emitLog: (level: string, message: string) => void): Promise<relaySwitch1PMServiceData | null>;
|
|
23
|
-
turnOn(): Promise<boolean>;
|
|
24
|
-
turnOff(): Promise<boolean>;
|
|
25
|
-
toggle(): Promise<boolean>;
|
|
26
|
-
getVoltageAndCurrent(): Promise<{
|
|
27
|
-
voltage: number;
|
|
28
|
-
current: number;
|
|
29
|
-
} | null>;
|
|
30
|
-
private _sendCommand;
|
|
31
|
-
private _ensureEncryptionInitialized;
|
|
32
|
-
private _getCipher;
|
|
33
|
-
private _encrypt;
|
|
34
|
-
private _decrypt;
|
|
35
19
|
}
|
|
36
20
|
//# sourceMappingURL=worelayswitch1pm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worelayswitch1pm.d.ts","sourceRoot":"","sources":["../../src/device/worelayswitch1pm.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worelayswitch1pm.d.ts","sourceRoot":"","sources":["../../src/device/worelayswitch1pm.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;gBACvC,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;IAI5E;;;;;;OAMG;WACU,gBAAgB,CAC3B,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAChD,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;CAoB7C"}
|
|
@@ -1,41 +1,12 @@
|
|
|
1
|
-
import { Buffer } from 'node:buffer';
|
|
2
|
-
import { createCipheriv } from 'node:crypto';
|
|
3
1
|
import { SwitchbotDevice } from '../device.js';
|
|
4
2
|
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js';
|
|
5
|
-
const COMMAND_HEADER = '57';
|
|
6
|
-
const COMMAND_GET_CK_IV = `${COMMAND_HEADER}0f2103`;
|
|
7
|
-
const COMMAND_TURN_OFF = `${COMMAND_HEADER}0f70010000`;
|
|
8
|
-
const COMMAND_TURN_ON = `${COMMAND_HEADER}0f70010100`;
|
|
9
|
-
const COMMAND_TOGGLE = `${COMMAND_HEADER}0f70010200`;
|
|
10
|
-
const COMMAND_GET_VOLTAGE_AND_CURRENT = `${COMMAND_HEADER}0f7106000000`;
|
|
11
|
-
// const PASSIVE_POLL_INTERVAL = 1 * 60
|
|
12
3
|
/**
|
|
13
4
|
* Class representing a WoRelaySwitch1PM device.
|
|
14
5
|
* @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/
|
|
15
6
|
*/
|
|
16
7
|
export class WoRelaySwitch1PM extends SwitchbotDevice {
|
|
17
|
-
_iv = null;
|
|
18
|
-
_cipher = null;
|
|
19
|
-
_keyId;
|
|
20
|
-
_encryptionKey;
|
|
21
8
|
constructor(peripheral, noble) {
|
|
22
9
|
super(peripheral, noble);
|
|
23
|
-
const keyId = peripheral.advertisement.localName?.slice(-2) || '';
|
|
24
|
-
const encryptionKey = peripheral.advertisement.localName?.slice(0, 32) || '';
|
|
25
|
-
if (keyId.length === 0) {
|
|
26
|
-
throw new Error('key_id is missing');
|
|
27
|
-
}
|
|
28
|
-
else if (keyId.length !== 2) {
|
|
29
|
-
throw new Error('key_id is invalid');
|
|
30
|
-
}
|
|
31
|
-
if (encryptionKey.length === 0) {
|
|
32
|
-
throw new Error('encryption_key is missing');
|
|
33
|
-
}
|
|
34
|
-
else if (encryptionKey.length !== 32) {
|
|
35
|
-
throw new Error('encryption_key is invalid');
|
|
36
|
-
}
|
|
37
|
-
this._keyId = keyId;
|
|
38
|
-
this._encryptionKey = Buffer.from(encryptionKey, 'hex');
|
|
39
10
|
}
|
|
40
11
|
/**
|
|
41
12
|
* Parses the service data for WoRelaySwitch1PM.
|
|
@@ -45,7 +16,7 @@ export class WoRelaySwitch1PM extends SwitchbotDevice {
|
|
|
45
16
|
* @returns {Promise<relaySwitch1PMServiceData | null>} - Parsed service data or null if invalid.
|
|
46
17
|
*/
|
|
47
18
|
static async parseServiceData(serviceData, manufacturerData, emitLog) {
|
|
48
|
-
if (serviceData.length < 8 || manufacturerData.length ===
|
|
19
|
+
if (serviceData.length < 8 || manufacturerData.length === 0) {
|
|
49
20
|
emitLog('debugerror', `[parseServiceDataForWoRelaySwitch1PM] Buffer length ${serviceData.length} < 8!`);
|
|
50
21
|
return null;
|
|
51
22
|
}
|
|
@@ -62,83 +33,5 @@ export class WoRelaySwitch1PM extends SwitchbotDevice {
|
|
|
62
33
|
};
|
|
63
34
|
return data;
|
|
64
35
|
}
|
|
65
|
-
async turnOn() {
|
|
66
|
-
const result = await this._sendCommand(COMMAND_TURN_ON);
|
|
67
|
-
const ok = this._checkCommandResult(result, 0, new Set([1]));
|
|
68
|
-
if (ok) {
|
|
69
|
-
this._overrideState({ isOn: true });
|
|
70
|
-
this._fireCallbacks();
|
|
71
|
-
}
|
|
72
|
-
return ok;
|
|
73
|
-
}
|
|
74
|
-
async turnOff() {
|
|
75
|
-
const result = await this._sendCommand(COMMAND_TURN_OFF);
|
|
76
|
-
const ok = this._checkCommandResult(result, 0, new Set([1]));
|
|
77
|
-
if (ok) {
|
|
78
|
-
this._overrideState({ isOn: false });
|
|
79
|
-
this._fireCallbacks();
|
|
80
|
-
}
|
|
81
|
-
return ok;
|
|
82
|
-
}
|
|
83
|
-
async toggle() {
|
|
84
|
-
const result = await this._sendCommand(COMMAND_TOGGLE);
|
|
85
|
-
return this._checkCommandResult(result, 0, new Set([1]));
|
|
86
|
-
}
|
|
87
|
-
async getVoltageAndCurrent() {
|
|
88
|
-
const result = await this._sendCommand(COMMAND_GET_VOLTAGE_AND_CURRENT);
|
|
89
|
-
const ok = this._checkCommandResult(result, 0, new Set([1]));
|
|
90
|
-
if (ok) {
|
|
91
|
-
return {
|
|
92
|
-
voltage: result ? (result[9] << 8) + result[10] : 0,
|
|
93
|
-
current: result ? (result[11] << 8) + result[12] : 0,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
async _sendCommand(key, retry = null, encrypt = true) {
|
|
99
|
-
if (!encrypt) {
|
|
100
|
-
return await super._sendCommand(`${key.slice(0, 2)}000000${key.slice(2)}`, retry);
|
|
101
|
-
}
|
|
102
|
-
const result = await this._ensureEncryptionInitialized();
|
|
103
|
-
if (!result) {
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
const encrypted = key.slice(0, 2) + this._keyId + this._iv.slice(0, 2).toString('hex') + this._encrypt(key.slice(2));
|
|
107
|
-
const response = await super._sendCommand(encrypted, retry);
|
|
108
|
-
return response ? Buffer.concat([response.slice(0, 1), this._decrypt(response.slice(4))]) : null;
|
|
109
|
-
}
|
|
110
|
-
async _ensureEncryptionInitialized() {
|
|
111
|
-
if (this._iv !== null) {
|
|
112
|
-
return true;
|
|
113
|
-
}
|
|
114
|
-
const result = await this._sendCommand(COMMAND_GET_CK_IV + this._keyId, null, false);
|
|
115
|
-
const ok = this._checkCommandResult(result, 0, new Set([1]));
|
|
116
|
-
if (ok) {
|
|
117
|
-
this._iv = result.slice(4);
|
|
118
|
-
}
|
|
119
|
-
return ok;
|
|
120
|
-
}
|
|
121
|
-
_getCipher() {
|
|
122
|
-
if (this._cipher === null) {
|
|
123
|
-
this._cipher = createCipheriv('aes-128-ctr', this._encryptionKey, this._iv);
|
|
124
|
-
}
|
|
125
|
-
return this._cipher;
|
|
126
|
-
}
|
|
127
|
-
_encrypt(data) {
|
|
128
|
-
if (data.length === 0) {
|
|
129
|
-
return '';
|
|
130
|
-
}
|
|
131
|
-
const cipher = this._getCipher();
|
|
132
|
-
const encrypted = Buffer.concat([cipher.update(Buffer.from(data, 'hex')), cipher.final()]);
|
|
133
|
-
return encrypted.toString('hex');
|
|
134
|
-
}
|
|
135
|
-
_decrypt(data) {
|
|
136
|
-
if (data.length === 0) {
|
|
137
|
-
return Buffer.alloc(0);
|
|
138
|
-
}
|
|
139
|
-
const decipher = createCipheriv('aes-128-ctr', this._encryptionKey, this._iv);
|
|
140
|
-
const decrypted = Buffer.concat([decipher.update(data), decipher.final()]);
|
|
141
|
-
return decrypted;
|
|
142
|
-
}
|
|
143
36
|
}
|
|
144
37
|
//# sourceMappingURL=worelayswitch1pm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worelayswitch1pm.js","sourceRoot":"","sources":["../../src/device/worelayswitch1pm.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"worelayswitch1pm.js","sourceRoot":"","sources":["../../src/device/worelayswitch1pm.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAE3G;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,eAAe;IACnD,YAAY,UAAoC,EAAE,KAA0B;QAC1E,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC1B,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAC3B,WAAmB,EACnB,gBAAwB,EACxB,OAAiD;QAEjD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,YAAY,EAAE,uDAAuD,WAAW,CAAC,MAAM,OAAO,CAAC,CAAA;YACvG,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,IAAI,GAA8B;YACtC,KAAK,EAAE,iBAAiB,CAAC,cAAc;YACvC,SAAS,EAAE,qBAAqB,CAAC,cAAc;YAC/C,iBAAiB,EAAE,6BAA6B,CAAC,cAAc;YAC/D,IAAI,EAAE,IAAI,EAAE,6BAA6B;YACzC,KAAK,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;YAC3C,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC;YACpC,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE;YAChE,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;SACX,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
|
package/dist/device.d.ts
CHANGED
package/dist/device.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,KAAK,MAAM,mBAAmB,CAAA;AAE/C,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAElI,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAM1C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,KAAK,MAAM,mBAAmB,CAAA;AAE/C,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAElI,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAM1C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,mBAAmB,CAAQ;IACnC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,SAAS,CAAsC;IAEvD;;;;OAIG;gBACS,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;IAc5E;;;;OAIG;IACU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,KAAK,IAAI,iBAAiB,CAE7B;IAED,IAAI,SAAS,IAAI,qBAAqB,CAErC;IAED,IAAI,YAAY,IAAI,6BAA6B,CAEhD;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,gBAAgB,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,CAE1C;IAED,IAAI,gBAAgB,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAO7C;IAED,IAAI,mBAAmB,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,CAE7C;IAED,IAAI,mBAAmB,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAOhD;IAED;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;;OAGG;YACW,eAAe;IA8B7B;;;OAGG;IACU,kBAAkB,IAAI,OAAO,CAAC,KAAK,CAAC;IAsCjD;;;OAGG;IACU,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAczD;;;;OAIG;YACW,uBAAuB;IAIrC;;;OAGG;YACW,iBAAiB;IAS/B;;;OAGG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5C;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC;;;OAGG;YACW,kBAAkB;IAOhC;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAUtC;;;;OAIG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhD;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB9C;;;OAGG;YACW,sBAAsB;IAoBpC;;;;OAIG;YACW,kBAAkB;IAehC;;;;;OAKG;YACW,mBAAmB;CAalC"}
|
package/dist/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAE7I;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,YAAY;
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"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"}
|