@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,15 @@
5
5
  */
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 type { devicesConfig } from '../settings.js';
11
+ import type { device } from '../types/devicelist.js';
9
12
  import type { SwitchBotPlatform } from '../platform.js';
13
+ import type { motionSensorServiceData } from '../types/bledevicestatus.js';
14
+ import type { motionSensorStatus } from '../types/devicestatus.js';
15
+ import type { motionSensorWebhookContext } from '../types/devicewebhookstatus.js';
10
16
  import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge';
11
- import type { device, devicesConfig, serviceData, deviceStatus } from '../settings.js';
12
17
 
13
18
  /**
14
19
  * Platform Accessory
@@ -128,97 +133,64 @@ export class Motion extends deviceBase {
128
133
  // Retrieve initial values and updateHomekit
129
134
  this.updateHomeKitCharacteristics();
130
135
 
136
+ //regisiter webhook event handler
137
+ this.registerWebhook();
138
+
131
139
  // Start an update interval
132
140
  interval(this.deviceRefreshRate * 1000)
133
141
  .pipe(skipWhile(() => this.motionUbpdateInProgress))
134
142
  .subscribe(async () => {
135
143
  await this.refreshStatus();
136
144
  });
137
-
138
- //regisiter webhook event handler
139
- this.registerWebhook(accessory, device);
140
145
  }
141
146
 
142
- async BLEparseStatus(serviceData: serviceData): Promise<void> {
143
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
147
+ async BLEparseStatus(serviceData: motionSensorServiceData): Promise<void> {
148
+ await this.debugLog('BLEparseStatus');
144
149
  // Movement
145
- this.MotionSensor.MotionDetected = serviceData.movement!;
146
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionSensor.MotionDetected}`);
147
- if (this.MotionSensor.MotionDetected !== this.accessory.context.MotionDetected && this.MotionSensor.MotionDetected) {
148
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Detected Motion`);
149
- }
150
- // Light Level
151
- if (!this.device.motion?.hide_lightsensor) {
152
- const set_minLux = this.device.motion?.set_minLux ?? 1;
153
- const set_maxLux = this.device.motion?.set_maxLux ?? 6001;
154
- switch (serviceData.lightLevel) {
155
- case 'dark':
156
- case 1:
157
- this.LightSensor!.CurrentAmbientLightLevel = set_minLux;
158
- break;
159
- default:
160
- this.LightSensor!.CurrentAmbientLightLevel = set_maxLux;
161
- }
162
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel},`
163
- + ` CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
164
- if (this.LightSensor!.CurrentAmbientLightLevel !== this.accessory.context.CurrentAmbientLightLevel) {
165
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName}`
166
- + ` CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
167
- }
150
+ this.MotionSensor.MotionDetected = serviceData.movement;
151
+ await this.debugLog(`MotionDetected: ${this.MotionSensor.MotionDetected}`);
152
+ // CurrentAmbientLightLevel
153
+ if (!this.device.motion?.hide_lightsensor && this.LightSensor?.Service) {
154
+ const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
155
+ const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
156
+ const lightLevel = serviceData.lightLevel === 'bright' ? set_maxLux : set_minLux;
157
+ this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 2);
158
+ await this.debugLog(`LightLevel: ${serviceData.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
168
159
  }
169
- // Battery
170
- if (serviceData.battery === undefined) {
171
- serviceData.battery = 100;
172
- }
173
- this.Battery.BatteryLevel = serviceData.battery!;
174
- if (this.Battery.BatteryLevel < 10) {
175
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
176
- } else {
177
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
178
- }
179
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},`
180
- + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
160
+ // BatteryLevel
161
+ this.Battery.BatteryLevel = serviceData.battery;
162
+ await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
163
+ // StatusLowBattery
164
+ this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
165
+ ? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
166
+ await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
181
167
  }
182
168
 
183
- async openAPIparseStatus(deviceStatus: deviceStatus): Promise<void> {
184
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
169
+ async openAPIparseStatus(deviceStatus: motionSensorStatus): Promise<void> {
170
+ await this.debugLog('openAPIparseStatus');
185
171
  // Motion State
186
- this.MotionSensor.MotionDetected = deviceStatus.body.moveDetected!;
187
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionSensor.MotionDetected}`);
188
- // Light Level
189
- if (!this.device.motion?.hide_lightsensor) {
190
- const set_minLux = this.device.motion?.set_minLux ?? 1;
191
- const set_maxLux = this.device.motion?.set_maxLux ?? 6001;
192
- switch (deviceStatus.body.brightness) {
193
- case 'dim':
194
- this.LightSensor!.CurrentAmbientLightLevel = set_minLux;
195
- break;
196
- case 'bright':
197
- default:
198
- this.LightSensor!.CurrentAmbientLightLevel = set_maxLux;
199
- }
200
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
201
- + ` CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
202
- }
203
-
204
- // Battery
205
- this.Battery.BatteryLevel = Number(deviceStatus.body.battery);
206
- if (this.Battery.BatteryLevel < 10) {
207
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
208
- } else {
209
- this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
172
+ this.MotionSensor.MotionDetected = deviceStatus.moveDetected;
173
+ await this.debugLog(`MotionDetected: ${this.MotionSensor.MotionDetected}`);
174
+ // CurrentAmbientLightLevel
175
+ if (!this.device.motion?.hide_lightsensor && this.LightSensor?.Service) {
176
+ const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
177
+ const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
178
+ const lightLevel = deviceStatus.brightness === 'bright' ? set_maxLux : set_minLux;
179
+ this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 2);
180
+ await this.debugLog(`LightLevel: ${deviceStatus.brightness}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
210
181
  }
211
- if (Number.isNaN(this.Battery.BatteryLevel)) {
212
- this.Battery.BatteryLevel = 100;
213
- }
214
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},`
215
- + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
216
-
217
- // Firmware Version
218
- const version = deviceStatus.body.version?.toString();
219
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
220
- if (deviceStatus.body.version) {
221
- const deviceVersion = version?.replace(/^V|-.*$/g, '') ?? '0.0.0';
182
+ // BatteryLevel
183
+ this.Battery.BatteryLevel = Number(deviceStatus.battery);
184
+ await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
185
+ // StatusLowBattery
186
+ this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
187
+ ? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
188
+ await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
189
+ // FirmwareVersion
190
+ const version = deviceStatus.version.toString();
191
+ await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
192
+ if (deviceStatus.version) {
193
+ const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
222
194
  this.accessory
223
195
  .getService(this.hap.Service.AccessoryInformation)!
224
196
  .setCharacteristic(this.hap.Characteristic.HardwareRevision, deviceVersion)
@@ -226,29 +198,36 @@ export class Motion extends deviceBase {
226
198
  .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
227
199
  .updateValue(deviceVersion);
228
200
  this.accessory.context.deviceVersion = deviceVersion;
229
- this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceVersion: ${this.accessory.context.deviceVersion}`);
201
+ await this.debugLog(`deviceVersion: ${this.accessory.context.deviceVersion}`);
230
202
  }
231
203
  }
232
204
 
205
+ async parseStatusWebhook(context: motionSensorWebhookContext): Promise<void> {
206
+ await this.debugLog('parseStatusWebhook');
207
+ await this.debugLog(`(detectionState) = Webhook: (${context.detectionState}), current: (${this.MotionSensor.MotionDetected})`);
208
+ // MotionDetected
209
+ this.MotionSensor.MotionDetected = context.detectionState === 'DETECTED' ? true : false;
210
+ await this.debugLog(`MotionDetected: ${this.MotionSensor.MotionDetected}`);
211
+ }
212
+
233
213
  /**
234
214
  * Asks the SwitchBot API for the latest device information
235
215
  */
