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