node-switchbot 2.4.0 → 2.5.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/.github/npm-version-script.cjs +81 -0
  2. package/CHANGELOG.md +1 -1
  3. package/dist/advertising.d.ts +14 -148
  4. package/dist/advertising.d.ts.map +1 -1
  5. package/dist/advertising.js +36 -92
  6. package/dist/advertising.js.map +1 -1
  7. package/dist/device/woblindtilt.d.ts +98 -13
  8. package/dist/device/woblindtilt.d.ts.map +1 -1
  9. package/dist/device/woblindtilt.js +192 -86
  10. package/dist/device/woblindtilt.js.map +1 -1
  11. package/dist/device/woblindtilt.test.d.ts +2 -0
  12. package/dist/device/woblindtilt.test.d.ts.map +1 -0
  13. package/dist/device/woblindtilt.test.js +26 -0
  14. package/dist/device/woblindtilt.test.js.map +1 -0
  15. package/dist/device/wobulb.d.ts +17 -34
  16. package/dist/device/wobulb.d.ts.map +1 -1
  17. package/dist/device/wobulb.js +53 -61
  18. package/dist/device/wobulb.js.map +1 -1
  19. package/dist/device/wobulb.test.d.ts +2 -0
  20. package/dist/device/wobulb.test.d.ts.map +1 -0
  21. package/dist/device/wobulb.test.js +52 -0
  22. package/dist/device/wobulb.test.js.map +1 -0
  23. package/dist/device/woceilinglight.d.ts +21 -51
  24. package/dist/device/woceilinglight.d.ts.map +1 -1
  25. package/dist/device/woceilinglight.js +53 -64
  26. package/dist/device/woceilinglight.js.map +1 -1
  27. package/dist/device/woceilinglight.test.d.ts +2 -0
  28. package/dist/device/woceilinglight.test.d.ts.map +1 -0
  29. package/dist/device/woceilinglight.test.js +63 -0
  30. package/dist/device/woceilinglight.test.js.map +1 -0
  31. package/dist/device/wocontact.d.ts +1 -14
  32. package/dist/device/wocontact.d.ts.map +1 -1
  33. package/dist/device/wocontact.js +13 -13
  34. package/dist/device/wocontact.js.map +1 -1
  35. package/dist/device/wocontact.test.d.ts +2 -0
  36. package/dist/device/wocontact.test.d.ts.map +1 -0
  37. package/dist/device/wocontact.test.js +34 -0
  38. package/dist/device/wocontact.test.js.map +1 -0
  39. package/dist/device/wocurtain.d.ts +5 -16
  40. package/dist/device/wocurtain.d.ts.map +1 -1
  41. package/dist/device/wocurtain.js +58 -47
  42. package/dist/device/wocurtain.js.map +1 -1
  43. package/dist/device/wocurtain.test.d.ts +2 -0
  44. package/dist/device/wocurtain.test.d.ts.map +1 -0
  45. package/dist/device/wocurtain.test.js +33 -0
  46. package/dist/device/wocurtain.test.js.map +1 -0
  47. package/dist/device/wohand.d.ts +2 -10
  48. package/dist/device/wohand.d.ts.map +1 -1
  49. package/dist/device/wohand.js +31 -33
  50. package/dist/device/wohand.js.map +1 -1
  51. package/dist/device/wohand.test.d.ts +2 -0
  52. package/dist/device/wohand.test.d.ts.map +1 -0
  53. package/dist/device/wohand.test.js +62 -0
  54. package/dist/device/wohand.test.js.map +1 -0
  55. package/dist/device/wohand2.test.d.ts +2 -0
  56. package/dist/device/wohand2.test.d.ts.map +1 -0
  57. package/dist/device/wohand2.test.js +50 -0
  58. package/dist/device/wohand2.test.js.map +1 -0
  59. package/dist/device/wohub2.d.ts +1 -19
  60. package/dist/device/wohub2.d.ts.map +1 -1
  61. package/dist/device/wohub2.js +6 -2
  62. package/dist/device/wohub2.js.map +1 -1
  63. package/dist/device/wohumi.d.ts +2 -11
  64. package/dist/device/wohumi.d.ts.map +1 -1
  65. package/dist/device/wohumi.js +31 -33
  66. package/dist/device/wohumi.js.map +1 -1
  67. package/dist/device/wohumi.test.d.ts +2 -0
  68. package/dist/device/wohumi.test.d.ts.map +1 -0
  69. package/dist/device/wohumi.test.js +61 -0
  70. package/dist/device/wohumi.test.js.map +1 -0
  71. package/dist/device/woiosensorth.d.ts +1 -19
  72. package/dist/device/woiosensorth.d.ts.map +1 -1
  73. package/dist/device/woiosensorth.js +14 -10
  74. package/dist/device/woiosensorth.js.map +1 -1
  75. package/dist/device/woiosensorth.test.d.ts +2 -0
  76. package/dist/device/woiosensorth.test.d.ts.map +1 -0
  77. package/dist/device/woiosensorth.test.js +39 -0
  78. package/dist/device/woiosensorth.test.js.map +1 -0
  79. package/dist/device/woplugmini.d.ts +12 -38
  80. package/dist/device/woplugmini.d.ts.map +1 -1
  81. package/dist/device/woplugmini.js +35 -40
  82. package/dist/device/woplugmini.js.map +1 -1
  83. package/dist/device/woplugmini.test.d.ts +2 -0
  84. package/dist/device/woplugmini.test.d.ts.map +1 -0
  85. package/dist/device/woplugmini.test.js +91 -0
  86. package/dist/device/woplugmini.test.js.map +1 -0
  87. package/dist/device/wopresence.d.ts +2 -14
  88. package/dist/device/wopresence.d.ts.map +1 -1
  89. package/dist/device/wopresence.js +11 -7
  90. package/dist/device/wopresence.js.map +1 -1
  91. package/dist/device/wopresence.test.d.ts +2 -0
  92. package/dist/device/wopresence.test.d.ts.map +1 -0
  93. package/dist/device/wopresence.test.js +42 -0
  94. package/dist/device/wopresence.test.js.map +1 -0
  95. package/dist/device/wosensorth.d.ts +3 -37
  96. package/dist/device/wosensorth.d.ts.map +1 -1
  97. package/dist/device/wosensorth.js +24 -20
  98. package/dist/device/wosensorth.js.map +1 -1
  99. package/dist/device/wosensorth.test.d.ts +2 -0
  100. package/dist/device/wosensorth.test.d.ts.map +1 -0
  101. package/dist/device/wosensorth.test.js +59 -0
  102. package/dist/device/wosensorth.test.js.map +1 -0
  103. package/dist/device/wosmartlock.d.ts +19 -33
  104. package/dist/device/wosmartlock.d.ts.map +1 -1
  105. package/dist/device/wosmartlock.js +104 -83
  106. package/dist/device/wosmartlock.js.map +1 -1
  107. package/dist/device/wosmartlock.test.d.ts +2 -0
  108. package/dist/device/wosmartlock.test.d.ts.map +1 -0
  109. package/dist/device/wosmartlock.test.js +84 -0
  110. package/dist/device/wosmartlock.test.js.map +1 -0
  111. package/dist/device/wosmartlockpro.d.ts +13 -27
  112. package/dist/device/wosmartlockpro.d.ts.map +1 -1
  113. package/dist/device/wosmartlockpro.js +90 -70
  114. package/dist/device/wosmartlockpro.js.map +1 -1
  115. package/dist/device/wosmartlockpro.test.d.ts +2 -0
  116. package/dist/device/wosmartlockpro.test.d.ts.map +1 -0
  117. package/dist/device/wosmartlockpro.test.js +124 -0
  118. package/dist/device/wosmartlockpro.test.js.map +1 -0
  119. package/dist/device/wostrip.d.ts +18 -32
  120. package/dist/device/wostrip.d.ts.map +1 -1
  121. package/dist/device/wostrip.js +58 -70
  122. package/dist/device/wostrip.js.map +1 -1
  123. package/dist/device/wostrip.test.d.ts +2 -0
  124. package/dist/device/wostrip.test.d.ts.map +1 -0
  125. package/dist/device/wostrip.test.js +115 -0
  126. package/dist/device/wostrip.test.js.map +1 -0
  127. package/dist/device.d.ts +237 -39
  128. package/dist/device.d.ts.map +1 -1
  129. package/dist/device.js +478 -366
  130. package/dist/device.js.map +1 -1
  131. package/dist/index.d.ts +1 -1
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +1 -1
  134. package/dist/index.js.map +1 -1
  135. package/dist/parameter-checker.d.ts.map +1 -1
  136. package/dist/parameter-checker.js.map +1 -1
  137. package/dist/settings.d.ts +8 -0
  138. package/dist/settings.d.ts.map +1 -0
  139. package/dist/settings.js +12 -0
  140. package/dist/settings.js.map +1 -0
  141. package/dist/switchbot.d.ts +30 -9
  142. package/dist/switchbot.d.ts.map +1 -1
  143. package/dist/switchbot.js +48 -78
  144. package/dist/switchbot.js.map +1 -1
  145. package/dist/types/bledevicestatus.d.ts +288 -0
  146. package/dist/types/bledevicestatus.d.ts.map +1 -0
  147. package/dist/types/bledevicestatus.js +2 -0
  148. package/dist/types/bledevicestatus.js.map +1 -0
  149. package/dist/types/devicelist.d.ts +89 -0
  150. package/dist/types/devicelist.d.ts.map +1 -0
  151. package/dist/types/devicelist.js +6 -0
  152. package/dist/types/devicelist.js.map +1 -0
  153. package/dist/types/deviceresponse.d.ts +13 -0
  154. package/dist/types/deviceresponse.d.ts.map +1 -0
  155. package/dist/types/deviceresponse.js +2 -0
  156. package/dist/types/deviceresponse.js.map +1 -0
  157. package/dist/types/devicestatus.d.ts +149 -0
  158. package/dist/types/devicestatus.d.ts.map +1 -0
  159. package/dist/types/devicestatus.js +3 -0
  160. package/dist/types/devicestatus.js.map +1 -0
  161. package/dist/types/devicewebhookstatus.d.ts +156 -0
  162. package/dist/types/devicewebhookstatus.d.ts.map +1 -0
  163. package/dist/types/devicewebhookstatus.js +2 -0
  164. package/dist/types/devicewebhookstatus.js.map +1 -0
  165. package/dist/types/irdevicelist.d.ts +10 -0
  166. package/dist/types/irdevicelist.d.ts.map +1 -0
  167. package/dist/types/irdevicelist.js +2 -0
  168. package/dist/types/irdevicelist.js.map +1 -0
  169. package/dist/types/pushbody.d.ts +6 -0
  170. package/dist/types/pushbody.d.ts.map +1 -0
  171. package/dist/types/pushbody.js +2 -0
  172. package/dist/types/pushbody.js.map +1 -0
  173. package/dist/{types.d.ts → types/types.d.ts} +9 -0
  174. package/dist/types/types.d.ts.map +1 -0
  175. package/dist/types/types.js.map +1 -0
  176. package/jest.config.js +3 -0
  177. package/package.json +22 -14
  178. package/dist/types.d.ts.map +0 -1
  179. package/dist/types.js.map +0 -1
  180. /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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAA;AAE1C,+BAA+B;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,YAA4B,CAAA;IAEhC,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,UAAU,GAAG,EAAE,CAAA,CAAC,8DAA8D;QACpF,YAAY,GAAG,IAAI,cAAc,CAAC,UAA8B,EAAE,KAAK,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACzC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;QACnF,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAChF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;QACnF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,KAAK,EAAE,cAAc;YACrB,SAAS,EAAE,cAAc;YACzB,iBAAiB,EAAE,cAAc;YACjC,iBAAiB,EAAE,CAAC;YACpB,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,KAAK;YACZ,GAAG,EAAE,CAAC;YACN,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,CAAC;YACT,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,EAAE;SACf,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QACrF,MAAM,YAAY,CAAC,MAAM,EAAE,CAAA;QAC3B,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QACrF,MAAM,YAAY,CAAC,OAAO,EAAE,CAAA;QAC5B,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QACrF,MAAM,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;QACpC,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QACrF,MAAM,YAAY,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA;QAC1C,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QACrF,MAAM,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAC5C,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -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(buf: Buffer, onlog: ((message: string) => void) | undefined): {
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":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAErG,qBAAa,SAAU,SAAQ,eAAe;IAC5C,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;;;;;;;;;;;;;CA6CpF"}
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"}
@@ -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(buf, onlog) {
5
- if (buf.length !== 9) {
8
+ static async parseServiceData(serviceData, onlog) {
9
+ if (serviceData.length !== 9) {
6
10
  if (onlog && typeof onlog === 'function') {
7
- onlog(`[parseServiceDataForWoContact] Buffer length ${buf.length} !== 9!`);
11
+ onlog(`[parseServiceDataForWoContact] Buffer length ${serviceData.length} !== 9!`);
8
12
  }
9
13
  return null;
10
14
  }
11
- const byte1 = buf.readUInt8(1);
12
- const byte2 = buf.readUInt8(2);
13
- const byte3 = buf.readUInt8(3);
14
- const byte8 = buf.readUInt8(8);
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":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAErG,MAAM,OAAO,SAAU,SAAQ,eAAe;IAC5C,MAAM,CAAC,gBAAgB,CAAC,GAAW,EAAE,KAA8C;QACjF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;gBACzC,KAAK,CACH,gDAAgD,GAAG,CAAC,MAAM,SAAS,CACpE,CAAA;YACH,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAE9B,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,EACP,SAAS,KAAK,CAAC;gBACb,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,SAAS,KAAK,CAAC;oBACf,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,mBAAmB;SAC5B,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wocontact.test.d.ts.map
@@ -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(buf: Buffer, onlog: ((message: string) => void) | undefined): {
6
- model: string;
7
- modelName: SwitchBotBLEModelName;
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<unknown>;
20
- _operateCurtain(bytes: number[]): Promise<void>;
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":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAElF,qBAAa,SAAU,SAAQ,eAAe;IAC5C,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;;;;;;;;;;;IAkDnF,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM;IAelB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM;IAenB,KAAK;IAgBL,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAO;IA4BrC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE;CAqBhC"}
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"}
@@ -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(buf, onlog) {
10
- if (buf.length !== 5 && buf.length !== 6) {
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 ${buf.length} !== 5 or 6!`);
12
+ onlog(`[parseServiceDataForWoCurtain] Buffer length ${serviceData.length} !== 5 or 6!`);
13
13
  }
14
14
  return null;
15
15
  }
16
- const byte1 = buf.readUInt8(1);
17
- const byte2 = buf.readUInt8(2);
18
- const byte3 = buf.readUInt8(3);
19
- const byte4 = buf.readUInt8(4);
20
- const calibration = !!(byte1 & 0b01000000); // Whether the calibration is compconsted
21
- const battery = byte2 & 0b01111111; // %
22
- const inMotion = !!(byte3 & 0b10000000);
23
- const currPosition = byte3 & 0b01111111; // current positon %
24
- const lightLevel = (byte4 >> 4) & 0b00001111; // light sensor level (1-10)
25
- const deviceChain = byte4 & 0b00000111;
26
- const model = buf.subarray(0, 1).toString('utf8');
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._operateCurtain([0x57, 0x0F, 0x45, 0x01, 0x00, 0xFF]);
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
- return new Promise((resolve, reject) => {
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
- return new Promise((resolve, reject) => {
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._operateCurtain([0x57, 0x0F, 0x45, 0x01, 0x05, mode, percent]);
129
+ return await this.operateCurtain([0x57, 0x0F, 0x45, 0x01, 0x05, mode, percent]);
117
130
  }
118
- _operateCurtain(bytes) {
119
- return new Promise((resolve, reject) => {
120
- const req_buf = Buffer.from(bytes);
121
- this._command(req_buf)
122
- .then((res_buf) => {
123
- const code = res_buf.readUInt8(0);
124
- if (res_buf.length === 3 && code === 0x01) {
125
- resolve();
126
- }
127
- else {
128
- reject(new Error(`The device returned an error: 0x${res_buf.toString('hex')}`));
129
- }
130
- })
131
- .catch((error) => {
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":"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"}
1
+ {"version":3,"file":"wocurtain.js","sourceRoot":"","sources":["../../src/device/wocurtain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wocurtain.test.d.ts.map
@@ -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"}
@@ -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(buf: Buffer, onlog: ((message: string) => void) | undefined): {
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
- _operateBot(bytes: number[]): Promise<void>;
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":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAErG,qBAAa,MAAO,SAAQ,eAAe;IACzC,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;;;;;;;;IAsCnF,KAAK;IAeL,MAAM;IAeN,OAAO;IAeP,IAAI;IAeJ,EAAE;IAIF,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE;CAqB5B"}
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"}
@@ -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(buf, onlog) {
10
- if (buf.length !== 3) {
9
+ static async parseServiceData(serviceData, onlog) {
10
+ if (serviceData.length !== 3) {
11
11
  if (onlog && typeof onlog === 'function') {
12
- onlog(`[parseServiceData] Buffer length ${buf.length} !== 3!`);
12
+ onlog(`[parseServiceData] Buffer length ${serviceData.length} !== 3!`);
13
13
  }
14
14
  return null;
15
15
  }
16
- const byte1 = buf.readUInt8(1);
17
- const byte2 = buf.readUInt8(2);
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._operateBot([0x57, 0x01, 0x00]);
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._operateBot([0x57, 0x01, 0x01]);
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._operateBot([0x57, 0x01, 0x02]);
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._operateBot([0x57, 0x01, 0x03]);
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._operateBot([0x57, 0x01, 0x04]);
98
+ async up() {
99
+ return await this.operateBot([0x57, 0x01, 0x04]);
100
100
  }
101
- _operateBot(bytes) {
102
- return new Promise((resolve, reject) => {
103
- const req_buf = Buffer.from(bytes);
104
- this._command(req_buf)
105
- .then((res_buf) => {
106
- const code = res_buf.readUInt8(0);
107
- if (res_buf.length === 3 && (code === 0x01 || code === 0x05)) {
108
- resolve();
109
- }
110
- else {
111
- reject(new Error(`The device returned an error: 0x${res_buf.toString('hex')}`));
112
- }
113
- })
114
- .catch((error) => {
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
  }