236
216
  async refreshStatus(): Promise<void> {
237
217
  if (!this.device.enableCloudService && this.OpenAPI) {
238
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} refreshStatus enableCloudService: ${this.device.enableCloudService}`);
218
+ await this.errorLog(`refreshStatus enableCloudService: ${this.device.enableCloudService}`);
239
219
  } else if (this.BLE) {
240
220
  await this.BLERefreshStatus();
241
221
  } else if (this.OpenAPI && this.platform.config.credentials?.token) {
242
222
  await this.openAPIRefreshStatus();
243
223
  } else {
244
224
  await this.offlineOff();
245
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:`
246
- + ` ${this.device.connectionType}, refreshStatus will not happen.`);
225
+ await this.debugWarnLog(`Connection Type: ${this.device.connectionType}, refreshStatus will not happen.`);
247
226
  }
248
227
  }
249
228
 
250
229
  async BLERefreshStatus(): Promise<void> {
251
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLERefreshStatus`);
230
+ await this.debugLog('BLERefreshStatus');
252
231
  const switchbot = await this.switchbotBLE();
253
232
 
254
233
  if (switchbot === undefined) {
@@ -257,13 +236,13 @@ export class Motion extends deviceBase {
257
236
  // Start to monitor advertisement packets
258
237
  (async () => {
259
238
  // Start to monitor advertisement packets
260
- const serviceData: serviceData = await this.monitorAdvertisementPackets(switchbot);
239
+ const serviceData = await this.monitorAdvertisementPackets(switchbot) as motionSensorServiceData;
261
240
  // Update HomeKit
262
- if (serviceData.model !== '' && serviceData.modelName !== '') {
241
+ if (serviceData.model === SwitchBotBLEModel.MotionSensor && serviceData.modelName === SwitchBotBLEModelName.MotionSensor) {
263
242
  await this.BLEparseStatus(serviceData);
264
243
  await this.updateHomeKitCharacteristics();
265
244
  } else {
266
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed to get serviceData, serviceData: ${serviceData}`);
245
+ await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
267
246
  await this.BLERefreshConnection(switchbot);
