@switchbot/homebridge-switchbot 3.5.1-beta.0 → 3.5.1-beta.10

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 (197) hide show
  1. package/README.md +16 -0
  2. package/dist/device/blindtilt.d.ts +15 -6
  3. package/dist/device/blindtilt.d.ts.map +1 -1
  4. package/dist/device/blindtilt.js +224 -370
  5. package/dist/device/blindtilt.js.map +1 -1
  6. package/dist/device/bot.d.ts +9 -4
  7. package/dist/device/bot.d.ts.map +1 -1
  8. package/dist/device/bot.js +197 -221
  9. package/dist/device/bot.js.map +1 -1
  10. package/dist/device/ceilinglight.d.ts +10 -5
  11. package/dist/device/ceilinglight.d.ts.map +1 -1
  12. package/dist/device/ceilinglight.js +214 -292
  13. package/dist/device/ceilinglight.js.map +1 -1
  14. package/dist/device/colorbulb.d.ts +10 -5
  15. package/dist/device/colorbulb.d.ts.map +1 -1
  16. package/dist/device/colorbulb.js +335 -421
  17. package/dist/device/colorbulb.js.map +1 -1
  18. package/dist/device/contact.d.ts +9 -4
  19. package/dist/device/contact.d.ts.map +1 -1
  20. package/dist/device/contact.js +121 -200
  21. package/dist/device/contact.js.map +1 -1
  22. package/dist/device/curtain.d.ts +20 -7
  23. package/dist/device/curtain.d.ts.map +1 -1
  24. package/dist/device/curtain.js +229 -403
  25. package/dist/device/curtain.js.map +1 -1
  26. package/dist/device/device.d.ts +41 -22
  27. package/dist/device/device.d.ts.map +1 -1
  28. package/dist/device/device.js +212 -181
  29. package/dist/device/device.js.map +1 -1
  30. package/dist/device/fan.d.ts +9 -4
  31. package/dist/device/fan.d.ts.map +1 -1
  32. package/dist/device/fan.js +204 -249
  33. package/dist/device/fan.js.map +1 -1
  34. package/dist/device/hub.d.ts +9 -5
  35. package/dist/device/hub.d.ts.map +1 -1
  36. package/dist/device/hub.js +107 -233
  37. package/dist/device/hub.js.map +1 -1
  38. package/dist/device/humidifier.d.ts +12 -4
  39. package/dist/device/humidifier.d.ts.map +1 -1
  40. package/dist/device/humidifier.js +193 -235
  41. package/dist/device/humidifier.js.map +1 -1
  42. package/dist/device/iosensor.d.ts +9 -4
  43. package/dist/device/iosensor.d.ts.map +1 -1
  44. package/dist/device/iosensor.js +92 -159
  45. package/dist/device/iosensor.js.map +1 -1
  46. package/dist/device/lightstrip.d.ts +10 -5
  47. package/dist/device/lightstrip.d.ts.map +1 -1
  48. package/dist/device/lightstrip.js +288 -370
  49. package/dist/device/lightstrip.js.map +1 -1
  50. package/dist/device/lock.d.ts +10 -5
  51. package/dist/device/lock.d.ts.map +1 -1
  52. package/dist/device/lock.js +172 -219
  53. package/dist/device/lock.js.map +1 -1
  54. package/dist/device/meter.d.ts +9 -4
  55. package/dist/device/meter.d.ts.map +1 -1
  56. package/dist/device/meter.js +94 -160
  57. package/dist/device/meter.js.map +1 -1
  58. package/dist/device/meterplus.d.ts +9 -4
  59. package/dist/device/meterplus.d.ts.map +1 -1
  60. package/dist/device/meterplus.js +95 -157
  61. package/dist/device/meterplus.js.map +1 -1
  62. package/dist/device/motion.d.ts +9 -4
  63. package/dist/device/motion.d.ts.map +1 -1
  64. package/dist/device/motion.js +85 -144
  65. package/dist/device/motion.js.map +1 -1
  66. package/dist/device/plug.d.ts +9 -4
  67. package/dist/device/plug.d.ts.map +1 -1
  68. package/dist/device/plug.js +100 -127
  69. package/dist/device/plug.js.map +1 -1
  70. package/dist/device/robotvacuumcleaner.d.ts +9 -6
  71. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  72. package/dist/device/robotvacuumcleaner.js +172 -259
  73. package/dist/device/robotvacuumcleaner.js.map +1 -1
  74. package/dist/device/waterdetector.d.ts +12 -4
  75. package/dist/device/waterdetector.d.ts.map +1 -1
  76. package/dist/device/waterdetector.js +106 -131
  77. package/dist/device/waterdetector.js.map +1 -1
  78. package/dist/irdevice/airconditioner.d.ts +2 -1
  79. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  80. package/dist/irdevice/airconditioner.js +2 -3
  81. package/dist/irdevice/airconditioner.js.map +1 -1
  82. package/dist/irdevice/airpurifier.d.ts +2 -1
  83. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  84. package/dist/irdevice/airpurifier.js +2 -3
  85. package/dist/irdevice/airpurifier.js.map +1 -1
  86. package/dist/irdevice/camera.d.ts +2 -1
  87. package/dist/irdevice/camera.d.ts.map +1 -1
  88. package/dist/irdevice/camera.js +2 -3
  89. package/dist/irdevice/camera.js.map +1 -1
  90. package/dist/irdevice/fan.d.ts +2 -1
  91. package/dist/irdevice/fan.d.ts.map +1 -1
  92. package/dist/irdevice/fan.js +2 -3
  93. package/dist/irdevice/fan.js.map +1 -1
  94. package/dist/irdevice/irdevice.d.ts +3 -1
  95. package/dist/irdevice/irdevice.d.ts.map +1 -1
  96. package/dist/irdevice/irdevice.js +5 -1
  97. package/dist/irdevice/irdevice.js.map +1 -1
  98. package/dist/irdevice/light.d.ts +2 -1
  99. package/dist/irdevice/light.d.ts.map +1 -1
  100. package/dist/irdevice/light.js +2 -3
  101. package/dist/irdevice/light.js.map +1 -1
  102. package/dist/irdevice/other.d.ts +2 -1
  103. package/dist/irdevice/other.d.ts.map +1 -1
  104. package/dist/irdevice/other.js +2 -3
  105. package/dist/irdevice/other.js.map +1 -1
  106. package/dist/irdevice/tv.d.ts +2 -1
  107. package/dist/irdevice/tv.d.ts.map +1 -1
  108. package/dist/irdevice/tv.js +2 -3
  109. package/dist/irdevice/tv.js.map +1 -1
  110. package/dist/irdevice/vacuumcleaner.d.ts +2 -1
  111. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  112. package/dist/irdevice/vacuumcleaner.js +2 -3
  113. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  114. package/dist/irdevice/waterheater.d.ts +2 -1
  115. package/dist/irdevice/waterheater.d.ts.map +1 -1
  116. package/dist/irdevice/waterheater.js +2 -3
  117. package/dist/irdevice/waterheater.js.map +1 -1
  118. package/dist/platform.d.ts +14 -14
  119. package/dist/platform.d.ts.map +1 -1
  120. package/dist/platform.js +102 -86
  121. package/dist/platform.js.map +1 -1
  122. package/dist/settings.d.ts +49 -190
  123. package/dist/settings.d.ts.map +1 -1
  124. package/dist/settings.js +19 -0
  125. package/dist/settings.js.map +1 -1
  126. package/dist/types/bledevicestatus.d.ts +279 -0
  127. package/dist/types/bledevicestatus.d.ts.map +1 -0
  128. package/dist/types/bledevicestatus.js +2 -0
  129. package/dist/types/bledevicestatus.js.map +1 -0
  130. package/dist/types/devicelist.d.ts +89 -0
  131. package/dist/types/devicelist.d.ts.map +1 -0
  132. package/dist/types/devicelist.js +6 -0
  133. package/dist/types/devicelist.js.map +1 -0
  134. package/dist/types/deviceresponse.d.ts +13 -0
  135. package/dist/types/deviceresponse.d.ts.map +1 -0
  136. package/dist/types/deviceresponse.js +2 -0
  137. package/dist/types/deviceresponse.js.map +1 -0
  138. package/dist/types/devicestatus.d.ts +149 -0
  139. package/dist/types/devicestatus.d.ts.map +1 -0
  140. package/dist/types/devicestatus.js +3 -0
  141. package/dist/types/devicestatus.js.map +1 -0
  142. package/dist/types/devicewebhookstatus.d.ts +156 -0
  143. package/dist/types/devicewebhookstatus.d.ts.map +1 -0
  144. package/dist/types/devicewebhookstatus.js +2 -0
  145. package/dist/types/devicewebhookstatus.js.map +1 -0
  146. package/dist/types/irdevicelist.d.ts +10 -0
  147. package/dist/types/irdevicelist.d.ts.map +1 -0
  148. package/dist/types/irdevicelist.js +2 -0
  149. package/dist/types/irdevicelist.js.map +1 -0
  150. package/dist/types/pushbody.d.ts +6 -0
  151. package/dist/types/pushbody.d.ts.map +1 -0
  152. package/dist/types/pushbody.js +2 -0
  153. package/dist/types/pushbody.js.map +1 -0
  154. package/dist/utils.d.ts +25 -0
  155. package/dist/utils.d.ts.map +1 -1
  156. package/dist/utils.js +28 -0
  157. package/dist/utils.js.map +1 -1
  158. package/package.json +11 -11
  159. package/src/device/blindtilt.ts +254 -376
  160. package/src/device/bot.ts +209 -224
  161. package/src/device/ceilinglight.ts +227 -297
  162. package/src/device/colorbulb.ts +345 -435
  163. package/src/device/contact.ts +139 -200
  164. package/src/device/curtain.ts +254 -414
  165. package/src/device/device.ts +221 -190
  166. package/src/device/fan.ts +222 -253
  167. package/src/device/hub.ts +127 -248
  168. package/src/device/humidifier.ts +217 -246
  169. package/src/device/iosensor.ts +115 -168
  170. package/src/device/lightstrip.ts +303 -380
  171. package/src/device/lock.ts +188 -224
  172. package/src/device/meter.ts +117 -179
  173. package/src/device/meterplus.ts +118 -176
  174. package/src/device/motion.ts +100 -146
  175. package/src/device/plug.ts +111 -131
  176. package/src/device/robotvacuumcleaner.ts +191 -258
  177. package/src/device/waterdetector.ts +124 -141
  178. package/src/irdevice/airconditioner.ts +4 -4
  179. package/src/irdevice/airpurifier.ts +4 -4
  180. package/src/irdevice/camera.ts +4 -4
  181. package/src/irdevice/fan.ts +4 -4
  182. package/src/irdevice/irdevice.ts +8 -2
  183. package/src/irdevice/light.ts +4 -4
  184. package/src/irdevice/other.ts +4 -4
  185. package/src/irdevice/tv.ts +4 -4
  186. package/src/irdevice/vacuumcleaner.ts +4 -4
  187. package/src/irdevice/waterheater.ts +4 -4
  188. package/src/platform.ts +104 -87
  189. package/src/settings.ts +30 -238
  190. package/src/types/bledevicestatus.ts +305 -0
  191. package/src/types/devicelist.ts +124 -0
  192. package/src/types/deviceresponse.ts +15 -0
  193. package/src/types/devicestatus.ts +178 -0
  194. package/src/types/devicewebhookstatus.ts +196 -0
  195. package/src/types/irdevicelist.ts +15 -0
  196. package/src/types/pushbody.ts +9 -0
  197. package/src/utils.ts +33 -0
