node-switchbot 4.0.0-beta.2 → 4.0.0-beta.3

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 (140) hide show
  1. package/BLE.md +63 -0
  2. package/CHANGELOG.md +34 -0
  3. package/README.md +6 -0
  4. package/dist/devices/wo-hand.d.ts +35 -0
  5. package/dist/devices/wo-hand.d.ts.map +1 -1
  6. package/dist/devices/wo-hand.js +87 -0
  7. package/dist/devices/wo-hand.js.map +1 -1
  8. package/dist/utils/bot-ble.d.ts +36 -0
  9. package/dist/utils/bot-ble.d.ts.map +1 -0
  10. package/dist/utils/bot-ble.js +107 -0
  11. package/dist/utils/bot-ble.js.map +1 -0
  12. package/dist/utils/index.d.ts +1 -0
  13. package/dist/utils/index.d.ts.map +1 -1
  14. package/dist/utils/index.js +2 -0
  15. package/dist/utils/index.js.map +1 -1
  16. package/docs/assets/hierarchy.js +1 -1
  17. package/docs/assets/search.js +1 -1
  18. package/docs/classes/APIError.html +2 -2
  19. package/docs/classes/APINotAvailableError.html +2 -2
  20. package/docs/classes/BLEConnection.html +9 -9
  21. package/docs/classes/BLENotAvailableError.html +2 -2
  22. package/docs/classes/BLEScanner.html +8 -8
  23. package/docs/classes/CommandFailedError.html +2 -2
  24. package/docs/classes/ConnectionTimeoutError.html +2 -2
  25. package/docs/classes/DeviceManager.html +13 -13
  26. package/docs/classes/DeviceNotFoundError.html +2 -2
  27. package/docs/classes/DiscoveryError.html +2 -2
  28. package/docs/classes/OpenAPIClient.html +24 -24
  29. package/docs/classes/SwitchBot.html +11 -11
  30. package/docs/classes/SwitchBotDevice.html +23 -23
  31. package/docs/classes/SwitchBotError.html +2 -2
  32. package/docs/classes/ValidationError.html +2 -2
  33. package/docs/classes/WoAirPurifier.html +27 -27
  34. package/docs/classes/WoAirPurifierTable.html +27 -27
  35. package/docs/classes/WoBlindTilt.html +29 -29
  36. package/docs/classes/WoBulb.html +28 -28
  37. package/docs/classes/WoCeilingLight.html +28 -28
  38. package/docs/classes/WoContact.html +23 -23
  39. package/docs/classes/WoCurtain.html +27 -27
  40. package/docs/classes/WoHand.html +36 -28
  41. package/docs/classes/WoHub2.html +23 -23
  42. package/docs/classes/WoHub3.html +23 -23
  43. package/docs/classes/WoHumi.html +27 -27
  44. package/docs/classes/WoHumi2.html +27 -27
  45. package/docs/classes/WoIOSensorTH.html +23 -23
  46. package/docs/classes/WoKeypad.html +23 -23
  47. package/docs/classes/WoLeak.html +23 -23
  48. package/docs/classes/WoPlugMiniJP.html +26 -26
  49. package/docs/classes/WoPlugMiniUS.html +26 -26
  50. package/docs/classes/WoPresence.html +23 -23
  51. package/docs/classes/WoRelaySwitch1.html +26 -26
  52. package/docs/classes/WoRelaySwitch1PM.html +26 -26
  53. package/docs/classes/WoRemote.html +23 -23
  54. package/docs/classes/WoSensorTH.html +23 -23
  55. package/docs/classes/WoSensorTHPlus.html +23 -23
  56. package/docs/classes/WoSensorTHPro.html +23 -23
  57. package/docs/classes/WoSensorTHProCO2.html +23 -23
  58. package/docs/classes/WoSmartLock.html +25 -25
  59. package/docs/classes/WoSmartLockPro.html +26 -26
  60. package/docs/classes/WoStrip.html +28 -28
  61. package/docs/enums/LogLevel.html +2 -2
  62. package/docs/enums/SwitchBotBLEModel.html +2 -2
  63. package/docs/enums/SwitchBotBLEModelName.html +2 -2
  64. package/docs/functions/updateBaseURL.html +1 -1
  65. package/docs/hierarchy.html +1 -1
  66. package/docs/index.html +1 -1
  67. package/docs/interfaces/APICommandRequest.html +2 -2
  68. package/docs/interfaces/APICommandResponse.html +2 -2
  69. package/docs/interfaces/APIDevice.html +2 -2
  70. package/docs/interfaces/APIDeviceStatus.html +2 -2
  71. package/docs/interfaces/APIErrorResponse.html +2 -2
  72. package/docs/interfaces/APIResponse.html +2 -2
  73. package/docs/interfaces/AirPurifierCommands.html +2 -2
  74. package/docs/interfaces/AirPurifierServiceData.html +5 -5
  75. package/docs/interfaces/AirPurifierStatus.html +7 -7
  76. package/docs/interfaces/BLEAdvertisement.html +2 -2
  77. package/docs/interfaces/BLEScanOptions.html +5 -5
  78. package/docs/interfaces/BLEServiceData.html +5 -5
  79. package/docs/interfaces/BlindTiltCommands.html +2 -2
  80. package/docs/interfaces/BlindTiltServiceData.html +5 -5
  81. package/docs/interfaces/BlindTiltStatus.html +6 -6
  82. package/docs/interfaces/BotCommands.html +2 -2
  83. package/docs/interfaces/BotServiceData.html +5 -5
  84. package/docs/interfaces/BotStatus.html +6 -6
  85. package/docs/interfaces/BulbCommands.html +2 -2
  86. package/docs/interfaces/BulbServiceData.html +5 -5
  87. package/docs/interfaces/BulbStatus.html +6 -6
  88. package/docs/interfaces/CeilingLightCommands.html +2 -2
  89. package/docs/interfaces/CeilingLightServiceData.html +5 -5
  90. package/docs/interfaces/CeilingLightStatus.html +6 -6
  91. package/docs/interfaces/CommandResult.html +6 -6
  92. package/docs/interfaces/ContactServiceData.html +5 -5
  93. package/docs/interfaces/ContactStatus.html +6 -6
  94. package/docs/interfaces/CurtainCommands.html +2 -2
  95. package/docs/interfaces/CurtainServiceData.html +5 -5
  96. package/docs/interfaces/CurtainStatus.html +6 -6
  97. package/docs/interfaces/DeviceInfo.html +13 -13
  98. package/docs/interfaces/DeviceListResponse.html +2 -2
  99. package/docs/interfaces/DeviceStatus.html +6 -6
  100. package/docs/interfaces/DiscoveryOptions.html +7 -7
  101. package/docs/interfaces/HubServiceData.html +5 -5
  102. package/docs/interfaces/HubStatus.html +6 -6
  103. package/docs/interfaces/HumidifierCommands.html +2 -2
  104. package/docs/interfaces/HumidifierServiceData.html +6 -6
  105. package/docs/interfaces/HumidifierStatus.html +6 -6
  106. package/docs/interfaces/KeypadStatus.html +6 -6
  107. package/docs/interfaces/LeakServiceData.html +5 -5
  108. package/docs/interfaces/LeakStatus.html +6 -6
  109. package/docs/interfaces/LockCommands.html +2 -2
  110. package/docs/interfaces/LockServiceData.html +6 -6
  111. package/docs/interfaces/LockStatus.html +6 -6
  112. package/docs/interfaces/MeterServiceData.html +5 -5
  113. package/docs/interfaces/MeterStatus.html +6 -6
  114. package/docs/interfaces/MotionServiceData.html +5 -5
  115. package/docs/interfaces/MotionStatus.html +6 -6
  116. package/docs/interfaces/PlugCommands.html +2 -2
  117. package/docs/interfaces/PlugServiceData.html +5 -5
  118. package/docs/interfaces/PlugStatus.html +6 -6
  119. package/docs/interfaces/PresenceServiceData.html +5 -5
  120. package/docs/interfaces/PresenceStatus.html +6 -6
  121. package/docs/interfaces/RelaySwitchCommands.html +2 -2
  122. package/docs/interfaces/RelaySwitchServiceData.html +5 -5
  123. package/docs/interfaces/RelaySwitchStatus.html +6 -6
  124. package/docs/interfaces/RemoteStatus.html +6 -6
  125. package/docs/interfaces/SceneListResponse.html +2 -2
  126. package/docs/interfaces/StripCommands.html +2 -2
  127. package/docs/interfaces/StripServiceData.html +5 -5
  128. package/docs/interfaces/StripStatus.html +6 -6
  129. package/docs/interfaces/SwitchBotConfig.html +15 -15
  130. package/docs/interfaces/WebhookConfig.html +2 -2
  131. package/docs/interfaces/WebhookDetails.html +2 -2
  132. package/docs/interfaces/WebhookQueryResponse.html +2 -2
  133. package/docs/interfaces/WebhookSetupResponse.html +2 -2
  134. package/docs/media/BLE.md +63 -0
  135. package/docs/types/ConnectionType.html +1 -1
  136. package/docs/types/PhysicalDeviceType.html +1 -1
  137. package/docs/types/VirtualDeviceType.html +1 -1
  138. package/docs/variables/urls.html +1 -1
  139. package/package.json +2 -2
  140. package/tsconfig.build.json +17 -0
