@switchbot/homebridge-switchbot 3.5.0-beta.4 → 3.5.0-beta.41

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 (168) hide show
  1. package/CHANGELOG.md +4 -1
  2. package/config.schema.json +120 -17
  3. package/dist/device/blindtilt.d.ts +21 -94
  4. package/dist/device/blindtilt.d.ts.map +1 -1
  5. package/dist/device/blindtilt.js +351 -757
  6. package/dist/device/blindtilt.js.map +1 -1
  7. package/dist/device/bot.d.ts +25 -71
  8. package/dist/device/bot.d.ts.map +1 -1
  9. package/dist/device/bot.js +587 -761
  10. package/dist/device/bot.js.map +1 -1
  11. package/dist/device/ceilinglight.d.ts +13 -67
  12. package/dist/device/ceilinglight.d.ts.map +1 -1
  13. package/dist/device/ceilinglight.js +213 -588
  14. package/dist/device/ceilinglight.js.map +1 -1
  15. package/dist/device/colorbulb.d.ts +13 -74
  16. package/dist/device/colorbulb.d.ts.map +1 -1
  17. package/dist/device/colorbulb.js +255 -634
  18. package/dist/device/colorbulb.js.map +1 -1
  19. package/dist/device/contact.d.ts +14 -65
  20. package/dist/device/contact.d.ts.map +1 -1
  21. package/dist/device/contact.js +208 -532
  22. package/dist/device/contact.js.map +1 -1
  23. package/dist/device/curtain.d.ts +17 -86
  24. package/dist/device/curtain.d.ts.map +1 -1
  25. package/dist/device/curtain.js +339 -787
  26. package/dist/device/curtain.js.map +1 -1
  27. package/dist/device/device.d.ts +59 -0
  28. package/dist/device/device.d.ts.map +1 -0
  29. package/dist/device/device.js +671 -0
  30. package/dist/device/device.js.map +1 -0
  31. package/dist/device/fan.d.ts +51 -0
  32. package/dist/device/fan.d.ts.map +1 -0
  33. package/dist/device/fan.js +504 -0
  34. package/dist/device/fan.js.map +1 -0
  35. package/dist/device/hub.d.ts +15 -59
  36. package/dist/device/hub.d.ts.map +1 -1
  37. package/dist/device/hub.js +246 -597
  38. package/dist/device/hub.js.map +1 -1
  39. package/dist/device/humidifier.d.ts +10 -65
  40. package/dist/device/humidifier.d.ts.map +1 -1
  41. package/dist/device/humidifier.js +211 -572
  42. package/dist/device/humidifier.js.map +1 -1
  43. package/dist/device/iosensor.d.ts +11 -64
  44. package/dist/device/iosensor.d.ts.map +1 -1
  45. package/dist/device/iosensor.js +178 -585
  46. package/dist/device/iosensor.js.map +1 -1
  47. package/dist/device/lightstrip.d.ts +10 -68
  48. package/dist/device/lightstrip.d.ts.map +1 -1
  49. package/dist/device/lightstrip.js +256 -569
  50. package/dist/device/lightstrip.js.map +1 -1
  51. package/dist/device/lock.d.ts +15 -62
  52. package/dist/device/lock.d.ts.map +1 -1
  53. package/dist/device/lock.js +214 -543
  54. package/dist/device/lock.js.map +1 -1
  55. package/dist/device/meter.d.ts +13 -63
  56. package/dist/device/meter.d.ts.map +1 -1
  57. package/dist/device/meter.js +174 -578
  58. package/dist/device/meter.js.map +1 -1
  59. package/dist/device/meterplus.d.ts +13 -64
  60. package/dist/device/meterplus.d.ts.map +1 -1
  61. package/dist/device/meterplus.js +163 -578
  62. package/dist/device/meterplus.js.map +1 -1
  63. package/dist/device/motion.d.ts +13 -69
  64. package/dist/device/motion.d.ts.map +1 -1
  65. package/dist/device/motion.js +141 -520
  66. package/dist/device/motion.js.map +1 -1
  67. package/dist/device/plug.d.ts +9 -57
  68. package/dist/device/plug.d.ts.map +1 -1
  69. package/dist/device/plug.js +86 -453
  70. package/dist/device/plug.js.map +1 -1
  71. package/dist/device/robotvacuumcleaner.d.ts +11 -62
  72. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  73. package/dist/device/robotvacuumcleaner.js +144 -452
  74. package/dist/device/robotvacuumcleaner.js.map +1 -1
  75. package/dist/device/waterdetector.d.ts +9 -70
  76. package/dist/device/waterdetector.d.ts.map +1 -1
  77. package/dist/device/waterdetector.js +125 -665
  78. package/dist/device/waterdetector.js.map +1 -1
  79. package/dist/homebridge-ui/public/index.html +2 -2
  80. package/dist/index.js +1 -1
  81. package/dist/irdevice/airconditioner.d.ts +8 -48
  82. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  83. package/dist/irdevice/airconditioner.js +309 -419
  84. package/dist/irdevice/airconditioner.js.map +1 -1
  85. package/dist/irdevice/airpurifier.d.ts +7 -38
  86. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  87. package/dist/irdevice/airpurifier.js +72 -304
  88. package/dist/irdevice/airpurifier.js.map +1 -1
  89. package/dist/irdevice/camera.d.ts +6 -35
  90. package/dist/irdevice/camera.d.ts.map +1 -1
  91. package/dist/irdevice/camera.js +34 -278
  92. package/dist/irdevice/camera.js.map +1 -1
  93. package/dist/irdevice/fan.d.ts +6 -39
  94. package/dist/irdevice/fan.d.ts.map +1 -1
  95. package/dist/irdevice/fan.js +67 -311
  96. package/dist/irdevice/fan.js.map +1 -1
  97. package/dist/irdevice/irdevice.d.ts +40 -0
  98. package/dist/irdevice/irdevice.d.ts.map +1 -0
  99. package/dist/irdevice/irdevice.js +512 -0
  100. package/dist/irdevice/irdevice.js.map +1 -0
  101. package/dist/irdevice/light.d.ts +6 -34
  102. package/dist/irdevice/light.d.ts.map +1 -1
  103. package/dist/irdevice/light.js +23 -272
  104. package/dist/irdevice/light.js.map +1 -1
  105. package/dist/irdevice/other.d.ts +18 -47
  106. package/dist/irdevice/other.d.ts.map +1 -1
  107. package/dist/irdevice/other.js +352 -546
  108. package/dist/irdevice/other.js.map +1 -1
  109. package/dist/irdevice/tv.d.ts +7 -39
  110. package/dist/irdevice/tv.d.ts.map +1 -1
  111. package/dist/irdevice/tv.js +82 -321
  112. package/dist/irdevice/tv.js.map +1 -1
  113. package/dist/irdevice/vacuumcleaner.d.ts +6 -35
  114. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  115. package/dist/irdevice/vacuumcleaner.js +41 -284
  116. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  117. package/dist/irdevice/waterheater.d.ts +6 -35
  118. package/dist/irdevice/waterheater.d.ts.map +1 -1
  119. package/dist/irdevice/waterheater.js +42 -287
  120. package/dist/irdevice/waterheater.js.map +1 -1
  121. package/dist/platform.d.ts +14 -1
  122. package/dist/platform.d.ts.map +1 -1
  123. package/dist/platform.js +343 -198
  124. package/dist/platform.js.map +1 -1
  125. package/dist/settings.d.ts +41 -11
  126. package/dist/settings.d.ts.map +1 -1
  127. package/dist/settings.js +0 -552
  128. package/dist/settings.js.map +1 -1
  129. package/dist/utils.d.ts +77 -0
  130. package/dist/utils.d.ts.map +1 -1
  131. package/dist/utils.js +638 -1
  132. package/dist/utils.js.map +1 -1
  133. package/package.json +16 -15
  134. package/src/custom.d.ts +2 -1
  135. package/src/device/blindtilt.ts +377 -783
  136. package/src/device/bot.ts +620 -845
  137. package/src/device/ceilinglight.ts +226 -608
  138. package/src/device/colorbulb.ts +268 -657
  139. package/src/device/contact.ts +233 -554
  140. package/src/device/curtain.ts +359 -811
  141. package/src/device/device.ts +699 -0
  142. package/src/device/fan.ts +553 -0
  143. package/src/device/hub.ts +273 -625
  144. package/src/device/humidifier.ts +241 -619
  145. package/src/device/iosensor.ts +204 -611
  146. package/src/device/lightstrip.ts +277 -597
  147. package/src/device/lock.ts +251 -583
  148. package/src/device/meter.ts +199 -601
  149. package/src/device/meterplus.ts +188 -603
  150. package/src/device/motion.ts +160 -542
  151. package/src/device/plug.ts +96 -481
  152. package/src/device/robotvacuumcleaner.ts +165 -478
  153. package/src/device/waterdetector.ts +142 -689
  154. package/src/homebridge-ui/public/index.html +2 -2
  155. package/src/index.ts +1 -1
  156. package/src/irdevice/airconditioner.ts +330 -446
  157. package/src/irdevice/airpurifier.ts +89 -321
  158. package/src/irdevice/camera.ts +42 -293
  159. package/src/irdevice/fan.ts +78 -327
  160. package/src/irdevice/irdevice.ts +528 -0
  161. package/src/irdevice/light.ts +32 -287
  162. package/src/irdevice/other.ts +396 -615
  163. package/src/irdevice/tv.ts +100 -339
  164. package/src/irdevice/vacuumcleaner.ts +49 -305
  165. package/src/irdevice/waterheater.ts +50 -310
  166. package/src/platform.ts +353 -206
  167. package/src/settings.ts +57 -566
  168. package/src/utils.ts +642 -1