@@ -5,10 +5,16 @@
5
5
  import { Units } from 'homebridge';
6
6
  import { deviceBase } from './device.js';
7
7
  import { Subject, interval, skipWhile } from 'rxjs';
8
+ import { SwitchBotBLEModel, SwitchBotBLEModelName } from 'node-switchbot';
8
9
 
10
+ import { convertUnits } from '../utils.js';
11
+ import type { devicesConfig } from '../settings.js';
12
+ import type { device } from '../types/devicelist.js';
9
13
  import type { SwitchBotPlatform } from '../platform.js';
14
+ import type { meterPlusServiceData } from '../types/bledevicestatus.js';
15
+ import type { meterPlusStatus } from '../types/devicestatus.js';
16
+ import type { meterPlusWebhookContext } from '../types/devicewebhookstatus.js';
10
17
  import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge';
11
- import type { device, devicesConfig, serviceData, deviceStatus } from '../settings.js';
12
18
 
13
19
  /**
14
20
  * Platform Accessory
@@ -140,76 +146,63 @@ export class MeterPlus extends deviceBase {
140
146
  // Retrieve initial values and updateHomekit
141
147
  this.updateHomeKitCharacteristics();
142
148
 
149
+ //regisiter webhook event handler
150
+ this.registerWebhook();
151
+
143
152
  // Start an update interval
144
153
  interval(this.deviceRefreshRate * 1000)
145
154
  .pipe(skipWhile(() => this.meterUpdateInProgress))
146
155
  .subscribe(async () => {
147
156
  await this.refreshStatus();
148
157
  });
149
-
150
- //regisiter webhook event handler
151
- this.registerWebhook(accessory, device);
152
158
  }
153
159
 
154
- async BLEparseStatus(serviceData: serviceData): Promise<void> {
155
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
156
-
157
- // Battery
158
- this.Battery.BatteryLevel = Number(serviceData.battery);
159
- if (this.Battery.BatteryLevel < 15) {
160
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
161
- } else {
162
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
163
- }
164
- this.debugLog(`${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}, StatusLowBattery: ${this.Battery.StatusLowBattery}`);
165
-
166
- // Humidity
167
- if (!this.device.meter?.hide_humidity) {
168
- this.HumiditySensor!.CurrentRelativeHumidity = serviceData.humidity!;
169
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Humidity: ${this.HumiditySensor!.CurrentRelativeHumidity}%`);
160
+ async BLEparseStatus(serviceData: meterPlusServiceData): Promise<void> {
161
+ await this.debugLog('BLEparseStatus');
162
+ // CurrentRelativeHumidity
163
+ if (!this.device.iosensor?.hide_humidity && this.HumiditySensor?.Service) {
164
+ this.HumiditySensor.CurrentRelativeHumidity = serviceData.humidity;
165
+ await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
170
166
  }
171
-
172
167
  // Current Temperature
173
- if (!this.device.meter?.hide_temperature) {
174
- const celcius = serviceData.temperature!.c < 0 ? 0 : serviceData.temperature!.c > 100 ? 100 : serviceData.temperature!.c;
175
- this.TemperatureSensor!.CurrentTemperature = celcius;
176
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Temperature: ${this.TemperatureSensor!.CurrentTemperature}°c`);
168
+ if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
169
+ const CELSIUS = serviceData.temperature.c < 0 ? 0 : serviceData.temperature.c > 100 ? 100 : serviceData.temperature.c;
170
+ this.TemperatureSensor.CurrentTemperature = CELSIUS;
171
+ await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
177
172
  }
178
- }
179
-
180
- async openAPIparseStatus(deviceStatus: deviceStatus): Promise<void> {
181
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
182
-
183
173
  // BatteryLevel
184
- this.Battery.BatteryLevel = Number(deviceStatus.body.battery);
185
- if (this.Battery.BatteryLevel < 10) {
186
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
187
- } else {
188
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
189
- }
190
- if (Number.isNaN(this.Battery.BatteryLevel)) {
191
- this.Battery.BatteryLevel = 100;
192
- }
193
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},`
194
- + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
174
+ this.Battery.BatteryLevel = Number(serviceData.battery);
175
+ await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
176
+ // StatusLowBattery
177
+ this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
178
+ ? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
179
+ await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
180
+ }
195
181
 
182
+ async openAPIparseStatus(deviceStatus: meterPlusStatus): Promise<void> {
183
+ await this.debugLog('openAPIparseStatus');
196
184
  // CurrentRelativeHumidity
197
- if (!this.device.meter?.hide_humidity) {
198
- this.HumiditySensor!.CurrentRelativeHumidity = deviceStatus.body.humidity!;
199
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Humidity: ${this.HumiditySensor!.CurrentRelativeHumidity}%`);
185
+ if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
186
+ this.HumiditySensor.CurrentRelativeHumidity = deviceStatus.humidity;
187
+ await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
200
188
  }
201
-
202
189
  // CurrentTemperature
203
- if (!this.device.meter?.hide_temperature) {
204
- this.TemperatureSensor!.CurrentTemperature = deviceStatus.body.temperature!;
205
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Temperature: ${this.TemperatureSensor!.CurrentTemperature}°c`);
190
+ if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
191
+ this.TemperatureSensor.CurrentTemperature = deviceStatus.temperature;
192
+ await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
206
193
  }
207
-
208
- // Firmware Version
209
- const version = deviceStatus.body.version?.toString();
210
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
211
- if (deviceStatus.body.version) {
212
- const deviceVersion = version?.replace(/^V|-.*$/g, '') ?? '0.0.0';
194
+ // BatteryLevel
195
+ this.Battery.BatteryLevel = Number(deviceStatus.battery);
196
+ await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
197
+ // StatusLowBattery
198
+ this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
199
+ ? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
200
+ await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
201
+ // FirmwareVersion
202
+ const version = deviceStatus.version.toString();
203
+ this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
204
+ if (deviceStatus.version) {
205
+ const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
213
206
  this.accessory
214
207
  .getService(this.hap.Service.AccessoryInformation)!
215
208
  .setCharacteristic(this.hap.Characteristic.HardwareRevision, deviceVersion)
@@ -217,7 +210,29 @@ export class MeterPlus extends deviceBase {
217
210
  .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
218
211
  .updateValue(deviceVersion);
219
212
  this.accessory.context.deviceVersion = deviceVersion;
220
- this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceVersion: ${this.accessory.context.deviceVersion}`);
213
+ this.debugSuccessLog(`deviceVersion: ${this.accessory.context.deviceVersion}`);
214
+ }
215
+ }
216
+
217
+ async parseStatusWebhook(context: meterPlusWebhookContext): Promise<void> {
218
+ await this.debugLog('parseStatusWebhook');
219
+ await this.debugLog(`(scale, temperature, humidity) = Webhook:(${context.scale}, ${convertUnits(context.temperature, context.scale,
220
+ this.device.meter?.convertUnitTo)}, ${context.humidity}), current:(${this.TemperatureSensor?.CurrentTemperature},`
221
+ + ` ${this.HumiditySensor?.CurrentRelativeHumidity})`);
222
+ // Check if the scale is not CELSIUS
223
+ if (context.scale !== 'CELSIUS' && this.device.hub?.convertUnitTo === undefined) {
224
+ await this.warnLog(`received a non-CELSIUS Webhook scale: ${context.scale}, Use the *convertUnitsTo* config under Hub settings,`
225
+ + ' if displaying incorrectly in HomeKit.');
226
+ }
227
+ // CurrentRelativeHumidity
228
+ if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
229
+ this.HumiditySensor.CurrentRelativeHumidity = context.humidity;
230
+ await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
231
+ }
232
+ // CurrentTemperature
233
+ if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
234
+ this.TemperatureSensor.CurrentTemperature = convertUnits(context.temperature, context.scale, this.device.hub?.convertUnitTo);
235
+ await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
221
236
  }
222
237
  }
223
238
 
@@ -226,20 +241,19 @@ export class MeterPlus extends deviceBase {
226
241
  */