package/BLE.md CHANGED
@@ -587,6 +587,69 @@ switchbot
587
587
  });
588
588
  ```
589
589
 
590
+ #### Password Protection
591
+
592
+ The Bot (WoHand) supports password protection via BLE to prevent unauthorized control. When a password is set, all BLE commands (press, turnOn, turnOff, up, down) will be automatically encrypted.
593
+
594
+ **Password Requirements:**
595
+ - Exactly 4 characters
596
+ - Alphanumeric only (letters and numbers)
597
+ - Case-sensitive
598
+
599
+ **Setting a Password:**
600
+
601
+ ```typescript
602
+ // Using device options during construction
603
+ const bot = new WoHand({
604
+ id: 'c1:2e:45:3e:20:08',
605
+ password: 'A1b2' // Your 4-character password
606
+ });
607
+
608
+ // Or set/change password on existing device
609
+ await bot.setPassword('A1b2');
610
+ ```
611
+
612
+ **Clearing a Password:**
613
+
614
+ ```typescript
615
+ // Remove password protection
616
+ await bot.clearPassword();
617
+ ```
618
+
619
+ **Checking Password Status:**
620
+
621
+ ```typescript
622
+ // Check if device has password configured
623
+ if (bot.hasPassword()) {
624
+ console.log('Device is password protected');
625
+ }
626
+ ```
627
+
628
+ **Example with Password:**
629
+
630
+ ```typescript
631
+ switchbot
632
+ .discover({ model: "H", quick: true })
633
+ .then((device_list) => {
634
+ const bot = device_list[0];
635
+ // Set password for protected Bot
636
+ bot.setPassword('MyP4');
637
+ return bot.press();
638
+ })
639
+ .then(() => {
640
+ console.log("Password-protected Bot pressed successfully");
641
+ })
642
+ .catch((error) => {
643
+ console.error(error);
644
+ });
645
+ ```
646
+
647
+ **Notes:**
648
+ - Password encryption uses CRC32 checksums for secure command transmission
649
+ - All control methods (press, turnOn, turnOff, up, down) automatically use encrypted commands when password is set
650
+ - Password is stored in memory only and must be set each time the application starts
651
+ - If the wrong password is configured, BLE commands will fail silently (Bot will not respond)
652
+
590
653
  ### `WoCurtain` Object
591
654
 
592
655
  The `WoCurtain` object represents a Curtain, which is created through the discovery process triggered by the [`switchBotBLE.discover()`](#discover-method) method.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,40 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. This project uses [Semantic Versioning](https://semver.org/)
4
4
 
5
+ ## [Unreleased]
6
+
7
+ ### Features
8
+
9
+ * **Bot Password Protection**: Added BLE password support for Bot (WoHand) devices
10
+ * Password encryption using CRC32 checksums
11
+ * Password validation (4 alphanumeric characters, case-sensitive)
12
+ * Methods: `setPassword()`, `clearPassword()`, `hasPassword()`
13
+ * Automatic encrypted command execution when password is set
14
+ * Example: `examples/bot-password.js`
15
+ * Based on [homebridge-switchbot PR #1337](https://github.com/OpenWonderLabs/homebridge-switchbot/pull/1337)
16
+
17
+ * **Advanced Resilience Features**: Enterprise-grade reliability enhancements
18
+ * Retry logic with exponential backoff and jitter (RetryExecutor)
19
+ * Circuit breaker pattern to prevent cascading failures (CLOSED/OPEN/HALF_OPEN states)
20
+ * Connection intelligence tracking per-device success/failure rates
21
+ * Custom fallback handler system with built-in logging, metrics, and alerting handlers
22
+ * Intelligent connection selection based on historical performance
23
+
24
+ ### Documentation
25
+
26
+ * Added password protection section to [BLE.md](BLE.md)
27
+ * Updated [README.md](README.md) with password examples
28
+ * Created comprehensive password protection example
29
+ * Updated examples index with bot-password.js
30
+
31
+ ### Tests
32
+
33
+ * Added 14 comprehensive password protection tests
34
+ * All 54 tests passing (up from 40 in v4.0.0)
35
+ * Validation of CRC32 encryption, command building, and response parsing
36
+
37
+ ---
38
+
5
39
  ## [4.0.0](https://github.com/OpenWonderLabs/node-switchbot/compare/v3.6.6...v4.0.0) (2026-03-03)
6
40
 
7
41
  ### ⚠ BREAKING CHANGES
package/README.md CHANGED
@@ -66,6 +66,12 @@ await bot.turnOn()
66
66
  await bot.turnOff()
67
67
  await bot.press()
68
68
 
69
+ // Bot with Password Protection (BLE only)
70
+ const protectedBot = new WoHand({ id: 'YOUR_BOT_ID', password: 'A1b2' })
71
+ await protectedBot.setPassword('A1b2') // Set 4-char alphanumeric password
72
+ await protectedBot.press() // Commands are automatically encrypted
73
+ await protectedBot.clearPassword() // Remove password protection
74
+
69
75
  // Curtain - Position control
70
76
  await curtain.open()
71
77
  await curtain.close()
@@ -1,9 +1,25 @@
1
+ import type { OpenAPIClient } from '../api.js';
2
+ import type { BLEConnection } from '../ble.js';
1
3
  import type { BotCommands, BotStatus } from '../types/device.js';
4
+ import type { DeviceInfo } from '../types/index.js';
2
5
  import { SwitchBotDevice } from './base.js';
3
6
  /**
4
7
  * Bot (WoHand) Device - Press or switch button device
8
+ * Supports optional BLE password protection
5
9
  */
6
10
  export declare class WoHand extends SwitchBotDevice implements BotCommands {
11
+ private password?;
12
+ constructor(info: DeviceInfo, options?: {
13
+ bleConnection?: BLEConnection;
14
+ apiClient?: OpenAPIClient;
15
+ enableFallback?: boolean;
16
+ preferredConnection?: 'ble' | 'api';
17
+ enableConnectionIntelligence?: boolean;
18
+ enableCircuitBreaker?: boolean;
19
+ enableRetry?: boolean;
20
+ password?: string;
21
+ logLevel?: number;
22
+ });
7
23
  /**
8
24
  * Turn on (switch mode)
9
25
  */
@@ -16,6 +32,25 @@ export declare class WoHand extends SwitchBotDevice implements BotCommands {
16
32
  * Press (press mode)
17
33
  */
18
34
  press(): Promise<boolean>;
35
+ /**
36
+ * Execute password-protected Bot command
37
+ * @param action - Bot action to perform
38
+ * @returns True if command was successful
39
+ */
40
+ private executePasswordCommand;
41
+ /**
42
+ * Set or update Bot password
43
+ * @param password - 4-character alphanumeric password (case-sensitive)
44
+ */
45
+ setPassword(password: string): void;
46
+ /**
47
+ * Clear Bot password
48
+ */
49
+ clearPassword(): void;
50
+ /**
51
+ * Check if password is configured
52
+ */
53
+ hasPassword(): boolean;
19
54
  /**
20
55
  * Get device status
21
56
  */
@@ -1 +1 @@
1
- {"version":3,"file":"wo-hand.d.ts","sourceRoot":"","sources":["../../src/devices/wo-hand.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,qBAAa,MAAO,SAAQ,eAAgB,YAAW,WAAW;IAChE;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAQjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ/B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;CAmCtC"}
1
+ {"version":3,"file":"wo-hand.d.ts","sourceRoot":"","sources":["../../src/devices/wo-hand.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAInD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;;GAGG;AACH,qBAAa,MAAO,SAAQ,eAAgB,YAAW,WAAW;IAChE,OAAO,CAAC,QAAQ,CAAC,CAAQ;gBAGvB,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,aAAa,CAAA;QAC7B,SAAS,CAAC,EAAE,aAAa,CAAA;QACzB,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,mBAAmB,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;QACnC,4BAA4B,CAAC,EAAE,OAAO,CAAA;QACtC,oBAAoB,CAAC,EAAE,OAAO,CAAA;QAC9B,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;KACb;IAiBR;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAchC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAcjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAc/B;;;;OAIG;YACW,sBAAsB;IAkCpC;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMnC;;OAEG;IACH,aAAa,IAAI,IAAI;IAKrB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;CAmCtC"}
@@ -3,15 +3,38 @@
3
3
  * devices/wo-hand.ts: SwitchBot v4.0.0 - Bot (WoHand) Device
4
4
  */
5
5
  import { DEVICE_COMMANDS } from '../settings.js';
6
+ import { BOT_BLE_ACTIONS, buildBotBleCommand, parseBotBleResponse, validateBotPassword } from '../utils/index.js';
6
7
  import { SwitchBotDevice } from './base.js';
7
8
  /**
8
9
  * Bot (WoHand) Device - Press or switch button device
10
+ * Supports optional BLE password protection
9
11
  */
10
12
  export class WoHand extends SwitchBotDevice {
13
+ password;
14
+ constructor(info, options = {}) {
15
+ super(info, options);
16
+ // Validate and store password if provided
17
+ if (options.password) {
18
+ try {
19
+ validateBotPassword(options.password);
20
+ this.password = options.password;
21
+ this.logger.info('Bot password configured');
22
+ }
23
+ catch (error) {
24
+ this.logger.error('Invalid password format', error);
25
+ throw error;
26
+ }
27
+ }
28
+ }
11
29
  /**
12
30
  * Turn on (switch mode)
13
31
  */
14
32
  async turnOn() {
33
+ // Use password-protected command if password is configured
34
+ if (this.password) {
35
+ return await this.executePasswordCommand(BOT_BLE_ACTIONS.TURN_ON);
36
+ }
37
+ // Standard command
15
38
  const result = await this.sendCommand(DEVICE_COMMANDS.BOT.TURN_ON, 'turnOn');
16
39
  return result.success;
17
40
  }
@@ -19,6 +42,11 @@ export class WoHand extends SwitchBotDevice {
19
42
  * Turn off (switch mode)
20
43
  */
21
44
  async turnOff() {
45
+ // Use password-protected command if password is configured
46
+ if (this.password) {
47
+ return await this.executePasswordCommand(BOT_BLE_ACTIONS.TURN_OFF);
48
+ }
49
+ // Standard command
22
50
  const result = await this.sendCommand(DEVICE_COMMANDS.BOT.TURN_OFF, 'turnOff');
23
51
  return result.success;
24
52
  }
@@ -26,9 +54,68 @@ export class WoHand extends SwitchBotDevice {
26
54
  * Press (press mode)
27
55
  */
28
56
  async press() {
57
+ // Use password-protected command if password is configured
58
+ if (this.password) {
59
+ return await this.executePasswordCommand(BOT_BLE_ACTIONS.PRESS);
60
+ }
61
+ // Standard command
29
62
  const result = await this.sendCommand(DEVICE_COMMANDS.BOT.PRESS, 'press');
30
63
  return result.success;
31
64
  }
65
+ /**
66
+ * Execute password-protected Bot command
67
+ * @param action - Bot action to perform
68
+ * @returns True if command was successful
69
+ */
70
+ async executePasswordCommand(action) {
71
+ if (!this.password) {
72
+ throw new Error('Password not configured for this Bot device');
73
+ }
74
+ if (!this.hasBLE()) {
75
+ throw new Error('BLE not available - password-protected commands require BLE connection');
76
+ }
77
+ try {
78
+ // Build encrypted command
79
+ const command = buildBotBleCommand(action, this.password);
80
+ this.logger.debug('Sending password-protected command', { action });
81
+ // Send command via BLE
82
+ await this.bleConnection.write(this.info.mac, command);
83
+ // Read response
84
+ const responseBuffer = await this.bleConnection.read(this.info.mac);
85
+ // Parse and validate response
86
+ parseBotBleResponse(responseBuffer);
87
+ this.info.activeConnection = 'ble';
88
+ this.emit('command', { type: 'ble', success: true, encrypted: true });
89
+ return true;
90
+ }
91
+ catch (error) {
92
+ this.logger.error('Password-protected command failed', error);
93
+ this.emit('error', { type: 'ble', error, encrypted: true });
94
+ throw error;
95
+ }
96
+ }
97
+ /**
98
+ * Set or update Bot password
99
+ * @param password - 4-character alphanumeric password (case-sensitive)
100
+ */
101
+ setPassword(password) {
102
+ validateBotPassword(password);
103
+ this.password = password;
104
+ this.logger.info('Bot password updated');
105
+ }
106
+ /**
107
+ * Clear Bot password
108
+ */
109
+ clearPassword() {
110
+ this.password = undefined;
111
+ this.logger.info('Bot password cleared');
112
+ }
113
+ /**
114
+ * Check if password is configured
115
+ */
116
+ hasPassword() {
117
+ return !!this.password;
118
+ }
32
119
  /**
33
120
  * Get device status
34
121
  */
@@ -1 +1 @@
1
- {"version":3,"file":"wo-hand.js","sourceRoot":"","sources":["../../src/devices/wo-hand.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,MAAM,OAAO,MAAO,SAAQ,eAAe;IACzC;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,eAAe,CAAC,GAAG,CAAC,OAAO,EAC3B,QAAQ,CACT,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,eAAe,CAAC,GAAG,CAAC,QAAQ,EAC5B,SAAS,CACV,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,eAAe,CAAC,GAAG,CAAC,KAAK,EACzB,OAAO,CACR,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,6BAA6B;YAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;gBAC3C,OAAO;oBACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;oBACtB,cAAc,EAAE,KAAK;oBACrB,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,KAAK;oBAC/B,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,OAAO;oBAC/B,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAA;YACH,CAAC;YAED,kBAAkB;YAClB,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;gBACzC,OAAO;oBACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;oBACtB,cAAc,EAAE,KAAK;oBACrB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;oBACnC,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAA;YACH,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;YAChD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"wo-hand.js","sourceRoot":"","sources":["../../src/devices/wo-hand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { Buffer } from 'node:buffer';
2
+ /**
3
+ * Bot BLE action types
4
+ */
5
+ export type BotBleAction = 0x00 | 0x01 | 0x02;
6
+ /**
7
+ * Valid Bot BLE action values
8
+ */
9
+ export declare const BOT_BLE_ACTIONS: {
10
+ PRESS: BotBleAction;
11
+ TURN_ON: BotBleAction;
12
+ TURN_OFF: BotBleAction;
13
+ };
14
+ /**
15
+ * Validate Bot BLE password format
16
+ * Password must be exactly 4 alphanumeric characters (case-sensitive)
17
+ * @param password - Password to validate
18
+ * @throws Error if password format is invalid
19
+ */
20
+ export declare function validateBotPassword(password: string): void;
21
+ /**
22
+ * Build Bot BLE command buffer
23
+ * @param action - Bot action (0x00=press, 0x01=on, 0x02=off)
24
+ * @param password - Optional 4-character password for encrypted commands
25
+ * @returns Command buffer ready to send via BLE
26
+ * @throws Error if action or password format is invalid
27
+ */
28
+ export declare function buildBotBleCommand(action: BotBleAction, password?: string): Buffer;
29
+ /**
30
+ * Parse Bot BLE response buffer
31
+ * @param response - Response buffer from Bot device
32
+ * @returns True if command was successful
33
+ * @throws Error if response indicates failure
34
+ */
35
+ export declare function parseBotBleResponse(response: Buffer): boolean;
36
+ //# sourceMappingURL=bot-ble.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-ble.d.ts","sourceRoot":"","sources":["../../src/utils/bot-ble.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAmCpC;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAE7C;;GAEG;AACH,eAAO,MAAM,eAAe;WACX,YAAY;aACV,YAAY;cACX,YAAY;CAC/B,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAM1D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAgCR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAc7D"}
@@ -0,0 +1,107 @@
1
+ /* Copyright(C) 2024-2026, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * utils/bot-ble.ts: SwitchBot v4.0.0 - Bot BLE Password Helpers
4
+ */
5
+ import { Buffer } from 'node:buffer';
6
+ /**
7
+ * CRC32 polynomial for password encryption
8
+ */
9
+ const CRC32_POLYNOMIAL = 0xEDB88320;
10
+ /**
11
+ * Precomputed CRC32 lookup table
12
+ */
13
+ const CRC32_TABLE = new Uint32Array(256);
14
+ // Initialize CRC32 table
15
+ for (let i = 0; i < 256; i++) {
16
+ let crc = i;
17
+ for (let j = 0; j < 8; j++) {
18
+ crc = (crc & 1) !== 0 ? (crc >>> 1) ^ CRC32_POLYNOMIAL : (crc >>> 1);
19
+ }
20
+ CRC32_TABLE[i] = crc >>> 0;
21
+ }
22
+ /**
23
+ * Calculate CRC32 checksum of a string
24
+ * @param input - String to calculate CRC32 for
25
+ * @returns CRC32 checksum as unsigned 32-bit integer
26
+ */
27
+ function calculateCRC32(input) {
28
+ let crc = 0xFFFFFFFF;
29
+ for (let i = 0; i < input.length; i++) {
30
+ const byte = input.charCodeAt(i);
31
+ crc = (crc >>> 8) ^ CRC32_TABLE[(crc ^ byte) & 0xFF];
32
+ }
33
+ return (crc ^ 0xFFFFFFFF) >>> 0;
34
+ }
35
+ /**
36
+ * Valid Bot BLE action values
37
+ */
38
+ export const BOT_BLE_ACTIONS = {
39
+ PRESS: 0x00,
40
+ TURN_ON: 0x01,
41
+ TURN_OFF: 0x02,
42
+ };
43
+ /**
44
+ * Validate Bot BLE password format
45
+ * Password must be exactly 4 alphanumeric characters (case-sensitive)
46
+ * @param password - Password to validate
47
+ * @throws Error if password format is invalid
48
+ */
49
+ export function validateBotPassword(password) {
50
+ if (!/^[A-Z0-9]{4}$/i.test(password)) {
51
+ throw new Error('Invalid Bot password. Password must be exactly 4 alphanumeric characters (case-sensitive).');
52
+ }
53
+ }
54
+ /**
55
+ * Build Bot BLE command buffer
56
+ * @param action - Bot action (0x00=press, 0x01=on, 0x02=off)
57
+ * @param password - Optional 4-character password for encrypted commands
58
+ * @returns Command buffer ready to send via BLE
59
+ * @throws Error if action or password format is invalid
60
+ */
61
+ export function buildBotBleCommand(action, password) {
62
+ // Validate action
63
+ const validActions = [
64
+ BOT_BLE_ACTIONS.PRESS,
65
+ BOT_BLE_ACTIONS.TURN_ON,
66
+ BOT_BLE_ACTIONS.TURN_OFF,
67
+ ];
68
+ if (!validActions.includes(action)) {
69
+ throw new Error(`Invalid Bot BLE action: 0x${action.toString(16)}. Expected 0x00, 0x01, or 0x02.`);
70
+ }
71
+ // Plain command (no password)
72
+ if (!password) {
73
+ return Buffer.from([0x57, 0x01, action]);
74
+ }
75
+ // Encrypted command (with password)
76
+ validateBotPassword(password);
77
+ const crc = calculateCRC32(password);
78
+ // Command format: [0x57, 0x11, CRC32_BE (4 bytes), action]
79
+ return Buffer.from([
80
+ 0x57,
81
+ 0x11,
82
+ (crc >>> 24) & 0xFF, // MSB first (big-endian)
83
+ (crc >>> 16) & 0xFF,
84
+ (crc >>> 8) & 0xFF,
85
+ crc & 0xFF, // LSB
86
+ action,
87
+ ]);
88
+ }
89
+ /**
90
+ * Parse Bot BLE response buffer
91
+ * @param response - Response buffer from Bot device
92
+ * @returns True if command was successful
93
+ * @throws Error if response indicates failure
94
+ */
95
+ export function parseBotBleResponse(response) {
96
+ if (response.length !== 3) {
97
+ throw new Error(`Invalid Bot response length: ${response.length}, expected 3`);
98
+ }
99
+ const statusCode = response.readUInt8(0);
100
+ // Success codes: 0x01 (success) or 0x05 (success, encrypted)
101
+ if (statusCode === 0x01 || statusCode === 0x05) {
102
+ return true;
103
+ }
104
+ // Error response
105
+ throw new Error(`Bot command failed with status: 0x${response.toString('hex')}`);
106
+ }
107
+ //# sourceMappingURL=bot-ble.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-ble.js","sourceRoot":"","sources":["../../src/utils/bot-ble.ts"],"names":[],"mappings":"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"}
@@ -94,6 +94,7 @@ export declare function debounce<T extends (...args: any[]) => any>(fn: T, delay
94
94
  * Throttle function
95
95
  */
96
96
  export declare function throttle<T extends (...args: any[]) => any>(fn: T, limitMs: number): (...args: Parameters<T>) => void;
97
+ export { BOT_BLE_ACTIONS, type BotBleAction, buildBotBleCommand, parseBotBleResponse, validateBotPassword, } from './bot-ble.js';
97
98
  export { CircuitBreaker, type CircuitBreakerConfig, CircuitBreakerState, type CircuitBreakerStats } from './circuit-breaker.js';
98
99
  export { type ConnectionStats, ConnectionTracker } from './connection-tracker.js';
99
100
  export { createAlertHandler, createLoggingFallbackHandler, createMetricsCollectionHandler, type FallbackEvent, type FallbackHandler, FallbackHandlerManager, type FallbackHandlerOptions, } from './fallback-handler.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
@@ -203,6 +203,8 @@ export function throttle(fn, limitMs) {
203
203
  }
204
204
  };
205
205
  }
206
+ // Export Bot BLE password utilities
207
+ export { BOT_BLE_ACTIONS, buildBotBleCommand, parseBotBleResponse, validateBotPassword, } from './bot-ble.js';
206
208
  export { CircuitBreaker, CircuitBreakerState } from './circuit-breaker.js';
207
209
  export { ConnectionTracker } from './connection-tracker.js';
208
210
  export { createAlertHandler, createLoggingFallbackHandler, createMetricsCollectionHandler, FallbackHandlerManager, } from './fallback-handler.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- window.hierarchyData = "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"
1
+ window.hierarchyData = "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"