@switchbot/homebridge-switchbot 3.5.0-beta.7 → 3.5.0-beta.70

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