@switchbot/homebridge-switchbot 3.5.0-beta.6 → 3.5.0-beta.60

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 (177) hide show
  1. package/.vscode/settings.json +4 -1
  2. package/CHANGELOG.md +4 -1
  3. package/config.schema.json +120 -17
  4. package/dist/device/blindtilt.d.ts +23 -96
  5. package/dist/device/blindtilt.d.ts.map +1 -1
  6. package/dist/device/blindtilt.js +408 -779
  7. package/dist/device/blindtilt.js.map +1 -1
  8. package/dist/device/bot.d.ts +26 -72
  9. package/dist/device/bot.d.ts.map +1 -1
  10. package/dist/device/bot.js +696 -822
  11. package/dist/device/bot.js.map +1 -1
  12. package/dist/device/ceilinglight.d.ts +14 -68
  13. package/dist/device/ceilinglight.d.ts.map +1 -1
  14. package/dist/device/ceilinglight.js +237 -606
  15. package/dist/device/ceilinglight.js.map +1 -1
  16. package/dist/device/colorbulb.d.ts +14 -75
  17. package/dist/device/colorbulb.d.ts.map +1 -1
  18. package/dist/device/colorbulb.js +279 -658
  19. package/dist/device/colorbulb.js.map +1 -1
  20. package/dist/device/contact.d.ts +15 -66
  21. package/dist/device/contact.d.ts.map +1 -1
  22. package/dist/device/contact.js +242 -544
  23. package/dist/device/contact.js.map +1 -1
  24. package/dist/device/curtain.d.ts +19 -88
  25. package/dist/device/curtain.d.ts.map +1 -1
  26. package/dist/device/curtain.js +402 -805
  27. package/dist/device/curtain.js.map +1 -1
  28. package/dist/device/device.d.ts +59 -0
  29. package/dist/device/device.d.ts.map +1 -0
  30. package/dist/device/device.js +684 -0
  31. package/dist/device/device.js.map +1 -0
  32. package/dist/device/fan.d.ts +51 -0
  33. package/dist/device/fan.d.ts.map +1 -0
  34. package/dist/device/fan.js +535 -0
  35. package/dist/device/fan.js.map +1 -0
  36. package/dist/device/hub.d.ts +16 -60
  37. package/dist/device/hub.d.ts.map +1 -1
  38. package/dist/device/hub.js +246 -613
  39. package/dist/device/hub.js.map +1 -1
  40. package/dist/device/humidifier.d.ts +11 -66
  41. package/dist/device/humidifier.d.ts.map +1 -1
  42. package/dist/device/humidifier.js +232 -593
  43. package/dist/device/humidifier.js.map +1 -1
  44. package/dist/device/iosensor.d.ts +11 -64
  45. package/dist/device/iosensor.d.ts.map +1 -1
  46. package/dist/device/iosensor.js +185 -600
  47. package/dist/device/iosensor.js.map +1 -1
  48. package/dist/device/lightstrip.d.ts +11 -69
  49. package/dist/device/lightstrip.d.ts.map +1 -1
  50. package/dist/device/lightstrip.js +277 -586
  51. package/dist/device/lightstrip.js.map +1 -1
  52. package/dist/device/lock.d.ts +16 -63
  53. package/dist/device/lock.d.ts.map +1 -1
  54. package/dist/device/lock.js +241 -560
  55. package/dist/device/lock.js.map +1 -1
  56. package/dist/device/meter.d.ts +14 -64
  57. package/dist/device/meter.d.ts.map +1 -1
  58. package/dist/device/meter.js +181 -593
  59. package/dist/device/meter.js.map +1 -1
  60. package/dist/device/meterplus.d.ts +14 -65
  61. package/dist/device/meterplus.d.ts.map +1 -1
  62. package/dist/device/meterplus.js +170 -593
  63. package/dist/device/meterplus.js.map +1 -1
  64. package/dist/device/motion.d.ts +13 -69
  65. package/dist/device/motion.d.ts.map +1 -1
  66. package/dist/device/motion.js +178 -531
  67. package/dist/device/motion.js.map +1 -1
  68. package/dist/device/plug.d.ts +9 -57
  69. package/dist/device/plug.d.ts.map +1 -1
  70. package/dist/device/plug.js +92 -458
  71. package/dist/device/plug.js.map +1 -1
  72. package/dist/device/robotvacuumcleaner.d.ts +12 -63
  73. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  74. package/dist/device/robotvacuumcleaner.js +197 -521
  75. package/dist/device/robotvacuumcleaner.js.map +1 -1
  76. package/dist/device/waterdetector.d.ts +10 -65
  77. package/dist/device/waterdetector.d.ts.map +1 -1
  78. package/dist/device/waterdetector.js +139 -495
  79. package/dist/device/waterdetector.js.map +1 -1
  80. package/dist/homebridge-ui/public/index.html +22 -16
  81. package/dist/homebridge-ui/server.js +1 -1
  82. package/dist/homebridge-ui/server.js.map +1 -1
  83. package/dist/index.d.ts +1 -1
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +2 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/irdevice/airconditioner.d.ts +9 -49
  88. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  89. package/dist/irdevice/airconditioner.js +309 -419
  90. package/dist/irdevice/airconditioner.js.map +1 -1
  91. package/dist/irdevice/airpurifier.d.ts +8 -39
  92. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  93. package/dist/irdevice/airpurifier.js +72 -304
  94. package/dist/irdevice/airpurifier.js.map +1 -1
  95. package/dist/irdevice/camera.d.ts +7 -36
  96. package/dist/irdevice/camera.d.ts.map +1 -1
  97. package/dist/irdevice/camera.js +34 -278
  98. package/dist/irdevice/camera.js.map +1 -1
  99. package/dist/irdevice/fan.d.ts +10 -43
  100. package/dist/irdevice/fan.d.ts.map +1 -1
  101. package/dist/irdevice/fan.js +100 -338
  102. package/dist/irdevice/fan.js.map +1 -1
  103. package/dist/irdevice/irdevice.d.ts +40 -0
  104. package/dist/irdevice/irdevice.d.ts.map +1 -0
  105. package/dist/irdevice/irdevice.js +330 -0
  106. package/dist/irdevice/irdevice.js.map +1 -0
  107. package/dist/irdevice/light.d.ts +12 -45
  108. package/dist/irdevice/light.d.ts.map +1 -1
  109. package/dist/irdevice/light.js +87 -357
  110. package/dist/irdevice/light.js.map +1 -1
  111. package/dist/irdevice/other.d.ts +19 -48
  112. package/dist/irdevice/other.d.ts.map +1 -1
  113. package/dist/irdevice/other.js +352 -546
  114. package/dist/irdevice/other.js.map +1 -1
  115. package/dist/irdevice/tv.d.ts +8 -40
  116. package/dist/irdevice/tv.d.ts.map +1 -1
  117. package/dist/irdevice/tv.js +82 -321
  118. package/dist/irdevice/tv.js.map +1 -1
  119. package/dist/irdevice/vacuumcleaner.d.ts +7 -36
  120. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  121. package/dist/irdevice/vacuumcleaner.js +41 -284
  122. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  123. package/dist/irdevice/waterheater.d.ts +7 -36
  124. package/dist/irdevice/waterheater.d.ts.map +1 -1
  125. package/dist/irdevice/waterheater.js +42 -287
  126. package/dist/irdevice/waterheater.js.map +1 -1
  127. package/dist/platform.d.ts +19 -6
  128. package/dist/platform.d.ts.map +1 -1
  129. package/dist/platform.js +310 -169
  130. package/dist/platform.js.map +1 -1
  131. package/dist/settings.d.ts +62 -19
  132. package/dist/settings.d.ts.map +1 -1
  133. package/dist/settings.js +16 -552
  134. package/dist/settings.js.map +1 -1
  135. package/dist/utils.d.ts +77 -0
  136. package/dist/utils.d.ts.map +1 -1
  137. package/dist/utils.js +638 -1
  138. package/dist/utils.js.map +1 -1
  139. package/eslint.config.js +96 -0
  140. package/package.json +19 -15
  141. package/src/custom.d.ts +2 -1
  142. package/src/device/blindtilt.ts +442 -814
  143. package/src/device/bot.ts +754 -915
  144. package/src/device/ceilinglight.ts +255 -633
  145. package/src/device/colorbulb.ts +294 -685
  146. package/src/device/contact.ts +277 -571
  147. package/src/device/curtain.ts +431 -835
  148. package/src/device/device.ts +709 -0
  149. package/src/device/fan.ts +591 -0
  150. package/src/device/hub.ts +286 -644
  151. package/src/device/humidifier.ts +266 -646
  152. package/src/device/iosensor.ts +220 -625
  153. package/src/device/lightstrip.ts +305 -620
  154. package/src/device/lock.ts +280 -600
  155. package/src/device/meter.ts +216 -617
  156. package/src/device/meterplus.ts +205 -619
  157. package/src/device/motion.ts +206 -556
  158. package/src/device/plug.ts +107 -490
  159. package/src/device/robotvacuumcleaner.ts +223 -550
  160. package/src/device/waterdetector.ts +160 -519
  161. package/src/homebridge-ui/public/index.html +22 -16
  162. package/src/homebridge-ui/server.ts +1 -1
  163. package/src/index.ts +4 -3
  164. package/src/irdevice/airconditioner.ts +333 -447
  165. package/src/irdevice/airpurifier.ts +92 -322
  166. package/src/irdevice/camera.ts +45 -294
  167. package/src/irdevice/fan.ts +115 -353
  168. package/src/irdevice/irdevice.ts +346 -0
  169. package/src/irdevice/light.ts +110 -385
  170. package/src/irdevice/other.ts +399 -616
  171. package/src/irdevice/tv.ts +103 -340
  172. package/src/irdevice/vacuumcleaner.ts +52 -306
  173. package/src/irdevice/waterheater.ts +53 -311
  174. package/src/platform.ts +355 -216
  175. package/src/settings.ts +116 -611
  176. package/src/utils.ts +642 -1
  177. package/src/device/waterdetector.json +0 -11
