@switchbot/homebridge-switchbot 3.5.0-beta.8 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/.vscode/settings.json +4 -1
  2. package/CHANGELOG.md +4 -1
  3. package/config.schema.json +170 -26
  4. package/dist/device/blindtilt.d.ts +21 -96
  5. package/dist/device/blindtilt.d.ts.map +1 -1
  6. package/dist/device/blindtilt.js +439 -817
  7. package/dist/device/blindtilt.js.map +1 -1
  8. package/dist/device/bot.d.ts +27 -72
  9. package/dist/device/bot.d.ts.map +1 -1
  10. package/dist/device/bot.js +835 -865
  11. package/dist/device/bot.js.map +1 -1
  12. package/dist/device/ceilinglight.d.ts +15 -69
  13. package/dist/device/ceilinglight.d.ts.map +1 -1
  14. package/dist/device/ceilinglight.js +287 -653
  15. package/dist/device/ceilinglight.js.map +1 -1
  16. package/dist/device/colorbulb.d.ts +15 -76
  17. package/dist/device/colorbulb.d.ts.map +1 -1
  18. package/dist/device/colorbulb.js +354 -732
  19. package/dist/device/colorbulb.js.map +1 -1
  20. package/dist/device/contact.d.ts +14 -66
  21. package/dist/device/contact.d.ts.map +1 -1
  22. package/dist/device/contact.js +268 -576
  23. package/dist/device/contact.js.map +1 -1
  24. package/dist/device/curtain.d.ts +18 -89
  25. package/dist/device/curtain.d.ts.map +1 -1
  26. package/dist/device/curtain.js +431 -851
  27. package/dist/device/curtain.js.map +1 -1
  28. package/dist/device/device.d.ts +60 -0
  29. package/dist/device/device.d.ts.map +1 -0
  30. package/dist/device/device.js +739 -0
  31. package/dist/device/device.js.map +1 -0
  32. package/dist/device/fan.d.ts +63 -0
  33. package/dist/device/fan.d.ts.map +1 -0
  34. package/dist/device/fan.js +698 -0
  35. package/dist/device/fan.js.map +1 -0
  36. package/dist/device/hub.d.ts +15 -60
  37. package/dist/device/hub.d.ts.map +1 -1
  38. package/dist/device/hub.js +257 -631
  39. package/dist/device/hub.js.map +1 -1
  40. package/dist/device/humidifier.d.ts +11 -66
  41. package/dist/device/humidifier.d.ts.map +1 -1
  42. package/dist/device/humidifier.js +266 -629
  43. package/dist/device/humidifier.js.map +1 -1
  44. package/dist/device/iosensor.d.ts +12 -64
  45. package/dist/device/iosensor.d.ts.map +1 -1
  46. package/dist/device/iosensor.js +215 -615
  47. package/dist/device/iosensor.js.map +1 -1
  48. package/dist/device/lightstrip.d.ts +12 -70
  49. package/dist/device/lightstrip.d.ts.map +1 -1
  50. package/dist/device/lightstrip.js +336 -645
  51. package/dist/device/lightstrip.js.map +1 -1
  52. package/dist/device/lock.d.ts +17 -63
  53. package/dist/device/lock.d.ts.map +1 -1
  54. package/dist/device/lock.js +290 -595
  55. package/dist/device/lock.js.map +1 -1
  56. package/dist/device/meter.d.ts +15 -64
  57. package/dist/device/meter.d.ts.map +1 -1
  58. package/dist/device/meter.js +211 -608
  59. package/dist/device/meter.js.map +1 -1
  60. package/dist/device/meterplus.d.ts +15 -65
  61. package/dist/device/meterplus.d.ts.map +1 -1
  62. package/dist/device/meterplus.js +205 -615
  63. package/dist/device/meterplus.js.map +1 -1
  64. package/dist/device/motion.d.ts +12 -69
  65. package/dist/device/motion.d.ts.map +1 -1
  66. package/dist/device/motion.js +202 -563
  67. package/dist/device/motion.js.map +1 -1
  68. package/dist/device/plug.d.ts +10 -57
  69. package/dist/device/plug.d.ts.map +1 -1
  70. package/dist/device/plug.js +125 -484
  71. package/dist/device/plug.js.map +1 -1
  72. package/dist/device/robotvacuumcleaner.d.ts +13 -63
  73. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  74. package/dist/device/robotvacuumcleaner.js +233 -549
  75. package/dist/device/robotvacuumcleaner.js.map +1 -1
  76. package/dist/device/waterdetector.d.ts +11 -63
  77. package/dist/device/waterdetector.d.ts.map +1 -1
  78. package/dist/device/waterdetector.js +170 -493
  79. package/dist/device/waterdetector.js.map +1 -1
  80. package/dist/homebridge-ui/public/index.html +22 -16
  81. package/dist/homebridge-ui/server.js +1 -1
  82. package/dist/homebridge-ui/server.js.map +1 -1
  83. package/dist/index.d.ts +1 -1
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +2 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/irdevice/airconditioner.d.ts +10 -50
  88. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  89. package/dist/irdevice/airconditioner.js +340 -468
  90. package/dist/irdevice/airconditioner.js.map +1 -1
  91. package/dist/irdevice/airpurifier.d.ts +8 -39
  92. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  93. package/dist/irdevice/airpurifier.js +105 -319
  94. package/dist/irdevice/airpurifier.js.map +1 -1
  95. package/dist/irdevice/camera.d.ts +7 -36
  96. package/dist/irdevice/camera.d.ts.map +1 -1
  97. package/dist/irdevice/camera.js +44 -285
  98. package/dist/irdevice/camera.js.map +1 -1
  99. package/dist/irdevice/fan.d.ts +7 -43
  100. package/dist/irdevice/fan.d.ts.map +1 -1
  101. package/dist/irdevice/fan.js +92 -350
  102. package/dist/irdevice/fan.js.map +1 -1
  103. package/dist/irdevice/irdevice.d.ts +40 -0
  104. package/dist/irdevice/irdevice.d.ts.map +1 -0
  105. package/dist/irdevice/irdevice.js +369 -0
  106. package/dist/irdevice/irdevice.js.map +1 -0
  107. package/dist/irdevice/light.d.ts +12 -45
  108. package/dist/irdevice/light.d.ts.map +1 -1
  109. package/dist/irdevice/light.js +118 -362
  110. package/dist/irdevice/light.js.map +1 -1
  111. package/dist/irdevice/other.d.ts +19 -48
  112. package/dist/irdevice/other.d.ts.map +1 -1
  113. package/dist/irdevice/other.js +438 -570
  114. package/dist/irdevice/other.js.map +1 -1
  115. package/dist/irdevice/tv.d.ts +8 -40
  116. package/dist/irdevice/tv.d.ts.map +1 -1
  117. package/dist/irdevice/tv.js +91 -339
  118. package/dist/irdevice/tv.js.map +1 -1
  119. package/dist/irdevice/vacuumcleaner.d.ts +7 -36
  120. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  121. package/dist/irdevice/vacuumcleaner.js +45 -285
  122. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  123. package/dist/irdevice/waterheater.d.ts +7 -36
  124. package/dist/irdevice/waterheater.d.ts.map +1 -1
  125. package/dist/irdevice/waterheater.js +47 -291
  126. package/dist/irdevice/waterheater.js.map +1 -1
  127. package/dist/platform.d.ts +22 -8
  128. package/dist/platform.d.ts.map +1 -1
  129. package/dist/platform.js +342 -191
  130. package/dist/platform.js.map +1 -1
  131. package/dist/settings.d.ts +64 -17
  132. package/dist/settings.d.ts.map +1 -1
  133. package/dist/settings.js +16 -552
  134. package/dist/settings.js.map +1 -1
  135. package/dist/utils.d.ts +77 -0
  136. package/dist/utils.d.ts.map +1 -1
  137. package/dist/utils.js +638 -1
  138. package/dist/utils.js.map +1 -1
  139. package/eslint.config.js +96 -0
  140. package/package.json +20 -16
  141. package/src/custom.d.ts +2 -1
  142. package/src/device/blindtilt.ts +472 -888
  143. package/src/device/bot.ts +893 -968
  144. package/src/device/ceilinglight.ts +304 -709
  145. package/src/device/colorbulb.ts +370 -803
  146. package/src/device/contact.ts +301 -611
  147. package/src/device/curtain.ts +460 -908
  148. package/src/device/device.ts +755 -0
  149. package/src/device/fan.ts +749 -0
  150. package/src/device/hub.ts +294 -664
  151. package/src/device/humidifier.ts +299 -696
  152. package/src/device/iosensor.ts +251 -644
  153. package/src/device/lightstrip.ts +362 -712
  154. package/src/device/lock.ts +328 -653
  155. package/src/device/meter.ts +247 -637
  156. package/src/device/meterplus.ts +240 -644
  157. package/src/device/motion.ts +230 -598
  158. package/src/device/plug.ts +139 -525
  159. package/src/device/robotvacuumcleaner.ts +258 -593
  160. package/src/device/waterdetector.ts +191 -522
  161. package/src/homebridge-ui/public/index.html +22 -16
  162. package/src/homebridge-ui/server.ts +1 -1
  163. package/src/index.ts +4 -3
  164. package/src/irdevice/airconditioner.ts +370 -527
  165. package/src/irdevice/airpurifier.ts +132 -356
  166. package/src/irdevice/camera.ts +58 -311
  167. package/src/irdevice/fan.ts +109 -379
  168. package/src/irdevice/irdevice.ts +382 -0
  169. package/src/irdevice/light.ts +157 -412
  170. package/src/irdevice/other.ts +507 -648
  171. package/src/irdevice/tv.ts +121 -375
  172. package/src/irdevice/vacuumcleaner.ts +59 -311
  173. package/src/irdevice/waterheater.ts +61 -320
  174. package/src/platform.ts +395 -259
  175. package/src/settings.ts +118 -609
  176. package/src/utils.ts +642 -1
  177. package/.github/npm-version-script.cjs +0 -81
  178. package/src/device/waterdetector.json +0 -11
