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

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