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