@@ -1,152 +1,110 @@
1
+ /* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * blindtilt.ts: @switchbot/homebridge-switchbot.
4
+ */
1
5
  import { request } from 'undici';
2
- import { sleep } from '../utils.js';
6
+ import { deviceBase } from './device.js';
3
7
  import { interval, Subject } from 'rxjs';
4
- import { SwitchBotPlatform } from '../platform.js';
8
+ import { Devices } from '../settings.js';
9
+ import { hs2rgb, rgb2hs, m2hs } from '../utils.js';
5
10
  import { debounceTime, skipWhile, take, tap } from 'rxjs/operators';
6
- import { device, devicesConfig, deviceStatus, hs2rgb, rgb2hs, m2hs, serviceData, Devices, SwitchBotPlatformConfig } from '../settings.js';
7
- import {
8
- Service, PlatformAccessory, CharacteristicValue, ControllerConstructor, Controller, ControllerServiceMap, API, Logging, HAP,
9
- } from 'homebridge';
11
+
12
+ import type { SwitchBotPlatform } from '../platform.js';
13
+ import type { device, devicesConfig, deviceStatus, serviceData } from '../settings.js';
14
+ import type { Service, PlatformAccessory, CharacteristicValue, ControllerConstructor, Controller, ControllerServiceMap } from 'homebridge';
10
15
 
11
16
  /**
12
17
  * Platform Accessory
13
18
  * An instance of this class is created for each accessory your platform registers
14
19
  * Each accessory may expose multiple services of different service types.
15
20
  */