@@ -1,87 +1,52 @@
1
+ /* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * robotvacuumcleaner.ts: @switchbot/homebridge-switchbot.
4
+ */
1
5
  import { request } from 'undici';
2
- import { sleep } from '../utils.js';
3
- import { interval, Subject } from 'rxjs';
4
- import { debounceTime, skipWhile, take, tap } from 'rxjs/operators';
6
+ import { Subject, interval, skipWhile } from 'rxjs';
7
+ import { deviceBase } from './device.js';
8
+ import { debounceTime, take, tap } from 'rxjs/operators';
5
9
  import { Devices } from '../settings.js';
6
- export class RobotVacuumCleaner {
10
+ export class RobotVacuumCleaner extends deviceBase {
7
11
  platform;
8
- accessory;
9
- device;
10
- api;
11
- log;
12
- config;
13
- hap;
14
12
  // Services
15
- batteryService;
16
- robotVacuumCleanerService;
17
- // Characteristic Values
18
- On;
19
- Brightness;
20
- BatteryLevel;
21
- StatusLowBattery;
22
- FirmwareRevision;
23
- // OpenAPI Status
24
- OpenAPI_On;
25
- OpenAPI_BatteryLevel;
26
- OpenAPI_FirmwareRevision;
27
- // BLE Status
28
- BLE_On;
29
- // BLE Others
30
- BLE_IsConnected;
31
- // Config
32
- scanDuration;
33
- deviceLogging;
34
- deviceRefreshRate;
13
+ LightBulb;
14
+ Battery;
35
15
  // Updates
36
16
  robotVacuumCleanerUpdateInProgress;
37
17
  doRobotVacuumCleanerUpdate;
38
- // Connection
39
- OpenAPI;
40
- BLE;
41
18
  constructor(platform, accessory, device) {
19
+ super(platform, accessory, device);
42
20
  this.platform = platform;
43
- this.accessory = accessory;
44
- this.device = device;
45
- this.api = this.platform.api;
46
- this.log = this.platform.log;
47
- this.config = this.platform.config;
48
- this.hap = this.api.hap;
49
- // Connection
50
- this.BLE = this.device.connectionType === 'BLE' || this.device.connectionType === 'BLE/OpenAPI';
51
- this.OpenAPI = this.device.connectionType === 'OpenAPI' || this.device.connectionType === 'BLE/OpenAPI';
52
- // default placeholders
53
- this.deviceLogs(device);
54
- this.scan(device);
55
- this.refreshRate(device);
56
- this.deviceContext();
57
- this.deviceConfig(device);
58
21
  // this is subject we use to track when we need to POST changes to the SwitchBot API
59
22
  this.doRobotVacuumCleanerUpdate = new Subject();
60
23
  this.robotVacuumCleanerUpdateInProgress = false;
24
+ // Initialize Lightbulb property
25
+ this.LightBulb = {
26
+ Service: accessory.getService(this.hap.Service.Lightbulb),
27
+ On: accessory.context.On || false,
28
+ Brightness: accessory.context.Brightness || 0,
29
+ };
30
+ // Initialize Battery property
31
+ this.Battery = {
32
+ Service: accessory.getService(this.hap.Service.Battery),
33
+ BatteryLevel: accessory.context.BatteryLevel || 100,
34
+ StatusLowBattery: accessory.context.StatusLowBattery || this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL,
35
+ };
61
36
  // Retrieve initial values and updateHomekit
62
37
  this.refreshStatus();
63
- // set accessory information
64
- accessory
65
- .getService(this.hap.Service.AccessoryInformation)
66
- .setCharacteristic(this.hap.Characteristic.Manufacturer, 'SwitchBot')
67
- .setCharacteristic(this.hap.Characteristic.Model, this.model(device))
68
- .setCharacteristic(this.hap.Characteristic.SerialNumber, device.deviceId)
69
- .setCharacteristic(this.hap.Characteristic.FirmwareRevision, accessory.context.FirmwareRevision);
70
38
  // get the Lightbulb service if it exists, otherwise create a new Lightbulb service
71
39
  // you can create multiple services for each accessory
72
- const robotVacuumCleanerService = `${accessory.displayName} ${device.deviceType}`;
73
- (this.robotVacuumCleanerService = accessory.getService(this.hap.Service.Lightbulb)
74
- || accessory.addService(this.hap.Service.Lightbulb)), robotVacuumCleanerService;
75
- this.robotVacuumCleanerService.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
76
- if (!this.robotVacuumCleanerService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
77
- this.robotVacuumCleanerService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
78
- }
40
+ const LightBulbService = `${accessory.displayName} ${device.deviceType}`;
41
+ (this.LightBulb.Service = accessory.getService(this.hap.Service.Lightbulb)
42
+ || accessory.addService(this.hap.Service.Lightbulb)), LightBulbService;
43
+ this.LightBulb.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
79
44
  // each service must implement at-minimum the "required characteristics" for the given service type
80
45
  // see https://developers.homebridge.io/#/service/Lightbulb
81
46
  // create handlers for required characteristics
82
- this.robotVacuumCleanerService.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
47
+ this.LightBulb.Service.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
83
48
  // handle Brightness events using the Brightness characteristic
84
- this.robotVacuumCleanerService
49
+ this.LightBulb.Service
85
50
  .getCharacteristic(this.hap.Characteristic.Brightness)
86
51
  .setProps({
87
52
  minStep: 25,
@@ -91,17 +56,14 @@ export class RobotVacuumCleaner {
91
56
  validValueRanges: [0, 100],
92
57
  })
93
58
  .onGet(() => {
94
- return this.Brightness;
59
+ return this.LightBulb.Brightness;
95
60
  })
96
61
  .onSet(this.BrightnessSet.bind(this));
97
62
  // Battery Service
98
- const batteryService = `${accessory.displayName} Battery`;
99
- (this.batteryService = this.accessory.getService(this.hap.Service.Battery)
100
- || accessory.addService(this.hap.Service.Battery)), batteryService;
101
- this.batteryService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Battery`);
102
- if (!this.batteryService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
103
- this.batteryService.addCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Battery`);
104
- }
63
+ const BatteryService = `${accessory.displayName} Battery`;
64
+ (this.Battery.Service = this.accessory.getService(this.hap.Service.Battery)
65
+ || accessory.addService(this.hap.Service.Battery)), BatteryService;
66
+ this.Battery.Service.setCharacteristic(this.hap.Characteristic.Name, BatteryService);
105
67
  // Update Homekit
106
68
  this.updateHomeKitCharacteristics();
107
69
  // Start an update interval
@@ -111,19 +73,20 @@ export class RobotVacuumCleaner {
111
73
  await this.refreshStatus();
112
74
  });
113
75
  //regisiter webhook event handler
114
- if (this.device.webhook) {
115
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
76
+ if (device.webhook) {
77
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
116
78
  this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
117
79
  try {
118
80
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
119
81
  const { onlineStatus, battery } = context;
120
- const { On, BatteryLevel } = this;
82
+ const { On } = this.LightBulb;
83
+ const { BatteryLevel } = this.Battery;
121
84
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
122
85
  '(onlineStatus, battery) = ' +
123
86
  `Webhook:(${onlineStatus}, ${battery}), ` +
124
87
  `current:(${On}, ${BatteryLevel})`);
125
- this.On = onlineStatus === 'online' ? true : false;
126
- this.BatteryLevel = battery;
88
+ this.LightBulb.On = onlineStatus === 'online' ? true : false;
89
+ this.Battery.BatteryLevel = battery;
127
90
  this.updateHomeKitCharacteristics();
128
91
  }
129
92
  catch (e) {
@@ -140,10 +103,10 @@ export class RobotVacuumCleaner {
140
103
  }), debounceTime(this.platform.config.options.pushRate * 1000))
141
104
  .subscribe(async () => {
142
105
  try {
143
- if (this.On !== this.accessory.context.On) {
106
+ if (this.LightBulb.On !== this.accessory.context.On) {
144
107
  await this.pushChanges();
145
108
  }
146
- if (this.On && this.Brightness !== this.accessory.context.Brightness) {
109
+ if (this.LightBulb.On && this.LightBulb.Brightness !== this.accessory.context.Brightness) {
147
110
  await this.openAPIpushBrightnessChanges();
148
111
  }
149
112
  }
@@ -155,57 +118,60 @@ export class RobotVacuumCleaner {
155
118
  this.robotVacuumCleanerUpdateInProgress = false;
156
119
  });
157
120
  }
158
- /**
159
- * Parse the device status from the SwitchBot api
160
- */
161
- async parseStatus() {
162
- if (!this.device.enableCloudService && this.OpenAPI) {
163
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} parseStatus enableCloudService: ${this.device.enableCloudService}`);
164
- /*} else if (this.BLE) {
165
- await this.BLEparseStatus();*/
166
- }
167
- else if (this.OpenAPI && this.platform.config.credentials?.token) {
168
- await this.openAPIparseStatus();
121
+ async BLEparseStatus(serviceData) {
122
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
123
+ // Battery
124
+ this.Battery.BatteryLevel = Number(serviceData.battery);
125
+ if (this.Battery.BatteryLevel < 10) {
126
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
169
127
  }
170
128
  else {
171
- await this.offlineOff();
172
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`);
129
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
173
130
  }
174
- }
175
- async BLEparseStatus() {
176
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
131
+ this.debugLog(`${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}, StatusLowBattery: ${this.Battery.StatusLowBattery}`);
177
132
  // State
178
- switch (this.BLE_On) {
133
+ switch (serviceData.state) {
179
134
  case 'on':
180
- this.On = true;
135
+ this.LightBulb.On = true;
181
136
  break;
182
137
  default:
183
- this.On = false;
138
+ this.LightBulb.On = false;
184
139
  }
185
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
140
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
186
141
  }
187
- async openAPIparseStatus() {
142
+ async openAPIparseStatus(deviceStatus) {
188
143
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
189
- switch (this.OpenAPI_On) {
144
+ switch (deviceStatus.body.power) {
190
145
  case 'on':
191
- this.On = true;
146
+ this.LightBulb.On = true;
192
147
  break;
193
148
  default:
194
- this.On = false;
149
+ this.LightBulb.On = false;
195
150
  }
196
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
197
- // Battery
198
- this.BatteryLevel = Number(this.OpenAPI_BatteryLevel);
199
- if (this.BatteryLevel < 15) {
200
- this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
151
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
152
+ // BatteryLevel
153
+ this.Battery.BatteryLevel = Number(deviceStatus.body.battery);
154
+ if (this.Battery.BatteryLevel < 10) {
155
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
201
156
  }
202
157
  else {
203
- this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
158
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
159
+ }
160
+ if (Number.isNaN(this.Battery.BatteryLevel)) {
161
+ this.Battery.BatteryLevel = 100;
162
+ }
163
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},`
164
+ + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
165
+ // Firmware Version
166
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${deviceStatus.body.version}`);
167
+ if (deviceStatus.body.version) {
168
+ this.accessory.context.version = deviceStatus.body.version;
169
+ this.accessory
170
+ .getService(this.hap.Service.AccessoryInformation)
171
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
172
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
173
+ .updateValue(this.accessory.context.version);
204
174
  }
205
- this.debugLog(`${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}, StatusLowBattery: ${this.StatusLowBattery}`);
206
- // FirmwareRevision
207
- this.FirmwareRevision = this.OpenAPI_FirmwareRevision;
208
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
209
175
  }
210
176
  /**
211
177
  * Asks the SwitchBot API for the latest device information
@@ -247,7 +213,6 @@ export class RobotVacuumCleaner {
247
213
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.serviceData.model}`);
248
214
  if (this.device.bleMac === ad.address && ad.serviceData.model === '?') {
249
215
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
250
- this.BLE_On = ad.serviceData.state;
251
216
  }
252
217
  else {
253
218
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
@@ -258,7 +223,7 @@ export class RobotVacuumCleaner {
258
223
  // Stop to monitor
259
224
  await switchbot.stopScan();
260
225
  // Update HomeKit
261
- await this.BLEparseStatus();
226
+ await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
262
227
  await this.updateHomeKitCharacteristics();
263
228
  })();
264
229
  /*if (switchbot !== false) {
@@ -274,7 +239,7 @@ export class RobotVacuumCleaner {
274
239
  `${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
275
240
  ` BLE Address Found: ${ad.address}`,
276
241
  );
277
- this.BLE_On = ad.serviceData.state;
242
+ serviceData.state = ad.serviceData.state;
278
243
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
279
244
  this.debugLog(
280
245
  `${this.device.deviceType}: ${this.accessory.displayName} state: ${ad.serviceData.state}, ` +
@@ -313,7 +278,7 @@ export class RobotVacuumCleaner {
313
278
  async openAPIRefreshStatus() {
314
279
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
315
280
  try {
316
- const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/status`, {
281
+ const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, {
317
282
  headers: this.platform.generateHeaders(),
318
283
  });
319
284
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
@@ -321,12 +286,9 @@ export class RobotVacuumCleaner {
321
286
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
322
287
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
323
288
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
324
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
289
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
325
290
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
326
- this.OpenAPI_On = deviceStatus.body.power;
327
- this.OpenAPI_BatteryLevel = deviceStatus.body.battery;
328
- this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
329
- this.openAPIparseStatus();
291
+ this.openAPIparseStatus(deviceStatus);
330
292
  this.updateHomeKitCharacteristics();
331
293
  }
332
294
  else {
@@ -371,8 +333,9 @@ export class RobotVacuumCleaner {
371
333
  }
372
334
  async BLEpushChanges() {
373
335
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`);
374
- if (this.On !== this.accessory.context.On) {
375
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges On: ${this.On} OnCached: ${this.accessory.context.On}`);
336
+ if (this.LightBulb.On !== this.accessory.context.On) {
337
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`
338
+ + ` On: ${this.LightBulb.On} OnCached: ${this.accessory.context.On}`);
376
339
  const switchbot = await this.platform.connectBLE();
377
340
  // Convert to BLE Address
378
341
  this.device.bleMac = this.device
@@ -386,11 +349,11 @@ export class RobotVacuumCleaner {
386
349
  id: this.device.bleMac,
387
350
  })
388
351
  .then(async (device_list) => {
389
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
390
- return await this.retry({
391
- max: this.maxRetry(),
352
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
353
+ return await this.retryBLE({
354
+ max: await this.maxRetryBLE(),
392
355
  fn: async () => {
393
- if (this.On) {
356
+ if (this.LightBulb.On) {
394
357
  return await device_list[0].turnOn({ id: this.device.bleMac });
395
358
  }
396
359
  else {
@@ -401,7 +364,9 @@ export class RobotVacuumCleaner {
401
364
  })
402
365
  .then(() => {
403
366
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
404
- this.On = false;
367
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
368
+ + `On: ${this.LightBulb.On} sent over BLE, sent successfully`);
369
+ this.LightBulb.On = false;
405
370
  })
406
371
  .catch(async (e) => {
407
372
  this.apiError(e);
@@ -411,24 +376,14 @@ export class RobotVacuumCleaner {
411
376
  });
412
377
  }
413
378
  else {
414
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges.` + `On: ${this.On}, ` + `OnCached: ${this.accessory.context.On}`);
379
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges,`
380
+ + ` On: ${this.LightBulb.On}, OnCached: ${this.accessory.context.On}`);
415
381
  }
416
382
  }
417
383
  async openAPIpushChanges() {
418
384
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
419
- if (this.On !== this.accessory.context.On) {
420
- let command = '';
421
- if (this.On) {
422
- command = 'turnOn';
423
- }
424
- else {
425
- command = 'turnOff';
426
- }
427
- const bodyChange = JSON.stringify({
428
- command: `${command}`,
429
- parameter: 'default',
430
- commandType: 'command',
431
- });
385
+ if (this.LightBulb.On !== this.accessory.context.On) {
386
+ const bodyChange = await this.commands();
432
387
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
433
388
  try {
434
389
  const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/commands`, {
@@ -444,6 +399,8 @@ export class RobotVacuumCleaner {
444
399
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
445
400
  this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
446
401
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
402
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
403
+ + `request to SwitchBot API, body: ${JSON.stringify(bodyChange)} sent successfully`);
447
404
  }
448
405
  else {
449
406
  this.statusCode(statusCode);
@@ -458,16 +415,17 @@ export class RobotVacuumCleaner {
458
415
  }
459
416
  else {
460
417
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges.` +
461
- `On: ${this.On}, ` +
418
+ `On: ${this.LightBulb.On}, ` +
462
419
  `OnCached: ${this.accessory.context.On}`);
463
420
  }
464
421
  }
465
422
  async openAPIpushBrightnessChanges() {
466
423
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushBrightnessChanges`);
467
- const body = await this.brightnessCommands();
468
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${body},`);
424
+ const bodyChange = await this.brightnessCommands();
425
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
469
426
  try {
470
427
  const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/commands`, {
428
+ body: bodyChange,
471
429
  method: 'POST',
472
430
  headers: this.platform.generateHeaders(),
473
431
  });
@@ -476,8 +434,10 @@ export class RobotVacuumCleaner {
476
434
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
477
435
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
478
436
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
479
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
437
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
480
438
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
439
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
440
+ + `request to SwitchBot API, body: ${deviceStatus} sent successfully`);
481
441
  }
482
442
  else {
483
443
  this.statusCode(statusCode);
@@ -490,10 +450,10 @@ export class RobotVacuumCleaner {
490
450
  ` Connection, Error Message: ${JSON.stringify(e.message)}`);
491
451
  }
492
452
  }
493
- commands() {
453
+ async commands() {
494
454
  let command;
495
455
  let parameter;
496
- if (this.On) {
456
+ if (this.LightBulb.On) {
497
457
  command = 'start';
498
458
  parameter = 'default';
499
459
  }
@@ -508,22 +468,22 @@ export class RobotVacuumCleaner {
508
468
  });
509
469
  return body;
510
470
  }
511
- brightnessCommands() {
471
+ async brightnessCommands() {
512
472
  let command;
513
473
  let parameter;
514
- if (this.Brightness === 25) {
474
+ if (this.LightBulb.Brightness === 25) {
515
475
  command = 'PowLevel';
516
476
  parameter = '0';
517
477
  }
518
- else if (this.Brightness === 50) {
478
+ else if (this.LightBulb.Brightness === 50) {
519
479
  command = 'PowLevel';
520
480
  parameter = '1';
521
481
  }
522
- else if (this.Brightness === 75) {
482
+ else if (this.LightBulb.Brightness === 75) {
523
483
  command = 'PowLevel';
524
484
  parameter = '2';
525
485
  }
526
- else if (this.Brightness === 100) {
486
+ else if (this.LightBulb.Brightness === 100) {
527
487
  command = 'PowLevel';
528
488
  parameter = '3';
529
489
  }
@@ -531,105 +491,79 @@ export class RobotVacuumCleaner {
531
491
  command = 'dock';
532
492
  parameter = 'default';
533
493
  }
534
- const body = JSON.stringify({
494
+ const bodyChange = JSON.stringify({
535
495
  command: `${command}`,
536
496
  parameter: `${parameter}`,
537
497
  commandType: 'command',
538
498
  });
539
- return body;
499
+ return bodyChange;
540
500
  }
541
501
  /**
542
502
  * Handle requests to set the value of the "On" characteristic
543
503
  */
544
504
  async OnSet(value) {
545
- if (this.On === this.accessory.context.On) {
505
+ if (this.LightBulb.On === this.accessory.context.On) {
546
506
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set On: ${value}`);
547
507
  }
548
508
  else {
549
509
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set On: ${value}`);
550
510
  }
551
- this.On = value;
511
+ this.LightBulb.On = value;
552
512
  this.doRobotVacuumCleanerUpdate.next();
553
513
  }
554
514
  /**
555
515
  * Handle requests to set the value of the "Brightness" characteristic
556
516
  */
557
517
  async BrightnessSet(value) {
558
- if (this.Brightness === this.accessory.context.Brightness) {
518
+ if (this.LightBulb.Brightness === this.accessory.context.Brightness) {
559
519
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Brightness: ${value}`);
560
520
  }
561
- else if (this.On) {
521
+ else if (this.LightBulb.On) {
562
522
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
563
523
  }
564
524
  else {
565
525
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
566
526
  }
567
- this.Brightness = value;
527
+ this.LightBulb.Brightness = value;
568
528
  this.doRobotVacuumCleanerUpdate.next();
569
529
  }
570
530
  async updateHomeKitCharacteristics() {
571
531
  // On
572
- if (this.On === undefined) {
573
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
532
+ if (this.LightBulb.On === undefined) {
533
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
574
534
  }
575
535
  else {
576
- this.accessory.context.On = this.On;
577
- this.robotVacuumCleanerService.updateCharacteristic(this.hap.Characteristic.On, this.On);
578
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
536
+ this.accessory.context.On = this.LightBulb.On;
537
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, this.LightBulb.On);
538
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.LightBulb.On}`);
579
539
  }
580
540
  // Brightness
581
- if (this.Brightness === undefined) {
582
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
541
+ if (this.LightBulb.Brightness === undefined) {
542
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
583
543
  }
584
544
  else {
585
- this.accessory.context.Brightness = this.Brightness;
586
- this.robotVacuumCleanerService.updateCharacteristic(this.hap.Characteristic.Brightness, this.Brightness);
587
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.Brightness}`);
545
+ this.accessory.context.Brightness = this.LightBulb.Brightness;
546
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, this.LightBulb.Brightness);
547
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.LightBulb.Brightness}`);
588
548
  }
589
549
  // BatteryLevel
590
- if (this.BatteryLevel === undefined) {
591
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}`);
550
+ if (this.Battery.BatteryLevel === undefined) {
551
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
592
552
  }
593
553
  else {
594
- this.accessory.context.BatteryLevel = this.BatteryLevel;
595
- this.batteryService?.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.BatteryLevel);
596
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.BatteryLevel}`);
554
+ this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
555
+ this.Battery.Service?.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
556
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`);
597
557
  }
598
558
  // StatusLowBattery
599
- if (this.StatusLowBattery === undefined) {
600
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.StatusLowBattery}`);
559
+ if (this.Battery.StatusLowBattery === undefined) {
560
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
601
561
  }
602
562
  else {
603
- this.accessory.context.StatusLowBattery = this.StatusLowBattery;
604
- this.batteryService?.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.StatusLowBattery);
605
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic StatusLowBattery: ${this.StatusLowBattery}`);
606
- }
607
- }
608
- async stopScanning(switchbot) {
609
- switchbot.stopScan();
610
- if (this.BLE_IsConnected) {
611
- await this.BLEparseStatus();
612
- await this.updateHomeKitCharacteristics();
613
- }
614
- else {
615
- await this.BLERefreshConnection(switchbot);
616
- }
617
- }
618
- async getCustomBLEAddress(switchbot) {
619
- if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
620
- (async () => {
621
- // Start to monitor advertisement packets
622
- await switchbot.startScan({
623
- model: '?',
624
- });
625
- // Set an event handler
626
- switchbot.onadvertisement = (ad) => {
627
- this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} ad: ${JSON.stringify(ad, null, ' ')}`);
628
- };
629
- await sleep(10000);
630
- // Stop to monitor
631
- switchbot.stopScan();
632
- })();
563
+ this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
564
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
565
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
566
+ + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
633
567
  }
