@switchbot/homebridge-switchbot 3.5.0-beta.5 → 3.5.0-beta.51

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 (169) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/config.schema.json +120 -17
  3. package/dist/device/blindtilt.d.ts +21 -94
  4. package/dist/device/blindtilt.d.ts.map +1 -1
  5. package/dist/device/blindtilt.js +352 -757
  6. package/dist/device/blindtilt.js.map +1 -1
  7. package/dist/device/bot.d.ts +25 -71
  8. package/dist/device/bot.d.ts.map +1 -1
  9. package/dist/device/bot.js +588 -761
  10. package/dist/device/bot.js.map +1 -1
  11. package/dist/device/ceilinglight.d.ts +13 -67
  12. package/dist/device/ceilinglight.d.ts.map +1 -1
  13. package/dist/device/ceilinglight.js +214 -588
  14. package/dist/device/ceilinglight.js.map +1 -1
  15. package/dist/device/colorbulb.d.ts +13 -74
  16. package/dist/device/colorbulb.d.ts.map +1 -1
  17. package/dist/device/colorbulb.js +256 -634
  18. package/dist/device/colorbulb.js.map +1 -1
  19. package/dist/device/contact.d.ts +14 -65
  20. package/dist/device/contact.d.ts.map +1 -1
  21. package/dist/device/contact.js +209 -532
  22. package/dist/device/contact.js.map +1 -1
  23. package/dist/device/curtain.d.ts +17 -86
  24. package/dist/device/curtain.d.ts.map +1 -1
  25. package/dist/device/curtain.js +340 -787
  26. package/dist/device/curtain.js.map +1 -1
  27. package/dist/device/device.d.ts +59 -0
  28. package/dist/device/device.d.ts.map +1 -0
  29. package/dist/device/device.js +682 -0
  30. package/dist/device/device.js.map +1 -0
  31. package/dist/device/fan.d.ts +51 -0
  32. package/dist/device/fan.d.ts.map +1 -0
  33. package/dist/device/fan.js +505 -0
  34. package/dist/device/fan.js.map +1 -0
  35. package/dist/device/hub.d.ts +15 -59
  36. package/dist/device/hub.d.ts.map +1 -1
  37. package/dist/device/hub.js +247 -597
  38. package/dist/device/hub.js.map +1 -1
  39. package/dist/device/humidifier.d.ts +10 -65
  40. package/dist/device/humidifier.d.ts.map +1 -1
  41. package/dist/device/humidifier.js +218 -579
  42. package/dist/device/humidifier.js.map +1 -1
  43. package/dist/device/iosensor.d.ts +11 -64
  44. package/dist/device/iosensor.d.ts.map +1 -1
  45. package/dist/device/iosensor.js +179 -585
  46. package/dist/device/iosensor.js.map +1 -1
  47. package/dist/device/lightstrip.d.ts +10 -68
  48. package/dist/device/lightstrip.d.ts.map +1 -1
  49. package/dist/device/lightstrip.js +257 -569
  50. package/dist/device/lightstrip.js.map +1 -1
  51. package/dist/device/lock.d.ts +15 -62
  52. package/dist/device/lock.d.ts.map +1 -1
  53. package/dist/device/lock.js +215 -543
  54. package/dist/device/lock.js.map +1 -1
  55. package/dist/device/meter.d.ts +13 -63
  56. package/dist/device/meter.d.ts.map +1 -1
  57. package/dist/device/meter.js +175 -578
  58. package/dist/device/meter.js.map +1 -1
  59. package/dist/device/meterplus.d.ts +13 -64
  60. package/dist/device/meterplus.d.ts.map +1 -1
  61. package/dist/device/meterplus.js +164 -578
  62. package/dist/device/meterplus.js.map +1 -1
  63. package/dist/device/motion.d.ts +13 -69
  64. package/dist/device/motion.d.ts.map +1 -1
  65. package/dist/device/motion.js +142 -520
  66. package/dist/device/motion.js.map +1 -1
  67. package/dist/device/plug.d.ts +9 -57
  68. package/dist/device/plug.d.ts.map +1 -1
  69. package/dist/device/plug.js +87 -453
  70. package/dist/device/plug.js.map +1 -1
  71. package/dist/device/robotvacuumcleaner.d.ts +11 -62
  72. package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
  73. package/dist/device/robotvacuumcleaner.js +145 -452
  74. package/dist/device/robotvacuumcleaner.js.map +1 -1
  75. package/dist/device/waterdetector.d.ts +9 -70
  76. package/dist/device/waterdetector.d.ts.map +1 -1
  77. package/dist/device/waterdetector.js +126 -665
  78. package/dist/device/waterdetector.js.map +1 -1
  79. package/dist/homebridge-ui/public/index.html +2 -2
  80. package/dist/index.js +1 -1
  81. package/dist/irdevice/airconditioner.d.ts +8 -48
  82. package/dist/irdevice/airconditioner.d.ts.map +1 -1
  83. package/dist/irdevice/airconditioner.js +309 -419
  84. package/dist/irdevice/airconditioner.js.map +1 -1
  85. package/dist/irdevice/airpurifier.d.ts +7 -38
  86. package/dist/irdevice/airpurifier.d.ts.map +1 -1
  87. package/dist/irdevice/airpurifier.js +72 -304
  88. package/dist/irdevice/airpurifier.js.map +1 -1
  89. package/dist/irdevice/camera.d.ts +6 -35
  90. package/dist/irdevice/camera.d.ts.map +1 -1
  91. package/dist/irdevice/camera.js +34 -278
  92. package/dist/irdevice/camera.js.map +1 -1
  93. package/dist/irdevice/fan.d.ts +6 -39
  94. package/dist/irdevice/fan.d.ts.map +1 -1
  95. package/dist/irdevice/fan.js +67 -311
  96. package/dist/irdevice/fan.js.map +1 -1
  97. package/dist/irdevice/irdevice.d.ts +40 -0
  98. package/dist/irdevice/irdevice.d.ts.map +1 -0
  99. package/dist/irdevice/irdevice.js +512 -0
  100. package/dist/irdevice/irdevice.js.map +1 -0
  101. package/dist/irdevice/light.d.ts +6 -34
  102. package/dist/irdevice/light.d.ts.map +1 -1
  103. package/dist/irdevice/light.js +23 -272
  104. package/dist/irdevice/light.js.map +1 -1
  105. package/dist/irdevice/other.d.ts +18 -47
  106. package/dist/irdevice/other.d.ts.map +1 -1
  107. package/dist/irdevice/other.js +352 -546
  108. package/dist/irdevice/other.js.map +1 -1
  109. package/dist/irdevice/tv.d.ts +7 -39
  110. package/dist/irdevice/tv.d.ts.map +1 -1
  111. package/dist/irdevice/tv.js +82 -321
  112. package/dist/irdevice/tv.js.map +1 -1
  113. package/dist/irdevice/vacuumcleaner.d.ts +6 -35
  114. package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
  115. package/dist/irdevice/vacuumcleaner.js +41 -284
  116. package/dist/irdevice/vacuumcleaner.js.map +1 -1
  117. package/dist/irdevice/waterheater.d.ts +6 -35
  118. package/dist/irdevice/waterheater.d.ts.map +1 -1
  119. package/dist/irdevice/waterheater.js +42 -287
  120. package/dist/irdevice/waterheater.js.map +1 -1
  121. package/dist/platform.d.ts +14 -1
  122. package/dist/platform.d.ts.map +1 -1
  123. package/dist/platform.js +291 -147
  124. package/dist/platform.js.map +1 -1
  125. package/dist/settings.d.ts +41 -11
  126. package/dist/settings.d.ts.map +1 -1
  127. package/dist/settings.js +0 -552
  128. package/dist/settings.js.map +1 -1
  129. package/dist/utils.d.ts +77 -0
  130. package/dist/utils.d.ts.map +1 -1
  131. package/dist/utils.js +638 -1
  132. package/dist/utils.js.map +1 -1
  133. package/eslint.config.js +87 -0
  134. package/package.json +16 -15
  135. package/src/custom.d.ts +2 -1
  136. package/src/device/blindtilt.ts +378 -783
  137. package/src/device/bot.ts +621 -845
  138. package/src/device/ceilinglight.ts +227 -608
  139. package/src/device/colorbulb.ts +269 -657
  140. package/src/device/contact.ts +235 -555
  141. package/src/device/curtain.ts +360 -811
  142. package/src/device/device.ts +710 -0
  143. package/src/device/fan.ts +554 -0
  144. package/src/device/hub.ts +274 -625
  145. package/src/device/humidifier.ts +246 -624
  146. package/src/device/iosensor.ts +205 -611
  147. package/src/device/lightstrip.ts +278 -597
  148. package/src/device/lock.ts +252 -583
  149. package/src/device/meter.ts +200 -601
  150. package/src/device/meterplus.ts +189 -603
  151. package/src/device/motion.ts +161 -542
  152. package/src/device/plug.ts +97 -481
  153. package/src/device/robotvacuumcleaner.ts +166 -478
  154. package/src/device/waterdetector.ts +143 -689
  155. package/src/homebridge-ui/public/index.html +2 -2
  156. package/src/index.ts +1 -1
  157. package/src/irdevice/airconditioner.ts +330 -446
  158. package/src/irdevice/airpurifier.ts +89 -321
  159. package/src/irdevice/camera.ts +42 -293
  160. package/src/irdevice/fan.ts +78 -327
  161. package/src/irdevice/irdevice.ts +528 -0
  162. package/src/irdevice/light.ts +32 -287
  163. package/src/irdevice/other.ts +396 -615
  164. package/src/irdevice/tv.ts +100 -339
  165. package/src/irdevice/vacuumcleaner.ts +49 -305
  166. package/src/irdevice/waterheater.ts +50 -310
  167. package/src/platform.ts +301 -155
  168. package/src/settings.ts +57 -566
  169. package/src/utils.ts +642 -1
@@ -1,127 +1,70 @@
1
+ /* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
2
+ *
3
+ * blindtilt.ts: @switchbot/homebridge-switchbot.
4
+ */
1
5
  import { request } from 'undici';