16
- export class ColorBulb {
17
- public readonly api: API;
18
- public readonly log: Logging;
19
- public readonly config!: SwitchBotPlatformConfig;
20
- protected readonly hap: HAP;
21
+ export class ColorBulb extends deviceBase {
21
22
  // Services
22
- lightBulbService!: Service;
23
-
24
- // Characteristic Values
25
- On!: CharacteristicValue;
26
- Hue!: CharacteristicValue;
27
- Saturation!: CharacteristicValue;
28
- Brightness!: CharacteristicValue;
29
- FirmwareRevision!: CharacteristicValue;
30
- ColorTemperature?: CharacteristicValue;
31
-
32
- // OpenAPI Status
33
- OpenAPI_On: deviceStatus['power'];
34
- OpenAPI_RGB: deviceStatus['color'];
35
- OpenAPI_Brightness: deviceStatus['brightness'];
36
- OpenAPI_FirmwareRevision: deviceStatus['version'];
37
- OpenAPI_ColorTemperature?: deviceStatus['colorTemperature'];
38
-
39
- // BLE Status
40
- BLE_ColorTemperature: serviceData['color_temperature'];
41
- BLE_Power: serviceData['power'];
42
- BLE_Red: serviceData['red'];
43
- BLE_Blue: serviceData['blue'];
44
- BLE_Green: serviceData['green'];
45
- BLE_On: serviceData['state'];
46
- BLE_Delay: serviceData['delay'];
47
- BLE_WifiRssi: serviceData['wifiRssi'];
48
- BLE_Brightness: serviceData['brightness'];
49
- BLE_Saturation;
50
- BLE_Hue;
51
-
52
- // BLE Others
53
- BLE_IsConnected?: boolean;
54
-
55
- // Config
56
- set_minStep?: number;
57
- scanDuration!: number;
58
- deviceLogging!: string;
59
- deviceRefreshRate!: number;
60
- adaptiveLightingShift?: number;
23
+ private LightBulb: {
24
+ Name: CharacteristicValue;
25
+ Service: Service;
26
+ On: CharacteristicValue;
27
+ Hue: CharacteristicValue;
28
+ Saturation: CharacteristicValue;
29
+ Brightness: CharacteristicValue;
30
+ ColorTemperature?: CharacteristicValue;
31
+ };
61
32
 
62
33
  // Adaptive Lighting
63
34
  AdaptiveLightingController?: ControllerConstructor | Controller<ControllerServiceMap>;
64
- minKelvin!: number;
65
- maxKelvin!: number;
66
-
67
- // Others
68
- cacheKelvin!: number;
35
+ adaptiveLightingShift?: number;
69
36
 
70
37
  // Updates
71
38
  colorBulbUpdateInProgress!: boolean;
72
39
  doColorBulbUpdate!: Subject<void>;
73
40
 
74
- // Connection
75
- private readonly OpenAPI: boolean;
76
- private readonly BLE: boolean;
77
-
78
41
  constructor(
79
- private readonly platform: SwitchBotPlatform,
80
- private accessory: PlatformAccessory,
81
- public device: device & devicesConfig,
42
+ readonly platform: SwitchBotPlatform,
43
+ accessory: PlatformAccessory,
44
+ device: device & devicesConfig,
82
45
  ) {
83
- this.api = this.platform.api;
84
- this.log = this.platform.log;
85
- this.config = this.platform.config;
86
- this.hap = this.api.hap;
87
- // Connection
88
- this.BLE = this.device.connectionType === 'BLE' || this.device.connectionType === 'BLE/OpenAPI';
89
- this.OpenAPI = this.device.connectionType === 'OpenAPI' || this.device.connectionType === 'BLE/OpenAPI';
46
+ super(platform, accessory, device);
90
47
  // default placeholders
91
- this.deviceLogs(device);
92
- this.scan(device);
93
- this.refreshRate(device);
94
48
  this.adaptiveLighting(device);
95
- this.deviceContext();
96
- this.deviceConfig(device);
97
49
 
98
50
  // this is subject we use to track when we need to POST changes to the SwitchBot API
99
51
  this.doColorBulbUpdate = new Subject();
100
52
  this.colorBulbUpdateInProgress = false;
101
53
 
102
- // Retrieve initial values and updateHomekit
103
- this.refreshStatus();
104
-
105
- // set accessory information
106
- accessory
107
- .getService(this.hap.Service.AccessoryInformation)!
108
- .setCharacteristic(this.hap.Characteristic.Manufacturer, 'SwitchBot')
109
- .setCharacteristic(this.hap.Characteristic.Model, 'W1401400')
110
- .setCharacteristic(this.hap.Characteristic.SerialNumber, device.deviceId)
111
- .setCharacteristic(this.hap.Characteristic.FirmwareRevision, accessory.context.FirmwareRevision);
112
-
113
- // get the Lightbulb service if it exists, otherwise create a new Lightbulb service
114
- // you can create multiple services for each accessory
115
- const lightBulbService = `${accessory.displayName} ${device.deviceType}`;
116
- (this.lightBulbService = accessory.getService(this.hap.Service.Lightbulb)
117
- || accessory.addService(this.hap.Service.Lightbulb)), lightBulbService;
118
-
119
- if (this.adaptiveLightingShift === -1 && this.accessory.context.adaptiveLighting) {
120
- this.accessory.removeService(this.lightBulbService);
121
- this.lightBulbService = this.accessory.addService(this.hap.Service.Lightbulb);
122
- this.accessory.context.adaptiveLighting = false;
123
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${this.accessory.context.adaptiveLighting}`);
54
+ // Initialize LightBulb property
55
+ accessory.context.LightBulb = accessory.context.LightBulb ?? {};
56
+ this.LightBulb = {
57
+ Name: accessory.context.LightBulb.Name ?? accessory.displayName,
58
+ Service: accessory.getService(this.hap.Service.Lightbulb) ?? accessory.addService(this.hap.Service.Lightbulb) as Service,
59
+ On: accessory.context.On ?? false,
60
+ Hue: accessory.context.Hue ?? 0,
61
+ Saturation: accessory.context.Saturation ?? 0,
62
+ Brightness: accessory.context.Brightness ?? 0,
63
+ ColorTemperature: accessory.context.ColorTemperature ?? 140,
64
+ };
65
+ accessory.context.LightBulb = this.LightBulb as object;
66
+
67
+ // Adaptive Lighting
68
+ if (this.adaptiveLightingShift === -1 && accessory.context.adaptiveLighting) {
69
+ accessory.removeService(this.LightBulb.Service);
70
+ this.LightBulb.Service = accessory.addService(this.hap.Service.Lightbulb);
71
+ accessory.context.adaptiveLighting = false;
72
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} adaptiveLighting: ${accessory.context.adaptiveLighting}`);
124
73
  }
125
-
126
- this.lightBulbService.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
127
- if (!this.lightBulbService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
128
- this.lightBulbService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
74
+ if (this.adaptiveLightingShift !== -1) {
75
+ this.AdaptiveLightingController = new platform.api.hap.AdaptiveLightingController(this.LightBulb.Service, {
76
+ customTemperatureAdjustment: this.adaptiveLightingShift,
77
+ });
78
+ accessory.configureController(this.AdaptiveLightingController);
79
+ accessory.context.adaptiveLighting = true;
80
+ this.debugLog(`${device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${accessory.context.adaptiveLighting},`
81
+ + ` adaptiveLightingShift: ${this.adaptiveLightingShift}`);
129
82
  }
83
+ this.debugLog(`${device.deviceType}: ${this.accessory.displayName} adaptiveLightingShift: ${this.adaptiveLightingShift}`);
130
84
 
131
- // handle on / off events using the On characteristic
132
- this.lightBulbService.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
85
+ // Initialize LightBulb Characteristics
86
+ this.LightBulb.Service
87
+ .setCharacteristic(this.hap.Characteristic.Name, this.LightBulb.Name)
88
+ .getCharacteristic(this.hap.Characteristic.On)
89
+ .onGet(() => {
90
+ return this.LightBulb.On;
91
+ })
92
+ .onSet(this.OnSet.bind(this));
133
93
 
134
- // handle Brightness events using the Brightness characteristic
135
- this.lightBulbService
94
+ this.LightBulb.Service
136
95
  .getCharacteristic(this.hap.Characteristic.Brightness)
137
96
  .setProps({
138
- minStep: this.minStep(device),
97
+ minStep: device.colorbulb?.set_minStep ?? 1,
139
98
  minValue: 0,
140
99
  maxValue: 100,
141
100
  validValueRanges: [0, 100],
142
101
  })
143
102
  .onGet(() => {
144
- return this.Brightness;
103
+ return this.LightBulb.Brightness;
145
104
  })
146
105
  .onSet(this.BrightnessSet.bind(this));
147
106
 
148
- // handle ColorTemperature events using the ColorTemperature characteristic
149
- this.lightBulbService
107
+ this.LightBulb.Service
150
108
  .getCharacteristic(this.hap.Characteristic.ColorTemperature)
151
109
  .setProps({
152
110
  minValue: 140,
@@ -154,12 +112,11 @@ export class ColorBulb {
154
112
  validValueRanges: [140, 500],
155
113
  })
156
114
  .onGet(() => {
157
- return this.ColorTemperature!;
115
+ return this.LightBulb.ColorTemperature!;
158
116
  })
159
117
  .onSet(this.ColorTemperatureSet.bind(this));
160
118
 
161
- // handle Hue events using the Hue characteristic
162
- this.lightBulbService
119
+ this.LightBulb.Service
163
120
  .getCharacteristic(this.hap.Characteristic.Hue)
164
121
  .setProps({
165
122
  minValue: 0,
@@ -167,12 +124,11 @@ export class ColorBulb {
167
124
  validValueRanges: [0, 360],
168
125
  })
169
126
  .onGet(() => {
170
- return this.Hue;
127
+ return this.LightBulb.Hue;
171
128
  })
172
129
  .onSet(this.HueSet.bind(this));
173
130
 
174
- // handle Hue events using the Hue characteristic
175
- this.lightBulbService
131
+ this.LightBulb.Service
176
132
  .getCharacteristic(this.hap.Characteristic.Saturation)
177
133
  .setProps({
178
134
  minValue: 0,
@@ -180,22 +136,12 @@ export class ColorBulb {
180
136
  validValueRanges: [0, 100],
181
137
  })
182
138
  .onGet(() => {
183
- return this.Saturation;
139
+ return this.LightBulb.Saturation;
184
140
  })
185
141
  .onSet(this.SaturationSet.bind(this));
186
142
 
187
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLightingShift: ${this.adaptiveLightingShift}`);
188
- if (this.adaptiveLightingShift !== -1) {
189
- this.AdaptiveLightingController = new platform.api.hap.AdaptiveLightingController(this.lightBulbService, {
190
- customTemperatureAdjustment: this.adaptiveLightingShift,
191
- });
192
- this.accessory.configureController(this.AdaptiveLightingController);
193
- this.accessory.context.adaptiveLighting = true;
194
- this.debugLog(
195
- `${this.device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${this.accessory.context.adaptiveLighting},` +
196
- ` adaptiveLightingShift: ${this.adaptiveLightingShift}`,
197
- );
198
- }
143
+ // Retrieve initial values and updateHomekit
144
+ this.refreshStatus();
199
145
 
200
146
  // Update Homekit
201
147
  this.updateHomeKitCharacteristics();
@@ -208,60 +154,7 @@ export class ColorBulb {
208
154
  });
209
155
 
210
156
  //regisiter webhook event handler
211
- if (this.device.webhook) {
212
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
213
- this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
214
- try {
215
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
216
- const { powerState, brightness, color, colorTemperature } = context;
217
- const { On, Brightness, Hue, Saturation, ColorTemperature } = this;
218
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
219
- '(powerState, brightness, color, colorTemperature) = ' +
220
- `Webhook:(${powerState}, ${brightness}, ${color}, ${colorTemperature}), ` +
221
- `current:(${On}, ${Brightness}, ${Hue}, ${Saturation}, ${ColorTemperature})`);
222
- this.On = powerState === 'ON' ? true : false;
223
- this.Brightness = brightness;
224
-
225
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(color)}`);
226
- const [red, green, blue] = color!.split(':');
227
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${JSON.stringify(red)}`);
228
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${JSON.stringify(green)}`);
229
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${JSON.stringify(blue)}`);
230
-
231
- const [hue, saturation] = rgb2hs(Number(red), Number(green), Number(blue));
232
- this.debugLog(
233
- `${this.device.deviceType}: ${this.accessory.displayName}` + ` hs: ${JSON.stringify(rgb2hs(Number(red), Number(green), Number(blue)))}`,
234
- );
235
-
236
- // Hue
237
- this.Hue = hue;
238
- if (this.accessory.context.Hue !== this.Hue) {
239
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
240
- } else {
241
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
242
- }
243
-
244
- // Saturation
245
- this.Saturation = saturation;
246
- if (this.accessory.context.Saturation !== this.Saturation) {
247
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
248
- } else {
249
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
250
- }
251
-
252
- this.ColorTemperature = colorTemperature;
253
- if (this.accessory.context.ColorTemperature !== this.ColorTemperature) {
254
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
255
- } else {
256
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
257
- }
258
- this.updateHomeKitCharacteristics();
259
- } catch (e: any) {
260
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
261
- + `failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
262
- }
263
- };
264
- }
157
+ this.registerWebhook(accessory, device);
265
158
 
266
159
  // Watch for Bulb change events
267
160
  // We put in a debounce of 100ms so we don't make duplicate calls
@@ -270,138 +163,130 @@ export class ColorBulb {
270
163
  tap(() => {
271
164
  this.colorBulbUpdateInProgress = true;
272
165
  }),
273
- debounceTime(this.platform.config.options!.pushRate! * 1000),
166
+ debounceTime(this.devicePushRate * 1000),
274
167
  )
275
168
  .subscribe(async () => {
276
169
  try {
277
170
  await this.pushChanges();
278
171
  } catch (e: any) {
279
172
  this.apiError(e);
280
- this.errorLog(
281
- `${this.device.deviceType}: ${this.accessory.displayName} failed pushChanges with ${this.device.connectionType} Connection,` +
282
- ` Error Message: ${JSON.stringify(e.message)}`,
283
- );
173
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed pushChanges with ${this.device.connectionType} Connection,`
174
+ + ` Error Message: ${JSON.stringify(e.message)}`);
284
175
  }
285
176
  this.colorBulbUpdateInProgress = false;
286
177
  });
287
178
  }
288
179
 
289
180
  /**
290
- * Parse the device status from the SwitchBot api
181
+ * Parse the device status from the SwitchBotBLE API
291
182
  */
292
- async parseStatus(): Promise<void> {
293
- if (!this.device.enableCloudService && this.OpenAPI) {
294
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} parseStatus enableCloudService: ${this.device.enableCloudService}`);
295
- } else if (this.BLE) {
296
- await this.BLEparseStatus();
297
- } else if (this.OpenAPI && this.platform.config.credentials?.token) {
298
- await this.openAPIparseStatus();
299
- } else {
300
- await this.offlineOff();
301
- this.debugWarnLog(
302
- `${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`,
303
- );
304
- }
305
- }
306
-
307
- async BLEparseStatus(): Promise<void> {
183
+ async BLEparseStatus(serviceData: serviceData): Promise<void> {
308
184
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
309
185
  // State
310
- switch (this.BLE_On) {
186
+ switch (serviceData.power) {
311
187
  case true:
312
- this.On = true;
188
+ this.LightBulb.On = true;
313
189
  break;
314
190
  default:
315
- this.On = false;
191
+ this.LightBulb.On = false;
316
192
  }
317
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
193
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
318
194
 
319
195
  // Brightness
320
- this.Brightness = Number(this.BLE_Brightness);
321
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
196
+ this.LightBulb.Brightness = Number(serviceData.brightness);
197
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
322
198
 
323
199
  // Color, Hue & Brightness
324
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${this.BLE_Red}`);
325
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${this.BLE_Green}`);
326
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${this.BLE_Blue}`);
327
-
328
- const [hue, saturation] = rgb2hs(Number(this.BLE_Red), Number(this.BLE_Green), Number(this.BLE_Blue));
329
- this.debugLog(
330
- `${this.device.deviceType}: ${this.accessory.displayName}` +
331
- ` hs: ${JSON.stringify(rgb2hs(Number(this.BLE_Red), Number(this.BLE_Green), Number(this.BLE_Blue)))}`,
332
- );
333
- this.BLE_Hue = hue;
334
- this.BLE_Saturation = saturation;
200
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${serviceData.red}`);
201
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${serviceData.green}`);
202
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${serviceData.blue}`);
203
+
204
+ const [hue, saturation] = rgb2hs(Number(serviceData.red), Number(serviceData.green), Number(serviceData.blue));
205
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
206
+ + ` hs: ${JSON.stringify(rgb2hs(Number(serviceData.red), Number(serviceData.green), Number(serviceData.blue)))}`);
335
207
 
336
208
  // Hue
337
- this.Hue = this.BLE_Hue;
338
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
209
+ this.LightBulb.Hue = hue;
210
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
339
211
 
340
212
  // Saturation
341
- this.Saturation = this.BLE_Saturation;
342
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
213
+ this.LightBulb.Saturation = saturation;
214
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
343
215
 
344
216
  // ColorTemperature
345
- if (this.BLE_ColorTemperature) {
346
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.BLE_ColorTemperature}`);
347
- this.ColorTemperature = this.BLE_ColorTemperature!;
217
+ if (serviceData.color_temperature) {
218
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${serviceData.color_temperature}`);
219
+ this.LightBulb.ColorTemperature = serviceData.color_temperature!;
348
220
 
