@switchbot/homebridge-switchbot 3.5.1-beta.2 → 3.5.1-beta.4

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 (187) hide show
  1. package/dist/device/blindtilt.d.ts +15 -6
  2. package/dist/device/blindtilt.d.ts.map +1 -1
  3. package/dist/device/blindtilt.js +203 -255
  4. package/dist/device/blindtilt.js.map +1 -1
  5. package/dist/device/bot.d.ts +9 -4
  6. package/dist/device/bot.d.ts.map +1 -1
  7. package/dist/device/bot.js +196 -218
  8. package/dist/device/bot.js.map +1 -1
  9. package/dist/device/ceilinglight.d.ts +9 -4
  10. package/dist/device/ceilinglight.d.ts.map +1 -1
  11. package/dist/device/ceilinglight.js +202 -247
  12. package/dist/device/ceilinglight.js.map +1 -1
  13. package/dist/device/colorbulb.d.ts +10 -5
  14. package/dist/device/colorbulb.d.ts.map +1 -1
  15. package/dist/device/colorbulb.js +329 -378
  16. package/dist/device/colorbulb.js.map +1 -1
  17. package/dist/device/contact.d.ts +9 -4
  18. package/dist/device/contact.d.ts.map +1 -1
  19. package/dist/device/contact.js +99 -142
  20. package/dist/device/contact.js.map +1 -1
  21. package/dist/device/curtain.d.ts +19 -7
  22. package/dist/device/curtain.d.ts.map +1 -1
  23. package/dist/device/curtain.js +203 -264
  24. package/dist/device/curtain.js.map +1 -1
  25. package/dist/device/device.d.ts +28 -32
  26. package/dist/device/device.d.ts.map +1 -1
  27. package/dist/device/device.js +186 -225
  28. package/dist/device/device.js.map +1 -1
  29. package/dist/device/fan.d.ts +9 -4
  30. package/dist/device/fan.d.ts.map +1 -1
  31. package/dist/device/fan.js +198 -227
  32. package/dist/device/fan.js.map +1 -1
  33. package/dist/device/hub.d.ts +9 -5
  34. package/dist/device/hub.d.ts.map +1 -1
  35. package/dist/device/hub.js +106 -231
  36. package/dist/device/hub.js.map +1 -1
  37. package/dist/device/humidifier.d.ts +12 -4
  38. package/dist/device/humidifier.d.ts.map +1 -1
  39. package/dist/device/humidifier.js +192 -232
  40. package/dist/device/humidifier.js.map +1 -1
  41. package/dist/device/iosensor.d.ts +9 -4
  42. package/dist/device/iosensor.d.ts.map +1 -1
  43. package/dist/device/iosensor.js +91 -157
  44. package/dist/device/iosensor.js.map +1 -1
  45. package/dist/device/lightstrip.d.ts +10 -5
  46. package/dist/device/lightstrip.d.ts.map +1 -1
  47. package/dist/device/lightstrip.js +287 -367
  48. package/dist/device/lightstrip.js.map +1 -1
  49. package/dist/device/lock.d.ts +10 -5
  50. package/dist/device/lock.d.ts.map +1 -1
  51. package/dist/device/lock.js +171 -216
  52. package/dist/device/lock.js.map +1 -1
  53. package/dist/device/meter.d.ts +9 -4
  54. package/dist/device/meter.d.ts.map +1 -1
  55. package/dist/device/meter.js +93 -158
  56. package/dist/device/meter.js.map +1 -1
  57. package/dist/device/meterplus.d.ts +9 -4
  58. package/dist/device/meterplus.d.ts.map +1 -1
  59. package/dist/device/meterplus.js +94 -155
  60. package/dist/device/meterplus.js.map +1 -1
  61. package/dist/device/motion.d.ts +9 -4
  62. package/dist/device/motion.d.ts.map +1 -1
  63. package/dist/device/motion.js +84 -142
  64. package/dist/device/motion.js.map +1 -1
  65. package/dist/device/plug.d.ts +9 -4
  66. package/dist/device/plug.d.ts.map +1 -1
  67. package/dist/device/plug.js +99 -124
  68. package/dist/device/plug.js.map +1 -1
  69. package/dist/device/robotvacuumcleaner.d.ts +9 -6
  70. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  71. package/dist/device/robotvacuumcleaner.js +170 -253
  72. package/dist/device/robotvacuumcleaner.js.map +1 -1
  73. package/dist/device/waterdetector.d.ts +12 -4
  74. package/dist/device/waterdetector.d.ts.map +1 -1
  75. package/dist/device/waterdetector.js +102 -128
  76. package/dist/device/waterdetector.js.map +1 -1
  77. package/dist/irdevice/airconditioner.d.ts +2 -1
  78. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  79. package/dist/irdevice/airconditioner.js.map +1 -1
  80. package/dist/irdevice/airpurifier.d.ts +2 -1
  81. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  82. package/dist/irdevice/airpurifier.js.map +1 -1
  83. package/dist/irdevice/camera.d.ts +2 -1
  84. package/dist/irdevice/camera.d.ts.map +1 -1
  85. package/dist/irdevice/camera.js.map +1 -1
  86. package/dist/irdevice/fan.d.ts +2 -1
  87. package/dist/irdevice/fan.d.ts.map +1 -1
  88. package/dist/irdevice/fan.js.map +1 -1
  89. package/dist/irdevice/irdevice.d.ts +2 -1
  90. package/dist/irdevice/irdevice.d.ts.map +1 -1
  91. package/dist/irdevice/irdevice.js +1 -1
  92. package/dist/irdevice/irdevice.js.map +1 -1
  93. package/dist/irdevice/light.d.ts +2 -1
  94. package/dist/irdevice/light.d.ts.map +1 -1
  95. package/dist/irdevice/light.js.map +1 -1
  96. package/dist/irdevice/other.d.ts +2 -1
  97. package/dist/irdevice/other.d.ts.map +1 -1
  98. package/dist/irdevice/other.js.map +1 -1
  99. package/dist/irdevice/tv.d.ts +2 -1
  100. package/dist/irdevice/tv.d.ts.map +1 -1
  101. package/dist/irdevice/tv.js.map +1 -1
  102. package/dist/irdevice/vacuumcleaner.d.ts +2 -1
  103. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  104. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  105. package/dist/irdevice/waterheater.d.ts +2 -1
  106. package/dist/irdevice/waterheater.d.ts.map +1 -1
  107. package/dist/irdevice/waterheater.js.map +1 -1
  108. package/dist/platform.d.ts +5 -7
  109. package/dist/platform.d.ts.map +1 -1
  110. package/dist/platform.js +51 -34
  111. package/dist/platform.js.map +1 -1
  112. package/dist/settings.d.ts +49 -191
  113. package/dist/settings.d.ts.map +1 -1
  114. package/dist/settings.js +19 -0
  115. package/dist/settings.js.map +1 -1
  116. package/dist/types/bledevicestatus.d.ts +279 -0
  117. package/dist/types/bledevicestatus.d.ts.map +1 -0
  118. package/dist/types/bledevicestatus.js +2 -0
  119. package/dist/types/bledevicestatus.js.map +1 -0
  120. package/dist/types/devicelist.d.ts +89 -0
  121. package/dist/types/devicelist.d.ts.map +1 -0
  122. package/dist/types/devicelist.js +6 -0
  123. package/dist/types/devicelist.js.map +1 -0
  124. package/dist/types/deviceresponse.d.ts +13 -0
  125. package/dist/types/deviceresponse.d.ts.map +1 -0
  126. package/dist/types/deviceresponse.js +2 -0
  127. package/dist/types/deviceresponse.js.map +1 -0
  128. package/dist/types/devicestatus.d.ts +149 -0
  129. package/dist/types/devicestatus.d.ts.map +1 -0
  130. package/dist/types/devicestatus.js +3 -0
  131. package/dist/types/devicestatus.js.map +1 -0
  132. package/dist/types/devicewebhookstatus.d.ts +156 -0
  133. package/dist/types/devicewebhookstatus.d.ts.map +1 -0
  134. package/dist/types/devicewebhookstatus.js +2 -0
  135. package/dist/types/devicewebhookstatus.js.map +1 -0
  136. package/dist/types/irdevicelist.d.ts +10 -0
  137. package/dist/types/irdevicelist.d.ts.map +1 -0
  138. package/dist/types/irdevicelist.js +2 -0
  139. package/dist/types/irdevicelist.js.map +1 -0
  140. package/dist/types/pushbody.d.ts +6 -0
  141. package/dist/types/pushbody.d.ts.map +1 -0
  142. package/dist/types/pushbody.js +2 -0
  143. package/dist/types/pushbody.js.map +1 -0
  144. package/dist/utils.d.ts +25 -0
  145. package/dist/utils.d.ts.map +1 -1
  146. package/dist/utils.js +28 -0
  147. package/dist/utils.js.map +1 -1
  148. package/package.json +10 -10
  149. package/src/device/blindtilt.ts +224 -264
  150. package/src/device/bot.ts +208 -221
  151. package/src/device/ceilinglight.ts +210 -257
  152. package/src/device/colorbulb.ts +334 -397
  153. package/src/device/contact.ts +111 -146
  154. package/src/device/curtain.ts +220 -283
  155. package/src/device/device.ts +194 -245
  156. package/src/device/fan.ts +214 -230
  157. package/src/device/hub.ts +126 -246
  158. package/src/device/humidifier.ts +216 -243
  159. package/src/device/iosensor.ts +114 -166
  160. package/src/device/lightstrip.ts +302 -377
  161. package/src/device/lock.ts +187 -221
  162. package/src/device/meter.ts +116 -177
  163. package/src/device/meterplus.ts +117 -174
  164. package/src/device/motion.ts +99 -144
  165. package/src/device/plug.ts +110 -128
  166. package/src/device/robotvacuumcleaner.ts +189 -252
  167. package/src/device/waterdetector.ts +120 -138
  168. package/src/irdevice/airconditioner.ts +2 -1
  169. package/src/irdevice/airpurifier.ts +2 -1
  170. package/src/irdevice/camera.ts +2 -1
  171. package/src/irdevice/fan.ts +2 -1
  172. package/src/irdevice/irdevice.ts +3 -2
  173. package/src/irdevice/light.ts +2 -1
  174. package/src/irdevice/other.ts +2 -1
  175. package/src/irdevice/tv.ts +2 -1
  176. package/src/irdevice/vacuumcleaner.ts +2 -1
  177. package/src/irdevice/waterheater.ts +2 -1
  178. package/src/platform.ts +52 -34
  179. package/src/settings.ts +30 -239
  180. package/src/types/bledevicestatus.ts +305 -0
  181. package/src/types/devicelist.ts +124 -0
  182. package/src/types/deviceresponse.ts +15 -0
  183. package/src/types/devicestatus.ts +178 -0
  184. package/src/types/devicewebhookstatus.ts +196 -0
  185. package/src/types/irdevicelist.ts +15 -0
  186. package/src/types/pushbody.ts +9 -0
  187. 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
  }