@@ -1,165 +1,146 @@
1
- import { request } from 'undici';
2
- import { sleep } from '../utils.js';
1
+ /* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * contact.ts: @switchbot/homebridge-switchbot.
4
+ */
5
+ import { deviceBase } from './device.js';
3
6
  import { interval, Subject } from 'rxjs';
4
- import { skipWhile } from 'rxjs/operators';
5
7
  import { Devices } from '../settings.js';
8
+ import { skipWhile } from 'rxjs/operators';
6
9
  /**
7
10
  * Platform Accessory
8
11
  * An instance of this class is created for each accessory your platform registers
9
12
  * Each accessory may expose multiple services of different service types.
10
13
  */
11
- export class Contact {
14
+ export class Contact extends deviceBase {
12
15
  platform;
13
- accessory;
14
- device;
15
- api;
16
- log;
17
- config;
18
- hap;
19
16
  // Services
20
- motionService;
21
- batteryService;
22
- lightSensorService;
23
- contactSensorservice;
24
- // Characteristic Values
25
- BatteryLevel;
26
- MotionDetected;
27
- StatusLowBattery;
28
- FirmwareRevision;
29
- ContactSensorState;
30
- CurrentAmbientLightLevel;
31
- // OpenAPI Status
32
- OpenAPI_BatteryLevel;
33
- OpenAPI_FirmwareRevision;
34
- OpenAPI_MotionDetected;
35
- OpenAPI_ContactSensorState;
36
- OpenAPI_CurrentAmbientLightLevel;
37
- // BLE Status
38
- BLE_BatteryLevel;
39
- BLE_MotionDetected;
40
- BLE_ContactSensorState;
41
- BLE_CurrentAmbientLightLevel;
42
- // BLE Others
43
- scanning;
44
- BLE_IsConnected;
45
- // Config
46
- set_minLux;
47
- set_maxLux;
48
- scanDuration;
49
- deviceLogging;
50
- deviceRefreshRate;
17
+ ContactSensor;
18
+ Battery;
19
+ MotionSensor;
20
+ LightSensor;
51
21
  // Updates
52
- contactUbpdateInProgress;
22
+ contactUpdateInProgress;
53
23
  doContactUpdate;
54
- // Connection
55
- OpenAPI;
56
- BLE;
57
24
  constructor(platform, accessory, device) {
25
+ super(platform, accessory, device);
58
26
  this.platform = platform;
59
- this.accessory = accessory;
60
- this.device = device;
61
- this.api = this.platform.api;
62
- this.log = this.platform.log;
63
- this.config = this.platform.config;
64
- this.hap = this.api.hap;
65
- // Connection
66
- this.BLE = this.device.connectionType === 'BLE' || this.device.connectionType === 'BLE/OpenAPI';
67
- this.OpenAPI = this.device.connectionType === 'OpenAPI' || this.device.connectionType === 'BLE/OpenAPI';
68
- // default placeholders
69
- this.deviceLogs(device);
70
- this.scan(device);
71
- this.refreshRate(device);
72
- this.deviceContext();
73
- this.deviceConfig(device);
74
27
  // this is subject we use to track when we need to POST changes to the SwitchBot API
75
28
  this.doContactUpdate = new Subject();
76
- this.contactUbpdateInProgress = false;
77
- // Retrieve initial values and updateHomekit
78
- this.refreshStatus();
79
- // set accessory information
80
- accessory
81
- .getService(this.hap.Service.AccessoryInformation)
82
- .setCharacteristic(this.hap.Characteristic.Manufacturer, 'SwitchBot')
83
- .setCharacteristic(this.hap.Characteristic.Model, 'W1201500')
84
- .setCharacteristic(this.hap.Characteristic.SerialNumber, device.deviceId)
85
- .setCharacteristic(this.hap.Characteristic.FirmwareRevision, accessory.context.FirmwareRevision);
86
- // get the Contact service if it exists, otherwise create a new Contact service
87
- // you can create multiple services for each accessory
88
- const contactSensorservice = `${accessory.displayName} Contact Sensor`;
89
- (this.contactSensorservice = accessory.getService(this.hap.Service.ContactSensor)
90
- || accessory.addService(this.hap.Service.ContactSensor)), contactSensorservice;
91
- this.contactSensorservice.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
92
- if (!this.contactSensorservice.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
93
- this.contactSensorservice.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
94
- }
95
- // Motion Sensor Service
96
- if (device.contact?.hide_motionsensor) {
97
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Motion Sensor Service`);
98
- this.motionService = this.accessory.getService(this.hap.Service.MotionSensor);
99
- accessory.removeService(this.motionService);
100
- }
101
- else if (!this.motionService) {
102
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Add Motion Sensor Service`);
103
- const motionService = `${accessory.displayName} Motion Sensor`;
104
- (this.motionService = this.accessory.getService(this.hap.Service.MotionSensor)
105
- || this.accessory.addService(this.hap.Service.MotionSensor)), motionService;
106
- this.motionService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Motion Sensor`);
107
- this.motionService.setCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Motion Sensor`);
29
+ this.contactUpdateInProgress = false;
30
+ // Initialize Contact Sensor property
31
+ this.ContactSensor = {
32
+ Name: accessory.context.ContactSensorName ?? accessory.displayName,
33
+ Service: accessory.getService(this.hap.Service.ContactSensor) ?? accessory.addService(this.hap.Service.ContactSensor),
34
+ ContactSensorState: accessory.context.ContactSensorState ?? this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED,
35
+ };
36
+ // Initialize ContactSensor Characteristics
37
+ this.ContactSensor.Service
38
+ .setCharacteristic(this.hap.Characteristic.Name, this.ContactSensor.Name)
39
+ .setCharacteristic(this.hap.Characteristic.StatusActive, true)
40
+ .getCharacteristic(this.hap.Characteristic.ContactSensorState)
41
+ .onGet(() => {
42
+ return this.ContactSensor.ContactSensorState;
43
+ });
44
+ accessory.context.ContactSensorName = this.ContactSensor.Name;
45
+ // Initialize Battery property
46
+ this.Battery = {
47
+ Name: accessory.context.BatteryName ?? `${accessory.displayName} Battery`,
48
+ Service: accessory.getService(this.hap.Service.Battery) ?? accessory.addService(this.hap.Service.Battery),
49
+ BatteryLevel: accessory.context.BatteryLevel ?? 100,
50
+ StatusLowBattery: accessory.context.StatusLowBattery ?? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL,
51
+ };
52
+ // Initialize Battery Characteristics
53
+ this.Battery.Service
54
+ .setCharacteristic(this.hap.Characteristic.Name, this.Battery.Name)
55
+ .setCharacteristic(this.hap.Characteristic.ChargingState, this.hap.Characteristic.ChargingState.NOT_CHARGEABLE)
56
+ .getCharacteristic(this.hap.Characteristic.BatteryLevel)
57
+ .onGet(() => {
58
+ return this.Battery.BatteryLevel;
59
+ });
60
+ this.Battery.Service
61
+ .setCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery)
62
+ .getCharacteristic(this.hap.Characteristic.StatusLowBattery)
63
+ .onGet(() => {
64
+ return this.Battery.StatusLowBattery;
65
+ });
66
+ accessory.context.BatteryName = this.Battery.Name;
67
+ // Initialize Motion Sensor Service
68
+ if (this.device.contact?.hide_motionsensor) {
69
+ this.debugLog(`${device.deviceType}: ${accessory.displayName} Removing Motion Sensor Service`);
70
+ this.MotionSensor.Service = accessory.getService(this.hap.Service.MotionSensor);
71
+ accessory.removeService(this.MotionSensor.Service);
108
72
  }
109
73
  else {
110
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Motion Sensor Service Not Added`);
74
+ this.MotionSensor = {
75
+ Name: accessory.context.MotionSensorName ?? `${accessory.displayName} Motion Sensor`,
76
+ Service: accessory.getService(this.hap.Service.MotionSensor) ?? accessory.addService(this.hap.Service.MotionSensor),
77
+ MotionDetected: accessory.context.MotionDetected ?? false,
78
+ };
79
+ // Motion Sensor Characteristics
80
+ this.MotionSensor.Service
81
+ .setCharacteristic(this.hap.Characteristic.Name, this.MotionSensor.Name)
82
+ .setCharacteristic(this.hap.Characteristic.StatusActive, true)
83
+ .getCharacteristic(this.hap.Characteristic.MotionDetected)
84
+ .onGet(() => {
85
+ return this.MotionSensor.MotionDetected;
86
+ });
87
+ accessory.context.MotionSensorName = this.MotionSensor.Name;
111
88
  }
112
- // Light Sensor Service
89
+ // Initialize Light Sensor Service
113
90
  if (device.contact?.hide_lightsensor) {
114
91
  this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Light Sensor Service`);
115
- this.lightSensorService = this.accessory.getService(this.hap.Service.LightSensor);
116
- accessory.removeService(this.lightSensorService);
117
- }
118
- else if (!this.lightSensorService) {
119
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Add Light Sensor Service`);
120
- const lightSensorService = `${accessory.displayName} Light Sensor`;
121
- (this.lightSensorService = this.accessory.getService(this.hap.Service.LightSensor)
122
- || this.accessory.addService(this.hap.Service.LightSensor)), lightSensorService;
123
- this.lightSensorService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Light Sensor`);
124
- this.lightSensorService.setCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Light Sensor`);
92
+ this.LightSensor.Service = accessory.getService(this.hap.Service.LightSensor);
93
+ accessory.removeService(this.LightSensor.Service);
125
94
  }
126
95
  else {
127
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Light Sensor Service Not Added`);
128
- }
129
- // Battery Service
130
- const batteryService = `${accessory.displayName} Battery`;
131
- (this.batteryService = this.accessory.getService(this.hap.Service.Battery)
132
- || accessory.addService(this.hap.Service.Battery)), batteryService;
133
- this.batteryService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Battery`);
134
- if (!this.batteryService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
135
- this.batteryService.addCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Battery`);
96
+ this.LightSensor = {
97
+ Name: accessory.context.LightSensorName ?? `${accessory.displayName} Light Sensor`,
98
+ Service: accessory.getService(this.hap.Service.LightSensor) ?? accessory.addService(this.hap.Service.LightSensor),
99
+ CurrentAmbientLightLevel: accessory.context.CurrentAmbientLightLevel ?? 0.0001,
100
+ };
101
+ // Light Sensor Characteristics
102
+ this.LightSensor.Service
103
+ .setCharacteristic(this.hap.Characteristic.Name, this.LightSensor.Name)
104
+ .setCharacteristic(this.hap.Characteristic.StatusActive, true)
105
+ .getCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel)
106
+ .onGet(() => {
107
+ return this.LightSensor.CurrentAmbientLightLevel;
108
+ });
109
+ accessory.context.LightSensorName = this.LightSensor.Name;
136
110
  }