349
- this.ColorTemperature = Math.max(Math.min(this.ColorTemperature, 500), 140);
350
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
221
+ this.LightBulb.ColorTemperature = Math.max(Math.min(this.LightBulb.ColorTemperature, 500), 140);
222
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
351
223
  }
352
224
  }
353
225
 
354
- async openAPIparseStatus() {
226
+ /**
227
+ * Parse the device status from the SwitchBot OpenAPI
228
+ */
229
+ async openAPIparseStatus(deviceStatus: deviceStatus): Promise<void> {
355
230
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
356
- switch (this.OpenAPI_On) {
231
+ switch (deviceStatus.body.power) {
357
232
  case 'on':
358
- this.On = true;
233
+ this.LightBulb.On = true;
359
234
  break;
360
235
  default:
361
- this.On = false;
236
+ this.LightBulb.On = false;
362
237
  }
363
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
238
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
364
239
 
365
240
  // Brightness
366
- this.Brightness = Number(this.OpenAPI_Brightness);
367
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
241
+ this.LightBulb.Brightness = Number(deviceStatus.body.brightness);
242
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
368
243
 
369
244
  // Color, Hue & Brightness
370
- if (this.OpenAPI_RGB) {
371
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(this.OpenAPI_RGB)}`);
372
- const [red, green, blue] = this.OpenAPI_RGB!.split(':');
245
+ if (deviceStatus.body.color) {
246
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(deviceStatus.body.color)}`);
247
+ const [red, green, blue] = deviceStatus.body.color!.split(':');
373
248
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${JSON.stringify(red)}`);
374
249
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${JSON.stringify(green)}`);
375
250
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${JSON.stringify(blue)}`);
376
251
 
377
252
  const [hue, saturation] = rgb2hs(Number(red), Number(green), Number(blue));
378
- this.debugLog(
379
- `${this.device.deviceType}: ${this.accessory.displayName}` + ` hs: ${JSON.stringify(rgb2hs(Number(red), Number(green), Number(blue)))}`,
380
- );
253
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
254
+ + ` hs: ${JSON.stringify(rgb2hs(Number(red), Number(green), Number(blue)))}`);
381
255
 
382
256
  // Hue
383
- this.Hue = hue;
384
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
257
+ this.LightBulb.Hue = hue;
258
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
385
259
 
386
260
  // Saturation
387
- this.Saturation = saturation;
388
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
261
+ this.LightBulb.Saturation = saturation;
262
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
389
263
  }
390
264
 
391
265
  // ColorTemperature
392
- if (!Number.isNaN(this.OpenAPI_ColorTemperature)) {
393
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.OpenAPI_ColorTemperature}`);
394
- const mired = Math.round(1000000 / this.OpenAPI_ColorTemperature!);
266
+ if (!Number.isNaN(deviceStatus.body.colorTemperature)) {
267
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${deviceStatus.body.colorTemperature}`);
268
+ const mired = Math.round(1000000 / deviceStatus.body.colorTemperature!);
395
269
 
396
- this.ColorTemperature = Number(mired);
270
+ this.LightBulb.ColorTemperature = Number(mired);
397
271
 
398
- this.ColorTemperature = Math.max(Math.min(this.ColorTemperature, 500), 140);
399
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
272
+ this.LightBulb.ColorTemperature = Math.max(Math.min(this.LightBulb.ColorTemperature, 500), 140);
273
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
400
274
  }
401
275
 
402
- // FirmwareRevision
403
- this.FirmwareRevision = this.OpenAPI_FirmwareRevision!;
404
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
276
+ // Firmware Version
277
+ const version = deviceStatus.body.version?.toString();
278
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
279
+ if (deviceStatus.body.version) {
280
+ const deviceVersion = version?.replace(/^V|-.*$/g, '') ?? '0.0.0';
281
+ this.accessory
282
+ .getService(this.hap.Service.AccessoryInformation)!
283
+ .setCharacteristic(this.hap.Characteristic.HardwareRevision, deviceVersion)
284
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
285
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
286
+ .updateValue(deviceVersion);
287
+ this.accessory.context.deviceVersion = deviceVersion;
288
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceVersion: ${this.accessory.context.deviceVersion}`);
289
+ }
405
290
  }
406
291
 
407
292
  /**
@@ -416,10 +301,8 @@ export class ColorBulb {
416
301
  await this.openAPIRefreshStatus();
417
302
  } else {
418
303
  await this.offlineOff();
419
- this.debugWarnLog(
420
- `${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` +
421
- ` ${this.device.connectionType}, refreshStatus will not happen.`,
422
- );
304
+ this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:`
305
+ + ` ${this.device.connectionType}, refreshStatus will not happen.`);
423
306
  }
424
307
  }
425
308
 
@@ -436,113 +319,43 @@ export class ColorBulb {
436
319
  // Start to monitor advertisement packets
437
320
  (async () => {
438
321
  // Start to monitor advertisement packets
439
- await switchbot.startScan({
440
- model: 'u',
441
- id: this.device.bleMac,
442
- });
322
+ await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
443
323
  // Set an event handler
444
324
  switchbot.onadvertisement = (ad: any) => {
445
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
446
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.serviceData.model}`);
447
- if (this.device.bleMac === ad.address && ad.serviceData.model === 'u') {
325
+ if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
326
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
327
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
448
328
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
449
- this.BLE_ColorTemperature = ad.serviceData.color_temperature;
450
- this.BLE_Power = ad.serviceData.power;
451
- this.BLE_On = ad.serviceData.state;
452
- this.BLE_Red = ad.serviceData.red;
453
- this.BLE_Green = ad.serviceData.green;
454
- this.BLE_Blue = ad.serviceData.blue;
455
- this.BLE_Brightness = ad.serviceData.brightness;
456
- this.BLE_Delay = ad.serviceData.delay;
457
329
  } else {
458
330
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
459
331
  }
460
332
  };
461
- // Wait 1 seconds
333
+ // Wait 10 seconds
462
334
  await switchbot.wait(this.scanDuration * 1000);
463
335
  // Stop to monitor
464
336
  await switchbot.stopScan();
465
337
  // Update HomeKit
466
- await this.BLEparseStatus();
338
+ await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
467
339
  await this.updateHomeKitCharacteristics();
468
340
  })();
469
- /*if (switchbot !== false) {
470
- switchbot
471
- .startScan({
472
- model: 'u',
473
- id: this.device.bleMac,
474
- })
475
- .then(async () => {
476
- // Set an event handler
477
- switchbot.onadvertisement = async (ad: ad) => {
478
- this.debugLog(
479
- `${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
480
- ` BLE Address Found: ${ad.address}`,
481
- );
482
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
483
- this.BLE_Power = ad.serviceData.power;
484
- this.BLE_On = ad.serviceData.state;
485
- this.BLE_Red = ad.serviceData.red;
486
- this.BLE_Green = ad.serviceData.green;
487
- this.BLE_Blue = ad.serviceData.blue;
488
- this.BLE_ColorTemperature = ad.serviceData.color_temperature;
489
- this.BLE_Brightness = ad.serviceData.brightness;
490
- this.BLE_Delay = ad.serviceData.delay;
491
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
492
- this.debugLog(
493
- `${this.device.deviceType}: ${this.accessory.displayName} state: ${ad.serviceData.state}, ` +
494
- `delay: ${ad.serviceData.delay}, timer: ${ad.serviceData.timer}, syncUtcTime: ${ad.serviceData.syncUtcTime} ` +
495
- `wifiRssi: ${ad.serviceData.wifiRssi}, overload: ${ad.serviceData.overload}, currentPower: ${ad.serviceData.currentPower}`,
496
- );
497
-
498
- if (ad.serviceData) {
499
- this.BLE_IsConnected = true;
500
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
501
- await this.stopScanning(switchbot);
502
- } else {
503
- this.BLE_IsConnected = false;
504
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
505
- }
506
- };
507
- // Wait
508
- return await sleep(this.scanDuration * 1000);
509
- })
510
- .then(async () => {
511
- // Stop to monitor
512
- await this.stopScanning(switchbot);
513
- })
514
- .catch(async (e: any) => {
515
- this.apiError(e);
516
- this.errorLog(
517
- `${this.device.deviceType}: ${this.accessory.displayName} failed BLERefreshStatus with ${this.device.connectionType}` +
518
- ` Connection, Error Message: ${JSON.stringify(e.message)}`,
519
- );
520
- await this.BLERefreshConnection(switchbot);
521
- });
522
- } else {
341
+ if (switchbot === undefined) {
523
342
  await this.BLERefreshConnection(switchbot);
524
- }*/
343
+ }
525
344
  }
526
345
 
