@switchbot/homebridge-switchbot 3.5.0-beta.6 → 3.5.0-beta.60

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 (177) hide show
  1. package/.vscode/settings.json +4 -1
  2. package/CHANGELOG.md +4 -1
  3. package/config.schema.json +120 -17
  4. package/dist/device/blindtilt.d.ts +23 -96
  5. package/dist/device/blindtilt.d.ts.map +1 -1
  6. package/dist/device/blindtilt.js +408 -779
  7. package/dist/device/blindtilt.js.map +1 -1
  8. package/dist/device/bot.d.ts +26 -72
  9. package/dist/device/bot.d.ts.map +1 -1
  10. package/dist/device/bot.js +696 -822
  11. package/dist/device/bot.js.map +1 -1
  12. package/dist/device/ceilinglight.d.ts +14 -68
  13. package/dist/device/ceilinglight.d.ts.map +1 -1
  14. package/dist/device/ceilinglight.js +237 -606
  15. package/dist/device/ceilinglight.js.map +1 -1
  16. package/dist/device/colorbulb.d.ts +14 -75
  17. package/dist/device/colorbulb.d.ts.map +1 -1
  18. package/dist/device/colorbulb.js +279 -658
  19. package/dist/device/colorbulb.js.map +1 -1
  20. package/dist/device/contact.d.ts +15 -66
  21. package/dist/device/contact.d.ts.map +1 -1
  22. package/dist/device/contact.js +242 -544
  23. package/dist/device/contact.js.map +1 -1
  24. package/dist/device/curtain.d.ts +19 -88
  25. package/dist/device/curtain.d.ts.map +1 -1
  26. package/dist/device/curtain.js +402 -805
  27. package/dist/device/curtain.js.map +1 -1
  28. package/dist/device/device.d.ts +59 -0
  29. package/dist/device/device.d.ts.map +1 -0
  30. package/dist/device/device.js +684 -0
  31. package/dist/device/device.js.map +1 -0
  32. package/dist/device/fan.d.ts +51 -0
  33. package/dist/device/fan.d.ts.map +1 -0
  34. package/dist/device/fan.js +535 -0
  35. package/dist/device/fan.js.map +1 -0
  36. package/dist/device/hub.d.ts +16 -60
  37. package/dist/device/hub.d.ts.map +1 -1
  38. package/dist/device/hub.js +246 -613
  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 +232 -593
  43. package/dist/device/humidifier.js.map +1 -1
  44. package/dist/device/iosensor.d.ts +11 -64
  45. package/dist/device/iosensor.d.ts.map +1 -1
  46. package/dist/device/iosensor.js +185 -600
  47. package/dist/device/iosensor.js.map +1 -1
  48. package/dist/device/lightstrip.d.ts +11 -69
  49. package/dist/device/lightstrip.d.ts.map +1 -1
  50. package/dist/device/lightstrip.js +277 -586
  51. package/dist/device/lightstrip.js.map +1 -1
  52. package/dist/device/lock.d.ts +16 -63
  53. package/dist/device/lock.d.ts.map +1 -1
  54. package/dist/device/lock.js +241 -560
  55. package/dist/device/lock.js.map +1 -1
  56. package/dist/device/meter.d.ts +14 -64
  57. package/dist/device/meter.d.ts.map +1 -1
  58. package/dist/device/meter.js +181 -593
  59. package/dist/device/meter.js.map +1 -1
  60. package/dist/device/meterplus.d.ts +14 -65
  61. package/dist/device/meterplus.d.ts.map +1 -1
  62. package/dist/device/meterplus.js +170 -593
  63. package/dist/device/meterplus.js.map +1 -1
  64. package/dist/device/motion.d.ts +13 -69
  65. package/dist/device/motion.d.ts.map +1 -1
  66. package/dist/device/motion.js +178 -531
  67. package/dist/device/motion.js.map +1 -1
  68. package/dist/device/plug.d.ts +9 -57
  69. package/dist/device/plug.d.ts.map +1 -1
  70. package/dist/device/plug.js +92 -458
  71. package/dist/device/plug.js.map +1 -1
  72. package/dist/device/robotvacuumcleaner.d.ts +12 -63
  73. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  74. package/dist/device/robotvacuumcleaner.js +197 -521
  75. package/dist/device/robotvacuumcleaner.js.map +1 -1
  76. package/dist/device/waterdetector.d.ts +10 -65
  77. package/dist/device/waterdetector.d.ts.map +1 -1
  78. package/dist/device/waterdetector.js +139 -495
  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 +9 -49
  88. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  89. package/dist/irdevice/airconditioner.js +309 -419
  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 +72 -304
  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 +34 -278
  98. package/dist/irdevice/camera.js.map +1 -1
  99. package/dist/irdevice/fan.d.ts +10 -43
  100. package/dist/irdevice/fan.d.ts.map +1 -1
  101. package/dist/irdevice/fan.js +100 -338
  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 +330 -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 +87 -357
  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 +352 -546
  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 +82 -321
  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 +41 -284
  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 +42 -287
  126. package/dist/irdevice/waterheater.js.map +1 -1
  127. package/dist/platform.d.ts +19 -6
  128. package/dist/platform.d.ts.map +1 -1
  129. package/dist/platform.js +310 -169
  130. package/dist/platform.js.map +1 -1
  131. package/dist/settings.d.ts +62 -19
  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 +19 -15
  141. package/src/custom.d.ts +2 -1
  142. package/src/device/blindtilt.ts +442 -814
  143. package/src/device/bot.ts +754 -915
  144. package/src/device/ceilinglight.ts +255 -633
  145. package/src/device/colorbulb.ts +294 -685
  146. package/src/device/contact.ts +277 -571
  147. package/src/device/curtain.ts +431 -835
  148. package/src/device/device.ts +709 -0
  149. package/src/device/fan.ts +591 -0
  150. package/src/device/hub.ts +286 -644
  151. package/src/device/humidifier.ts +266 -646
  152. package/src/device/iosensor.ts +220 -625
  153. package/src/device/lightstrip.ts +305 -620
  154. package/src/device/lock.ts +280 -600
  155. package/src/device/meter.ts +216 -617
  156. package/src/device/meterplus.ts +205 -619
  157. package/src/device/motion.ts +206 -556
  158. package/src/device/plug.ts +107 -490
  159. package/src/device/robotvacuumcleaner.ts +223 -550
  160. package/src/device/waterdetector.ts +160 -519
  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 +333 -447
  165. package/src/irdevice/airpurifier.ts +92 -322
  166. package/src/irdevice/camera.ts +45 -294
  167. package/src/irdevice/fan.ts +115 -353
  168. package/src/irdevice/irdevice.ts +346 -0
  169. package/src/irdevice/light.ts +110 -385
  170. package/src/irdevice/other.ts +399 -616
  171. package/src/irdevice/tv.ts +103 -340
  172. package/src/irdevice/vacuumcleaner.ts +52 -306
  173. package/src/irdevice/waterheater.ts +53 -311
  174. package/src/platform.ts +355 -216
  175. package/src/settings.ts +116 -611
  176. package/src/utils.ts +642 -1
  177. package/src/device/waterdetector.json +0 -11
