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