527
- async openAPIRefreshStatus() {
346
+ async openAPIRefreshStatus(): Promise<void> {
528
347
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
529
348
  try {
530
- const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/status`, {
531
- headers: this.platform.generateHeaders(),
532
- });
349
+ const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries,
350
+ `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
533
351
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
534
352
  const deviceStatus: any = await body.json();
535
353
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
536
354
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
537
355
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
538
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
356
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
539
357
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
540
- this.OpenAPI_On = deviceStatus.body.power;
541
- this.OpenAPI_RGB = deviceStatus.body.color;
542
- this.OpenAPI_Brightness = deviceStatus.body.brightness;
543
- this.OpenAPI_ColorTemperature = deviceStatus.body.colorTemperature;
544
- this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
545
- this.openAPIparseStatus();
358
+ this.openAPIparseStatus(deviceStatus);
546
359
  this.updateHomeKitCharacteristics();
547
360
  } else {
548
361
  this.statusCode(statusCode);
@@ -550,10 +363,81 @@ export class ColorBulb {
550
363
  }
551
364
  } catch (e: any) {
552
365
  this.apiError(e);
553
- this.errorLog(
554
- `${this.device.deviceType}: ${this.accessory.displayName} failed openAPIRefreshStatus with ${this.device.connectionType}` +
555
- ` Connection, Error Message: ${JSON.stringify(e.message)}`,
556
- );
366
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIRefreshStatus with ${this.device.connectionType}`
367
+ + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
368
+ }
369
+ }
370
+
371
+ async registerWebhook(accessory: PlatformAccessory, device: device & devicesConfig) {
372
+ if (device.webhook) {
373
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} is listening webhook.`);
374
+ this.platform.webhookEventHandler[device.deviceId] = async (context) => {
375
+ try {
376
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
377
+ const { powerState, brightness, color, colorTemperature } = context;
378
+ const { On, Brightness, Hue, Saturation, ColorTemperature } = this.LightBulb;
379
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} ` +
380
+ '(powerState, brightness, color, colorTemperature) = ' +
381
+ `Webhook:(${powerState}, ${brightness}, ${color}, ${colorTemperature}), `
382
+ + `current:(${On}, ${Brightness}, ${Hue}, ${Saturation}, ${ColorTemperature})`);
383
+
384
+ // On
385
+ this.LightBulb.On = powerState === 'ON' ? true : false;
386
+ if (accessory.context.Brightness !== this.LightBulb.On) {
387
+ this.infoLog(`${device.deviceType}: ${accessory.displayName} On: ${this.LightBulb.On}`);
388
+ } else {
389
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} On: ${this.LightBulb.On}`);
390
+ }
391
+
392
+ // Brightness
393
+ this.LightBulb.Brightness = brightness;
394
+ if (accessory.context.Brightness !== this.LightBulb.Brightness) {
395
+ this.infoLog(`${device.deviceType}: ${accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
396
+ } else {
397
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
398
+ }
399
+
400
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} color: ${JSON.stringify(color)}`);
401
+ const [red, green, blue] = color!.split(':');
402
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} red: ${JSON.stringify(red)}`);
403
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} green: ${JSON.stringify(green)}`);
404
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} blue: ${JSON.stringify(blue)}`);
405
+
406
+ const [hue, saturation] = rgb2hs(Number(red), Number(green), Number(blue));
407
+ this.debugLog(
408
+ `${device.deviceType}: ${accessory.displayName}`
409
+ + ` hs: ${JSON.stringify(rgb2hs(Number(red), Number(green), Number(blue)))}`);
410
+
411
+ // Hue
412
+ this.LightBulb.Hue = hue;
413
+ if (accessory.context.Hue !== this.LightBulb.Hue) {
414
+ this.infoLog(`${device.deviceType}: ${accessory.displayName} Hue: ${this.LightBulb.Hue}`);
415
+ } else {
416
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} Hue: ${this.LightBulb.Hue}`);
417
+ }
418
+
419
+ // Saturation
420
+ this.LightBulb.Saturation = saturation;
421
+ if (accessory.context.Saturation !== this.LightBulb.Saturation) {
422
+ this.infoLog(`${device.deviceType}: ${accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
423
+ } else {
424
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
425
+ }
426
+
427
+ this.LightBulb.ColorTemperature = colorTemperature;
428
+ if (accessory.context.ColorTemperature !== this.LightBulb.ColorTemperature) {
429
+ this.infoLog(`${device.deviceType}: ${accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
430
+ } else {
431
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
432
+ }
433
+ this.updateHomeKitCharacteristics();
434
+ } catch (e: any) {
435
+ this.errorLog(`${device.deviceType}: ${accessory.displayName} `
436
+ + `failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
437
+ }
438
+ };
439
+ } else {
440
+ this.debugWarnLog(`${device.deviceType}: ${accessory.displayName} is not listening webhook.`);
557
441
  }
558
442
  }
559
443
 
@@ -571,15 +455,14 @@ export class ColorBulb {
571
455
  async pushChanges(): Promise<void> {
572
456
  if (!this.device.enableCloudService && this.OpenAPI) {
573
457
  this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} pushChanges enableCloudService: ${this.device.enableCloudService}`);
574
- /*} else if (this.BLE) {
575
- await this.BLEpushChanges();*/
458
+ } else if (this.BLE) {
459
+ await this.BLEpushChanges();
576
460
  } else if (this.OpenAPI && this.platform.config.credentials?.token) {
577
461
  await this.openAPIpushChanges();
578
462
  } else {
579
463
  await this.offlineOff();
580
- this.debugWarnLog(
581
- `${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, pushChanges will not happen.`,
582
- );
464
+ this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:`
465
+ + ` ${this.device.connectionType}, pushChanges will not happen.`);
583
466
  }
584
467
  // Refresh the status from the API
585
468
  interval(15000)
@@ -592,8 +475,9 @@ export class ColorBulb {
592
475
 
593
476
  async BLEpushChanges(): Promise<void> {
594
477
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`);
595
- if (this.On !== this.accessory.context.On) {
596
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges On: ${this.On} OnCached: ${this.accessory.context.On}`);
478
+ if (this.LightBulb.On !== this.accessory.context.On) {
479
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`
480
+ + ` On: ${this.LightBulb.On}, OnCached: ${this.accessory.context.On}`);
597
481
  const switchbot = await this.platform.connectBLE();
598
482
  // Convert to BLE Address
599
483
  this.device.bleMac = this.device
@@ -607,11 +491,11 @@ export class ColorBulb {
607
491
  id: this.device.bleMac,
608
492
  })