@@ -1,127 +1,92 @@
1
1
  import { request } from 'undici';
2
- import { sleep } from '../utils.js';
3
- import { interval, Subject } from 'rxjs';
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';
2
+ import { deviceBase } from './device.js';
3
+ import { Devices } from '../settings.js';
4
+ import { hs2rgb, rgb2hs, m2hs } from '../utils.js';
5
+ import { interval, skipWhile, Subject } from 'rxjs';
6
+ import { debounceTime, take, tap } from 'rxjs/operators';
7
+
8
+ import type { SwitchBotPlatform } from '../platform.js';
9
+ import type { device, devicesConfig, deviceStatus, serviceData} from '../settings.js';
10
+ import type { Service, PlatformAccessory, CharacteristicValue, ControllerConstructor, Controller, ControllerServiceMap } from 'homebridge';
10
11
 
11
12
  /**
12
13
  * Platform Accessory
13
14
  * An instance of this class is created for each accessory your platform registers
14
15
  * Each accessory may expose multiple services of different service types.
15
16
  */
16
- export class StripLight {
17
- public readonly api: API;
18
- public readonly log: Logging;
19
- public readonly config!: SwitchBotPlatformConfig;
20
- protected readonly hap: HAP;
17
+ export class StripLight extends deviceBase {
21
18
  // 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;
19
+ private LightBulb: {
20
+ Name: CharacteristicValue;
21
+ Service: Service;
22
+ On: CharacteristicValue;
23
+ Hue: CharacteristicValue;
24
+ Saturation: CharacteristicValue;
25
+ Brightness: CharacteristicValue;
26
+ ColorTemperature?: CharacteristicValue;
27
+ };
51
28
 
52
29
  // Adaptive Lighting
53
30
  AdaptiveLightingController?: ControllerConstructor | Controller<ControllerServiceMap>;
54
- minKelvin!: number;
55
- maxKelvin!: number;
56
-
57
- // Others
58
- cacheKelvin!: number;
59
- change!: string;
31
+ adaptiveLightingShift?: number;
60
32
 
61
33
  // Updates
62
34
  stripLightUpdateInProgress!: boolean;
63
35
  doStripLightUpdate!: Subject<void>;
64
36
 
65
- // Connection
66
- private readonly OpenAPI: boolean;
67
- private readonly BLE: boolean;
68
-
69
37
  constructor(
70
- private readonly platform: SwitchBotPlatform,
71
- private accessory: PlatformAccessory,
72
- public device: device & devicesConfig,
38
+ readonly platform: SwitchBotPlatform,
39
+ accessory: PlatformAccessory,
40
+ device: device & devicesConfig,
73
41
  ) {
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
-
42
+ super(platform, accessory, device);
43
+ this.adaptiveLighting(device);
88
44
  // this is subject we use to track when we need to POST changes to the SwitchBot API
89
45
  this.doStripLightUpdate = new Subject();
90
46
  this.stripLightUpdateInProgress = false;
91
47
 
92
- // Retrieve initial values and updateHomekit
93
- this.refreshStatus();
94
-
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
- // get the Lightbulb service if it exists, otherwise create a new Lightbulb service
104
- // 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;
108
-
48
+ // Initialize the LightBulb Service
49
+ this.LightBulb = {
50
+ Name: accessory.context.LightBulbName ?? accessory.displayName,
51
+ Service: accessory.getService(this.hap.Service.Lightbulb) ?? accessory.addService(this.hap.Service.Lightbulb) as Service,
52
+ On: accessory.context.On ?? false,
53
+ Hue: accessory.context.Hue ?? 0,
54
+ Saturation: accessory.context.Saturation ?? 0,
55
+ Brightness: accessory.context.Brightness ?? 0,
56
+ ColorTemperature: accessory.context.ColorTemperature ?? 140,
57
+ };
58
+
59
+ // Adaptive Lighting
109
60
  if (this.adaptiveLightingShift === -1 && this.accessory.context.adaptiveLighting) {
110
- this.accessory.removeService(this.lightBulbService);
111
- this.lightBulbService = this.accessory.addService(this.hap.Service.Lightbulb);
61
+ this.accessory.removeService(this.LightBulb.Service);
62
+ this.LightBulb.Service = this.accessory.addService(this.hap.Service.Lightbulb);
112
63
  this.accessory.context.adaptiveLighting = false;
113
64
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${this.accessory.context.adaptiveLighting}`);
114
65
  }
115
-
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);
66
+ if (this.adaptiveLightingShift !== -1) {
67
+ this.AdaptiveLightingController = new platform.api.hap.AdaptiveLightingController(this.LightBulb.Service, {
68
+ customTemperatureAdjustment: this.adaptiveLightingShift,
69
+ });
70
+ this.accessory.configureController(this.AdaptiveLightingController);
71
+ this.accessory.context.adaptiveLighting = true;
72
+ this.debugLog(
73
+ `${this.device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${this.accessory.context.adaptiveLighting},` +
74
+ ` adaptiveLightingShift: ${this.adaptiveLightingShift}`,
75
+ );
119
76
  }
120
- // handle on / off events using the On characteristic
121
- this.lightBulbService.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
77
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLightingShift: ${this.adaptiveLightingShift}`);
78
+
79
+ // Initialize LightBulb Characteristics
80
+ this.LightBulb.Service
81
+ .setCharacteristic(this.hap.Characteristic.Name, this.LightBulb.Name)
82
+ .getCharacteristic(this.hap.Characteristic.On)
83
+ .onGet(() => {
84
+ return this.LightBulb.On;
85
+ })
86
+ .onSet(this.OnSet.bind(this));
122
87
 
123
- // handle Brightness events using the Brightness characteristic
124
- this.lightBulbService
88
+ // Initialize LightBulb Brightness Characteristic
89
+ this.LightBulb.Service
125
90
  .getCharacteristic(this.hap.Characteristic.Brightness)
126
91
  .setProps({
127
92
  minStep: this.minStep(device),
@@ -130,12 +95,12 @@ export class StripLight {
130
95
  validValueRanges: [0, 100],
131
96
  })
132
97
  .onGet(() => {
133
- return this.Brightness;
98
+ return this.LightBulb.Brightness;
134
99
  })
135
100
  .onSet(this.BrightnessSet.bind(this));
136
101
 
137
- // handle ColorTemperature events using the ColorTemperature characteristic
138
- this.lightBulbService
102
+ // Initialize LightBulb ColorTemperature Characteristic
103
+ this.LightBulb.Service
139
104
  .getCharacteristic(this.hap.Characteristic.ColorTemperature)
140
105
  .setProps({
141
106
  minValue: 140,
@@ -143,12 +108,12 @@ export class StripLight {
143
108
  validValueRanges: [140, 500],
144
109
  })
145
110
  .onGet(() => {
146
- return this.ColorTemperature!;
111
+ return this.LightBulb.ColorTemperature!;
147
112
  })
148
113
  .onSet(this.ColorTemperatureSet.bind(this));
149
114
 
150
- // handle Hue events using the Hue characteristic
151
- this.lightBulbService
115
+ // Initialize LightBulb Hue Characteristic
116
+ this.LightBulb.Service
152
117
  .getCharacteristic(this.hap.Characteristic.Hue)
153
118
  .setProps({
154
119
  minValue: 0,
@@ -156,12 +121,12 @@ export class StripLight {
156
121
  validValueRanges: [0, 360],
157
122
  })
158
123
  .onGet(() => {
159
- return this.Hue;
124
+ return this.LightBulb.Hue;
160
125
  })
161
126
  .onSet(this.HueSet.bind(this));
162
127
 
163
- // handle Hue events using the Hue characteristic
164
- this.lightBulbService
128
+ // Initialize LightBulb Saturation Characteristic
129
+ this.LightBulb.Service
165
130
  .getCharacteristic(this.hap.Characteristic.Saturation)
166
131
  .setProps({
167
132
  minValue: 0,
@@ -169,22 +134,13 @@ export class StripLight {
169
134
  validValueRanges: [0, 100],
170
135
  })
171
136
  .onGet(() => {
172
- return this.Saturation;
137
+ return this.LightBulb.Saturation;
173
138
  })
174
139
  .onSet(this.SaturationSet.bind(this));
140
+ accessory.context.LightBulbName = this.LightBulb.Name;
175
141
 
176
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLightingShift: ${this.adaptiveLightingShift}`);
177
- if (this.adaptiveLightingShift !== -1) {
178
- this.AdaptiveLightingController = new platform.api.hap.AdaptiveLightingController(this.lightBulbService, {
179
- customTemperatureAdjustment: this.adaptiveLightingShift,
180
- });
181
- this.accessory.configureController(this.AdaptiveLightingController);
182
- this.accessory.context.adaptiveLighting = true;
183
- this.debugLog(
184
- `${this.device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${this.accessory.context.adaptiveLighting},` +
185
- ` adaptiveLightingShift: ${this.adaptiveLightingShift}`,
186
- );
187
- }
142
+ // Retrieve initial values and updateHomekit
143
+ this.refreshStatus();
188
144
 
189
145
  // Update Homekit
190
146
  this.updateHomeKitCharacteristics();
@@ -197,19 +153,33 @@ export class StripLight {
197
153
  });
198
154
 
199
155
  //regisiter webhook event handler
200
- if (this.device.webhook) {
201
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
156
+ if (device.webhook) {
157
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
202
158
  this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
203
159
  try {
204
160
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
205
161
  const { powerState, brightness, color, colorTemperature } = context;
206
- const { On, Brightness, Hue, Saturation, ColorTemperature } = this;
162
+ const { On, Brightness, Hue, Saturation, ColorTemperature } = this.LightBulb;
207
163
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
208
164
  '(powerState, brightness, color, colorTemperature) = ' +
209
165
  `Webhook:(${powerState}, ${brightness}, ${color}, ${colorTemperature}), ` +
210
166
  `current:(${On}, ${Brightness}, ${Hue}, ${Saturation}, ${ColorTemperature})`);
211
- this.On = powerState === 'ON' ? true : false;
212
- this.Brightness = brightness;
167
+
168
+ // On
169
+ this.LightBulb.On = powerState === 'ON' ? true : false;
170
+ if (this.accessory.context.Brightness !== this.LightBulb.On) {
171
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
172
+ } else {
173
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
174
+ }
175
+
176
+ // Brightness
177
+ this.LightBulb.Brightness = brightness;
178
+ if (this.accessory.context.Brightness !== this.LightBulb.Brightness) {
179
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
180
+ } else {
181
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
182
+ }
213
183
 
214
184
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(color)}`);
215
185
  const [red, green, blue] = color!.split(':');
@@ -223,13 +193,28 @@ export class StripLight {
223
193
  );
224
194
 
225
195
  // Hue
226
- this.Hue = hue;
227
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
196
+ this.LightBulb.Hue = hue;
197
+ if (this.accessory.context.Hue !== this.LightBulb.Hue) {
198
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
199
+ } else {
200
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
201
+ }
228
202
 
229
203
  // Saturation
230
- this.Saturation = saturation;
231
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
232
-
204
+ this.LightBulb.Saturation = saturation;
205
+ if (this.accessory.context.Saturation !== this.LightBulb.Saturation) {
206
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
207
+ } else {
208
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
209
+ }
210
+
211
+ // ColorTemperature
212
+ this.LightBulb.ColorTemperature = colorTemperature;
213
+ if (this.accessory.context.ColorTemperature !== this.LightBulb.ColorTemperature) {
214
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
215
+ } else {
216
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
217
+ }
233
218
  this.updateHomeKitCharacteristics();
234
219
  } catch (e: any) {
235
220
  this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
@@ -261,56 +246,71 @@ export class StripLight {
261
246
  });
262
247
  }
263
248
 
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> {
249
+ async BLEparseStatus(serviceData: serviceData): Promise<void> {
283
250
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
284
251
  // State
285
- switch (this.BLE_On) {
252
+ switch (serviceData.state) {
286
253
  case 'on':
287
- this.On = true;
254
+ this.LightBulb.On = true;
288
255
  break;
289
256
  default:
290
- this.On = false;
257
+ this.LightBulb.On = false;
258
+ }
259
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
260
+
261
+ // Brightness
262
+ this.LightBulb.Brightness = Number(serviceData.brightness);
263
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
264
+
265
+ // Color, Hue & Brightness
266
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${serviceData.red}`);
267
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${serviceData.green}`);
268
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${serviceData.blue}`);
269
+
270
+ const [hue, saturation] = rgb2hs(Number(serviceData.red), Number(serviceData.green), Number(serviceData.blue));
271
+ this.debugLog(
272
+ `${this.device.deviceType}: ${this.accessory.displayName}` +
273
+ ` hs: ${JSON.stringify(rgb2hs(Number(serviceData.red), Number(serviceData.green), Number(serviceData.blue)))}`,
274
+ );
275
+
276
+ // Hue
277
+ this.LightBulb.Hue = hue;
278
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
279
+
280
+ // Saturation
281
+ this.LightBulb.Saturation = saturation;
282
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
283
+
284
+ // ColorTemperature
285
+ if (serviceData.color_temperature) {
286
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${serviceData.color_temperature}`);
287
+ this.LightBulb.ColorTemperature = serviceData.color_temperature!;
288
+
289
+ this.LightBulb.ColorTemperature = Math.max(Math.min(this.LightBulb.ColorTemperature, 500), 140);
290
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
291
291
  }
292
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
293
292
  }
294
293
 
295
- async openAPIparseStatus(): Promise<void> {
294
+ async openAPIparseStatus(deviceStatus: deviceStatus): Promise<void> {
295
+
296
296
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
297
- switch (this.OpenAPI_On) {
297
+ switch (deviceStatus.body.power) {
298
298
  case 'on':
299
- this.On = true;
299
+ this.LightBulb.On = true;
300
300
  break;
301
301
  default:
302
- this.On = false;
302
+ this.LightBulb.On = false;
303
303
  }
304
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
304
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
305
305
 
306
306
  // Brightness
307
- this.Brightness = Number(this.OpenAPI_Brightness);
308
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
307
+ this.LightBulb.Brightness = Number(deviceStatus.body.brightness);
308
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
309
309
 
310
310
  // 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(':');
311
+ if (deviceStatus.body.color) {
312
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(deviceStatus.body.color)}`);
313
+ const [red, green, blue] = deviceStatus.body.color!.split(':');
314
314
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${JSON.stringify(red)}`);
315
315
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${JSON.stringify(green)}`);
316
316
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${JSON.stringify(blue)}`);
@@ -321,17 +321,25 @@ export class StripLight {
321
321
  );
322
322
 
323
323
  // Hue
324
- this.Hue = hue;
325
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
324
+ this.LightBulb.Hue = hue;
325
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
326
326
 
327
327
  // Saturation
328
- this.Saturation = saturation;
329
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
328
+ this.LightBulb.Saturation = saturation;
329
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
330
330
  }
331
331
 
332
- // FirmwareRevision
333
- this.FirmwareRevision = this.OpenAPI_FirmwareRevision!;
334
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
332
+ // Firmware Version
333
+ const version = deviceStatus.body.version?.toString();
334
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
335
+ if (deviceStatus.body.version) {
336
+ this.accessory.context.version = version?.replace(/^V|-.*$/g, '');
337
+ this.accessory
338
+ .getService(this.hap.Service.AccessoryInformation)!
339
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
340
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
341
+ .updateValue(this.accessory.context.version);
342
+ }
335
343
  }
336
344
 
337
345
  /**
@@ -366,96 +374,43 @@ export class StripLight {
366
374
  // Start to monitor advertisement packets
367
375
  (async () => {
368
376
  // Start to monitor advertisement packets
369
- await switchbot.startScan({
370
- model: 'r',
371
- id: this.device.bleMac,
372
- });
377
+ await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
373
378
  // Set an event handler
374
379
  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') {
380
+ if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
381
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
382
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
378
383
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
379
384
  } else {
380
385
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
381
386
  }
382
387
  };
383
- // Wait 1 seconds
388
+ // Wait 10 seconds
384
389
  await switchbot.wait(this.scanDuration * 1000);
385
390
  // Stop to monitor
386
391
  await switchbot.stopScan();
387
392
  // Update HomeKit
388
- await this.BLEparseStatus();
393
+ await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
389
394
  await this.updateHomeKitCharacteristics();
390
395
  })();
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 {
396
+ if (switchbot === undefined) {
437
397
  await this.BLERefreshConnection(switchbot);
438
- }*/
398
+ }
439
399
  }
440
400
 
441
401
  async openAPIRefreshStatus(): Promise<void> {
442
402
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
443
403
  try {
444
- const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/status`, {
445
- headers: this.platform.generateHeaders(),
446
- });
404
+ const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries,
405
+ `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
447
406
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
448
407
  const deviceStatus: any = await body.json();
449
408
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
450
409
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
451
410
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
452
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
411
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
453
412
  + `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();
413
+ this.openAPIparseStatus(deviceStatus);
459
414
  this.updateHomeKitCharacteristics();
460
415
  } else {
461
416
  this.statusCode(statusCode);
@@ -504,8 +459,9 @@ export class StripLight {
504
459
 
505
460
  async BLEpushChanges(): Promise<void> {
506
461
  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}`);
462
+ if (this.LightBulb.On !== this.accessory.context.On) {
463
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`
464
+ + ` On: ${this.LightBulb.On} OnCached: ${this.accessory.context.On}`);
509
465
  const switchbot = await this.platform.connectBLE();
510
466
  // Convert to BLE Address
511
467
  this.device.bleMac = this.device
@@ -519,11 +475,11 @@ export class StripLight {
519
475
  id: this.device.bleMac,
520
476
  })
521
477
  .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(),
478
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
479
+ return await this.retryBLE({
480
+ max: await this.maxRetryBLE(),
525
481
  fn: async () => {
526
- if (this.On) {
482
+ if (this.LightBulb.On) {
527
483
  return await device_list[0].turnOn({ id: this.device.bleMac });
528
484
  } else {
529
485
  return await device_list[0].turnOff({ id: this.device.bleMac });
@@ -533,34 +489,40 @@ export class StripLight {
533
489
  })
534
490
  .then(() => {
535
491
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
536
- this.On = false;
492
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
493
+ + `On: ${this.LightBulb.On} sent over BLE, sent successfully`);
494
+ this.LightBulb.On = false;
537
495
  })
538
496
  .catch(async (e: any) => {
539
497
  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
- );
498
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushChanges with ${this.device.connectionType}` +
499
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
544
500
  await this.BLEPushConnection();
545
501
  });
546
502
  // Push Brightness Update
547
- if (this.On) {
503
+ if (this.LightBulb.On) {
548
504
  await this.BLEpushBrightnessChanges();
549
505
  }
550
506
  // Push Hue & Saturation Update
551
- if (this.On) {
507
+ if (this.LightBulb.On) {
552
508
  await this.BLEpushRGBChanges();
553
509
  }
510
+ if (this.LightBulb.ColorTemperature !== this.accessory.context.ColorTemperature) {
511
+ const kelvin = Math.round(1000000 / Number(this.LightBulb.ColorTemperature));
512
+ this.accessory.context.kelvin = kelvin;
513
+ } else {
514
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushColorTemperatureChanges.`
515
+ + `ColorTemperature: ${this.LightBulb.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`);
516
+ }
554
517
  } else {
555
- this.debugLog(
556
- `${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges.` + `On: ${this.On}, ` + `OnCached: ${this.accessory.context.On}`,
557
- );
518
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges,`
519
+ + ` On: ${this.LightBulb.On}, OnCached: ${this.accessory.context.On}`);
558
520
  }
559
521
  }
560
522
 
561
523
  async BLEpushBrightnessChanges(): Promise<void> {
562
524
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushBrightnessChanges`);
563
- if (this.Brightness !== this.accessory.context.Brightness) {
525
+ if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
564
526
  const switchbot = await this.platform.connectBLE();
565
527
  // Convert to BLE Address
566
528
  this.device.bleMac = this.device
@@ -574,12 +536,12 @@ export class StripLight {
574
536
  id: this.device.bleMac,
575
537
  })
576
538
  .then(async (device_list: any) => {
577
- this.infoLog(`${this.accessory.displayName} Target Brightness: ${this.Brightness}`);
578
- return await device_list[0].setBrightness(this.Brightness);
539
+ this.infoLog(`${this.accessory.displayName} Target Brightness: ${this.LightBulb.Brightness}`);
540
+ return await device_list[0].setBrightness(this.LightBulb.Brightness);
579
541
  })
580
542
  .then(() => {
581
543
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
582
- this.On = false;
544
+ this.LightBulb.On = false;
583
545
  })
584
546
  .catch(async (e: any) => {
585
547
  this.apiError(e);
@@ -592,7 +554,7 @@ export class StripLight {
592
554
  } else {
593
555
  this.debugLog(
594
556
  `${this.device.deviceType}: ${this.accessory.displayName} No BLEpushBrightnessChanges.` +
595
- `Brightness: ${this.Brightness}, ` +
557
+ `Brightness: ${this.LightBulb.Brightness}, ` +
596
558
  `BrightnessCached: ${this.accessory.context.Brightness}`,
597
559
  );
598
560
  }
@@ -600,11 +562,11 @@ export class StripLight {
600
562
 
601
563
  async BLEpushRGBChanges(): Promise<void> {
602
564
  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)}`);
565
+ if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
566
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
567
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
606
568
 
607
- const [red, green, blue] = hs2rgb(Number(this.Hue), Number(this.Saturation));
569
+ const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
608
570
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
609
571
 
610
572
  const switchbot = await this.platform.connectBLE();
@@ -620,12 +582,12 @@ export class StripLight {
620
582
  id: this.device.bleMac,
621
583
  })
622
584
  .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);
585
+ this.infoLog(`${this.accessory.displayName} Target RGB: ${(this.LightBulb.Brightness, red, green, blue)}`);
586
+ return await device_list[0].setRGB(this.LightBulb.Brightness, red, green, blue);
625
587
  })