137
- this.batteryService.setCharacteristic(this.hap.Characteristic.ChargingState, this.hap.Characteristic.ChargingState.NOT_CHARGEABLE);
111
+ // Retrieve initial values and updateHomekit
112
+ this.refreshStatus();
138
113
  // Retrieve initial values and updateHomekit
139
114
  this.updateHomeKitCharacteristics();
140
115
  // Start an update interval
141
116
  interval(this.deviceRefreshRate * 1000)
142
- .pipe(skipWhile(() => this.contactUbpdateInProgress))
117
+ .pipe(skipWhile(() => this.contactUpdateInProgress))
143
118
  .subscribe(async () => {
144
119
  await this.refreshStatus();
145
120
  });
146
121
  //regisiter webhook event handler
147
- if (this.device.webhook) {
148
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
122
+ if (device.webhook) {
123
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
149
124
  this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
150
125
  try {
151
126
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
152
127
  const { detectionState, brightness, openState } = context;
153
- const { MotionDetected, CurrentAmbientLightLevel, ContactSensorState } = this;
128
+ const { ContactSensorState } = this.ContactSensor;
129
+ const { CurrentAmbientLightLevel } = this.LightSensor ?? {};
130
+ const { MotionDetected } = this.MotionSensor ?? {};
154
131
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
155
132
  '(detectionState, brightness, openState) = ' +
156
133
  `Webhook:(${detectionState}, ${brightness}, ${openState}), ` +
157
134
  `current:(${MotionDetected}, ${CurrentAmbientLightLevel}, ${ContactSensorState})`);
158
- this.set_minLux = this.minLux();
159
- this.set_maxLux = this.maxLux();
160
- this.MotionDetected = detectionState === 'DETECTED' ? true : false;
161
- this.CurrentAmbientLightLevel = brightness === 'bright' ? this.set_maxLux : this.set_minLux;
162
- this.ContactSensorState = openState === 'open' ? 1 : 0;
135
+ const set_minLux = await this.minLux();
136
+ const set_maxLux = await this.maxLux();
137
+ this.ContactSensor.ContactSensorState = openState === 'open' ? 1 : 0;
138
+ if (!this.device.contact?.hide_motionsensor) {
139
+ this.MotionSensor.MotionDetected = detectionState === 'DETECTED' ? true : false;
140
+ }
141
+ if (!this.device.contact?.hide_lightsensor) {
142
+ this.LightSensor.CurrentAmbientLightLevel = brightness === 'bright' ? set_maxLux : set_minLux;
143
+ }
163
144
  this.updateHomeKitCharacteristics();
164
145
  }
165
146
  catch (e) {
@@ -169,130 +150,124 @@ export class Contact {
169
150
  };
170
151
  }
171
152
  }