227
242
  async refreshStatus(): Promise<void> {
228
243
  if (!this.device.enableCloudService && this.OpenAPI) {
229
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} refreshStatus enableCloudService: ${this.device.enableCloudService}`);
244
+ await this.errorLog(`refreshStatus enableCloudService: ${this.device.enableCloudService}`);
230
245
  } else if (this.BLE) {
231
246
  await this.BLERefreshStatus();
232
247
  } else if (this.OpenAPI && this.platform.config.credentials?.token) {
233
248
  await this.openAPIRefreshStatus();
234
249
  } else {
235
250
  await this.offlineOff();
236
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:`
237
- + ` ${this.device.connectionType}, refreshStatus will not happen.`);
251
+ await this.debugWarnLog(`Connection Type: ${this.device.connectionType}, refreshStatus will not happen.`);
238
252
  }
239
253
  }
240
254
 
241
255
  async BLERefreshStatus(): Promise<void> {
242
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLERefreshStatus`);
256
+ await this.debugLog('BLERefreshStatus');
243
257
  const switchbot = await this.switchbotBLE();
244
258
 
245
259
  if (switchbot === undefined) {
@@ -248,13 +262,13 @@ export class MeterPlus extends deviceBase {
248
262
  // Start to monitor advertisement packets
249
263
  (async () => {
250
264
  // Start to monitor advertisement packets
251
- const serviceData: serviceData = await this.monitorAdvertisementPackets(switchbot);
265
+ const serviceData = await this.monitorAdvertisementPackets(switchbot) as meterPlusServiceData;
252
266
  // Update HomeKit
253
- if (serviceData.model !== '' && serviceData.modelName !== '') {
267
+ if (serviceData.model === SwitchBotBLEModel.MeterPlus && serviceData.modelName === SwitchBotBLEModelName.MeterPlus) {
254
268
  await this.BLEparseStatus(serviceData);
255
269
  await this.updateHomeKitCharacteristics();
256
270
  } else {
257
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed to get serviceData, serviceData: ${serviceData}`);
271
+ await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
258
272
  await this.BLERefreshConnection(switchbot);