268
247
  }
269
248
  })();
@@ -271,43 +250,39 @@ export class Motion extends deviceBase {
271
250
  }
272
251
 
273
252
  async openAPIRefreshStatus(): Promise<void> {
274
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
253
+ await this.debugLog('openAPIRefreshStatus');
275
254
  try {
276
255
  const { body, statusCode } = await this.deviceRefreshStatus();
277
256
  const deviceStatus: any = await body.json();
278
- await this.refreshStatusCodes(statusCode, deviceStatus);;
279
- if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
280
- await this.successfulRefreshStatus(statusCode, deviceStatus);
281
- await this.openAPIparseStatus(deviceStatus);
257
+ await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
258
+ if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
259
+ await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
260
+ await this.openAPIparseStatus(deviceStatus.body);
282
261
  await this.updateHomeKitCharacteristics();
283
262
  } else {
284
- await this.statusCodes(statusCode, deviceStatus);
263
+ await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
264
+ await this.debugWarnLog(statusCode, deviceStatus);
285
265
  }
286
266
  } catch (e: any) {
287
- this.apiError(e);
288
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIRefreshStatus with ${this.device.connectionType}`
289
- + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
267
+ await this.apiError(e);
268
+ await this.errorLog(`failed openAPIRefreshStatus with ${this.device.connectionType} Connection, Error Message: ${JSON.stringify(e.message)}`);
290
269
  }
291
270
  }
292
271
 
293
- async registerWebhook(accessory: PlatformAccessory, device: device & devicesConfig) {
294
- if (device.webhook) {
295
- this.debugLog(`${device.deviceType}: ${accessory.displayName} is listening webhook.`);
296
- this.platform.webhookEventHandler[device.deviceId] = async (context) => {
272
+ async registerWebhook() {
273
+ if (this.device.webhook) {
274
+ await this.debugLog('is listening webhook.');
275
+ this.platform.webhookEventHandler[this.device.deviceId] = async (context: motionSensorWebhookContext) => {
297
276
  try {
298
- this.debugLog(`${device.deviceType}: ${accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
299
- const { detectionState } = context;
300
- const { MotionDetected } = this.MotionSensor;
301
- this.debugLog(`${device.deviceType}: ${accessory.displayName} (detectionState) = Webhook: (${detectionState}),`
302
- + ` current: (${MotionDetected})`);
303
- this.MotionSensor.MotionDetected = detectionState === 'DETECTED' ? true : false;
304
- this.updateHomeKitCharacteristics();
277
+ await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
278
+ await this.parseStatusWebhook(context);
279
+ await this.updateHomeKitCharacteristics();
305
280
  } catch (e: any) {
306
- this.errorLog(`${device.deviceType}: ${accessory.displayName} failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
281
+ await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
307
282
  }
308
283
  };
309
284
  } else {
310
- this.debugLog(`${device.deviceType}: ${accessory.displayName} is not listening webhook.`);
285
+ await this.debugLog('is not listening webhook.');
311
286
  }
312
287
  }
313
288
 
@@ -315,47 +290,26 @@ export class Motion extends deviceBase {
315
290
  * Updates the status for each of the HomeKit Characteristics
316
291
  */
317
292
  async updateHomeKitCharacteristics(): Promise<void> {
318
- if (this.MotionSensor.MotionDetected === undefined) {
319
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionSensor.MotionDetected}`);
320
- } else {
321
- this.accessory.context.MotionDetected = this.MotionSensor.MotionDetected;
322
- this.MotionSensor.Service.updateCharacteristic(this.hap.Characteristic.MotionDetected, this.MotionSensor.MotionDetected);
323
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
324
- + ` MotionDetected: ${this.MotionSensor.MotionDetected}`);
325
- }
326
- if (this.Battery.BatteryLevel === undefined) {
327
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
328
- } else {
329
- this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
330
- this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
331
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`);
332
- }
333
- if (this.Battery.StatusLowBattery === undefined) {
334
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
335
- } else {
336
- this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
337
- this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
338
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
339
- + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
340
- }
341
- if (this.BLE) {
342
- if (this.LightSensor!.CurrentAmbientLightLevel === undefined) {
343
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
344
- + ` CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
345
- } else {
346
- this.accessory.context.CurrentAmbientLightLevel = this.LightSensor!.CurrentAmbientLightLevel;
347
- this.LightSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.LightSensor!.CurrentAmbientLightLevel);
348
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
349
- + ` updateCharacteristic CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
350
- }
293
+ // MotionDetected
294
+ await this.updateCharacteristic(this.MotionSensor.Service, this.hap.Characteristic.MotionDetected,
295
+ this.MotionSensor.MotionDetected, 'MotionDetected');
296
+ // BatteryLevel
297
+ await this.updateCharacteristic(this.Battery.Service, this.hap.Characteristic.BatteryLevel,
298
+ this.Battery.BatteryLevel, 'BatteryLevel');
299
+ // StatusLowBattery
300
+ await this.updateCharacteristic(this.Battery.Service, this.hap.Characteristic.StatusLowBattery,
301
+ this.Battery.StatusLowBattery, 'StatusLowBattery');
302
+ // CurrentAmbientLightLevel
303
+ if (!this.device.motion?.hide_lightsensor && this.LightSensor?.Service) {
304
+ await this.updateCharacteristic(this.LightSensor.Service, this.hap.Characteristic.CurrentAmbientLightLevel,
305
+ this.LightSensor.CurrentAmbientLightLevel, 'CurrentAmbientLightLevel');
351
306
  }
352
307
  }
353
308
 
354
309
  async BLERefreshConnection(switchbot: any): Promise<void> {
355
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} wasn't able to establish BLE Connection, node-switchbot:`
356
- + ` ${JSON.stringify(switchbot)}`);
310
+ await this.errorLog(`wasn't able to establish BLE Connection, node-switchbot: ${JSON.stringify(switchbot)}`);
357
311
  if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
358
- this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Refresh Status`);
312
+ await this.warnLog('Using OpenAPI Connection to Refresh Status');
359
313
  await this.openAPIRefreshStatus();
360
314
  }
361
315
  }
@@ -370,8 +324,8 @@ export class Motion extends deviceBase {
370
324
  this.MotionSensor.Service.updateCharacteristic(this.hap.Characteristic.MotionDetected, e);
371
325
  this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
372
326
  this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
373
- if (this.BLE) {
374
- this.LightSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, e);
327
+ if (!this.device.motion?.hide_lightsensor && this.LightSensor?.Service) {
328
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, e);
375
329
  }
376
330
  }
377
331
  }