609
493
  .then(async (device_list: any) => {
610
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
611
- return await this.retry({
612
- max: this.maxRetry(),
494
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
495
+ return await this.retryBLE({
496
+ max: await this.maxRetryBLE(),
613
497
  fn: async () => {
614
- if (this.On) {
498
+ if (this.LightBulb.On) {
615
499
  return await device_list[0].turnOn({ id: this.device.bleMac });
616
500
  } else {
617
501
  return await device_list[0].turnOff({ id: this.device.bleMac });
@@ -621,38 +505,37 @@ export class ColorBulb {
621
505
  })
622
506
  .then(() => {
623
507
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
624
- this.On = false;
508
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
509
+ + `On: ${this.LightBulb.On} sent over BLE, sent successfully`);
510
+ this.LightBulb.On = false;
625
511
  })
626
512
  .catch(async (e: any) => {
627
513
  this.apiError(e);
628
- this.errorLog(
629
- `${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushChanges with ${this.device.connectionType}` +
630
- ` Connection, Error Message: ${JSON.stringify(e.message)}`,
631
- );
514
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushChanges with ${this.device.connectionType}`
515
+ + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
632
516
  await this.BLEPushConnection();
633
517
  });
634
518
  // Push Brightness Update
635
- if (this.On) {
519
+ if (this.LightBulb.On) {
636
520
  await this.BLEpushBrightnessChanges();
637
521
  }
638
522
  // Push ColorTemperature Update
639
- if (this.On) {
523
+ if (this.LightBulb.On) {
640
524
  await this.BLEpushColorTemperatureChanges();
641
525
  }
642
526
  // Push Hue & Saturation Update
643
- if (this.On) {
527
+ if (this.LightBulb.On) {
644
528
  await this.BLEpushRGBChanges();
645
529
  }
646
530
  } else {
647
- this.debugLog(
648
- `${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges.` + `On: ${this.On}, ` + `OnCached: ${this.accessory.context.On}`,
649
- );
531
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges, On: ${this.LightBulb.On},`
532
+ + ` OnCached: ${this.accessory.context.On}`);
650
533
  }
651
534
  }
652
535
 
653
536
  async BLEpushBrightnessChanges(): Promise<void> {
654
537
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushBrightnessChanges`);
655
- if (this.Brightness !== this.accessory.context.Brightness) {
538
+ if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
656
539
  const switchbot = await this.platform.connectBLE();
657
540
  // Convert to BLE Address
658
541
  this.device.bleMac = this.device
@@ -666,33 +549,28 @@ export class ColorBulb {
666
549
  id: this.device.bleMac,
667
550
  })
668
551
  .then(async (device_list: any) => {
669
- this.infoLog(`${this.accessory.displayName} Target Brightness: ${this.Brightness}`);
670
- return await device_list[0].setBrightness(this.Brightness);
552
+ this.infoLog(`${this.accessory.displayName} Target Brightness: ${this.LightBulb.Brightness}`);
553
+ return await device_list[0].setBrightness(this.LightBulb.Brightness);
671
554
  })
672
555
  .then(() => {
673
556
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
674
- this.On = false;
557
+ this.LightBulb.On = false;
675
558
  })
676
559
  .catch(async (e: any) => {
677
560
  this.apiError(e);
678
- this.errorLog(
679
- `${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushBrightnessChanges with ${this.device.connectionType}` +
680
- ` Connection, Error Message: ${JSON.stringify(e.message)}`,
681
- );
561
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushBrightnessChanges with ${this.device.connectionType}`
562
+ + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
682
563
  await this.BLEPushConnection();
683
564
  });
684
565
  } else {
685
- this.debugLog(
686
- `${this.device.deviceType}: ${this.accessory.displayName} No BLEpushBrightnessChanges.` +
687
- `Brightness: ${this.Brightness}, ` +
688
- `BrightnessCached: ${this.accessory.context.Brightness}`,
689
- );
566
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushBrightnessChanges.`
567
+ + `Brightness: ${this.LightBulb.Brightness}, BrightnessCached: ${this.accessory.context.Brightness}`);
690
568
  }
691
569
  }
692
570
 
693
571
  async BLEpushColorTemperatureChanges(): Promise<void> {
694
572
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushColorTemperatureChanges`);
695
- if (this.ColorTemperature !== this.accessory.context.ColorTemperature) {
573
+ if (this.LightBulb.ColorTemperature !== this.accessory.context.ColorTemperature) {
696
574
  const switchbot = await this.platform.connectBLE();
697
575
  // Convert to BLE Address
698
576
  this.device.bleMac = this.device
@@ -706,36 +584,32 @@ export class ColorBulb {
706
584
  id: this.device.bleMac,
707
585
  })
708
586
  .then(async (device_list: any) => {
709
- this.infoLog(`${this.accessory.displayName} Target ColorTemperature: ${this.ColorTemperature}`);
710
- return await device_list[0].setColorTemperature(this.ColorTemperature);
587
+ this.infoLog(`${this.accessory.displayName} Target ColorTemperature: ${this.LightBulb.ColorTemperature}`);
588
+ return await device_list[0].setColorTemperature(this.LightBulb.ColorTemperature);
711
589
  })
712
590
  .then(() => {
713
591
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
714
- this.On = false;
592
+ this.LightBulb.On = false;
715
593
  })
716
594
  .catch(async (e: any) => {
717
595
  this.apiError(e);
718
- this.errorLog(
719
- `${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushColorTemperatureChanges with ` +
720
- `${this.device.connectionType} Connection, Error Message: ${JSON.stringify(e.message)}`,
721
- );
596
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushColorTemperatureChanges with `
597
+ + `${this.device.connectionType} Connection, Error Message: ${JSON.stringify(e.message)}`);
722
598
  await this.BLEPushConnection();
723
599
  });
724
600
  } else {
725
- this.debugLog(
726
- `${this.device.deviceType}: ${this.accessory.displayName} No BLEpushColorTemperatureChanges.` +
727
- `ColorTemperature: ${this.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`,
728
- );
601
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushColorTemperatureChanges.`
602
+ + `ColorTemperature: ${this.LightBulb.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`);
729
603
  }
730
604
  }
731
605
 
732
606
  async BLEpushRGBChanges(): Promise<void> {
733
607
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushRGBChanges`);
734
- if (this.Hue !== this.accessory.context.Hue || this.Saturation !== this.accessory.context.Saturation) {
735
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.Hue)}`);
736
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.Saturation)}`);
608
+ if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
609
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
610
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
737
611
 
738
- const [red, green, blue] = hs2rgb(Number(this.Hue), Number(this.Saturation));
612
+ const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
739
613
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
740
614
 
741
615
  const switchbot = await this.platform.connectBLE();
@@ -751,34 +625,30 @@ export class ColorBulb {
751
625
  id: this.device.bleMac,
752
626
  })
753
627
  .then(async (device_list: any) => {
754
- this.infoLog(`${this.accessory.displayName} Target RGB: ${(this.Brightness, red, green, blue)}`);
755
- return await device_list[0].setRGB(this.Brightness, red, green, blue);
628
+ this.infoLog(`${this.accessory.displayName} Target RGB: ${(this.LightBulb.Brightness, red, green, blue)}`);
629
+ return await device_list[0].setRGB(this.LightBulb.Brightness, red, green, blue);
756
630
  })
757
631
  .then(() => {
758
632
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
759
- this.On = false;
633
+ this.LightBulb.On = false;
760
634
  })
761
635
  .catch(async (e: any) => {
762
636
  this.apiError(e);
763
- this.errorLog(
764
- `${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushRGBChanges with ${this.device.connectionType}` +
765
- ` Connection, Error Message: ${JSON.stringify(e.message)}`,
766
- );
637
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushRGBChanges with ${this.device.connectionType}`
638
+ + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
767
639
  await this.BLEPushConnection();
768
640
  });
769
641
  } else {
770
- this.debugLog(
771
- `${this.device.deviceType}: ${this.accessory.displayName} No BLEpushRGBChanges. Hue: ${this.Hue}, ` +
772
- `HueCached: ${this.accessory.context.Hue}, Saturation: ${this.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
773
- );
642
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushRGBChanges. Hue: ${this.LightBulb.Hue}, HueCached: `
643
+ + `${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`);
774
644
  }
775
645
  }
776
646
 
777
647
  async openAPIpushChanges(): Promise<void> {
778
648
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
779
- if (this.On !== this.accessory.context.On) {
649
+ if (this.LightBulb.On !== this.accessory.context.On) {
780
650
  let command = '';
781
- if (this.On) {
651
+ if (this.LightBulb.On) {
782
652
  command = 'turnOn';
783
653
  } else {
784
654
  command = 'turnOff';
@@ -803,44 +673,41 @@ export class ColorBulb {
803
673
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
804
674
  this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
805
675
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
676
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
677
+ + `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
806
678
  } else {
807
679
  this.statusCode(statusCode);
808
680
  this.statusCode(deviceStatus.statusCode);
809
681
  }
810
682
  } catch (e: any) {
811
683
  this.apiError(e);
812
- this.errorLog(
813
- `${this.device.deviceType}: ${this.accessory.displayName} failed openAPIpushChanges with ${this.device.connectionType}` +
814
- ` Connection, Error Message: ${JSON.stringify(e.message)}`,
815
- );
684
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIpushChanges with ${this.device.connectionType}`
685
+ + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
816
686
  }
817
687
  } else {
818
- this.debugLog(
819
- `${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges.` +
820
- `On: ${this.On}, ` +
821
- `OnCached: ${this.accessory.context.On}`,
822
- );
688
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges,`
689
+ + `On: ${this.LightBulb.On}, OnCached: ${this.accessory.context.On}`);
823
690
  }
824
691
  // Push Hue & Saturation Update
825
- if (this.On) {
692
+ if (this.LightBulb.On) {
826
693
  await this.pushHueSaturationChanges();
827
694
  }
828
695
  // Push ColorTemperature Update
829
- if (this.On) {
696
+ if (this.LightBulb.On) {
830
697
  await this.pushColorTemperatureChanges();
831
698
  }
832
699
  // Push Brightness Update
833
- if (this.On) {
700
+ if (this.LightBulb.On) {
834
701
  await this.pushBrightnessChanges();
835
702
  }
836
703
  }
837
704
 
838
705
  async pushHueSaturationChanges(): Promise<void> {
839
706
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushHueSaturationChanges`);
840
- if (this.Hue !== this.accessory.context.Hue || this.Saturation !== this.accessory.context.Saturation) {
841
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.Hue)}`);
842
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.Saturation)}`);
843
- const [red, green, blue] = hs2rgb(Number(this.Hue), Number(this.Saturation));
707
+ if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
708
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
709
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
710
+ const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
844
711
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
845
712
  const bodyChange = JSON.stringify({
846
713
  command: 'setColor',
@@ -862,30 +729,28 @@ export class ColorBulb {
862
729
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
863
730
  this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
864
731
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
732
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
733
+ + `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
865
734
  } else {
866
735
  this.statusCode(statusCode);
867
736
  this.statusCode(deviceStatus.statusCode);
868
737
  }
869
738
  } catch (e: any) {
870
739
  this.apiError(e);
871
- this.errorLog(
872
- `${this.device.deviceType}: ${this.accessory.displayName} failed pushHueSaturationChanges with ${this.device.connectionType}` +
873
- ` Connection, Error Message: ${JSON.stringify(e.message)}`,
874
- );
740
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed pushHueSaturationChanges with ${this.device.connectionType}`
741
+ + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
875
742
  }
876
743
  } else {
877
- this.debugLog(
878
- `${this.device.deviceType}: ${this.accessory.displayName} No pushHueSaturationChanges. Hue: ${this.Hue}, ` +
879
- `HueCached: ${this.accessory.context.Hue}, Saturation: ${this.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
880
- );
744
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushHueSaturationChanges. Hue: ${this.LightBulb.Hue}, HueCached: `
745
+ + `${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`);
881
746
  }
882
747
  }
883
748
 
884
749
  async pushColorTemperatureChanges(): Promise<void> {
885
750
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushColorTemperatureChanges`);
886
- if (this.ColorTemperature !== this.accessory.context.ColorTemperature) {
887
- const kelvin = Math.round(1000000 / Number(this.ColorTemperature));
888
- this.cacheKelvin = kelvin;
751
+ if (this.LightBulb.ColorTemperature !== this.accessory.context.ColorTemperature) {
752
+ const kelvin = Math.round(1000000 / Number(this.LightBulb.ColorTemperature));
753
+ this.accessory.context.kelvin = kelvin;
889
754
  const bodyChange = JSON.stringify({
890
755
  command: 'setColorTemperature',
891
756
  parameter: `${kelvin}`,
@@ -906,31 +771,29 @@ export class ColorBulb {
906
771
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
907
772
  this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
908
773
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
774
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
775
+ + `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
909
776
  } else {
910
777
  this.statusCode(statusCode);
911
778
  this.statusCode(deviceStatus.statusCode);
912
779
  }
913
780
  } catch (e: any) {
914
781
  this.apiError(e);
915
- this.errorLog(
916
- `${this.device.deviceType}: ${this.accessory.displayName} failed pushColorTemperatureChanges with ${this.device.connectionType}` +
917
- ` Connection, Error Message: ${JSON.stringify(e.message)}`,
918
- );
782
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed pushColorTemperatureChanges with ${this.device.connectionType}`
783
+ + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
919
784
  }
920
785
  } else {
921
- this.debugLog(
922
- `${this.device.deviceType}: ${this.accessory.displayName} No pushColorTemperatureChanges.` +
923
- `ColorTemperature: ${this.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`,
924
- );
786
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushColorTemperatureChanges.`
787
+ + `ColorTemperature: ${this.LightBulb.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`);
925
788
  }
926
789
  }
927
790
 
928
791
  async pushBrightnessChanges(): Promise<void> {
929
792
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushBrightnessChanges`);
930
- if (this.Brightness !== this.accessory.context.Brightness) {
793
+ if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
931
794
  const bodyChange = JSON.stringify({
932
795
  command: 'setBrightness',
933
- parameter: `${this.Brightness}`,
796
+ parameter: `${this.LightBulb.Brightness}`,
934
797
  commandType: 'command',
935
798
  });
936
799
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
@@ -948,23 +811,20 @@ export class ColorBulb {
948
811
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
949
812
  this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
950
813
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
814
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
815
+ + `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
951
816
  } else {
952
817
  this.statusCode(statusCode);
953
818
  this.statusCode(deviceStatus.statusCode);
954
819
  }
955
820
  } catch (e: any) {
956
821
  this.apiError(e);
957
- this.errorLog(
958
- `${this.device.deviceType}: ${this.accessory.displayName} failed pushBrightnessChanges with ${this.device.connectionType}` +
959
- ` Connection, Error Message: ${JSON.stringify(e.message)}`,
960
- );
822
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed pushBrightnessChanges with ${this.device.connectionType}`
823
+ + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
961
824
  }
962
825
  } else {
963
- this.debugLog(
964
- `${this.device.deviceType}: ${this.accessory.displayName} No pushBrightnessChanges.` +
965
- `Brightness: ${this.Brightness}, ` +
966
- `BrightnessCached: ${this.accessory.context.Brightness}`,
967
- );
826
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushBrightnessChanges.`
827
+ + `Brightness: ${this.LightBulb.Brightness}, BrightnessCached: ${this.accessory.context.Brightness}`);
968
828
  }
