@switchbot/homebridge-switchbot 3.5.1-beta.1 → 3.5.1-beta.11

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 +203 -255
  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 +196 -218
  9. package/dist/device/bot.js.map +1 -1
  10. package/dist/device/ceilinglight.d.ts +9 -4
  11. package/dist/device/ceilinglight.d.ts.map +1 -1
  12. package/dist/device/ceilinglight.js +203 -249
  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 +329 -378
  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 +99 -142
  21. package/dist/device/contact.js.map +1 -1
  22. package/dist/device/curtain.d.ts +19 -7
  23. package/dist/device/curtain.d.ts.map +1 -1
  24. package/dist/device/curtain.js +203 -264
  25. package/dist/device/curtain.js.map +1 -1
  26. package/dist/device/device.d.ts +28 -32
  27. package/dist/device/device.d.ts.map +1 -1
  28. package/dist/device/device.js +186 -225
  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 +198 -227
  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 +106 -231
  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 +192 -232
  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 +91 -157
  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 +287 -367
  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 +171 -216
  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 +93 -158
  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 +94 -155
  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 +84 -142
  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 +99 -124
  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 +170 -253
  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 +105 -129
  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 +45 -51
  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 +17 -17
  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 +9 -9
  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 +19 -19
  93. package/dist/irdevice/fan.js.map +1 -1
  94. package/dist/irdevice/irdevice.d.ts +24 -11
  95. package/dist/irdevice/irdevice.d.ts.map +1 -1
  96. package/dist/irdevice/irdevice.js +90 -68
  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 +15 -17
  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 +76 -76
  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 +35 -35
  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 +9 -9
  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 +9 -9
  117. package/dist/irdevice/waterheater.js.map +1 -1
  118. package/dist/platform.d.ts +15 -15
  119. package/dist/platform.d.ts.map +1 -1
  120. package/dist/platform.js +288 -271
  121. package/dist/platform.js.map +1 -1
  122. package/dist/settings.d.ts +49 -191
  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 +10 -10
  159. package/src/device/blindtilt.ts +224 -264
  160. package/src/device/bot.ts +208 -221
  161. package/src/device/ceilinglight.ts +211 -261
  162. package/src/device/colorbulb.ts +334 -397
  163. package/src/device/contact.ts +111 -146
  164. package/src/device/curtain.ts +220 -283
  165. package/src/device/device.ts +194 -245
  166. package/src/device/fan.ts +214 -230
  167. package/src/device/hub.ts +126 -246
  168. package/src/device/humidifier.ts +216 -243
  169. package/src/device/iosensor.ts +114 -166
  170. package/src/device/lightstrip.ts +302 -377
  171. package/src/device/lock.ts +187 -221
  172. package/src/device/meter.ts +116 -177
  173. package/src/device/meterplus.ts +117 -174
  174. package/src/device/motion.ts +99 -144
  175. package/src/device/plug.ts +110 -128
  176. package/src/device/robotvacuumcleaner.ts +189 -252
  177. package/src/device/waterdetector.ts +123 -139
  178. package/src/irdevice/airconditioner.ts +47 -52
  179. package/src/irdevice/airpurifier.ts +19 -18
  180. package/src/irdevice/camera.ts +11 -10
  181. package/src/irdevice/fan.ts +21 -20
  182. package/src/irdevice/irdevice.ts +95 -70
  183. package/src/irdevice/light.ts +17 -18
  184. package/src/irdevice/other.ts +78 -77
  185. package/src/irdevice/tv.ts +37 -36
  186. package/src/irdevice/vacuumcleaner.ts +11 -10
  187. package/src/irdevice/waterheater.ts +11 -10
  188. package/src/platform.ts +290 -272
  189. package/src/settings.ts +30 -239
  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
@@ -3,12 +3,16 @@
3
3
  * contact.ts: @switchbot/homebridge-switchbot.
4
4
  */
5
5
  import { deviceBase } from './device.js';
6
- import { interval, Subject } from 'rxjs';
7
- import { skipWhile } from 'rxjs/operators';
6
+ import { Subject, interval, skipWhile } from 'rxjs';
7
+ import { SwitchBotBLEModel, SwitchBotBLEModelName } from 'node-switchbot';
8
8
 
