@switchbot/homebridge-switchbot 3.7.1-beta.24 → 3.7.1-beta.26

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@switchbot/homebridge-switchbot",
3
3
  "displayName": "SwitchBot",
4
4
  "type": "module",
5
- "version": "3.7.1-beta.24",
5
+ "version": "3.7.1-beta.26",
6
6
  "description": "The SwitchBot plugin allows you to access your SwitchBot device(s) from HomeKit.",
7
7
  "author": "SwitchBot <support@wondertechlabs.com> (https://github.com/SwitchBot)",
8
8
  "contributors": [
package/src/device/bot.ts CHANGED
@@ -775,13 +775,8 @@ export class Bot extends deviceBase {
775
775
  * Handle requests to set the "On" characteristic
776
776
  */
777
777
  async OnSet(value: CharacteristicValue): Promise<void> {
778
- if (this.On === undefined) {
779
- this.On = false
780
- this.accessory.context.On = this.On
781
- } else {
782
- this.On = this.accessory.context.On
783
- }
784
-
778
+ this.On = this.accessory.context.On ?? false
779
+ this.accessory.context.On = this.On
785
780
  const deviceTypeActions: { [key: string]: () => Promise<void> } = {
786
781
  switch: async () => {
787
782
  if (this.Switch) {
@@ -842,10 +837,8 @@ export class Bot extends deviceBase {
842
837
  }
843
838
  },
844
839
  }
845
-
846
840
  const action = deviceTypeActions[this.botDeviceType] || deviceTypeActions.default
847
841
  await action()
848
-
849
842
  this.accessory.context.On = this.On
850
843
  this.doBotUpdate.next()
851
844
  }
@@ -1135,48 +1128,47 @@ export class Bot extends deviceBase {
1135
1128
 
1136
1129
  async getBotConfigSettings(device: device & devicesConfig) {
1137
1130
  // Bot Device Type
1138
- this.botDeviceType = this.accessory.context.botDeviceType === device.bot?.deviceType
1139
- ? this.accessory.context.botDeviceType
1140
- : device.bot?.deviceType ?? 'outlet'
1141
- const botDeviceType = this.accessory.context.botDeviceType
1142
- ? `Using Device Type: ${this.botDeviceType}, from Accessory Cache.`
1143
- : device.bot?.deviceType
1144
- ? `Using Device Type: ${this.botDeviceType}`
1145
- : `No Device Type Set, deviceType: ${this.device.bot?.deviceType}, Using default deviceType: ${this.botDeviceType}`
1131
+ this.botDeviceType = device.bot?.deviceType ?? 'outlet'
1132
+ const botDeviceType = device.bot?.deviceType
1133
+ ? `Using Device Type: ${this.botDeviceType}`
1134
+ : `No Device Type Set, deviceType: ${this.device.bot?.deviceType}, Using default deviceType: ${this.botDeviceType}`
1146
1135
  await this.debugWarnLog(botDeviceType)
1147
1136
  this.accessory.context.botDeviceType = this.botDeviceType
1148
1137
  // Bot Mode
1149
- this.botMode = this.accessory.context.botMode ?? device.bot?.mode ?? 'switch'
1150
- const botMode = this.accessory.context.botMode
1151
- ? `Using Bot Mode: ${this.botMode}, from Accessory Cache.`
1152
- : device.bot?.mode ? `Using Bot Mode: ${this.botMode}` : `No Bot Mode Set, Using default Bot Mode: ${this.botMode}`
1153
- await this.debugWarnLog(botMode)
1138
+ this.botMode = device.bot?.mode ?? 'switch'
1139
+ if (!device.bot?.mode) {
1140
+ this.botMode = 'switch'
1141
+ this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} does not have bot mode set in the Plugin's SwitchBot Device Settings, defaulting to "${this.botMode}" mode. You may experience issues.`)
1142
+ } else if (['switch', 'press', 'multipress'].includes(device.bot.mode)) {
1143
+ this.botMode = device.bot.mode
1144
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`)
1145
+ } else {
1146
+ throw new Error(`${this.device.deviceType}: ${this.accessory.displayName} Invalid Bot Mode: ${device.bot.mode}`)
1147
+ }
1148
+ const botModeLog = device.bot?.mode
1149
+ ? `Using Bot Mode: ${this.botMode}`
1150
+ : `No Bot Mode Set, Using default Bot Mode: ${this.botMode}`
1151
+ await this.debugWarnLog(botModeLog)
1154
1152
  this.accessory.context.botMode = this.botMode
1155
1153
  // Bot Double Press
1156
- this.doublePress = this.accessory.context.doublePress ?? device.bot?.doublePress ?? 1
1157
- const doublePress = this.accessory.context.doublePress
1158
- ? `Using Double Press: ${this.doublePress}, from Accessory Cache.`
1159
- : device.bot?.doublePress
1160
- ? `Using Double Press: ${this.doublePress}`
1161
- : `No Double Press Set, Using default Double Press: ${this.doublePress}`
1154
+ this.doublePress = device.bot?.doublePress ?? 1
1155
+ const doublePress = device.bot?.doublePress
1156
+ ? `Using Double Press: ${this.doublePress}`
1157
+ : `No Double Press Set, Using default Double Press: ${this.doublePress}`
1162
1158
  await this.debugWarnLog(doublePress)
1163
1159
  this.accessory.context.doublePress = this.doublePress
1164
1160
  // Bot Press PushRate
1165
- this.pushRatePress = this.accessory.context.pushRatePress ?? device.bot?.pushRatePress ?? 15
1166
- const pushRatePress = this.accessory.context.pushRatePress
1167
- ? `Using Push Rate Press: ${this.pushRatePress}, from Accessory Cache.`
1168
- : device.bot?.pushRatePress
1169
- ? `Using Bot Push Rate Press: ${this.pushRatePress}`
1170
- : `No Push Rate Press Set, Using default Push Rate Press: ${this.pushRatePress}`
1161
+ this.pushRatePress = device.bot?.pushRatePress ?? 15
1162
+ const pushRatePress = device.bot?.pushRatePress
1163
+ ? `Using Bot Push Rate Press: ${this.pushRatePress}`
1164
+ : `No Push Rate Press Set, Using default Push Rate Press: ${this.pushRatePress}`
1171
1165
  await this.debugWarnLog(pushRatePress)
1172
1166
  this.accessory.context.pushRatePress = this.pushRatePress
1173
1167
  // Bot Allow Push
1174
- this.allowPush = this.accessory.context.allowPush ?? device.bot?.allowPush ?? false
1175
- const allowPush = this.accessory.context.allowPush
1176
- ? `Using Allow Push: ${this.allowPush}, from Accessory Cache.`
1177
- : device.bot?.allowPush
1178
- ? `Using Allow Push: ${this.allowPush}`
1179
- : `No Allow Push Set, Using default Allow Push: ${this.allowPush}`
1168
+ this.allowPush = device.bot?.allowPush ?? false
1169
+ const allowPush = device.bot?.allowPush
1170
+ ? `Using Allow Push: ${this.allowPush}`
1171
+ : `No Allow Push Set, Using default Allow Push: ${this.allowPush}`
1180
1172
  await this.debugWarnLog(allowPush)
1181
1173
  this.accessory.context.allowPush = this.allowPush
1182
1174
  // Bot Multi Press Count
@@ -191,19 +191,13 @@ export class Curtain extends deviceBase {
191
191
  }
192
192
  } else {
193
193
  accessory.context.OpenModeSwitch = accessory.context.OpenModeSwitch ?? {}
194
- if (this.OpenModeSwitch?.Service) {
195
- const OpenModeSwitch = this.accessory.getService(this.OpenModeSwitch.Name)
196
- this.OpenModeSwitch = {
197
- Name: `${accessory.displayName} Silent Open Mode`,
198
- Service: OpenModeSwitch as Service,
199
- On: accessory.context.OpenModeSwitch.On ?? false,
200
- }
201
- } else {
202
- this.OpenModeSwitch = {
203
- Name: `${accessory.displayName} Silent Open Mode`,
204
- Service: accessory.addService(this.hap.Service.Switch, this.OpenModeSwitch?.Name, this.OpenModeSwitch?.Name) as Service,
205
- On: accessory.context.OpenModeSwitch.On ?? false,
206
- }
194
+ this.debugLog('Adding Open Mode Switch Service')
195
+ const name = `${accessory.displayName} Silent Open Mode`
196
+ const uuid = this.api.hap.uuid.generate(name)
197
+ this.OpenModeSwitch = {
198
+ Name: name,
199
+ Service: accessory.getService(name) ?? accessory.addService(this.hap.Service.Switch, name, uuid) as Service,
200
+ On: accessory.context.OpenModeSwitch.On ?? false,
207
201
  }
208
202
  accessory.context.OpenModeSwitch = this.OpenModeSwitch as object
209
203
 
@@ -225,19 +219,13 @@ export class Curtain extends deviceBase {
225
219
  }
226
220
  } else {
227
221
  accessory.context.CloseModeSwitch = accessory.context.CloseModeSwitch ?? {}
228
- if (this.CloseModeSwitch?.Service) {
229
- const CloseModeSwitch = this.accessory.getService(this.CloseModeSwitch.Name)
230
- this.CloseModeSwitch = {
231
- Name: `${accessory.displayName} Silent Close Mode`,
232
- Service: CloseModeSwitch as Service,
233
- On: accessory.context.CloseModeSwitch.On ?? false,
234
- }
235
- } else {
236
- this.CloseModeSwitch = {
237
- Name: `${accessory.displayName} Silent Close Mode`,
238
- Service: accessory.addService(this.hap.Service.Switch, this.CloseModeSwitch?.Name, this.CloseModeSwitch?.Name) as Service,
239
- On: accessory.context.CloseModeSwitch.On ?? false,
240
- }
222
+ this.debugLog('Adding Close Mode Switch Service')
223
+ const name = `${accessory.displayName} Silent Close Mode`
224
+ const uuid = this.api.hap.uuid.generate(name)
225
+ this.CloseModeSwitch = {
226
+ Name: name,
227
+ Service: this.accessory.getService(name) ?? accessory.addService(this.hap.Service.Switch, name, uuid) as Service,
228
+ On: accessory.context.CloseModeSwitch.On ?? false,
241
229
  }
242
230
  accessory.context.CloseModeSwitch = this.CloseModeSwitch as object
243
231
 
@@ -330,7 +318,7 @@ export class Curtain extends deviceBase {
330
318
  /*
331
319
  * Setup EVE history features for curtain devices.
332
320
  */
333
- async setupHistoryService(): Promise < void> {
321
+ async setupHistoryService(): Promise<void> {
334
322
  if (this.device.history !== true) {
335
323
  return
336
324
  }
package/src/platform.ts CHANGED
@@ -31,7 +31,7 @@ import { queueScheduler } from 'rxjs'
31
31
  import { request } from 'undici'
32
32
 
33
33
  import { BlindTilt } from './device/blindtilt.js'
34
- import { Bot } from './device/bot-old.js'
34
+ import { Bot } from './device/bot.js'
35
35
  import { CeilingLight } from './device/ceilinglight.js'
36
36
  import { ColorBulb } from './device/colorbulb.js'
37
37
  import { Contact } from './device/contact.js'
@@ -1,132 +0,0 @@
1
- import type { API, CharacteristicValue, HAP, Logging, PlatformAccessory, Service } from 'homebridge';
2
- import type { SwitchBotPlatform } from '../platform.js';
3
- import type { devicesConfig, SwitchBotPlatformConfig } from '../settings.js';
4
- import type { botServiceData as serviceData } from '../types/bledevicestatus.js';
5
- import type { device } from '../types/devicelist.js';
6
- import type { botStatus as deviceStatus } from '../types/devicestatus.js';
7
- import { Subject } from 'rxjs';
8
- /**
9
- * Platform Accessory
10
- * An instance of this class is created for each accessory your platform registers
11
- * Each accessory may expose multiple services of different service types.
12
- */
13
- export declare class Bot {
14
- private readonly platform;
15
- private accessory;
16
- device: device & devicesConfig;
17
- readonly api: API;
18
- readonly log: Logging;
19
- readonly config: SwitchBotPlatformConfig;
20
- protected readonly hap: HAP;
21
- fanService?: Service;
22
- doorService?: Service;
23
- lockService?: Service;
24
- faucetService?: Service;
25
- windowService?: Service;
26
- switchService?: Service;
27
- outletService?: Service;
28
- batteryService: Service;
29
- garageDoorService?: Service;
30
- windowCoveringService?: Service;
31
- statefulProgrammableSwitchService?: Service;
32
- On: CharacteristicValue;
33
- BatteryLevel: CharacteristicValue;
34
- FirmwareRevision: CharacteristicValue;
35
- StatusLowBattery: CharacteristicValue;
36
- OpenAPI_On: deviceStatus['power'];
37
- OpenAPI_BatteryLevel: deviceStatus['battery'];
38
- OpenAPI_FirmwareRevision: deviceStatus['version'];
39
- BLE_On: serviceData['state'];
40
- BLE_Mode: serviceData['mode'];
41
- BLE_BatteryLevel: serviceData['battery'];
42
- BLE_IsConnected?: boolean;
43
- botMode: string;
44
- allowPush?: boolean;
45
- doublePress: number;
46
- scanDuration: number;
47
- botDeviceType: string;
48
- pushRatePress: number;
49
- deviceLogging: string;
50
- multiPressCount: number;
51
- deviceRefreshRate: number;
52
- botUpdateInProgress: boolean;
53
- doBotUpdate: Subject<void>;
54
- private readonly OpenAPI;
55
- private readonly BLE;
56
- constructor(platform: SwitchBotPlatform, accessory: PlatformAccessory, device: device & devicesConfig);
57
- /**
58
- * Parse the device status from the SwitchBot api
59
- */
60
- parseStatus(): Promise<void>;
61
- BLEparseStatus(): Promise<void>;
62
- openAPIparseStatus(): Promise<void>;
63
- /**
64
- * Asks the SwitchBot API for the latest device information
65
- */
66
- refreshStatus(): Promise<void>;
67
- BLERefreshStatus(): Promise<void>;
68
- openAPIRefreshStatus(): Promise<void>;
69
- /**
70
- * Pushes the requested changes to the SwitchBot API
71
- * deviceType commandType Command command parameter Description
72
- * Bot - "command" "turnOff" "default" = set to OFF state
73
- * Bot - "command" "turnOn" "default" = set to ON state
74
- * Bot - "command" "press" "default" = trigger press
75
- */
76
- pushChanges(): Promise<void>;
77
- BLEpushChanges(): Promise<void>;
78
- openAPIpushChanges(): Promise<void>;
79
- /**
80
- * Handle requests to set the "On" characteristic
81
- */
82
- OnSet(value: CharacteristicValue): Promise<void>;
83
- /**
84
- * Updates the status for each of the HomeKit Characteristics
85
- */
86
- updateHomeKitCharacteristics(): Promise<void>;
87
- removeOutletService(accessory: PlatformAccessory): Promise<void>;
88
- removeGarageDoorService(accessory: PlatformAccessory): Promise<void>;
89
- removeDoorService(accessory: PlatformAccessory): Promise<void>;
90
- removeLockService(accessory: PlatformAccessory): Promise<void>;
91
- removeFaucetService(accessory: PlatformAccessory): Promise<void>;
92
- removeFanService(accessory: PlatformAccessory): Promise<void>;
93
- removeWindowService(accessory: PlatformAccessory): Promise<void>;
94
- removeWindowCoveringService(accessory: PlatformAccessory): Promise<void>;
95
- removeStatefulProgrammableSwitchService(accessory: PlatformAccessory): Promise<void>;
96
- removeSwitchService(accessory: PlatformAccessory): Promise<void>;
97
- private DoublePress;
98
- stopScanning(switchbot: any): Promise<void>;
99
- getCustomBLEAddress(switchbot: any): Promise<void>;
100
- BLEPushConnection(): Promise<void>;
101
- BLERefreshConnection(switchbot: any): Promise<void>;
102
- retry({ max, fn }: {
103
- max: number;
104
- fn: {
105
- (): any;
106
- (): Promise<any>;
107
- };
108
- }): Promise<null>;
109
- maxRetry(): number;
110
- PressOrSwitch(device: device & devicesConfig): Promise<void>;
111
- allowPushChanges(device: device & devicesConfig): Promise<void>;
112
- scan(device: device & devicesConfig): Promise<void>;
113
- statusCode(statusCode: number): Promise<void>;
114
- offlineOff(): Promise<void>;
115
- apiError(e: any): Promise<void>;
116
- deviceType(device: device & devicesConfig): Promise<void>;
117
- deviceContext(): Promise<void>;
118
- refreshRate(device: device & devicesConfig): Promise<void>;
119
- deviceConfig(device: device & devicesConfig): Promise<void>;
120
- deviceLogs(device: device & devicesConfig): Promise<void>;
121
- /**
122
- * Logging for Device
123
- */
124
- infoLog(...log: any[]): void;
125
- warnLog(...log: any[]): void;
126
- debugWarnLog(...log: any[]): void;
127
- errorLog(...log: any[]): void;
128
- debugErrorLog(...log: any[]): void;
129
- debugLog(...log: any[]): void;
130
- enablingDeviceLogging(): boolean;
131
- }
132
- //# sourceMappingURL=bot-old.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot-old.d.ts","sourceRoot":"","sources":["../../src/device/bot-old.ts"],"names":[],"mappings":"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"}