626
588
  .then(() => {
627
589
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
628
- this.On = false;
590
+ this.LightBulb.On = false;
629
591
  })
630
592
  .catch(async (e: any) => {
631
593
  this.apiError(e);
@@ -637,17 +599,17 @@ export class StripLight {
637
599
  });
638
600
  } else {
639
601
  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}`,
602
+ `${this.device.deviceType}: ${this.accessory.displayName} No BLEpushRGBChanges. Hue: ${this.LightBulb.Hue}, ` +
603
+ `HueCached: ${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
642
604
  );
643
605
  }
644
606
  }
645
607
 
646
608
  async openAPIpushChanges() {
647
609
  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) {
610
+ if (this.LightBulb.On !== this.accessory.context.On) {
611
+ const command = this.LightBulb.On ? 'turnOn' : 'turnOff';
612
+ /*if (this.LightBulb.On) {
651
613
  command = 'turnOn';
652
614
  } else {
653
615
  command = 'turnOff';
@@ -672,6 +634,8 @@ export class StripLight {
672
634
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
673
635
  this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
674
636
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
637
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
638
+ + `request to SwitchBot API, body: ${JSON.stringify(deviceStatus)} sent successfully`);
675
639
  } else {
676
640
  this.statusCode(statusCode);
677
641
  this.statusCode(deviceStatus.statusCode);
@@ -686,26 +650,26 @@ export class StripLight {
686
650
  } else {
687
651
  this.debugLog(
688
652
  `${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges.` +
689
- `On: ${this.On}, ` +
653
+ `On: ${this.LightBulb.On}, ` +
690
654
  `OnCached: ${this.accessory.context.On}`,
691
655
  );
692
656
  }
693
657
  // Push Hue & Saturation Update
694
- if (this.On) {
658
+ if (this.LightBulb.On) {
695
659
  await this.pushHueSaturationChanges();
696
660
  }
697
661
  // Push Brightness Update
698
- if (this.On) {
662
+ if (this.LightBulb.On) {
699
663
  await this.pushBrightnessChanges();
700
664
  }
701
665
  }
702
666
 
703
667
  async pushHueSaturationChanges(): Promise<void> {
704
668
  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));
669
+ if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
670
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
671
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
672
+ const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
709
673
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
710
674
  // Make Push On request to the API
711
675
  const bodyChange = JSON.stringify({
@@ -728,6 +692,8 @@ export class StripLight {
728
692
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
729
693
  this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
730
694
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
695
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
696
+ + `request to SwitchBot API, body: ${JSON.stringify(deviceStatus)} sent successfully`);
731
697
  } else {
732
698
  this.statusCode(statusCode);
733
699
  this.statusCode(deviceStatus.statusCode);
@@ -741,18 +707,18 @@ export class StripLight {
741
707
  }
742
708
  } else {
743
709
  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}`,
710
+ `${this.device.deviceType}: ${this.accessory.displayName} No pushHueSaturationChanges. Hue: ${this.LightBulb.Hue}, ` +
711
+ `HueCached: ${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
746
712
  );
747
713
  }
748
714
  }
749
715
 
750
716
  async pushBrightnessChanges(): Promise<void> {
751
717
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushBrightnessChanges`);
752
- if (this.Brightness !== this.accessory.context.Brightness) {
718
+ if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
753
719
  const bodyChange = JSON.stringify({
754
720
  command: 'setBrightness',
755
- parameter: `${this.Brightness}`,
721
+ parameter: `${this.LightBulb.Brightness}`,
756
722
  commandType: 'command',
757
723
  });
758
724
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
@@ -770,6 +736,8 @@ export class StripLight {
770
736
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
771
737
  this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
772
738
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
739
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
740
+ + `request to SwitchBot API, body: ${JSON.stringify(deviceStatus)} sent successfully`);
773
741
  } else {
774
742
  this.statusCode(statusCode);
775
743
  this.statusCode(deviceStatus.statusCode);
@@ -784,7 +752,7 @@ export class StripLight {
784
752
  } else {
785
753
  this.debugLog(
786
754
  `${this.device.deviceType}: ${this.accessory.displayName} No pushBrightnessChanges,` +
787
- `Brightness: ${this.Brightness}, ` +
755
+ `Brightness: ${this.LightBulb.Brightness}, ` +
788
756
  `BrightnessCached: ${this.accessory.context.Brightness}`,
789
757
  );
790
758
  }
@@ -794,13 +762,13 @@ export class StripLight {
794
762
  * Handle requests to set the value of the "On" characteristic
795
763
  */
796
764
  async OnSet(value: CharacteristicValue): Promise<void> {
797
- if (this.On === this.accessory.context.On) {
765
+ if (this.LightBulb.On === this.accessory.context.On) {
798
766
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set On: ${value}`);
799
767
  } else {
800
768
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set On: ${value}`);
801
769
  }
802
770
 
803
- this.On = value;
771
+ this.LightBulb.On = value;
804
772
  this.doStripLightUpdate.next();
805
773
  }
806
774
 
@@ -808,15 +776,15 @@ export class StripLight {
808
776
  * Handle requests to set the value of the "Brightness" characteristic
809
777
  */
810
778
  async BrightnessSet(value: CharacteristicValue): Promise<void> {
811
- if (this.Brightness === this.accessory.context.Brightness) {
779
+ if (this.LightBulb.Brightness === this.accessory.context.Brightness) {
812
780
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Brightness: ${value}`);
813
- } else if (this.On) {
781
+ } else if (this.LightBulb.On) {
814
782
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
815
783
  } else {
816
784
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
817
785
  }
818
786
 
819
- this.Brightness = value;
787
+ this.LightBulb.Brightness = value;
820
788
  this.doStripLightUpdate.next();
821
789
  }
822
790
 
@@ -824,30 +792,31 @@ export class StripLight {
824
792
  * Handle requests to set the value of the "ColorTemperature" characteristic
825
793
  */
826
794
  async ColorTemperatureSet(value: CharacteristicValue): Promise<void> {
827
- if (this.ColorTemperature === this.accessory.context.ColorTemperature) {
795
+ if (this.LightBulb.ColorTemperature === this.accessory.context.ColorTemperature) {
828
796
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set ColorTemperature: ${value}`);
829
- } else if (this.On) {
797
+ } else if (this.LightBulb.On) {
830
798
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
831
799
  } else {
832
800
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
833
801
  }
834
802
 
803
+ const minKelvin = 2000;
804
+ const maxKelvin = 9000;
835
805
  // Convert mired to kelvin to nearest 100 (SwitchBot seems to need this)
836
806
  const kelvin = Math.round(1000000 / Number(value) / 100) * 100;
837
-
838
807
  // Check and increase/decrease kelvin to range of device
839
- const k = Math.min(Math.max(kelvin, this.minKelvin), this.maxKelvin);
808
+ const k = Math.min(Math.max(kelvin, minKelvin), maxKelvin);
840
809
 
841
- if (!this.accessory.context.On || this.cacheKelvin === k) {
810
+ if (!this.accessory.context.On || this.accessory.context.maxKelvin === k) {
842
811
  return;
843
812
  }
844
813
 
845
814
  // Updating the hue/sat to the corresponding values mimics native adaptive lighting
846
815
  const hs = m2hs(value);
847
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Hue, hs[0]);
848
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Saturation, hs[1]);
816
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, hs[0]);
817
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, hs[1]);
849
818
 
850
- this.ColorTemperature = value;
819
+ this.LightBulb.ColorTemperature = value;
851
820
  this.doStripLightUpdate.next();
852
821
  }
