@switchbot/homebridge-switchbot 3.5.1-beta.12 → 3.5.1-beta.14

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 (150) hide show
  1. package/config.schema.json +19 -3
  2. package/dist/device/blindtilt.d.ts +6 -4
  3. package/dist/device/blindtilt.d.ts.map +1 -1
  4. package/dist/device/blindtilt.js +56 -44
  5. package/dist/device/blindtilt.js.map +1 -1
  6. package/dist/device/bot.d.ts +6 -3
  7. package/dist/device/bot.d.ts.map +1 -1
  8. package/dist/device/bot.js +37 -23
  9. package/dist/device/bot.js.map +1 -1
  10. package/dist/device/ceilinglight.d.ts +6 -3
  11. package/dist/device/ceilinglight.d.ts.map +1 -1
  12. package/dist/device/ceilinglight.js +39 -20
  13. package/dist/device/ceilinglight.js.map +1 -1
  14. package/dist/device/colorbulb.d.ts +6 -3
  15. package/dist/device/colorbulb.d.ts.map +1 -1
  16. package/dist/device/colorbulb.js +41 -30
  17. package/dist/device/colorbulb.js.map +1 -1
  18. package/dist/device/contact.d.ts +6 -3
  19. package/dist/device/contact.d.ts.map +1 -1
  20. package/dist/device/contact.js +39 -27
  21. package/dist/device/contact.js.map +1 -1
  22. package/dist/device/curtain.d.ts +6 -4
  23. package/dist/device/curtain.d.ts.map +1 -1
  24. package/dist/device/curtain.js +34 -21
  25. package/dist/device/curtain.js.map +1 -1
  26. package/dist/device/device.d.ts +6 -3
  27. package/dist/device/device.d.ts.map +1 -1
  28. package/dist/device/device.js +54 -125
  29. package/dist/device/device.js.map +1 -1
  30. package/dist/device/fan.d.ts +6 -3
  31. package/dist/device/fan.d.ts.map +1 -1
  32. package/dist/device/fan.js +47 -28
  33. package/dist/device/fan.js.map +1 -1
  34. package/dist/device/hub.d.ts +6 -3
  35. package/dist/device/hub.d.ts.map +1 -1
  36. package/dist/device/hub.js +42 -25
  37. package/dist/device/hub.js.map +1 -1
  38. package/dist/device/humidifier.d.ts +6 -3
  39. package/dist/device/humidifier.d.ts.map +1 -1
  40. package/dist/device/humidifier.js +42 -25
  41. package/dist/device/humidifier.js.map +1 -1
  42. package/dist/device/iosensor.d.ts +6 -3
  43. package/dist/device/iosensor.d.ts.map +1 -1
  44. package/dist/device/iosensor.js +38 -23
  45. package/dist/device/iosensor.js.map +1 -1
  46. package/dist/device/lightstrip.d.ts +6 -3
  47. package/dist/device/lightstrip.d.ts.map +1 -1
  48. package/dist/device/lightstrip.js +42 -26
  49. package/dist/device/lightstrip.js.map +1 -1
  50. package/dist/device/lock.d.ts +6 -3
  51. package/dist/device/lock.d.ts.map +1 -1
  52. package/dist/device/lock.js +32 -21
  53. package/dist/device/lock.js.map +1 -1
  54. package/dist/device/meter.d.ts +6 -3
  55. package/dist/device/meter.d.ts.map +1 -1
  56. package/dist/device/meter.js +37 -23
  57. package/dist/device/meter.js.map +1 -1
  58. package/dist/device/meterplus.d.ts +6 -3
  59. package/dist/device/meterplus.d.ts.map +1 -1
  60. package/dist/device/meterplus.js +36 -23
  61. package/dist/device/meterplus.js.map +1 -1
  62. package/dist/device/motion.d.ts +6 -3
  63. package/dist/device/motion.d.ts.map +1 -1
  64. package/dist/device/motion.js +32 -21
  65. package/dist/device/motion.js.map +1 -1
  66. package/dist/device/plug.d.ts +6 -3
  67. package/dist/device/plug.d.ts.map +1 -1
  68. package/dist/device/plug.js +26 -15
  69. package/dist/device/plug.js.map +1 -1
  70. package/dist/device/robotvacuumcleaner.d.ts +6 -3
  71. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  72. package/dist/device/robotvacuumcleaner.js +33 -20
  73. package/dist/device/robotvacuumcleaner.js.map +1 -1
  74. package/dist/device/waterdetector.d.ts +6 -3
  75. package/dist/device/waterdetector.d.ts.map +1 -1
  76. package/dist/device/waterdetector.js +37 -22
  77. package/dist/device/waterdetector.js.map +1 -1
  78. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  79. package/dist/irdevice/airconditioner.js +19 -72
  80. package/dist/irdevice/airconditioner.js.map +1 -1
  81. package/dist/irdevice/airpurifier.js +4 -4
  82. package/dist/irdevice/airpurifier.js.map +1 -1
  83. package/dist/irdevice/camera.d.ts.map +1 -1
  84. package/dist/irdevice/camera.js +3 -10
  85. package/dist/irdevice/camera.js.map +1 -1
  86. package/dist/irdevice/fan.d.ts.map +1 -1
  87. package/dist/irdevice/fan.js +7 -25
  88. package/dist/irdevice/fan.js.map +1 -1
  89. package/dist/irdevice/irdevice.d.ts +1 -1
  90. package/dist/irdevice/irdevice.js +2 -2
  91. package/dist/irdevice/irdevice.js.map +1 -1
  92. package/dist/irdevice/light.d.ts.map +1 -1
  93. package/dist/irdevice/light.js +9 -27
  94. package/dist/irdevice/light.js.map +1 -1
  95. package/dist/irdevice/other.js +1 -1
  96. package/dist/irdevice/other.js.map +1 -1
  97. package/dist/irdevice/tv.d.ts.map +1 -1
  98. package/dist/irdevice/tv.js +3 -18
  99. package/dist/irdevice/tv.js.map +1 -1
  100. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  101. package/dist/irdevice/vacuumcleaner.js +2 -9
  102. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  103. package/dist/irdevice/waterheater.d.ts.map +1 -1
  104. package/dist/irdevice/waterheater.js +2 -9
  105. package/dist/irdevice/waterheater.js.map +1 -1
  106. package/dist/platform.d.ts +3 -5
  107. package/dist/platform.d.ts.map +1 -1
  108. package/dist/platform.js +13 -13
  109. package/dist/platform.js.map +1 -1
  110. package/dist/settings.d.ts +9 -8
  111. package/dist/settings.d.ts.map +1 -1
  112. package/dist/settings.js.map +1 -1
  113. package/dist/types/bledevicestatus.d.ts +2 -1
  114. package/dist/types/bledevicestatus.d.ts.map +1 -1
  115. package/dist/types/devicestatus.d.ts +1 -1
  116. package/dist/types/devicestatus.d.ts.map +1 -1
  117. package/package.json +9 -9
  118. package/src/device/blindtilt.ts +59 -46
  119. package/src/device/bot.ts +46 -24
  120. package/src/device/ceilinglight.ts +51 -20
  121. package/src/device/colorbulb.ts +44 -30
  122. package/src/device/contact.ts +42 -27
  123. package/src/device/curtain.ts +44 -22
  124. package/src/device/device.ts +56 -112
  125. package/src/device/fan.ts +60 -29
  126. package/src/device/hub.ts +54 -28
  127. package/src/device/humidifier.ts +54 -30
  128. package/src/device/iosensor.ts +44 -26
  129. package/src/device/lightstrip.ts +47 -27
  130. package/src/device/lock.ts +48 -22
  131. package/src/device/meter.ts +53 -25
  132. package/src/device/meterplus.ts +49 -25
  133. package/src/device/motion.ts +44 -23
  134. package/src/device/plug.ts +33 -16
  135. package/src/device/robotvacuumcleaner.ts +48 -22
  136. package/src/device/waterdetector.ts +55 -24
  137. package/src/irdevice/airconditioner.ts +19 -65
  138. package/src/irdevice/airpurifier.ts +4 -4
  139. package/src/irdevice/camera.ts +4 -9
  140. package/src/irdevice/fan.ts +10 -22
  141. package/src/irdevice/irdevice.ts +2 -2
  142. package/src/irdevice/light.ts +10 -24
  143. package/src/irdevice/other.ts +1 -1
  144. package/src/irdevice/tv.ts +5 -16
  145. package/src/irdevice/vacuumcleaner.ts +3 -8
  146. package/src/irdevice/waterheater.ts +3 -8
  147. package/src/platform.ts +14 -14
  148. package/src/settings.ts +10 -8
  149. package/src/types/bledevicestatus.ts +4 -2
  150. package/src/types/devicestatus.ts +1 -1
