@switchbot/homebridge-switchbot 3.5.0-beta.5 → 3.5.0-beta.50
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 +351 -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 +587 -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 +213 -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 +255 -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 +208 -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 +339 -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 +681 -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 +504 -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 +246 -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 +217 -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 +178 -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 +256 -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 +214 -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 +174 -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 +163 -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 +141 -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 +86 -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 +144 -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 +125 -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/package.json +15 -14
- package/src/custom.d.ts +2 -1
- package/src/device/blindtilt.ts +377 -783
- package/src/device/bot.ts +620 -845
- package/src/device/ceilinglight.ts +226 -608
- package/src/device/colorbulb.ts +268 -657
- package/src/device/contact.ts +233 -554
- package/src/device/curtain.ts +359 -811
- package/src/device/device.ts +709 -0
- package/src/device/fan.ts +553 -0
- package/src/device/hub.ts +273 -625
- package/src/device/humidifier.ts +245 -624
- package/src/device/iosensor.ts +204 -611
- package/src/device/lightstrip.ts +277 -597
- package/src/device/lock.ts +251 -583
- package/src/device/meter.ts +199 -601
- package/src/device/meterplus.ts +188 -603
- package/src/device/motion.ts +160 -542
- package/src/device/plug.ts +96 -481
- package/src/device/robotvacuumcleaner.ts +165 -478
- package/src/device/waterdetector.ts +142 -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/bot.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
/* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* bot.ts: @switchbot/homebridge-switchbot.
|
|
4
|
+
*/
|
|
1
5
|
import { request } from 'undici';
|
|
2
|
-
import {
|
|
6
|
+
import { deviceBase } from './device.js';
|
|
3
7
|
import { interval, Subject } from 'rxjs';
|
|
4
8
|
import { debounceTime, skipWhile, take, tap } from 'rxjs/operators';
|
|
5
9
|
import { Devices } from '../settings.js';
|
|
@@ -8,93 +12,51 @@ import { Devices } from '../settings.js';
|
|
|
8
12
|
* An instance of this class is created for each accessory your platform registers
|
|
9
13
|
* Each accessory may expose multiple services of different service types.
|
|
10
14
|
*/
|
|
11
|
-
export class Bot {
|
|
15
|
+
export class Bot extends deviceBase {
|
|
12
16
|
platform;
|
|
13
|
-
accessory;
|
|
14
|
-
device;
|
|
15
|
-
api;
|
|
16
|
-
log;
|
|
17
|
-
config;
|
|
18
|
-
hap;
|
|
19
17
|
// Services
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
// Characteristic Values
|
|
32
|
-
On;
|
|
33
|
-
BatteryLevel;
|
|
34
|
-
FirmwareRevision;
|
|
35
|
-
StatusLowBattery;
|
|
36
|
-
// OpenAPI Status
|
|
37
|
-
OpenAPI_On;
|
|
38
|
-
OpenAPI_BatteryLevel;
|
|
39
|
-
OpenAPI_FirmwareRevision;
|
|
40
|
-
// BLE Status
|
|
41
|
-
BLE_On;
|
|
42
|
-
BLE_Mode;
|
|
43
|
-
BLE_BatteryLevel;
|
|
44
|
-
//BLE Others
|
|
45
|
-
BLE_IsConnected;
|
|
18
|
+
Battery;
|
|
19
|
+
Switch;
|
|
20
|
+
GarageDoor;
|
|
21
|
+
Door;
|
|
22
|
+
Window;
|
|
23
|
+
WindowCovering;
|
|
24
|
+
Lock;
|
|
25
|
+
Faucet;
|
|
26
|
+
Fan;
|
|
27
|
+
StatefulProgrammableSwitch;
|
|
28
|
+
Outlet;
|
|
46
29
|
// Config
|
|
47
30
|
botMode;
|
|
48
31
|
allowPush;
|
|
49
32
|
doublePress;
|
|
50
|
-
scanDuration;
|
|
51
33
|
botDeviceType;
|
|
52
34
|
pushRatePress;
|
|
53
|
-
deviceLogging;
|
|
54
35
|
multiPressCount;
|
|
55
|
-
deviceRefreshRate;
|
|
56
36
|
// Updates
|
|
57
37
|
botUpdateInProgress;
|
|
58
38
|
doBotUpdate;
|
|
59
|
-
// Connection
|
|
60
|
-
OpenAPI;
|
|
61
|
-
BLE;
|
|
62
39
|
constructor(platform, accessory, device) {
|
|
40
|
+
super(platform, accessory, device);
|
|
63
41
|
this.platform = platform;
|
|
64
|
-
this.accessory = accessory;
|
|
65
|
-
this.device = device;
|
|
66
|
-
this.api = this.platform.api;
|
|
67
|
-
this.log = this.platform.log;
|
|
68
|
-
this.config = this.platform.config;
|
|
69
|
-
this.hap = this.api.hap;
|
|
70
|
-
// Connection
|
|
71
|
-
this.BLE = this.device.connectionType === 'BLE' || this.device.connectionType === 'BLE/OpenAPI';
|
|
72
|
-
this.OpenAPI = this.device.connectionType === 'OpenAPI' || this.device.connectionType === 'BLE/OpenAPI';
|
|
73
42
|
// default placeholders
|
|
74
|
-
this.
|
|
75
|
-
this.deviceType(device);
|
|
76
|
-
this.scan(device);
|
|
77
|
-
this.refreshRate(device);
|
|
78
|
-
this.PressOrSwitch(device);
|
|
79
|
-
this.allowPushChanges(device);
|
|
80
|
-
this.deviceContext();
|
|
81
|
-
this.DoublePress(device);
|
|
82
|
-
this.deviceConfig(device);
|
|
83
|
-
this.multiPressCount = 0;
|
|
43
|
+
this.getBotConfigSettings(device);
|
|
84
44
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
85
45
|
this.doBotUpdate = new Subject();
|
|
86
46
|
this.botUpdateInProgress = false;
|
|
87
|
-
//
|
|
88
|
-
this.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
.
|
|
92
|
-
|
|
93
|
-
.setCharacteristic(this.hap.Characteristic.Model, 'SWITCHBOT-BOT-S1')
|
|
94
|
-
.setCharacteristic(this.hap.Characteristic.SerialNumber, device.deviceId)
|
|
95
|
-
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, accessory.context.FirmwareRevision);
|
|
47
|
+
// Initialize Battery property
|
|
48
|
+
this.Battery = {
|
|
49
|
+
Service: accessory.getService(this.hap.Service.Battery),
|
|
50
|
+
BatteryLevel: accessory.context.BatteryLevel || 100,
|
|
51
|
+
StatusLowBattery: accessory.context.StatusLowBattery || this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL,
|
|
52
|
+
};
|
|
96
53
|
// deviceType
|
|
97
54
|
if (this.botDeviceType === 'switch') {
|
|
55
|
+
// Initialize Switch property
|
|
56
|
+
this.Switch = {
|
|
57
|
+
Service: accessory.getService(this.hap.Service.Switch),
|
|
58
|
+
On: accessory.context.On || false,
|
|
59
|
+
};
|
|
98
60
|
this.removeFanService(accessory);
|
|
99
61
|
this.removeLockService(accessory);
|
|
100
62
|
this.removeDoorService(accessory);
|
|
@@ -106,16 +68,18 @@ export class Bot {
|
|
|
106
68
|
this.removeStatefulProgrammableSwitchService(accessory);
|
|
107
69
|
// Add switchService
|
|
108
70
|
const switchService = `${accessory.displayName} Switch`;
|
|
109
|
-
(this.
|
|
71
|
+
(this.Switch.Service = accessory.getService(this.hap.Service.Switch)
|
|
110
72
|
|| accessory.addService(this.hap.Service.Switch)), switchService;
|
|
111
73
|
this.debugWarnLog(`${this.device.deviceType}: ${accessory.displayName} Displaying as Switch`);
|
|
112
|
-
this.
|
|
113
|
-
|
|
114
|
-
this.switchService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
115
|
-
}
|
|
116
|
-
this.switchService.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
|
|
74
|
+
this.Switch.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
75
|
+
this.Switch.Service.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
|
|
117
76
|
}
|
|
118
77
|
else if (this.botDeviceType === 'garagedoor') {
|
|
78
|
+
// Initialize Switch property
|
|
79
|
+
this.GarageDoor = {
|
|
80
|
+
Service: accessory.getService(this.hap.Service.GarageDoorOpener),
|
|
81
|
+
On: accessory.context.On || false,
|
|
82
|
+
};
|
|
119
83
|
this.removeFanService(accessory);
|
|
120
84
|
this.removeLockService(accessory);
|
|
121
85
|
this.removeDoorService(accessory);
|
|
@@ -127,17 +91,19 @@ export class Bot {
|
|
|
127
91
|
this.removeStatefulProgrammableSwitchService(accessory);
|
|
128
92
|
// Add garageDoorService
|
|
129
93
|
const garageDoorService = `${accessory.displayName} Garage Door Opener`;
|
|
130
|
-
(this.
|
|
94
|
+
(this.GarageDoor.Service = accessory.getService(this.hap.Service.GarageDoorOpener)
|
|
131
95
|
|| accessory.addService(this.hap.Service.GarageDoorOpener)), garageDoorService;
|
|
132
96
|
this.debugWarnLog(`${this.device.deviceType}: ${accessory.displayName} Displaying as Garage Door Opener`);
|
|
133
|
-
this.
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
this.garageDoorService.getCharacteristic(this.hap.Characteristic.TargetDoorState).onSet(this.OnSet.bind(this));
|
|
138
|
-
this.garageDoorService.setCharacteristic(this.hap.Characteristic.ObstructionDetected, false);
|
|
97
|
+
this.GarageDoor.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
98
|
+
this.GarageDoor.Service.getCharacteristic(this.hap.Characteristic.TargetDoorState).onSet(this.OnSet.bind(this));
|
|
99
|
+
this.GarageDoor.Service.setCharacteristic(this.hap.Characteristic.ObstructionDetected, false);
|
|
139
100
|
}
|
|
140
101
|
else if (this.botDeviceType === 'door') {
|
|
102
|
+
// Initialize Switch property
|
|
103
|
+
this.Door = {
|
|
104
|
+
Service: accessory.getService(this.hap.Service.Door),
|
|
105
|
+
On: accessory.context.On || false,
|
|
106
|
+
};
|
|
141
107
|
this.removeFanService(accessory);
|
|
142
108
|
this.removeLockService(accessory);
|
|
143
109
|
this.removeOutletService(accessory);
|
|
@@ -149,14 +115,11 @@ export class Bot {
|
|
|
149
115
|
this.removeStatefulProgrammableSwitchService(accessory);
|
|
150
116
|
// Add doorService
|
|
151
117
|
const doorService = `${accessory.displayName} Door`;
|
|
152
|
-
(this.
|
|
118
|
+
(this.Door.Service = accessory.getService(this.hap.Service.Door)
|
|
153
119
|
|| accessory.addService(this.hap.Service.Door)), doorService;
|
|
154
120
|
this.debugWarnLog(`${this.device.deviceType}: ${accessory.displayName} Displaying as Door`);
|
|
155
|
-
this.
|
|
156
|
-
|
|
157
|
-
this.doorService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
158
|
-
}
|
|
159
|
-
this.doorService
|
|
121
|
+
this.Door.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
122
|
+
this.Door.Service
|
|
160
123
|
.getCharacteristic(this.hap.Characteristic.TargetPosition)
|
|
161
124
|
.setProps({
|
|
162
125
|
validValues: [0, 100],
|
|
@@ -165,9 +128,14 @@ export class Bot {
|
|
|
165
128
|
minStep: 100,
|
|
166
129
|
})
|
|
167
130
|
.onSet(this.OnSet.bind(this));
|
|
168
|
-
this.
|
|
131
|
+
this.Door.Service.setCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
169
132
|
}
|
|
170
133
|
else if (this.botDeviceType === 'window') {
|
|
134
|
+
// Initialize Switch property
|
|
135
|
+
this.Window = {
|
|
136
|
+
Service: accessory.getService(this.hap.Service.Window),
|
|
137
|
+
On: accessory.context.On || false,
|
|
138
|
+
};
|
|
171
139
|
this.removeFanService(accessory);
|
|
172
140
|
this.removeLockService(accessory);
|
|
173
141
|
this.removeDoorService(accessory);
|
|
@@ -179,14 +147,11 @@ export class Bot {
|
|
|
179
147
|
this.removeStatefulProgrammableSwitchService(accessory);
|
|
180
148
|
// Add windowService
|
|
181
149
|
const windowService = `${accessory.displayName} Window`;
|
|
182
|
-
(this.
|
|
150
|
+
(this.Window.Service = accessory.getService(this.hap.Service.Window)
|
|
183
151
|
|| accessory.addService(this.hap.Service.Window)), windowService;
|
|
184
152
|
this.debugWarnLog(`${this.device.deviceType}: ${accessory.displayName} Displaying as Window`);
|
|
185
|
-
this.
|
|
186
|
-
|
|
187
|
-
this.windowService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
188
|
-
}
|
|
189
|
-
this.windowService
|
|
153
|
+
this.Window.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
154
|
+
this.Window.Service
|
|
190
155
|
.getCharacteristic(this.hap.Characteristic.TargetPosition)
|
|
191
156
|
.setProps({
|
|
192
157
|
validValues: [0, 100],
|
|
@@ -195,9 +160,14 @@ export class Bot {
|
|
|
195
160
|
minStep: 100,
|
|
196
161
|
})
|
|
197
162
|
.onSet(this.OnSet.bind(this));
|
|
198
|
-
this.
|
|
163
|
+
this.Window.Service.setCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
199
164
|
}
|
|
200
165
|
else if (this.botDeviceType === 'windowcovering') {
|
|
166
|
+
// Initialize Switch property
|
|
167
|
+
this.WindowCovering = {
|
|
168
|
+
Service: accessory.getService(this.hap.Service.WindowCovering),
|
|
169
|
+
On: accessory.context.On || false,
|
|
170
|
+
};
|
|
201
171
|
this.removeFanService(accessory);
|
|
202
172
|
this.removeLockService(accessory);
|
|
203
173
|
this.removeDoorService(accessory);
|
|
@@ -209,14 +179,11 @@ export class Bot {
|
|
|
209
179
|
this.removeStatefulProgrammableSwitchService(accessory);
|
|
210
180
|
// Add windowCoveringService
|
|
211
181
|
const windowCoveringService = `${accessory.displayName} Window Covering`;
|
|
212
|
-
(this.
|
|
182
|
+
(this.WindowCovering.Service = accessory.getService(this.hap.Service.WindowCovering)
|
|
213
183
|
|| accessory.addService(this.hap.Service.WindowCovering)), windowCoveringService;
|
|
214
184
|
this.debugWarnLog(`${this.device.deviceType}: ${accessory.displayName} Displaying as Window Covering`);
|
|
215
|
-
this.
|
|
216
|
-
|
|
217
|
-
this.windowCoveringService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
218
|
-
}
|
|
219
|
-
this.windowCoveringService
|
|
185
|
+
this.WindowCovering.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
186
|
+
this.WindowCovering.Service
|
|
220
187
|
.getCharacteristic(this.hap.Characteristic.TargetPosition)
|
|
221
188
|
.setProps({
|
|
222
189
|
validValues: [0, 100],
|
|
@@ -225,9 +192,14 @@ export class Bot {
|
|
|
225
192
|
minStep: 100,
|
|
226
193
|
})
|
|
227
194
|
.onSet(this.OnSet.bind(this));
|
|
228
|
-
this.
|
|
195
|
+
this.WindowCovering.Service.setCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
229
196
|
}
|
|
230
197
|
else if (this.botDeviceType === 'lock') {
|
|
198
|
+
// Initialize Switch property
|
|
199
|
+
this.Lock = {
|
|
200
|
+
Service: accessory.getService(this.hap.Service.LockMechanism),
|
|
201
|
+
On: accessory.context.On || false,
|
|
202
|
+
};
|
|
231
203
|
this.removeFanService(accessory);
|
|
232
204
|
this.removeDoorService(accessory);
|
|
233
205
|
this.removeOutletService(accessory);
|
|
@@ -239,16 +211,18 @@ export class Bot {
|
|
|
239
211
|
this.removeStatefulProgrammableSwitchService(accessory);
|
|
240
212
|
// Add lockService
|
|
241
213
|
const lockService = `${accessory.displayName} Lock`;
|
|
242
|
-
(this.
|
|
214
|
+
(this.Lock.Service = accessory.getService(this.hap.Service.LockMechanism)
|
|
243
215
|
|| accessory.addService(this.hap.Service.LockMechanism)), lockService;
|
|
244
216
|
this.debugWarnLog(`${this.device.deviceType}: ${accessory.displayName} Displaying as Lock`);
|
|
245
|
-
this.
|
|
246
|
-
|
|
247
|
-
this.lockService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
248
|
-
}
|
|
249
|
-
this.lockService.getCharacteristic(this.hap.Characteristic.LockTargetState).onSet(this.OnSet.bind(this));
|
|
217
|
+
this.Lock.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
218
|
+
this.Lock.Service.getCharacteristic(this.hap.Characteristic.LockTargetState).onSet(this.OnSet.bind(this));
|
|
250
219
|
}
|
|
251
220
|
else if (this.botDeviceType === 'faucet') {
|
|
221
|
+
// Initialize Switch property
|
|
222
|
+
this.Faucet = {
|
|
223
|
+
Service: accessory.getService(this.hap.Service.Faucet),
|
|
224
|
+
On: accessory.context.On || false,
|
|
225
|
+
};
|
|
252
226
|
this.removeFanService(accessory);
|
|
253
227
|
this.removeLockService(accessory);
|
|
254
228
|
this.removeDoorService(accessory);
|
|
@@ -260,16 +234,18 @@ export class Bot {
|
|
|
260
234
|
this.removeStatefulProgrammableSwitchService(accessory);
|
|
261
235
|
// Add faucetService
|
|
262
236
|
const faucetService = `${accessory.displayName} Faucet`;
|
|
263
|
-
(this.
|
|
237
|
+
(this.Faucet.Service = accessory.getService(this.hap.Service.Faucet)
|
|
264
238
|
|| accessory.addService(this.hap.Service.Faucet)), faucetService;
|
|
265
239
|
this.debugWarnLog(`${this.device.deviceType}: ${accessory.displayName} Displaying as Faucet`);
|
|
266
|
-
this.
|
|
267
|
-
|
|
268
|
-
this.faucetService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
269
|
-
}
|
|
270
|
-
this.faucetService.getCharacteristic(this.hap.Characteristic.Active).onSet(this.OnSet.bind(this));
|
|
240
|
+
this.Faucet.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
241
|
+
this.Faucet.Service.getCharacteristic(this.hap.Characteristic.Active).onSet(this.OnSet.bind(this));
|
|
271
242
|
}
|
|
272
243
|
else if (this.botDeviceType === 'fan') {
|
|
244
|
+
// Initialize Switch property
|
|
245
|
+
this.Fan = {
|
|
246
|
+
Service: accessory.getService(this.hap.Service.Fanv2),
|
|
247
|
+
On: accessory.context.On || false,
|
|
248
|
+
};
|
|
273
249
|
this.removeLockService(accessory);
|
|
274
250
|
this.removeDoorService(accessory);
|
|
275
251
|
this.removeFaucetService(accessory);
|
|
@@ -281,16 +257,18 @@ export class Bot {
|
|
|
281
257
|
this.removeStatefulProgrammableSwitchService(accessory);
|
|
282
258
|
// Add fanService
|
|
283
259
|
const fanService = `${accessory.displayName} Fan`;
|
|
284
|
-
(this.
|
|
285
|
-
|| accessory.addService(this.hap.Service.
|
|
260
|
+
(this.Fan.Service = accessory.getService(this.hap.Service.Fanv2)
|
|
261
|
+
|| accessory.addService(this.hap.Service.Fanv2)), fanService;
|
|
286
262
|
this.debugWarnLog(`${this.device.deviceType}: ${accessory.displayName} Displaying as Fan`);
|
|
287
|
-
this.
|
|
288
|
-
|
|
289
|
-
this.fanService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
290
|
-
}
|
|
291
|
-
this.fanService.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
|
|
263
|
+
this.Fan.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
264
|
+
this.Fan.Service.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
|
|
292
265
|
}
|
|
293
266
|
else if (this.botDeviceType === 'stateful') {
|
|
267
|
+
// Initialize Switch property
|
|
268
|
+
this.StatefulProgrammableSwitch = {
|
|
269
|
+
Service: accessory.getService(this.hap.Service.StatefulProgrammableSwitch),
|
|
270
|
+
On: accessory.context.On || false,
|
|
271
|
+
};
|
|
294
272
|
this.removeFanService(accessory);
|
|
295
273
|
this.removeLockService(accessory);
|
|
296
274
|
this.removeDoorService(accessory);
|
|
@@ -302,18 +280,20 @@ export class Bot {
|
|
|
302
280
|
this.removeWindowCoveringService(accessory);
|
|
303
281
|
// Add statefulProgrammableSwitchService
|
|
304
282
|
const statefulProgrammableSwitchService = `${accessory.displayName} Stateful Programmable Switch`;
|
|
305
|
-
(this.
|
|
283
|
+
(this.StatefulProgrammableSwitch.Service = accessory.getService(this.hap.Service.StatefulProgrammableSwitch) ||
|
|
306
284
|
accessory.addService(this.hap.Service.StatefulProgrammableSwitch)), statefulProgrammableSwitchService;
|
|
307
285
|
this.debugWarnLog(`${this.device.deviceType}: ${accessory.displayName} Displaying as Stateful Programmable Switch`);
|
|
308
|
-
this.
|
|
309
|
-
|
|
310
|
-
this.statefulProgrammableSwitchService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
311
|
-
}
|
|
312
|
-
this.statefulProgrammableSwitchService
|
|
286
|
+
this.StatefulProgrammableSwitch.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
287
|
+
this.StatefulProgrammableSwitch.Service
|
|
313
288
|
.getCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState)
|
|
314
289
|
.onSet(this.OnSet.bind(this));
|
|
315
290
|
}
|
|
316
291
|
else {
|
|
292
|
+
// Initialize Switch property
|
|
293
|
+
this.Outlet = {
|
|
294
|
+
Service: accessory.getService(this.hap.Service.Outlet),
|
|
295
|
+
On: accessory.context.On || false,
|
|
296
|
+
};
|
|
317
297
|
this.removeFanService(accessory);
|
|
318
298
|
this.removeLockService(accessory);
|
|
319
299
|
this.removeDoorService(accessory);
|
|
@@ -325,24 +305,20 @@ export class Bot {
|
|
|
325
305
|
this.removeStatefulProgrammableSwitchService(accessory);
|
|
326
306
|
// Add outletService
|
|
327
307
|
const outletService = `${accessory.displayName} Outlet`;
|
|
328
|
-
(this.
|
|
308
|
+
(this.Outlet.Service = accessory.getService(this.hap.Service.Outlet)
|
|
329
309
|
|| accessory.addService(this.hap.Service.Outlet)), outletService;
|
|
330
310
|
this.debugWarnLog(`${this.device.deviceType}: ${accessory.displayName} Displaying as Outlet`);
|
|
331
|
-
this.
|
|
332
|
-
|
|
333
|
-
this.outletService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
334
|
-
}
|
|
335
|
-
this.outletService.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
|
|
311
|
+
this.Outlet.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
312
|
+
this.Outlet.Service.getCharacteristic(this.hap.Characteristic.On).onSet(this.OnSet.bind(this));
|
|
336
313
|
}
|
|
314
|
+
// Retrieve initial values and updateHomekit
|
|
315
|
+
this.refreshStatus();
|
|
337
316
|
// batteryService
|
|
338
317
|
const batteryService = `${accessory.displayName} Battery`;
|
|
339
|
-
(this.
|
|
318
|
+
(this.Battery.Service = this.accessory.getService(this.hap.Service.Battery)
|
|
340
319
|
|| accessory.addService(this.hap.Service.Battery)), batteryService;
|
|
341
|
-
this.
|
|
342
|
-
|
|
343
|
-
this.batteryService.addCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Battery`);
|
|
344
|
-
}
|
|
345
|
-
this.batteryService.setCharacteristic(this.hap.Characteristic.ChargingState, this.hap.Characteristic.ChargingState.NOT_CHARGEABLE);
|
|
320
|
+
this.Battery.Service.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Battery`);
|
|
321
|
+
this.Battery.Service.setCharacteristic(this.hap.Characteristic.ChargingState, this.hap.Characteristic.ChargingState.NOT_CHARGEABLE);
|
|
346
322
|
// Retrieve initial values and updateHomekit
|
|
347
323
|
this.updateHomeKitCharacteristics();
|
|
348
324
|
// Start an update interval
|
|
@@ -352,19 +328,21 @@ export class Bot {
|
|
|
352
328
|
await this.refreshStatus();
|
|
353
329
|
});
|
|
354
330
|
//regisiter webhook event handler
|
|
355
|
-
if (
|
|
356
|
-
this.
|
|
331
|
+
if (device.webhook) {
|
|
332
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
|
|
357
333
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
|
|
358
334
|
try {
|
|
359
335
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
|
|
360
336
|
const { power, battery, deviceMode } = context;
|
|
361
|
-
const {
|
|
337
|
+
const { botMode } = this;
|
|
338
|
+
const On = await this.getOn();
|
|
339
|
+
const { BatteryLevel } = this.Battery;
|
|
362
340
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
|
|
363
341
|
'(power, battery, deviceMode) = ' +
|
|
364
342
|
`Webhook:(${power}, ${battery}, ${deviceMode}), ` +
|
|
365
343
|
`current:(${On}, ${BatteryLevel}, ${botMode})`);
|
|
366
|
-
this.
|
|
367
|
-
this.BatteryLevel = battery;
|
|
344
|
+
await this.setOn(power);
|
|
345
|
+
this.Battery.BatteryLevel = battery;
|
|
368
346
|
this.botMode = deviceMode;
|
|
369
347
|
this.updateHomeKitCharacteristics();
|
|
370
348
|
}
|
|
@@ -402,80 +380,77 @@ export class Bot {
|
|
|
402
380
|
});
|
|
403
381
|
}
|
|
404
382
|
/**
|
|
405
|
-
* Parse the device status from the
|
|
383
|
+
* Parse the device status from the SwitchBotBLE API
|
|
406
384
|
*/
|
|
407
|
-
async
|
|
408
|
-
if (!this.device.enableCloudService && this.OpenAPI) {
|
|
409
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} parseStatus enableCloudService: ${this.device.enableCloudService}`);
|
|
410
|
-
}
|
|
411
|
-
else if (this.BLE) {
|
|
412
|
-
await this.BLEparseStatus();
|
|
413
|
-
}
|
|
414
|
-
else if (this.OpenAPI && this.platform.config.credentials?.token) {
|
|
415
|
-
await this.openAPIparseStatus();
|
|
416
|
-
}
|
|
417
|
-
else {
|
|
418
|
-
await this.offlineOff();
|
|
419
|
-
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`);
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
async BLEparseStatus() {
|
|
385
|
+
async BLEparseStatus(serviceData) {
|
|
423
386
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
|
|
424
387
|
// BLEmode (true if Switch Mode) | (false if Press Mode)
|
|
425
|
-
if (
|
|
426
|
-
this.accessory.context.On = this.
|
|
427
|
-
if (this.
|
|
428
|
-
this.
|
|
388
|
+
if (serviceData.mode) {
|
|
389
|
+
this.accessory.context.On = await this.getOn();
|
|
390
|
+
if (this.getOn() === undefined) {
|
|
391
|
+
this.setOn(Boolean(serviceData.state));
|
|
429
392
|
}
|
|
430
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Switch Mode
|
|
393
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Switch Mode,`
|
|
394
|
+
+ ` mode: ${serviceData.mode}, On: ${this.accessory.context.On}`);
|
|
431
395
|
}
|
|
432
396
|
else {
|
|
433
|
-
this.
|
|
434
|
-
this.accessory.context.On = this.
|
|
435
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Press Mode
|
|
397
|
+
this.setOn(false);
|
|
398
|
+
this.accessory.context.On = await this.getOn();
|
|
399
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Press Mode,`
|
|
400
|
+
+ ` mode: ${serviceData.mode}, On: ${this.accessory.context.On}`);
|
|
436
401
|
}
|
|
437
|
-
this.BatteryLevel = Number(
|
|
438
|
-
if (this.BatteryLevel < 10) {
|
|
439
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
402
|
+
this.Battery.BatteryLevel = Number(serviceData.battery);
|
|
403
|
+
if (this.Battery.BatteryLevel < 10) {
|
|
404
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
440
405
|
}
|
|
441
406
|
else {
|
|
442
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
407
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
443
408
|
}
|
|
444
|
-
if (Number.isNaN(this.BatteryLevel)) {
|
|
445
|
-
this.BatteryLevel = 100;
|
|
409
|
+
if (Number.isNaN(this.Battery.BatteryLevel)) {
|
|
410
|
+
this.Battery.BatteryLevel = 100;
|
|
446
411
|
}
|
|
447
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel},`
|
|
448
|
-
+ ` StatusLowBattery: ${this.StatusLowBattery}`);
|
|
412
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},`
|
|
413
|
+
+ ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
449
414
|
}
|
|
450
|
-
|
|
415
|
+
/**
|
|
416
|
+
* Parse the device status from the SwitchBot OpenAPI
|
|
417
|
+
*/
|
|
418
|
+
async openAPIparseStatus(deviceStatus) {
|
|
451
419
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
|
|
452
420
|
if (this.botMode === 'press') {
|
|
453
|
-
this.
|
|
454
|
-
this.accessory.context.On = this.
|
|
421
|
+
this.setOn(false);
|
|
422
|
+
this.accessory.context.On = await this.getOn();
|
|
455
423
|
}
|
|
456
424
|
else {
|
|
457
|
-
this.accessory.context.On = this.
|
|
458
|
-
if (this.
|
|
459
|
-
this.
|
|
425
|
+
this.accessory.context.On = await this.getOn();
|
|
426
|
+
if (this.getOn() === undefined) {
|
|
427
|
+
this.setOn(false);
|
|
460
428
|
}
|
|
461
429
|
}
|
|
462
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
430
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.accessory.context.On}`);
|
|
463
431
|
// Battery
|
|
464
|
-
this.BatteryLevel = Number(
|
|
465
|
-
if (this.BatteryLevel < 10) {
|
|
466
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
432
|
+
this.Battery.BatteryLevel = Number(deviceStatus.body.battery);
|
|
433
|
+
if (this.Battery.BatteryLevel < 10) {
|
|
434
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
467
435
|
}
|
|
468
436
|
else {
|
|
469
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
437
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
438
|
+
}
|
|
439
|
+
if (Number.isNaN(this.Battery.BatteryLevel)) {
|
|
440
|
+
this.Battery.BatteryLevel = 100;
|
|
441
|
+
}
|
|
442
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},`
|
|
443
|
+
+ ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
444
|
+
// Firmware Version
|
|
445
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${deviceStatus.body.version}`);
|
|
446
|
+
if (deviceStatus.body.version) {
|
|
447
|
+
this.accessory.context.version = deviceStatus.body.version.toString();
|
|
448
|
+
this.accessory
|
|
449
|
+
.getService(this.hap.Service.AccessoryInformation)
|
|
450
|
+
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
|
|
451
|
+
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
452
|
+
.updateValue(this.accessory.context.version);
|
|
470
453
|
}
|
|
471
|
-
if (Number.isNaN(this.BatteryLevel)) {
|
|
472
|
-
this.BatteryLevel = 100;
|
|
473
|
-
}
|
|
474
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel},`
|
|
475
|
-
+ ` StatusLowBattery: ${this.StatusLowBattery}`);
|
|
476
|
-
// FirmwareRevision
|
|
477
|
-
this.FirmwareRevision = this.OpenAPI_FirmwareRevision;
|
|
478
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
479
454
|
}
|
|
480
455
|
/**
|
|
481
456
|
* Asks the SwitchBot API for the latest device information
|
|
@@ -509,99 +484,42 @@ export class Bot {
|
|
|
509
484
|
// Start to monitor advertisement packets
|
|
510
485
|
(async () => {
|
|
511
486
|
// Start to monitor advertisement packets
|
|
512
|
-
await switchbot.startScan({
|
|
513
|
-
model: 'H',
|
|
514
|
-
id: this.device.bleMac,
|
|
515
|
-
});
|
|
487
|
+
await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
|
|
516
488
|
// Set an event handler
|
|
517
489
|
switchbot.onadvertisement = (ad) => {
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
490
|
+
if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
|
|
491
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
|
|
492
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
|
|
521
493
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
522
|
-
this.BLE_Mode = ad.serviceData.mode;
|
|
523
|
-
this.BLE_On = ad.serviceData.state;
|
|
524
|
-
this.BLE_BatteryLevel = ad.serviceData.battery;
|
|
525
494
|
}
|
|
526
495
|
else {
|
|
527
496
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
528
497
|
}
|
|
529
498
|
};
|
|
530
|
-
// Wait
|
|
499
|
+
// Wait 10 seconds
|
|
531
500
|
await switchbot.wait(this.scanDuration * 1000);
|
|
532
501
|
// Stop to monitor
|
|
533
502
|
await switchbot.stopScan();
|
|
534
503
|
// Update HomeKit
|
|
535
|
-
await this.BLEparseStatus();
|
|
504
|
+
await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
|
|
536
505
|
await this.updateHomeKitCharacteristics();
|
|
537
506
|
})();
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
model: 'H',
|
|
542
|
-
id: this.device.bleMac,
|
|
543
|
-
})
|
|
544
|
-
.then(async () => {
|
|
545
|
-
// Set an event handler
|
|
546
|
-
switchbot.onadvertisement = async (ad: ad) => {
|
|
547
|
-
this.debugLog(
|
|
548
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
|
|
549
|
-
` BLE Address Found: ${ad.address}`,
|
|
550
|
-
);
|
|
551
|
-
this.BLE_Mode = ad.serviceData.mode;
|
|
552
|
-
this.BLE_On = ad.serviceData.state;
|
|
553
|
-
this.BLE_BatteryLevel = ad.serviceData.battery;
|
|
554
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
555
|
-
this.debugLog(
|
|
556
|
-
`${this.device.deviceType}: ${this.accessory.displayName}, model: ${ad.serviceData.model}, modelName: ` +
|
|
557
|
-
`${ad.serviceData.modelName}, mode: ${ad.serviceData.mode}, state: ${ad.serviceData.state}, battery: ${ad.serviceData.battery}`,
|
|
558
|
-
);
|
|
559
|
-
|
|
560
|
-
if (ad.serviceData) {
|
|
561
|
-
this.BLE_IsConnected = true;
|
|
562
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
563
|
-
await this.stopScanning(switchbot);
|
|
564
|
-
} else {
|
|
565
|
-
this.BLE_IsConnected = false;
|
|
566
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
567
|
-
}
|
|
568
|
-
};
|
|
569
|
-
// Wait
|
|
570
|
-
return await sleep(this.scanDuration * 1000);
|
|
571
|
-
})
|
|
572
|
-
.then(async () => {
|
|
573
|
-
// Stop to monitor
|
|
574
|
-
await this.stopScanning(switchbot);
|
|
575
|
-
})
|
|
576
|
-
.catch(async (e: any) => {
|
|
577
|
-
this.apiError(e);
|
|
578
|
-
this.errorLog(
|
|
579
|
-
`${this.device.deviceType}: ${this.accessory.displayName} failed BLERefreshStatus with ${this.device.connectionType}` +
|
|
580
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
581
|
-
);
|
|
582
|
-
await this.BLERefreshConnection(switchbot);
|
|
583
|
-
});
|
|
584
|
-
} else {
|
|
585
|
-
await this.BLERefreshConnection(switchbot);
|
|
586
|
-
}*/
|
|
507
|
+
if (switchbot === undefined) {
|
|
508
|
+
await this.BLERefreshConnection(switchbot);
|
|
509
|
+
}
|
|
587
510
|
}
|
|
588
511
|
async openAPIRefreshStatus() {
|
|
589
512
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
|
|
590
513
|
try {
|
|
591
|
-
const { body, statusCode } = await
|
|
592
|
-
headers: this.platform.generateHeaders(),
|
|
593
|
-
});
|
|
514
|
+
const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
|
|
594
515
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
|
|
595
516
|
const deviceStatus = await body.json();
|
|
596
517
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
597
518
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
598
519
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
599
|
-
this.
|
|
520
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
600
521
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
601
|
-
this.
|
|
602
|
-
this.OpenAPI_BatteryLevel = deviceStatus.body.battery;
|
|
603
|
-
this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
|
|
604
|
-
this.openAPIparseStatus();
|
|
522
|
+
this.openAPIparseStatus(deviceStatus);
|
|
605
523
|
this.updateHomeKitCharacteristics();
|
|
606
524
|
}
|
|
607
525
|
else {
|
|
@@ -646,8 +564,9 @@ export class Bot {
|
|
|
646
564
|
}
|
|
647
565
|
async BLEpushChanges() {
|
|
648
566
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`);
|
|
649
|
-
|
|
650
|
-
|
|
567
|
+
const On = await this.getOn();
|
|
568
|
+
if (On !== this.accessory.context.On || this.allowPush) {
|
|
569
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges On: ${On} OnCached: ${this.accessory.context.On}`);
|
|
651
570
|
const switchbot = await this.platform.connectBLE();
|
|
652
571
|
// Convert to BLE Address
|
|
653
572
|
this.device.bleMac = this.device
|
|
@@ -661,20 +580,22 @@ export class Bot {
|
|
|
661
580
|
switchbot
|
|
662
581
|
.discover({ model: 'H', quick: true, id: this.device.bleMac })
|
|
663
582
|
.then(async (device_list) => {
|
|
664
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${
|
|
583
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${On}`);
|
|
665
584
|
return await device_list[0].press({ id: this.device.bleMac });
|
|
666
585
|
})
|
|
667
586
|
.then(() => {
|
|
668
587
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
669
|
-
this.
|
|
588
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
589
|
+
+ `On: ${On} sent over BLE, sent successfully`);
|
|
590
|
+
this.accessory.context.On = On;
|
|
670
591
|
setTimeout(() => {
|
|
671
592
|
if (this.botDeviceType === 'switch') {
|
|
672
|
-
this.
|
|
593
|
+
this.Switch.Service.getCharacteristic(this.hap.Characteristic.On).updateValue(On);
|
|
673
594
|
}
|
|
674
595
|
else {
|
|
675
|
-
this.
|
|
596
|
+
this.Outlet.Service.getCharacteristic(this.hap.Characteristic.On).updateValue(On);
|
|
676
597
|
}
|
|
677
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${
|
|
598
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${On}, Switch Timeout`);
|
|
678
599
|
}, 500);
|
|
679
600
|
})
|
|
680
601
|
.catch(async (e) => {
|
|
@@ -689,11 +610,11 @@ export class Bot {
|
|
|
689
610
|
switchbot
|
|
690
611
|
.discover({ model: 'H', quick: true, id: this.device.bleMac })
|
|
691
612
|
.then(async (device_list) => {
|
|
692
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${
|
|
693
|
-
return await this.
|
|
694
|
-
max: this.
|
|
613
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${On}`);
|
|
614
|
+
return await this.retryBLE({
|
|
615
|
+
max: await this.maxRetryBLE(),
|
|
695
616
|
fn: async () => {
|
|
696
|
-
if (
|
|
617
|
+
if (On) {
|
|
697
618
|
return await device_list[0].turnOn({ id: this.device.bleMac });
|
|
698
619
|
}
|
|
699
620
|
else {
|
|
@@ -704,12 +625,12 @@ export class Bot {
|
|
|
704
625
|
})
|
|
705
626
|
.then(() => {
|
|
706
627
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
707
|
-
this.accessory.context.On =
|
|
628
|
+
this.accessory.context.On = On;
|
|
708
629
|
})
|
|
709
630
|
.catch(async (e) => {
|
|
710
631
|
this.apiError(e);
|
|
711
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushChanges with ${this.device.connectionType}`
|
|
712
|
-
` Connection & botMode: ${this.botMode}, Error Message: ${JSON.stringify(e.message)}`);
|
|
632
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushChanges with ${this.device.connectionType}`
|
|
633
|
+
+ ` Connection & botMode: ${this.botMode}, Error Message: ${JSON.stringify(e.message)}`);
|
|
713
634
|
await this.BLEPushConnection();
|
|
714
635
|
});
|
|
715
636
|
}
|
|
@@ -718,31 +639,32 @@ export class Bot {
|
|
|
718
639
|
}
|
|
719
640
|
}
|
|
720
641
|
else {
|
|
721
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges
|
|
642
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges, On: ${On}, OnCached: ${this.accessory.context.On}`);
|
|
722
643
|
}
|
|
723
644
|
}
|
|
724
645
|
async openAPIpushChanges() {
|
|
725
646
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
|
|
647
|
+
let On = await this.getOn();
|
|
726
648
|
if (this.multiPressCount > 0) {
|
|
727
649
|
this.debugLog(`${this.device.deviceType}: ${this.multiPressCount} request(s) queued.`);
|
|
728
|
-
|
|
650
|
+
On = true;
|
|
729
651
|
}
|
|
730
|
-
if (
|
|
652
|
+
if (On !== this.accessory.context.On || this.allowPush || this.multiPressCount > 0) {
|
|
731
653
|
let command = '';
|
|
732
|
-
if (this.botMode === 'switch' &&
|
|
654
|
+
if (this.botMode === 'switch' && On) {
|
|
733
655
|
command = 'turnOn';
|
|
734
|
-
|
|
735
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Switch Mode, Turning ${
|
|
656
|
+
On = true;
|
|
657
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Switch Mode, Turning ${On}`);
|
|
736
658
|
}
|
|
737
|
-
else if (this.botMode === 'switch' && !
|
|
659
|
+
else if (this.botMode === 'switch' && !On) {
|
|
738
660
|
command = 'turnOff';
|
|
739
|
-
|
|
740
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Switch Mode, Turning ${
|
|
661
|
+
On = false;
|
|
662
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Switch Mode, Turning ${On}`);
|
|
741
663
|
}
|
|
742
664
|
else if (this.botMode === 'press' || this.botMode === 'multipress') {
|
|
743
665
|
command = 'press';
|
|
744
666
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Press Mode`);
|
|
745
|
-
|
|
667
|
+
On = false;
|
|
746
668
|
}
|
|
747
669
|
else {
|
|
748
670
|
throw new Error(`${this.device.deviceType}: ${this.accessory.displayName} Device Parameters not set for this Bot.`);
|
|
@@ -765,8 +687,10 @@ export class Bot {
|
|
|
765
687
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
|
|
766
688
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
767
689
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
768
|
-
this.
|
|
690
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
769
691
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
692
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
693
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(bodyChange)} sent successfully`);
|
|
770
694
|
}
|
|
771
695
|
else {
|
|
772
696
|
this.statusCode(statusCode);
|
|
@@ -776,21 +700,20 @@ export class Bot {
|
|
|
776
700
|
this.multiPressCount--;
|
|
777
701
|
if (this.multiPressCount > 0) {
|
|
778
702
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Multi Press Count: ${this.multiPressCount}`);
|
|
779
|
-
|
|
703
|
+
On = true;
|
|
780
704
|
this.openAPIpushChanges();
|
|
781
705
|
}
|
|
782
706
|
}
|
|
783
707
|
}
|
|
784
708
|
catch (e) {
|
|
785
709
|
this.apiError(e);
|
|
786
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIpushChanges with ${this.device.connectionType}`
|
|
787
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
710
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIpushChanges with ${this.device.connectionType}`
|
|
711
|
+
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
788
712
|
}
|
|
789
713
|
}
|
|
790
714
|
else {
|
|
791
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges
|
|
792
|
-
`On: ${this.On}
|
|
793
|
-
`OnCached: ${this.accessory.context.On}`);
|
|
715
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges,`
|
|
716
|
+
+ ` On: ${On}, OnCached: ${this.accessory.context.On}`);
|
|
794
717
|
}
|
|
795
718
|
}
|
|
796
719
|
/**
|
|
@@ -800,59 +723,101 @@ export class Bot {
|
|
|
800
723
|
if (this.botDeviceType === 'garagedoor') {
|
|
801
724
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetDoorState: ${value}`);
|
|
802
725
|
if (value === this.hap.Characteristic.TargetDoorState.CLOSED) {
|
|
803
|
-
this.
|
|
726
|
+
await this.setOn(false);
|
|
727
|
+
this.GarageDoor.On = false;
|
|
804
728
|
}
|
|
805
729
|
else {
|
|
806
|
-
this.
|
|
730
|
+
await this.setOn(true);
|
|
731
|
+
this.GarageDoor.On = true;
|
|
807
732
|
}
|
|
808
733
|
}
|
|
809
|
-
else if (this.botDeviceType === 'door'
|
|
810
|
-
this.botDeviceType === 'window' ||
|
|
811
|
-
this.botDeviceType === 'windowcovering') {
|
|
734
|
+
else if (this.botDeviceType === 'door') {
|
|
812
735
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetPosition: ${value}`);
|
|
813
736
|
if (value === 0) {
|
|
814
|
-
this.
|
|
737
|
+
await this.setOn(false);
|
|
738
|
+
this.Door.On = false;
|
|
815
739
|
}
|
|
816
740
|
else {
|
|
817
|
-
this.
|
|
741
|
+
await this.setOn(true);
|
|
742
|
+
this.Door.On = true;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
else if (this.botDeviceType === 'window') {
|
|
746
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetPosition: ${value}`);
|
|
747
|
+
if (value === 0) {
|
|
748
|
+
await this.setOn(false);
|
|
749
|
+
this.Window.On = false;
|
|
750
|
+
}
|
|
751
|
+
else {
|
|
752
|
+
await this.setOn(true);
|
|
753
|
+
this.Window.On = true;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
else if (this.botDeviceType === 'windowcovering') {
|
|
757
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetPosition: ${value}`);
|
|
758
|
+
if (value === 0) {
|
|
759
|
+
await this.setOn(false);
|
|
760
|
+
this.WindowCovering.On = false;
|
|
761
|
+
}
|
|
762
|
+
else {
|
|
763
|
+
await this.setOn(true);
|
|
764
|
+
this.WindowCovering.On = true;
|
|
818
765
|
}
|
|
819
766
|
}
|
|
820
767
|
else if (this.botDeviceType === 'lock') {
|
|
821
768
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set LockTargetState: ${value}`);
|
|
822
769
|
if (value === this.hap.Characteristic.LockTargetState.SECURED) {
|
|
823
|
-
this.
|
|
770
|
+
await this.setOn(false);
|
|
771
|
+
this.Lock.On = false;
|
|
824
772
|
}
|
|
825
773
|
else {
|
|
826
|
-
this.
|
|
774
|
+
await this.setOn(true);
|
|
775
|
+
this.Lock.On = true;
|
|
827
776
|
}
|
|
828
777
|
}
|
|
829
778
|
else if (this.botDeviceType === 'faucet') {
|
|
830
779
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Active: ${value}`);
|
|
831
780
|
if (value === this.hap.Characteristic.Active.INACTIVE) {
|
|
832
|
-
this.
|
|
781
|
+
await this.setOn(false);
|
|
782
|
+
this.Faucet.On = false;
|
|
833
783
|
}
|
|
834
784
|
else {
|
|
835
|
-
this.
|
|
785
|
+
await this.setOn(true);
|
|
786
|
+
this.Faucet.On = true;
|
|
836
787
|
}
|
|
837
788
|
}
|
|
838
789
|
else if (this.botDeviceType === 'stateful') {
|
|
839
790
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ProgrammableSwitchOutputState: ${value}`);
|
|
840
791
|
if (value === 0) {
|
|
841
|
-
this.
|
|
792
|
+
await this.setOn(false);
|
|
793
|
+
this.StatefulProgrammableSwitch.On = false;
|
|
842
794
|
}
|
|
843
795
|
else {
|
|
844
|
-
this.
|
|
796
|
+
await this.setOn(true);
|
|
797
|
+
this.StatefulProgrammableSwitch.On = true;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
else if (this.botDeviceType === 'switch') {
|
|
801
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ProgrammableSwitchOutputState: ${value}`);
|
|
802
|
+
if (value === 0) {
|
|
803
|
+
await this.setOn(false);
|
|
804
|
+
this.Switch.On = false;
|
|
805
|
+
}
|
|
806
|
+
else {
|
|
807
|
+
await this.setOn(true);
|
|
808
|
+
this.Switch.On = true;
|
|
845
809
|
}
|
|
846
810
|
}
|
|
847
811
|
else {
|
|
848
812
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set On: ${value}`);
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
813
|
+
await this.setOn(Boolean(value));
|
|
814
|
+
this.Outlet.On = value;
|
|
815
|
+
}
|
|
816
|
+
if (this.device.bot?.mode === 'multipress') {
|
|
817
|
+
if (value === true) {
|
|
818
|
+
this.multiPressCount++;
|
|
819
|
+
this.debugLog(`${this.device.deviceType} set to Multi-Press. Multi-Press count: ${this.multiPressCount}`);
|
|
854
820
|
}
|
|
855
|
-
this.On = value;
|
|
856
821
|
}
|
|
857
822
|
this.doBotUpdate.next();
|
|
858
823
|
}
|
|
@@ -862,508 +827,360 @@ export class Bot {
|
|
|
862
827
|
async updateHomeKitCharacteristics() {
|
|
863
828
|
// State
|
|
864
829
|
if (this.botDeviceType === 'garagedoor') {
|
|
865
|
-
if (this.On === undefined) {
|
|
866
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
830
|
+
if (this.GarageDoor.On === undefined) {
|
|
831
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.GarageDoor.On}`);
|
|
867
832
|
}
|
|
868
833
|
else {
|
|
869
|
-
if (this.On) {
|
|
870
|
-
this.
|
|
871
|
-
this.
|
|
872
|
-
this.debugLog(`${this.device.deviceType}:
|
|
834
|
+
if (this.GarageDoor.On) {
|
|
835
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.TargetDoorState, this.hap.Characteristic.TargetDoorState.OPEN);
|
|
836
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.CurrentDoorState, this.hap.Characteristic.CurrentDoorState.OPEN);
|
|
837
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
838
|
+
+ ` TargetDoorState: Open, CurrentDoorState: Open (${this.GarageDoor.On})`);
|
|
873
839
|
}
|
|
874
840
|
else {
|
|
875
|
-
this.
|
|
876
|
-
this.
|
|
877
|
-
this.debugLog(`${this.device.deviceType}:
|
|
841
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.TargetDoorState, this.hap.Characteristic.TargetDoorState.CLOSED);
|
|
842
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.CurrentDoorState, this.hap.Characteristic.CurrentDoorState.CLOSED);
|
|
843
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
844
|
+
+ ` TargetDoorState: Open, CurrentDoorState: Open (${this.GarageDoor.On})`);
|
|
878
845
|
}
|
|
879
846
|
}
|
|
880
|
-
this.
|
|
847
|
+
await this.setOn(Boolean(this.GarageDoor.On));
|
|
848
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Garage Door On: ${this.GarageDoor.On}`);
|
|
881
849
|
}
|
|
882
850
|
else if (this.botDeviceType === 'door') {
|
|
883
|
-
if (this.On === undefined) {
|
|
884
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
851
|
+
if (this.Door.On === undefined) {
|
|
852
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Door.On}`);
|
|
885
853
|
}
|
|
886
854
|
else {
|
|
887
|
-
if (this.On) {
|
|
888
|
-
this.
|
|
889
|
-
this.
|
|
890
|
-
this.
|
|
891
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
855
|
+
if (this.Door.On) {
|
|
856
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 100);
|
|
857
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 100);
|
|
858
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
859
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
860
|
+
+ ` TargetPosition: 100, CurrentPosition: 100 (${this.Door.On})`);
|
|
892
861
|
}
|
|
893
862
|
else {
|
|
894
|
-
this.
|
|
895
|
-
this.
|
|
896
|
-
this.
|
|
897
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
863
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
864
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
865
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
866
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
867
|
+
+ ` TargetPosition: 0, CurrentPosition: 0 (${this.Door.On})`);
|
|
898
868
|
}
|
|
899
869
|
}
|
|
900
|
-
this.
|
|
870
|
+
await this.setOn(Boolean(this.Door.On));
|
|
871
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Door On: ${this.Door.On}`);
|
|
901
872
|
}
|
|
902
873
|
else if (this.botDeviceType === 'window') {
|
|
903
|
-
if (this.On === undefined) {
|
|
904
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
874
|
+
if (this.Window.On === undefined) {
|
|
875
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Window.On}`);
|
|
905
876
|
}
|
|
906
877
|
else {
|
|
907
|
-
if (this.On) {
|
|
908
|
-
this.
|
|
909
|
-
this.
|
|
910
|
-
this.
|
|
911
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
878
|
+
if (this.Window.On) {
|
|
879
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 100);
|
|
880
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 100);
|
|
881
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
882
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
883
|
+
+ ` TargetPosition: 100, CurrentPosition: 100 (${this.Window.On})`);
|
|
912
884
|
}
|
|
913
885
|
else {
|
|
914
|
-
this.
|
|
915
|
-
this.
|
|
916
|
-
this.
|
|
917
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
886
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
887
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
888
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
889
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
890
|
+
+ ` TargetPosition: 0, CurrentPosition: 0 (${this.Window.On})`);
|
|
918
891
|
}
|
|
919
892
|
}
|
|
920
|
-
this.
|
|
893
|
+
await this.setOn(Boolean(this.Window.On));
|
|
894
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Window On: ${this.Window.On}`);
|
|
921
895
|
}
|
|
922
896
|
else if (this.botDeviceType === 'windowcovering') {
|
|
923
|
-
if (this.On === undefined) {
|
|
924
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
897
|
+
if (this.WindowCovering.On === undefined) {
|
|
898
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.WindowCovering.On}`);
|
|
925
899
|
}
|
|
926
900
|
else {
|
|
927
|
-
if (this.On) {
|
|
928
|
-
this.
|
|
929
|
-
this.
|
|
930
|
-
this.
|
|
931
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
901
|
+
if (this.WindowCovering.On) {
|
|
902
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 100);
|
|
903
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 100);
|
|
904
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
905
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
906
|
+
+ ` TargetPosition: 100, CurrentPosition: 100 (${this.WindowCovering.On})`);
|
|
932
907
|
}
|
|
933
908
|
else {
|
|
934
|
-
this.
|
|
935
|
-
this.
|
|
936
|
-
this.
|
|
937
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
909
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
910
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
911
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
912
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
913
|
+
+ ` TargetPosition: 0, CurrentPosition: 0 (${this.WindowCovering.On})`);
|
|
938
914
|
}
|
|
939
915
|
}
|
|
940
|
-
this.
|
|
916
|
+
await this.setOn(Boolean(this.WindowCovering.On));
|
|
917
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Window Covering On: ${this.WindowCovering.On}`);
|
|
941
918
|
}
|
|
942
919
|
else if (this.botDeviceType === 'lock') {
|
|
943
|
-
if (this.On === undefined) {
|
|
944
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
920
|
+
if (this.Lock.On === undefined) {
|
|
921
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Lock.On}`);
|
|
945
922
|
}
|
|
946
923
|
else {
|
|
947
|
-
if (this.On) {
|
|
948
|
-
this.
|
|
949
|
-
this.
|
|
950
|
-
this.debugLog(`${this.device.deviceType}: `
|
|
951
|
-
|
|
924
|
+
if (this.Lock.On) {
|
|
925
|
+
this.Lock.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.hap.Characteristic.LockTargetState.UNSECURED);
|
|
926
|
+
this.Lock.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.hap.Characteristic.LockCurrentState.UNSECURED);
|
|
927
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
928
|
+
+ ` LockTargetState: UNSECURED, LockCurrentState: UNSECURED (${this.Lock.On})`);
|
|
952
929
|
}
|
|
953
930
|
else {
|
|
954
|
-
this.
|
|
955
|
-
this.
|
|
956
|
-
this.debugLog(`${this.device.deviceType}:
|
|
931
|
+
this.Lock.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.hap.Characteristic.LockTargetState.SECURED);
|
|
932
|
+
this.Lock.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.hap.Characteristic.LockCurrentState.SECURED);
|
|
933
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
934
|
+
+ ` LockTargetState: SECURED, LockCurrentState: SECURED (${this.Lock.On})`);
|
|
957
935
|
}
|
|
958
936
|
}
|
|
959
|
-
this.
|
|
937
|
+
await this.setOn(Boolean(this.Lock.On));
|
|
938
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Lock On: ${this.Lock.On}`);
|
|
960
939
|
}
|
|
961
940
|
else if (this.botDeviceType === 'faucet') {
|
|
962
|
-
if (this.On === undefined) {
|
|
963
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
941
|
+
if (this.Faucet.On === undefined) {
|
|
942
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Faucet.On}`);
|
|
964
943
|
}
|
|
965
944
|
else {
|
|
966
|
-
if (this.On) {
|
|
967
|
-
this.
|
|
968
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.On}`);
|
|
945
|
+
if (this.Faucet.On) {
|
|
946
|
+
this.Faucet.Service.updateCharacteristic(this.hap.Characteristic.Active, this.hap.Characteristic.Active.ACTIVE);
|
|
947
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.Faucet.On}`);
|
|
969
948
|
}
|
|
970
949
|
else {
|
|
971
|
-
this.
|
|
972
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.On}`);
|
|
950
|
+
this.Faucet.Service.updateCharacteristic(this.hap.Characteristic.Active, this.hap.Characteristic.Active.INACTIVE);
|
|
951
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.Faucet.On}`);
|
|
973
952
|
}
|
|
974
953
|
}
|
|
975
|
-
this.
|
|
954
|
+
await this.setOn(Boolean(this.Faucet.On));
|
|
955
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Faucet On: ${this.Faucet.On}`);
|
|
976
956
|
}
|
|
977
957
|
else if (this.botDeviceType === 'fan') {
|
|
978
|
-
if (this.On === undefined) {
|
|
979
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
958
|
+
if (this.Fan.On === undefined) {
|
|
959
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Fan.On}`);
|
|
980
960
|
}
|
|
981
961
|
else {
|
|
982
|
-
if (this.On) {
|
|
983
|
-
this.
|
|
984
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
962
|
+
if (this.Fan.On) {
|
|
963
|
+
this.Fan.Service.updateCharacteristic(this.hap.Characteristic.On, this.Fan.On);
|
|
964
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.Fan.On}`);
|
|
985
965
|
}
|
|
986
966
|
else {
|
|
987
|
-
this.
|
|
988
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
967
|
+
this.Fan.Service.updateCharacteristic(this.hap.Characteristic.On, this.Fan.On);
|
|
968
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.Fan.On}`);
|
|
989
969
|
}
|
|
990
970
|
}
|
|
991
|
-
this.
|
|
971
|
+
await this.setOn(Boolean(this.Fan.On));
|
|
972
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Fan On: ${this.Fan.On}`);
|
|
992
973
|
}
|
|
993
974
|
else if (this.botDeviceType === 'stateful') {
|
|
994
|
-
if (this.On === undefined) {
|
|
995
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
975
|
+
if (this.StatefulProgrammableSwitch.On === undefined) {
|
|
976
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.StatefulProgrammableSwitch.On}`);
|
|
996
977
|
}
|
|
997
978
|
else {
|
|
998
|
-
if (this.On) {
|
|
999
|
-
this.
|
|
1000
|
-
this.
|
|
1001
|
-
this.debugLog(`${this.device.deviceType}: `
|
|
1002
|
-
|
|
979
|
+
if (this.StatefulProgrammableSwitch.On) {
|
|
980
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent, this.hap.Characteristic.ProgrammableSwitchEvent.SINGLE_PRESS);
|
|
981
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, 1);
|
|
982
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
983
|
+
+ ` ProgrammableSwitchEvent: SINGLE, ProgrammableSwitchOutputState: 1 (${this.StatefulProgrammableSwitch.On})`);
|
|
1003
984
|
}
|
|
1004
985
|
else {
|
|
1005
|
-
this.
|
|
1006
|
-
this.
|
|
1007
|
-
this.debugLog(`${this.device.deviceType}: `
|
|
1008
|
-
|
|
986
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent, this.hap.Characteristic.ProgrammableSwitchEvent.SINGLE_PRESS);
|
|
987
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, 0);
|
|
988
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
989
|
+
+ ` ProgrammableSwitchEvent: SINGLE, ProgrammableSwitchOutputState: 0 (${this.StatefulProgrammableSwitch.On})`);
|
|
1009
990
|
}
|
|
1010
991
|
}
|
|
1011
|
-
this.
|
|
992
|
+
await this.setOn(Boolean(this.StatefulProgrammableSwitch.On));
|
|
993
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatefulProgrammableSwitch On: ${this.StatefulProgrammableSwitch.On}`);
|
|
1012
994
|
}
|
|
1013
995
|
else if (this.botDeviceType === 'switch') {
|
|
1014
|
-
if (this.On === undefined) {
|
|
1015
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
996
|
+
if (this.Switch.On === undefined) {
|
|
997
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Switch.On}`);
|
|
1016
998
|
}
|
|
1017
999
|
else {
|
|
1018
|
-
this.
|
|
1019
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
1000
|
+
this.Switch.Service.updateCharacteristic(this.hap.Characteristic.On, this.Switch.On);
|
|
1001
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.Switch.On}`);
|
|
1002
|
+
await this.setOn(Boolean(this.Switch.On));
|
|
1020
1003
|
}
|
|
1021
1004
|
}
|
|
1022
1005
|
else {
|
|
1023
|
-
if (this.On === undefined) {
|
|
1024
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
1006
|
+
if (this.Outlet.On === undefined) {
|
|
1007
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Outlet.On}`);
|
|
1025
1008
|
}
|
|
1026
1009
|
else {
|
|
1027
|
-
this.
|
|
1028
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
1010
|
+
this.Outlet.Service.updateCharacteristic(this.hap.Characteristic.On, this.Outlet.On);
|
|
1011
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.Outlet.On}`);
|
|
1029
1012
|
}
|
|
1030
1013
|
}
|
|
1031
|
-
this.
|
|
1014
|
+
await this.setOn(Boolean(this.Outlet.On));
|
|
1015
|
+
this.accessory.context.On = await this.getOn();
|
|
1032
1016
|
// BatteryLevel
|
|
1033
|
-
if (this.BatteryLevel === undefined) {
|
|
1034
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}`);
|
|
1017
|
+
if (this.Battery.BatteryLevel === undefined) {
|
|
1018
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
1035
1019
|
}
|
|
1036
1020
|
else {
|
|
1037
|
-
this.accessory.context.BatteryLevel = this.BatteryLevel;
|
|
1038
|
-
this.
|
|
1039
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.BatteryLevel}`);
|
|
1021
|
+
this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
|
|
1022
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
|
|
1023
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
1040
1024
|
}
|
|
1041
1025
|
// StatusLowBattery
|
|
1042
|
-
if (this.StatusLowBattery === undefined) {
|
|
1043
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.StatusLowBattery}`);
|
|
1026
|
+
if (this.Battery.StatusLowBattery === undefined) {
|
|
1027
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
1044
1028
|
}
|
|
1045
1029
|
else {
|
|
1046
|
-
this.accessory.context.StatusLowBattery = this.StatusLowBattery;
|
|
1047
|
-
this.
|
|
1048
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
1030
|
+
this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
|
|
1031
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
|
|
1032
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
1033
|
+
+ ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
1049
1034
|
}
|
|
1050
1035
|
}
|
|
1051
1036
|
async removeOutletService(accessory) {
|
|
1052
1037
|
// If outletService still present, then remove first
|
|
1053
|
-
|
|
1054
|
-
|
|
1038
|
+
if (this.Outlet?.Service) {
|
|
1039
|
+
this.Outlet.Service = this.accessory.getService(this.hap.Service.Outlet);
|
|
1055
1040
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Outlet Service`);
|
|
1041
|
+
accessory.removeService(this.Outlet.Service);
|
|
1056
1042
|
}
|
|
1057
|
-
accessory.removeService(this.outletService);
|
|
1058
1043
|
}
|
|
1059
1044
|
async removeGarageDoorService(accessory) {
|
|
1060
1045
|
// If garageDoorService still present, then remove first
|
|
1061
|
-
|
|
1062
|
-
|
|
1046
|
+
if (this.GarageDoor?.Service) {
|
|
1047
|
+
this.GarageDoor.Service = this.accessory.getService(this.hap.Service.GarageDoorOpener);
|
|
1063
1048
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Garage Door Service`);
|
|
1049
|
+
accessory.removeService(this.GarageDoor.Service);
|
|
1064
1050
|
}
|
|
1065
|
-
accessory.removeService(this.garageDoorService);
|
|
1066
1051
|
}
|
|
1067
1052
|
async removeDoorService(accessory) {
|
|
1068
1053
|
// If doorService still present, then remove first
|
|
1069
|
-
|
|
1070
|
-
|
|
1054
|
+
if (this.Door?.Service) {
|
|
1055
|
+
this.Door.Service = this.accessory.getService(this.hap.Service.Door);
|
|
1071
1056
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Door Service`);
|
|
1057
|
+
accessory.removeService(this.Door.Service);
|
|
1072
1058
|
}
|
|
1073
|
-
accessory.removeService(this.doorService);
|
|
1074
1059
|
}
|
|
1075
1060
|
async removeLockService(accessory) {
|
|
1076
1061
|
// If lockService still present, then remove first
|
|
1077
|
-
|
|
1078
|
-
|
|
1062
|
+
if (this.Lock?.Service) {
|
|
1063
|
+
this.Lock.Service = this.accessory.getService(this.hap.Service.LockMechanism);
|
|
1079
1064
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Lock Service`);
|
|
1065
|
+
accessory.removeService(this.Lock.Service);
|
|
1080
1066
|
}
|
|
1081
|
-
accessory.removeService(this.lockService);
|
|
1082
1067
|
}
|
|
1083
1068
|
async removeFaucetService(accessory) {
|
|
1084
1069
|
// If faucetService still present, then remove first
|
|
1085
|
-
|
|
1086
|
-
|
|
1070
|
+
if (this.Faucet?.Service) {
|
|
1071
|
+
this.Faucet.Service = this.accessory.getService(this.hap.Service.Faucet);
|
|
1087
1072
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Faucet Service`);
|
|
1073
|
+
accessory.removeService(this.Faucet.Service);
|
|
1088
1074
|
}
|
|
1089
|
-
accessory.removeService(this.faucetService);
|
|
1090
1075
|
}
|
|
1091
1076
|
async removeFanService(accessory) {
|
|
1092
1077
|
// If fanService still present, then remove first
|
|
1093
|
-
|
|
1094
|
-
|
|
1078
|
+
if (this.Fan?.Service) {
|
|
1079
|
+
this.Fan.Service = this.accessory.getService(this.hap.Service.Fanv2);
|
|
1095
1080
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Fan Service`);
|
|
1081
|
+
accessory.removeService(this.Fan.Service);
|
|
1096
1082
|
}
|
|
1097
|
-
accessory.removeService(this.fanService);
|
|
1098
1083
|
}
|
|
1099
1084
|
async removeWindowService(accessory) {
|
|
1100
1085
|
// If windowService still present, then remove first
|
|
1101
|
-
|
|
1102
|
-
|
|
1086
|
+
if (this.Window?.Service) {
|
|
1087
|
+
this.Window.Service = this.accessory.getService(this.hap.Service.Window);
|
|
1103
1088
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Window Service`);
|
|
1089
|
+
accessory.removeService(this.Window.Service);
|
|
1104
1090
|
}
|
|
1105
|
-
accessory.removeService(this.windowService);
|
|
1106
1091
|
}
|
|
1107
1092
|
async removeWindowCoveringService(accessory) {
|
|
1108
1093
|
// If windowCoveringService still present, then remove first
|
|
1109
|
-
|
|
1110
|
-
|
|
1094
|
+
if (this.WindowCovering?.Service) {
|
|
1095
|
+
this.WindowCovering.Service = this.accessory.getService(this.hap.Service.WindowCovering);
|
|
1111
1096
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Window Covering Service`);
|
|
1097
|
+
accessory.removeService(this.WindowCovering.Service);
|
|
1112
1098
|
}
|
|
1113
|
-
accessory.removeService(this.windowCoveringService);
|
|
1114
1099
|
}
|
|
1115
1100
|
async removeStatefulProgrammableSwitchService(accessory) {
|
|
1116
1101
|
// If statefulProgrammableSwitchService still present, then remove first
|
|
1117
|
-
|
|
1118
|
-
|
|
1102
|
+
if (this.StatefulProgrammableSwitch?.Service) {
|
|
1103
|
+
this.StatefulProgrammableSwitch.Service = this.accessory.getService(this.hap.Service.StatefulProgrammableSwitch);
|
|
1119
1104
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Stateful Programmable Switch Service`);
|
|
1105
|
+
accessory.removeService(this.StatefulProgrammableSwitch.Service);
|
|
1120
1106
|
}
|
|
1121
|
-
accessory.removeService(this.statefulProgrammableSwitchService);
|
|
1122
1107
|
}
|
|
1123
1108
|
async removeSwitchService(accessory) {
|
|
1124
1109
|
// If switchService still present, then remove first
|
|
1125
|
-
|
|
1126
|
-
|
|
1110
|
+
if (this.Switch?.Service) {
|
|
1111
|
+
this.Switch.Service = this.accessory.getService(this.hap.Service.Switch);
|
|
1127
1112
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Switch Service`);
|
|
1128
|
-
|
|
1129
|
-
accessory.removeService(this.switchService);
|
|
1130
|
-
}
|
|
1131
|
-
DoublePress(device) {
|
|
1132
|
-
if (device.bot?.doublePress) {
|
|
1133
|
-
this.doublePress = device.bot?.doublePress;
|
|
1134
|
-
this.accessory.context.doublePress = this.doublePress;
|
|
1135
|
-
}
|
|
1136
|
-
else {
|
|
1137
|
-
this.doublePress = 1;
|
|
1138
|
-
}
|
|
1139
|
-
}
|
|
1140
|
-
async stopScanning(switchbot) {
|
|
1141
|
-
switchbot.stopScan();
|
|
1142
|
-
if (this.BLE_IsConnected) {
|
|
1143
|
-
await this.BLEparseStatus();
|
|
1144
|
-
await this.updateHomeKitCharacteristics();
|
|
1145
|
-
}
|
|
1146
|
-
else {
|
|
1147
|
-
await this.BLERefreshConnection(switchbot);
|
|
1148
|
-
}
|
|
1149
|
-
}
|
|
1150
|
-
async getCustomBLEAddress(switchbot) {
|
|
1151
|
-
if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
|
|
1152
|
-
(async () => {
|
|
1153
|
-
// Start to monitor advertisement packets
|
|
1154
|
-
await switchbot.startScan({
|
|
1155
|
-
model: 'H',
|
|
1156
|
-
});
|
|
1157
|
-
// Set an event handler
|
|
1158
|
-
switchbot.onadvertisement = (ad) => {
|
|
1159
|
-
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} ad: ${JSON.stringify(ad, null, ' ')}`);
|
|
1160
|
-
};
|
|
1161
|
-
await sleep(10000);
|
|
1162
|
-
// Stop to monitor
|
|
1163
|
-
switchbot.stopScan();
|
|
1164
|
-
})();
|
|
1165
|
-
}
|
|
1166
|
-
}
|
|
1167
|
-
async BLEPushConnection() {
|
|
1168
|
-
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
1169
|
-
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Push Changes`);
|
|
1170
|
-
await this.openAPIpushChanges();
|
|
1171
|
-
}
|
|
1172
|
-
}
|
|
1173
|
-
async BLERefreshConnection(switchbot) {
|
|
1174
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} wasn't able to establish BLE Connection, node-switchbot:`
|
|
1175
|
-
+ ` ${JSON.stringify(switchbot)}`);
|
|
1176
|
-
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
1177
|
-
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Refresh Status`);
|
|
1178
|
-
await this.openAPIRefreshStatus();
|
|
1113
|
+
accessory.removeService(this.Switch.Service);
|
|
1179
1114
|
}
|
|
1180
1115
|
}
|
|
1181
|
-
async
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
}
|
|
1186
|
-
this.infoLog(e);
|
|
1187
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Retrying`);
|
|
1188
|
-
await sleep(1000);
|
|
1189
|
-
return this.retry({ max: max - 1, fn });
|
|
1190
|
-
});
|
|
1191
|
-
}
|
|
1192
|
-
maxRetry() {
|
|
1193
|
-
if (this.device.maxRetry) {
|
|
1194
|
-
return this.device.maxRetry;
|
|
1195
|
-
}
|
|
1196
|
-
else {
|
|
1197
|
-
return 5;
|
|
1116
|
+
async getOn() {
|
|
1117
|
+
let On;
|
|
1118
|
+
if (this.botDeviceType === 'garagedoor') {
|
|
1119
|
+
On = this.GarageDoor.On ? true : false;
|
|
1198
1120
|
}
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
if (!device.bot?.mode) {
|
|
1202
|
-
this.botMode = 'switch';
|
|
1203
|
-
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} does not have bot mode set in the Plugin's SwitchBot Device Settings,`);
|
|
1204
|
-
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} is defaulting to "${this.botMode}" mode, you may experience issues.`);
|
|
1121
|
+
else if (this.botDeviceType === 'door') {
|
|
1122
|
+
On = this.Door.On ? true : false;
|
|
1205
1123
|
}
|
|
1206
|
-
else if (
|
|
1207
|
-
this.
|
|
1208
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1124
|
+
else if (this.botDeviceType === 'window') {
|
|
1125
|
+
On = this.Window.On ? true : false;
|
|
1209
1126
|
}
|
|
1210
|
-
else if (
|
|
1211
|
-
this.
|
|
1212
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1127
|
+
else if (this.botDeviceType === 'windowcovering') {
|
|
1128
|
+
On = this.WindowCovering.On ? true : false;
|
|
1213
1129
|
}
|
|
1214
|
-
else if (
|
|
1215
|
-
this.
|
|
1216
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1130
|
+
else if (this.botDeviceType === 'lock') {
|
|
1131
|
+
On = this.Lock.On ? true : false;
|
|
1217
1132
|
}
|
|
1218
|
-
else {
|
|
1219
|
-
|
|
1133
|
+
else if (this.botDeviceType === 'faucet') {
|
|
1134
|
+
On = this.Faucet.On ? true : false;
|
|
1220
1135
|
}
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
if (device.bot?.allowPush) {
|
|
1224
|
-
this.allowPush = true;
|
|
1136
|
+
else if (this.botDeviceType === 'fan') {
|
|
1137
|
+
On = this.Fan.On ? true : false;
|
|
1225
1138
|
}
|
|
1226
|
-
else {
|
|
1227
|
-
this.
|
|
1139
|
+
else if (this.botDeviceType === 'stateful') {
|
|
1140
|
+
On = this.StatefulProgrammableSwitch.On ? true : false;
|
|
1228
1141
|
}
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
async scan(device) {
|
|
1232
|
-
if (device.scanDuration) {
|
|
1233
|
-
this.scanDuration = this.accessory.context.scanDuration = device.scanDuration;
|
|
1234
|
-
if (this.BLE) {
|
|
1235
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config scanDuration: ${this.scanDuration}`);
|
|
1236
|
-
}
|
|
1142
|
+
else if (this.botDeviceType === 'switch') {
|
|
1143
|
+
On = this.Switch.On ? true : false;
|
|
1237
1144
|
}
|
|
1238
1145
|
else {
|
|
1239
|
-
|
|
1240
|
-
if (this.BLE) {
|
|
1241
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default scanDuration: ${this.scanDuration}`);
|
|
1242
|
-
}
|
|
1243
|
-
}
|
|
1244
|
-
}
|
|
1245
|
-
async statusCode(statusCode) {
|
|
1246
|
-
switch (statusCode) {
|
|
1247
|
-
case 151:
|
|
1248
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
|
|
1249
|
-
break;
|
|
1250
|
-
case 152:
|
|
1251
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
|
|
1252
|
-
break;
|
|
1253
|
-
case 160:
|
|
1254
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
|
|
1255
|
-
break;
|
|
1256
|
-
case 161:
|
|
1257
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
|
|
1258
|
-
this.offlineOff();
|
|
1259
|
-
break;
|
|
1260
|
-
case 171:
|
|
1261
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
|
|
1262
|
-
`Hub: ${this.device.hubDeviceId}`);
|
|
1263
|
-
this.offlineOff();
|
|
1264
|
-
break;
|
|
1265
|
-
case 190:
|
|
1266
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
|
|
1267
|
-
` Or command format is invalid, statusCode: ${statusCode}`);
|
|
1268
|
-
break;
|
|
1269
|
-
case 100:
|
|
1270
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
|
|
1271
|
-
break;
|
|
1272
|
-
case 200:
|
|
1273
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
|
|
1274
|
-
break;
|
|
1275
|
-
case 400:
|
|
1276
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
|
|
1277
|
-
+ `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
|
|
1278
|
-
break;
|
|
1279
|
-
case 401:
|
|
1280
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
|
|
1281
|
-
+ `but the request has not been authenticated, statusCode: ${statusCode}`);
|
|
1282
|
-
break;
|
|
1283
|
-
case 403:
|
|
1284
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
|
|
1285
|
-
+ `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
|
|
1286
|
-
break;
|
|
1287
|
-
case 404:
|
|
1288
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
|
|
1289
|
-
+ `statusCode: ${statusCode}`);
|
|
1290
|
-
break;
|
|
1291
|
-
case 406:
|
|
1292
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
|
|
1293
|
-
+ `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
|
|
1294
|
-
break;
|
|
1295
|
-
case 415:
|
|
1296
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
|
|
1297
|
-
+ `header that is not supported by the server, statusCode: ${statusCode}`);
|
|
1298
|
-
break;
|
|
1299
|
-
case 422:
|
|
1300
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
|
|
1301
|
-
+ `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
|
|
1302
|
-
break;
|
|
1303
|
-
case 429:
|
|
1304
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
|
|
1305
|
-
+ `requests allowed for a given time window, statusCode: ${statusCode}`);
|
|
1306
|
-
break;
|
|
1307
|
-
case 500:
|
|
1308
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
|
|
1309
|
-
+ `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
|
|
1310
|
-
break;
|
|
1311
|
-
default:
|
|
1312
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
|
|
1313
|
-
`${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`);
|
|
1314
|
-
}
|
|
1315
|
-
}
|
|
1316
|
-
async offlineOff() {
|
|
1317
|
-
if (this.device.offline) {
|
|
1318
|
-
await this.deviceContext();
|
|
1319
|
-
await this.updateHomeKitCharacteristics();
|
|
1146
|
+
On = this.Outlet.On ? true : false;
|
|
1320
1147
|
}
|
|
1148
|
+
return On;
|
|
1321
1149
|
}
|
|
1322
|
-
async
|
|
1150
|
+
async setOn(On) {
|
|
1323
1151
|
if (this.botDeviceType === 'garagedoor') {
|
|
1324
|
-
this.
|
|
1325
|
-
this.garageDoorService?.updateCharacteristic(this.hap.Characteristic.CurrentDoorState, e);
|
|
1326
|
-
this.garageDoorService?.updateCharacteristic(this.hap.Characteristic.ObstructionDetected, e);
|
|
1152
|
+
this.GarageDoor.On = On;
|
|
1327
1153
|
}
|
|
1328
1154
|
else if (this.botDeviceType === 'door') {
|
|
1329
|
-
this.
|
|
1330
|
-
this.doorService?.updateCharacteristic(this.hap.Characteristic.CurrentPosition, e);
|
|
1331
|
-
this.doorService?.updateCharacteristic(this.hap.Characteristic.PositionState, e);
|
|
1155
|
+
this.Door.On = On;
|
|
1332
1156
|
}
|
|
1333
1157
|
else if (this.botDeviceType === 'window') {
|
|
1334
|
-
this.
|
|
1335
|
-
this.windowService?.updateCharacteristic(this.hap.Characteristic.CurrentPosition, e);
|
|
1336
|
-
this.windowService?.updateCharacteristic(this.hap.Characteristic.PositionState, e);
|
|
1158
|
+
this.Window.On = On;
|
|
1337
1159
|
}
|
|
1338
1160
|
else if (this.botDeviceType === 'windowcovering') {
|
|
1339
|
-
this.
|
|
1340
|
-
this.windowCoveringService?.updateCharacteristic(this.hap.Characteristic.CurrentPosition, e);
|
|
1341
|
-
this.windowCoveringService?.updateCharacteristic(this.hap.Characteristic.PositionState, e);
|
|
1161
|
+
this.WindowCovering.On = On;
|
|
1342
1162
|
}
|
|
1343
1163
|
else if (this.botDeviceType === 'lock') {
|
|
1344
|
-
this.
|
|
1345
|
-
this.doorService?.updateCharacteristic(this.hap.Characteristic.LockCurrentState, e);
|
|
1164
|
+
this.Lock.On = On;
|
|
1346
1165
|
}
|
|
1347
1166
|
else if (this.botDeviceType === 'faucet') {
|
|
1348
|
-
this.
|
|
1167
|
+
this.Faucet.On = On;
|
|
1349
1168
|
}
|
|
1350
1169
|
else if (this.botDeviceType === 'fan') {
|
|
1351
|
-
this.
|
|
1170
|
+
this.Fan.On = On;
|
|
1352
1171
|
}
|
|
1353
1172
|
else if (this.botDeviceType === 'stateful') {
|
|
1354
|
-
this.
|
|
1355
|
-
this.statefulProgrammableSwitchService?.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, e);
|
|
1173
|
+
this.StatefulProgrammableSwitch.On = On;
|
|
1356
1174
|
}
|
|
1357
1175
|
else if (this.botDeviceType === 'switch') {
|
|
1358
|
-
this.
|
|
1176
|
+
this.Switch.On = On;
|
|
1359
1177
|
}
|
|
1360
1178
|
else {
|
|
1361
|
-
this.
|
|
1179
|
+
this.Outlet.On = On;
|
|
1362
1180
|
}
|
|
1363
|
-
this.batteryService?.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
|
|
1364
|
-
this.batteryService?.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
|
|
1365
1181
|
}
|
|
1366
|
-
async
|
|
1182
|
+
async getBotConfigSettings(device) {
|
|
1183
|
+
//Bot Device Type
|
|
1367
1184
|
if (!device.bot?.deviceType && this.accessory.context.deviceType) {
|
|
1368
1185
|
this.botDeviceType = this.accessory.context.deviceType;
|
|
1369
1186
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Type: ${this.botDeviceType}, from Accessory Cache.`);
|
|
@@ -1379,43 +1196,36 @@ export class Bot {
|
|
|
1379
1196
|
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} No Device Type Set, deviceType: ${this.device.bot?.deviceType}`);
|
|
1380
1197
|
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using default deviceType: ${this.botDeviceType}`);
|
|
1381
1198
|
}
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
this.
|
|
1386
|
-
this.
|
|
1387
|
-
}
|
|
1388
|
-
else {
|
|
1389
|
-
this.On = this.accessory.context.On;
|
|
1199
|
+
// Bot Mode
|
|
1200
|
+
if (!device.bot?.mode) {
|
|
1201
|
+
this.botMode = 'switch';
|
|
1202
|
+
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} does not have bot mode set in the Plugin's SwitchBot Device Settings,`);
|
|
1203
|
+
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} is defaulting to "${this.botMode}" mode, you may experience issues.`);
|
|
1390
1204
|
}
|
|
1391
|
-
if (
|
|
1392
|
-
this.
|
|
1205
|
+
else if (device.bot?.mode === 'switch') {
|
|
1206
|
+
this.botMode = 'switch';
|
|
1207
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1393
1208
|
}
|
|
1394
|
-
else {
|
|
1395
|
-
this.
|
|
1209
|
+
else if (device.bot?.mode === 'press') {
|
|
1210
|
+
this.botMode = 'press';
|
|
1211
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1396
1212
|
}
|
|
1397
|
-
if (
|
|
1398
|
-
this.
|
|
1399
|
-
this.
|
|
1213
|
+
else if (device.bot?.mode === 'multipress') {
|
|
1214
|
+
this.botMode = 'multipress';
|
|
1215
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1400
1216
|
}
|
|
1401
1217
|
else {
|
|
1402
|
-
this.
|
|
1403
|
-
}
|
|
1404
|
-
if (this.FirmwareRevision === undefined) {
|
|
1405
|
-
this.FirmwareRevision = this.platform.version;
|
|
1406
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
1218
|
+
throw new Error(`${this.device.deviceType}: ${this.accessory.displayName} Bot Mode: ${this.botMode}`);
|
|
1407
1219
|
}
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
this.
|
|
1412
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
|
|
1220
|
+
// Bot Double Press
|
|
1221
|
+
if (device.bot?.doublePress) {
|
|
1222
|
+
this.doublePress = device.bot?.doublePress;
|
|
1223
|
+
this.accessory.context.doublePress = this.doublePress;
|
|
1413
1224
|
}
|
|
1414
|
-
else
|
|
1415
|
-
this.
|
|
1416
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
|
|
1225
|
+
else {
|
|
1226
|
+
this.doublePress = 1;
|
|
1417
1227
|
}
|
|
1418
|
-
//
|
|
1228
|
+
// Bot Press PushRate
|
|
1419
1229
|
if (device?.bot?.pushRatePress) {
|
|
1420
1230
|
this.pushRatePress = device?.bot?.pushRatePress;
|
|
1421
1231
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Bot pushRatePress: ${this.pushRatePress}`);
|
|
@@ -1424,102 +1234,118 @@ export class Bot {
|
|
|
1424
1234
|
this.pushRatePress = 15;
|
|
1425
1235
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default Bot pushRatePress: ${this.pushRatePress}`);
|
|
1426
1236
|
}
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
if (device.bot) {
|
|
1431
|
-
config = device.bot;
|
|
1432
|
-
}
|
|
1433
|
-
if (device.connectionType !== undefined) {
|
|
1434
|
-
config['connectionType'] = device.connectionType;
|
|
1435
|
-
}
|
|
1436
|
-
if (device.external !== undefined) {
|
|
1437
|
-
config['external'] = device.external;
|
|
1438
|
-
}
|
|
1439
|
-
if (device.logging !== undefined) {
|
|
1440
|
-
config['logging'] = device.logging;
|
|
1441
|
-
}
|
|
1442
|
-
if (device.refreshRate !== undefined) {
|
|
1443
|
-
config['refreshRate'] = device.refreshRate;
|
|
1444
|
-
}
|
|
1445
|
-
if (device.scanDuration !== undefined) {
|
|
1446
|
-
config['scanDuration'] = device.scanDuration;
|
|
1237
|
+
// Bot Allow Push
|
|
1238
|
+
if (device.bot?.allowPush) {
|
|
1239
|
+
this.allowPush = true;
|
|
1447
1240
|
}
|
|
1448
|
-
|
|
1449
|
-
|
|
1241
|
+
else {
|
|
1242
|
+
this.allowPush = false;
|
|
1450
1243
|
}
|
|
1451
|
-
|
|
1452
|
-
|
|
1244
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Allowing Push Changes: ${this.allowPush}`);
|
|
1245
|
+
// Bot Multi Press Count
|
|
1246
|
+
this.multiPressCount = 0;
|
|
1247
|
+
}
|
|
1248
|
+
async BLEPushConnection() {
|
|
1249
|
+
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
1250
|
+
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Push Changes`);
|
|
1251
|
+
await this.openAPIpushChanges();
|
|
1453
1252
|
}
|
|
1454
|
-
|
|
1455
|
-
|
|
1253
|
+
}
|
|
1254
|
+
async BLERefreshConnection(switchbot) {
|
|
1255
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} wasn't able to establish BLE Connection, node-switchbot:`
|
|
1256
|
+
+ ` ${JSON.stringify(switchbot)}`);
|
|
1257
|
+
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
1258
|
+
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Refresh Status`);
|
|
1259
|
+
await this.openAPIRefreshStatus();
|
|
1456
1260
|
}
|
|
1457
|
-
|
|
1458
|
-
|
|
1261
|
+
}
|
|
1262
|
+
async offlineOff() {
|
|
1263
|
+
if (this.device.offline) {
|
|
1264
|
+
if (this.botDeviceType === 'garagedoor') {
|
|
1265
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.TargetDoorState, this.hap.Characteristic.TargetDoorState.CLOSED);
|
|
1266
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.CurrentDoorState, this.hap.Characteristic.CurrentDoorState.CLOSED);
|
|
1267
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.ObstructionDetected, false);
|
|
1268
|
+
}
|
|
1269
|
+
else if (this.botDeviceType === 'door') {
|
|
1270
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
1271
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
1272
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
1273
|
+
}
|
|
1274
|
+
else if (this.botDeviceType === 'window') {
|
|
1275
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
1276
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
1277
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
1278
|
+
}
|
|
1279
|
+
else if (this.botDeviceType === 'windowcovering') {
|
|
1280
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
1281
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
1282
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
1283
|
+
}
|
|
1284
|
+
else if (this.botDeviceType === 'lock') {
|
|
1285
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.hap.Characteristic.LockTargetState.SECURED);
|
|
1286
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.hap.Characteristic.LockCurrentState.SECURED);
|
|
1287
|
+
}
|
|
1288
|
+
else if (this.botDeviceType === 'faucet') {
|
|
1289
|
+
this.Faucet.Service.updateCharacteristic(this.hap.Characteristic.Active, this.hap.Characteristic.Active.INACTIVE);
|
|
1290
|
+
}
|
|
1291
|
+
else if (this.botDeviceType === 'fan') {
|
|
1292
|
+
this.Fan.Service.updateCharacteristic(this.hap.Characteristic.On, false);
|
|
1293
|
+
}
|
|
1294
|
+
else if (this.botDeviceType === 'stateful') {
|
|
1295
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent, this.hap.Characteristic.ProgrammableSwitchEvent.SINGLE_PRESS);
|
|
1296
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, 0);
|
|
1297
|
+
}
|
|
1298
|
+
else if (this.botDeviceType === 'switch') {
|
|
1299
|
+
this.Switch.Service.updateCharacteristic(this.hap.Characteristic.On, false);
|
|
1300
|
+
}
|
|
1301
|
+
else {
|
|
1302
|
+
this.Outlet.Service.updateCharacteristic(this.hap.Characteristic.On, false);
|
|
1303
|
+
}
|
|
1459
1304
|
}
|
|
1460
1305
|
}
|
|
1461
|
-
async
|
|
1462
|
-
if (this.
|
|
1463
|
-
this.
|
|
1464
|
-
this.
|
|
1306
|
+
async apiError(e) {
|
|
1307
|
+
if (this.botDeviceType === 'garagedoor') {
|
|
1308
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.TargetDoorState, e);
|
|
1309
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.CurrentDoorState, e);
|
|
1310
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.ObstructionDetected, e);
|
|
1465
1311
|
}
|
|
1466
|
-
else if (
|
|
1467
|
-
this.
|
|
1468
|
-
this.
|
|
1312
|
+
else if (this.botDeviceType === 'door') {
|
|
1313
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, e);
|
|
1314
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, e);
|
|
1315
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.PositionState, e);
|
|
1469
1316
|
}
|
|
1470
|
-
else if (this.
|
|
1471
|
-
this.
|
|
1472
|
-
this.
|
|
1317
|
+
else if (this.botDeviceType === 'window') {
|
|
1318
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, e);
|
|
1319
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, e);
|
|
1320
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.PositionState, e);
|
|
1473
1321
|
}
|
|
1474
|
-
else {
|
|
1475
|
-
this.
|
|
1476
|
-
this.
|
|
1322
|
+
else if (this.botDeviceType === 'windowcovering') {
|
|
1323
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, e);
|
|
1324
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, e);
|
|
1325
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.PositionState, e);
|
|
1477
1326
|
}
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
*/
|
|
1482
|
-
infoLog(...log) {
|
|
1483
|
-
if (this.enablingDeviceLogging()) {
|
|
1484
|
-
this.platform.log.info(String(...log));
|
|
1327
|
+
else if (this.botDeviceType === 'lock') {
|
|
1328
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, e);
|
|
1329
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, e);
|
|
1485
1330
|
}
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
if (this.enablingDeviceLogging()) {
|
|
1489
|
-
this.platform.log.warn(String(...log));
|
|
1331
|
+
else if (this.botDeviceType === 'faucet') {
|
|
1332
|
+
this.Faucet.Service.updateCharacteristic(this.hap.Characteristic.Active, e);
|
|
1490
1333
|
}
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
if (this.enablingDeviceLogging()) {
|
|
1494
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
1495
|
-
this.platform.log.warn('[DEBUG]', String(...log));
|
|
1496
|
-
}
|
|
1334
|
+
else if (this.botDeviceType === 'fan') {
|
|
1335
|
+
this.Fan.Service.updateCharacteristic(this.hap.Characteristic.On, e);
|
|
1497
1336
|
}
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
this.platform.log.error(String(...log));
|
|
1337
|
+
else if (this.botDeviceType === 'stateful') {
|
|
1338
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent, e);
|
|
1339
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, e);
|
|
1502
1340
|
}
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
if (this.enablingDeviceLogging()) {
|
|
1506
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
1507
|
-
this.platform.log.error('[DEBUG]', String(...log));
|
|
1508
|
-
}
|
|
1341
|
+
else if (this.botDeviceType === 'switch') {
|
|
1342
|
+
this.Switch.Service.updateCharacteristic(this.hap.Characteristic.On, e);
|
|
1509
1343
|
}
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
if (this.enablingDeviceLogging()) {
|
|
1513
|
-
if (this.deviceLogging === 'debug') {
|
|
1514
|
-
this.platform.log.info('[DEBUG]', String(...log));
|
|
1515
|
-
}
|
|
1516
|
-
else {
|
|
1517
|
-
this.platform.log.debug(String(...log));
|
|
1518
|
-
}
|
|
1344
|
+
else {
|
|
1345
|
+
this.Outlet.Service.updateCharacteristic(this.hap.Characteristic.On, e);
|
|
1519
1346
|
}
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
|
|
1347
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
|
|
1348
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
|
|
1523
1349
|
}
|
|
1524
1350
|
}
|
|
1525
1351
|
//# sourceMappingURL=bot.js.map
|