172
- /**
173
- * Parse the device status from the SwitchBot api
174
- */
175
- async parseStatus() {
176
- if (!this.device.enableCloudService && this.OpenAPI) {
177
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} parseStatus enableCloudService: ${this.device.enableCloudService}`);
178
- }
179
- else if (this.BLE) {
180
- await this.BLEparseStatus();
181
- }
182
- else if (this.OpenAPI && this.platform.config.credentials?.token) {
183
- await this.openAPIparseStatus();
184
- }
185
- else {
186
- await this.offlineOff();
187
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`);
188
- }
189
- }
190
- async BLEparseStatus() {
153
+ async BLEparseStatus(serviceData) {
191
154
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
192
155
  // Door State
193
- switch (this.BLE_ContactSensorState) {
156
+ switch (serviceData.doorState) {
194
157
  case 'open':
195
158
  case 1:
196
- this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
159
+ this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
197
160
  break;
198
161
  case 'close':
199
162
  case 0:
200
- this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
163
+ this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
201
164
  break;
202
165
  default:
203
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} timeout no closed, doorstate: ${this.BLE_ContactSensorState}`);
166
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} timeout no closed, doorstate: ${serviceData.doorState}`);
204
167
  }
205
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
206
- if (this.ContactSensorState !== this.accessory.context.ContactSensorState &&
168
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
169
+ if (this.ContactSensor.ContactSensorState !== this.accessory.context.ContactSensorState &&
207
170
  this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED) {
208
171
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Opened`);
209
172
  }
210
173
  // Movement
211
174
  if (!this.device.contact?.hide_motionsensor) {
212
- this.MotionDetected = Boolean(this.BLE_MotionDetected);
213
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionDetected}`);
214
- if (this.MotionDetected !== this.accessory.context.MotionDetected && this.MotionDetected) {
175
+ this.MotionSensor.MotionDetected = Boolean(serviceData.movement);
176
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionSensor.MotionDetected}`);
177
+ if (this.MotionSensor.MotionDetected !== this.accessory.context.MotionDetected && this.MotionSensor.MotionDetected) {
215
178
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Detected Motion`);
216
179
  }
