@switchbot/homebridge-switchbot 3.5.0-beta.3 → 3.5.0-beta.30

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 (166) hide show
  1. package/CHANGELOG.md +4 -1
  2. package/config.schema.json +147 -9
  3. package/dist/device/blindtilt.d.ts +21 -94
  4. package/dist/device/blindtilt.d.ts.map +1 -1
  5. package/dist/device/blindtilt.js +347 -756
  6. package/dist/device/blindtilt.js.map +1 -1
  7. package/dist/device/bot.d.ts +25 -71
  8. package/dist/device/bot.d.ts.map +1 -1
  9. package/dist/device/bot.js +582 -759
  10. package/dist/device/bot.js.map +1 -1
  11. package/dist/device/ceilinglight.d.ts +13 -67
  12. package/dist/device/ceilinglight.d.ts.map +1 -1
  13. package/dist/device/ceilinglight.js +209 -587
  14. package/dist/device/ceilinglight.js.map +1 -1
  15. package/dist/device/colorbulb.d.ts +13 -74
  16. package/dist/device/colorbulb.d.ts.map +1 -1
  17. package/dist/device/colorbulb.js +250 -632
  18. package/dist/device/colorbulb.js.map +1 -1
  19. package/dist/device/contact.d.ts +14 -65
  20. package/dist/device/contact.d.ts.map +1 -1
  21. package/dist/device/contact.js +204 -531
  22. package/dist/device/contact.js.map +1 -1
  23. package/dist/device/curtain.d.ts +17 -86
  24. package/dist/device/curtain.d.ts.map +1 -1
  25. package/dist/device/curtain.js +335 -786
  26. package/dist/device/curtain.js.map +1 -1
  27. package/dist/device/device.d.ts +59 -0
  28. package/dist/device/device.d.ts.map +1 -0
  29. package/dist/device/device.js +646 -0
  30. package/dist/device/device.js.map +1 -0
  31. package/dist/device/fan.d.ts +51 -0
  32. package/dist/device/fan.d.ts.map +1 -0
  33. package/dist/device/fan.js +499 -0
  34. package/dist/device/fan.js.map +1 -0
  35. package/dist/device/hub.d.ts +15 -59
  36. package/dist/device/hub.d.ts.map +1 -1
  37. package/dist/device/hub.js +242 -596
  38. package/dist/device/hub.js.map +1 -1
  39. package/dist/device/humidifier.d.ts +10 -65
  40. package/dist/device/humidifier.d.ts.map +1 -1
  41. package/dist/device/humidifier.js +207 -571
  42. package/dist/device/humidifier.js.map +1 -1
  43. package/dist/device/iosensor.d.ts +11 -64
  44. package/dist/device/iosensor.d.ts.map +1 -1
  45. package/dist/device/iosensor.js +174 -584
  46. package/dist/device/iosensor.js.map +1 -1
  47. package/dist/device/lightstrip.d.ts +10 -68
  48. package/dist/device/lightstrip.d.ts.map +1 -1
  49. package/dist/device/lightstrip.js +252 -568
  50. package/dist/device/lightstrip.js.map +1 -1
  51. package/dist/device/lock.d.ts +15 -62
  52. package/dist/device/lock.d.ts.map +1 -1
  53. package/dist/device/lock.js +210 -542
  54. package/dist/device/lock.js.map +1 -1
  55. package/dist/device/meter.d.ts +13 -63
  56. package/dist/device/meter.d.ts.map +1 -1
  57. package/dist/device/meter.js +170 -577
  58. package/dist/device/meter.js.map +1 -1
  59. package/dist/device/meterplus.d.ts +13 -64
  60. package/dist/device/meterplus.d.ts.map +1 -1
  61. package/dist/device/meterplus.js +159 -577
  62. package/dist/device/meterplus.js.map +1 -1
  63. package/dist/device/motion.d.ts +13 -69
  64. package/dist/device/motion.d.ts.map +1 -1
  65. package/dist/device/motion.js +136 -518
  66. package/dist/device/motion.js.map +1 -1
  67. package/dist/device/plug.d.ts +9 -57
  68. package/dist/device/plug.d.ts.map +1 -1
  69. package/dist/device/plug.js +82 -452
  70. package/dist/device/plug.js.map +1 -1
  71. package/dist/device/robotvacuumcleaner.d.ts +11 -62
  72. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  73. package/dist/device/robotvacuumcleaner.js +140 -451
  74. package/dist/device/robotvacuumcleaner.js.map +1 -1
  75. package/dist/device/waterdetector.d.ts +9 -70
  76. package/dist/device/waterdetector.d.ts.map +1 -1
  77. package/dist/device/waterdetector.js +121 -664
  78. package/dist/device/waterdetector.js.map +1 -1
  79. package/dist/index.js +1 -1
  80. package/dist/irdevice/airconditioner.d.ts +8 -48
  81. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  82. package/dist/irdevice/airconditioner.js +309 -419
  83. package/dist/irdevice/airconditioner.js.map +1 -1
  84. package/dist/irdevice/airpurifier.d.ts +7 -38
  85. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  86. package/dist/irdevice/airpurifier.js +72 -304
  87. package/dist/irdevice/airpurifier.js.map +1 -1
  88. package/dist/irdevice/camera.d.ts +6 -35
  89. package/dist/irdevice/camera.d.ts.map +1 -1
  90. package/dist/irdevice/camera.js +34 -278
  91. package/dist/irdevice/camera.js.map +1 -1
  92. package/dist/irdevice/fan.d.ts +6 -39
  93. package/dist/irdevice/fan.d.ts.map +1 -1
  94. package/dist/irdevice/fan.js +67 -311
  95. package/dist/irdevice/fan.js.map +1 -1
  96. package/dist/irdevice/irdevice.d.ts +40 -0
  97. package/dist/irdevice/irdevice.d.ts.map +1 -0
  98. package/dist/irdevice/irdevice.js +509 -0
  99. package/dist/irdevice/irdevice.js.map +1 -0
  100. package/dist/irdevice/light.d.ts +6 -34
  101. package/dist/irdevice/light.d.ts.map +1 -1
  102. package/dist/irdevice/light.js +23 -272
  103. package/dist/irdevice/light.js.map +1 -1
  104. package/dist/irdevice/other.d.ts +18 -47
  105. package/dist/irdevice/other.d.ts.map +1 -1
  106. package/dist/irdevice/other.js +352 -546
  107. package/dist/irdevice/other.js.map +1 -1
  108. package/dist/irdevice/tv.d.ts +7 -39
  109. package/dist/irdevice/tv.d.ts.map +1 -1
  110. package/dist/irdevice/tv.js +82 -321
  111. package/dist/irdevice/tv.js.map +1 -1
  112. package/dist/irdevice/vacuumcleaner.d.ts +6 -35
  113. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  114. package/dist/irdevice/vacuumcleaner.js +41 -284
  115. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  116. package/dist/irdevice/waterheater.d.ts +6 -35
  117. package/dist/irdevice/waterheater.d.ts.map +1 -1
  118. package/dist/irdevice/waterheater.js +42 -287
  119. package/dist/irdevice/waterheater.js.map +1 -1
  120. package/dist/platform.d.ts +14 -1
  121. package/dist/platform.d.ts.map +1 -1
  122. package/dist/platform.js +237 -94
  123. package/dist/platform.js.map +1 -1
  124. package/dist/settings.d.ts +40 -10
  125. package/dist/settings.d.ts.map +1 -1
  126. package/dist/settings.js +0 -552
  127. package/dist/settings.js.map +1 -1
  128. package/dist/utils.d.ts +77 -0
  129. package/dist/utils.d.ts.map +1 -1
  130. package/dist/utils.js +638 -1
  131. package/dist/utils.js.map +1 -1
  132. package/package.json +16 -15
  133. package/src/custom.d.ts +2 -1
  134. package/src/device/blindtilt.ts +373 -782
  135. package/src/device/bot.ts +616 -844
  136. package/src/device/ceilinglight.ts +222 -607
  137. package/src/device/colorbulb.ts +264 -656
  138. package/src/device/contact.ts +229 -553
  139. package/src/device/curtain.ts +355 -810
  140. package/src/device/device.ts +673 -0
  141. package/src/device/fan.ts +548 -0
  142. package/src/device/hub.ts +268 -623
  143. package/src/device/humidifier.ts +237 -618
  144. package/src/device/iosensor.ts +200 -610
  145. package/src/device/lightstrip.ts +273 -596
  146. package/src/device/lock.ts +247 -582
  147. package/src/device/meter.ts +196 -601
  148. package/src/device/meterplus.ts +184 -602
  149. package/src/device/motion.ts +156 -541
  150. package/src/device/plug.ts +92 -480
  151. package/src/device/robotvacuumcleaner.ts +161 -477
  152. package/src/device/waterdetector.ts +139 -689
  153. package/src/index.ts +1 -1
  154. package/src/irdevice/airconditioner.ts +330 -446
  155. package/src/irdevice/airpurifier.ts +89 -321
  156. package/src/irdevice/camera.ts +42 -293
  157. package/src/irdevice/fan.ts +78 -327
  158. package/src/irdevice/irdevice.ts +526 -0
  159. package/src/irdevice/light.ts +32 -287
  160. package/src/irdevice/other.ts +396 -615
  161. package/src/irdevice/tv.ts +100 -339
  162. package/src/irdevice/vacuumcleaner.ts +49 -305
  163. package/src/irdevice/waterheater.ts +50 -310
  164. package/src/platform.ts +247 -102
  165. package/src/settings.ts +56 -565
  166. package/src/utils.ts +642 -1