2
- import { sleep } from '../utils.js';
6
+ import { BlindTiltMappingMode } from '../utils.js';
3
7
  import { interval, Subject } from 'rxjs';
4
- import asyncmqtt from 'async-mqtt';
8
+ import { deviceBase } from './device.js';
5
9
  import { debounceTime, skipWhile, take, tap } from 'rxjs/operators';
6
10
  import { Devices } from '../settings.js';
7
- var BlindTiltMappingMode;
8
- (function (BlindTiltMappingMode) {
9
- BlindTiltMappingMode["OnlyUp"] = "only_up";
10
- BlindTiltMappingMode["OnlyDown"] = "only_down";
11
- BlindTiltMappingMode["DownAndUp"] = "down_and_up";
12
- BlindTiltMappingMode["UpAndDown"] = "up_and_down";
13
- BlindTiltMappingMode["UseTiltForDirection"] = "use_tilt_for_direction";
14
- })(BlindTiltMappingMode || (BlindTiltMappingMode = {}));
15
- export class BlindTilt {
11
+ export class BlindTilt extends deviceBase {
16
12
  platform;
17
- accessory;
18
- device;
19
- api;
20
- log;
21
- config;
22
- hap;
23
13
  // Services
24
- batteryService;
25
- lightSensorService;
26
- windowCoveringService;
27
- // Characteristic Values
28
- BatteryLevel;
29
- PositionState;
30
- TargetPosition;
31
- CurrentPosition;
32
- StatusLowBattery;
33
- FirmwareRevision;
34
- CurrentAmbientLightLevel;
35
- TargetHorizontalTiltAngle;
36
- CurrentHorizontalTiltAngle;
37
- // OpenAPI Status
38
- OpenAPI_InMotion;
39
- OpenAPI_BatteryLevel;
40
- OpenAPI_Direction;
41
- OpenAPI_Calibration;
42
- OpenAPI_CurrentPosition;
43
- OpenAPI_FirmwareRevision;
44
- OpenAPI_CurrentAmbientLightLevel;
14
+ WindowCovering;
15
+ Battery;
16
+ LightSensor;
45
17
  // OpenAPI Others
46
- Mode;
47
- setPositionMode;
48
18
  mappingMode = BlindTiltMappingMode.OnlyUp;
49
- // BLE Status
50
- BLE_InMotion;
51
- BLE_BatteryLevel;
52
- BLE_Calibration;
53
- BLE_CurrentPosition;
54
- BLE_CurrentAmbientLightLevel;
55
- // BLE Others
56
- BLE_IsConnected;
57
- spaceBetweenLevels;
58
19
  // Target
59
20
  setNewTarget;
60
21
  setNewTargetTimer;
61
- //MQTT stuff
62
- mqttClient = null;
63
- // Config
64
- set_minStep;
65
- updateRate;
66
- set_minLux;
67
- set_maxLux;
68
- scanDuration;
69
- deviceLogging;
70
- deviceRefreshRate;
71
- setCloseMode;
72
- setOpenMode;
73
22
  // Updates
74
23
  blindTiltUpdateInProgress;
75
24
  doBlindTiltUpdate;
76
- // Connection
77
- OpenAPI;
78
- BLE;
79
25
  constructor(platform, accessory, device) {
26
+ super(platform, accessory, device);
80
27
  this.platform = platform;
81
- this.accessory = accessory;
82
- this.device = device;
83
- this.api = this.platform.api;
84
- this.log = this.platform.log;
85
- this.config = this.platform.config;
86
- this.hap = this.api.hap;
87
- // Connection
88
- this.BLE = this.device.connectionType === 'BLE' || this.device.connectionType === 'BLE/OpenAPI';
89
- this.OpenAPI = this.device.connectionType === 'OpenAPI' || this.device.connectionType === 'BLE/OpenAPI';
90
28
  // default placeholders
91
- this.deviceLogs(device);
92
- this.refreshRate(device);
93
- this.scan(device);
94
- this.setupMqtt(device);
95
- this.deviceContext();
96
- this.deviceConfig(device);
97
29
  this.mappingMode = device.blindTilt?.mode ?? BlindTiltMappingMode.OnlyUp;
98
30
  this.debugLog(`Mapping mode: ${this.mappingMode}`);
99
31
  // this is subject we use to track when we need to POST changes to the SwitchBot API
100
32
  this.doBlindTiltUpdate = new Subject();
101
33
  this.blindTiltUpdateInProgress = false;
102
34
  this.setNewTarget = false;
35
+ // Initialize LightBulb property
36
+ this.WindowCovering = {
37
+ Service: accessory.getService(this.hap.Service.WindowCovering),
38
+ PositionState: accessory.context.PositionState || this.hap.Characteristic.PositionState.STOPPED,
39
+ TargetPosition: accessory.context.TargetPosition || 100,
40
+ CurrentPosition: accessory.context.CurrentPosition || 100,
41
+ TargetHorizontalTiltAngle: accessory.context.TargetHorizontalTiltAngle || 0,
42
+ CurrentHorizontalTiltAngle: accessory.context.CurrentHorizontalTiltAngle || 0,
43
+ };
44
+ // Initialize Battery property
45
+ this.Battery = {
46
+ Service: accessory.getService(this.hap.Service.Battery),
47
+ BatteryLevel: accessory.context.BatteryLevel || 100,
48
+ StatusLowBattery: this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL,
49
+ };
50
+ // Initialize LightSensor property
51
+ if (!this.device.blindTilt?.hide_lightsensor) {
52
+ this.LightSensor = {
53
+ Service: accessory.getService(this.hap.Service.LightSensor),
54
+ CurrentAmbientLightLevel: accessory.context.CurrentAmbientLightLevel || 0.0001,
55
+ };
56
+ }
103
57
  // Retrieve initial values and updateHomekit
104
58
  this.refreshStatus();
105
- // set accessory information
106
- accessory
107
- .getService(this.hap.Service.AccessoryInformation)
108
- .setCharacteristic(this.hap.Characteristic.Manufacturer, 'SwitchBot')
109
- .setCharacteristic(this.hap.Characteristic.Model, 'W2701600')
110
- .setCharacteristic(this.hap.Characteristic.SerialNumber, device.deviceId)
111
- .setCharacteristic(this.hap.Characteristic.FirmwareRevision, accessory.context.FirmwareRevision);
112
59
  // get the WindowCovering service if it exists, otherwise create a new WindowCovering service
113
60
  // you can create multiple services for each accessory
114
- const windowCoveringService = `${device.deviceName} ${device.deviceType}`;
115
- (this.windowCoveringService =
61
+ (this.WindowCovering.Service =
116
62
  accessory.getService(this.hap.Service.WindowCovering)
117
- || accessory.addService(this.hap.Service.WindowCovering)), windowCoveringService;
118
- this.windowCoveringService.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
119
- if (!this.windowCoveringService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
120
- this.windowCoveringService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
121
- }
63
+ || accessory.addService(this.hap.Service.WindowCovering)), accessory.displayName;
64
+ this.WindowCovering.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
122
65
  // create handlers for required characteristics
123
- this.windowCoveringService.setCharacteristic(this.hap.Characteristic.PositionState, this.PositionState);
124
- this.windowCoveringService
66
+ this.WindowCovering.Service.setCharacteristic(this.hap.Characteristic.PositionState, this.WindowCovering.PositionState);
67
+ this.WindowCovering.Service
125
68
  .getCharacteristic(this.hap.Characteristic.CurrentPosition)
126
69
  .setProps({
127
70
  minStep: this.minStep(device),
@@ -130,9 +73,9 @@ export class BlindTilt {
130
73
  validValueRanges: [0, 100],
131
74
  })
132
75
  .onGet(() => {
133
- return this.CurrentPosition;
76
+ return this.WindowCovering?.CurrentPosition ?? 0;
134
77
  });
135
- this.windowCoveringService
78
+ this.WindowCovering.Service
136
79
  .getCharacteristic(this.hap.Characteristic.TargetPosition)
137
80
  .setProps({
138
81
  minStep: this.minStep(device),
@@ -141,8 +84,8 @@ export class BlindTilt {
141
84
  validValueRanges: [0, 100],
142
85
  })
143
86
  .onSet(this.TargetPositionSet.bind(this));
144
- this.CurrentHorizontalTiltAngle = 90;
145
- this.windowCoveringService
87
+ this.WindowCovering.CurrentHorizontalTiltAngle = 90;
88
+ this.WindowCovering.Service
146
89
  .getCharacteristic(this.hap.Characteristic.CurrentHorizontalTiltAngle)
147
90
  .setProps({
148
91
  minStep: 180,
@@ -151,11 +94,11 @@ export class BlindTilt {
151
94
  validValues: [-90, 90],
152
95
  })
153
96
  .onGet(() => {
154
- // this.debugLog(`requested CurrentHorizontalTiltAngle: ${this.CurrentHorizontalTiltAngle}`);
155
- return this.CurrentHorizontalTiltAngle;
97
+ // this.debugLog(`requested CurrentHorizontalTiltAngle: ${this.WindowCovering.CurrentHorizontalTiltAngle}`);
98
+ return this.WindowCovering.CurrentHorizontalTiltAngle ?? 0;
156
99
  });
157
- this.TargetHorizontalTiltAngle = 90;
158
- this.windowCoveringService
100
+ this.WindowCovering.TargetHorizontalTiltAngle = 90;
101
+ this.WindowCovering.Service
159
102
  .getCharacteristic(this.hap.Characteristic.TargetHorizontalTiltAngle)
160
103
  .setProps({
161
104
  minStep: 180,
@@ -166,12 +109,9 @@ export class BlindTilt {
166
109
  .onSet(this.TargetHorizontalTiltAngleSet.bind(this));
167
110
  // Battery Service
168
111
  const batteryService = `${accessory.displayName} Battery`;
169
- (this.batteryService = this.accessory.getService(this.hap.Service.Battery)
112
+ (this.Battery.Service = this.accessory.getService(this.hap.Service.Battery)
170
113
  || accessory.addService(this.hap.Service.Battery)), batteryService;
171
- this.batteryService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Battery`);
172
- if (!this.batteryService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
173
- this.batteryService.addCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Battery`);
174
- }
114
+ this.Battery.Service.setCharacteristic(this.hap.Characteristic.Name, batteryService);
175
115
  // Update Homekit
176
116
  this.updateHomeKitCharacteristics();
177
117
  // Start an update interval
@@ -181,21 +121,21 @@ export class BlindTilt {
181
121
  await this.refreshStatus();
182
122
  });
183
123
  //regisiter webhook event handler
184
- if (this.device.webhook) {
185
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
124
+ if (device.webhook) {
125
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
186
126
  this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
187
127
  try {
188
- this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
189
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Please Submit Logs: ` + 'https://tinyurl.com/SwitchBotBug');
190
- /*const { temperature, humidity } = context;
191
- const { CurrentTemperature, CurrentRelativeHumidity } = this;
192
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
193
- '(temperature, humidity) = ' +
194
- `Webhook:(${temperature}, ${humidity}), ` +
195
- `current:(${CurrentTemperature}, ${CurrentRelativeHumidity})`);
196
- this.CurrentRelativeHumidity = humidity;
197
- this.CurrentTemperature = temperature;
198
- this.updateHomeKitCharacteristics();*/
128
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
129
+ const { slidePosition, battery } = context;
130
+ const { CurrentPosition } = this.WindowCovering;
131
+ const { BatteryLevel } = this.Battery;
132
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
133
+ '(slidePosition, battery) = ' +
134
+ `Webhook:(${slidePosition}, ${battery}), ` +
135
+ `current:(${CurrentPosition}, ${BatteryLevel})`);
136
+ this.WindowCovering.CurrentPosition = slidePosition;
137
+ this.Battery.BatteryLevel = battery;
138
+ this.updateHomeKitCharacteristics();
199
139
  }
200
140
  catch (e) {
201
141
  this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
@@ -204,13 +144,14 @@ export class BlindTilt {
204
144
  };
205
145
  }
206
146
  // update slide progress
207
- interval(this.updateRate * 1000)
147
+ interval(this.deviceUpdateRate * 1000)
208
148
  //.pipe(skipWhile(() => this.blindTiltUpdateInProgress))
209
149
  .subscribe(async () => {
210
- if (this.PositionState === this.hap.Characteristic.PositionState.STOPPED) {
150
+ if (this.WindowCovering.PositionState === this.hap.Characteristic.PositionState.STOPPED) {
211
151
  return;
212
152
  }
213
- this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Refresh Status When Moving, PositionState: ${this.PositionState}`);
153
+ this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Refresh Status When Moving,`
154
+ + ` PositionState: ${this.WindowCovering.PositionState}`);
214
155
  await this.refreshStatus();
215
156
  });
216
157
  // Watch for BlindTilt change events
@@ -232,199 +173,211 @@ export class BlindTilt {
232
173
  });
233
174
  }
234
175
  /**
235
- * Parse the device status from the SwitchBot api
176
+ * Parse the device status from the SwitchBotBLE API
236
177
  */
237
- async parseStatus() {
238
- if (!this.device.enableCloudService && this.OpenAPI) {
239
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} parseStatus enableCloudService: ${this.device.enableCloudService}`);
240
- }
241
- else if (this.BLE) {
242
- await this.BLEparseStatus();
243
- }
244
- else if (this.OpenAPI && this.platform.config.credentials?.token) {
245
- await this.openAPIparseStatus();
246
- }
247
- else {
248
- await this.offlineOff();
249
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`);
250
- }
251
- }
252
- async BLEparseStatus() {
178
+ async BLEparseStatus(serviceData) {
253
179
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
254
180
  // CurrentPosition
255
- this.CurrentPosition = 100 - Number(this.BLE_CurrentPosition);
181
+ this.WindowCovering.CurrentPosition = 100 - Number(serviceData.position);
256
182
  await this.setMinMax();
257
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentPosition ${this.CurrentPosition}`);
183
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentPosition ${this.WindowCovering.CurrentPosition}`);
258
184
  if (this.setNewTarget) {
259
185
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Checking Status ...`);
260
186
  }
261
- if (this.setNewTarget && this.BLE_InMotion) {
187
+ if (this.setNewTarget && serviceData.inMotion) {
262
188
  await this.setMinMax();
263
- if (Number(this.TargetPosition) > this.CurrentPosition) {
264
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Closing, CurrentPosition: ${this.CurrentPosition}`);
265
- this.PositionState = this.hap.Characteristic.PositionState.INCREASING;
266
- this.windowCoveringService.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.PositionState);
267
- this.debugLog(`${this.device.deviceType}: ${this.CurrentPosition} INCREASING PositionState: ${this.PositionState}`);
268
- }
269
- else if (Number(this.TargetPosition) < this.CurrentPosition) {
270
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Opening, CurrentPosition: ${this.CurrentPosition}`);
271
- this.PositionState = this.hap.Characteristic.PositionState.DECREASING;
272
- this.windowCoveringService.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.PositionState);
273
- this.debugLog(`${this.device.deviceType}: ${this.CurrentPosition} DECREASING PositionState: ${this.PositionState}`);
189
+ if (Number(this.WindowCovering.TargetPosition) > this.WindowCovering.CurrentPosition) {
190
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Closing, CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
191
+ this.WindowCovering.PositionState = this.hap.Characteristic.PositionState.INCREASING;
192
+ this.WindowCovering.Service.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.WindowCovering.PositionState);
193
+ this.debugLog(`${this.device.deviceType}: ${this.WindowCovering.CurrentPosition} INCREASING`
194
+ + ` PositionState: ${this.WindowCovering.PositionState}`);
195
+ }
196
+ else if (Number(this.WindowCovering.TargetPosition) < this.WindowCovering.CurrentPosition) {
197
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Opening, CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
198
+ this.WindowCovering.PositionState = this.hap.Characteristic.PositionState.DECREASING;
199
+ this.WindowCovering.Service.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.WindowCovering.PositionState);
200
+ this.debugLog(`${this.device.deviceType}: ${this.WindowCovering.CurrentPosition} DECREASING`
201
+ + ` PositionState: ${this.WindowCovering.PositionState}`);
274
202
  }
275
203
  else {
276
- this.debugLog(`${this.device.deviceType}: ${this.CurrentPosition} Standby2, CurrentPosition: ${this.CurrentPosition}`);
277
- this.PositionState = this.hap.Characteristic.PositionState.STOPPED;
278
- this.windowCoveringService.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.PositionState);
279
- this.debugLog(`${this.device.deviceType}: ${this.CurrentPosition} STOPPED PositionState: ${this.PositionState}`);
204
+ this.debugLog(`${this.device.deviceType}: ${this.WindowCovering.CurrentPosition} Standby2,`
205
+ + ` CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
206
+ this.WindowCovering.PositionState = this.hap.Characteristic.PositionState.STOPPED;
207
+ this.WindowCovering.Service.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.WindowCovering.PositionState);
208
+ this.debugLog(`${this.device.deviceType}: ${this.WindowCovering.CurrentPosition} STOPPED`
209
+ + ` PositionState: ${this.WindowCovering.PositionState}`);
280
210
  }
281
211
  }
282
212
  else {
283
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Standby, CurrentPosition: ${this.CurrentPosition}`);
284
- this.TargetPosition = this.CurrentPosition;
285
- this.PositionState = this.hap.Characteristic.PositionState.STOPPED;
213
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Standby, CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
214
+ this.WindowCovering.TargetPosition = this.WindowCovering.CurrentPosition;
215
+ this.WindowCovering.PositionState = this.hap.Characteristic.PositionState.STOPPED;
286
216
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Stopped`);
287
217
  }
288
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentPosition: ${this.CurrentPosition},` +
289
- ` TargetPosition: ${this.TargetPosition}, PositionState: ${this.PositionState},`);
218
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentPosition: ${this.WindowCovering.CurrentPosition},`
219
+ + ` TargetPosition: ${this.WindowCovering.TargetPosition}, PositionState: ${this.WindowCovering.PositionState},`);
290
220
  if (!this.device.blindTilt?.hide_lightsensor) {
291
- this.set_minLux = this.minLux();
292
- this.set_maxLux = this.maxLux();
293
- this.spaceBetweenLevels = 9;
221
+ const set_minLux = await this.minLux();
222
+ const set_maxLux = await this.maxLux();
223
+ const spaceBetweenLevels = 9;
224
+ if (this.LightSensor?.CurrentAmbientLightLevel === 0) {
225
+ this.LightSensor.CurrentAmbientLightLevel = 0.0001;
226
+ }
294
227
  // Brightness
295
- switch (this.BLE_CurrentAmbientLightLevel) {
228
+ switch (serviceData.lightLevel) {
296
229
  case 1:
297
- this.CurrentAmbientLightLevel = this.set_minLux;
298
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
230
+ this.LightSensor.CurrentAmbientLightLevel = set_minLux;
231
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel}`);
299
232
  break;
300
233
  case 2:
301
- this.CurrentAmbientLightLevel = (this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels;
302
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel},` +
303
- ` Calculation: ${(this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels}`);
234
+ this.LightSensor.CurrentAmbientLightLevel = (set_maxLux - set_minLux) / spaceBetweenLevels;
235
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel},` +
236
+ ` Calculation: ${(set_maxLux - set_minLux) / spaceBetweenLevels}`);
304
237
  break;
305
238
  case 3:
306
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 2;
307
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
239
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 2;
240
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel}`);
308
241
  break;
309
242
  case 4:
310
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 3;
311
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
243
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 3;
244
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel}`);
312
245
  break;
