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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"woceilinglight.test.d.ts","sourceRoot":"","sources":["../../src/device/woceilinglight.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import * as Noble from '@stoprocent/noble';
|
|
3
|
+
/* eslint-disable no-console */
|
|
4
|
+
import { WoCeilingLight } from './woceilinglight.js';
|
|
5
|
+
describe('woCeilingLight', () => {
|
|
6
|
+
let ceilingLight;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
const peripheral = {}; // Replace with the actual peripheral object (e.g. from Noble)
|
|
9
|
+
ceilingLight = new WoCeilingLight(peripheral, Noble);
|
|
10
|
+
});
|
|
11
|
+
it('parseServiceData should return null for incorrect buffer length', async () => {
|
|
12
|
+
const manufacturerData = Buffer.alloc(10);
|
|
13
|
+
const result = await WoCeilingLight.parseServiceData(manufacturerData, console.log);
|
|
14
|
+
expect(result).toBeNull();
|
|
15
|
+
});
|
|
16
|
+
it('parseServiceData should return correct data for valid buffer', async () => {
|
|
17
|
+
const manufacturerData = Buffer.from([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
|
|
18
|
+
const result = await WoCeilingLight.parseServiceData(manufacturerData, console.log);
|
|
19
|
+
expect(result).toEqual({
|
|
20
|
+
model: 'CeilingLight',
|
|
21
|
+
modelName: 'CeilingLight',
|
|
22
|
+
modelFriendlyName: 'CeilingLight',
|
|
23
|
+
color_temperature: 6,
|
|
24
|
+
power: 1,
|
|
25
|
+
state: false,
|
|
26
|
+
red: 3,
|
|
27
|
+
green: 4,
|
|
28
|
+
blue: 5,
|
|
29
|
+
brightness: 7,
|
|
30
|
+
delay: 128,
|
|
31
|
+
preset: 8,
|
|
32
|
+
color_mode: 0,
|
|
33
|
+
speed: 9,
|
|
34
|
+
loop_index: 10,
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
it('turnOn should call setState with correct parameters', async () => {
|
|
38
|
+
const setStateSpy = jest.spyOn(ceilingLight, 'setState').mockResolvedValue(undefined);
|
|
39
|
+
await ceilingLight.turnOn();
|
|
40
|
+
expect(setStateSpy).toHaveBeenCalledWith([0x01, 0x01]);
|
|
41
|
+
});
|
|
42
|
+
it('turnOff should call setState with correct parameters', async () => {
|
|
43
|
+
const setStateSpy = jest.spyOn(ceilingLight, 'setState').mockResolvedValue(undefined);
|
|
44
|
+
await ceilingLight.turnOff();
|
|
45
|
+
expect(setStateSpy).toHaveBeenCalledWith([0x01, 0x02]);
|
|
46
|
+
});
|
|
47
|
+
it('setBrightness should call setState with correct parameters', async () => {
|
|
48
|
+
const setStateSpy = jest.spyOn(ceilingLight, 'setState').mockResolvedValue(undefined);
|
|
49
|
+
await ceilingLight.setBrightness(50);
|
|
50
|
+
expect(setStateSpy).toHaveBeenCalledWith([0x02, 0x14]);
|
|
51
|
+
});
|
|
52
|
+
it('setColorTemperature should call setState with correct parameters', async () => {
|
|
53
|
+
const setStateSpy = jest.spyOn(ceilingLight, 'setState').mockResolvedValue(undefined);
|
|
54
|
+
await ceilingLight.setColorTemperature(50);
|
|
55
|
+
expect(setStateSpy).toHaveBeenCalledWith([0x02, 0x17, 50]);
|
|
56
|
+
});
|
|
57
|
+
it('setRGB should call setState with correct parameters', async () => {
|
|
58
|
+
const setStateSpy = jest.spyOn(ceilingLight, 'setState').mockResolvedValue(undefined);
|
|
59
|
+
await ceilingLight.setRGB(50, 100, 150, 200);
|
|
60
|
+
expect(setStateSpy).toHaveBeenCalledWith([0x02, 0x12, 50, 100, 150, 200]);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=woceilinglight.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"woceilinglight.test.js","sourceRoot":"","sources":["../../src/device/woceilinglight.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,6 @@
|
|
|
1
1
|
import type { Buffer } from 'node:buffer';
|
|
2
2
|
import { SwitchbotDevice } from '../device.js';
|
|
3
|
-
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
|
|
4
3
|
export declare class WoContact extends SwitchbotDevice {
|
|
5
|
-
static parseServiceData(
|
|
6
|
-
model: SwitchBotBLEModel;
|
|
7
|
-
modelName: SwitchBotBLEModelName;
|
|
8
|
-
modelFriendlyName: SwitchBotBLEModelFriendlyName;
|
|
9
|
-
movement: boolean;
|
|
10
|
-
tested: number;
|
|
11
|
-
battery: number;
|
|
12
|
-
contact_open: boolean;
|
|
13
|
-
contact_timeout: boolean;
|
|
14
|
-
lightLevel: string;
|
|
15
|
-
button_count: number;
|
|
16
|
-
doorState: string;
|
|
17
|
-
} | null;
|
|
4
|
+
static parseServiceData(serviceData: Buffer, onlog: ((message: string) => void) | undefined): Promise<object | null>;
|
|
18
5
|
}
|
|
19
6
|
//# sourceMappingURL=wocontact.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wocontact.d.ts","sourceRoot":"","sources":["../../src/device/wocontact.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wocontact.d.ts","sourceRoot":"","sources":["../../src/device/wocontact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAMzC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C,qBAAa,SAAU,SAAQ,eAAe;WAC/B,gBAAgB,CAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GAC7C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAsC1B"}
|
package/dist/device/wocontact.js
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
|
+
/* Copyright(C) 2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* wocontact.ts: Switchbot BLE API registration.
|
|
4
|
+
*/
|
|
1
5
|
import { SwitchbotDevice } from '../device.js';
|
|
2
|
-
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
|
|
6
|
+
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js';
|
|
3
7
|
export class WoContact extends SwitchbotDevice {
|
|
4
|
-
static parseServiceData(
|
|
5
|
-
if (
|
|
8
|
+
static async parseServiceData(serviceData, onlog) {
|
|
9
|
+
if (serviceData.length !== 9) {
|
|
6
10
|
if (onlog && typeof onlog === 'function') {
|
|
7
|
-
onlog(`[parseServiceDataForWoContact] Buffer length ${
|
|
11
|
+
onlog(`[parseServiceDataForWoContact] Buffer length ${serviceData.length} !== 9!`);
|
|
8
12
|
}
|
|
9
13
|
return null;
|
|
10
14
|
}
|
|
11
|
-
const byte1 =
|
|
12
|
-
const byte2 =
|
|
13
|
-
const byte3 =
|
|
14
|
-
const byte8 =
|
|
15
|
+
const byte1 = serviceData.readUInt8(1);
|
|
16
|
+
const byte2 = serviceData.readUInt8(2);
|
|
17
|
+
const byte3 = serviceData.readUInt8(3);
|
|
18
|
+
const byte8 = serviceData.readUInt8(8);
|
|
15
19
|
const hallState = (byte3 >> 1) & 0b00000011;
|
|
16
20
|
const tested = byte1 & 0b10000000;
|
|
17
21
|
const movement = !!(byte1 & 0b01000000); // 1 - Movement detected
|
|
@@ -31,11 +35,7 @@ export class WoContact extends SwitchbotDevice {
|
|
|
31
35
|
contact_timeout,
|
|
32
36
|
lightLevel: lightLevel === 0 ? 'dark' : 'bright',
|
|
33
37
|
button_count,
|
|
34
|
-
doorState: hallState === 0
|
|
35
|
-
? 'close'
|
|
36
|
-
: hallState === 1
|
|
37
|
-
? 'open'
|
|
38
|
-
: 'timeout no closed',
|
|
38
|
+
doorState: hallState === 0 ? 'close' : hallState === 1 ? 'open' : 'timeout no closed',
|
|
39
39
|
};
|
|
40
40
|
return data;
|
|
41
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wocontact.js","sourceRoot":"","sources":["../../src/device/wocontact.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wocontact.js","sourceRoot":"","sources":["../../src/device/wocontact.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAE3G,MAAM,OAAO,SAAU,SAAQ,eAAe;IAC5C,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAC3B,WAAmB,EACnB,KAA8C;QAE9C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;gBACzC,KAAK,CAAC,gDAAgD,WAAW,CAAC,MAAM,SAAS,CAAC,CAAA;YACpF,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACtC,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACtC,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACtC,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAEtC,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,UAAU,CAAA;QAC3C,MAAM,MAAM,GAAG,KAAK,GAAG,UAAU,CAAA;QACjC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,CAAA,CAAC,wBAAwB;QAChE,MAAM,OAAO,GAAG,KAAK,GAAG,UAAU,CAAA,CAAC,IAAI;QACvC,MAAM,YAAY,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,UAAU,CAAA;QACxD,MAAM,eAAe,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,UAAU,CAAA;QAC3D,MAAM,UAAU,GAAG,KAAK,GAAG,UAAU,CAAA;QACrC,MAAM,YAAY,GAAG,KAAK,GAAG,UAAU,CAAA;QAEvC,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,iBAAiB,CAAC,aAAa;YACtC,SAAS,EAAE,qBAAqB,CAAC,aAAa;YAC9C,iBAAiB,EAAE,6BAA6B,CAAC,aAAa;YAC9D,QAAQ;YACR,MAAM;YACN,OAAO;YACP,YAAY;YACZ,eAAe;YACf,UAAU,EAAE,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;YAChD,YAAY;YACZ,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB;SACtF,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wocontact.test.d.ts","sourceRoot":"","sources":["../../src/device/wocontact.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
/* eslint-disable no-console */
|
|
3
|
+
import { WoContact } from './wocontact.js';
|
|
4
|
+
describe('woContact', () => {
|
|
5
|
+
it('parseServiceData should return null for incorrect buffer length', async () => {
|
|
6
|
+
const serviceData = Buffer.alloc(8); // Incorrect length
|
|
7
|
+
const result = await WoContact.parseServiceData(serviceData, console.log);
|
|
8
|
+
expect(result).toBeNull();
|
|
9
|
+
});
|
|
10
|
+
it('parseServiceData should return correct data for valid buffer', async () => {
|
|
11
|
+
const serviceData = Buffer.from([0, 0b11000000, 0b01111111, 0b00000111, 0, 0, 0, 0, 0b00001111]);
|
|
12
|
+
const result = await WoContact.parseServiceData(serviceData, console.log);
|
|
13
|
+
expect(result).toEqual({
|
|
14
|
+
model: 'ContactSensor',
|
|
15
|
+
modelName: 'ContactSensor',
|
|
16
|
+
modelFriendlyName: 'ContactSensor',
|
|
17
|
+
movement: true,
|
|
18
|
+
tested: 128,
|
|
19
|
+
battery: 127,
|
|
20
|
+
contact_open: true,
|
|
21
|
+
contact_timeout: true,
|
|
22
|
+
lightLevel: 'bright',
|
|
23
|
+
button_count: 15,
|
|
24
|
+
doorState: 'timeout no closed',
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
it('parseServiceData should log message for incorrect buffer length', async () => {
|
|
28
|
+
const serviceData = Buffer.alloc(8); // Incorrect length
|
|
29
|
+
const logSpy = jest.fn();
|
|
30
|
+
await WoContact.parseServiceData(serviceData, logSpy);
|
|
31
|
+
expect(logSpy).toHaveBeenCalledWith('[parseServiceDataForWoContact] Buffer length 8 !== 9!');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=wocontact.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wocontact.test.js","sourceRoot":"","sources":["../../src/device/wocontact.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,+BAA+B;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,CAAC,mBAAmB;QACvD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;QACzE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAA;QAChG,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;QACzE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,KAAK,EAAE,eAAe;YACtB,SAAS,EAAE,eAAe;YAC1B,iBAAiB,EAAE,eAAe;YAClC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,GAAG;YACZ,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,IAAI;YACrB,UAAU,EAAE,QAAQ;YACpB,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE,mBAAmB;SAC/B,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,CAAC,mBAAmB;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;QACxB,MAAM,SAAS,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,uDAAuD,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1,22 +1,11 @@
|
|
|
1
1
|
import { Buffer } from 'node:buffer';
|
|
2
2
|
import { SwitchbotDevice } from '../device.js';
|
|
3
|
-
import { SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
|
|
4
3
|
export declare class WoCurtain extends SwitchbotDevice {
|
|
5
|
-
static parseServiceData(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
modelFriendlyName: SwitchBotBLEModelFriendlyName;
|
|
9
|
-
calibration: boolean;
|
|
10
|
-
battery: number;
|
|
11
|
-
inMotion: boolean;
|
|
12
|
-
position: number;
|
|
13
|
-
lightLevel: number;
|
|
14
|
-
deviceChain: number;
|
|
15
|
-
} | null;
|
|
16
|
-
open(mode?: number): Promise<unknown>;
|
|
17
|
-
close(mode?: number): Promise<unknown>;
|
|
4
|
+
static parseServiceData(serviceData: Buffer, manufacturerData: Buffer, onlog: ((message: string) => void) | undefined, reverse?: boolean): Promise<object | null>;
|
|
5
|
+
open(mode?: number): Promise<void>;
|
|
6
|
+
close(mode?: number): Promise<void>;
|
|
18
7
|
pause(): Promise<void>;
|
|
19
|
-
runToPos(percent: number, mode?: number): Promise<
|
|
20
|
-
|
|
8
|
+
runToPos(percent: number, mode?: number): Promise<void>;
|
|
9
|
+
operateCurtain(bytes: number[]): Promise<void>;
|
|
21
10
|
}
|
|
22
11
|
//# sourceMappingURL=wocurtain.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wocurtain.d.ts","sourceRoot":"","sources":["../../src/device/wocurtain.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wocurtain.d.ts","sourceRoot":"","sources":["../../src/device/wocurtain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAMpC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C,qBAAa,SAAU,SAAQ,eAAe;WAC/B,gBAAgB,CAC3B,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,EAClD,OAAO,GAAE,OAAe,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiEnB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM;IAelB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM;IAenB,KAAK;IAgBL,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAO;IAkBrC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE;CAerC"}
|
package/dist/device/wocurtain.js
CHANGED
|
@@ -1,31 +1,48 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
1
2
|
/* Copyright(C) 2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
3
|
*
|
|
3
4
|
* wocurtain.ts: Switchbot BLE API registration.
|
|
4
5
|
*/
|
|
5
|
-
import { Buffer } from 'node:buffer';
|
|
6
6
|
import { SwitchbotDevice } from '../device.js';
|
|
7
|
-
import { SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
|
|
7
|
+
import { SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js';
|
|
8
8
|
export class WoCurtain extends SwitchbotDevice {
|
|
9
|
-
static parseServiceData(
|
|
10
|
-
if (
|
|
9
|
+
static async parseServiceData(serviceData, manufacturerData, onlog, reverse = false) {
|
|
10
|
+
if (serviceData.length !== 5 && serviceData.length !== 6) {
|
|
11
11
|
if (onlog && typeof onlog === 'function') {
|
|
12
|
-
onlog(`[parseServiceDataForWoCurtain] Buffer length ${
|
|
12
|
+
onlog(`[parseServiceDataForWoCurtain] Buffer length ${serviceData.length} !== 5 or 6!`);
|
|
13
13
|
}
|
|
14
14
|
return null;
|
|
15
15
|
}
|
|
16
|
-
const byte1 =
|
|
17
|
-
const byte2 =
|
|
18
|
-
const byte3 =
|
|
19
|
-
const byte4 =
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
16
|
+
const byte1 = serviceData.readUInt8(1);
|
|
17
|
+
const byte2 = serviceData.readUInt8(2);
|
|
18
|
+
// const byte3 = serviceData.readUInt8(3)
|
|
19
|
+
// const byte4 = serviceData.readUInt8(4)
|
|
20
|
+
let deviceData;
|
|
21
|
+
let batteryData = null;
|
|
22
|
+
if (manufacturerData && manufacturerData.length >= 13) { // Curtain 3
|
|
23
|
+
deviceData = manufacturerData.subarray(8, 11);
|
|
24
|
+
batteryData = manufacturerData.readUInt8(12);
|
|
25
|
+
}
|
|
26
|
+
else if (manufacturerData && manufacturerData.length >= 11) {
|
|
27
|
+
deviceData = manufacturerData.subarray(8, 11);
|
|
28
|
+
batteryData = serviceData ? byte2 : null;
|
|
29
|
+
}
|
|
30
|
+
else if (serviceData) {
|
|
31
|
+
deviceData = serviceData.subarray(3, 6);
|
|
32
|
+
batteryData = byte2;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
const model = serviceData.subarray(0, 1).toString('utf8');
|
|
27
38
|
const modelName = model === 'c' ? SwitchBotBLEModelName.Curtain : SwitchBotBLEModelName.Curtain3;
|
|
28
39
|
const modelFriendlyName = model === 'c' ? SwitchBotBLEModelFriendlyName.Curtain : SwitchBotBLEModelFriendlyName.Curtain3;
|
|
40
|
+
const calibration = serviceData ? Boolean(byte1 & 0b01000000) : null; // Whether the calibration is compconsted /*OLD*/ const calibration = !!(byte1 & 0b01000000)
|
|
41
|
+
const position = Math.max(Math.min(deviceData.readUInt8(0) & 0b01111111, 100), 0); // current positon % /*OLD*/ const currPosition = byte3 & 0b01111111 // current positon %
|
|
42
|
+
const inMotion = Boolean(deviceData.readUInt8(0) & 0b10000000); //* OLD*/ const inMotion = !!(byte3 & 0b10000000)
|
|
43
|
+
const lightLevel = (deviceData.readUInt8(1) >> 4) & 0b00001111; // light sensor level (1-10) /*OLD*/ const lightLevel = (byte4 >> 4) & 0b00001111
|
|
44
|
+
const deviceChain = deviceData.readUInt8(1) & 0b00000111; //* OLD*/ const deviceChain = byte4 & 0b00000111
|
|
45
|
+
const battery = batteryData !== null ? batteryData & 0b01111111 : null; //* OLD*/ const battery = byte2 & 0b01111111 // %
|
|
29
46
|
const data = {
|
|
30
47
|
model,
|
|
31
48
|
modelName,
|
|
@@ -33,7 +50,7 @@ export class WoCurtain extends SwitchbotDevice {
|
|
|
33
50
|
calibration,
|
|
34
51
|
battery,
|
|
35
52
|
inMotion,
|
|
36
|
-
position: currPosition,
|
|
53
|
+
position: reverse ? 100 - position : position, //* OLD*/ currPosition,
|
|
37
54
|
lightLevel,
|
|
38
55
|
deviceChain,
|
|
39
56
|
};
|
|
@@ -50,8 +67,8 @@ export class WoCurtain extends SwitchbotDevice {
|
|
|
50
67
|
* - Promise object
|
|
51
68
|
* Nothing will be passed to the `resolve()`.
|
|
52
69
|
* ---------------------------------------------------------------- */
|
|
53
|
-
open(mode) {
|
|
54
|
-
return this.runToPos(0, mode);
|
|
70
|
+
async open(mode) {
|
|
71
|
+
return await this.runToPos(0, mode);
|
|
55
72
|
}
|
|
56
73
|
/* ------------------------------------------------------------------
|
|
57
74
|
* close()
|
|
@@ -64,8 +81,8 @@ export class WoCurtain extends SwitchbotDevice {
|
|
|
64
81
|
* - Promise object
|
|
65
82
|
* Nothing will be passed to the `resolve()`.
|
|
66
83
|
* ---------------------------------------------------------------- */
|
|
67
|
-
close(mode) {
|
|
68
|
-
return this.runToPos(100, mode);
|
|
84
|
+
async close(mode) {
|
|
85
|
+
return await this.runToPos(100, mode);
|
|
69
86
|
}
|
|
70
87
|
/* ------------------------------------------------------------------
|
|
71
88
|
* pause()
|
|
@@ -78,8 +95,8 @@ export class WoCurtain extends SwitchbotDevice {
|
|
|
78
95
|
* - Promise object
|
|
79
96
|
* Nothing will be passed to the `resolve()`.
|
|
80
97
|
* ---------------------------------------------------------------- */
|
|
81
|
-
pause() {
|
|
82
|
-
return this.
|
|
98
|
+
async pause() {
|
|
99
|
+
return await this.operateCurtain([0x57, 0x0F, 0x45, 0x01, 0x00, 0xFF]);
|
|
83
100
|
}
|
|
84
101
|
/* ------------------------------------------------------------------
|
|
85
102
|
* runToPos()
|
|
@@ -93,16 +110,12 @@ export class WoCurtain extends SwitchbotDevice {
|
|
|
93
110
|
* - Promise object
|
|
94
111
|
* Nothing will be passed to the `resolve()`.
|
|
95
112
|
* ---------------------------------------------------------------- */
|
|
96
|
-
runToPos(percent, mode = 0xFF) {
|
|
113
|
+
async runToPos(percent, mode = 0xFF) {
|
|
97
114
|
if (typeof percent !== 'number') {
|
|
98
|
-
|
|
99
|
-
reject(new Error(`The type of target position percentage is incorrect: ${typeof percent}`));
|
|
100
|
-
});
|
|
115
|
+
throw new TypeError(`The type of target position percentage is incorrect: ${typeof percent}`);
|
|
101
116
|
}
|
|
102
117
|
if (typeof mode !== 'number') {
|
|
103
|
-
|
|
104
|
-
reject(new Error(`The type of running mode is incorrect: ${typeof mode}`));
|
|
105
|
-
});
|
|
118
|
+
throw new TypeError(`The type of running mode is incorrect: ${typeof mode}`);
|
|
106
119
|
}
|
|
107
120
|
if (mode > 1) {
|
|
108
121
|
mode = 0xFF;
|
|
@@ -113,24 +126,22 @@ export class WoCurtain extends SwitchbotDevice {
|
|
|
113
126
|
else if (percent < 0) {
|
|
114
127
|
percent = 0;
|
|
115
128
|
}
|
|
116
|
-
return this.
|
|
129
|
+
return await this.operateCurtain([0x57, 0x0F, 0x45, 0x01, 0x05, mode, percent]);
|
|
117
130
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
reject(error);
|
|
133
|
-
});
|
|
131
|
+
async operateCurtain(bytes) {
|
|
132
|
+
const req_buf = Buffer.from(bytes);
|
|
133
|
+
await this.command(req_buf)
|
|
134
|
+
.then((res_buf) => {
|
|
135
|
+
const code = res_buf.readUInt8(0);
|
|
136
|
+
if (res_buf.length === 3 && code === 0x01) {
|
|
137
|
+
// Intentionally left empty
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
throw new Error(`The device returned an error: 0x${res_buf.toString('hex')}`);
|
|
141
|
+
}
|
|
142
|
+
})
|
|
143
|
+
.catch((error) => {
|
|
144
|
+
throw error;
|
|
134
145
|
});
|
|
135
146
|
}
|
|
136
147
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wocurtain.js","sourceRoot":"","sources":["../../src/device/wocurtain.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wocurtain.js","sourceRoot":"","sources":["../../src/device/wocurtain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wocurtain.test.d.ts","sourceRoot":"","sources":["../../src/device/wocurtain.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import * as Noble from '@stoprocent/noble';
|
|
3
|
+
import { WoCurtain } from './wocurtain.js';
|
|
4
|
+
describe('woCurtain', () => {
|
|
5
|
+
let curtain;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
const peripheral = {}; // Replace with the actual peripheral object (e.g. from Noble)
|
|
8
|
+
curtain = new WoCurtain(peripheral, Noble);
|
|
9
|
+
curtain.command = jest.fn().mockResolvedValue(Buffer.from([0x01, 0x00, 0x00]));
|
|
10
|
+
});
|
|
11
|
+
it('runToPos should throw error for incorrect percent type', async () => {
|
|
12
|
+
await expect(curtain.runToPos('50')).rejects.toThrow('The type of target position percentage is incorrect: string');
|
|
13
|
+
});
|
|
14
|
+
it('runToPos should throw error for incorrect mode type', async () => {
|
|
15
|
+
await expect(curtain.runToPos(50, '0xff')).rejects.toThrow('The type of running mode is incorrect: string');
|
|
16
|
+
});
|
|
17
|
+
it('runToPos should set percent to 100 if greater than 100', async () => {
|
|
18
|
+
await curtain.runToPos(150);
|
|
19
|
+
expect(curtain.command).toHaveBeenCalledWith(Buffer.from([0x57, 0x0F, 0x45, 0x01, 0x05, 0xFF, 100]));
|
|
20
|
+
});
|
|
21
|
+
it('runToPos should set percent to 0 if less than 0', async () => {
|
|
22
|
+
await curtain.runToPos(-10);
|
|
23
|
+
expect(curtain.command).toHaveBeenCalledWith(Buffer.from([0x57, 0x0F, 0x45, 0x01, 0x05, 0xFF, 0]));
|
|
24
|
+
});
|
|
25
|
+
it('operateCurtain should throw error for incorrect response', async () => {
|
|
26
|
+
curtain.command = jest.fn().mockResolvedValue(Buffer.from([0x02, 0x00, 0x00]));
|
|
27
|
+
await expect(curtain.operateCurtain([0x57, 0x0F, 0x45, 0x01, 0x05, 0xFF, 50])).rejects.toThrow('The device returned an error: 0x020000');
|
|
28
|
+
});
|
|
29
|
+
it('operateCurtain should not throw error for correct response', async () => {
|
|
30
|
+
await expect(curtain.operateCurtain([0x57, 0x0F, 0x45, 0x01, 0x05, 0xFF, 50])).resolves.not.toThrow();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=wocurtain.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wocurtain.test.js","sourceRoot":"","sources":["../../src/device/wocurtain.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAA;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,OAAkB,CAAA;IAEtB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,UAAU,GAAG,EAAE,CAAA,CAAC,8DAA8D;QACpF,OAAO,GAAG,IAAI,SAAS,CAAC,UAA8B,EAAE,KAAK,CAAC,CAAA;QAC9D,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IAChF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAA;IAC5H,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAa,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAA;IACpH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC3B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IACtG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAA;QAC3B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACpG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;QAC9E,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAA;IAC1I,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IACvG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/dist/device/wohand.d.ts
CHANGED
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
import { Buffer } from 'node:buffer';
|
|
2
2
|
import { SwitchbotDevice } from '../device.js';
|
|
3
|
-
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
|
|
4
3
|
export declare class WoHand extends SwitchbotDevice {
|
|
5
|
-
static parseServiceData(
|
|
6
|
-
model: SwitchBotBLEModel;
|
|
7
|
-
modelName: SwitchBotBLEModelName;
|
|
8
|
-
modelFriendlyName: SwitchBotBLEModelFriendlyName;
|
|
9
|
-
mode: boolean;
|
|
10
|
-
state: boolean;
|
|
11
|
-
battery: number;
|
|
12
|
-
} | null;
|
|
4
|
+
static parseServiceData(serviceData: Buffer, onlog: ((message: string) => void) | undefined): Promise<object | null>;
|
|
13
5
|
press(): Promise<void>;
|
|
14
6
|
turnOn(): Promise<void>;
|
|
15
7
|
turnOff(): Promise<void>;
|
|
16
8
|
down(): Promise<void>;
|
|
17
9
|
up(): Promise<void>;
|
|
18
|
-
|
|
10
|
+
operateBot(bytes: number[]): Promise<void>;
|
|
19
11
|
}
|
|
20
12
|
//# sourceMappingURL=wohand.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wohand.d.ts","sourceRoot":"","sources":["../../src/device/wohand.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wohand.d.ts","sourceRoot":"","sources":["../../src/device/wohand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAMpC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C,qBAAa,MAAO,SAAQ,eAAe;WAC5B,gBAAgB,CAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GAC7C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoCnB,KAAK;IAeL,MAAM;IAeN,OAAO;IAeP,IAAI;IAeJ,EAAE;IAIF,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE;CAejC"}
|
package/dist/device/wohand.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
1
2
|
/* Copyright(C) 2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
3
|
*
|
|
3
4
|
* wohand.ts: Switchbot BLE API registration.
|
|
4
5
|
*/
|
|
5
|
-
import { Buffer } from 'node:buffer';
|
|
6
6
|
import { SwitchbotDevice } from '../device.js';
|
|
7
|
-
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types.js';
|
|
7
|
+
import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js';
|
|
8
8
|
export class WoHand extends SwitchbotDevice {
|
|
9
|
-
static parseServiceData(
|
|
10
|
-
if (
|
|
9
|
+
static async parseServiceData(serviceData, onlog) {
|
|
10
|
+
if (serviceData.length !== 3) {
|
|
11
11
|
if (onlog && typeof onlog === 'function') {
|
|
12
|
-
onlog(`[parseServiceData] Buffer length ${
|
|
12
|
+
onlog(`[parseServiceData] Buffer length ${serviceData.length} !== 3!`);
|
|
13
13
|
}
|
|
14
14
|
return null;
|
|
15
15
|
}
|
|
16
|
-
const byte1 =
|
|
17
|
-
const byte2 =
|
|
16
|
+
const byte1 = serviceData.readUInt8(1);
|
|
17
|
+
const byte2 = serviceData.readUInt8(2);
|
|
18
18
|
const mode = !!(byte1 & 0b10000000); // Whether the light switch Add-on is used or not. 0 = press, 1 = switch
|
|
19
19
|
const state = !(byte1 & 0b01000000); // Whether the switch status is ON or OFF. 0 = on, 1 = off
|
|
20
20
|
const battery = byte2 & 0b01111111; // %
|
|
@@ -39,8 +39,8 @@ export class WoHand extends SwitchbotDevice {
|
|
|
39
39
|
* - Promise object
|
|
40
40
|
* Nothing will be passed to the `resolve()`.
|
|
41
41
|
* ---------------------------------------------------------------- */
|
|
42
|
-
press() {
|
|
43
|
-
return this.
|
|
42
|
+
async press() {
|
|
43
|
+
return await this.operateBot([0x57, 0x01, 0x00]);
|
|
44
44
|
}
|
|
45
45
|
/* ------------------------------------------------------------------
|
|
46
46
|
* turnOn()
|
|
@@ -53,8 +53,8 @@ export class WoHand extends SwitchbotDevice {
|
|
|
53
53
|
* - Promise object
|
|
54
54
|
* Nothing will be passed to the `resolve()`.
|
|
55
55
|
* ---------------------------------------------------------------- */
|
|
56
|
-
turnOn() {
|
|
57
|
-
return this.
|
|
56
|
+
async turnOn() {
|
|
57
|
+
return await this.operateBot([0x57, 0x01, 0x01]);
|
|
58
58
|
}
|
|
59
59
|
/* ------------------------------------------------------------------
|
|
60
60
|
* turnOff()
|
|
@@ -67,8 +67,8 @@ export class WoHand extends SwitchbotDevice {
|
|
|
67
67
|
* - Promise object
|
|
68
68
|
* Nothing will be passed to the `resolve()`.
|
|
69
69
|
* ---------------------------------------------------------------- */
|
|
70
|
-
turnOff() {
|
|
71
|
-
return this.
|
|
70
|
+
async turnOff() {
|
|
71
|
+
return await this.operateBot([0x57, 0x01, 0x02]);
|
|
72
72
|
}
|
|
73
73
|
/* ------------------------------------------------------------------
|
|
74
74
|
* down()
|
|
@@ -81,8 +81,8 @@ export class WoHand extends SwitchbotDevice {
|
|
|
81
81
|
* - Promise object
|
|
82
82
|
* Nothing will be passed to the `resolve()`.
|
|
83
83
|
* ---------------------------------------------------------------- */
|
|
84
|
-
down() {
|
|
85
|
-
return this.
|
|
84
|
+
async down() {
|
|
85
|
+
return await this.operateBot([0x57, 0x01, 0x03]);
|
|
86
86
|
}
|
|
87
87
|
/* ------------------------------------------------------------------
|
|
88
88
|
* up()
|
|
@@ -95,25 +95,23 @@ export class WoHand extends SwitchbotDevice {
|
|
|
95
95
|
* - Promise object
|
|
96
96
|
* Nothing will be passed to the `resolve()`.
|
|
97
97
|
* ---------------------------------------------------------------- */
|
|
98
|
-
up() {
|
|
99
|
-
return this.
|
|
98
|
+
async up() {
|
|
99
|
+
return await this.operateBot([0x57, 0x01, 0x04]);
|
|
100
100
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
reject(error);
|
|
116
|
-
});
|
|
101
|
+
async operateBot(bytes) {
|
|
102
|
+
const req_buf = Buffer.from(bytes);
|
|
103
|
+
await this.command(req_buf)
|
|
104
|
+
.then((res_buf) => {
|
|
105
|
+
const code = res_buf.readUInt8(0);
|
|
106
|
+
if (res_buf.length === 3 && (code === 0x01 || code === 0x05)) {
|
|
107
|
+
// Successful operation, no further action needed
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
throw new Error(`The device returned an error: 0x${res_buf.toString('hex')}`);
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
.catch((error) => {
|
|
114
|
+
throw error;
|
|
117
115
|
});
|
|
118
116
|
}
|
|
119
117
|
}
|