@@ -1,129 +1,84 @@
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';
7
+ import { hs2rgb, rgb2hs, m2hs } from '../utils.js';
3
8
  import { interval, Subject } from 'rxjs';
4
9
  import { SwitchBotPlatform } from '../platform.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
+ import { device, devicesConfig, serviceData, deviceStatus, Devices } from '../settings.js';
12
+ import { Service, PlatformAccessory, CharacteristicValue, ControllerConstructor, Controller, ControllerServiceMap } from 'homebridge';
10
13
 
11
14
  /**
12
15
  * Platform Accessory
13
16
  * An instance of this class is created for each accessory your platform registers
14
17
  * Each accessory may expose multiple services of different service types.
15
18
  */
16
- export class CeilingLight {
17
- public readonly api: API;
18
- public readonly log: Logging;
19
- public readonly config!: SwitchBotPlatformConfig;
20
- protected readonly hap: HAP;
19
+ export class CeilingLight extends deviceBase {
21
20
  // 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;
21
+ private LightBulb: {
22
+ Service: Service;
23
+ On: CharacteristicValue;
24
+ Hue: CharacteristicValue;
25
+ Saturation: CharacteristicValue;
26
+ Brightness: CharacteristicValue;
27
+ ColorTemperature?: CharacteristicValue;
28
+ };
53
29
 
54
30
  // Adaptive Lighting
55
31
  AdaptiveLightingController?: ControllerConstructor | Controller<ControllerServiceMap>;
56
- minKelvin!: number;
57
- maxKelvin!: number;
58
-
59
- // Others
60
- cacheKelvin!: number;
32
+ adaptiveLightingShift?: number;
61
33
 
62
34
  // Updates
63
35
  ceilingLightUpdateInProgress!: boolean;
64
36
  doCeilingLightUpdate!: Subject<void>;
65
37
 
66
- // Connection
67
- private readonly OpenAPI: boolean;
68
- private readonly BLE: boolean;
69
-
70
38
  constructor(
71
- private readonly platform: SwitchBotPlatform,
72
- private accessory: PlatformAccessory,
73
- public device: device & devicesConfig,
39
+ readonly platform: SwitchBotPlatform,
40
+ accessory: PlatformAccessory,
41
+ device: device & devicesConfig,
74
42
  ) {
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';
43
+ super(platform, accessory, device);
82
44
  // default placeholders
83
- this.deviceLogs(device);
84
- this.scan(device);
85
- this.refreshRate(device);
86
45
  this.adaptiveLighting(device);
87
- this.deviceContext();
88
- this.deviceConfig(device);
89
46
 
90
47
  // this is subject we use to track when we need to POST changes to the SwitchBot API
91
48
  this.doCeilingLightUpdate = new Subject();
92
49
  this.ceilingLightUpdateInProgress = false;
93
50
 
51
+ // Initialize LightBulb property
52
+ this.LightBulb = {
53
+ Service: accessory.getService(this.hap.Service.Lightbulb)!,
54
+ On: accessory.context.On || false,
55
+ Hue: accessory.context.Hue || 0,
56
+ Saturation: accessory.context.Saturation || 0,
57
+ Brightness: accessory.context.Brightness || 0,
58
+ ColorTemperature: accessory.context.ColorTemperature || 140,
59
+ };
60
+
94
61
  // Retrieve initial values and updateHomekit
95
62
  this.refreshStatus();
96
63
 
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);
64
+ const LightBulbService = `${accessory.displayName} ${device.deviceType}`;
65
+ (this.LightBulb!.Service = accessory.getService(this.hap.Service.Lightbulb)
66
+ || accessory.addService(this.hap.Service.Lightbulb)), LightBulbService;
104
67
 
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
68
 
111
69
  if (this.adaptiveLightingShift === -1 && this.accessory.context.adaptiveLighting) {
112
- this.accessory.removeService(this.lightBulbService);
113
- this.lightBulbService = this.accessory.addService(this.hap.Service.Lightbulb);
70
+ this.accessory.removeService(this.LightBulb!.Service);
71
+ this.LightBulb!.Service = this.accessory.addService(this.hap.Service.Lightbulb);
114
72
  this.accessory.context.adaptiveLighting = false;
115
73
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${this.accessory.context.adaptiveLighting}`);
116
74
  }
117
75
 
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);
121
- }
76
+ this.LightBulb!.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
122
77
  // handle on / off events using the On characteristic
123
- this.lightBulbService.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
78
+ this.LightBulb!.Service.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
124
79
 
125
80
  // handle Brightness events using the Brightness characteristic
126
- this.lightBulbService
81
+ this.LightBulb!.Service
127
82
  .getCharacteristic(this.hap.Characteristic.Brightness)
128
83
  .setProps({
129
84
  minStep: this.minStep(device),
@@ -132,12 +87,12 @@ export class CeilingLight {
132
87
  validValueRanges: [0, 100],
133
88
  })
134
89
  .onGet(() => {
135
- return this.Brightness;
90
+ return this.LightBulb.Brightness;
136
91
  })
137
92
  .onSet(this.BrightnessSet.bind(this));
138
93
 
139
94
  // handle ColorTemperature events using the ColorTemperature characteristic
140
- this.lightBulbService
95
+ this.LightBulb!.Service
141
96
  .getCharacteristic(this.hap.Characteristic.ColorTemperature)
142
97
  .setProps({
143
98
  minValue: 140,
@@ -145,12 +100,12 @@ export class CeilingLight {
145
100
  validValueRanges: [140, 500],
146
101
  })
147
102
  .onGet(() => {
148
- return this.ColorTemperature!;
103
+ return this.LightBulb.ColorTemperature!;
149
104
  })
150
105
  .onSet(this.ColorTemperatureSet.bind(this));
151
106
 
152
107
  // handle Hue events using the Hue characteristic
153
- this.lightBulbService
108
+ this.LightBulb!.Service
154
109
  .getCharacteristic(this.hap.Characteristic.Hue)
155
110
  .setProps({
156
111
  minValue: 0,
@@ -158,12 +113,12 @@ export class CeilingLight {
158
113
  validValueRanges: [0, 360],
159
114
  })
160
115
  .onGet(() => {
161
- return this.Hue;
116
+ return this.LightBulb.Hue;
162
117
  })
163
118
  .onSet(this.HueSet.bind(this));
164
119
 
165
120
  // handle Hue events using the Hue characteristic
166
- this.lightBulbService
121
+ this.LightBulb!.Service
167
122
  .getCharacteristic(this.hap.Characteristic.Saturation)
168
123
  .setProps({
169
124
  minValue: 0,
@@ -171,13 +126,13 @@ export class CeilingLight {
171
126
  validValueRanges: [0, 100],
172
127
  })
173
128
  .onGet(() => {
174
- return this.Saturation;
129
+ return this.LightBulb.Saturation;
175
130
  })
176
131
  .onSet(this.SaturationSet.bind(this));
177
132
 
178
133
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLightingShift: ${this.adaptiveLightingShift}`);
179
134
  if (this.adaptiveLightingShift !== -1) {
180
- this.AdaptiveLightingController = new platform.api.hap.AdaptiveLightingController(this.lightBulbService, {
135
+ this.AdaptiveLightingController = new platform.api.hap.AdaptiveLightingController(this.LightBulb!.Service, {
181
136
  customTemperatureAdjustment: this.adaptiveLightingShift,
182
137
  });
183
138
  this.accessory.configureController(this.AdaptiveLightingController);
@@ -199,20 +154,41 @@ export class CeilingLight {
199
154
  });
200
155
 
201
156
  //regisiter webhook event handler
202
- if (this.device.webhook) {
203
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
157
+ if (device.webhook) {
158
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
204
159
  this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
205
160
  try {
206
161
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
207
162
  const { powerState, brightness, colorTemperature } = context;
208
- const { On, Brightness, ColorTemperature } = this;
163
+ const { On, Brightness, ColorTemperature } = this.LightBulb;
209
164
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
210
165
  '(powerState, brightness, colorTemperature) = ' +
211
166
  `Webhook:(${powerState}, ${brightness}, ${colorTemperature}), ` +
212
167
  `current:(${On}, ${Brightness}, ${ColorTemperature})`);
213
- this.On = powerState === 'ON' ? true : false;
214
- this.Brightness = brightness;
215
- this.ColorTemperature = colorTemperature;
168
+
169
+ // On
170
+ this.LightBulb.On = powerState === 'ON' ? true : false;
171
+ if (this.accessory.context.Brightness !== this.LightBulb.On) {
172
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
173
+ } else {
174
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
175
+ }
176
+
177
+ // Brightness
178
+ this.LightBulb.Brightness = brightness;
179
+ if (this.accessory.context.Brightness !== this.LightBulb.Brightness) {
180
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
181
+ } else {
182
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
183
+ }
184
+
185
+ // ColorTemperature
186
+ this.LightBulb.ColorTemperature = colorTemperature;
187
+ if (this.accessory.context.ColorTemperature !== this.LightBulb.ColorTemperature) {
188
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
189
+ } else {
190
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
191
+ }
216
192
  this.updateHomeKitCharacteristics();
217
193
  } catch (e: any) {
218
194
  this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
@@ -244,69 +220,44 @@ export class CeilingLight {
244
220
  });
245
221
  }
246
222
 
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
223
  /**
260
- * Parse the device status from the SwitchBot api
224
+ * Parse the device status from the SwitchBotBLE API
261
225
  */
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> {
226
+ async BLEparseStatus(serviceData: serviceData): Promise<void> {
279
227
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
280
228
  // State
281
- switch (this.BLE_On) {
229
+ switch (serviceData.state) {
282
230
  case 'on':
283
- this.On = true;
231
+ this.LightBulb.On = true;
284
232
  break;
285
233
  default:
286
- this.On = false;
234
+ this.LightBulb.On = false;
287
235
  }
288
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
236
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
289
237
  }
290
238
 
291
- async openAPIparseStatus() {
239
+ /**
240
+ * Parse the device status from the SwitchBot OpenAPI
241
+ */
242
+ async openAPIparseStatus(deviceStatus: deviceStatus) {
292
243
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
293
- switch (this.OpenAPI_On) {
244
+ switch (deviceStatus.body.power) {
294
245
  case 'on':
295
- this.On = true;
246
+ this.LightBulb.On = true;
296
247
  break;
297
248
  default:
298
- this.On = false;
249
+ this.LightBulb.On = false;
299
250
  }
300
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
251
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
301
252
 
302
253
  // Brightness
303
- this.Brightness = Number(this.OpenAPI_Brightness);
304
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
254
+ this.LightBulb.Brightness = Number(deviceStatus.body.brightness);
255
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
305
256
 
306
257
  // 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(':');
258
+ if (deviceStatus.body.color) {
259
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(deviceStatus.body.color)}`);
260
+ const [red, green, blue] = deviceStatus.body.color!.split(':');
310
261
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${JSON.stringify(red)}`);
311
262
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${JSON.stringify(green)}`);
312
263
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${JSON.stringify(blue)}`);
@@ -317,28 +268,32 @@ export class CeilingLight {
317
268
  );
318
269
 
319
270
  // Hue
320
- this.Hue = hue;
321
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
271
+ this.LightBulb.Hue = hue;
272
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
322
273
 
323
274
  // Saturation
324
- this.Saturation = saturation;
325
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
275
+ this.LightBulb.Saturation = saturation;
276
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
326
277
  }
327
278
 
328
279
  // 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!);
280
+ if (!Number.isNaN(deviceStatus.body.colorTemperature)) {
281
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} OpenAPI ColorTemperature: ${deviceStatus.body.colorTemperature}`);
282
+ const mired = Math.round(1000000 / deviceStatus.body.colorTemperature!);
332
283
 
333
- this.ColorTemperature = Number(mired);
284
+ this.LightBulb.ColorTemperature = Number(mired);
334
285
 
335
- this.ColorTemperature = Math.max(Math.min(this.ColorTemperature, 500), 140);
336
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
286
+ this.LightBulb.ColorTemperature = Math.max(Math.min(this.LightBulb.ColorTemperature, 500), 140);
287
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
337
288
  }
338
289
 
339
290
  // FirmwareRevision
340
- this.FirmwareRevision = this.OpenAPI_FirmwareRevision!;
341
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
291
+ this.accessory.context.FirmwareRevision = deviceStatus.body.version;
292
+ this.accessory
293
+ .getService(this.hap.Service.AccessoryInformation)!
294
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.FirmwareRevision)
295
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
296
+ .updateValue(this.accessory.context.FirmwareRevision);
342
297
  }
343
298
 
344
299
  /**
@@ -373,110 +328,43 @@ export class CeilingLight {
373
328
  // Start to monitor advertisement packets
374
329
  (async () => {
375
330
  // Start to monitor advertisement packets
376
- await switchbot.startScan({
377
- id: this.device.bleMac,
378
- });
331
+ await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
379
332
  // Set an event handler
380
333
  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') {
334
+ if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
335
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
336
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
384
337
  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
338
  } else {
393
339
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
394
340
  }
395
341
  };
396
- // Wait 1 seconds
342
+ // Wait 10 seconds
397
343
  await switchbot.wait(this.scanDuration * 1000);
398
344
  // Stop to monitor
399
345
  await switchbot.stopScan();
400
346
  // Update HomeKit
401
- await this.BLEparseStatus();
347
+ await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
402
348
  await this.updateHomeKitCharacteristics();
403
349
  })();
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 {
350
+ if (switchbot === undefined) {
457
351
  await this.BLERefreshConnection(switchbot);
458
- }*/
352
+ }
459
353
  }
460
354
 
461
- async openAPIRefreshStatus() {
355
+ async openAPIRefreshStatus(): Promise<void> {
462
356
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
463
357
  try {
464
- const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/status`, {
465
- headers: this.platform.generateHeaders(),
466
- });
358
+ const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries,
359
+ `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
467
360
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
468
361
  const deviceStatus: any = await body.json();
469
362
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
470
363
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
471
364
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
472
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
365
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
473
366
  + `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();
367
+ this.openAPIparseStatus(deviceStatus);
480
368
  this.updateHomeKitCharacteristics();
481
369
  } else {
482
370
  this.statusCode(statusCode);
@@ -526,8 +414,9 @@ export class CeilingLight {
526
414
 
527
415
  async BLEpushChanges(): Promise<void> {
528
416
  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}`);
417
+ if (this.LightBulb.On !== this.accessory.context.On) {
418
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
419
+ + ` BLEpushChanges On: ${this.LightBulb.On} OnCached: ${this.accessory.context.On}`);
531
420
  const switchbot = await this.platform.connectBLE();
532
421
  // Convert to BLE Address
533
422
  this.device.bleMac = this.device
@@ -541,11 +430,11 @@ export class CeilingLight {
541
430
  id: this.device.bleMac,
542
431
  })
543
432
  .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(),
433
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
434
+ return await this.retryBLE({
435
+ max: await this.maxRetryBLE(),
547
436
  fn: async () => {
548
- if (this.On) {
437
+ if (this.LightBulb.On) {
549
438
  return await device_list[0].turnOn({ id: this.device.bleMac });
550
439
  } else {
551
440
  return await device_list[0].turnOff({ id: this.device.bleMac });
@@ -555,7 +444,9 @@ export class CeilingLight {
555
444
  })
556
445
  .then(() => {
557
446
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
558
- this.On = false;
447
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
448
+ + `On: ${this.LightBulb.On} sent over BLE, sent successfully`);
449
+ this.LightBulb.On = false;
559
450
  })
560
451
  .catch(async (e: any) => {
561
452
  this.apiError(e);
@@ -567,16 +458,17 @@ export class CeilingLight {
567
458
  });
568
459
  } else {
569
460
  this.debugLog(
570
- `${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges.` + `On: ${this.On}, ` + `OnCached: ${this.accessory.context.On}`,
461
+ `${this.device.deviceType}: ${this.accessory.displayName}`
462
+ + ` No BLEpushChanges: On: ${this.LightBulb.On}, ` + `OnCached: ${this.accessory.context.On}`,
571
463
  );
572
464
  }
573
465
  }
574
466
 
575
467
  async openAPIpushChanges(): Promise<void> {
576
468
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
577
- if (this.On !== this.accessory.context.On) {
469
+ if (this.LightBulb.On !== this.accessory.context.On) {
578
470
  let command = '';
579
- if (this.On) {
471
+ if (this.LightBulb.On) {
580
472
  command = 'turnOn';
581
473
  } else {
582
474
  command = 'turnOff';
@@ -599,8 +491,10 @@ export class CeilingLight {
599
491
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
600
492
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
601
493
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
602
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
494
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
603
495
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
496
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
497
+ + `request to SwitchBot API, body: ${JSON.stringify(bodyChange)} sent successfully`);
604
498
  } else {
605
499
  this.statusCode(statusCode);
606
500
  this.statusCode(deviceStatus.statusCode);
@@ -615,30 +509,30 @@ export class CeilingLight {
615
509
  } else {
616
510
  this.debugLog(
617
511
  `${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges.` +
618
- `On: ${this.On}, ` +
512
+ `On: ${this.LightBulb.On}, ` +
619
513
  `OnCached: ${this.accessory.context.On}`,
620
514
  );
621
515
  }
622
516
  // Push Hue & Saturation Update
623
- if (this.On) {
517
+ if (this.LightBulb.On) {
624
518
  await this.pushHueSaturationChanges();
625
519
  }
626
520
  // Push ColorTemperature Update
627
- if (this.On) {
521
+ if (this.LightBulb.On) {
628
522
  await this.pushColorTemperatureChanges();
629
523
  }
630
524
  // Push Brightness Update
631
- if (this.On) {
525
+ if (this.LightBulb.On) {
632
526
  await this.pushBrightnessChanges();
633
527
  }
634
528
  }
635
529
 
636
530
  async pushHueSaturationChanges(): Promise<void> {
637
531
  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));
532
+ if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
533
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
534
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
535
+ const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
642
536
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
643
537
  const bodyChange = JSON.stringify({
644
538
  command: 'setColor',
@@ -658,8 +552,10 @@ export class CeilingLight {
658
552
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
659
553
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
660
554
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
661
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
555
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
662
556
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
557
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
558
+ + `request to SwitchBot API, body: ${JSON.stringify(bodyChange)} sent successfully`);
663
559
  } else {
664
560
  this.statusCode(statusCode);
665
561
  this.statusCode(deviceStatus.statusCode);
@@ -673,17 +569,17 @@ export class CeilingLight {
673
569
  }
674
570
  } else {
675
571
  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}`,
572
+ `${this.device.deviceType}: ${this.accessory.displayName} No pushHueSaturationChanges. Hue: ${this.LightBulb.Hue}, ` +
573
+ `HueCached: ${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
678
574
  );
679
575
  }
680
576
  }
681
577
 
682
578
  async pushColorTemperatureChanges(): Promise<void> {
683
579
  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;
580
+ if (this.LightBulb.ColorTemperature !== this.accessory.context.ColorTemperature) {
581
+ const kelvin = Math.round(1000000 / Number(this.LightBulb.ColorTemperature));
582
+ this.accessory.context.kelvin = kelvin;
687
583
  const bodyChange = JSON.stringify({
688
584
  command: 'setColorTemperature',
689
585
  parameter: `${kelvin}`,
@@ -702,7 +598,7 @@ export class CeilingLight {
702
598
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
703
599
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
704
600
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
705
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
601
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
706
602
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
707
603
  } else {
708
604
  this.statusCode(statusCode);
@@ -718,17 +614,17 @@ export class CeilingLight {
718
614
  } else {
719
615
  this.debugLog(
720
616
  `${this.device.deviceType}: ${this.accessory.displayName} No pushColorTemperatureChanges.` +
721
- `ColorTemperature: ${this.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`,
617
+ `ColorTemperature: ${this.LightBulb.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`,
722
618
  );
723
619
  }
724
620
  }
725
621
 
726
622
  async pushBrightnessChanges(): Promise<void> {
727
623
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushBrightnessChanges`);
728
- if (this.Brightness !== this.accessory.context.Brightness) {
624
+ if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
729
625
  const bodyChange = JSON.stringify({
730
626
  command: 'setBrightness',
731
- parameter: `${this.Brightness}`,
627
+ parameter: `${this.LightBulb.Brightness}`,
732
628
  commandType: 'command',
733
629
  });
734
630
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
@@ -744,8 +640,10 @@ export class CeilingLight {
744
640
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
745
641
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
746
642
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
747
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
643
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
748
644
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
645
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
646
+ + `request to SwitchBot API, body: ${JSON.stringify(bodyChange)} sent successfully`);
749
647
  } else {
750
648
  this.statusCode(statusCode);
751
649
  this.statusCode(deviceStatus.statusCode);
@@ -760,7 +658,7 @@ export class CeilingLight {
760
658
  } else {
761
659
  this.debugLog(
762
660
  `${this.device.deviceType}: ${this.accessory.displayName} No pushBrightnessChanges.` +
763
- `Brightness: ${this.Brightness}, ` +
661
+ `Brightness: ${this.LightBulb.Brightness}, ` +
764
662
  `BrightnessCached: ${this.accessory.context.Brightness}`,
765
663
  );
766
664
  }
@@ -770,13 +668,13 @@ export class CeilingLight {
770
668
  * Handle requests to set the value of the "On" characteristic
771
669
  */
772
670
  async OnSet(value: CharacteristicValue): Promise<void> {
773
- if (this.On === this.accessory.context.On) {
671
+ if (this.LightBulb.On === this.accessory.context.On) {
774
672
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set On: ${value}`);
775
673
  } else {
776
674
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set On: ${value}`);
777
675
  }
778
676
 
779
- this.On = value;
677
+ this.LightBulb.On = value;
780
678
  this.doCeilingLightUpdate.next();
781
679
  }
782
680
 
@@ -784,15 +682,15 @@ export class CeilingLight {
784
682
  * Handle requests to set the value of the "Brightness" characteristic
785
683
  */
786
684
  async BrightnessSet(value: CharacteristicValue): Promise<void> {
787
- if (this.Brightness === this.accessory.context.Brightness) {
685
+ if (this.LightBulb.Brightness === this.accessory.context.Brightness) {
788
686
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Brightness: ${value}`);
789
- } else if (this.On) {
687
+ } else if (this.LightBulb.On) {
790
688
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
791
689
  } else {
792
690
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
793
691
  }
794
692
 
795
- this.Brightness = value;
693
+ this.LightBulb.Brightness = value;
796
694
  this.doCeilingLightUpdate.next();
797
695
  }
798
696
 
@@ -800,30 +698,32 @@ export class CeilingLight {
800
698
  * Handle requests to set the value of the "ColorTemperature" characteristic
801
699
  */
802
700
  async ColorTemperatureSet(value: CharacteristicValue): Promise<void> {
803
- if (this.ColorTemperature === this.accessory.context.ColorTemperature) {
701
+ if (this.LightBulb.ColorTemperature === this.accessory.context.ColorTemperature) {
804
702
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set ColorTemperature: ${value}`);
805
- } else if (this.On) {
703
+ } else if (this.LightBulb.On) {
806
704
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
807
705
  } else {
808
706
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
809
707
  }
810
708
 
709
+ const minKelvin = 2000;
710
+ const maxKelvin = 9000;
811
711
  // Convert mired to kelvin to nearest 100 (SwitchBot seems to need this)
812
712
  const kelvin = Math.round(1000000 / Number(value) / 100) * 100;
813
713
 
814
714
  // Check and increase/decrease kelvin to range of device
815
- const k = Math.min(Math.max(kelvin, this.minKelvin), this.maxKelvin);
715
+ const k = Math.min(Math.max(kelvin, minKelvin), maxKelvin);
816
716
 
817
- if (!this.accessory.context.On || this.cacheKelvin === k) {
717
+ if (!this.accessory.context.On || this.accessory.context.kelvin === k) {
818
718
  return;
819
719
  }
820
720
 
821
721
  // Updating the hue/sat to the corresponding values mimics native adaptive lighting
822
722
  const hs = m2hs(value);
823
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Hue, hs[0]);
824
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.Saturation, hs[1]);
723
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.Hue, hs[0]);
724
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.Saturation, hs[1]);
825
725
 
826
- this.ColorTemperature = value;
726
+ this.LightBulb.ColorTemperature = value;
827
727
  this.doCeilingLightUpdate.next();
828
728
  }
829
729
 
@@ -831,17 +731,17 @@ export class CeilingLight {
831
731
  * Handle requests to set the value of the "Hue" characteristic
832
732
  */
833
733
  async HueSet(value: CharacteristicValue): Promise<void> {
834
- if (this.Hue === this.accessory.context.Hue) {
734
+ if (this.LightBulb.Hue === this.accessory.context.Hue) {
835
735
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Hue: ${value}`);
836
- } else if (this.On) {
736
+ } else if (this.LightBulb.On) {
837
737
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
838
738
  } else {
839
739
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
840
740
  }
841
741
 
842
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
742
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
843
743
 
844
- this.Hue = value;
744
+ this.LightBulb.Hue = value;
845
745
  this.doCeilingLightUpdate.next();
846
746
  }
847
747
 
@@ -849,55 +749,56 @@ export class CeilingLight {
849
749
  * Handle requests to set the value of the "Saturation" characteristic
850
750
  */
851
751
  async SaturationSet(value: CharacteristicValue): Promise<void> {
852
- if (this.Saturation === this.accessory.context.Saturation) {
752
+ if (this.LightBulb.Saturation === this.accessory.context.Saturation) {
853
753
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Saturation: ${value}`);
854
- } else if (this.On) {
754
+ } else if (this.LightBulb.On) {
855
755
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
856
756
  } else {
857
757
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
858
758
  }
859
759
 
860
- this.lightBulbService.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
760
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
861
761
 
862
- this.Saturation = value;
762
+ this.LightBulb.Saturation = value;
863
763
  this.doCeilingLightUpdate.next();
864
764
  }
865
765
 
866
766
  async updateHomeKitCharacteristics(): Promise<void> {
867
- if (this.On === undefined) {
868
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
767
+ if (this.LightBulb.On === undefined) {
768
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
869
769
  } 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}`);
770
+ this.accessory.context.On = this.LightBulb.On;
771
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.On, this.LightBulb.On);
772
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.LightBulb.On}`);
873
773
  }
874
- if (this.Brightness === undefined) {
875
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
774
+ if (this.LightBulb.Brightness === undefined) {
775
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
876
776
  } 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}`);
777
+ this.accessory.context.Brightness = this.LightBulb.Brightness;
778
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.Brightness, this.LightBulb.Brightness);
779
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.LightBulb.Brightness}`);
880
780
  }
881
- if (this.ColorTemperature === undefined) {
882
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
781
+ if (this.LightBulb.ColorTemperature === undefined) {
782
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
883
783
  } 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}`);
784
+ this.accessory.context.ColorTemperature = this.LightBulb.ColorTemperature;
785
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, this.LightBulb.ColorTemperature);
786
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
787
+ + ` updateCharacteristic ColorTemperature: ${this.LightBulb.ColorTemperature}`);
887
788
  }
888
- if (this.Hue === undefined) {
889
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
789
+ if (this.LightBulb.Hue === undefined) {
790
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
890
791
  } 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}`);
792
+ this.accessory.context.Hue = this.LightBulb.Hue;
793
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.Hue, this.LightBulb.Hue);
794
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.LightBulb.Hue}`);
894
795
  }
895
- if (this.Saturation === undefined) {
896
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
796
+ if (this.LightBulb.Saturation === undefined) {
797
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
897
798
  } 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}`);
799
+ this.accessory.context.Saturation = this.LightBulb.Saturation;
800
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.Saturation, this.LightBulb.Saturation);
801
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Saturation: ${this.LightBulb.Saturation}`);
901
802
  }
902
803
  }
903
804
 
@@ -911,35 +812,6 @@ export class CeilingLight {
911
812
  }
912
813
  }
913
814
 
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
815
  async BLEPushConnection() {
944
816
  if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
945
817
  this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Push Changes`);
@@ -956,284 +828,27 @@ export class CeilingLight {
956
828
  }
957
829
  }
958
830
 
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
831
  minStep(device: device & devicesConfig): number {
832
+ let set_minStep: number;
980
833
  if (device.ceilinglight?.set_minStep) {
981
- this.set_minStep = device.ceilinglight?.set_minStep;
834
+ set_minStep = device.ceilinglight?.set_minStep;
982
835
  } 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
- }
994
- } 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
- );
836
+ set_minStep = 1;
1077
837
  }
838
+ return set_minStep;
1078
839
  }
1079
840
 
1080
841
  async offlineOff(): Promise<void> {
1081
842
  if (this.device.offline) {
1082
- await this.deviceContext();
1083
- await this.updateHomeKitCharacteristics();
843
+ this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, false);
1084
844
  }
1085
845
  }
1086
846
 
1087
847
  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';
848
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.On, e);
849
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.Hue, e);
850
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.Brightness, e);
851
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.Saturation, e);
852
+ this.LightBulb!.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, e);
1238
853
  }
1239
854
  }