259
273
  }
260
274
  })();
@@ -262,51 +276,39 @@ export class MeterPlus extends deviceBase {
262
276
  }
263
277
 
264
278
  async openAPIRefreshStatus(): Promise<void> {
265
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
279
+ await this.debugLog('openAPIRefreshStatus');
266
280
  try {
267
281
  const { body, statusCode } = await this.deviceRefreshStatus();
268
282
  const deviceStatus: any = await body.json();
269
- await this.refreshStatusCodes(statusCode, deviceStatus);;
270
- if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
271
- await this.successfulRefreshStatus(statusCode, deviceStatus);
272
- await this.openAPIparseStatus(deviceStatus);
283
+ await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
284
+ if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
285
+ await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
286
+ await this.openAPIparseStatus(deviceStatus.body);
273
287
  await this.updateHomeKitCharacteristics();
274
288
  } else {
275
- await this.statusCodes(statusCode, deviceStatus);
289
+ await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
290
+ await this.debugWarnLog(statusCode, deviceStatus);
276
291
  }
277
292
  } catch (e: any) {
278
- this.apiError(e);
279
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIRefreshStatus with ${this.device.connectionType}`
280
- + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
293
+ await this.apiError(e);
294
+ await this.errorLog(`failed openAPIRefreshStatus with ${this.device.connectionType} Connection, Error Message: ${JSON.stringify(e.message)}`);
281
295
  }
282
296
  }
283
297
 
284
- async registerWebhook(accessory: PlatformAccessory, device: device & devicesConfig) {
285
- if (device.webhook) {
286
- this.debugLog(`${device.deviceType}: ${accessory.displayName} is listening webhook.`);
287
- this.platform.webhookEventHandler[device.deviceId] = async (context) => {
298
+ async registerWebhook() {
299
+ if (this.device.webhook) {
300
+ await this.debugLog('is listening webhook.');
301
+ this.platform.webhookEventHandler[this.device.deviceId] = async (context: meterPlusWebhookContext) => {
288
302
  try {
289
- this.debugLog(`${device.deviceType}: ${accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
290
- if (context.scale === 'CELSIUS') {
291
- const { temperature, humidity } = context;
292
- const { CurrentRelativeHumidity } = this.HumiditySensor ?? { CurrentRelativeHumidity: undefined };
293
- const { CurrentTemperature } = this.TemperatureSensor ?? { CurrentTemperature: undefined };
294
- this.debugLog(`${device.deviceType}: ${accessory.displayName} (temperature, humidity) = Webhook:(${temperature}, ${humidity}), `
295
- + `current:(${CurrentTemperature}, ${CurrentRelativeHumidity})`);
296
- if (!device.meter?.hide_humidity) {
297
- this.HumiditySensor!.CurrentRelativeHumidity = humidity;
298
- }
299
- if (!device.meter?.hide_temperature) {
300
- this.TemperatureSensor!.CurrentTemperature = temperature;
301
- }
302
- this.updateHomeKitCharacteristics();
303
- }
303
+ await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
304
+ await this.parseStatusWebhook(context);
305
+ await this.updateHomeKitCharacteristics();
304
306
  } catch (e: any) {
305
- this.errorLog(`${device.deviceType}: ${accessory.displayName} failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
307
+ await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
306
308
  }
307
309
  };
308
310
  } else {
309
- this.debugLog(`${device.deviceType}: ${accessory.displayName} is not listening webhook.`);
311
+ await this.debugLog('is not listening webhook.');
310
312
  }
311
313
  }
312
314
 
@@ -314,114 +316,54 @@ export class MeterPlus extends deviceBase {
314
316
  * Updates the status for each of the HomeKit Characteristics
315
317
  */
316
318
  async updateHomeKitCharacteristics(): Promise<void> {
317
- const mqttmessage: string[] = [];
318
- const entry = { time: Math.round(new Date().valueOf() / 1000) };
319
-
320
319
  // CurrentRelativeHumidity
321
- if (!this.device.meter?.hide_humidity) {
322
- if (this.HumiditySensor!.CurrentRelativeHumidity === undefined) {
323
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
324
- + ` CurrentRelativeHumidity: ${this.HumiditySensor!.CurrentRelativeHumidity}`);
325
- } else {
326
- this.accessory.context.CurrentRelativeHumidity = this.HumiditySensor!.CurrentRelativeHumidity;
327
- this.HumiditySensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity,
328
- this.HumiditySensor!.CurrentRelativeHumidity);
329
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
330
- + ` updateCharacteristic CurrentRelativeHumidity: ${this.HumiditySensor!.CurrentRelativeHumidity}`);
331
- if (this.device.mqttURL) {
332
- mqttmessage.push(`"humidity": ${this.HumiditySensor!.CurrentRelativeHumidity}`);
333
- }
334
- if (this.device.history) {
335
- entry['humidity'] = this.HumiditySensor!.CurrentRelativeHumidity;
336
- }
337
- }
320
+ if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
321
+ await this.updateCharacteristic(this.HumiditySensor.Service, this.hap.Characteristic.CurrentRelativeHumidity,
322
+ this.HumiditySensor.CurrentRelativeHumidity, 'CurrentRelativeHumidity');
338
323
  }
339
-
340
324
  // CurrentTemperature
341
- if (!this.device.meter?.hide_temperature) {
342
- if (this.TemperatureSensor!.CurrentTemperature === undefined) {
343
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.TemperatureSensor!.CurrentTemperature}`);
344
- } else {
345
- this.accessory.context.CurrentTemperature = this.TemperatureSensor!.CurrentTemperature;
346
- this.TemperatureSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.TemperatureSensor!.CurrentTemperature);
347
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
348
- + ` CurrentTemperature: ${this.TemperatureSensor!.CurrentTemperature}`);
349
- if (this.device.mqttURL) {
350
- mqttmessage.push(`"temperature": ${this.TemperatureSensor!.CurrentTemperature}`);
351
- }
352
- if (this.device.history) {
353
- entry['temp'] = this.TemperatureSensor!.CurrentTemperature;
354
- }
355
- }
325
+ if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
326
+ await this.updateCharacteristic(this.TemperatureSensor.Service, this.hap.Characteristic.CurrentTemperature,
327
+ this.TemperatureSensor.CurrentTemperature, 'CurrentTemperature');
356
328
  }