9
+ import type { devicesConfig } from '../settings.js';
10
+ import type { device } from '../types/devicelist.js';
9
11
  import type { SwitchBotPlatform } from '../platform.js';
12
+ import type { contactSensorServiceData } from '../types/bledevicestatus.js';
10
13
  import type { Service, PlatformAccessory, CharacteristicValue } from 'homebridge';
11
- import type { device, devicesConfig, serviceData, deviceStatus } from '../settings.js';
14
+ import type { contactSensorStatus } from '../types/devicestatus.js';
15
+ import type { contactSensorWebhookContext } from '../types/devicewebhookstatus.js';
12
16
 
13
17
  /**
14
18
  * Platform Accessory
@@ -158,123 +162,78 @@ export class Contact extends deviceBase {
158
162
  // Retrieve initial values and updateHomekit
159
163
  this.updateHomeKitCharacteristics();
160
164
 
165
+ //regisiter webhook event handler
166
+ this.registerWebhook();
167
+
161
168
  // Start an update interval
162
169
  interval(this.deviceRefreshRate * 1000)
163
170
  .pipe(skipWhile(() => this.contactUpdateInProgress))
164
171
  .subscribe(async () => {
165
172
  await this.refreshStatus();
166
173
  });
167
-
168
- //regisiter webhook event handler
169
- this.registerWebhook(accessory, device);
170
174
  }
171
175
 
172
- async BLEparseStatus(serviceData: serviceData): Promise<void> {
173
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
174
- // Door State
175
- switch (serviceData.doorState) {
176
- case 'open':
177
- case 1:
178
- this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
179
- break;
180
- case 'close':
181
- case 0:
182
- this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
183
- break;
184
- default:
185
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} timeout no closed, doorstate: ${serviceData.doorState}`);
186
- }
187
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
188
- if (
189
- this.ContactSensor.ContactSensorState !== this.accessory.context.ContactSensorState &&
190
- this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED
191
- ) {
192
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Opened`);
193
- }
194
- // Movement
195
- if (!this.device.contact?.hide_motionsensor) {
196
- this.MotionSensor!.MotionDetected = Boolean(serviceData.movement);
197
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionSensor!.MotionDetected}`);
198
- if (this.MotionSensor!.MotionDetected !== this.accessory.context.MotionDetected && this.MotionSensor!.MotionDetected) {
199
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Detected Motion`);
200
- }
201
- }
202
- // Light Level
203
- if (!this.device.contact?.hide_lightsensor) {
204
- const set_minLux = this.device.contact?.set_minLux ?? 1;
205
- const set_maxLux = this.device.contact?.set_maxLux ?? 6001;
206
- switch (serviceData.lightLevel) {
207
- case true:
208
- this.LightSensor!.CurrentAmbientLightLevel = set_minLux;
209
- break;
210
- default:
211
- this.LightSensor!.CurrentAmbientLightLevel = set_maxLux;
212
- }
213
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel},`
214
- + ` CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
215
- if (this.LightSensor!.CurrentAmbientLightLevel !== this.accessory.context.CurrentAmbientLightLevel) {
216
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName}`
217
- + ` CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
218
- }
176
+ async BLEparseStatus(serviceData: contactSensorServiceData): Promise<void> {
177
+ await this.debugLog('BLEparseStatus');
178
+ // ContactSensorState
179
+ this.ContactSensor.ContactSensorState = serviceData.doorState === 'open'
180
+ ? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED : this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
181
+ await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
182
+
183
+ // MotionDetected
184
+ if (!this.device.contact?.hide_motionsensor && this.MotionSensor?.Service) {
185
+ this.MotionSensor.MotionDetected = serviceData.movement;
186
+ await this.debugLog(`MotionDetected: ${this.MotionSensor.MotionDetected}`);
219
187
  }
220
- // Battery
221
- this.Battery.BatteryLevel = Number(serviceData.battery);
222
- if (this.Battery.BatteryLevel < 10) {
223
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
224
- } else {
225
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
188
+ // CurrentAmbientLightLevel
189
+ if (!this.device.contact?.hide_lightsensor && this.LightSensor?.Service) {
190
+ const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
191
+ const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
192
+ const lightLevel = serviceData.lightLevel === 'bright' ? set_maxLux : set_minLux;
193
+ this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 2);
194
+ await this.debugLog(`LightLevel: ${serviceData.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
226
195
  }
227
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}, `
228
- + `StatusLowBattery: ${this.Battery.StatusLowBattery}`);
196
+ // BatteryLevel
197
+ this.Battery.BatteryLevel = serviceData.battery;
198
+ await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
199
+ // StatusLowBattery
200
+ this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
201
+ ? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
202
+ await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
229
203
  }
230
204
 
231
- async openAPIparseStatus(deviceStatus: deviceStatus): Promise<void> {
232
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
205
+ async openAPIparseStatus(deviceStatus: contactSensorStatus): Promise<void> {
206
+ await this.debugLog('openAPIparseStatus');
233
207
  // Contact State
234
- if (deviceStatus.body.openState === 'open') {
235
- this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
236
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
237
- } else if (deviceStatus.body.openState === 'close') {
238
- this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
239
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
240
- } else {
241
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openState: ${deviceStatus.body.openState}`);
242
- }
243
- // Motion State
244
- if (!this.device.contact?.hide_motionsensor) {
245
- this.MotionSensor!.MotionDetected = deviceStatus.body.moveDetected!;
246
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionSensor!.MotionDetected}`);
208
+ this.ContactSensor.ContactSensorState = deviceStatus.openState === 'open'
209
+ ? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED : this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
210
+ await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
211
+
212
+ // MotionDetected
213
+ if (!this.device.contact?.hide_motionsensor && this.MotionSensor?.Service) {
214
+ this.MotionSensor.MotionDetected = deviceStatus.moveDetected;
215
+ await this.debugLog(`MotionDetected: ${this.MotionSensor.MotionDetected}`);
247
216
  }
248
217
  // Light Level
249
- if (!this.device.contact?.hide_lightsensor) {
250
- const set_minLux = this.device.contact?.set_minLux ?? 1;
251
- const set_maxLux = this.device.contact?.set_maxLux ?? 6001;
252
- switch (deviceStatus.body.brightness) {
253
- case 'dim':
254
- this.LightSensor!.CurrentAmbientLightLevel = set_minLux;
255
- break;
256
- case 'bright':
257
- default:
258
- this.LightSensor!.CurrentAmbientLightLevel = set_maxLux;
259
- }
260
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
261
- + ` CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
262
- }
263
- // Battery
264
- this.Battery.BatteryLevel = Number(deviceStatus.body.battery);
265
- if (this.Battery.BatteryLevel < 10) {
266
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
267
- } else {
268
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
218
+ if (!this.device.contact?.hide_lightsensor && this.LightSensor?.Service) {
219
+ const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
220
+ const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
221
+ const lightLevel = deviceStatus.brightness === 'bright' ? set_maxLux : set_minLux;
222
+ this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 2);
223
+ await this.debugLog(`LightLevel: ${deviceStatus.brightness}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
269
224
  }
270
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}, `
271
- + `StatusLowBattery: ${this.Battery.StatusLowBattery}`);
272
-
273
- // Firmware Version
274
- const version = deviceStatus.body.version?.toString();
275
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
276
- if (deviceStatus.body.version) {
277
- const deviceVersion = version?.replace(/^V|-.*$/g, '') ?? '0.0.0';
225
+ // BatteryLevel
226
+ this.Battery.BatteryLevel = Number(deviceStatus.battery);
227
+ await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
228
+ // StatusLowBattery
229
+ this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
230
+ ? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
231
+ await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
232
+ // FirmwareVersion
233
+ const version = deviceStatus.version.toString();
234
+ await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
235
+ if (deviceStatus.version) {
236
+ const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
278
237
  this.accessory
279
238
  .getService(this.hap.Service.AccessoryInformation)!
280
239
  .setCharacteristic(this.hap.Characteristic.HardwareRevision, deviceVersion)
@@ -282,7 +241,28 @@ export class Contact extends deviceBase {
282
241
  .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
283
242
  .updateValue(deviceVersion);
284
243
  this.accessory.context.deviceVersion = deviceVersion;
285
- this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceVersion: ${this.accessory.context.deviceVersion}`);
244
+ await this.debugLog(`deviceVersion: ${this.accessory.context.deviceVersion}`);
245
+ }
246
+ }
247
+
248
+ async parseStatusWebhook(context: contactSensorWebhookContext): Promise<void> {
249
+ await this.debugLog('parseStatusWebhook');
250
+ await this.debugLog(`(detectionState, brightness, openState) = Webhook:(${context.detectionState}, ${context.brightness}, ${context.openState}),`
251
+ + ` current:(${this.MotionSensor?.MotionDetected}, ${this.LightSensor?.CurrentAmbientLightLevel}, ${this.ContactSensor.ContactSensorState})`);
252
+ // ContactSensorState
253
+ this.ContactSensor.ContactSensorState = context.openState === 'open' ? 1 : 0;
254
+ await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
255
+ if (!this.device.contact?.hide_motionsensor && this.MotionSensor?.Service) {
256
+ // MotionDetected
257
+ this.MotionSensor.MotionDetected = context.detectionState === 'DETECTED' ? true : false;
258
+ await this.debugLog(`MotionDetected: ${this.MotionSensor.MotionDetected}`);
259
+ }
260
+ if (!this.device.contact?.hide_lightsensor && this.LightSensor?.Service) {
261
+ const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
262
+ const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
263
+ const lightLevel = context.brightness === 'bright' ? set_maxLux : set_minLux;
264
+ this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 2);
265
+ await this.debugLog(`LightLevel: ${context.brightness}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
286
266
  }
287
267
  }
288
268
 
@@ -291,20 +271,19 @@ export class Contact extends deviceBase {
291
271
  */