313
246
  case 5:
314
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 4;
315
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
247
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 4;
248
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel}`);
316
249
  break;
317
250
  case 6:
318
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 5;
319
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
251
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 5;
252
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel}`);
320
253
  break;
321
254
  case 7:
322
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 6;
323
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
255
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 6;
256
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel}`);
324
257
  break;
325
258
  case 8:
326
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 7;
327
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
259
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 7;
260
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel}`);
328
261
  break;
329
262
  case 9:
330
- this.CurrentAmbientLightLevel = ((this.set_maxLux - this.set_minLux) / this.spaceBetweenLevels) * 8;
331
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel}`);
263
+ this.LightSensor.CurrentAmbientLightLevel = ((set_maxLux - set_minLux) / spaceBetweenLevels) * 8;
264
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel}`);
332
265
  break;
333
266
  case 10:
334
267
  default:
335
- this.CurrentAmbientLightLevel = this.set_maxLux;
268
+ this.LightSensor.CurrentAmbientLightLevel = set_maxLux;
336
269
  this.debugLog();
337
270
  }
338
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${this.BLE_CurrentAmbientLightLevel},` +
339
- ` CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
271
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel},` +
272
+ ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
340
273
  }
341
274
  // Battery
342
- this.BatteryLevel = Number(this.BLE_BatteryLevel);
343
- if (this.BatteryLevel < 10) {
344
- this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
275
+ this.Battery.BatteryLevel = Number(serviceData.battery);
276
+ if (this.Battery.BatteryLevel < 10) {
277
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
345
278
  }
346
279
  else {
347
- this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
280
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
348
281
  }
349
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel},` + ` StatusLowBattery: ${this.StatusLowBattery}`);
282
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},`
283
+ + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
350
284
  }
351
- async openAPIparseStatus() {
285
+ /**
286
+ * Parse the device status from the SwitchBot OpenAPI
287
+ */
288
+ async openAPIparseStatus(deviceStatus) {
352
289
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
353
- const [homekitPosition, homekitTiltAngle] = this.mapDeviceValuesToHomekitValues(Number(this.OpenAPI_CurrentPosition), String(this.OpenAPI_Direction));
354
- this.debugLog(` device: ${this.OpenAPI_CurrentPosition} => HK: ${homekitPosition}`);
355
- this.CurrentPosition = homekitPosition;
290
+ const [homekitPosition, homekitTiltAngle] = this.mapDeviceValuesToHomekitValues(Number(deviceStatus.body.slidePosition), String(deviceStatus.body.direction));
291
+ this.debugLog(` device: ${deviceStatus.body.slidePosition} => HK: ${homekitPosition}`);
292
+ this.WindowCovering.CurrentPosition = homekitPosition;
356
293
  // CurrentPosition
357
294
  await this.setMinMax();
358
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentPosition: ${this.CurrentPosition}`);
295
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
359
296
  if (homekitTiltAngle) {
360
- this.CurrentHorizontalTiltAngle = homekitTiltAngle;
361
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentHorizontalTiltAngle: ${this.CurrentHorizontalTiltAngle}`);
297
+ this.WindowCovering.CurrentHorizontalTiltAngle = homekitTiltAngle;
298
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
299
+ + ` CurrentHorizontalTiltAngle: ${this.WindowCovering.CurrentHorizontalTiltAngle}`);
362
300
  }
363
301
  if (this.setNewTarget) {
364
302
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Checking Status ...`);
365
303
  }