217
180
  }
218
181
  // Light Level
219
182
  if (!this.device.contact?.hide_lightsensor) {
220
- this.set_minLux = this.minLux();
221
- this.set_maxLux = this.maxLux();
222
- switch (this.BLE_CurrentAmbientLightLevel) {
183
+ const set_minLux = await this.minLux();
184
+ const set_maxLux = await this.maxLux();
185
+ switch (serviceData.lightLevel) {
223
186
  case true:
224
- this.CurrentAmbientLightLevel = this.set_minLux;
187
+ this.LightSensor.CurrentAmbientLightLevel = set_minLux;
225
188
  break;
226
189
  default:
227
- this.CurrentAmbientLightLevel = this.set_maxLux;
190
+ this.LightSensor.CurrentAmbientLightLevel = set_maxLux;
228
191
  }
229
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel},` +
230
- ` CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
231
- if (this.CurrentAmbientLightLevel !== this.accessory.context.CurrentAmbientLightLevel) {
232
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
192
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel},` +
193
+ ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
194
+ if (this.LightSensor.CurrentAmbientLightLevel !== this.accessory.context.CurrentAmbientLightLevel) {
195
+ this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName}`
196
+ + ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
233
197
  }
234
198
  }
235
199
  // Battery
236
- if (this.BLE_BatteryLevel === undefined) {
237
- this.BLE_BatteryLevel === 100;
200
+ if (serviceData.battery === undefined) {
201
+ serviceData.battery === 100;
238
202
  }
239
- this.BatteryLevel = Number(this.BLE_BatteryLevel);
240
- if (this.BatteryLevel < 10) {
241
- this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
203
+ this.Battery.BatteryLevel = Number(serviceData.battery);
204
+ if (this.Battery.BatteryLevel < 10) {
205
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
242
206
  }
243
207
  else {
244
- this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
208
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
245
209
  }
246
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}, ` + `StatusLowBattery: ${this.StatusLowBattery}`);
210
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}, `
211
+ + `StatusLowBattery: ${this.Battery.StatusLowBattery}`);
247
212
  }
