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

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