366
- if (this.setNewTarget && this.OpenAPI_InMotion) {
304
+ if (this.setNewTarget && deviceStatus.body.moving) {
367
305
  await this.setMinMax();
368
- if (this.TargetPosition > this.CurrentPosition || (homekitTiltAngle && this.TargetHorizontalTiltAngle !== this.CurrentHorizontalTiltAngle)) {
369
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Closing, CurrentPosition: ${this.CurrentPosition} `);
370
- this.PositionState = this.hap.Characteristic.PositionState.INCREASING;
371
- this.windowCoveringService.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.PositionState);
372
- this.debugLog(`${this.device.deviceType}: ${this.CurrentPosition} INCREASING PositionState: ${this.PositionState}`);
373
- }
374
- else if (this.TargetPosition < this.CurrentPosition) {
375
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Opening, CurrentPosition: ${this.CurrentPosition} `);
376
- this.PositionState = this.hap.Characteristic.PositionState.DECREASING;
377
- this.windowCoveringService.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.PositionState);
378
- this.debugLog(`${this.device.deviceType}: ${this.CurrentPosition} DECREASING PositionState: ${this.PositionState}`);
306
+ if (this.WindowCovering.TargetPosition > this.WindowCovering.CurrentPosition
307
+ || (homekitTiltAngle && this.WindowCovering.TargetHorizontalTiltAngle !== this.WindowCovering.CurrentHorizontalTiltAngle)) {
308
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Closing, CurrentPosition: ${this.WindowCovering.CurrentPosition} `);
309
+ this.WindowCovering.PositionState = this.hap.Characteristic.PositionState.INCREASING;
310
+ this.WindowCovering.Service.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.WindowCovering.PositionState);
311
+ this.debugLog(`${this.device.deviceType}: ${this.WindowCovering.CurrentPosition} INCREASING`
312
+ + ` PositionState: ${this.WindowCovering.PositionState}`);
313
+ }
314
+ else if (this.WindowCovering.TargetPosition < this.WindowCovering.CurrentPosition) {
315
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Opening, CurrentPosition: ${this.WindowCovering.CurrentPosition} `);
316
+ this.WindowCovering.PositionState = this.hap.Characteristic.PositionState.DECREASING;
317
+ this.WindowCovering.Service.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.WindowCovering.PositionState);
318
+ this.debugLog(`${this.device.deviceType}: ${this.WindowCovering.CurrentPosition} DECREASING`
319
+ + ` PositionState: ${this.WindowCovering.PositionState}`);
379
320
  }
380
321
  else {
381
- this.debugLog(`${this.device.deviceType}: ${this.CurrentPosition} Standby because reached position,` + ` CurrentPosition: ${this.CurrentPosition}`);
382
- this.PositionState = this.hap.Characteristic.PositionState.STOPPED;
383
- this.windowCoveringService.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.PositionState);
384
- this.debugLog(`${this.device.deviceType}: ${this.CurrentPosition} STOPPED PositionState: ${this.PositionState}`);
322
+ this.debugLog(`${this.device.deviceType}: ${this.WindowCovering.CurrentPosition} Standby because reached position,`
323
+ + ` CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
324
+ this.WindowCovering.PositionState = this.hap.Characteristic.PositionState.STOPPED;
325
+ this.WindowCovering.Service.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.WindowCovering.PositionState);
326
+ this.debugLog(`${this.device.deviceType}: ${this.WindowCovering.CurrentPosition} STOPPED`
327
+ + ` PositionState: ${this.WindowCovering.PositionState}`);
385
328
  }
386
329
  }
387
330
  else {
388
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Standby because device not moving,` + ` CurrentPosition: ${this.CurrentPosition}`);
389
- this.TargetPosition = this.CurrentPosition;
331
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Standby because device not moving,`
332
+ + ` CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
333
+ this.WindowCovering.TargetPosition = this.WindowCovering.CurrentPosition;
390
334
  if (homekitTiltAngle) {
391
- this.TargetHorizontalTiltAngle = this.CurrentHorizontalTiltAngle;
335
+ this.WindowCovering.TargetHorizontalTiltAngle = this.WindowCovering.CurrentHorizontalTiltAngle;
392
336
  }
393
- this.PositionState = this.hap.Characteristic.PositionState.STOPPED;
337
+ this.WindowCovering.PositionState = this.hap.Characteristic.PositionState.STOPPED;
394
338
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Stopped`);
395
339
  }
396
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentPosition: ${this.CurrentPosition},` +
397
- ` TargetPosition: ${this.TargetPosition}, PositionState: ${this.PositionState},`);
340
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentPosition: ${this.WindowCovering.CurrentPosition},` +
341
+ ` TargetPosition: ${this.WindowCovering.TargetPosition}, PositionState: ${this.WindowCovering.PositionState},`);
398
342
  if (!this.device.blindTilt?.hide_lightsensor) {
399
- this.set_minLux = this.minLux();
400
- this.set_maxLux = this.maxLux();
343
+ const set_minLux = await this.minLux();
344
+ const set_maxLux = await this.maxLux();
401
345
  // Brightness
402
- switch (this.OpenAPI_CurrentAmbientLightLevel) {
346
+ switch (deviceStatus.body.brightness) {
403
347
  case 'dim':
404
- this.CurrentAmbientLightLevel = this.set_minLux;
348
+ this.LightSensor.CurrentAmbientLightLevel = set_minLux;
405
349
  break;
406
350
  case 'bright':
407
351
  default:
408
- this.CurrentAmbientLightLevel = this.set_maxLux;
352
+ this.LightSensor.CurrentAmbientLightLevel = set_maxLux;
409
353
  }
410
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
354
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
355
+ + ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
411
356
  }
412
357
  // BatteryLevel
413
- this.BatteryLevel = Number(this.OpenAPI_BatteryLevel);
414
- if (this.BatteryLevel < 10) {
415
- this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
358
+ this.Battery.BatteryLevel = Number(deviceStatus.body.battery);
359
+ if (this.Battery.BatteryLevel < 10) {
360
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
416
361
  }
417
362
  else {
418
- this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
363
+ this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
419
364
  }
420
- if (Number.isNaN(this.BatteryLevel)) {
421
- this.BatteryLevel = 100;
365
+ if (Number.isNaN(this.Battery.BatteryLevel)) {
366
+ this.Battery.BatteryLevel = 100;
367
+ }
368
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},`
369
+ + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
370
+ // Firmware Version
371
+ const version = deviceStatus.body.version?.toString();
372
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
373
+ if (deviceStatus.body.version) {
374
+ this.accessory.context.version = version?.replace(/^V|-.*$/g, '');
375
+ this.accessory
376
+ .getService(this.hap.Service.AccessoryInformation)
377
+ .setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
378
+ .getCharacteristic(this.hap.Characteristic.FirmwareRevision)
379
+ .updateValue(this.accessory.context.version);
422
380
  }
