@switchbot/homebridge-switchbot 3.5.1-beta.8 → 3.5.1

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 (159) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/config.schema.json +19 -3
  3. package/dist/device/blindtilt.d.ts +6 -4
  4. package/dist/device/blindtilt.d.ts.map +1 -1
  5. package/dist/device/blindtilt.js +60 -46
  6. package/dist/device/blindtilt.js.map +1 -1
  7. package/dist/device/bot.d.ts +6 -3
  8. package/dist/device/bot.d.ts.map +1 -1
  9. package/dist/device/bot.js +59 -25
  10. package/dist/device/bot.js.map +1 -1
  11. package/dist/device/ceilinglight.d.ts +6 -3
  12. package/dist/device/ceilinglight.d.ts.map +1 -1
  13. package/dist/device/ceilinglight.js +47 -29
  14. package/dist/device/ceilinglight.js.map +1 -1
  15. package/dist/device/colorbulb.d.ts +6 -3
  16. package/dist/device/colorbulb.d.ts.map +1 -1
  17. package/dist/device/colorbulb.js +53 -36
  18. package/dist/device/colorbulb.js.map +1 -1
  19. package/dist/device/contact.d.ts +6 -3
  20. package/dist/device/contact.d.ts.map +1 -1
  21. package/dist/device/contact.js +45 -31
  22. package/dist/device/contact.js.map +1 -1
  23. package/dist/device/curtain.d.ts +6 -4
  24. package/dist/device/curtain.d.ts.map +1 -1
  25. package/dist/device/curtain.js +41 -27
  26. package/dist/device/curtain.js.map +1 -1
  27. package/dist/device/device.d.ts +6 -3
  28. package/dist/device/device.d.ts.map +1 -1
  29. package/dist/device/device.js +59 -152
  30. package/dist/device/device.js.map +1 -1
  31. package/dist/device/fan.d.ts +6 -3
  32. package/dist/device/fan.d.ts.map +1 -1
  33. package/dist/device/fan.js +53 -32
  34. package/dist/device/fan.js.map +1 -1
  35. package/dist/device/hub.d.ts +6 -3
  36. package/dist/device/hub.d.ts.map +1 -1
  37. package/dist/device/hub.js +49 -30
  38. package/dist/device/hub.js.map +1 -1
  39. package/dist/device/humidifier.d.ts +6 -3
  40. package/dist/device/humidifier.d.ts.map +1 -1
  41. package/dist/device/humidifier.js +47 -28
  42. package/dist/device/humidifier.js.map +1 -1
  43. package/dist/device/iosensor.d.ts +6 -3
  44. package/dist/device/iosensor.d.ts.map +1 -1
  45. package/dist/device/iosensor.js +44 -27
  46. package/dist/device/iosensor.js.map +1 -1
  47. package/dist/device/lightstrip.d.ts +6 -3
  48. package/dist/device/lightstrip.d.ts.map +1 -1
  49. package/dist/device/lightstrip.js +46 -28
  50. package/dist/device/lightstrip.js.map +1 -1
  51. package/dist/device/lock.d.ts +6 -3
  52. package/dist/device/lock.d.ts.map +1 -1
  53. package/dist/device/lock.js +38 -25
  54. package/dist/device/lock.js.map +1 -1
  55. package/dist/device/meter.d.ts +6 -3
  56. package/dist/device/meter.d.ts.map +1 -1
  57. package/dist/device/meter.js +43 -27
  58. package/dist/device/meter.js.map +1 -1
  59. package/dist/device/meterplus.d.ts +6 -3
  60. package/dist/device/meterplus.d.ts.map +1 -1
  61. package/dist/device/meterplus.js +42 -27
  62. package/dist/device/meterplus.js.map +1 -1
  63. package/dist/device/motion.d.ts +6 -3
  64. package/dist/device/motion.d.ts.map +1 -1
  65. package/dist/device/motion.js +37 -24
  66. package/dist/device/motion.js.map +1 -1
  67. package/dist/device/plug.d.ts +6 -3
  68. package/dist/device/plug.d.ts.map +1 -1
  69. package/dist/device/plug.js +30 -17
  70. package/dist/device/plug.js.map +1 -1
  71. package/dist/device/robotvacuumcleaner.d.ts +6 -3
  72. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  73. package/dist/device/robotvacuumcleaner.js +37 -22
  74. package/dist/device/robotvacuumcleaner.js.map +1 -1
  75. package/dist/device/waterdetector.d.ts +6 -3
  76. package/dist/device/waterdetector.d.ts.map +1 -1
  77. package/dist/device/waterdetector.js +44 -25
  78. package/dist/device/waterdetector.js.map +1 -1
  79. package/dist/homebridge-ui/public/index.html +2 -2
  80. package/dist/irdevice/airconditioner.d.ts +1 -3
  81. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  82. package/dist/irdevice/airconditioner.js +67 -177
  83. package/dist/irdevice/airconditioner.js.map +1 -1
  84. package/dist/irdevice/airpurifier.d.ts +0 -1
  85. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  86. package/dist/irdevice/airpurifier.js +24 -53
  87. package/dist/irdevice/airpurifier.js.map +1 -1
  88. package/dist/irdevice/camera.d.ts.map +1 -1
  89. package/dist/irdevice/camera.js +12 -17
  90. package/dist/irdevice/camera.js.map +1 -1
  91. package/dist/irdevice/fan.d.ts.map +1 -1
  92. package/dist/irdevice/fan.js +22 -38
  93. package/dist/irdevice/fan.js.map +1 -1
  94. package/dist/irdevice/irdevice.d.ts +22 -10
  95. package/dist/irdevice/irdevice.d.ts.map +1 -1
  96. package/dist/irdevice/irdevice.js +94 -100
  97. package/dist/irdevice/irdevice.js.map +1 -1
  98. package/dist/irdevice/light.d.ts.map +1 -1
  99. package/dist/irdevice/light.js +20 -38
  100. package/dist/irdevice/light.js.map +1 -1
  101. package/dist/irdevice/other.d.ts.map +1 -1
  102. package/dist/irdevice/other.js +79 -77
  103. package/dist/irdevice/other.js.map +1 -1
  104. package/dist/irdevice/tv.d.ts.map +1 -1
  105. package/dist/irdevice/tv.js +38 -53
  106. package/dist/irdevice/tv.js.map +1 -1
  107. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  108. package/dist/irdevice/vacuumcleaner.js +11 -16
  109. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  110. package/dist/irdevice/waterheater.d.ts.map +1 -1
  111. package/dist/irdevice/waterheater.js +11 -16
  112. package/dist/irdevice/waterheater.js.map +1 -1
  113. package/dist/platform.d.ts +4 -6
  114. package/dist/platform.d.ts.map +1 -1
  115. package/dist/platform.js +564 -665
  116. package/dist/platform.js.map +1 -1
  117. package/dist/settings.d.ts +10 -8
  118. package/dist/settings.d.ts.map +1 -1
  119. package/dist/settings.js.map +1 -1
  120. package/dist/types/bledevicestatus.d.ts +2 -1
  121. package/dist/types/bledevicestatus.d.ts.map +1 -1
  122. package/dist/types/devicestatus.d.ts +1 -1
  123. package/dist/types/devicestatus.d.ts.map +1 -1
  124. package/package.json +11 -11
  125. package/src/device/blindtilt.ts +64 -48
  126. package/src/device/bot.ts +79 -26
  127. package/src/device/ceilinglight.ts +57 -31
  128. package/src/device/colorbulb.ts +57 -43
  129. package/src/device/contact.ts +49 -31
  130. package/src/device/curtain.ts +51 -28
  131. package/src/device/device.ts +61 -135
  132. package/src/device/fan.ts +67 -33
  133. package/src/device/hub.ts +62 -33
  134. package/src/device/humidifier.ts +60 -33
  135. package/src/device/iosensor.ts +51 -30
  136. package/src/device/lightstrip.ts +52 -29
  137. package/src/device/lock.ts +55 -26
  138. package/src/device/meter.ts +60 -29
  139. package/src/device/meterplus.ts +56 -29
  140. package/src/device/motion.ts +50 -26
  141. package/src/device/plug.ts +38 -18
  142. package/src/device/robotvacuumcleaner.ts +53 -24
  143. package/src/device/waterdetector.ts +63 -27
  144. package/src/homebridge-ui/public/index.html +2 -2
  145. package/src/irdevice/airconditioner.ts +76 -165
  146. package/src/irdevice/airpurifier.ts +29 -49
  147. package/src/irdevice/camera.ts +13 -16
  148. package/src/irdevice/fan.ts +25 -35
  149. package/src/irdevice/irdevice.ts +97 -96
  150. package/src/irdevice/light.ts +21 -35
  151. package/src/irdevice/other.ts +79 -77
  152. package/src/irdevice/tv.ts +40 -51
  153. package/src/irdevice/vacuumcleaner.ts +12 -15
  154. package/src/irdevice/waterheater.ts +12 -15
  155. package/src/platform.ts +566 -696
  156. package/src/settings.ts +11 -8
  157. package/src/types/bledevicestatus.ts +4 -2
  158. package/src/types/devicestatus.ts +1 -1
  159. package/.github/npm-version-script.cjs +0 -81