634
568
  }
635
569
  async BLEPushConnection() {
@@ -646,255 +580,13 @@ export class RobotVacuumCleaner {
646
580
  await this.openAPIRefreshStatus();
647
581
  }
648
582
  }
649
- async retry({ max, fn }) {
650
- return fn().catch(async (e) => {
651
- if (max === 0) {
652
- throw e;
653
- }
654
- this.infoLog(e);
655
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Retrying`);
656
- await sleep(1000);
657
- return this.retry({ max: max - 1, fn });
658
- });
659
- }
660
- maxRetry() {
661
- if (this.device.maxRetry) {
662
- return this.device.maxRetry;
663
- }
664
- else {
665
- return 5;
666
- }
667
- }
668
- model(device) {
669
- let model;
670
- if (device.deviceType === 'Robot Vacuum Cleaner S1 Plus') {
671
- model = 'W3011010';
672
- }
673
- else if (device.deviceType === 'Robot Vacuum Cleaner S1') {
674
- model = 'W3011000';
675
- }
676
- else {
677
- model = 'N/A';
678
- }
679
- return model;
680
- }
681
- async scan(device) {
682
- if (device.scanDuration) {
683
- this.scanDuration = this.accessory.context.scanDuration = device.scanDuration;
684
- if (this.BLE) {
685
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config scanDuration: ${this.scanDuration}`);
686
- }
687
- }
688
- else {
689
- this.scanDuration = this.accessory.context.scanDuration = 1;
690
- if (this.BLE) {
691
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default scanDuration: ${this.scanDuration}`);
692
- }
693
- }
694
- }
695
- async statusCode(statusCode) {
696
- switch (statusCode) {
697
- case 151:
698
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
699
- break;
700
- case 152:
701
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
702
- break;
703
- case 160:
704
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
705
- break;
706
- case 161:
707
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
708
- this.offlineOff();
709
- break;
710
- case 171:
711
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
712
- `Hub: ${this.device.hubDeviceId}`);
713
- this.offlineOff();
714
- break;
715
- case 190:
716
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
717
- ` Or command format is invalid, statusCode: ${statusCode}`);
718
- break;
719
- case 100:
720
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
721
- break;
722
- case 200:
723
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
724
- break;
725
- case 400:
726
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
727
- + `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
728
- break;
729
- case 401:
730
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
731
- + `but the request has not been authenticated, statusCode: ${statusCode}`);
732
- break;
733
- case 403:
734
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
735
- + `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
736
- break;
737
- case 404:
738
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
739
- + `statusCode: ${statusCode}`);
740
- break;
741
- case 406:
742
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
743
- + `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
744
- break;
745
- case 415:
746
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
747
- + `header that is not supported by the server, statusCode: ${statusCode}`);
748
- break;
749
- case 422:
750
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
751
- + `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
752
- break;
753
- case 429:
754
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
755
- + `requests allowed for a given time window, statusCode: ${statusCode}`);
756
- break;
757
- case 500:
758
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
759
- + `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
760
- break;
761
- default:
762
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
763
- `${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`);
764
- }
765
- }
766
583
  async offlineOff() {
767
584
  if (this.device.offline) {
768
- await this.deviceContext();
769
- await this.updateHomeKitCharacteristics();
585
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, false);
770
586
  }