423
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel},`
424
- + ` StatusLowBattery: ${this.StatusLowBattery}`);
425
- // FirmwareRevision
426
- this.FirmwareRevision = this.OpenAPI_FirmwareRevision;
427
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
428
381
  }
429
382
  async refreshStatus() {
430
383
  if (!this.device.enableCloudService && this.OpenAPI) {
@@ -455,21 +408,13 @@ export class BlindTilt {
455
408
  // Start to monitor advertisement packets
456
409
  (async () => {
457
410
  // Start to monitor advertisement packets
458
- await switchbot.startScan({
459
- model: 'x',
460
- id: this.device.bleMac,
461
- });
411
+ await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
462
412
  // Set an event handler
463
413
  switchbot.onadvertisement = (ad) => {
464
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
465
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
466
- if (this.device.bleMac === ad.address && ad.model === 'x') {
414
+ if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
415
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
416
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
467
417
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
468
- this.BLE_Calibration = ad.serviceData.calibration;
469
- this.BLE_BatteryLevel = ad.serviceData.battery;
470
- this.BLE_InMotion = ad.serviceData.inMotion;
471
- this.BLE_CurrentPosition = ad.serviceData.position;
472
- this.BLE_CurrentAmbientLightLevel = ad.serviceData.lightLevel;
473
418
  }
474
419
  else {
475
420
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
@@ -480,82 +425,25 @@ export class BlindTilt {
480
425
  // Stop to monitor
481
426
  await switchbot.stopScan();
482
427
  // Update HomeKit
483
- await this.BLEparseStatus();
428
+ await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
484
429
  await this.updateHomeKitCharacteristics();
485
430
  })();
486
- /*if (switchbot !== false) {
487
- switchbot
488
- .startScan({
489
- model: 'c',
490
- id: this.device.bleMac,
491
- })
492
- .then(async () => {
493
- // Set an event handler
494
- switchbot.onadvertisement = async (ad: ad) => {
495
- this.debugLog(
496
- `${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
497
- ` BLE Address Found: ${ad.address}`,
498
- );
499
- this.BLE_Calibration = ad.serviceData.calibration;
500
- this.BLE_BatteryLevel = ad.serviceData.battery;
501
- this.BLE_InMotion = ad.serviceData.inMotion;
502
- this.BLE_CurrentPosition = ad.serviceData.position;
503
- this.BLE_CurrentAmbientLightLevel = ad.serviceData.lightLevel;
504
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
505
- this.debugLog(
506
- `${this.device.deviceType}: ${this.accessory.displayName} calibration: ${ad.serviceData.calibration}, ` +
507
- `position: ${ad.serviceData.position}, lightLevel: ${ad.serviceData.lightLevel}, battery: ${ad.serviceData.battery}, ` +
508
- `inMotion: ${ad.serviceData.inMotion}`,
509
- );
510
-
511
- if (ad.serviceData) {
512
- this.BLE_IsConnected = true;
513
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
514
- await this.stopScanning(switchbot);
515
- } else {
516
- this.BLE_IsConnected = false;
517
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
518
- }
519
- };
520
- // Wait
521
- return await sleep(this.scanDuration * 1000);
522
- })
523
- .then(async () => {
524
- // Stop to monitor
525
- await this.stopScanning(switchbot);
526
- })
527
- .catch(async (e: any) => {
528
- this.apiError(e);
529
- this.errorLog(
530
- `${this.device.deviceType}: ${this.accessory.displayName} failed BLERefreshStatus with ${this.device.connectionType}` +
531
- ` Connection, Error Message: ${JSON.stringify(e.message)}`,
532
- );
533
- await this.BLERefreshConnection(switchbot);
534
- });
535
- } else {
536
- await this.BLERefreshConnection(switchbot);
537
- }*/
431
+ if (switchbot === undefined) {
432
+ await this.BLERefreshConnection(switchbot);
433
+ }
538
434
  }
539
435
  async openAPIRefreshStatus() {
540
436
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
541
437
  try {
542
- const { body, statusCode } = await request(`${Devices}/${this.device.deviceId}/status`, {
543
- headers: this.platform.generateHeaders(),
544
- });
438
+ const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
545
439
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
546
440
  const deviceStatus = await body.json();
547
441
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
548
442
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
549
443
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
550
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
444
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
551
445
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
552
- this.OpenAPI_CurrentPosition = deviceStatus.body.slidePosition;
553
- this.OpenAPI_Direction = deviceStatus.body.direction;
554
- this.OpenAPI_InMotion = deviceStatus.body.moving;
555
- this.OpenAPI_CurrentAmbientLightLevel = deviceStatus.body.brightness;
556
- this.OpenAPI_BatteryLevel = deviceStatus.body.battery;
557
- this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
558
- this.openAPIparseStatus();
446
+ this.openAPIparseStatus(deviceStatus);
559
447
  this.updateHomeKitCharacteristics();
560
448
  }
561
449
  else {
@@ -593,7 +481,7 @@ export class BlindTilt {
593
481
  }
594
482
  async BLEpushChanges() {
595
483
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`);
596
- if (this.TargetPosition !== this.CurrentPosition) {
484
+ if (this.WindowCovering.TargetPosition !== this.WindowCovering.CurrentPosition) {
597
485
  const switchbot = await this.platform.connectBLE();
598
486
  // Convert to BLE Address
599
487
  this.device.bleMac = this.device
@@ -601,26 +489,24 @@ export class BlindTilt {
601
489
  .join(':')
602
490
  .toLowerCase();
603
491
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLE Address: ${this.device.bleMac}`);
604
- this.SilentPerformance();
605
- const adjustedMode = this.setPositionMode || null;
606
- if (adjustedMode === null) {
607
- this.Mode = 'Default Mode';
608
- }
609
- this.debugLog(`${this.accessory.displayName} Mode: ${this.Mode}`);
492
+ const { setPositionMode, Mode } = await this.setPerformance();
493
+ this.debugLog(`${this.accessory.displayName} Mode: ${Mode}`);
610
494
  if (switchbot !== false) {
611
495
  switchbot
612
496
  .discover({ model: 'c', quick: true, id: this.device.bleMac })
613
497
  .then(async (device_list) => {
614
- this.infoLog(`${this.accessory.displayName} Target Position: ${this.TargetPosition}`);
615
- return await this.retry({
616
- max: this.maxRetry(),
498
+ this.infoLog(`${this.accessory.displayName} Target Position: ${this.WindowCovering.TargetPosition}`);
499
+ return await this.retryBLE({
500
+ max: await this.maxRetryBLE(),
617
501
  fn: async () => {
618
- return await device_list[0].runToPos(100 - Number(this.TargetPosition), adjustedMode);
502
+ return await device_list[0].runToPos(100 - Number(this.WindowCovering.TargetPosition), setPositionMode);
619
503
  },
620
504
  });
621
505
  })
622
506
  .then(() => {
623
507
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
508
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
509
+ + `Target Position: ${this.WindowCovering.TargetPosition} sent over BLE, sent successfully`);
624
510
  })
625
511
  .catch(async (e) => {
626
512
  this.apiError(e);
@@ -636,35 +522,20 @@ export class BlindTilt {
636
522
  }
637
523
  else {
638
524
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges, CurrentPosition & TargetPosition Are the Same.` +
639
- ` CurrentPosition: ${this.CurrentPosition}, TargetPosition ${this.TargetPosition}`);
640
- }
641
- }
642
- async retry({ max, fn }) {
643
- return fn().catch(async (e) => {
644
- if (max === 0) {
645
- throw e;
646
- }
647
- this.infoLog(e);
648
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Retrying`);
649
- await sleep(1000);
650
- return this.retry({ max: max - 1, fn });
651
- });
652
- }
653
- maxRetry() {
654
- if (this.device.maxRetry) {
655
- return this.device.maxRetry;
656
- }
657
- else {
658
- return 5;
525
+ ` CurrentPosition: ${this.WindowCovering.CurrentPosition}, TargetPosition ${this.WindowCovering.TargetPosition}`);
659
526
  }
660
527
  }
661
528
  async openAPIpushChanges() {
662
529
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
663
- const hasDifferentAndRelevantHorizontalTiltAngle = this.mappingMode === BlindTiltMappingMode.UseTiltForDirection && this.TargetHorizontalTiltAngle !== this.CurrentHorizontalTiltAngle;
664
- if (this.TargetPosition !== this.CurrentPosition || hasDifferentAndRelevantHorizontalTiltAngle || this.device.disableCaching) {
665
- const [direction, position] = this.mapHomekitValuesToDeviceValues(Number(this.TargetPosition), Number(this.TargetHorizontalTiltAngle));
666
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Pushing ${this.TargetPosition} (device = ${direction};${position})`);
667
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Mode: ${this.Mode}`);
530
+ const hasDifferentAndRelevantHorizontalTiltAngle = this.mappingMode === BlindTiltMappingMode.UseTiltForDirection
531
+ && this.WindowCovering.TargetHorizontalTiltAngle !== this.WindowCovering.CurrentHorizontalTiltAngle;
532
+ if (this.WindowCovering.TargetPosition !== this.WindowCovering.CurrentPosition
533
+ || hasDifferentAndRelevantHorizontalTiltAngle || this.device.disableCaching) {
534
+ const [direction, position] = this.mapHomekitValuesToDeviceValues(Number(this.WindowCovering.TargetPosition), Number(this.WindowCovering.TargetHorizontalTiltAngle));
535
+ const { Mode } = await this.setPerformance();
536
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
537
+ + ` Pushing ${this.WindowCovering.TargetPosition} (device = ${direction};${position})`);
538
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Mode: ${Mode}`);
668
539
  let bodyChange = '';
669
540
  if (position === 100) {
670
541
  bodyChange = JSON.stringify({
@@ -698,8 +569,10 @@ export class BlindTilt {
698
569
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
699
570
  this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
700
571
  if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
701
- this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
572
+ this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
702
573
  + `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
574
+ this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
575
+ + `request to SwitchBot API, body: ${JSON.stringify(bodyChange)} sent successfully`);
703
576
  }
704
577
  else {
705
578
  this.statusCode(statusCode);
@@ -708,30 +581,31 @@ export class BlindTilt {
708
581
  }
709
582
  catch (e) {
710
583
  this.apiError(e);
711
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIpushChanges with ${this.device.connectionType}` +
712
- ` Connection, Error Message: ${JSON.stringify(e.message)}`);
584
+ this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIpushChanges with ${this.device.connectionType}`
585
+ + ` Connection, Error Message: ${JSON.stringify(e.message)}`);
713
586
  }
714
587
  }