969
829
  }
970
830
 
@@ -972,13 +832,13 @@ export class ColorBulb {
972
832
  * Handle requests to set the value of the "On" characteristic
973
833
  */
974
834
  async OnSet(value: CharacteristicValue): Promise<void> {
975
- if (this.On === this.accessory.context.On) {
835
+ if (this.LightBulb.On === this.accessory.context.On) {
976
836
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set On: ${value}`);
977
837
  } else {
978
838
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set On: ${value}`);
979
839
  }
980
840
 
981
- this.On = value;
841
+ this.LightBulb.On = value;
982
842
  this.doColorBulbUpdate.next();
983
843
  }
984
844
 
@@ -986,15 +846,15 @@ export class ColorBulb {
986
846
  * Handle requests to set the value of the "Brightness" characteristic
987
847
  */
988
848
  async BrightnessSet(value: CharacteristicValue): Promise<void> {
989
- if (this.Brightness === this.accessory.context.Brightness) {
849
+ if (this.LightBulb.Brightness === this.accessory.context.Brightness) {
990
850
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Brightness: ${value}`);
991
- } else if (this.On) {
851
+ } else if (this.LightBulb.On) {
992
852
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
993
853
  } else {
994
854
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
995
855
  }
996
856
 
997
- this.Brightness = value;
857
+ this.LightBulb.Brightness = value;
998
858
  this.doColorBulbUpdate.next();
999
859
  }
1000
860
 
@@ -1002,30 +862,32 @@ export class ColorBulb {
1002
862
  * Handle requests to set the value of the "ColorTemperature" characteristic
1003
863
  */
1004
864
  async ColorTemperatureSet(value: CharacteristicValue): Promise<void> {
1005
- if (this.ColorTemperature === this.accessory.context.ColorTemperature) {
865
+ if (this.LightBulb.ColorTemperature === this.accessory.context.ColorTemperature) {
1006
866
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set ColorTemperature: ${value}`);
1007
- } else if (this.On) {
867
+ } else if (this.LightBulb.On) {
1008
868
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
1009
869
  } else {
1010
870
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
1011
871
  }
1012
872
 
873
+ const minKelvin = 2000;
874
+ const maxKelvin = 9000;
1013
875
  // Convert mired to kelvin to nearest 100 (SwitchBot seems to need this)
1014
876
  const kelvin = Math.round(1000000 / Number(value) / 100) * 100;
1015
877
 
1016
878
  // Check and increase/decrease kelvin to range of device
1017
- const k = Math.min(Math.max(kelvin, this.minKelvin), this.maxKelvin);
879
+ const k = Math.min(Math.max(kelvin, minKelvin), maxKelvin);
1018
880
 
1019
- if (!this.accessory.context.On || this.cacheKelvin === k) {
881
+ if (!this.accessory.context.On || this.accessory.context.kelvin === k) {
1020
882
  return;
1021
883
  }
1022
884
 
1023
885
  // Updating the hue/sat to the corresponding values mimics native adaptive lighting
1024
886
  const hs = m2hs(value);
1025
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Hue, hs[0]);
1026
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Saturation, hs[1]);
887
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, hs[0]);
888
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, hs[1]);
1027
889
 
1028
- this.ColorTemperature = value;
890
+ this.LightBulb.ColorTemperature = value;
1029
891
  this.doColorBulbUpdate.next();
1030
892
  }
1031
893
 
@@ -1033,17 +895,17 @@ export class ColorBulb {
1033
895
  * Handle requests to set the value of the "Hue" characteristic
1034
896
  */
1035
897
  async HueSet(value: CharacteristicValue): Promise<void> {
1036
- if (this.Hue === this.accessory.context.Hue) {
898
+ if (this.LightBulb.Hue === this.accessory.context.Hue) {
1037
899
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Hue: ${value}`);
1038
- } else if (this.On) {
900
+ } else if (this.LightBulb.On) {
1039
901
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
1040
902
  } else {
1041
903
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
1042
904
  }
1043
905
 
1044
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
906
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
1045
907
 
1046
- this.Hue = value;
908
+ this.LightBulb.Hue = value;
1047
909
  this.doColorBulbUpdate.next();
1048
910
  }
1049
911
 
@@ -1051,60 +913,61 @@ export class ColorBulb {
1051
913
  * Handle requests to set the value of the "Saturation" characteristic
1052
914
  */
1053
915
  async SaturationSet(value: CharacteristicValue): Promise<void> {
1054
- if (this.Saturation === this.accessory.context.Saturation) {
916
+ if (this.LightBulb.Saturation === this.accessory.context.Saturation) {
1055
917
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Saturation: ${value}`);
1056
- } else if (this.On) {
918
+ } else if (this.LightBulb.On) {
1057
919
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
1058
920
  } else {
1059
921
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
1060
922
  }
1061
923
 
1062
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
924
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
1063
925
 
1064
- this.Saturation = value;
926
+ this.LightBulb.Saturation = value;
1065
927
  this.doColorBulbUpdate.next();
1066
928
  }
1067
929
 
1068
930
  async updateHomeKitCharacteristics(): Promise<void> {
1069
931
  // On
1070
- if (this.On === undefined) {
1071
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
932
+ if (this.LightBulb.On === undefined) {
933
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
1072
934
  } else {
1073
- this.accessory.context.On = this.On;
1074
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.On, this.On);
1075
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
935
+ this.accessory.context.On = this.LightBulb.On;
936
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, this.LightBulb.On);
937
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.LightBulb.On}`);
1076
938
  }
1077
939
  // Brightness
1078
- if (this.Brightness === undefined) {
1079
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
940
+ if (this.LightBulb.Brightness === undefined) {
941
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
1080
942
  } else {
1081
- this.accessory.context.Brightness = this.Brightness;
1082
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Brightness, this.Brightness);
1083
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.Brightness}`);
943
+ this.accessory.context.Brightness = this.LightBulb.Brightness;
944
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, this.LightBulb.Brightness);
945
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.LightBulb.Brightness}`);
1084
946
  }
1085
947
  // ColorTemperature
1086
- if (this.ColorTemperature === undefined) {
1087
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
948
+ if (this.LightBulb.ColorTemperature === undefined) {
949
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
1088
950
  } else {
1089
- this.accessory.context.ColorTemperature = this.ColorTemperature;
1090
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.ColorTemperature, this.ColorTemperature);
1091
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic ColorTemperature: ${this.ColorTemperature}`);
951
+ this.accessory.context.ColorTemperature = this.LightBulb.ColorTemperature;
952
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, this.LightBulb.ColorTemperature);
953
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
954
+ + ` ColorTemperature: ${this.LightBulb.ColorTemperature}`);
1092
955
  }
1093
956
  // Hue
1094
- if (this.Hue === undefined) {
1095
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
957
+ if (this.LightBulb.Hue === undefined) {
958
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
1096
959
  } else {
1097
- this.accessory.context.Hue = this.Hue;
1098
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Hue, this.Hue);
1099
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.Hue}`);
960
+ this.accessory.context.Hue = this.LightBulb.Hue;
961
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, this.LightBulb.Hue);
962
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.LightBulb.Hue}`);
1100
963
  }
1101
964
  // Saturation
1102
- if (this.Saturation === undefined) {
1103
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
965
+ if (this.LightBulb.Saturation === undefined) {
966
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
1104
967
  } else {
1105
- this.accessory.context.Saturation = this.Saturation;
1106
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Saturation, this.Saturation);
1107
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Saturation: ${this.Saturation}`);
968
+ this.accessory.context.Saturation = this.LightBulb.Saturation;
969
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, this.LightBulb.Saturation);
970
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Saturation: ${this.LightBulb.Saturation}`);
1108
971
  }
1109
972
  }
1110
973
 
@@ -1118,35 +981,6 @@ export class ColorBulb {
1118
981
  }
1119
982
  }
1120
983
 
