@switchbot/homebridge-switchbot 2.8.0 → 2.8.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/.github/npm-version-script.js +81 -0
  2. package/dist/device/blindtilt.d.ts +21 -23
  3. package/dist/device/blindtilt.d.ts.map +1 -1
  4. package/dist/device/blindtilt.js +71 -73
  5. package/dist/device/blindtilt.js.map +1 -1
  6. package/dist/device/bot.d.ts +11 -15
  7. package/dist/device/bot.d.ts.map +1 -1
  8. package/dist/device/bot.js +38 -34
  9. package/dist/device/bot.js.map +1 -1
  10. package/dist/device/ceilinglight.d.ts +10 -14
  11. package/dist/device/ceilinglight.d.ts.map +1 -1
  12. package/dist/device/ceilinglight.js +33 -23
  13. package/dist/device/ceilinglight.js.map +1 -1
  14. package/dist/device/colorbulb.d.ts +16 -24
  15. package/dist/device/colorbulb.d.ts.map +1 -1
  16. package/dist/device/colorbulb.js +49 -43
  17. package/dist/device/colorbulb.js.map +1 -1
  18. package/dist/device/contact.d.ts +16 -24
  19. package/dist/device/contact.d.ts.map +1 -1
  20. package/dist/device/contact.js +49 -51
  21. package/dist/device/contact.js.map +1 -1
  22. package/dist/device/curtain.d.ts +21 -26
  23. package/dist/device/curtain.d.ts.map +1 -1
  24. package/dist/device/curtain.js +49 -47
  25. package/dist/device/curtain.js.map +1 -1
  26. package/dist/device/hub.d.ts +9 -8
  27. package/dist/device/hub.d.ts.map +1 -1
  28. package/dist/device/hub.js +42 -30
  29. package/dist/device/hub.js.map +1 -1
  30. package/dist/device/humidifier.d.ts +8 -10
  31. package/dist/device/humidifier.d.ts.map +1 -1
  32. package/dist/device/humidifier.js +27 -17
  33. package/dist/device/humidifier.js.map +1 -1
  34. package/dist/device/iosensor.d.ts +16 -21
  35. package/dist/device/iosensor.d.ts.map +1 -1
  36. package/dist/device/iosensor.js +35 -26
  37. package/dist/device/iosensor.js.map +1 -1
  38. package/dist/device/lightstrip.d.ts +8 -13
  39. package/dist/device/lightstrip.d.ts.map +1 -1
  40. package/dist/device/lightstrip.js +28 -25
  41. package/dist/device/lightstrip.js.map +1 -1
  42. package/dist/device/lock.d.ts +15 -21
  43. package/dist/device/lock.d.ts.map +1 -1
  44. package/dist/device/lock.js +75 -26
  45. package/dist/device/lock.js.map +1 -1
  46. package/dist/device/meter.d.ts +16 -21
  47. package/dist/device/meter.d.ts.map +1 -1
  48. package/dist/device/meter.js +40 -37
  49. package/dist/device/meter.js.map +1 -1
  50. package/dist/device/meterplus.d.ts +16 -21
  51. package/dist/device/meterplus.d.ts.map +1 -1
  52. package/dist/device/meterplus.js +40 -37
  53. package/dist/device/meterplus.js.map +1 -1
  54. package/dist/device/motion.d.ts +12 -21
  55. package/dist/device/motion.d.ts.map +1 -1
  56. package/dist/device/motion.js +44 -46
  57. package/dist/device/motion.js.map +1 -1
  58. package/dist/device/plug.d.ts +5 -15
  59. package/dist/device/plug.d.ts.map +1 -1
  60. package/dist/device/plug.js +22 -19
  61. package/dist/device/plug.js.map +1 -1
  62. package/dist/device/robotvacuumcleaner.d.ts +9 -13
  63. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  64. package/dist/device/robotvacuumcleaner.js +30 -28
  65. package/dist/device/robotvacuumcleaner.js.map +1 -1
  66. package/dist/irdevice/airconditioner.d.ts +4 -4
  67. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  68. package/dist/irdevice/camera.d.ts +1 -1
  69. package/dist/irdevice/camera.d.ts.map +1 -1
  70. package/dist/irdevice/fan.d.ts +3 -4
  71. package/dist/irdevice/fan.d.ts.map +1 -1
  72. package/dist/irdevice/fan.js.map +1 -1
  73. package/dist/irdevice/light.d.ts +1 -1
  74. package/dist/irdevice/light.d.ts.map +1 -1
  75. package/dist/irdevice/other.d.ts +2 -2
  76. package/dist/irdevice/other.d.ts.map +1 -1
  77. package/dist/irdevice/tv.d.ts +1 -2
  78. package/dist/irdevice/tv.d.ts.map +1 -1
  79. package/dist/irdevice/tv.js.map +1 -1
  80. package/dist/irdevice/vacuumcleaner.d.ts +1 -1
  81. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  82. package/dist/irdevice/waterheater.d.ts +1 -1
  83. package/dist/irdevice/waterheater.d.ts.map +1 -1
  84. package/dist/settings.d.ts +3 -1
  85. package/dist/settings.d.ts.map +1 -1
  86. package/dist/settings.js.map +1 -1
  87. package/package.json +5 -5
  88. package/src/device/blindtilt.ts +96 -95
  89. package/src/device/bot.ts +54 -54
  90. package/src/device/ceilinglight.ts +46 -39
  91. package/src/device/colorbulb.ts +68 -69
  92. package/src/device/contact.ts +69 -77
  93. package/src/device/curtain.ts +75 -74
  94. package/src/device/hub.ts +53 -38
  95. package/src/device/humidifier.ts +33 -26
  96. package/src/device/iosensor.ts +53 -48
  97. package/src/device/lightstrip.ts +39 -40
  98. package/src/device/lock.ts +94 -49
  99. package/src/device/meter.ts +59 -59
  100. package/src/device/meterplus.ts +59 -60
  101. package/src/device/motion.ts +61 -65
  102. package/src/device/plug.ts +27 -35
  103. package/src/device/robotvacuumcleaner.ts +43 -43
  104. package/src/irdevice/airconditioner.ts +4 -4
  105. package/src/irdevice/camera.ts +1 -1
  106. package/src/irdevice/fan.ts +3 -6
  107. package/src/irdevice/light.ts +1 -1
  108. package/src/irdevice/other.ts +2 -2
  109. package/src/irdevice/tv.ts +1 -4
  110. package/src/irdevice/vacuumcleaner.ts +1 -1
  111. package/src/irdevice/waterheater.ts +1 -1
  112. package/src/settings.ts +5 -1