715
588
  else {
716
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No OpenAPI Changes, CurrentPosition & TargetPosition Are the Same.` +
717
- ` CurrentPosition: ${this.CurrentPosition}, TargetPosition ${this.TargetPosition}` +
718
- ` CurrentHorizontalTiltAngle: ${this.CurrentHorizontalTiltAngle}, TargetPosition ${this.TargetHorizontalTiltAngle}`);
589
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No OpenAPI Changes, CurrentPosition & TargetPosition Are the Same.`
590
+ + ` CurrentPosition: ${this.WindowCovering.CurrentPosition}, TargetPosition ${this.WindowCovering.TargetPosition}`
591
+ + ` CurrentHorizontalTiltAngle: ${this.WindowCovering.CurrentHorizontalTiltAngle},`
592
+ + ` TargetPosition ${this.WindowCovering.TargetHorizontalTiltAngle}`);
719
593
  }
720
594
  }
721
595
  /**
722
596
  * Handle requests to set the value of the "Target Horizontal Tilt" characteristic
723
597
  */
724
598
  async TargetHorizontalTiltAngleSet(value) {
725
- if (this.TargetHorizontalTiltAngle === this.accessory.context.TargetHorizontalTiltAngle) {
599
+ if (this.WindowCovering.TargetHorizontalTiltAngle === this.accessory.context.TargetHorizontalTiltAngle) {
726
600
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set TargetHorizontalTiltAngle: ${value}`);
727
601
  }
728
602
  else {
729
603
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetHorizontalTiltAngle: ${value}`);
730
604
  }
731
605
  //value = value < 0 ? -90 : 90;
732
- this.TargetHorizontalTiltAngle = value;
606
+ this.WindowCovering.TargetHorizontalTiltAngle = value;
733
607
  if (this.device.mqttURL) {
734
- this.mqttPublish('TargetHorizontalTiltAngle', this.TargetHorizontalTiltAngle);
608
+ this.mqttPublish('TargetHorizontalTiltAngle', this.WindowCovering.TargetHorizontalTiltAngle.toString());
735
609
  }
736
610
  this.startUpdatingBlindTiltIfNeeded();
737
611
  }
@@ -739,49 +613,53 @@ export class BlindTilt {
739
613
  * Handle requests to set the value of the "Target Position" characteristic
740
614
  */
741
615
  async TargetPositionSet(value) {
742
- if (this.TargetPosition === this.accessory.context.TargetPosition) {
616
+ if (this.WindowCovering.TargetPosition === this.accessory.context.TargetPosition) {
743
617
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set TargetPosition: ${value}`);
744
618
  }
745
619
  else {
746
620
  this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetPosition: ${value}`);
747
621
  }
748
- this.TargetPosition = value;
622
+ this.WindowCovering.TargetPosition = value;
749
623
  if (this.device.mqttURL) {
750
- this.mqttPublish('TargetPosition', this.TargetPosition);
624
+ this.mqttPublish('TargetPosition', this.WindowCovering.TargetPosition.toString());
751
625
  }
752
626
  this.startUpdatingBlindTiltIfNeeded();
753
627
  }
754
628
  async startUpdatingBlindTiltIfNeeded() {
755
629
  await this.setMinMax();
756
630
  this.debugLog('setMinMax');
757
- if (this.TargetPosition > this.CurrentPosition || this.TargetHorizontalTiltAngle !== this.CurrentHorizontalTiltAngle) {
758
- this.PositionState = this.hap.Characteristic.PositionState.INCREASING;
631
+ if (this.WindowCovering.TargetPosition > this.WindowCovering.CurrentPosition
632
+ || this.WindowCovering.TargetHorizontalTiltAngle !== this.WindowCovering.CurrentHorizontalTiltAngle) {
633
+ this.WindowCovering.PositionState = this.hap.Characteristic.PositionState.INCREASING;
759
634
  this.setNewTarget = true;
760
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} value: ${this.CurrentPosition},` + ` CurrentPosition: ${this.CurrentPosition}`);
635
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} value: ${this.WindowCovering.CurrentPosition},`
636
+ + ` CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
761
637
  }
762
- else if (this.TargetPosition < this.CurrentPosition) {
763
- this.PositionState = this.hap.Characteristic.PositionState.DECREASING;
638
+ else if (this.WindowCovering.TargetPosition < this.WindowCovering.CurrentPosition) {
639
+ this.WindowCovering.PositionState = this.hap.Characteristic.PositionState.DECREASING;
764
640
  this.setNewTarget = true;
765
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} value: ${this.CurrentPosition},` + ` CurrentPosition: ${this.CurrentPosition}`);
641
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} value: ${this.WindowCovering.CurrentPosition},`
642
+ + ` CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
766
643
  }
767
644
  else {
768
- this.PositionState = this.hap.Characteristic.PositionState.STOPPED;
645
+ this.WindowCovering.PositionState = this.hap.Characteristic.PositionState.STOPPED;
769
646
  this.setNewTarget = false;
770
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} value: ${this.CurrentPosition},` + ` CurrentPosition: ${this.CurrentPosition}`);
647
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} value: ${this.WindowCovering.CurrentPosition},`
648
+ + ` CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
771
649
  }
772
- this.windowCoveringService.setCharacteristic(this.hap.Characteristic.PositionState, this.PositionState);
773
- this.windowCoveringService.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.PositionState);
650
+ this.WindowCovering.Service.setCharacteristic(this.hap.Characteristic.PositionState, this.WindowCovering.PositionState);
651
+ this.WindowCovering.Service.getCharacteristic(this.hap.Characteristic.PositionState).updateValue(this.WindowCovering.PositionState);
774
652
  /**
775
653
  * If Blind Tilt movement time is short, the moving flag from backend is always false.
776
654
  * The minimum time depends on the network control latency.
777
655
  */
778
656
  clearTimeout(this.setNewTargetTimer);
779
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateRate: ${this.updateRate}`);
657
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateRate: ${this.deviceUpdateRate}`);
780
658
  if (this.setNewTarget) {
781
659
  this.setNewTargetTimer = setTimeout(() => {
782
660
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} setNewTarget ${this.setNewTarget} timeout`);
783
661
  this.setNewTarget = false;
784
- }, this.updateRate * 1000);
662
+ }, this.deviceUpdateRate * 1000);
785
663
  }
786
664
  this.doBlindTiltUpdate.next();
787
665
  }
@@ -789,152 +667,99 @@ export class BlindTilt {
789
667
  await this.setMinMax();
790
668
  // CurrentHorizontalTiltAngle
791
669
  if (this.mappingMode === BlindTiltMappingMode.UseTiltForDirection) {
792
- if (this.CurrentHorizontalTiltAngle === undefined || Number.isNaN(this.CurrentHorizontalTiltAngle)) {
793
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentHorizontalTiltAngle: ${this.CurrentHorizontalTiltAngle}`);
670
+ if (this.WindowCovering.CurrentHorizontalTiltAngle === undefined || Number.isNaN(this.WindowCovering.CurrentHorizontalTiltAngle)) {
671
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
672
+ + ` CurrentHorizontalTiltAngle: ${this.WindowCovering.CurrentHorizontalTiltAngle}`);
794
673
  }
795
674
  else {
796
675
  if (this.device.mqttURL) {
797
- this.mqttPublish('CurrentHorizontalTiltAngle', this.CurrentHorizontalTiltAngle);
676
+ this.mqttPublish('CurrentHorizontalTiltAngle', this.WindowCovering.CurrentHorizontalTiltAngle.toString());
798
677
  }
799
- this.accessory.context.CurrentHorizontalTiltAngle = this.CurrentHorizontalTiltAngle;
800
- this.windowCoveringService.updateCharacteristic(this.hap.Characteristic.CurrentHorizontalTiltAngle, Number(this.CurrentHorizontalTiltAngle));
678
+ this.accessory.context.CurrentHorizontalTiltAngle = this.WindowCovering.CurrentHorizontalTiltAngle;
679
+ this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentHorizontalTiltAngle, Number(this.WindowCovering.CurrentHorizontalTiltAngle));
801
680
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
802
- updateCharacteristic CurrentHorizontalTiltAngle: ${this.CurrentHorizontalTiltAngle}`);
681
+ updateCharacteristic CurrentHorizontalTiltAngle: ${this.WindowCovering.CurrentHorizontalTiltAngle}`);
803
682
  }
804
683
  }
805
684
  // CurrentPosition
806
- if (this.CurrentPosition === undefined || Number.isNaN(this.CurrentPosition)) {
807
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentPosition: ${this.CurrentPosition}`);
685
+ if (this.WindowCovering.CurrentPosition === undefined || Number.isNaN(this.WindowCovering.CurrentPosition)) {
686
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
808
687
  }
809
688
  else {
810
689
  if (this.device.mqttURL) {
811
- this.mqttPublish('CurrentPosition', this.CurrentPosition);
690
+ this.mqttPublish('CurrentPosition', this.WindowCovering.CurrentPosition.toString());
812
691
  }
813
- this.accessory.context.CurrentPosition = this.CurrentPosition;
814
- this.windowCoveringService.updateCharacteristic(this.hap.Characteristic.CurrentPosition, Number(this.CurrentPosition));
815
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic CurrentPosition: ${this.CurrentPosition}`);
692
+ this.accessory.context.CurrentPosition = this.WindowCovering.CurrentPosition;
693
+ this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, Number(this.WindowCovering.CurrentPosition));
694
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
695
+ + ` updateCharacteristic CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
816
696
  }
817
697
  // PositionState
818
- if (this.PositionState === undefined) {
819
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} PositionState: ${this.PositionState}`);
698
+ if (this.WindowCovering.PositionState === undefined) {
699
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} PositionState: ${this.WindowCovering.PositionState}`);
820
700
  }