package/src/device/hub.ts CHANGED
@@ -36,6 +36,15 @@ export class Hub extends deviceBase {
36
36
  CurrentTemperature: CharacteristicValue;
37
37
  };
38
38
 
39
+ // OpenAPI
40
+ deviceStatus!: hub2Status;
41
+
42
+ //Webhook
43
+ webhookContext!: hub2WebhookContext;
44
+
45
+ // BLE
46
+ serviceData!: hub2ServiceData;
47
+
39
48
  // Updates
40
49
  hubUpdateInProgress!: boolean;
41
50
  doHubUpdate!: Subject<void>;
@@ -46,6 +55,9 @@ export class Hub extends deviceBase {
46
55
  device: device & devicesConfig,
47
56
  ) {
48
57
  super(platform, accessory, device);
58
+ // Set category
59
+ accessory.category = this.hap.Categories.SENSOR;
60
+
49
61
  // this is subject we use to track when we need to POST changes to the SwitchBot API
50
62
  this.doHubUpdate = new Subject();
51
63
  this.hubUpdateInProgress = false;
@@ -53,7 +65,7 @@ export class Hub extends deviceBase {
53
65
  // Initialize Temperature Sensor Service
54
66
  if (device.hub?.hide_temperature) {
55
67
  if (this.TemperatureSensor) {
56
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Temperature Sensor Service`);
68
+ this.debugLog('Removing Temperature Sensor Service');
57
69
  this.TemperatureSensor.Service = this.accessory.getService(this.hap.Service.TemperatureSensor) as Service;
58
70
  accessory.removeService(this.TemperatureSensor.Service);
59
71
  }
@@ -85,7 +97,7 @@ export class Hub extends deviceBase {
85
97
  // Initialize Humidity Sensor Service
86
98
  if (device.hub?.hide_humidity) {
87
99
  if (this.HumiditySensor) {
88
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Humidity Sensor Service`);
100
+ this.debugLog('Removing Humidity Sensor Service');
89
101
  this.HumiditySensor.Service = this.accessory.getService(this.hap.Service.HumiditySensor) as Service;
90
102
  accessory.removeService(this.HumiditySensor.Service);
91
103
  }
@@ -113,7 +125,7 @@ export class Hub extends deviceBase {
113
125
  // Initialize Light Sensor Service
114
126
  if (device.hub?.hide_lightsensor) {
115
127
  if (this.LightSensor) {
116
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Light Sensor Service`);
128
+ this.debugLog('Removing Light Sensor Service');
117
129
  this.LightSensor.Service = this.accessory.getService(this.hap.Service.LightSensor) as Service;
118
130
  accessory.removeService(this.LightSensor.Service);
119
131
  }
@@ -139,12 +151,11 @@ export class Hub extends deviceBase {
139
151
  }
140
152
 
141
153
  // Retrieve initial values and updateHomekit
154
+ this.debugLog('Retrieve initial values and update Homekit');
142
155
  this.refreshStatus();
143
156
 
144
- // Retrieve initial values and update Homekit
145
- this.updateHomeKitCharacteristics();
146
-
147
157
  //regisiter webhook event handler
158
+ this.debugLog('Registering Webhook Event Handler');
148
159
  this.registerWebhook();
149
160
 
150
161
  // Start an update interval
@@ -156,39 +167,49 @@ export class Hub extends deviceBase {
156
167
 
157
168
  }
158
169
 
159
- async BLEparseStatus(serviceData: hub2ServiceData): Promise<void> {
170
+ async BLEparseStatus(): Promise<void> {
160
171
  await this.debugLog('BLEparseStatus');
172
+ await this.debugLog(`(temperature, humidity, lightLevel) = BLE:(${this.serviceData.temperature}, ${this.serviceData.humidity},`
173
+ + ` ${this.serviceData.lightLevel}), current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity},`
174
+ + ` ${this.LightSensor?.CurrentAmbientLightLevel})`);
175
+
161
176
  // CurrentTemperature
162
177
  if (!this.device.hub?.hide_temperature && this.TemperatureSensor?.Service) {
163
- this.TemperatureSensor.CurrentTemperature = serviceData.temperature;
178
+ this.TemperatureSensor.CurrentTemperature = this.serviceData.temperature;
164
179
  await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
165
180
  }
181
+
166
182
  // CurrentRelativeHumidity
167
183
  if (!this.device.hub?.hide_humidity && this.HumiditySensor?.Service) {
168
- this.HumiditySensor!.CurrentRelativeHumidity = Number(serviceData.humidity);
184
+ this.HumiditySensor!.CurrentRelativeHumidity = this.serviceData.humidity;
169
185
  await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
170
186
  }
187
+
171
188
  // CurrentAmbientLightLevel
172
189
  if (!this.device.hub?.hide_lightsensor && this.LightSensor?.Service) {
173
190
  const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
174
191
  const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
175
- const lightLevel = Number(serviceData.lightLevel);
192
+ const lightLevel = this.serviceData.lightLevel;
176
193
  this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 19);
177
- await this.debugLog(`LightLevel: ${serviceData.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
194
+ await this.debugLog(`LightLevel: ${this.serviceData.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
178
195
  }
179
196
  }
180
197
 
181
- async openAPIparseStatus(deviceStatus: hub2Status): Promise<void> {
198
+ async openAPIparseStatus(): Promise<void> {
182
199
  await this.debugLog('openAPIparseStatus');
200
+ await this.debugLog(`(temperature, humidity, lightLevel) = OpenAPI:(${this.deviceStatus.temperature}, ${this.deviceStatus.humidity},`
201
+ + ` ${this.deviceStatus.lightLevel}), current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity},`
202
+ + ` ${this.LightSensor?.CurrentAmbientLightLevel})`);
203
+
183
204
  // CurrentRelativeHumidity
184
205
  if (!this.device.hub?.hide_humidity && this.HumiditySensor?.Service) {
185
- this.HumiditySensor.CurrentRelativeHumidity = deviceStatus.humidity;
206
+ this.HumiditySensor.CurrentRelativeHumidity = this.deviceStatus.humidity;
186
207
  await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
187
208
  }
188
209
 
189
210
  // CurrentTemperature
190
211
  if (!this.device.hub?.hide_temperature && this.TemperatureSensor?.Service) {
191
- this.TemperatureSensor.CurrentTemperature = deviceStatus.temperature;
212
+ this.TemperatureSensor.CurrentTemperature = this.deviceStatus.temperature;
192
213
  await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
193
214
  }
194
215
 
@@ -196,15 +217,15 @@ export class Hub extends deviceBase {
196
217
  if (!this.device.hub?.hide_lightsensor && this.LightSensor?.Service) {
197
218
  const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
198
219
  const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
199
- const lightLevel = Number(deviceStatus.lightLevel);
220
+ const lightLevel = this.deviceStatus.lightLevel;
200
221
  this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 19);
201
- await this.debugLog(`LightLevel: ${deviceStatus.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
222
+ await this.debugLog(`LightLevel: ${this.deviceStatus.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
202
223
  }
203
224
 
204
225
  // Firmware Version
205
- const version = deviceStatus.version.toString();
206
- await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
207
- if (deviceStatus.version) {
226
+ if (this.deviceStatus.version) {
227
+ const version = this.deviceStatus.version.toString();
228
+ await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
208
229
  const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
209
230
  this.accessory
210
231
  .getService(this.hap.Service.AccessoryInformation)!
@@ -212,36 +233,41 @@ export class Hub extends deviceBase {
212
233
  .setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
213
234
  .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
214
235
  .updateValue(deviceVersion);
215
- this.accessory.context.deviceVersion = deviceVersion;
216
- await this.debugSuccessLog(`deviceVersion: ${this.accessory.context.deviceVersion}`);
236
+ this.accessory.context.version = deviceVersion;
237
+ await this.debugSuccessLog(`version: ${this.accessory.context.version}`);
217
238
  }
218
239
  }
219
240
 
220
- async parseStatusWebhook(context: hub2WebhookContext): Promise<void> {
241
+ async parseStatusWebhook(): Promise<void> {
221
242
  await this.debugLog('parseStatusWebhook');
222
- await this.debugLog(`(scale, temperature, humidity, lightLevel) = Webhook:(${context.scale}, ${convertUnits(context.temperature, context.scale,
223
- this.device.hub?.convertUnitTo)}, ${context.humidity}, ${context.lightLevel}), current:(${this.TemperatureSensor?.CurrentTemperature},`
243
+ await this.debugLog(`(scale, temperature, humidity, lightLevel) = Webhook:(${this.webhookContext.scale},`
244
+ + ` ${convertUnits(this.webhookContext.temperature, this.webhookContext.scale, this.device.hub?.convertUnitTo)},`
245
+ + ` ${this.webhookContext.humidity}, ${this.webhookContext.lightLevel}), current:(${this.TemperatureSensor?.CurrentTemperature},`
224
246
  + ` ${this.HumiditySensor?.CurrentRelativeHumidity}, ${this.LightSensor?.CurrentAmbientLightLevel})`);
225
247
  // Check if the scale is not CELSIUS
226
- if (context.scale !== 'CELSIUS' && this.device.hub?.convertUnitTo === undefined) {
227
- await this.warnLog(`received a non-CELSIUS Webhook scale: ${context.scale}, Use the *convertUnitsTo* config under Hub settings,`
248
+ if (this.webhookContext.scale !== 'CELSIUS' && this.device.hub?.convertUnitTo === undefined) {
249
+ await this.warnLog(`received a non-CELSIUS Webhook scale: ${this.webhookContext.scale}, Use the *convertUnitsTo* config under Hub settings,`
228
250
  + ' if displaying incorrectly in HomeKit.');
229
251
  }
252
+
230
253
  // CurrentRelativeHumidity
231
254
  if (!this.device.hub?.hide_humidity && this.HumiditySensor?.Service) {
232
- this.HumiditySensor.CurrentRelativeHumidity = context.humidity;
255
+ this.HumiditySensor.CurrentRelativeHumidity = this.webhookContext.humidity;
233
256
  await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
234
257
  }
258
+
235
259
  // CurrentTemperature
236
260
  if (!this.device.hub?.hide_temperature && this.TemperatureSensor?.Service) {
237
- this.TemperatureSensor.CurrentTemperature = convertUnits(context.temperature, context.scale, this.device.hub?.convertUnitTo);
261
+ this.TemperatureSensor.CurrentTemperature = convertUnits(this.webhookContext.temperature, this.webhookContext.scale,
262
+ this.device.hub?.convertUnitTo);
238
263
  await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
239
264
  }
265
+
240
266
  // CurrentAmbientLightLevel
241
267
  if (!this.device.hub?.hide_lightsensor && this.LightSensor?.Service) {
242
268
  const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
243
269
  const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
244
- this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(context.lightLevel, set_minLux, set_maxLux, 19);
270
+ this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(this.webhookContext.lightLevel, set_minLux, set_maxLux, 19);
245
271
  await this.debugLog(`CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
246
272
  }
247
273
  }
@@ -272,10 +298,11 @@ export class Hub extends deviceBase {
272
298
  // Start to monitor advertisement packets
273
299
  (async () => {
274
300
  // Start to monitor advertisement packets
275
- const serviceData = await this.monitorAdvertisementPackets(switchbot) as unknown as hub2ServiceData;
301
+ const serviceData = await this.monitorAdvertisementPackets(switchbot) as hub2ServiceData;
276
302
  // Update HomeKit
277
303
  if (serviceData.model === SwitchBotBLEModel.Hub2 && serviceData.modelName === SwitchBotBLEModelName.Hub2) {
278
- await this.BLEparseStatus(serviceData);
304
+ this.serviceData = serviceData;
305
+ await this.BLEparseStatus();
279
306
  await this.updateHomeKitCharacteristics();
280
307
  } else {
281
308
  await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
@@ -293,7 +320,8 @@ export class Hub extends deviceBase {
293
320
  await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
294
321
  if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
295
322
  await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
296
- await this.openAPIparseStatus(deviceStatus.body);
323
+ this.deviceStatus = deviceStatus.body;
324
+ await this.openAPIparseStatus();
297
325
  await this.updateHomeKitCharacteristics();
298
326
  } else {
299
327
  await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
@@ -311,7 +339,8 @@ export class Hub extends deviceBase {
311
339
  this.platform.webhookEventHandler[this.device.deviceId] = async (context: hub2WebhookContext) => {
312
340
  try {
313
341
  await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
314
- await this.parseStatusWebhook(context);
342
+ this.webhookContext = context;
343
+ await this.parseStatusWebhook();
315
344
  await this.updateHomeKitCharacteristics();
316
345
  } catch (e: any) {
317
346
  await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
@@ -39,6 +39,15 @@ export class Humidifier extends deviceBase {
39
39
  CurrentTemperature: CharacteristicValue;
40
40
  };
41
41
 
42
+ // OpenAPI
43
+ deviceStatus!: humidifierStatus;
44
+
45
+ //Webhook
46
+ webhookContext!: humidifierWebhookContext;
47
+
48
+ // BLE
49
+ serviceData!: humidifierServiceData;
50
+
42
51
  // Updates
43
52
  humidifierUpdateInProgress!: boolean;
44
53
  doHumidifierUpdate!: Subject<void>;
@@ -49,6 +58,9 @@ export class Humidifier extends deviceBase {
49
58
  device: device & devicesConfig,
50
59
  ) {
51
60
  super(platform, accessory, device);
61
+ // Set category
62
+ accessory.category = this.hap.Categories.AIR_HUMIDIFIER;
63
+
52
64
  // this is subject we use to track when we need to POST changes to the SwitchBot API
53
65
  this.doHumidifierUpdate = new Subject();
54
66
  this.humidifierUpdateInProgress = false;
@@ -110,7 +122,7 @@ export class Humidifier extends deviceBase {
110
122
  // Initialize the Temperature Sensor Service
111
123
  if (device.humidifier?.hide_temperature) {
112
124
  if (this.TemperatureSensor) {
113
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Temperature Sensor Service`);
125
+ this.debugLog('Removing Temperature Sensor Service');
114
126
  this.TemperatureSensor!.Service = this.accessory.getService(this.hap.Service.TemperatureSensor) as Service;
115
127
  accessory.removeService(this.TemperatureSensor!.Service);
116
128
  }
@@ -139,12 +151,11 @@ export class Humidifier extends deviceBase {
139
151
  }
140
152
 
141
153
  // Retrieve initial values and updateHomekit
154
+ this.debugLog('Retrieve initial values and update Homekit');
142
155
  this.refreshStatus();
143
156
 
144
- // Retrieve initial values and updateHomekit
145
- this.updateHomeKitCharacteristics();
146
-
147
157
  //regisiter webhook event handler
158
+ this.debugLog('Registering Webhook Event Handler');
148
159
  this.registerWebhook();
149
160
 
150
161
  // Start an update interval
@@ -174,18 +185,23 @@ export class Humidifier extends deviceBase {
174
185
  });
175
186
  }
176
187
 
177
- async BLEparseStatus(serviceData: humidifierServiceData): Promise<void> {
188
+ async BLEparseStatus(): Promise<void> {
178
189
  await this.debugLog('BLEparseStatus');
190
+ await this.debugLog(`(onState, percentage, autoMode) = BLE:(${this.serviceData.onState}, ${this.serviceData.percentage},`
191
+ + ` ${this.serviceData.autoMode}), current:(${this.HumidifierDehumidifier.Active}, ${this.HumidifierDehumidifier.CurrentRelativeHumidity},`
192
+ + ` ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState}, ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold})`,
193
+ );
194
+
179
195
  // Active
180
- this.HumidifierDehumidifier.Active = serviceData.onState ? this.hap.Characteristic.Active.ACTIVE : this.hap.Characteristic.Active.INACTIVE;
196
+ this.HumidifierDehumidifier.Active = this.serviceData.onState ? this.hap.Characteristic.Active.ACTIVE : this.hap.Characteristic.Active.INACTIVE;
181
197
  await this.debugLog(`Active: ${this.HumidifierDehumidifier.Active}`);
182
198
 
183
199
  // Current Relative Humidity
184
- this.HumidifierDehumidifier.CurrentRelativeHumidity = serviceData.percentage;
200
+ this.HumidifierDehumidifier.CurrentRelativeHumidity = this.serviceData.percentage;
185
201
  await this.debugLog(`CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
186
202
 
187
203
  // Target Humidifier Dehumidifier State
188
- switch (serviceData.autoMode) {
204
+ switch (this.serviceData.autoMode) {
189
205
  case true:
190
206
  this.HumidifierDehumidifier.TargetHumidifierDehumidifierState =
191
207
  this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER;
@@ -194,7 +210,7 @@ export class Humidifier extends deviceBase {
194
210
  break;
195
211
  default:
196
212
  this.HumidifierDehumidifier.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
197
- this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = serviceData.percentage > 100 ? 100 : serviceData.percentage;
213
+ this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = this.serviceData.percentage > 100 ? 100 : this.serviceData.percentage;
198
214
  if (this.HumidifierDehumidifier.CurrentRelativeHumidity > this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold) {
199
215
  this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.IDLE;
200
216
  } else if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.INACTIVE) {
@@ -208,24 +224,30 @@ export class Humidifier extends deviceBase {
208
224
  + ` CurrentHumidifierDehumidifierState: ${this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState}`);
209
225
  }
210
226
 
211
- async openAPIparseStatus(deviceStatus: humidifierStatus): Promise<void> {
227
+ async openAPIparseStatus(): Promise<void> {
212
228
  await this.debugLog('openAPIparseStatus');
229
+ await this.debugLog(`(power, auto, temperature, lackWater, nebulizationEfficiency, version) = OpenAPI:(${this.deviceStatus.power},`
230
+ + ` ${this.deviceStatus.auto}, ${this.deviceStatus.temperature}, ${this.deviceStatus.lackWater},`
231
+ + ` ${this.deviceStatus.nebulizationEfficiency}, ${this.deviceStatus.version}), current:(${this.HumidifierDehumidifier.Active},`
232
+ + ` ${this.HumidifierDehumidifier.CurrentRelativeHumidity}, ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState},`
233
+ + ` ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold})`);
234
+
213
235
  // Active
214
- this.HumidifierDehumidifier.Active = deviceStatus.power === 'on'
236
+ this.HumidifierDehumidifier.Active = this.deviceStatus.power === 'on'
215
237
  ? this.hap.Characteristic.Active.ACTIVE : this.hap.Characteristic.Active.INACTIVE;
216
238
  await this.debugLog(`Active: ${this.HumidifierDehumidifier.Active}`);
217
239
 
218
240
  // Current Relative Humidity
219
- this.HumidifierDehumidifier.CurrentRelativeHumidity = deviceStatus.temperature!;
241
+ this.HumidifierDehumidifier.CurrentRelativeHumidity = this.deviceStatus.temperature!;
220
242
  await this.debugLog(`CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
221
243
 
222
244
  // Current Temperature
223
245
  if (!this.device.humidifier?.hide_temperature && this.TemperatureSensor?.Service) {
224
- this.TemperatureSensor.CurrentTemperature = deviceStatus.temperature;
246
+ this.TemperatureSensor.CurrentTemperature = this.deviceStatus.temperature;
225
247
  await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
226
248
  }
227
249
  // Target Humidifier Dehumidifier State
228
- switch (deviceStatus.auto) {
250
+ switch (this.deviceStatus.auto) {
229
251
  case true:
230
252
  this.HumidifierDehumidifier.TargetHumidifierDehumidifierState =
231
253
  this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER;
@@ -234,8 +256,8 @@ export class Humidifier extends deviceBase {
234
256
  break;
235
257
  default:
236
258
  this.HumidifierDehumidifier.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
237
- this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = deviceStatus.nebulizationEfficiency > 100
238
- ? 100 : deviceStatus.nebulizationEfficiency;
259
+ this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = this.deviceStatus.nebulizationEfficiency > 100
260
+ ? 100 : this.deviceStatus.nebulizationEfficiency;
239
261
  if (this.HumidifierDehumidifier.CurrentRelativeHumidity > this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold) {
240
262
  this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.IDLE;
241
263
  } else if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.INACTIVE) {
@@ -249,7 +271,7 @@ export class Humidifier extends deviceBase {
249
271
  + ` CurrentHumidifierDehumidifierState: ${this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState}`);
250
272
 
251
273
  // Water Level
252
- if (deviceStatus.lackWater) {
274
+ if (this.deviceStatus.lackWater) {
253
275
  this.HumidifierDehumidifier.WaterLevel = 0;
254
276
  } else {
255
277
  this.HumidifierDehumidifier.WaterLevel = 100;
@@ -257,8 +279,8 @@ export class Humidifier extends deviceBase {
257
279
  await this.debugLog(`WaterLevel: ${this.HumidifierDehumidifier.WaterLevel}`);
258
280
 
259
281
  // Firmware Version
260
- if (deviceStatus.version) {
261
- const version = deviceStatus.version.toString();
282
+ if (this.deviceStatus.version) {
283
+ const version = this.deviceStatus.version.toString();
262
284
  await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
263
285
  const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
264
286
  this.accessory
@@ -267,23 +289,25 @@ export class Humidifier extends deviceBase {
267
289
  .setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
268
290
  .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
269
291
  .updateValue(deviceVersion);
270
- this.accessory.context.deviceVersion = deviceVersion;
271
- await this.debugSuccessLog(`deviceVersion: ${this.accessory.context.deviceVersion}`);
292
+ this.accessory.context.version = deviceVersion;
293
+ await this.debugSuccessLog(`version: ${this.accessory.context.version}`);
272
294
  }
273
295
  }
274
296
 
275
- async parseStatusWebhook(context: humidifierWebhookContext): Promise<void> {
297
+ async parseStatusWebhook(): Promise<void> {
276
298
  await this.debugLog('parseStatusWebhook');
277
- await this.debugLog(`(temperature, humidity) = Webhook:(${convertUnits(context.temperature, context.scale, this.device.iosensor?.convertUnitTo)},`
278
- + ` ${context.humidity}), current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumidifierDehumidifier.CurrentRelativeHumidity})`);
299
+ await this.debugLog(`(temperature, humidity) = Webhook:(${convertUnits(this.webhookContext.temperature, this.webhookContext.scale,
300
+ this.device.iosensor?.convertUnitTo)}, ${this.webhookContext.humidity}), current:(${this.TemperatureSensor?.CurrentTemperature},`
301
+ + ` ${this.HumidifierDehumidifier.CurrentRelativeHumidity})`);
279
302
 
280
303
  // CurrentRelativeHumidity
281
- this.HumidifierDehumidifier.CurrentRelativeHumidity = context.humidity;
304
+ this.HumidifierDehumidifier.CurrentRelativeHumidity = this.webhookContext.humidity;
282
305
  await this.debugLog(`CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
283
306
 
284
307
  // CurrentTemperature
285
308
  if (!this.device.humidifier?.hide_temperature && this.TemperatureSensor?.Service) {
286
- this.TemperatureSensor.CurrentTemperature = convertUnits(context.temperature, context.scale, this.device.iosensor?.convertUnitTo);
309
+ this.TemperatureSensor.CurrentTemperature = convertUnits(this.webhookContext.temperature, this.webhookContext.scale,
310
+ this.device.iosensor?.convertUnitTo);
287
311
  await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
288
312
  }
289
313
  }
@@ -314,10 +338,11 @@ export class Humidifier extends deviceBase {
314
338
  // Start to monitor advertisement packets
315
339
  (async () => {
316
340
  // Start to monitor advertisement packets
317
- const serviceData= await this.monitorAdvertisementPackets(switchbot) as unknown as humidifierServiceData;
341
+ const serviceData = await this.monitorAdvertisementPackets(switchbot) as humidifierServiceData;
318
342
  // Update HomeKit
319
343
  if (serviceData.model === SwitchBotBLEModel.Humidifier && serviceData.modelName === SwitchBotBLEModelName.Humidifier) {
320
- await this.BLEparseStatus(serviceData);
344
+ this.serviceData = serviceData;
345
+ await this.BLEparseStatus();
321
346
  await this.updateHomeKitCharacteristics();
322
347
  } else {
323
348
  await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
@@ -335,7 +360,8 @@ export class Humidifier extends deviceBase {
335
360
  await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
336
361
  if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
337
362
  await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
338
- await this.openAPIparseStatus(deviceStatus.body);
363
+ this.deviceStatus = deviceStatus.body;
364
+ await this.openAPIparseStatus();
339
365
  await this.updateHomeKitCharacteristics();
340
366
  } else {
341
367
  await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
@@ -353,7 +379,8 @@ export class Humidifier extends deviceBase {
353
379
  this.platform.webhookEventHandler[this.device.deviceId] = async (context: humidifierWebhookContext) => {
354
380
  try {
355
381
  await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
356
- await this.parseStatusWebhook(context);
382
+ this.webhookContext = context;
383
+ await this.parseStatusWebhook();
357
384
  await this.updateHomeKitCharacteristics();
358
385
  } catch (e: any) {
359
386
  await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
@@ -414,8 +441,8 @@ export class Humidifier extends deviceBase {
414
441
  }
415
442
  } else {
416
443
  await this.debugLog(`No changes (BLEpushChanges), Active: ${this.HumidifierDehumidifier.Active},`
417
- + ` RelativeHumidityHumidifierThreshold: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold},`
418
- + ` CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
444
+ + ` RelativeHumidityHumidifierThreshold: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold},`
445
+ + ` CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
419
446
  }
420
447
  }
421
448
 
@@ -423,7 +450,7 @@ export class Humidifier extends deviceBase {
423
450
  await this.debugLog('openAPIpushChanges');
424
451
  if ((this.HumidifierDehumidifier.TargetHumidifierDehumidifierState === this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER)
425
452
  && (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE)
426
- && (this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold !== this.HumidifierDehumidifier.CurrentRelativeHumidity)) {
453
+ && (this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold !== this.HumidifierDehumidifier.CurrentRelativeHumidity)) {
427
454
  await this.debugLog(`Auto Off, RelativeHumidityHumidifierThreshold: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}!`);
428
455
  const bodyChange = JSON.stringify({
429
456
  command: 'setMode',