@@ -5,7 +5,7 @@ import { interval, Subject } from 'rxjs';
5
5
  import { skipWhile } from 'rxjs/operators';
6
6
  import { SwitchBotPlatform } from '../platform';
7
7
  import { Service, PlatformAccessory, CharacteristicValue } from 'homebridge';
8
- import { device, devicesConfig, serviceData, switchbot, deviceStatus, ad, Devices } from '../settings';
8
+ import { device, devicesConfig, serviceData, deviceStatus, ad, Devices } from '../settings';
9
9
 
10
10
  /**
11
11
  * Platform Accessory
@@ -14,40 +14,34 @@ import { device, devicesConfig, serviceData, switchbot, deviceStatus, ad, Device
14
14
  */
15
15
  export class Contact {
16
16
  // Services
17
- contactSensorservice: Service;
18
17
  motionService?: Service;
18
+ batteryService: Service;
19
19
  lightSensorService?: Service;
20
- batteryService?: Service;
20
+ contactSensorservice: Service;
21
21
 
22
22
  // Characteristic Values
23
- ContactSensorState!: CharacteristicValue;
24
- MotionDetected!: CharacteristicValue;
25
- CurrentAmbientLightLevel!: CharacteristicValue;
26
23
  BatteryLevel!: CharacteristicValue;
24
+ MotionDetected!: CharacteristicValue;
27
25
  StatusLowBattery!: CharacteristicValue;
26
+ ContactSensorState!: CharacteristicValue;
27
+ CurrentAmbientLightLevel!: CharacteristicValue;
28
+
29
+ // OpenAPI Status
30
+ OpenAPI_BatteryLevel: deviceStatus['battery'];
31
+ OpenAPI_FirmwareRevision: deviceStatus['version'];
32
+ OpenAPI_MotionDetected: deviceStatus['moveDetected'];
33
+ OpenAPI_ContactSensorState: deviceStatus['openState'];
34
+ OpenAPI_CurrentAmbientLightLevel: deviceStatus['brightness'];
28
35
 
29
- // OpenAPI others
30
- Version: deviceStatus['version'];
31
- Battery: deviceStatus['battery'];
32
- openState: deviceStatus['openState'];
33
- moveDetected: deviceStatus['moveDetected'];
34
- brightness: deviceStatus['brightness'];
35
- deviceStatus!: any; //deviceStatusResponse;
36
+ // BLE Status
37
+ BLE_BateryLevel!: serviceData['battery'];
38
+ BLE_MotionDetected!: serviceData['movement'];
39
+ BLE_ContactSensorState!: serviceData['doorState'];
40
+ BLE_CurrentAmbientLightLevel: serviceData['lightLevel'];
36
41
 
37
42
  // BLE Others
38
- tested!: any;
39
- contact_open!: any;
40
- button_count!: any;
41
43
  scanning!: boolean;
42
- connected?: boolean;
43
- contact_timeout!: any;
44
- switchbot!: switchbot;
45
- serviceData!: serviceData;
46
- address!: ad['address'];
47
- battery!: serviceData['battery'];
48
- movement!: serviceData['movement'];
49
- doorState!: serviceData['doorState'];
50
- is_light!: any; //serviceData['lightLevel'];
44
+ BLE_IsConnected?: boolean;
51
45
 
52
46
  // Config
53
47
  set_minLux!: number;
@@ -147,19 +141,14 @@ export class Contact {
147
141
  }
148
142
 
149
143
  // Battery Service
150
- if (!this.batteryService) {
151
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Add Battery Service`);
152
- (this.batteryService = this.accessory.getService(this.platform.Service.Battery) || this.accessory.addService(this.platform.Service.Battery)),
153
- `${accessory.displayName} Battery`;
154
-
155
- this.batteryService.setCharacteristic(this.platform.Characteristic.Name, `${accessory.displayName} Battery`);
156
- if (!this.batteryService.testCharacteristic(this.platform.Characteristic.ConfiguredName)) {
157
- this.batteryService.addCharacteristic(this.platform.Characteristic.ConfiguredName, `${accessory.displayName} Battery`);
158
- }
159
- this.batteryService.setCharacteristic(this.platform.Characteristic.ChargingState, this.platform.Characteristic.ChargingState.NOT_CHARGEABLE);
160
- } else {
161
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Battery Service Not Added`);
144
+ (this.batteryService = this.accessory.getService(this.platform.Service.Battery) || accessory.addService(this.platform.Service.Battery)),
145
+ `${accessory.displayName} Battery`;
146
+
147
+ this.batteryService.setCharacteristic(this.platform.Characteristic.Name, `${accessory.displayName} Battery`);
148
+ if (!this.batteryService.testCharacteristic(this.platform.Characteristic.ConfiguredName)) {
149
+ this.batteryService.addCharacteristic(this.platform.Characteristic.ConfiguredName, `${accessory.displayName} Battery`);
162
150
  }
151
+ this.batteryService.setCharacteristic(this.platform.Characteristic.ChargingState, this.platform.Characteristic.ChargingState.NOT_CHARGEABLE);
163
152
 
164
153
  // Retrieve initial values and updateHomekit
165
154
  this.updateHomeKitCharacteristics();
@@ -193,7 +182,7 @@ export class Contact {
193
182
  async BLEparseStatus(): Promise<void> {
194
183
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
195
184
  // Door State
196
- switch (this.doorState) {
185
+ switch (this.BLE_ContactSensorState) {
197
186
  case 'open':
198
187
  case 1:
199
188
  this.ContactSensorState = this.platform.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
@@ -203,7 +192,7 @@ export class Contact {
203
192
  this.ContactSensorState = this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED;
204
193
  break;
205
194
  default:
206
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} timeout no closed, doorstate: ${this.doorState}`);
195
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} timeout no closed, doorstate: ${this.BLE_ContactSensorState}`);
207
196
  }
208
197
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
209
198
  if (
@@ -214,7 +203,7 @@ export class Contact {
214
203
  }
215
204
  // Movement
216
205
  if (!this.device.contact?.hide_motionsensor) {
217
- this.MotionDetected = Boolean(this.movement);
206
+ this.MotionDetected = Boolean(this.BLE_MotionDetected);
218
207
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionDetected}`);
219
208
  if (this.MotionDetected !== this.accessory.context.MotionDetected && this.MotionDetected) {
220
209
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Detected Motion`);
@@ -224,7 +213,7 @@ export class Contact {
224
213
  if (!this.device.contact?.hide_lightsensor) {
225
214
  this.set_minLux = this.minLux();
226
215
  this.set_maxLux = this.maxLux();
227
- switch (this.is_light) {
216
+ switch (this.BLE_CurrentAmbientLightLevel) {
228
217
  case true:
229
218
  this.CurrentAmbientLightLevel = this.set_minLux;
230
219
  break;
@@ -232,7 +221,7 @@ export class Contact {
232
221
  this.CurrentAmbientLightLevel = this.set_maxLux;
233
222
  }
234
223
  this.debugLog(
235
- `${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.is_light},` +
224
+ `${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel},` +
236
225
  ` CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`,
237
226
  );
238
227
  if (this.CurrentAmbientLightLevel !== this.accessory.context.CurrentAmbientLightLevel) {
@@ -240,10 +229,10 @@ export class Contact {
240
229
  }
241
230
  }
242
231
  // Battery
243
- if (this.battery === undefined) {
244
- this.battery === 100;
232
+ if (this.BLE_BateryLevel === undefined) {
233
+ this.BLE_BateryLevel === 100;
245
234
  }
246
- this.BatteryLevel = Number(this.battery);
235
+ this.BatteryLevel = Number(this.BLE_BateryLevel);
247
236
  if (this.BatteryLevel < 10) {
248
237
  this.StatusLowBattery = this.platform.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
249
238
  } else {
@@ -257,25 +246,25 @@ export class Contact {
257
246
  async openAPIparseStatus(): Promise<void> {
258
247
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
259
248
  // Contact State
260
- if (this.openState === 'open') {
249
+ if (this.OpenAPI_ContactSensorState === 'open') {
261
250
  this.ContactSensorState = this.platform.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
262
251
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
263
- } else if (this.openState === 'close') {
252
+ } else if (this.OpenAPI_ContactSensorState === 'close') {
264
253
  this.ContactSensorState = this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED;
265
254
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
266
255
  } else {
267
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openState: ${this.openState}`);
256
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openState: ${this.OpenAPI_ContactSensorState}`);
268
257
  }
269
258
  // Motion State
270
259
  if (!this.device.contact?.hide_motionsensor) {
271
- this.MotionDetected = this.moveDetected!;
260
+ this.MotionDetected = this.OpenAPI_MotionDetected!;
272
261
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionDetected}`);
273
262
  }
274
263
  // Light Level
275
264
  if (!this.device.contact?.hide_lightsensor) {
276
265
  this.set_minLux = this.minLux();
277
266
  this.set_maxLux = this.maxLux();
278
- switch (this.brightness) {
267
+ switch (this.OpenAPI_CurrentAmbientLightLevel) {
279
268
  case 'dim':
280
269
  this.CurrentAmbientLightLevel = this.set_minLux;
281
270
  break;
@@ -286,10 +275,10 @@ export class Contact {
286
275
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
287
276
  }
288
277
  // Battery
289
- if (this.battery === undefined) {
290
- this.battery === 100;
278
+ if (this.OpenAPI_BatteryLevel === undefined) {
279
+ this.OpenAPI_BatteryLevel === 100;
291
280
  }
292
- this.BatteryLevel = Number(this.Battery);
281
+ this.BatteryLevel = Number(this.OpenAPI_BatteryLevel);
293
282
  if (this.BatteryLevel < 10) {
294
283
  this.StatusLowBattery = this.platform.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
295
284
  } else {
@@ -341,35 +330,28 @@ export class Contact {
341
330
  .then(async () => {
342
331
  // Set an event hander
343
332
  this.scanning = true;
344
- switchbot.onadvertisement = async (ad: any) => {
345
- this.address = ad.address;
333
+ switchbot.onadvertisement = async (ad: ad) => {
346
334
  this.debugLog(
347
335
  `${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
348
- ` BLE Address Found: ${this.address}`,
336
+ ` BLE Address Found: ${ad.address}`,
349
337
  );
350
- this.serviceData = ad.serviceData;
351
- this.movement = ad.serviceData.movement;
352
- this.tested = ad.serviceData.tested;
353
- this.battery = ad.serviceData.battery;
354
- this.contact_open = ad.serviceData.contact_open;
355
- this.contact_timeout = ad.serviceData.contact_timeout;
356
- this.is_light = ad.serviceData.is_light;
357
- this.button_count = ad.serviceData.button_count;
358
- this.doorState = ad.serviceData.doorState;
338
+ this.BLE_MotionDetected = ad.serviceData.movement;
339
+ this.BLE_BateryLevel = ad.serviceData.battery;
340
+ this.BLE_ContactSensorState = ad.serviceData.doorState;
359
341
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
360
342
  this.debugLog(
361
343
  `${this.device.deviceType}: ${this.accessory.displayName} movement: ${ad.serviceData.movement}, doorState: ` +
362
- `${ad.serviceData.doorState}, is_light: ${ad.serviceData.is_light}, battery: ${ad.serviceData.battery}`,
344
+ `${ad.serviceData.doorState}, battery: ${ad.serviceData.battery}`,
363
345
  );
364
346
 
365
- if (this.serviceData) {
366
- this.connected = true;
367
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.connected}`);
347
+ if (ad.serviceData) {
348
+ this.BLE_IsConnected = true;
349
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
368
350
  await this.stopScanning(switchbot);
369
351
  this.scanning = false;
370
352
  } else {
371
- this.connected = false;
372
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.connected}`);
353
+ this.BLE_IsConnected = false;
354
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
373
355
  }
374
356
  };
375
357
  // Wait
@@ -405,11 +387,11 @@ export class Contact {
405
387
  this.statusCode(statusCode);
406
388
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Headers: ${JSON.stringify(headers)}`);
407
389
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} refreshStatus: ${JSON.stringify(deviceStatus)}`);
408
- this.openState = deviceStatus.body.openState;
409
- this.moveDetected = deviceStatus.body.moveDetected;
410
- this.brightness = deviceStatus.body.brightness;
411
- this.Battery = deviceStatus.body.battery;
412
- this.Version = deviceStatus.body.version;
390
+ this.OpenAPI_ContactSensorState = deviceStatus.body.openState;
391
+ this.OpenAPI_MotionDetected = deviceStatus.body.moveDetected;
392
+ this.OpenAPI_CurrentAmbientLightLevel = deviceStatus.body.brightness;
393
+ this.OpenAPI_BatteryLevel = deviceStatus.body.battery;
394
+ this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
413
395
  this.openAPIparseStatus();
414
396
  this.updateHomeKitCharacteristics();
415
397
  } catch (e: any) {
@@ -467,11 +449,21 @@ export class Contact {
467
449
  this.batteryService?.updateCharacteristic(this.platform.Characteristic.StatusLowBattery, this.StatusLowBattery);
468
450
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic StatusLowBattery: ${this.StatusLowBattery}`);
469
451
  }
452
+ // FirmwareRevision
453
+ if (this.OpenAPI_FirmwareRevision === undefined) {
454
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} FirmwareRevision: ${this.OpenAPI_FirmwareRevision}`);
455
+ } else {
456
+ this.accessory.context.OpenAPI_FirmwareRevision = this.OpenAPI_FirmwareRevision;
457
+ this.accessory.getService(this.platform.Service.AccessoryInformation)!
458
+ .updateCharacteristic(this.platform.Characteristic.FirmwareRevision, this.OpenAPI_FirmwareRevision);
459
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} `
460
+ + `updateCharacteristic CurrentTemperature: ${this.OpenAPI_FirmwareRevision}`);
461
+ }
470
462
  }
471
463
 
472
464
  async stopScanning(switchbot: any) {
473
465
  await switchbot.stopScan();
474
- if (this.connected) {
466
+ if (this.BLE_IsConnected) {
475
467
  await this.BLEparseStatus();
476
468
  await this.updateHomeKitCharacteristics();
477
469
  } else {
@@ -7,45 +7,44 @@ import { connectAsync } from 'async-mqtt';
7
7
  import { SwitchBotPlatform } from '../platform';
8
8
  import { debounceTime, skipWhile, take, tap } from 'rxjs/operators';
9
9
  import { Service, PlatformAccessory, CharacteristicValue, CharacteristicChange } from 'homebridge';
10
- import { device, devicesConfig, serviceData, switchbot, deviceStatus, ad, Devices } from '../settings';
10
+ import { device, devicesConfig, serviceData, deviceStatus, ad, Devices } from '../settings';
11
11
  import { hostname } from 'os';
12
12
 
13
13
  export class Curtain {
14
14
  // Services
15
- windowCoveringService: Service;
15
+ batteryService: Service;
16
16
  lightSensorService?: Service;
17
- batteryService?: Service;
17
+ windowCoveringService: Service;
18
18
 
19
19
  // Characteristic Values
20
- CurrentPosition!: CharacteristicValue;
20
+ BatteryLevel!: CharacteristicValue;
21
21
  PositionState!: CharacteristicValue;
22
22
  TargetPosition!: CharacteristicValue;
23
+ CurrentPosition!: CharacteristicValue;
24
+ StatusLowBattery!: CharacteristicValue;
23
25
  CurrentAmbientLightLevel?: CharacteristicValue;
24
- BatteryLevel?: CharacteristicValue;
25
- StatusLowBattery?: CharacteristicValue;
26
- lastActivation?: number;
26
+
27
+ // OpenAPI Status
28
+ OpenAPI_InMotion: deviceStatus['moving'];
29
+ OpenAPI_BatterLevel: deviceStatus['battery'];
30
+ OpenAPI_FirmwareRevision: deviceStatus['version'];
31
+ OpenAPI_CurrentPosition: deviceStatus['slidePosition'];
32
+ OpenAPI_CurrentAmbientLightLevel: deviceStatus['brightness'];
27
33
 
28
34
  // OpenAPI Others
29
- Version: deviceStatus['version'];
30
- Battery: deviceStatus['battery'];
31
- deviceStatus!: any; //deviceStatusResponse;
32
- slidePosition: deviceStatus['slidePosition'];
33
- moving: deviceStatus['moving'];
34
- brightness: deviceStatus['brightness'];
35
- setPositionMode?: string | number;
36
35
  Mode!: string;
36
+ setPositionMode?: string | number;
37
+
38
+ // BLE Status
39
+ BLE_Battery: serviceData['battery'];
40
+ BLE_InMotion: serviceData['inMotion'];
41
+ BLE_Calibration: serviceData['calibration'];
42
+ BLE_CurrentPosition: serviceData['position'];
43
+ BLE_CurrentAmbientLightLevel: serviceData['lightLevel'];
37
44
 
38
45
  // BLE Others
39
- connected?: boolean;
40
- switchbot!: switchbot;
41
- serviceData!: serviceData;
46
+ BLE_IsConnected?: boolean;
42
47
  spaceBetweenLevels!: number;
43
- address!: ad['address'];
44
- calibration: serviceData['calibration'];
45
- battery: serviceData['battery'];
46
- position: serviceData['position'];
47
- inMotion: serviceData['inMotion'];
48
- lightLevel: serviceData['lightLevel'];
49
48
 
50
49
  // Target
51
50
  setNewTarget!: boolean;
@@ -55,15 +54,15 @@ export class Curtain {
55
54
  mqttClient: MqttClient | null = null;
56
55
 
57
56
  // Config
58
- set_minStep!: number;
59
57
  updateRate!: number;
60
58
  set_minLux!: number;
61
59
  set_maxLux!: number;
60
+ set_minStep!: number;
61
+ setOpenMode!: string;
62
+ setCloseMode!: string;
62
63
  scanDuration!: number;
63
64
  deviceLogging!: string;
64
65
  deviceRefreshRate!: number;
65
- setCloseMode!: string;
66
- setOpenMode!: string;
67
66
 
68
67
  // Updates
69
68
  curtainUpdateInProgress!: boolean;
@@ -172,18 +171,12 @@ export class Curtain {
172
171
  }
173
172
 
174
173
  // Battery Service
175
- if (!this.batteryService) {
176
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Add Battery Service`);
177
- (this.batteryService = this.accessory.getService(this.platform.Service.Battery) || this.accessory.addService(this.platform.Service.Battery)),
178
- `${accessory.displayName} Battery`;
179
-
180
- this.batteryService.setCharacteristic(this.platform.Characteristic.Name, `${accessory.displayName} Battery`);
181
- if (!this.batteryService.testCharacteristic(this.platform.Characteristic.ConfiguredName)) {
182
- this.batteryService.addCharacteristic(this.platform.Characteristic.ConfiguredName, `${accessory.displayName} Battery`);
183
- }
184
- this.batteryService.setCharacteristic(this.platform.Characteristic.ChargingState, this.platform.Characteristic.ChargingState.NOT_CHARGEABLE);
185
- } else {
186
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Battery Service Not Added`);
174
+ (this.batteryService = this.accessory.getService(this.platform.Service.Battery) || accessory.addService(this.platform.Service.Battery)),
175
+ `${accessory.displayName} Battery`;
176
+
177
+ this.batteryService.setCharacteristic(this.platform.Characteristic.Name, `${accessory.displayName} Battery`);
178
+ if (!this.batteryService.testCharacteristic(this.platform.Characteristic.ConfiguredName)) {
179
+ this.batteryService.addCharacteristic(this.platform.Characteristic.ConfiguredName, `${accessory.displayName} Battery`);
187
180
  }
188
181
 
189
182
  // Update Homekit
@@ -314,7 +307,7 @@ export class Curtain {
314
307
  async BLEparseStatus(): Promise<void> {
315
308
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
316
309
  // CurrentPosition
317
- this.CurrentPosition = 100 - Number(this.position);
310
+ this.CurrentPosition = 100 - Number(this.BLE_CurrentPosition);
318
311
  await this.setMinMax();
319
312
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentPosition ${this.CurrentPosition}`);
320
313
  if (this.setNewTarget) {
@@ -353,45 +346,45 @@ export class Curtain {
353
346
  this.spaceBetweenLevels = 9;
354
347
 
355
348
  // Brightness
356
- switch (this.lightLevel) {
349
+ switch (this.BLE_CurrentAmbientLightLevel) {
357
350
  case 1:
358
351
  this.CurrentAmbientLightLevel = this.set_minLux;
359
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.lightLevel}`);
352
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
360
353
  break;
361
354
  case 2:
362
355
  this.CurrentAmbientLightLevel = (this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels;
363
356
  this.debugLog(
364
- `${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.lightLevel},` +
357
+ `${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel},` +
365
358
  ` Calculation: ${(this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels}`,
366
359
  );
367
360
  break;
368
361
  case 3:
369
362
  this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 2;
370
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.lightLevel}`);
363
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
371
364
  break;
372
365
  case 4:
373
366
  this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 3;
374
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.lightLevel}`);
367
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
375
368
  break;
376
369
  case 5:
377
370
  this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 4;
378
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.lightLevel}`);
371
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
379
372
  break;
380
373
  case 6:
381
374
  this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 5;
382
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.lightLevel}`);
375
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
383
376
  break;
384
377
  case 7:
385
378
  this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 6;
386
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.lightLevel}`);
379
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
387
380
  break;
388
381
  case 8:
389
382
  this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 7;
390
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.lightLevel}`);
383
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
391
384
  break;
392
385
  case 9:
393
386
  this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 8;
394
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.lightLevel}`);
387
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
395
388
  break;
396
389
  case 10:
397
390
  default:
@@ -399,12 +392,12 @@ export class Curtain {
399
392
  this.debugLog();
400
393
  }
401
394
  this.debugLog(
402
- `${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.lightLevel},` +
395
+ `${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel},` +
403
396
  ` CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`,
404
397
  );
405
398
  }
406
399
  // Battery
407
- this.BatteryLevel = Number(this.battery);
400
+ this.BatteryLevel = Number(this.BLE_Battery);
408
401
  if (this.BatteryLevel < 10) {
409
402
  this.StatusLowBattery = this.platform.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
410
403
  } else {
@@ -418,14 +411,14 @@ export class Curtain {
418
411
  async openAPIparseStatus(): Promise<void> {
419
412
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
420
413
  // CurrentPosition
421
- this.CurrentPosition = 100 - Number(this.slidePosition);
414
+ this.CurrentPosition = 100 - Number(this.OpenAPI_CurrentPosition);
422
415
  await this.setMinMax();
423
416
  this.debugLog(`Curtain ${this.accessory.displayName} CurrentPosition: ${this.CurrentPosition}`);
424
417
  if (this.setNewTarget) {
425
418
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Checking Status ...`);
426
419
  }
427
420
 
428
- if (this.setNewTarget && this.moving) {
421
+ if (this.setNewTarget && this.OpenAPI_InMotion) {
429
422
  await this.setMinMax();
430
423
  if (Number(this.TargetPosition) > this.CurrentPosition) {
431
424
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Closing, CurrentPosition: ${this.CurrentPosition} `);
@@ -458,7 +451,7 @@ export class Curtain {
458
451
  this.set_minLux = this.minLux();
459
452
  this.set_maxLux = this.maxLux();
460
453
  // Brightness
461
- switch (this.brightness) {
454
+ switch (this.OpenAPI_CurrentAmbientLightLevel) {
462
455
  case 'dim':
463
456
  this.CurrentAmbientLightLevel = this.set_minLux;
464
457
  break;
@@ -505,18 +498,16 @@ export class Curtain {
505
498
  })
506
499
  .then(async () => {
507
500
  // Set an event hander
508
- switchbot.onadvertisement = async (ad: any) => {
509
- this.address = ad.address;
501
+ switchbot.onadvertisement = async (ad: ad) => {
510
502
  this.debugLog(
511
503
  `${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
512
- ` BLE Address Found: ${this.address}`,
504
+ ` BLE Address Found: ${ad.address}`,
513
505
  );
514
- this.serviceData = ad.serviceData;
515
- this.calibration = ad.serviceData.calibration;
516
- this.battery = ad.serviceData.battery;
517
- this.inMotion = ad.serviceData.inMotion;
518
- this.position = ad.serviceData.position;
519
- this.lightLevel = ad.serviceData.lightLevel;
506
+ this.BLE_Calibration = ad.serviceData.calibration;
507
+ this.BLE_Battery = ad.serviceData.battery;
508
+ this.BLE_InMotion = ad.serviceData.inMotion;
509
+ this.BLE_CurrentPosition = ad.serviceData.position;
510
+ this.BLE_CurrentAmbientLightLevel = ad.serviceData.lightLevel;
520
511
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
521
512
  this.debugLog(
522
513
  `${this.device.deviceType}: ${this.accessory.displayName} calibration: ${ad.serviceData.calibration}, ` +
@@ -524,13 +515,13 @@ export class Curtain {
524
515
  `inMotion: ${ad.serviceData.inMotion}`,
525
516
  );
526
517
 
527
- if (this.serviceData) {
528
- this.connected = true;
529
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.connected}`);
518
+ if (ad.serviceData) {
519
+ this.BLE_IsConnected = true;
520
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
530
521
  await this.stopScanning(switchbot);
531
522
  } else {
532
- this.connected = false;
533
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.connected}`);
523
+ this.BLE_IsConnected = false;
524
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
534
525
  }
535
526
  };
536
527
  // Wait
@@ -564,11 +555,11 @@ export class Curtain {
564
555
  this.statusCode(statusCode);
565
556
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Headers: ${JSON.stringify(headers)}`);
566
557
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} refreshStatus: ${JSON.stringify(deviceStatus)}`);
567
- this.slidePosition = deviceStatus.body.slidePosition;
568
- this.moving = deviceStatus.body.moving;
569
- this.brightness = deviceStatus.body.brightness;
570
- this.Battery = deviceStatus.body.battery;
571
- this.Version = deviceStatus.body.version;
558
+ this.OpenAPI_CurrentPosition = deviceStatus.body.slidePosition;
559
+ this.OpenAPI_InMotion = deviceStatus.body.moving;
560
+ this.OpenAPI_CurrentAmbientLightLevel = deviceStatus.body.brightness;
561
+ this.OpenAPI_BatterLevel = deviceStatus.body.battery;
562
+ this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
572
563
  this.openAPIparseStatus();
573
564
  this.updateHomeKitCharacteristics();
574
565
  } catch (e: any) {
@@ -844,6 +835,16 @@ export class Curtain {
844
835
  this.batteryService?.updateCharacteristic(this.platform.Characteristic.StatusLowBattery, this.StatusLowBattery);
845
836
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic StatusLowBattery: ${this.StatusLowBattery}`);
846
837
  }
838
+ // FirmwareRevision
839
+ if (this.OpenAPI_FirmwareRevision === undefined) {
840
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} FirmwareRevision: ${this.OpenAPI_FirmwareRevision}`);
841
+ } else {
842
+ this.accessory.context.OpenAPI_FirmwareRevision = this.OpenAPI_FirmwareRevision;
843
+ this.accessory.getService(this.platform.Service.AccessoryInformation)!
844
+ .updateCharacteristic(this.platform.Characteristic.FirmwareRevision, this.OpenAPI_FirmwareRevision);
845
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} `
846
+ + `updateCharacteristic CurrentTemperature: ${this.OpenAPI_FirmwareRevision}`);
847
+ }
847
848
  }
848
849
 
849
850
  /*
@@ -880,7 +881,7 @@ export class Curtain {
880
881
 
881
882
  async stopScanning(switchbot: any) {
882
883
  await switchbot.stopScan();
883
- if (this.connected) {
884
+ if (this.BLE_IsConnected) {
884
885
  await this.BLEparseStatus();
885
886
  await this.updateHomeKitCharacteristics();
886
887
  } else {