771
587
  }
772
588
  async apiError(e) {
773
- this.robotVacuumCleanerService.updateCharacteristic(this.hap.Characteristic.On, e);
774
- }
775
- async deviceContext() {
776
- if (this.On === undefined) {
777
- this.On = false;
778
- }
779
- else {
780
- this.On = this.accessory.context.On;
781
- }
782
- if (this.Brightness === undefined) {
783
- this.Brightness = 0;
784
- }
785
- else {
786
- this.Brightness = this.accessory.context.Brightness;
787
- }
788
- if (this.FirmwareRevision === undefined) {
789
- this.FirmwareRevision = this.platform.version;
790
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
791
- }
792
- }
793
- async refreshRate(device) {
794
- if (device.refreshRate) {
795
- this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate;
796
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
797
- }
798
- else if (this.platform.config.options.refreshRate) {
799
- this.deviceRefreshRate = this.accessory.context.refreshRate = this.platform.config.options.refreshRate;
800
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
801
- }
802
- }
803
- async deviceConfig(device) {
804
- let config = {};
805
- if (device.plug) {
806
- config = device.plug;
807
- }
808
- if (device.connectionType !== undefined) {
809
- config['connectionType'] = device.connectionType;
810
- }
811
- if (device.external !== undefined) {
812
- config['external'] = device.external;
813
- }
814
- if (device.logging !== undefined) {
815
- config['logging'] = device.logging;
816
- }
817
- if (device.refreshRate !== undefined) {
818
- config['refreshRate'] = device.refreshRate;
819
- }
820
- if (device.scanDuration !== undefined) {
821
- config['scanDuration'] = device.scanDuration;
822
- }
823
- if (device.offline !== undefined) {
824
- config['offline'] = device.offline;
825
- }
826
- if (device.maxRetry !== undefined) {
827
- config['maxRetry'] = device.maxRetry;
828
- }
829
- if (device.webhook !== undefined) {
830
- config['webhook'] = device.webhook;
831
- }
832
- if (Object.entries(config).length !== 0) {
833
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
834
- }
835
- }
836
- async deviceLogs(device) {
837
- if (this.platform.debugMode) {
838
- this.deviceLogging = this.accessory.context.logging = 'debugMode';
839
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
840
- }
841
- else if (device.logging) {
842
- this.deviceLogging = this.accessory.context.logging = device.logging;
843
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
844
- }
845
- else if (this.platform.config.options?.logging) {
846
- this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
847
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
848
- }
849
- else {
850
- this.deviceLogging = this.accessory.context.logging = 'standard';
851
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
852
- }
853
- }
854
- /**
855
- * Logging for Device
856
- */
857
- infoLog(...log) {
858
- if (this.enablingDeviceLogging()) {
859
- this.platform.log.info(String(...log));
860
- }
861
- }
862
- warnLog(...log) {
863
- if (this.enablingDeviceLogging()) {
864
- this.platform.log.warn(String(...log));
865
- }
866
- }
867
- debugWarnLog(...log) {
868
- if (this.enablingDeviceLogging()) {
869
- if (this.deviceLogging?.includes('debug')) {
870
- this.platform.log.warn('[DEBUG]', String(...log));
871
- }
872
- }
873
- }
874
- errorLog(...log) {
875
- if (this.enablingDeviceLogging()) {
876
- this.platform.log.error(String(...log));
877
- }
878
- }
879
- debugErrorLog(...log) {
880
- if (this.enablingDeviceLogging()) {
881
- if (this.deviceLogging?.includes('debug')) {
882
- this.platform.log.error('[DEBUG]', String(...log));
883
- }
884
- }
885
- }
886
- debugLog(...log) {
887
- if (this.enablingDeviceLogging()) {
888
- if (this.deviceLogging === 'debug') {
889
- this.platform.log.info('[DEBUG]', String(...log));
890
- }
891
- else {
892
- this.platform.log.debug(String(...log));
893
- }
894
- }
895
- }
896
- enablingDeviceLogging() {
897
- return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
589
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, e);
898
590
  }
899
591
  }
900
592
  //# sourceMappingURL=robotvacuumcleaner.js.map