292
272
  async refreshStatus(): Promise<void> {
293
273
  if (!this.device.enableCloudService && this.OpenAPI) {
294
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} refreshStatus enableCloudService: ${this.device.enableCloudService}`);
274
+ await this.errorLog(`refreshStatus enableCloudService: ${this.device.enableCloudService}`);
295
275
  } else if (this.BLE) {
296
276
  await this.BLERefreshStatus();
297
- } else if (this.OpenAPI) {
277
+ } else if (this.OpenAPI && this.platform.config.credentials?.token) {
298
278
  await this.openAPIRefreshStatus();
299
279
  } else {
300
280
  await this.offlineOff();
301
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:`
302
- + ` ${this.device.connectionType}, refreshStatus will not happen.`);
281
+ await this.debugWarnLog(`Connection Type: ${this.device.connectionType}, refreshStatus will not happen.`);
303
282
  }
304
283
  }
305
284
 
306
285
  async BLERefreshStatus(): Promise<void> {
307
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLERefreshStatus`);
286
+ await this.debugLog('BLERefreshStatus');
308
287
  const switchbot = await this.switchbotBLE();
309
288
 
310
289
  if (switchbot === undefined) {
@@ -313,13 +292,13 @@ export class Contact extends deviceBase {
313
292
  // Start to monitor advertisement packets
314
293
  (async () => {
315
294
  // Start to monitor advertisement packets
316
- const serviceData: serviceData = await this.monitorAdvertisementPackets(switchbot);
295
+ const serviceData = await this.monitorAdvertisementPackets(switchbot) as contactSensorServiceData;
317
296
  // Update HomeKit
318
- if (serviceData.model !== '' && serviceData.modelName !== '') {
297
+ if (serviceData.model === SwitchBotBLEModel.ContactSensor && serviceData.modelName === SwitchBotBLEModelName.ContactSensor) {
319
298
  await this.BLEparseStatus(serviceData);
320
299
  await this.updateHomeKitCharacteristics();
321
300
  } else {
322
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed to get serviceData, serviceData: ${serviceData}`);
301
+ await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
323
302
  await this.BLERefreshConnection(switchbot);