@@ -32,6 +32,15 @@ export class StripLight extends deviceBase {
32
32
  ColorTemperature?: CharacteristicValue;
33
33
  };
34
34
 
35
+ // OpenAPI
36
+ deviceStatus!: stripLightStatus;
37
+
38
+ //Webhook
39
+ webhookContext!: stripLightWebhookContext;
40
+
41
+ // BLE
42
+ serviceData!: stripLightServiceData;
43
+
35
44
  // Adaptive Lighting
36
45
  AdaptiveLightingController?: ControllerConstructor | Controller<ControllerServiceMap>;
37
46
  adaptiveLightingShift?: number;
@@ -146,12 +155,11 @@ export class StripLight extends deviceBase {
146
155
  .onSet(this.SaturationSet.bind(this));
147
156
 
148
157
  // Retrieve initial values and updateHomekit
158
+ this.debugLog('Retrieve initial values and update Homekit');
149
159
  this.refreshStatus();
150
160
 
151
- // Update Homekit
152
- this.updateHomeKitCharacteristics();
153
-
154
161
  //regisiter webhook event handler
162
+ this.debugLog('Registering Webhook Event Handler');
155
163
  this.registerWebhook();
156
164
 
157
165
  // Start an update interval
@@ -181,20 +189,24 @@ export class StripLight extends deviceBase {
181
189
  });