1121
- async stopScanning(switchbot: any) {
1122
- switchbot.stopScan();
1123
- if (this.BLE_IsConnected) {
1124
- await this.BLEparseStatus();
1125
- await this.updateHomeKitCharacteristics();
1126
- } else {
1127
- await this.BLERefreshConnection(switchbot);
1128
- }
1129
- }
1130
-
1131
- async getCustomBLEAddress(switchbot: any) {
1132
- if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
1133
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} customBLEaddress: ${this.device.customBLEaddress}`);
1134
- (async () => {
1135
- // Start to monitor advertisement packets
1136
- await switchbot.startScan({
1137
- model: 'u',
1138
- });
1139
- // Set an event handler
1140
- switchbot.onadvertisement = (ad: any) => {
1141
- this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} ad: ${JSON.stringify(ad, null, ' ')}`);
1142
- };
1143
- await sleep(10000);
1144
- // Stop to monitor
1145
- switchbot.stopScan();
1146
- })();
1147
- }
1148
- }
1149
-
1150
984
  async BLEPushConnection() {
1151
985
  if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
1152
986
  this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Push Changes`);
@@ -1163,284 +997,17 @@ export class ColorBulb {
1163
997
  }
1164
998
  }
1165
999
 
1166
- async retry({ max, fn }: { max: number; fn: { (): any; (): Promise<any> } }): Promise<null> {
1167
- return fn().catch(async (e: any) => {
1168
- if (max === 0) {
1169
- throw e;
1170
- }
1171
- this.infoLog(e);
1172
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Retrying`);
1173
- await sleep(1000);
1174
- return this.retry({ max: max - 1, fn });
1175
- });
1176
- }
1177
-
1178
- maxRetry(): number {
1179
- if (this.device.maxRetry) {
1180
- return this.device.maxRetry;
1181
- } else {
1182
- return 5;
1183
- }
1184
- }
1185
-
1186
- minStep(device: device & devicesConfig): number {
1187
- if (device.colorbulb?.set_minStep) {
1188
- this.set_minStep = device.colorbulb?.set_minStep;
1189
- } else {
1190
- this.set_minStep = 1;
1191
- }
1192
- return this.set_minStep;
1193
- }
1194
-
1195
- async scan(device: device & devicesConfig): Promise<void> {
1196
- if (device.scanDuration) {
1197
- this.scanDuration = this.accessory.context.scanDuration = device.scanDuration;
1198
- if (this.BLE) {
1199
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config scanDuration: ${this.scanDuration}`);
1200
- }
1201
- } else {
1202
- this.scanDuration = this.accessory.context.scanDuration = 1;
1203
- if (this.BLE) {
1204
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default scanDuration: ${this.scanDuration}`);
1205
- }
1206
- }
1207
- }
1208
-
1209
- async statusCode(statusCode: number): Promise<void> {
1210
- switch (statusCode) {
1211
- case 151:
1212
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
1213
- break;
1214
- case 152:
1215
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
1216
- break;
1217
- case 160:
1218
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
1219
- break;
1220
- case 161:
1221
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
1222
- this.offlineOff();
1223
- break;
1224
- case 171:
1225
- this.errorLog(
1226
- `${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
1227
- `Hub: ${this.device.hubDeviceId}`,
1228
- );
1229
- this.offlineOff();
1230
- break;
1231
- case 190:
1232
- this.errorLog(
1233
- `${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
1234
- ` Or command format is invalid, statusCode: ${statusCode}`,
1235
- );
1236
- break;
1237
- case 100:
1238
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
1239
- break;
1240
- case 200:
1241
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
1242
- break;
1243
- case 400:
1244
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
1245
- + `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
1246
- break;
1247
- case 401:
1248
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
1249
- + `but the request has not been authenticated, statusCode: ${statusCode}`);
1250
- break;
1251
- case 403:
1252
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
1253
- + `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
1254
- break;
1255
- case 404:
1256
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
1257
- + `statusCode: ${statusCode}`);
1258
- break;
1259
- case 406:
1260
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
1261
- + `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
1262
- break;
1263
- case 415:
1264
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
1265
- + `header that is not supported by the server, statusCode: ${statusCode}`);
1266
- break;
1267
- case 422:
1268
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
1269
- + `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
1270
- break;
1271
- case 429:
1272
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
1273
- + `requests allowed for a given time window, statusCode: ${statusCode}`);
1274
- break;
1275
- case 500:
1276
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
1277
- + `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
1278
- break;
1279
- default:
1280
- this.infoLog(
1281
- `${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
1282
- `${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`,
1283
- );
1284
- }
1285
- }
1286
-
1287
1000
  async offlineOff(): Promise<void> {
1288
1001
  if (this.device.offline) {
1289
- await this.deviceContext();
1290
- await this.updateHomeKitCharacteristics();
1002
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, false);
1291
1003
  }
1292
1004
  }
1293
1005
 
1294
1006
  apiError(e: any): void {
1295
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.On, e);
1296
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Hue, e);
1297
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Brightness, e);
1298
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Saturation, e);
1299
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.ColorTemperature, e);
1300
- }
1301
-
1302
- async deviceContext(): Promise<void> {
1303
- if (this.On === undefined) {
1304
- this.On = false;
1305
- } else {
1306
- this.On = this.accessory.context.On;
1307
- }
1308
- if (this.Hue === undefined) {
1309
- this.Hue = 0;
1310
- } else {
1311
- this.Hue = this.accessory.context.Hue;
1312
- }
1313
- if (this.Brightness === undefined) {
1314
- this.Brightness = 0;
1315
- } else {
1316
- this.Brightness = this.accessory.context.Brightness;
1317
- }
1318
- if (this.Saturation === undefined) {
1319
- this.Saturation = 0;
1320
- } else {
1321
- this.Saturation = this.accessory.context.Saturation;
1322
- }
1323
- if (this.ColorTemperature === undefined) {
1324
- this.ColorTemperature = 140;
1325
- } else {
1326
- this.ColorTemperature = this.accessory.context.ColorTemperature;
1327
- }
1328
- this.minKelvin = 2000;
1329
- this.maxKelvin = 9000;
1330
- if (this.FirmwareRevision === undefined) {
1331
- this.FirmwareRevision = this.platform.version;
1332
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
1333
- }
1334
- }
1335
-
1336
- async refreshRate(device: device & devicesConfig): Promise<void> {
1337
- if (device.refreshRate) {
1338
- this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate;
1339
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
1340
- } else if (this.platform.config.options!.refreshRate) {
1341
- this.deviceRefreshRate = this.accessory.context.refreshRate = this.platform.config.options!.refreshRate;
1342
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
1343
- }
1344
- }
1345
-
1346
- async deviceConfig(device: device & devicesConfig): Promise<void> {
1347
- let config = {};
1348
- if (device.colorbulb) {
1349
- config = device.colorbulb;
1350
- }
1351
- if (device.connectionType !== undefined) {
1352
- config['connectionType'] = device.connectionType;
1353
- }
1354
- if (device.external !== undefined) {
1355
- config['external'] = device.external;
1356
- }
1357
- if (device.logging !== undefined) {
1358
- config['logging'] = device.logging;
1359
- }
1360
- if (device.refreshRate !== undefined) {
1361
- config['refreshRate'] = device.refreshRate;
1362
- }
1363
- if (device.scanDuration !== undefined) {
1364
- config['scanDuration'] = device.scanDuration;
1365
- }
1366
- if (device.offline !== undefined) {
1367
- config['offline'] = device.offline;
1368
- }
1369
- if (device.maxRetry !== undefined) {
1370
- config['maxRetry'] = device.maxRetry;
1371
- }
1372
- if (device.webhook !== undefined) {
1373
- config['webhook'] = device.webhook;
1374
- }
1375
- if (Object.entries(config).length !== 0) {
1376
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
1377
- }
1378
- }
1379
-
1380
- async deviceLogs(device: device & devicesConfig): Promise<void> {
1381
- if (this.platform.debugMode) {
1382
- this.deviceLogging = this.accessory.context.logging = 'debugMode';
1383
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
1384
- } else if (device.logging) {
1385
- this.deviceLogging = this.accessory.context.logging = device.logging;
1386
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
1387
- } else if (this.platform.config.options?.logging) {
1388
- this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
1389
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
1390
- } else {
1391
- this.deviceLogging = this.accessory.context.logging = 'standard';
1392
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
1393
- }
1394
- }
1395
-
1396
- /**
1397
- * Logging for Device
1398
- */
1399
- infoLog(...log: any[]): void {
1400
- if (this.enablingDeviceLogging()) {
1401
- this.platform.log.info(String(...log));
1402
- }
1403
- }
1404
-
1405
- warnLog(...log: any[]): void {
1406
- if (this.enablingDeviceLogging()) {
1407
- this.platform.log.warn(String(...log));
1408
- }
1409
- }
1410
-
1411
- debugWarnLog(...log: any[]): void {
1412
- if (this.enablingDeviceLogging()) {
1413
- if (this.deviceLogging?.includes('debug')) {
1414
- this.platform.log.warn('[DEBUG]', String(...log));
1415
- }
1416
- }
1417
- }
1418
-
1419
- errorLog(...log: any[]): void {
1420
- if (this.enablingDeviceLogging()) {
1421
- this.platform.log.error(String(...log));
1422
- }
1423
- }
1424
-
1425
- debugErrorLog(...log: any[]): void {
1426
- if (this.enablingDeviceLogging()) {
1427
- if (this.deviceLogging?.includes('debug')) {
1428
- this.platform.log.error('[DEBUG]', String(...log));
1429
- }
1430
- }
1431
- }
1432
-
1433
- debugLog(...log: any[]): void {
1434
- if (this.enablingDeviceLogging()) {
1435
- if (this.deviceLogging === 'debug') {
1436
- this.platform.log.info('[DEBUG]', String(...log));
1437
- } else {
1438
- this.platform.log.debug(String(...log));
1439
- }
1440
- }
1441
- }
1442
-
1443
- enablingDeviceLogging(): boolean {
1444
- return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
1007
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, e);
1008
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, e);
1009
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, e);
1010
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, e);
1011
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, e);
1445
1012
  }
1446
1013
  }