324
303
  }
325
304
  })();
@@ -327,52 +306,39 @@ export class Contact extends deviceBase {
327
306
  }
328
307
 
329
308
  async openAPIRefreshStatus(): Promise<void> {
330
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
309
+ await this.debugLog('openAPIRefreshStatus');
331
310
  try {
332
311
  const { body, statusCode } = await this.deviceRefreshStatus();
333
312
  const deviceStatus: any = await body.json();
334
- await this.refreshStatusCodes(statusCode, deviceStatus);;
335
- if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
336
- await this.successfulRefreshStatus(statusCode, deviceStatus);
337
- await this.openAPIparseStatus(deviceStatus);
313
+ await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
314
+ if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
315
+ await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
316
+ await this.openAPIparseStatus(deviceStatus.body);
338
317
  await this.updateHomeKitCharacteristics();
339
318
  } else {
340
- await this.statusCodes(statusCode, deviceStatus);
319
+ await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
320
+ await this.debugWarnLog(statusCode, deviceStatus);
341
321
  }
342
322
  } catch (e: any) {
343
323
  await this.apiError(e);
344
- await this.openAPIRefreshError(e);
324
+ await this.errorLog(`failed openAPIRefreshStatus with ${this.device.connectionType} Connection, Error Message: ${JSON.stringify(e.message)}`);
345
325
  }