248
- async openAPIparseStatus() {
213
+ async openAPIparseStatus(deviceStatus) {
249
214
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
250
215
  // Contact State
251
- if (this.OpenAPI_ContactSensorState === 'open') {
252
- this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
253
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
216
+ if (deviceStatus.body.openState === 'open') {
217
+ this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
218
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
254
219
  }
255
- else if (this.OpenAPI_ContactSensorState === 'close') {
256
- this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
257
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
220
+ else if (deviceStatus.body.openState === 'close') {
221
+ this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
222
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
258
223
  }
259
224
  else {
260
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openState: ${this.OpenAPI_ContactSensorState}`);
225
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openState: ${deviceStatus.body.openState}`);
261
226
  }
262
227
  // Motion State
263
228
  if (!this.device.contact?.hide_motionsensor) {
264
- this.MotionDetected = this.OpenAPI_MotionDetected;
265
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionDetected}`);
229
+ this.MotionSensor.MotionDetected = deviceStatus.body.moveDetected;
230
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionSensor.MotionDetected}`);
266
231
  }
267
232
  // Light Level
268
233
  if (!this.device.contact?.hide_lightsensor) {
269
- this.set_minLux = this.minLux();
270
- this.set_maxLux = this.maxLux();
271
- switch (this.OpenAPI_CurrentAmbientLightLevel) {
234
+ const set_minLux = await this.minLux();
235
+ const set_maxLux = await this.maxLux();
236
+ switch (deviceStatus.body.brightness) {
272
237
  case 'dim':
273
- this.CurrentAmbientLightLevel = this.set_minLux;
238
+ this.LightSensor.CurrentAmbientLightLevel = set_minLux;
274
239
  break;
275
240
  case 'bright':
276
241
  default:
277
- this.CurrentAmbientLightLevel = this.set_maxLux;
242
+ this.LightSensor.CurrentAmbientLightLevel = set_maxLux;
278
243
  }
279
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
244
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
245
+ + ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
280
246
  }
281
247
  // Battery
282
- if (this.OpenAPI_BatteryLevel === undefined) {
283
- this.OpenAPI_BatteryLevel === 100;
248
+ if (deviceStatus.body.battery === undefined) {
249
+ deviceStatus.body.battery === 100;
284
250
  }
285
- this.BatteryLevel = Number(this.OpenAPI_BatteryLevel);
286
- if (this.BatteryLevel < 10) {
287
- this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
251
+ this.Battery.BatteryLevel = Number(deviceStatus.body.battery);
252
+ if (this.Battery.BatteryLevel < 10) {
253
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
288
254
  }
289
255
  else {
290
- this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
256
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
257
+ }
258
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}, `
259
+ + `StatusLowBattery: ${this.Battery.StatusLowBattery}`);
260
+ // Firmware Version
261
+ const version = deviceStatus.body.version?.toString();
262
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
263
+ if (deviceStatus.body.version) {
264
+ this.accessory.context.version = version?.replace(/^V|-.*$/g, '');
265
+ this.accessory
266
+ .getService(this.hap.Service.AccessoryInformation)
267
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
268
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
269
+ .updateValue(this.accessory.context.version);
291
270
  }
292
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}, ` + `StatusLowBattery: ${this.StatusLowBattery}`);
293
- // FirmwareRevision
294
- this.FirmwareRevision = this.OpenAPI_FirmwareRevision;
295
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
296
271
  }
297
272
  /**
298
273
  * Asks the SwitchBot API for the latest device information
@@ -317,120 +292,59 @@ export class Contact {
317
292
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLERefreshStatus`);
318
293
  const switchbot = await this.platform.connectBLE();
319
294
  // Convert to BLE Address
320
- this.device.bleMac =
321
- this.device.customBLEaddress ||
322
- this.device
323
- .deviceId.match(/.{1,2}/g)
324
- .join(':')
325
- .toLowerCase();
295
+ this.device.bleMac = this.device
296
+ .deviceId.match(/.{1,2}/g)
297
+ .join(':')
298
+ .toLowerCase();
326
299
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLE Address: ${this.device.bleMac}`);
327
300
  this.getCustomBLEAddress(switchbot);
328
301
  // Start to monitor advertisement packets
329
302
  (async () => {
330
- await switchbot.startScan({
331
- model: 'd',
332
- id: this.device.bleMac,
333
- });
303
+ // Start to monitor advertisement packets
304
+ await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
334
305
  // Set an event handler
335
306
  switchbot.onadvertisement = (ad) => {
336
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
337
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.serviceData.model}`);
338
- if (this.device.bleMac === ad.address && ad.serviceData.model === 'd') {
307
+ if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
308
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
309
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
339
310
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
340
- this.BLE_MotionDetected = ad.serviceData.movement;
341
- this.BLE_BatteryLevel = ad.serviceData.battery;
342
- this.BLE_CurrentAmbientLightLevel = ad.serviceData.lightLevel;
343
311
  }
344
312
  else {
345
313
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
346
314
  }
347
315
  };
348
- // Wait 1 seconds
316
+ // Wait 10 seconds
349
317
  await switchbot.wait(this.scanDuration * 1000);
350
318
  // Stop to monitor
351
319
  await switchbot.stopScan();
352
320
  // Update HomeKit
353
- await this.BLEparseStatus();
321
+ await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
354
322
  await this.updateHomeKitCharacteristics();
355
323
  })();
356
- /*if (switchbot !== false) {
357
- await switchbot
358
- .startScan({
359
- model: 'd',
360
- id: this.device.bleMac,
361
- })
362
- .then(async () => {
363
- // Set an event handler
364
- this.scanning = true;
365
- switchbot.onadvertisement = async (ad: ad) => {
366
- this.debugLog(
367
- `${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
368
- ` BLE Address Found: ${ad.address}`,
369
- );
370
- this.BLE_MotionDetected = ad.serviceData.movement;
371
- this.BLE_BatteryLevel = ad.serviceData.battery;
372
- this.BLE_ContactSensorState = ad.serviceData.doorState;
373
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
374
- this.debugLog(
375
- `${this.device.deviceType}: ${this.accessory.displayName} movement: ${ad.serviceData.movement}, doorState: ` +
376
- `${ad.serviceData.doorState}, battery: ${ad.serviceData.battery}`,
377
- );
378
-
379
- if (ad.serviceData) {
380
- this.BLE_IsConnected = true;
381
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
382
- await this.stopScanning(switchbot);
383
- this.scanning = false;
384
- } else {
385
- this.BLE_IsConnected = false;
386
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
387
- }
388
- };
389
- // Wait
390
- return await sleep(this.scanDuration * 1000);
391
- })
392
- .then(async () => {
393
- // Stop to monitor
394
- if (this.scanning) {
395
- await this.stopScanning(switchbot);
396
- }
397
- })
398
- .catch(async (e: any) => {
399
- this.apiError(e);
400
- this.errorLog(
401
- `${this.device.deviceType}: ${this.accessory.displayName} failed BLERefreshStatus with ${this.device.connectionType}` +
402
- ` Connection, Error Message: ${JSON.stringify(e.message)}`,
403
- );
404
- await this.BLERefreshConnection(switchbot);
405
- });
406
- } else {
407
- await this.BLERefreshConnection(switchbot);
408
- }*/
324
+ if (switchbot === undefined) {
325
+ await this.BLERefreshConnection(switchbot);
326
+ }
409
327
  }
410
328
  async openAPIRefreshStatus() {
411
329
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
412
330
  try {
413
- const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/status`, {
414
- headers: this.platform.generateHeaders(),
415
- });
331
+ const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
416
332
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
417
333
  const deviceStatus = await body.json();
418
334
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
419
335
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
420
336
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
421
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
337
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
422
338
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
423
- this.OpenAPI_ContactSensorState = deviceStatus.body.openState;
424
- this.OpenAPI_MotionDetected = deviceStatus.body.moveDetected;
425
- this.OpenAPI_CurrentAmbientLightLevel = deviceStatus.body.brightness;
426
- this.OpenAPI_BatteryLevel = deviceStatus.body.battery;
427
- this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
428
- this.openAPIparseStatus();
339
+ this.openAPIparseStatus(deviceStatus);
429
340
  this.updateHomeKitCharacteristics();
430
341
  }
431
342
  else {
432
343
  this.statusCode(statusCode);
433
344
  this.statusCode(deviceStatus.statusCode);
345
+ if (deviceStatus.statusCode === 161 || deviceStatus.statusCode === 171) {
346
+ this.offlineOff();
347
+ }
434
348
  }
435
349
  }
436
350
  catch (e) {
@@ -443,77 +357,54 @@ export class Contact {
443
357
  * Updates the status for each of the HomeKit Characteristics
444
358
  */
445
359
  async updateHomeKitCharacteristics() {
446
- if (this.ContactSensorState === undefined) {
447
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
360
+ if (this.ContactSensor.ContactSensorState === undefined) {
361
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
448
362
  }
449
363
  else {
450
- this.accessory.context.ContactSensorState = this.ContactSensorState;
451
- this.contactSensorservice.updateCharacteristic(this.hap.Characteristic.ContactSensorState, this.ContactSensorState);
452
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic ContactSensorState: ${this.ContactSensorState}`);
364
+ this.accessory.context.ContactSensorState = this.ContactSensor.ContactSensorState;
365
+ this.ContactSensor.Service.updateCharacteristic(this.hap.Characteristic.ContactSensorState, this.ContactSensor.ContactSensorState);
366
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
367
+ + ` ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
453
368
  }
454
369
  if (!this.device.contact?.hide_motionsensor) {
455
- if (this.MotionDetected === undefined) {
456
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionDetected}`);
370
+ if (this.MotionSensor.MotionDetected === undefined) {
371
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionSensor.MotionDetected}`);
457
372
  }
458
373
  else {
459
- this.accessory.context.MotionDetected = this.MotionDetected;
460
- this.motionService?.updateCharacteristic(this.hap.Characteristic.MotionDetected, this.MotionDetected);
461
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic MotionDetected: ${this.MotionDetected}`);
374
+ this.accessory.context.MotionDetected = this.MotionSensor.MotionDetected;
375
+ this.MotionSensor.Service.updateCharacteristic(this.hap.Characteristic.MotionDetected, this.MotionSensor.MotionDetected);
376
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
377
+ + ` MotionDetected: ${this.MotionSensor.MotionDetected}`);
462
378
  }