853
822
 
@@ -855,17 +824,17 @@ export class StripLight {
855
824
  * Handle requests to set the value of the "Hue" characteristic
856
825
  */
857
826
  async HueSet(value: CharacteristicValue): Promise<void> {
858
- if (this.Hue === this.accessory.context.Hue) {
827
+ if (this.LightBulb.Hue === this.accessory.context.Hue) {
859
828
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Hue: ${value}`);
860
- } else if (this.On) {
829
+ } else if (this.LightBulb.On) {
861
830
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
862
831
  } else {
863
832
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
864
833
  }
865
834
 
866
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
835
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
867
836
 
868
- this.Hue = value;
837
+ this.LightBulb.Hue = value;
869
838
  this.doStripLightUpdate.next();
870
839
  }
871
840
 
@@ -873,89 +842,61 @@ export class StripLight {
873
842
  * Handle requests to set the value of the "Saturation" characteristic
874
843
  */
875
844
  async SaturationSet(value: CharacteristicValue): Promise<void> {
876
- if (this.Saturation === this.accessory.context.Saturation) {
845
+ if (this.LightBulb.Saturation === this.accessory.context.Saturation) {
877
846
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Saturation: ${value}`);
878
- } else if (this.On) {
847
+ } else if (this.LightBulb.On) {
879
848
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
880
849
  } else {
881
850
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
882
851
  }
883
852
 
884
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
853
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
885
854
 
886
- this.Saturation = value;
855
+ this.LightBulb.Saturation = value;
887
856
  this.doStripLightUpdate.next();
888
857
  }
889
858
 
890
859
  async updateHomeKitCharacteristics(): Promise<void> {
891
860
  // On
892
- if (this.On === undefined) {
893
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
861
+ if (this.LightBulb.On === undefined) {
862
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
894
863
  } 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}`);
864
+ this.accessory.context.On = this.LightBulb.On;
865
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, this.LightBulb.On);
866
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.LightBulb.On}`);
898
867
  }