346
326
  }
347
327
 
348
- async registerWebhook(accessory: PlatformAccessory, device: device & devicesConfig) {
349
- if (device.webhook) {
350
- this.debugLog(`${device.deviceType}: ${accessory.displayName} is listening webhook.`);
351
- this.platform.webhookEventHandler[device.deviceId] = async (context) => {
328
+ async registerWebhook() {
329
+ if (this.device.webhook) {
330
+ await this.debugLog('is listening webhook.');
331
+ this.platform.webhookEventHandler[this.device.deviceId] = async (context: contactSensorWebhookContext) => {
352
332
  try {
353
- this.debugLog(`${device.deviceType}: ${accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
354
- const { detectionState, brightness, openState } = context;
355
- const { ContactSensorState } = this.ContactSensor;
356
- const { CurrentAmbientLightLevel } = this.LightSensor ?? {};
357
- const { MotionDetected } = this.MotionSensor ?? {};
358
- this.debugLog(`${device.deviceType}: ${accessory.displayName} (detectionState, brightness, openState) = Webhook:(${detectionState}, `
359
- + `${brightness}, ${openState}), current:(${MotionDetected}, ${CurrentAmbientLightLevel}, ${ContactSensorState})`);
360
- const set_minLux = this.device.contact?.set_minLux ?? 1;
361
- const set_maxLux = this.device.contact?.set_maxLux ?? 6001;
362
- this.ContactSensor.ContactSensorState = openState === 'open' ? 1 : 0;
363
- if (!device.contact?.hide_motionsensor) {
364
- this.MotionSensor!.MotionDetected = detectionState === 'DETECTED' ? true : false;
365
- }
366
- if (!device.contact?.hide_lightsensor) {
367
- this.LightSensor!.CurrentAmbientLightLevel = brightness === 'bright' ? set_maxLux : set_minLux;
368
- }
369
- this.updateHomeKitCharacteristics();
333
+ await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
334
+ await this.parseStatusWebhook(context);
335
+ await this.updateHomeKitCharacteristics();
370
336
  } catch (e: any) {
371
- this.errorLog(`${device.deviceType}: ${accessory.displayName} failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
337
+ await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
372
338
  }
373
339
  };
374
340
  } else {
375
- this.debugLog(`${device.deviceType}: ${accessory.displayName} is not listening webhook.`);
341
+ await this.debugLog('is not listening webhook.');
376
342
  }
377
343
  }
378
344
 
@@ -402,10 +368,9 @@ export class Contact extends deviceBase {
402
368
  }
403
369
 
404
370
  async BLERefreshConnection(switchbot: any): Promise<void> {
405
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} wasn't able to establish BLE Connection, node-switchbot:`
406
- + ` ${JSON.stringify(switchbot)}`);
371
+ await this.errorLog(`wasn't able to establish BLE Connection, node-switchbot: ${JSON.stringify(switchbot)}`);
407
372
  if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
408
- this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Refresh Status`);
373
+ await this.warnLog('Using OpenAPI Connection to Refresh Status');
409
374
  await this.openAPIRefreshStatus();
410
375
  }
411
376
  }