821
701
  else {
822
702
  if (this.device.mqttURL) {
823
- this.mqttPublish('PositionState', this.PositionState);
703
+ this.mqttPublish('PositionState', this.WindowCovering.PositionState.toString());
824
704
  }
825
- this.accessory.context.PositionState = this.PositionState;
826
- this.windowCoveringService.updateCharacteristic(this.hap.Characteristic.PositionState, Number(this.PositionState));
827
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic PositionState: ${this.PositionState}`);
705
+ this.accessory.context.PositionState = this.WindowCovering.PositionState;
706
+ this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.PositionState, Number(this.WindowCovering.PositionState));
707
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
708
+ + ` PositionState: ${this.WindowCovering.PositionState}`);
828
709
  }
829
710
  // TargetPosition
830
- if (this.TargetPosition === undefined || Number.isNaN(this.TargetPosition)) {
831
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} TargetPosition: ${this.TargetPosition}`);
711
+ if (this.WindowCovering.TargetPosition === undefined || Number.isNaN(this.WindowCovering.TargetPosition)) {
712
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} TargetPosition: ${this.WindowCovering.TargetPosition}`);
832
713
  }
833
714
  else {
834
715
  if (this.device.mqttURL) {
835
- this.mqttPublish('TargetPosition', this.TargetPosition);
716
+ this.mqttPublish('TargetPosition', this.WindowCovering.TargetPosition.toString());
836
717
  }
837
- this.accessory.context.TargetPosition = this.TargetPosition;
838
- this.windowCoveringService.updateCharacteristic(this.hap.Characteristic.TargetPosition, Number(this.TargetPosition));
839
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic TargetPosition: ${this.TargetPosition}`);
718
+ this.accessory.context.TargetPosition = this.WindowCovering.TargetPosition;
719
+ this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, Number(this.WindowCovering.TargetPosition));
720
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
721
+ + ` TargetPosition: ${this.WindowCovering.TargetPosition}`);
840
722
  }
841
723
  // CurrentAmbientLightLevel
842
724
  if (!this.device.blindTilt?.hide_lightsensor) {
843
- if (this.CurrentAmbientLightLevel === undefined || Number.isNaN(this.CurrentAmbientLightLevel)) {
844
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
725
+ if (this.LightSensor.CurrentAmbientLightLevel === undefined || Number.isNaN(this.LightSensor.CurrentAmbientLightLevel)) {
726
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
727
+ + ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
845
728
  }
846
729
  else {
847
730
  if (this.device.mqttURL) {
848
- this.mqttPublish('CurrentAmbientLightLevel', this.CurrentAmbientLightLevel);
731
+ this.mqttPublish('CurrentAmbientLightLevel', this.LightSensor.CurrentAmbientLightLevel.toString());
849
732
  }
850
- this.accessory.context.CurrentAmbientLightLevel = this.CurrentAmbientLightLevel;
851
- this.lightSensorService?.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.CurrentAmbientLightLevel);
733
+ this.accessory.context.CurrentAmbientLightLevel = this.LightSensor.CurrentAmbientLightLevel;
734
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.LightSensor.CurrentAmbientLightLevel);
852
735
  this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}` +
853
- ` updateCharacteristic CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
736
+ ` updateCharacteristic CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
854
737
  }
855
738
  }
856
739
  // BatteryLevel
857
- if (this.BatteryLevel === undefined) {
858
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}`);
740
+ if (this.Battery.BatteryLevel === undefined) {
741
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
859
742
  }
860
743
  else {
861
744
  if (this.device.mqttURL) {
862
- this.mqttPublish('BatteryLevel', this.BatteryLevel);
745
+ this.mqttPublish('BatteryLevel', this.Battery.BatteryLevel.toString());
863
746
  }
864
- this.accessory.context.BatteryLevel = this.BatteryLevel;
865
- this.batteryService?.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.BatteryLevel);
866
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.BatteryLevel}`);
747
+ this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
748
+ this.Battery?.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
749
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`);
867
750
  }
868
751
  // StatusLowBattery
869
- if (this.StatusLowBattery === undefined) {
870
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.StatusLowBattery}`);
752
+ if (this.Battery.StatusLowBattery === undefined) {
753
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
871
754
  }
872
755
  else {
873
756
  if (this.device.mqttURL) {
874
- this.mqttPublish('StatusLowBattery', this.StatusLowBattery);
757
+ this.mqttPublish('StatusLowBattery', this.Battery.StatusLowBattery.toString());
875
758
  }
876
- this.accessory.context.StatusLowBattery = this.StatusLowBattery;
877
- this.batteryService?.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.StatusLowBattery);
878
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic StatusLowBattery: ${this.StatusLowBattery}`);
879
- }
880
- }
881
- /*
882
- * Publish MQTT message for topics of
883
- * 'homebridge-switchbot/blindtilt/xx:xx:xx:xx:xx:xx'
884
- */
885
- mqttPublish(topic, message) {
886
- const mac = this.device.deviceId
887
- ?.toLowerCase()
888
- .match(/[\s\S]{1,2}/g)
889
- ?.join(':');
890
- const options = this.device.mqttPubOptions || {};
891
- this.mqttClient?.publish(`homebridge-switchbot/blindtilt/${mac}/${topic}`, `${message}`, options);
892
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MQTT message: ${topic}/${message} options:${JSON.stringify(options)}`);
893
- }
894
- /*
895
- * Setup MQTT hadler if URL is specified.
896
- */
897
- async setupMqtt(device) {
898
- if (device.mqttURL) {
899
- try {
900
- const { connectAsync } = asyncmqtt;
901
- this.mqttClient = await connectAsync(device.mqttURL, device.mqttOptions || {});
902
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MQTT connection has been established successfully.`);
903
- this.mqttClient.on('error', (e) => {
904
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Failed to publish MQTT messages. ${e}`);
905
- });
906
- }
907
- catch (e) {
908
- this.mqttClient = null;
909
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Failed to establish MQTT connection. ${e}`);
910
- }
911
- }
912
- }
913
- async stopScanning(switchbot) {
914
- switchbot.stopScan();
915
- if (this.BLE_IsConnected) {
916
- await this.BLEparseStatus();
917
- await this.updateHomeKitCharacteristics();
918
- }
919
- else {
920
- await this.BLERefreshConnection(switchbot);
921
- }
922
- }
923
- async getCustomBLEAddress(switchbot) {
924
- if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
925
- (async () => {
926
- // Start to monitor advertisement packets
927
- await switchbot.startScan({
928
- model: 'c',
929
- });
930
- // Set an event handler
931
- switchbot.onadvertisement = (ad) => {
932
- this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} ad: ${JSON.stringify(ad, null, ' ')}`);
933
- };
934
- await sleep(10000);
935
- // Stop to monitor
936
- switchbot.stopScan();
937
- })();
759
+ this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
760
+ this.Battery?.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
761
+ this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
762
+ + ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
938
763
  }
939
764
  }
940
765
  async BLEPushConnection() {
@@ -951,212 +776,104 @@ export class BlindTilt {
951
776
  await this.openAPIRefreshStatus();
952
777
  }
953
778
  }
954
- async SilentPerformance() {
955
- if (Number(this.TargetPosition) > 50) {
779
+ async setPerformance() {
780
+ let setPositionMode;
781
+ let Mode;
782
+ if (Number(this.WindowCovering.TargetPosition) > 50) {
956
783
  if (this.device.blindTilt?.setOpenMode === '1') {
957
- this.setPositionMode = 1;
958
- this.Mode = 'Silent Mode';
784
+ setPositionMode = 1;
785
+ Mode = 'Silent Mode';
786
+ }
787
+ else if (this.device.blindTilt?.setOpenMode === '0') {
788
+ setPositionMode = 0;
789
+ Mode = 'Performance Mode';
959
790
  }
960
791
  else {
961
- this.setPositionMode = 0;
962
- this.Mode = 'Performance Mode';
792
+ setPositionMode = 0;
793
+ Mode = 'Default Mode';
963
794
  }
964
795
  }
965
796
  else {
966
797
  if (this.device.blindTilt?.setCloseMode === '1') {
967
- this.setPositionMode = 1;
968
- this.Mode = 'Silent Mode';
798
+ setPositionMode = 1;
799
+ Mode = 'Silent Mode';
800
+ }
801
+ else if (this.device.blindTilt?.setOpenMode === '0') {
802
+ setPositionMode = 0;
803
+ Mode = 'Performance Mode';
969
804
  }
970
805
  else {
971
- this.setPositionMode = 0;
972
- this.Mode = 'Performance Mode';
806
+ setPositionMode = 0;
807
+ Mode = 'Default Mode';
973
808
  }
974
809
  }
810
+ return { setPositionMode, Mode };
975
811
  }
976
812
  async setMinMax() {
977
813
  if (this.device.blindTilt?.set_min) {
978
- if (Number(this.CurrentPosition) <= this.device.blindTilt?.set_min) {
979
- this.CurrentPosition = 0;
814
+ if (Number(this.WindowCovering.CurrentPosition) <= this.device.blindTilt?.set_min) {
815
+ this.WindowCovering.CurrentPosition = 0;
980
816
  }
981
817
  }
982
818
  if (this.device.blindTilt?.set_max) {
983
- if (Number(this.CurrentPosition) >= this.device.blindTilt?.set_max) {
984
- this.CurrentPosition = 100;
819
+ if (Number(this.WindowCovering.CurrentPosition) >= this.device.blindTilt?.set_max) {
820
+ this.WindowCovering.CurrentPosition = 100;
985
821
  }
986
822
  }
987
823
  if (this.mappingMode === BlindTiltMappingMode.UseTiltForDirection) {
988
- this.CurrentHorizontalTiltAngle = Number(this.CurrentHorizontalTiltAngle) < 0 ? -90 : 90;
824
+ this.WindowCovering.CurrentHorizontalTiltAngle = Number(this.WindowCovering.CurrentHorizontalTiltAngle) < 0 ? -90 : 90;
989
825
  }
990
826
  }
991
827
  minStep(device) {
828
+ let set_minStep;
992
829
  if (device.blindTilt?.set_minStep) {
993
- this.set_minStep = device.blindTilt?.set_minStep;
830
+ set_minStep = device.blindTilt?.set_minStep;
994
831
  }
995
832
  else {
996
- this.set_minStep = 1;
833
+ set_minStep = 1;
997
834
  }
998
- return this.set_minStep;
835
+ return set_minStep;
999
836
  }
1000
- minLux() {
837
+ async minLux() {
838
+ let set_minLux;
1001
839
  if (this.device.blindTilt?.set_minLux) {
1002
- this.set_minLux = this.device.blindTilt?.set_minLux;
840
+ set_minLux = this.device.blindTilt?.set_minLux;
1003
841
  }
1004
842
  else {
1005
- this.set_minLux = 1;
843
+ set_minLux = 1;
1006
844
  }
1007
- return this.set_minLux;
845
+ return set_minLux;
1008
846
  }
1009
- maxLux() {
847
+ async maxLux() {
848
+ let set_maxLux;
1010
849
  if (this.device.blindTilt?.set_maxLux) {
1011
- this.set_maxLux = this.device.blindTilt?.set_maxLux;
850
+ set_maxLux = this.device.blindTilt?.set_maxLux;
1012
851
  }
1013
852
  else {
1014
- this.set_maxLux = 6001;
1015
- }
1016
- return this.set_maxLux;
1017
- }
1018
- async scan(device) {
1019
- if (device.scanDuration) {
1020
- if (this.updateRate > device.scanDuration) {
1021
- this.scanDuration = this.updateRate;
1022
- if (this.BLE) {
1023
- this.warnLog(`${this.device.deviceType}: ` +
1024
- `${this.accessory.displayName} scanDuration is less than updateRate, overriding scanDuration with updateRate`);
1025
- }
1026
- }
1027
- else {
1028
- this.scanDuration = this.accessory.context.scanDuration = device.scanDuration;
1029
- }
1030
- if (this.BLE) {
1031
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config scanDuration: ${this.scanDuration}`);
1032
- }
1033
- }
1034
- else {
1035
- if (this.updateRate > 1) {
1036
- this.scanDuration = this.updateRate;
1037
- }
1038
- else {
1039
- this.scanDuration = this.accessory.context.scanDuration = 1;
1040
- }
1041
- if (this.BLE) {
1042
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default scanDuration: ${this.scanDuration}`);
1043
- }
1044
- }
1045
- }
1046
- async statusCode(statusCode) {
1047
- switch (statusCode) {
1048
- case 151:
1049
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
1050
- break;
1051
- case 152:
1052
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
1053
- break;
1054
- case 160:
1055
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
1056
- break;
1057
- case 161:
1058
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
1059
- this.offlineOff();
1060
- break;
1061
- case 171:
1062
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
1063
- `Hub: ${this.device.hubDeviceId}`);
1064
- this.offlineOff();
1065
- break;
1066
- case 190:
1067
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
1068
- ` Or command format is invalid, statusCode: ${statusCode}`);
1069
- break;
1070
- case 100:
1071
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
1072
- break;
1073
- case 200:
1074
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
1075
- break;
1076
- case 400:
1077
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
1078
- + `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
1079
- break;
1080
- case 401:
1081
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
1082
- + `but the request has not been authenticated, statusCode: ${statusCode}`);
1083
- break;
1084
- case 403:
1085
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
1086
- + `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
1087
- break;
1088
- case 404:
1089
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
1090
- + `statusCode: ${statusCode}`);
1091
- break;
1092
- case 406:
1093
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
1094
- + `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
1095
- break;
1096
- case 415:
1097
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
1098
- + `header that is not supported by the server, statusCode: ${statusCode}`);
1099
- break;
1100
- case 422:
1101
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
1102
- + `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
1103
- break;
1104
- case 429:
1105
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
1106
- + `requests allowed for a given time window, statusCode: ${statusCode}`);
1107
- break;
1108
- case 500:
1109
- this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
1110
- + `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
1111
- break;
1112
- default:
1113
- this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
1114
- `${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`);
853
+ set_maxLux = 6001;
1115
854
  }