899
868
  // Brightness
900
- if (this.Brightness === undefined) {
901
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
869
+ if (this.LightBulb.Brightness === undefined) {
870
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
902
871
  } 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}`);
872
+ this.accessory.context.Brightness = this.LightBulb.Brightness;
873
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, this.LightBulb.Brightness);
874
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.LightBulb.Brightness}`);
906
875
  }
907
876
  // ColorTemperature
908
- if (this.ColorTemperature === undefined) {
909
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
877
+ if (this.LightBulb.ColorTemperature === undefined) {
878
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
910
879
  } 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}`);
880
+ this.accessory.context.ColorTemperature = this.LightBulb.ColorTemperature;
881
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, this.LightBulb.ColorTemperature);
882
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
883
+ + ` ColorTemperature: ${this.LightBulb.ColorTemperature}`);
914
884
  }
915
885
  // Hue
916
- if (this.Hue === undefined) {
917
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
886
+ if (this.LightBulb.Hue === undefined) {
887
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
918
888
  } 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}`);
889
+ this.accessory.context.Hue = this.LightBulb.Hue;
890
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, this.LightBulb.Hue);
891
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.LightBulb.Hue}`);
922
892
  }
923
893
  // 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();
894
+ if (this.LightBulb.Saturation === undefined) {
895
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
938
896
  } 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
- })();
897
+ this.accessory.context.Saturation = this.LightBulb.Saturation;
898
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, this.LightBulb.Saturation);
899
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Saturation: ${this.LightBulb.Saturation}`);
959
900
  }
960
901
  }
961
902
 
@@ -975,33 +916,14 @@ export class StripLight {
975
916
  }
976
917
  }
977
918
 
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
919
  minStep(device: device & devicesConfig): number {
920
+ let set_minStep: number;
999
921
  if (device.striplight?.set_minStep) {
1000
- this.set_minStep = device.striplight?.set_minStep;
922
+ set_minStep = device.striplight?.set_minStep;
1001
923
  } else {
1002
- this.set_minStep = 1;
924
+ set_minStep = 1;
1003
925
  }
1004
- return this.set_minStep;
926
+ return set_minStep;
1005
927
  }
1006
928
 
1007
929
  async adaptiveLighting(device: device & devicesConfig): Promise<void> {
@@ -1014,254 +936,17 @@ export class StripLight {
1014
936
  }
1015
937
  }
1016
938
 
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
939
  async offlineOff(): Promise<void> {
1110
940
  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
- }
941
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, false);
1261
942
  }
1262
943
  }
1263
944
 
1264
- enablingDeviceLogging(): boolean {
1265
- return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
945
+ async apiError(e: any): Promise<void> {
946
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, e);
947
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, e);
948
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, e);
949
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, e);
950
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, e);
1266
951
  }
1267
952
  }