357
-
358
329
  // BatteryLevel
359
- if (this.Battery.BatteryLevel === undefined) {
360
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
361
- } else {
362
- this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
363
- this.Battery!.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
364
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`);
365
- if (this.device.mqttURL) {
366
- mqttmessage.push(`"battery": ${this.Battery.BatteryLevel}`);
367
- }
368
- }
330
+ await this.updateCharacteristic(this.Battery.Service, this.hap.Characteristic.BatteryLevel,
331
+ this.Battery.BatteryLevel, 'BatteryLevel');
369
332
  // StatusLowBattery
370
- if (this.Battery.StatusLowBattery === undefined) {
371
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
372
- } else {
373
- this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
374
- this.Battery!.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
375
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
376
- + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
377
- if (this.device.mqttURL) {
378
- mqttmessage.push(`"lowBattery": ${this.Battery.StatusLowBattery}`);
379
- }
380
- }
381
-
382
- // MQTT Publish
383
- if (this.device.mqttURL) {
384
- this.mqttPublish(`{${mqttmessage.join(',')}}`);
385
- }
386
-
387
- // History Service
388
- if (!this.device.meter?.hide_humidity && (Number(this.HumiditySensor!.CurrentRelativeHumidity) > 0)) {
389
- // reject unreliable data
390
- if (this.device.history) {
391
- this.historyService?.addEntry(entry);
392
- }
393
- }
333
+ await this.updateCharacteristic(this.Battery.Service, this.hap.Characteristic.StatusLowBattery,
334
+ this.Battery.StatusLowBattery, 'StatusLowBattery');
394
335
  }
395
336
 
396
337
  async BLERefreshConnection(switchbot: any): Promise<void> {
397
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} wasn't able to establish BLE Connection, node-switchbot:`
398
- + ` ${JSON.stringify(switchbot)}`);
338
+ await this.errorLog(`wasn't able to establish BLE Connection, node-switchbot: ${JSON.stringify(switchbot)}`);
399
339
  if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
400
- this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Refresh Status`);
340
+ await this.warnLog('Using OpenAPI Connection to Refresh Status');
401
341
  await this.openAPIRefreshStatus();
402
342
  }
403
343
  }
404
344
 
405
345
  async offlineOff(): Promise<void> {
406
346
  if (this.device.offline) {
407
- if (!this.device.meter?.hide_humidity) {
408
- this.HumiditySensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, 50);
347
+ if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
348
+ this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, 50);
409
349
  }
410
- if (!this.device.meter?.hide_temperature) {
411
- this.TemperatureSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, 30);
350
+ if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
351
+ this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, 30);
412
352
  }
413
353
  this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, 100);
354
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery,
355
+ this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL);
414
356
  }
415
357
  }
416
358
 
417
359
  async apiError(e: any): Promise<void> {
418
- if (!this.device.meter?.hide_humidity) {
419
- this.HumiditySensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, e);
360
+ if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
361
+ this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, e);
420
362
  }
421
- if (!this.device.meter?.hide_temperature) {
422
- this.TemperatureSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, e);
363
+ if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
364
+ this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, e);
423
365
  }
424
- this.Battery!.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
425
- this.Battery!.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
366
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
367
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
426
368
  }
427
369
  }