855
+ return set_maxLux;
1116
856
  }
1117
857
  async offlineOff() {
1118
858
  if (this.device.offline) {
1119
- await this.deviceContext();
1120
- await this.updateHomeKitCharacteristics();
859
+ this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 100);
860
+ this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
861
+ this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 100);
1121
862
  }
1122
863
  }
1123
864
  async apiError(e) {
1124
- this.windowCoveringService.updateCharacteristic(this.hap.Characteristic.CurrentPosition, e);
1125
- this.windowCoveringService.updateCharacteristic(this.hap.Characteristic.PositionState, e);
1126
- this.windowCoveringService.updateCharacteristic(this.hap.Characteristic.TargetPosition, e);
865
+ this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, e);
866
+ this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.PositionState, e);
867
+ this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, e);
1127
868
  if (!this.device.curtain?.hide_lightsensor) {
1128
- this.lightSensorService?.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, e);
869
+ this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, e);
1129
870
  }
1130
871
  if (this.BLE) {
1131
- this.batteryService?.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
1132
- this.batteryService?.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
872
+ this.Battery?.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
873
+ this.Battery?.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
1133
874
  }
1134
875
  //throw new this.platform.api.hap.HapStatusError(HAPStatus.SERVICE_COMMUNICATION_FAILURE);
1135
876
  }
1136
- async deviceContext() {
1137
- if (this.CurrentPosition === undefined) {
1138
- this.CurrentPosition = 0;
1139
- }
1140
- else {
1141
- this.CurrentPosition = this.accessory.context.CurrentPosition;
1142
- }
1143
- if (this.TargetPosition === undefined) {
1144
- this.TargetPosition = 0;
1145
- }
1146
- else {
1147
- this.TargetPosition = this.accessory.context.TargetPosition;
1148
- }
1149
- if (this.PositionState === undefined) {
1150
- this.PositionState = this.hap.Characteristic.PositionState.STOPPED;
1151
- }
1152
- else {
1153
- this.PositionState = this.accessory.context.PositionState;
1154
- }
1155
- if (this.FirmwareRevision === undefined) {
1156
- this.FirmwareRevision = this.platform.version;
1157
- this.accessory.context.FirmwareRevision = this.FirmwareRevision;
1158
- }
1159
- }
1160
877
  /**
1161
878
  * Maps device values to homekit values
1162
879
  *
@@ -1271,127 +988,5 @@ export class BlindTilt {
1271
988
  }
1272
989
  }
1273
990
  }
1274
- async refreshRate(device) {
1275
- // refreshRate
1276
- if (device.refreshRate) {
1277
- this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate;
1278
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
1279
- }
1280
- else if (this.platform.config.options.refreshRate) {
1281
- this.deviceRefreshRate = this.accessory.context.refreshRate = this.platform.config.options.refreshRate;
1282
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
1283
- }
1284
- // updateRate
1285
- if (device?.blindTilt?.updateRate) {
1286
- this.updateRate = device?.blindTilt?.updateRate;
1287
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Blind Tilt updateRate: ${this.updateRate}`);
1288
- }
1289
- else {
1290
- this.updateRate = 2;
1291
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default Blind Tilt updateRate: ${this.updateRate}`);
1292
- }
1293
- }
1294
- async deviceConfig(device) {
1295
- let config = {};
1296
- if (device.blindTilt) {
1297
- config = device.blindTilt;
1298
- }
1299
- if (device.connectionType !== undefined) {
1300
- config['connectionType'] = device.connectionType;
1301
- }
1302
- if (device.external !== undefined) {
1303
- config['external'] = device.external;
1304
- }
1305
- if (device.mqttURL !== undefined) {
1306
- config['mqttURL'] = device.mqttURL;
1307
- }
1308
- if (device.logging !== undefined) {
1309
- config['logging'] = device.logging;
1310
- }
1311
- if (device.refreshRate !== undefined) {
1312
- config['refreshRate'] = device.refreshRate;
1313
- }
1314
- if (device.scanDuration !== undefined) {
1315
- config['scanDuration'] = device.scanDuration;
1316
- }
1317
- if (device.maxRetry !== undefined) {
1318
- config['maxRetry'] = device.maxRetry;
1319
- }
1320
- if (device.webhook !== undefined) {
1321
- config['webhook'] = device.webhook;
1322
- }
1323
- if (device.blindTilt?.mode === undefined) {
1324
- config['mode'] = BlindTiltMappingMode.OnlyUp;
1325
- }
1326
- else {
1327
- config['mode'] = device.blindTilt?.mode;
1328
- }
1329
- if (Object.entries(config).length !== 0) {
1330
- this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
1331
- }
1332
- }
1333
- async deviceLogs(device) {
1334
- if (this.platform.debugMode) {
1335
- this.deviceLogging = this.accessory.context.logging = 'debugMode';
1336
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
1337
- }
1338
- else if (device.logging) {
1339
- this.deviceLogging = this.accessory.context.logging = device.logging;
1340
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
1341
- }
1342
- else if (this.platform.config.options?.logging) {
1343
- this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
1344
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
1345
- }
1346
- else {
1347
- this.deviceLogging = this.accessory.context.logging = 'standard';
1348
- this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
1349
- }
1350
- }
1351
- /**
1352
- * Logging for Device
1353
- */
1354
- infoLog(...log) {
1355
- if (this.enablingDeviceLogging()) {
1356
- this.platform.log.info(String(...log));
1357
- }
1358
- }
1359
- warnLog(...log) {
1360
- if (this.enablingDeviceLogging()) {
1361
- this.platform.log.warn(String(...log));
1362
- }
1363
- }
1364
- debugWarnLog(...log) {
1365
- if (this.enablingDeviceLogging()) {
1366
- if (this.deviceLogging?.includes('debug')) {
1367
- this.platform.log.warn('[DEBUG]', String(...log));
1368
- }
1369
- }
1370
- }
1371
- errorLog(...log) {
1372
- if (this.enablingDeviceLogging()) {
1373
- this.platform.log.error(String(...log));
1374
- }
1375
- }
1376
- debugErrorLog(...log) {
1377
- if (this.enablingDeviceLogging()) {
1378
- if (this.deviceLogging?.includes('debug')) {
1379
- this.platform.log.error('[DEBUG]', String(...log));
1380
- }
1381
- }
1382
- }
1383
- debugLog(...log) {
1384
- if (this.enablingDeviceLogging()) {
1385
- if (this.deviceLogging === 'debug') {
1386
- this.platform.log.info('[DEBUG]', String(...log));
1387
- }
1388
- else {
1389
- this.platform.log.debug(String(...log));
1390
- }
1391
- }
1392
- }
1393
- enablingDeviceLogging() {
1394
- return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
1395
- }
1396
991
  }
1397
992
  //# sourceMappingURL=blindtilt.js.map