463
379
  }
464
380
  if (!this.device.contact?.hide_lightsensor) {
465
- if (this.CurrentAmbientLightLevel === undefined) {
466
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
381
+ if (this.LightSensor?.CurrentAmbientLightLevel === undefined) {
382
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
383
+ + ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
467
384
  }
468
385
  else {
469
- this.accessory.context.CurrentAmbientLightLevel = this.CurrentAmbientLightLevel;
470
- this.lightSensorService?.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.CurrentAmbientLightLevel);
386
+ this.accessory.context.CurrentAmbientLightLevel = this.LightSensor.CurrentAmbientLightLevel;
387
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.LightSensor.CurrentAmbientLightLevel);
471
388
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}` +
472
- ` updateCharacteristic CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
389
+ ` updateCharacteristic CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
473
390
  }
474
391
  }
475
- if (this.BatteryLevel === undefined) {
476
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}`);
392
+ if (this.Battery.BatteryLevel === undefined) {
393
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
477
394
  }
478
395
  else {
479
- this.accessory.context.BatteryLevel = this.BatteryLevel;
480
- this.batteryService?.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.BatteryLevel);
481
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.BatteryLevel}`);
396
+ this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
397
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
398
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`);
482
399
  }
483
- if (this.StatusLowBattery === undefined) {
484
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.StatusLowBattery}`);
400
+ if (this.Battery.StatusLowBattery === undefined) {
401
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
485
402
  }
486
403
  else {
487
- this.accessory.context.StatusLowBattery = this.StatusLowBattery;
488
- this.batteryService?.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.StatusLowBattery);
489
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic StatusLowBattery: ${this.StatusLowBattery}`);
490
- }
491
- }
492
- async stopScanning(switchbot) {
493
- switchbot.stopScan();
494
- if (this.BLE_IsConnected) {
495
- await this.BLEparseStatus();
496
- await this.updateHomeKitCharacteristics();
497
- }
498
- else {
499
- await this.BLERefreshConnection(switchbot);
500
- }
501
- }
502
- async getCustomBLEAddress(switchbot) {
503
- if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
504
- (async () => {
505
- // Start to monitor advertisement packets
506
- await switchbot.startScan({
507
- model: 'd',
508
- });
509
- // Set an event handler
510
- switchbot.onadvertisement = (ad) => {
511
- this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} ad: ${JSON.stringify(ad, null, ' ')}`);
512
- };
513
- await sleep(10000);
514
- // Stop to monitor
515
- switchbot.stopScan();
516
- })();
404
+ this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
405
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
406
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
407
+ + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
517
408
  }
518
409
  }
519
410
  async BLERefreshConnection(switchbot) {
@@ -524,243 +415,50 @@ export class Contact {
524
415
  await this.openAPIRefreshStatus();
525
416
  }
526
417
  }
527
- minLux() {
418
+ async minLux() {
419
+ let set_minLux;
528
420
  if (this.device.contact?.set_minLux) {
529
- this.set_minLux = this.device.contact.set_minLux;
421
+ set_minLux = this.device.contact.set_minLux;
530
422
  }
531
423
  else {
532
- this.set_minLux = 1;
424
+ set_minLux = 1;
533
425
  }
534
- return this.set_minLux;
426
+ return set_minLux;
535
427
  }
536
- maxLux() {
428
+ async maxLux() {
429
+ let set_maxLux;
537
430
  if (this.device.contact?.set_maxLux) {
538
- this.set_maxLux = this.device.contact.set_maxLux;
431
+ set_maxLux = this.device.contact.set_maxLux;
539
432
  }
540
433
  else {
541
- this.set_maxLux = 6001;
542
- }
543
- return this.set_maxLux;
544
- }
545
- async scan(device) {
546
- if (device.scanDuration) {
547
- this.scanDuration = this.accessory.context.scanDuration = device.scanDuration;
548
- if (this.BLE) {
549
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config scanDuration: ${this.scanDuration}`);
550
- }
551
- }
552
- else {
553
- this.scanDuration = this.accessory.context.scanDuration = 1;
554
- if (this.BLE) {
555
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default scanDuration: ${this.scanDuration}`);
556
- }
557
- }
558
- }
559
- async statusCode(statusCode) {
560
- switch (statusCode) {
561
- case 151:
562
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
563
- break;
564
- case 152:
565
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
566
- break;
567
- case 160:
568
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
569
- break;
570
- case 161:
571
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
572
- this.offlineOff();
573
- break;
574
- case 171:
575
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
576
- `Hub: ${this.device.hubDeviceId}`);
577
- this.offlineOff();
578
- break;
579
- case 190:
580
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
581
- ` Or command format is invalid, statusCode: ${statusCode}`);
582
- break;
583
- case 100:
584
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
585
- break;
586
- case 200:
587
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
588
- break;
589
- case 400:
590
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
591
- + `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
592
- break;
593
- case 401:
594
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
595
- + `but the request has not been authenticated, statusCode: ${statusCode}`);
596
- break;
597
- case 403:
598
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
599
- + `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
600
- break;
601
- case 404:
602
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
603
- + `statusCode: ${statusCode}`);
604
- break;
605
- case 406:
606
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
607
- + `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
608
- break;
609
- case 415:
610
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
611
- + `header that is not supported by the server, statusCode: ${statusCode}`);
612
- break;
613
- case 422:
614
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
615
- + `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
616
- break;
617
- case 429:
618
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
619
- + `requests allowed for a given time window, statusCode: ${statusCode}`);
620
- break;
621
- case 500:
622
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
623
- + `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
624
- break;
625
- default:
626
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
627
- `${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`);
434
+ set_maxLux = 6001;
628
435
  }
