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

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