@switchbot/homebridge-switchbot 3.5.0-beta.6 → 3.5.0-beta.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +4 -1
- package/CHANGELOG.md +4 -1
- package/config.schema.json +120 -17
- package/dist/device/blindtilt.d.ts +23 -96
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +408 -779
- package/dist/device/blindtilt.js.map +1 -1
- package/dist/device/bot.d.ts +26 -72
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +696 -822
- package/dist/device/bot.js.map +1 -1
- package/dist/device/ceilinglight.d.ts +14 -68
- package/dist/device/ceilinglight.d.ts.map +1 -1
- package/dist/device/ceilinglight.js +237 -606
- package/dist/device/ceilinglight.js.map +1 -1
- package/dist/device/colorbulb.d.ts +14 -75
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +279 -658
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.d.ts +15 -66
- package/dist/device/contact.d.ts.map +1 -1
- package/dist/device/contact.js +242 -544
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts +19 -88
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +402 -805
- 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 +684 -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 +535 -0
- package/dist/device/fan.js.map +1 -0
- package/dist/device/hub.d.ts +16 -60
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +246 -613
- package/dist/device/hub.js.map +1 -1
- package/dist/device/humidifier.d.ts +11 -66
- package/dist/device/humidifier.d.ts.map +1 -1
- package/dist/device/humidifier.js +232 -593
- 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 +185 -600
- package/dist/device/iosensor.js.map +1 -1
- package/dist/device/lightstrip.d.ts +11 -69
- package/dist/device/lightstrip.d.ts.map +1 -1
- package/dist/device/lightstrip.js +277 -586
- package/dist/device/lightstrip.js.map +1 -1
- package/dist/device/lock.d.ts +16 -63
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +241 -560
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.d.ts +14 -64
- package/dist/device/meter.d.ts.map +1 -1
- package/dist/device/meter.js +181 -593
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.d.ts +14 -65
- package/dist/device/meterplus.d.ts.map +1 -1
- package/dist/device/meterplus.js +170 -593
- 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 +178 -531
- 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 +92 -458
- package/dist/device/plug.js.map +1 -1
- package/dist/device/robotvacuumcleaner.d.ts +12 -63
- package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
- package/dist/device/robotvacuumcleaner.js +197 -521
- package/dist/device/robotvacuumcleaner.js.map +1 -1
- package/dist/device/waterdetector.d.ts +10 -65
- package/dist/device/waterdetector.d.ts.map +1 -1
- package/dist/device/waterdetector.js +139 -495
- package/dist/device/waterdetector.js.map +1 -1
- package/dist/homebridge-ui/public/index.html +22 -16
- package/dist/homebridge-ui/server.js +1 -1
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/irdevice/airconditioner.d.ts +9 -49
- 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 +8 -39
- 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 +7 -36
- 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 +10 -43
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +100 -338
- 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 +330 -0
- package/dist/irdevice/irdevice.js.map +1 -0
- package/dist/irdevice/light.d.ts +12 -45
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +87 -357
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.d.ts +19 -48
- 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 +8 -40
- 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 +7 -36
- 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 +7 -36
- 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 +19 -6
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +310 -169
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +62 -19
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +16 -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 +96 -0
- package/package.json +19 -15
- package/src/custom.d.ts +2 -1
- package/src/device/blindtilt.ts +442 -814
- package/src/device/bot.ts +754 -915
- package/src/device/ceilinglight.ts +255 -633
- package/src/device/colorbulb.ts +294 -685
- package/src/device/contact.ts +277 -571
- package/src/device/curtain.ts +431 -835
- package/src/device/device.ts +709 -0
- package/src/device/fan.ts +591 -0
- package/src/device/hub.ts +286 -644
- package/src/device/humidifier.ts +266 -646
- package/src/device/iosensor.ts +220 -625
- package/src/device/lightstrip.ts +305 -620
- package/src/device/lock.ts +280 -600
- package/src/device/meter.ts +216 -617
- package/src/device/meterplus.ts +205 -619
- package/src/device/motion.ts +206 -556
- package/src/device/plug.ts +107 -490
- package/src/device/robotvacuumcleaner.ts +223 -550
- package/src/device/waterdetector.ts +160 -519
- package/src/homebridge-ui/public/index.html +22 -16
- package/src/homebridge-ui/server.ts +1 -1
- package/src/index.ts +4 -3
- package/src/irdevice/airconditioner.ts +333 -447
- package/src/irdevice/airpurifier.ts +92 -322
- package/src/irdevice/camera.ts +45 -294
- package/src/irdevice/fan.ts +115 -353
- package/src/irdevice/irdevice.ts +346 -0
- package/src/irdevice/light.ts +110 -385
- package/src/irdevice/other.ts +399 -616
- package/src/irdevice/tv.ts +103 -340
- package/src/irdevice/vacuumcleaner.ts +52 -306
- package/src/irdevice/waterheater.ts +53 -311
- package/src/platform.ts +355 -216
- package/src/settings.ts +116 -611
- package/src/utils.ts +642 -1
- package/src/device/waterdetector.json +0 -11
package/dist/device/curtain.js
CHANGED
|
@@ -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
|
|
5
|
-
import { debounceTime, skipWhile, take, tap } from 'rxjs/operators';
|
|
8
|
+
import { deviceBase } from './device.js';
|
|
6
9
|
import { Devices } from '../settings.js';
|
|
7
|
-
import {
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
73
|
-
this.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
|
-
//
|
|
93
|
-
this.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
.
|
|
97
|
-
.
|
|
98
|
-
.
|
|
99
|
-
.
|
|
100
|
-
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
//
|
|
111
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
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.
|
|
141
|
-
accessory.removeService(this.
|
|
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.
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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 (
|
|
174
|
-
this.
|
|
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.
|
|
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
|
|
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(
|
|
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.
|
|
305
|
-
this.debugLog(`${this.device.deviceType}: ${this.CurrentPosition} INCREASING
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
this.
|
|
310
|
-
this.
|
|
311
|
-
this.
|
|
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
|
|
315
|
-
|
|
316
|
-
this.
|
|
317
|
-
this.
|
|
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
|
-
|
|
330
|
-
|
|
331
|
-
|
|
293
|
+
const set_minLux = await this.minLux();
|
|
294
|
+
const set_maxLux = await this.maxLux();
|
|
295
|
+
const spaceBetweenLevels = 9;
|
|
332
296
|
// Brightness
|
|
333
|
-
switch (
|
|
297
|
+
switch (serviceData.lightLevel) {
|
|
334
298
|
case 1:
|
|
335
|
-
this.CurrentAmbientLightLevel =
|
|
336
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${
|
|
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 = (
|
|
340
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${
|
|
341
|
-
` Calculation: ${(
|
|
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 = ((
|
|
345
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${
|
|
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 = ((
|
|
349
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${
|
|
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 = ((
|
|
353
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${
|
|
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 = ((
|
|
357
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${
|
|
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 = ((
|
|
361
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${
|
|
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 = ((
|
|
365
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${
|
|
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 = ((
|
|
369
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${
|
|
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 =
|
|
344
|
+
this.LightSensor.CurrentAmbientLightLevel = set_maxLux;
|
|
374
345
|
this.debugLog();
|
|
375
346
|
}
|
|
376
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${
|
|
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(
|
|
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},`
|
|
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(
|
|
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 &&
|
|
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.
|
|
404
|
-
this.debugLog(`${this.device.deviceType}: ${this.CurrentPosition} INCREASING
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
this.
|
|
409
|
-
this.
|
|
410
|
-
this.
|
|
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
|
|
414
|
-
|
|
415
|
-
this.
|
|
416
|
-
this.
|
|
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
|
-
|
|
430
|
-
|
|
431
|
-
switch (
|
|
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 =
|
|
414
|
+
this.LightSensor.CurrentAmbientLightLevel = set_minLux;
|
|
438
415
|
}
|
|
439
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
416
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
417
|
+
+ ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
440
418
|
}
|
|
441
419
|
// BatteryLevel
|
|
442
|
-
this.BatteryLevel = Number(
|
|
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
|
-
|
|
450
|
-
this.
|
|
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
|
-
|
|
502
|
-
|
|
503
|
-
|
|
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
|
|
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
|
-
|
|
524
|
-
|
|
525
|
-
|
|
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
|
|
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.
|
|
506
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
588
507
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
589
|
-
this.
|
|
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.
|
|
641
|
-
const adjustedMode =
|
|
642
|
-
this.debugLog(`${this.accessory.displayName} 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.
|
|
648
|
-
max: this.
|
|
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
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
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.
|
|
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}
|
|
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}
|
|
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}
|
|
683
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} value: ${value},`
|
|
684
|
+
+ ` CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
|
|
797
685
|
}
|
|
798
|
-
this.
|
|
799
|
-
this.
|
|
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.
|
|
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.
|
|
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.
|
|
844
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
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.
|
|
855
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
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.
|
|
866
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
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}
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
(
|
|
956
|
-
|
|
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
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
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
|
-
|
|
992
|
-
|
|
844
|
+
setPositionMode = 0;
|
|
845
|
+
Mode = 'Default Mode';
|
|
993
846
|
}
|
|
994
847
|
}
|
|
995
848
|
else {
|
|
996
|
-
if (this.device.
|
|
997
|
-
|
|
998
|
-
|
|
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
|
-
|
|
1002
|
-
|
|
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
|
-
|
|
884
|
+
set_minStep = device.curtain?.set_minStep;
|
|
1026
885
|
}
|
|
1027
886
|
else {
|
|
1028
|
-
|
|
887
|
+
set_minStep = 1;
|
|
1029
888
|
}
|
|
1030
|
-
return
|
|
889
|
+
return set_minStep;
|
|
1031
890
|
}
|
|
1032
|
-
minLux() {
|
|
891
|
+
async minLux() {
|
|
892
|
+
let set_minLux;
|
|
1033
893
|
if (this.device.curtain?.set_minLux) {
|
|
1034
|
-
|
|
894
|
+
set_minLux = this.device.curtain?.set_minLux;
|
|
1035
895
|
}
|
|
1036
896
|
else {
|
|
1037
|
-
|
|
897
|
+
set_minLux = 1;
|
|
1038
898
|
}
|
|
1039
|
-
return
|
|
899
|
+
return set_minLux;
|
|
1040
900
|
}
|
|
1041
|
-
maxLux() {
|
|
901
|
+
async maxLux() {
|
|
902
|
+
let set_maxLux;
|
|
1042
903
|
if (this.device.curtain?.set_maxLux) {
|
|
1043
|
-
|
|
904
|
+
set_maxLux = this.device.curtain?.set_maxLux;
|
|
1044
905
|
}
|
|
1045
906
|
else {
|
|
1046
|
-
|
|
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
|
-
|
|
1152
|
-
|
|
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.
|
|
1157
|
-
this.
|
|
1158
|
-
this.
|
|
1159
|
-
|
|
1160
|
-
|
|
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
|
-
|
|
1187
|
-
|
|
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
|