436
+ return set_maxLux;
629
437
  }
630
438
  async offlineOff() {
631
439
  if (this.device.offline) {
632
- await this.deviceContext();
633
- await this.updateHomeKitCharacteristics();
440
+ this.ContactSensor.Service.updateCharacteristic(this.hap.Characteristic.ContactSensorState, this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED);
441
+ if (!this.device.contact?.hide_motionsensor) {
442
+ this.MotionSensor.Service.updateCharacteristic(this.hap.Characteristic.MotionDetected, false);
443
+ }
444
+ if (!this.device.contact?.hide_lightsensor) {
445
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, 100);
446
+ }
634
447
  }
635
448
  }
636
449
  async apiError(e) {
637
- this.contactSensorservice.updateCharacteristic(this.hap.Characteristic.ContactSensorState, e);
450
+ this.ContactSensor.Service.updateCharacteristic(this.hap.Characteristic.ContactSensorState, e);
451
+ this.ContactSensor.Service.updateCharacteristic(this.hap.Characteristic.StatusActive, e);
638
452
  if (!this.device.contact?.hide_motionsensor) {
639
- this.motionService?.updateCharacteristic(this.hap.Characteristic.MotionDetected, e);
453
+ this.MotionSensor.Service.updateCharacteristic(this.hap.Characteristic.MotionDetected, e);
454
+ this.MotionSensor.Service.updateCharacteristic(this.hap.Characteristic.StatusActive, e);
640
455
  }
641
456
  if (!this.device.contact?.hide_lightsensor) {
642
- this.lightSensorService?.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, e);
643
- }
644
- this.batteryService?.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
645
- this.batteryService?.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
646
- }
647
- async deviceContext() {
648
- if (this.MotionDetected === undefined) {
649
- this.MotionDetected = false;
650
- }
651
- else {
652
- this.MotionDetected = this.accessory.context.MotionDetected;
653
- }
654
- if (this.ContactSensorState === undefined) {
655
- this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
656
- }
657
- else {
658
- this.ContactSensorState = this.accessory.context.ContactSensorState;
659
- }
660
- if (this.FirmwareRevision === undefined) {
661
- this.FirmwareRevision = this.platform.version;
662
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
663
- }
664
- }
665
- async refreshRate(device) {
666
- if (device.refreshRate) {
667
- this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate;
668
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
669
- }
670
- else if (this.platform.config.options.refreshRate) {
671
- this.deviceRefreshRate = this.accessory.context.refreshRate = this.platform.config.options.refreshRate;
672
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
673
- }
674
- }
675
- async deviceConfig(device) {
676
- let config = {};
677
- if (device.contact) {
678
- config = device.contact;
679
- }
680
- if (device.connectionType !== undefined) {
681
- config['connectionType'] = device.connectionType;
682
- }
683
- if (device.external !== undefined) {
684
- config['external'] = device.external;
685
- }
686
- if (device.logging !== undefined) {
687
- config['logging'] = device.logging;
688
- }
689
- if (device.refreshRate !== undefined) {
690
- config['refreshRate'] = device.refreshRate;
457
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, e);
458
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.StatusActive, e);
691
459
  }
692
- if (device.scanDuration !== undefined) {
693
- config['scanDuration'] = device.scanDuration;
694
- }
695
- if (device.webhook !== undefined) {
696
- config['webhook'] = device.webhook;
697
- }
698
- if (Object.entries(config).length !== 0) {
699
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
700
- }
701
- }
702
- async deviceLogs(device) {
703
- if (this.platform.debugMode) {
704
- this.deviceLogging = this.accessory.context.logging = 'debugMode';
705
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
706
- }
707
- else if (device.logging) {
708
- this.deviceLogging = this.accessory.context.logging = device.logging;
709
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
710
- }
711
- else if (this.platform.config.options?.logging) {
712
- this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
713
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
714
- }
715
- else {
716
- this.deviceLogging = this.accessory.context.logging = 'standard';
717
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
718
- }
719
- }
720
- /**
721
- * Logging for Device
722
- */
723
- infoLog(...log) {
724
- if (this.enablingDeviceLogging()) {
725
- this.platform.log.info(String(...log));
726
- }
727
- }
728
- warnLog(...log) {
729
- if (this.enablingDeviceLogging()) {
730
- this.platform.log.warn(String(...log));
731
- }
732
- }
733
- debugWarnLog(...log) {
734
- if (this.enablingDeviceLogging()) {
735
- if (this.deviceLogging?.includes('debug')) {
736
- this.platform.log.warn('[DEBUG]', String(...log));
737
- }
738
- }
739
- }
740
- errorLog(...log) {
741
- if (this.enablingDeviceLogging()) {
742
- this.platform.log.error(String(...log));
743
- }
744
- }
745
- debugErrorLog(...log) {
746
- if (this.enablingDeviceLogging()) {
747
- if (this.deviceLogging?.includes('debug')) {
748
- this.platform.log.error('[DEBUG]', String(...log));
749
- }
750
- }
751
- }
752
- debugLog(...log) {
753
- if (this.enablingDeviceLogging()) {
754
- if (this.deviceLogging === 'debug') {
755
- this.platform.log.info('[DEBUG]', String(...log));
756
- }
757
- else {
758
- this.platform.log.debug(String(...log));
759
- }
760
- }
761
- }
762
- enablingDeviceLogging() {
763
- return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
460
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
461
+ this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
764
462
  }
765
463
  }
766
464
  //# sourceMappingURL=contact.js.map