182
190
  }
183
191
 
184
- async BLEparseStatus(serviceData: stripLightServiceData): Promise<void> {
192
+ async BLEparseStatus(): Promise<void> {
185
193
  await this.debugLog('BLEparseStatus');
194
+ await this.debugLog(`(power, brightness, color) = BLE:(${this.serviceData.power}, ${this.serviceData.brightness},`
195
+ + ` ${this.serviceData.red}:${this.serviceData.green}:${this.serviceData.blue}), current:(${this.LightBulb.On},`
196
+ + ` ${this.LightBulb.Brightness}, ${this.LightBulb.Hue}, ${this.LightBulb.Saturation})`);
197
+
186
198
  // On
187
- this.LightBulb.On = serviceData.power;
199
+ this.LightBulb.On = this.serviceData.power;
188
200
  await this.debugLog(`On: ${this.LightBulb.On}`);
189
201
 
190
202
  // Brightness
191
- this.LightBulb.Brightness = serviceData.brightness;
203
+ this.LightBulb.Brightness = this.serviceData.brightness;
192
204
  await this.debugLog(`Brightness: ${this.LightBulb.Brightness}`);
193
205
 
194
206
  // Color, Hue & Brightness
195
- await this.debugLog(`red: ${serviceData.red}, green: ${serviceData.green}, blue: ${serviceData.blue}`);
196
- const [hue, saturation] = rgb2hs(serviceData.red, serviceData.green, serviceData.blue);
197
- await this.debugLog(`hs: ${JSON.stringify(rgb2hs(serviceData.red, serviceData.green, serviceData.blue))}`);
207
+ await this.debugLog(`red: ${this.serviceData.red}, green: ${this.serviceData.green}, blue: ${this.serviceData.blue}`);
208
+ const [hue, saturation] = rgb2hs(this.serviceData.red, this.serviceData.green, this.serviceData.blue);
209
+ await this.debugLog(`hs: ${JSON.stringify(rgb2hs(this.serviceData.red, this.serviceData.green, this.serviceData.blue))}`);
198
210
 
199
211
  // Hue
200
212
  this.LightBulb.Hue = hue;
@@ -205,19 +217,23 @@ export class StripLight extends deviceBase {
205
217
  this.debugLog(`Saturation: ${this.LightBulb.Saturation}`);
206
218
  }
207
219
 
208
- async openAPIparseStatus(deviceStatus: stripLightStatus): Promise<void> {
220
+ async openAPIparseStatus(): Promise<void> {
209
221
  await this.debugLog('openAPIparseStatus');
222
+ await this.debugLog(`(power, brightness, color) = API:(${this.deviceStatus.power}, ${this.deviceStatus.brightness},`
223
+ + ` ${this.deviceStatus.color}), current:(${this.LightBulb.On}, ${this.LightBulb.Brightness}, ${this.LightBulb.Hue},`
224
+ + ` ${this.LightBulb.Saturation})`);
225
+
210
226
  // On
211
- this.LightBulb.On = deviceStatus.power === 'on' ? true : false;
227
+ this.LightBulb.On = this.deviceStatus.power === 'on' ? true : false;
212
228
  await this.debugLog(`On: ${this.LightBulb.On}`);
213
229
 
214
230
  // Brightness
215
- this.LightBulb.Brightness = deviceStatus.brightness;
231
+ this.LightBulb.Brightness = this.deviceStatus.brightness;
216
232
  await this.debugLog(`Brightness: ${this.LightBulb.Brightness}`);
217
233
 
218
234
  // Color, Hue & Brightness
219
- await this.debugLog(`color: ${JSON.stringify(deviceStatus.color)}`);
220
- const [red, green, blue] = deviceStatus.color.split(':');
235
+ await this.debugLog(`color: ${JSON.stringify(this.deviceStatus.color)}`);
236
+ const [red, green, blue] = this.deviceStatus.color.split(':');
221
237
  await this.debugLog(`red: ${JSON.stringify(red)}, green: ${JSON.stringify(green)}, blue: ${JSON.stringify(blue)}`);
222
238
  const [hue, saturation] = rgb2hs(red, green, blue);
223
239
  await this.debugLog(`hs: ${JSON.stringify(rgb2hs(red, green, blue))}`);
@@ -231,9 +247,9 @@ export class StripLight extends deviceBase {
231
247
  await this.debugLog(`Saturation: ${this.LightBulb.Saturation}`);
232
248
 
233
249
  // Firmware Version
234
- const version = deviceStatus.version.toString();
235
- await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
236
- if (deviceStatus.version) {
250
+ if (this.deviceStatus.version) {
251
+ const version = this.deviceStatus.version.toString();
252
+ await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
237
253
  const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
238
254
  this.accessory
239
255
  .getService(this.hap.Service.AccessoryInformation)!
@@ -246,22 +262,23 @@ export class StripLight extends deviceBase {
246
262
  }
247
263
  }
248
264
 
249
- async parseStatusWebhook(context: stripLightWebhookContext): Promise<void> {
265
+ async parseStatusWebhook(): Promise<void> {
250
266
  await this.debugLog('parseStatusWebhook');
251
- await this.debugLog(`(powerState, brightness, color) = Webhook:(${context.powerState}, ${context.brightness}, ${context.color}),`
252
- + ` current:(${this.LightBulb.On}, ${this.LightBulb.Brightness}, ${this.LightBulb.Hue}, ${this.LightBulb.Saturation})`);
267
+ await this.debugLog(`(powerState, brightness, color) = Webhook:(${this.webhookContext.powerState}, ${this.webhookContext.brightness},`
268
+ + ` ${this.webhookContext.color}), current:(${this.LightBulb.On}, ${this.LightBulb.Brightness}, ${this.LightBulb.Hue},`
269
+ + ` ${this.LightBulb.Saturation})`);
253
270
 
254
271
  // On
255
- this.LightBulb.On = context.powerState === 'ON' ? true : false;
272
+ this.LightBulb.On = this.webhookContext.powerState === 'ON' ? true : false;
256
273
  await this.debugLog(`On: ${this.LightBulb.On}`);
257
274
 
258
275
  // Brightness
259
- this.LightBulb.Brightness = context.brightness;
276
+ this.LightBulb.Brightness = this.webhookContext.brightness;
260
277
  await this.debugLog(`Brightness: ${this.LightBulb.Brightness}`);
261
278
 
262
279
  // Color, Hue & Brightness
263
- await this.debugLog(`color: ${JSON.stringify(context.color)}`);
264
- const [red, green, blue] = context.color.split(':');
280
+ await this.debugLog(`color: ${JSON.stringify(this.webhookContext.color)}`);
281
+ const [red, green, blue] = this.webhookContext.color.split(':');
265
282
  await this.debugLog(`red: ${JSON.stringify(red)}, green: ${JSON.stringify(green)}, blue: ${JSON.stringify(blue)}`);
266
283
  const [hue, saturation] = rgb2hs(red, green, blue);
267
284
  await this.debugLog(`hs: ${JSON.stringify(rgb2hs(red, green, blue))}`);
@@ -304,7 +321,8 @@ export class StripLight extends deviceBase {
304
321
  const serviceData = await this.monitorAdvertisementPackets(switchbot) as stripLightServiceData;
305
322
  // Update HomeKit
306
323
  if (serviceData.model === SwitchBotBLEModel.StripLight && serviceData.modelName === SwitchBotBLEModelName.StripLight) {
307
- await this.BLEparseStatus(serviceData);
324
+ this.serviceData = serviceData;
325
+ await this.BLEparseStatus();
308
326
  await this.updateHomeKitCharacteristics();
309
327
  } else {
310
328
  await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
@@ -322,7 +340,8 @@ export class StripLight extends deviceBase {
322
340
  await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
323
341
  if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
324
342
  await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
325
- await this.openAPIparseStatus(deviceStatus.body);
343
+ this.deviceStatus = deviceStatus.body;
344
+ await this.openAPIparseStatus();
326
345
  await this.updateHomeKitCharacteristics();
327
346
  } else {
328
347
  await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
@@ -340,7 +359,8 @@ export class StripLight extends deviceBase {
340
359
  this.platform.webhookEventHandler[this.device.deviceId] = async (context: stripLightWebhookContext) => {
341
360
  try {
342
361
  await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
343
- await this.parseStatusWebhook(context);
362
+ this.webhookContext = context;
363
+ await this.parseStatusWebhook();
344
364
  await this.updateHomeKitCharacteristics();
345
365
  } catch (e: any) {
346
366
  await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
@@ -42,6 +42,15 @@ export class Lock extends deviceBase {
42
42
  On: CharacteristicValue;
43
43
  };
44
44
 
45
+ // OpenAPI
46
+ deviceStatus!: lockStatus | lockProStatus;
47
+
48
+ //Webhook
49
+ webhookContext!: lockWebhookContext | lockProWebhookContext;
50
+
51
+ // BLE
52
+ serviceData!: lockServiceData | lockProServiceData;
53
+
45
54
  // Updates
46
55
  lockUpdateInProgress!: boolean;
47
56
  doLockUpdate!: Subject<void>;
@@ -153,12 +162,11 @@ export class Lock extends deviceBase {
153
162
  }
154
163
 
155
164
  // Retrieve initial values and updateHomekit
165
+ this.debugLog('Retrieve initial values and update Homekit');
156
166
  this.refreshStatus();
157
167
 
158
- // Update Homekit
159
- this.updateHomeKitCharacteristics();
160
-
161
168
  //regisiter webhook event handler
169
+ this.debugLog('Registering Webhook Event Handler');
162
170
  this.registerWebhook();
163
171
 
164
172
  // Start an update interval
@@ -188,57 +196,70 @@ export class Lock extends deviceBase {
188
196
  });
189
197
  }
190
198
 
191
- async BLEparseStatus(serviceData: lockServiceData | lockProServiceData): Promise<void> {
199
+ async BLEparseStatus(): Promise<void> {
192
200
  await this.debugLog('BLEparseStatus');
201
+ await this.debugLog(`(lockState) = BLE:(${this.serviceData.status}), current:(${this.LockMechanism.LockCurrentState})`);
202
+
193
203
  // LockCurrentState
194
- this.LockMechanism.LockCurrentState = serviceData.status === 'locked'
204
+ this.LockMechanism.LockCurrentState = this.serviceData.status === 'locked'
195
205
  ? this.hap.Characteristic.LockCurrentState.SECURED : this.hap.Characteristic.LockCurrentState.UNSECURED;
196
206
  await this.debugLog(`LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
207
+
197
208
  // LockTargetState
198
- this.LockMechanism.LockTargetState = serviceData.status === 'locked'
209
+ this.LockMechanism.LockTargetState = this.serviceData.status === 'locked'
199
210
  ? this.hap.Characteristic.LockTargetState.SECURED : this.hap.Characteristic.LockTargetState.UNSECURED;
200
211
  await this.debugLog(`LockTargetState: ${this.LockMechanism.LockTargetState}`);
212
+
201
213
  // Contact Sensor
202
214
  if (!this.device.lock?.hide_contactsensor && this.ContactSensor?.Service) {
203
- this.ContactSensor.ContactSensorState = serviceData.door_open === 'opened'
215
+ this.ContactSensor.ContactSensorState = this.serviceData.door_open === 'opened'
204
216
  ? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED : this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
205
217
  await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
206
218
  }
219
+
207
220
  // BatteryLevel
208
- this.Battery.BatteryLevel = Number(serviceData.battery);
221
+ this.Battery.BatteryLevel = this.serviceData.battery;
209
222
  await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
223
+
210
224
  // StatusLowBattery
211
225
  this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
212
226
  ? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
213
227
  await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
214
228
  }
215
229
 
216
- async openAPIparseStatus(deviceStatus: lockStatus | lockProStatus): Promise<void> {
230
+ async openAPIparseStatus(): Promise<void> {
217
231
  await this.debugLog('openAPIparseStatus');
232
+ await this.debugLog(`(lockState) = OpenAPI:(${this.deviceStatus.lockState}), current:(${this.LockMechanism.LockCurrentState})`);
233
+
218
234
  // LockCurrentState
219
- this.LockMechanism.LockCurrentState = deviceStatus.lockState === 'locked'
235
+ this.LockMechanism.LockCurrentState = this.deviceStatus.lockState === 'locked'
220
236
  ? this.hap.Characteristic.LockCurrentState.SECURED : this.hap.Characteristic.LockCurrentState.UNSECURED;
221
237
  await this.debugLog(`LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
238
+
222
239
  // LockTargetState
223
- this.LockMechanism.LockTargetState = deviceStatus.lockState === 'locked'
240
+ this.LockMechanism.LockTargetState = this.deviceStatus.lockState === 'locked'
224
241
  ? this.hap.Characteristic.LockTargetState.SECURED : this.hap.Characteristic.LockTargetState.UNSECURED;
225
242
  await this.debugLog(`LockTargetState: ${this.LockMechanism.LockTargetState}`);
243
+
226
244
  // ContactSensorState
227
245
  if (!this.device.lock?.hide_contactsensor && this.ContactSensor?.Service) {
228
- this.ContactSensor.ContactSensorState = deviceStatus.doorState === 'opened'
246
+ this.ContactSensor.ContactSensorState = this.deviceStatus.doorState === 'opened'
229
247
  ? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED : this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
230
248
  await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
231
249
  }
250
+
232
251
  // BatteryLevel
233
- this.Battery.BatteryLevel = Number(deviceStatus.battery);
252
+ this.Battery.BatteryLevel = this.deviceStatus.battery;
234
253
  await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
254
+
235
255
  // StatusLowBattery
236
256
  this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
237
257
  ? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
238
258
  await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
259
+
239
260
  // Firmware Version
240
- if (deviceStatus.version) {
241
- const version = deviceStatus.version.toString();
261
+ if (this.deviceStatus.version) {
262
+ const version = this.deviceStatus.version.toString();
242
263
  await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
243
264
  const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
244
265
  this.accessory
@@ -252,15 +273,17 @@ export class Lock extends deviceBase {
252
273
  }
253
274
  }
254
275
 
255
- async parseStatusWebhook(context: lockWebhookContext | lockProWebhookContext): Promise<void> {
276
+ async parseStatusWebhook(): Promise<void> {
256
277
  await this.debugLog('parseStatusWebhook');
257
- await this.debugLog(`(lockState) = Webhook:(${context.lockState}), current:(${this.LockMechanism.LockCurrentState})`);
278
+ await this.debugLog(`(lockState) = Webhook:(${this.webhookContext.lockState}), current:(${this.LockMechanism.LockCurrentState})`);
279
+
258
280
  // LockCurrentState
259
- this.LockMechanism.LockCurrentState = context.lockState === 'LOCKED'
281
+ this.LockMechanism.LockCurrentState = this.webhookContext.lockState === 'LOCKED'
260
282
  ? this.hap.Characteristic.LockCurrentState.SECURED : this.hap.Characteristic.LockCurrentState.UNSECURED;
261
283
  await this.debugLog(`LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
284
+
262
285
  // LockTargetState
263
- this.LockMechanism.LockTargetState = context.lockState === 'LOCKED'
286
+ this.LockMechanism.LockTargetState = this.webhookContext.lockState === 'LOCKED'
264
287
  ? this.hap.Characteristic.LockTargetState.SECURED : this.hap.Characteristic.LockTargetState.UNSECURED;
265
288
  await this.debugLog(`LockTargetState: ${this.LockMechanism.LockTargetState}`);
266
289
  }
@@ -295,7 +318,8 @@ export class Lock extends deviceBase {
295
318
  // Update HomeKit
296
319
  if ((serviceData.model === SwitchBotBLEModel.Lock || SwitchBotBLEModel.LockPro)
297
320
  && (serviceData.modelName === SwitchBotBLEModelName.Lock || SwitchBotBLEModelName.LockPro)) {
298
- await this.BLEparseStatus(serviceData);
321
+ this.serviceData = serviceData;
322
+ await this.BLEparseStatus();
299
323
  await this.updateHomeKitCharacteristics();
300
324
  } else {
301
325
  await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
@@ -313,7 +337,8 @@ export class Lock extends deviceBase {
313
337
  await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
314
338
  if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
315
339
  await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
316
- await this.openAPIparseStatus(deviceStatus.body);
340
+ this.deviceStatus = deviceStatus.body;
341
+ await this.openAPIparseStatus();
317
342
  await this.updateHomeKitCharacteristics();
318
343
  } else {
319
344
  await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
@@ -331,7 +356,8 @@ export class Lock extends deviceBase {
331
356
  this.platform.webhookEventHandler[this.device.deviceId] = async (context: lockWebhookContext | lockProWebhookContext) => {
332
357
  try {
333
358
  await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
334
- await this.parseStatusWebhook(context);
359
+ this.webhookContext = context;
360
+ await this.parseStatusWebhook();
335
361
  await this.updateHomeKitCharacteristics();
336
362
  } catch (e: any) {
337
363
  await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
@@ -37,6 +37,15 @@ export class Meter extends deviceBase {
37
37
  CurrentTemperature: CharacteristicValue;
38
38
  };
39
39
 
40
+ // OpenAPI
41
+ deviceStatus!: meterStatus;
42
+
43
+ //Webhook
44
+ webhookContext!: meterWebhookContext;
45
+
46
+ // BLE
47
+ serviceData!: meterServiceData;
48
+
40
49
  // Updates
41
50
  meterUpdateInProgress!: boolean;
42
51
  doMeterUpdate: Subject<void>;
@@ -136,12 +145,11 @@ export class Meter extends deviceBase {
136
145
  }
137
146
 
138
147
  // Retrieve initial values and updateHomekit
148
+ this.debugLog('Retrieve initial values and update Homekit');
139
149
  this.refreshStatus();
140
150
 
141
- // Retrieve initial values and update Homekit
142
- this.updateHomeKitCharacteristics();
143
-
144
151
  //regisiter webhook event handler
152
+ this.debugLog('Registering Webhook Event Handler');
145
153
  this.registerWebhook();
146
154
 
147
155
  // Start an update interval
@@ -152,51 +160,65 @@ export class Meter extends deviceBase {
152
160
  });
153
161
  }
154
162
 
155
- async BLEparseStatus(serviceData: meterServiceData): Promise<void> {
163
+ async BLEparseStatus(): Promise<void> {
156
164
  await this.debugLog('BLEparseStatus');
165
+ await this.debugLog(`(scale, temperature, humidity) = BLE:(${this.serviceData.fahrenheit}, ${this.serviceData.temperature.c},`
166
+ + ` ${this.serviceData.humidity}), current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity})`);
167
+
157
168
  // CurrentRelativeHumidity
158
169
  if (!this.device.iosensor?.hide_humidity && this.HumiditySensor?.Service) {
159
- this.HumiditySensor.CurrentRelativeHumidity = serviceData.humidity;
170
+ this.HumiditySensor.CurrentRelativeHumidity = this.serviceData.humidity;
160
171
  await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
161
172
  }
173
+
162
174
  // Current Temperature
163
175
  if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
164
- const CELSIUS = serviceData.temperature.c < 0 ? 0 : serviceData.temperature.c > 100 ? 100 : serviceData.temperature.c;
176
+ const CELSIUS = this.serviceData.temperature.c < 0 ? 0 : this.serviceData.temperature.c > 100 ? 100 : this.serviceData.temperature.c;
165
177
  this.TemperatureSensor.CurrentTemperature = CELSIUS;
166
178
  await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
167
179
  }
180
+
168
181
  // BatteryLevel
169
- this.Battery.BatteryLevel = Number(serviceData.battery);
182
+ this.Battery.BatteryLevel = this.serviceData.battery;
170
183
  await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
184
+
171
185
  // StatusLowBattery
172
186
  this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
173
187
  ? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
174
188
  await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
175
189
  }
176
190
 
177
- async openAPIparseStatus(deviceStatus: meterStatus): Promise<void> {
191
+ async openAPIparseStatus(): Promise<void> {
178
192
  await this.debugLog('openAPIparseStatus');
193
+ await this.debugLog(`(battery, temperature, humidity) = OpenAPI:(${this.deviceStatus.battery}, ${this.deviceStatus.temperature},`
194
+ + ` ${this.deviceStatus.humidity}), current:(${this.Battery?.BatteryLevel}, ${this.TemperatureSensor?.CurrentTemperature},`
195
+ + ` ${this.HumiditySensor?.CurrentRelativeHumidity})`);
196
+
179
197
  // CurrentRelativeHumidity
180
198
  if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
181
- this.HumiditySensor.CurrentRelativeHumidity = deviceStatus.humidity;
199
+ this.HumiditySensor.CurrentRelativeHumidity = this.deviceStatus.humidity;
182
200
  await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
183
201
  }
202
+
184
203
  // CurrentTemperature
185
204
  if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
186
- this.TemperatureSensor.CurrentTemperature = deviceStatus.temperature;
205
+ this.TemperatureSensor.CurrentTemperature = this.deviceStatus.temperature;
187
206
  await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
188
207
  }
208
+
189
209
  // BatteryLevel
190
- this.Battery.BatteryLevel = Number(deviceStatus.battery);
210
+ this.Battery.BatteryLevel = this.deviceStatus.battery;
191
211
  await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
212
+
192
213
  // StatusLowBattery
193
214
  this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
194
215
  ? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
195
216
  await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
217
+
196
218
  // FirmwareVersion
197
- const version = deviceStatus.version.toString();
198
- await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
199
- if (deviceStatus.version) {
219
+ if (this.deviceStatus.version) {
220
+ const version = this.deviceStatus.version.toString();
221
+ await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
200
222
  const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
201
223
  this.accessory
202
224
  .getService(this.hap.Service.AccessoryInformation)!
@@ -209,24 +231,27 @@ export class Meter extends deviceBase {
209
231
  }
210
232
  }
211
233
 
212
- async parseStatusWebhook(context: meterWebhookContext): Promise<void> {
234
+ async parseStatusWebhook(): Promise<void> {
213
235
  await this.debugLog('parseStatusWebhook');
214
- await this.debugLog(`(scale, temperature, humidity) = Webhook:(${context.scale}, ${convertUnits(context.temperature, context.scale,
215
- this.device.meter?.convertUnitTo)}, ${context.humidity}), current:(${this.TemperatureSensor?.CurrentTemperature},`
216
- + ` ${this.HumiditySensor?.CurrentRelativeHumidity})`);
236
+ await this.debugLog(`(scale, temperature, humidity) = Webhook:(${this.webhookContext.scale}, ${convertUnits(this.webhookContext.temperature,
237
+ this.webhookContext.scale, this.device.meter?.convertUnitTo)}, ${this.webhookContext.humidity}),`
238
+ + ` current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity})`);
217
239
  // Check if the scale is not CELSIUS
218
- if (context.scale !== 'CELSIUS' && this.device.hub?.convertUnitTo === undefined) {
219
- await this.warnLog(`received a non-CELSIUS Webhook scale: ${context.scale}, Use the *convertUnitsTo* config under Hub settings,`
240
+ if (this.webhookContext.scale !== 'CELSIUS' && this.device.hub?.convertUnitTo === undefined) {
241
+ await this.warnLog(`received a non-CELSIUS Webhook scale: ${this.webhookContext.scale}, Use the *convertUnitsTo* config under Hub settings,`
220
242
  + ' if displaying incorrectly in HomeKit.');
221
243
  }
244
+
222
245
  // CurrentRelativeHumidity
223
246
  if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
224
- this.HumiditySensor.CurrentRelativeHumidity = context.humidity;
247
+ this.HumiditySensor.CurrentRelativeHumidity = this.webhookContext.humidity;
225
248
  await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
226
249
  }
250
+
227
251
  // CurrentTemperature
228
252
  if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
229
- this.TemperatureSensor.CurrentTemperature = convertUnits(context.temperature, context.scale, this.device.hub?.convertUnitTo);
253
+ this.TemperatureSensor.CurrentTemperature = convertUnits(this.webhookContext.temperature, this.webhookContext.scale,
254
+ this.device.hub?.convertUnitTo);
230
255
  await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
231
256
  }
232
257
  }
@@ -260,7 +285,8 @@ export class Meter extends deviceBase {
260
285
  const serviceData = await this.monitorAdvertisementPackets(switchbot) as meterServiceData;
261
286
  // Update HomeKit
262
287
  if (serviceData.model === SwitchBotBLEModel.Meter && serviceData.modelName === SwitchBotBLEModelName.Meter) {
263
- await this.BLEparseStatus(serviceData);
288
+ this.serviceData = serviceData;
289
+ await this.BLEparseStatus();
264
290
  await this.updateHomeKitCharacteristics();
265
291
  } else {
266
292
  await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
@@ -278,7 +304,8 @@ export class Meter extends deviceBase {
278
304
  await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
279
305
  if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
280
306
  await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
281
- await this.openAPIparseStatus(deviceStatus.body);
307
+ this.deviceStatus = deviceStatus.body;
308
+ await this.openAPIparseStatus();
282
309
  await this.updateHomeKitCharacteristics();
283
310
  } else {
284
311
  await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
@@ -296,7 +323,8 @@ export class Meter extends deviceBase {
296
323
  this.platform.webhookEventHandler[this.device.deviceId] = async (context: meterWebhookContext) => {
297
324
  try {
298
325
  await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
299
- await this.parseStatusWebhook(context);
326
+ this.webhookContext = context;
327
+ await this.parseStatusWebhook();
300
328
  await this.updateHomeKitCharacteristics();
301
329
  } catch (e: any) {
302
330
  await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);