@switchbot/homebridge-switchbot 3.5.0-beta.5 → 3.5.0-beta.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/config.schema.json +120 -17
- package/dist/device/blindtilt.d.ts +21 -94
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +352 -757
- package/dist/device/blindtilt.js.map +1 -1
- package/dist/device/bot.d.ts +25 -71
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +588 -761
- package/dist/device/bot.js.map +1 -1
- package/dist/device/ceilinglight.d.ts +13 -67
- package/dist/device/ceilinglight.d.ts.map +1 -1
- package/dist/device/ceilinglight.js +214 -588
- package/dist/device/ceilinglight.js.map +1 -1
- package/dist/device/colorbulb.d.ts +13 -74
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +256 -634
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.d.ts +14 -65
- package/dist/device/contact.d.ts.map +1 -1
- package/dist/device/contact.js +209 -532
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts +17 -86
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +340 -787
- package/dist/device/curtain.js.map +1 -1
- package/dist/device/device.d.ts +59 -0
- package/dist/device/device.d.ts.map +1 -0
- package/dist/device/device.js +682 -0
- package/dist/device/device.js.map +1 -0
- package/dist/device/fan.d.ts +51 -0
- package/dist/device/fan.d.ts.map +1 -0
- package/dist/device/fan.js +505 -0
- package/dist/device/fan.js.map +1 -0
- package/dist/device/hub.d.ts +15 -59
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +247 -597
- package/dist/device/hub.js.map +1 -1
- package/dist/device/humidifier.d.ts +10 -65
- package/dist/device/humidifier.d.ts.map +1 -1
- package/dist/device/humidifier.js +218 -579
- package/dist/device/humidifier.js.map +1 -1
- package/dist/device/iosensor.d.ts +11 -64
- package/dist/device/iosensor.d.ts.map +1 -1
- package/dist/device/iosensor.js +179 -585
- package/dist/device/iosensor.js.map +1 -1
- package/dist/device/lightstrip.d.ts +10 -68
- package/dist/device/lightstrip.d.ts.map +1 -1
- package/dist/device/lightstrip.js +257 -569
- package/dist/device/lightstrip.js.map +1 -1
- package/dist/device/lock.d.ts +15 -62
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +215 -543
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.d.ts +13 -63
- package/dist/device/meter.d.ts.map +1 -1
- package/dist/device/meter.js +175 -578
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.d.ts +13 -64
- package/dist/device/meterplus.d.ts.map +1 -1
- package/dist/device/meterplus.js +164 -578
- package/dist/device/meterplus.js.map +1 -1
- package/dist/device/motion.d.ts +13 -69
- package/dist/device/motion.d.ts.map +1 -1
- package/dist/device/motion.js +142 -520
- package/dist/device/motion.js.map +1 -1
- package/dist/device/plug.d.ts +9 -57
- package/dist/device/plug.d.ts.map +1 -1
- package/dist/device/plug.js +87 -453
- package/dist/device/plug.js.map +1 -1
- package/dist/device/robotvacuumcleaner.d.ts +11 -62
- package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
- package/dist/device/robotvacuumcleaner.js +145 -452
- package/dist/device/robotvacuumcleaner.js.map +1 -1
- package/dist/device/waterdetector.d.ts +9 -70
- package/dist/device/waterdetector.d.ts.map +1 -1
- package/dist/device/waterdetector.js +126 -665
- package/dist/device/waterdetector.js.map +1 -1
- package/dist/homebridge-ui/public/index.html +2 -2
- package/dist/index.js +1 -1
- package/dist/irdevice/airconditioner.d.ts +8 -48
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js +309 -419
- package/dist/irdevice/airconditioner.js.map +1 -1
- package/dist/irdevice/airpurifier.d.ts +7 -38
- package/dist/irdevice/airpurifier.d.ts.map +1 -1
- package/dist/irdevice/airpurifier.js +72 -304
- package/dist/irdevice/airpurifier.js.map +1 -1
- package/dist/irdevice/camera.d.ts +6 -35
- package/dist/irdevice/camera.d.ts.map +1 -1
- package/dist/irdevice/camera.js +34 -278
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts +6 -39
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +67 -311
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +40 -0
- package/dist/irdevice/irdevice.d.ts.map +1 -0
- package/dist/irdevice/irdevice.js +512 -0
- package/dist/irdevice/irdevice.js.map +1 -0
- package/dist/irdevice/light.d.ts +6 -34
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +23 -272
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.d.ts +18 -47
- package/dist/irdevice/other.d.ts.map +1 -1
- package/dist/irdevice/other.js +352 -546
- package/dist/irdevice/other.js.map +1 -1
- package/dist/irdevice/tv.d.ts +7 -39
- package/dist/irdevice/tv.d.ts.map +1 -1
- package/dist/irdevice/tv.js +82 -321
- package/dist/irdevice/tv.js.map +1 -1
- package/dist/irdevice/vacuumcleaner.d.ts +6 -35
- package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
- package/dist/irdevice/vacuumcleaner.js +41 -284
- package/dist/irdevice/vacuumcleaner.js.map +1 -1
- package/dist/irdevice/waterheater.d.ts +6 -35
- package/dist/irdevice/waterheater.d.ts.map +1 -1
- package/dist/irdevice/waterheater.js +42 -287
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/platform.d.ts +14 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +291 -147
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +41 -11
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +0 -552
- package/dist/settings.js.map +1 -1
- package/dist/utils.d.ts +77 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +638 -1
- package/dist/utils.js.map +1 -1
- package/eslint.config.js +87 -0
- package/package.json +16 -15
- package/src/custom.d.ts +2 -1
- package/src/device/blindtilt.ts +378 -783
- package/src/device/bot.ts +621 -845
- package/src/device/ceilinglight.ts +227 -608
- package/src/device/colorbulb.ts +269 -657
- package/src/device/contact.ts +235 -555
- package/src/device/curtain.ts +360 -811
- package/src/device/device.ts +710 -0
- package/src/device/fan.ts +554 -0
- package/src/device/hub.ts +274 -625
- package/src/device/humidifier.ts +246 -624
- package/src/device/iosensor.ts +205 -611
- package/src/device/lightstrip.ts +278 -597
- package/src/device/lock.ts +252 -583
- package/src/device/meter.ts +200 -601
- package/src/device/meterplus.ts +189 -603
- package/src/device/motion.ts +161 -542
- package/src/device/plug.ts +97 -481
- package/src/device/robotvacuumcleaner.ts +166 -478
- package/src/device/waterdetector.ts +143 -689
- package/src/homebridge-ui/public/index.html +2 -2
- package/src/index.ts +1 -1
- package/src/irdevice/airconditioner.ts +330 -446
- package/src/irdevice/airpurifier.ts +89 -321
- package/src/irdevice/camera.ts +42 -293
- package/src/irdevice/fan.ts +78 -327
- package/src/irdevice/irdevice.ts +528 -0
- package/src/irdevice/light.ts +32 -287
- package/src/irdevice/other.ts +396 -615
- package/src/irdevice/tv.ts +100 -339
- package/src/irdevice/vacuumcleaner.ts +49 -305
- package/src/irdevice/waterheater.ts +50 -310
- package/src/platform.ts +301 -155
- package/src/settings.ts +57 -566
- package/src/utils.ts +642 -1
package/dist/device/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,78 @@ 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
|
+
const version = deviceStatus.body.version?.toString();
|
|
446
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
|
|
447
|
+
if (deviceStatus.body.version) {
|
|
448
|
+
this.accessory.context.version = version?.replace(/^V|-.*$/g, '');
|
|
449
|
+
this.accessory
|
|
450
|
+
.getService(this.hap.Service.AccessoryInformation)
|
|
451
|
+
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
|
|
452
|
+
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
453
|
+
.updateValue(this.accessory.context.version);
|
|
470
454
|
}
|
|
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
455
|
}
|
|
480
456
|
/**
|
|
481
457
|
* Asks the SwitchBot API for the latest device information
|
|
@@ -509,99 +485,42 @@ export class Bot {
|
|
|
509
485
|
// Start to monitor advertisement packets
|
|
510
486
|
(async () => {
|
|
511
487
|
// Start to monitor advertisement packets
|
|
512
|
-
await switchbot.startScan({
|
|
513
|
-
model: 'H',
|
|
514
|
-
id: this.device.bleMac,
|
|
515
|
-
});
|
|
488
|
+
await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
|
|
516
489
|
// Set an event handler
|
|
517
490
|
switchbot.onadvertisement = (ad) => {
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
491
|
+
if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
|
|
492
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
|
|
493
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
|
|
521
494
|
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
495
|
}
|
|
526
496
|
else {
|
|
527
497
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
528
498
|
}
|
|
529
499
|
};
|
|
530
|
-
// Wait
|
|
500
|
+
// Wait 10 seconds
|
|
531
501
|
await switchbot.wait(this.scanDuration * 1000);
|
|
532
502
|
// Stop to monitor
|
|
533
503
|
await switchbot.stopScan();
|
|
534
504
|
// Update HomeKit
|
|
535
|
-
await this.BLEparseStatus();
|
|
505
|
+
await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
|
|
536
506
|
await this.updateHomeKitCharacteristics();
|
|
537
507
|
})();
|
|
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
|
-
}*/
|
|
508
|
+
if (switchbot === undefined) {
|
|
509
|
+
await this.BLERefreshConnection(switchbot);
|
|
510
|
+
}
|
|
587
511
|
}
|
|
588
512
|
async openAPIRefreshStatus() {
|
|
589
513
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
|
|
590
514
|
try {
|
|
591
|
-
const { body, statusCode } = await
|
|
592
|
-
headers: this.platform.generateHeaders(),
|
|
593
|
-
});
|
|
515
|
+
const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
|
|
594
516
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
|
|
595
517
|
const deviceStatus = await body.json();
|
|
596
518
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
597
519
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
598
520
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
599
|
-
this.
|
|
521
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
600
522
|
+ `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();
|
|
523
|
+
this.openAPIparseStatus(deviceStatus);
|
|
605
524
|
this.updateHomeKitCharacteristics();
|
|
606
525
|
}
|
|
607
526
|
else {
|
|
@@ -646,8 +565,9 @@ export class Bot {
|
|
|
646
565
|
}
|
|
647
566
|
async BLEpushChanges() {
|
|
648
567
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`);
|
|
649
|
-
|
|
650
|
-
|
|
568
|
+
const On = await this.getOn();
|
|
569
|
+
if (On !== this.accessory.context.On || this.allowPush) {
|
|
570
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges On: ${On} OnCached: ${this.accessory.context.On}`);
|
|
651
571
|
const switchbot = await this.platform.connectBLE();
|
|
652
572
|
// Convert to BLE Address
|
|
653
573
|
this.device.bleMac = this.device
|
|
@@ -661,20 +581,22 @@ export class Bot {
|
|
|
661
581
|
switchbot
|
|
662
582
|
.discover({ model: 'H', quick: true, id: this.device.bleMac })
|
|
663
583
|
.then(async (device_list) => {
|
|
664
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${
|
|
584
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${On}`);
|
|
665
585
|
return await device_list[0].press({ id: this.device.bleMac });
|
|
666
586
|
})
|
|
667
587
|
.then(() => {
|
|
668
588
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
669
|
-
this.
|
|
589
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
590
|
+
+ `On: ${On} sent over BLE, sent successfully`);
|
|
591
|
+
this.accessory.context.On = On;
|
|
670
592
|
setTimeout(() => {
|
|
671
593
|
if (this.botDeviceType === 'switch') {
|
|
672
|
-
this.
|
|
594
|
+
this.Switch.Service.getCharacteristic(this.hap.Characteristic.On).updateValue(On);
|
|
673
595
|
}
|
|
674
596
|
else {
|
|
675
|
-
this.
|
|
597
|
+
this.Outlet.Service.getCharacteristic(this.hap.Characteristic.On).updateValue(On);
|
|
676
598
|
}
|
|
677
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${
|
|
599
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${On}, Switch Timeout`);
|
|
678
600
|
}, 500);
|
|
679
601
|
})
|
|
680
602
|
.catch(async (e) => {
|
|
@@ -689,11 +611,11 @@ export class Bot {
|
|
|
689
611
|
switchbot
|
|
690
612
|
.discover({ model: 'H', quick: true, id: this.device.bleMac })
|
|
691
613
|
.then(async (device_list) => {
|
|
692
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${
|
|
693
|
-
return await this.
|
|
694
|
-
max: this.
|
|
614
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${On}`);
|
|
615
|
+
return await this.retryBLE({
|
|
616
|
+
max: await this.maxRetryBLE(),
|
|
695
617
|
fn: async () => {
|
|
696
|
-
if (
|
|
618
|
+
if (On) {
|
|
697
619
|
return await device_list[0].turnOn({ id: this.device.bleMac });
|
|
698
620
|
}
|
|
699
621
|
else {
|
|
@@ -704,12 +626,12 @@ export class Bot {
|
|
|
704
626
|
})
|
|
705
627
|
.then(() => {
|
|
706
628
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
707
|
-
this.accessory.context.On =
|
|
629
|
+
this.accessory.context.On = On;
|
|
708
630
|
})
|
|
709
631
|
.catch(async (e) => {
|
|
710
632
|
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)}`);
|
|
633
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushChanges with ${this.device.connectionType}`
|
|
634
|
+
+ ` Connection & botMode: ${this.botMode}, Error Message: ${JSON.stringify(e.message)}`);
|
|
713
635
|
await this.BLEPushConnection();
|
|
714
636
|
});
|
|
715
637
|
}
|
|
@@ -718,31 +640,32 @@ export class Bot {
|
|
|
718
640
|
}
|
|
719
641
|
}
|
|
720
642
|
else {
|
|
721
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges
|
|
643
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges, On: ${On}, OnCached: ${this.accessory.context.On}`);
|
|
722
644
|
}
|
|
723
645
|
}
|
|
724
646
|
async openAPIpushChanges() {
|
|
725
647
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
|
|
648
|
+
let On = await this.getOn();
|
|
726
649
|
if (this.multiPressCount > 0) {
|
|
727
650
|
this.debugLog(`${this.device.deviceType}: ${this.multiPressCount} request(s) queued.`);
|
|
728
|
-
|
|
651
|
+
On = true;
|
|
729
652
|
}
|
|
730
|
-
if (
|
|
653
|
+
if (On !== this.accessory.context.On || this.allowPush || this.multiPressCount > 0) {
|
|
731
654
|
let command = '';
|
|
732
|
-
if (this.botMode === 'switch' &&
|
|
655
|
+
if (this.botMode === 'switch' && On) {
|
|
733
656
|
command = 'turnOn';
|
|
734
|
-
|
|
735
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Switch Mode, Turning ${
|
|
657
|
+
On = true;
|
|
658
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Switch Mode, Turning ${On}`);
|
|
736
659
|
}
|
|
737
|
-
else if (this.botMode === 'switch' && !
|
|
660
|
+
else if (this.botMode === 'switch' && !On) {
|
|
738
661
|
command = 'turnOff';
|
|
739
|
-
|
|
740
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Switch Mode, Turning ${
|
|
662
|
+
On = false;
|
|
663
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Switch Mode, Turning ${On}`);
|
|
741
664
|
}
|
|
742
665
|
else if (this.botMode === 'press' || this.botMode === 'multipress') {
|
|
743
666
|
command = 'press';
|
|
744
667
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Press Mode`);
|
|
745
|
-
|
|
668
|
+
On = false;
|
|
746
669
|
}
|
|
747
670
|
else {
|
|
748
671
|
throw new Error(`${this.device.deviceType}: ${this.accessory.displayName} Device Parameters not set for this Bot.`);
|
|
@@ -765,8 +688,10 @@ export class Bot {
|
|
|
765
688
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
|
|
766
689
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
767
690
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
768
|
-
this.
|
|
691
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
769
692
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
693
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
694
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(bodyChange)} sent successfully`);
|
|
770
695
|
}
|
|
771
696
|
else {
|
|
772
697
|
this.statusCode(statusCode);
|
|
@@ -776,21 +701,20 @@ export class Bot {
|
|
|
776
701
|
this.multiPressCount--;
|
|
777
702
|
if (this.multiPressCount > 0) {
|
|
778
703
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Multi Press Count: ${this.multiPressCount}`);
|
|
779
|
-
|
|
704
|
+
On = true;
|
|
780
705
|
this.openAPIpushChanges();
|
|
781
706
|
}
|
|
782
707
|
}
|
|
783
708
|
}
|
|
784
709
|
catch (e) {
|
|
785
710
|
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)}`);
|
|
711
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIpushChanges with ${this.device.connectionType}`
|
|
712
|
+
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
788
713
|
}
|
|
789
714
|
}
|
|
790
715
|
else {
|
|
791
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges
|
|
792
|
-
`On: ${this.On}
|
|
793
|
-
`OnCached: ${this.accessory.context.On}`);
|
|
716
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges,`
|
|
717
|
+
+ ` On: ${On}, OnCached: ${this.accessory.context.On}`);
|
|
794
718
|
}
|
|
795
719
|
}
|
|
796
720
|
/**
|
|
@@ -800,59 +724,101 @@ export class Bot {
|
|
|
800
724
|
if (this.botDeviceType === 'garagedoor') {
|
|
801
725
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetDoorState: ${value}`);
|
|
802
726
|
if (value === this.hap.Characteristic.TargetDoorState.CLOSED) {
|
|
803
|
-
this.
|
|
727
|
+
await this.setOn(false);
|
|
728
|
+
this.GarageDoor.On = false;
|
|
804
729
|
}
|
|
805
730
|
else {
|
|
806
|
-
this.
|
|
731
|
+
await this.setOn(true);
|
|
732
|
+
this.GarageDoor.On = true;
|
|
807
733
|
}
|
|
808
734
|
}
|
|
809
|
-
else if (this.botDeviceType === 'door'
|
|
810
|
-
this.botDeviceType === 'window' ||
|
|
811
|
-
this.botDeviceType === 'windowcovering') {
|
|
735
|
+
else if (this.botDeviceType === 'door') {
|
|
812
736
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetPosition: ${value}`);
|
|
813
737
|
if (value === 0) {
|
|
814
|
-
this.
|
|
738
|
+
await this.setOn(false);
|
|
739
|
+
this.Door.On = false;
|
|
815
740
|
}
|
|
816
741
|
else {
|
|
817
|
-
this.
|
|
742
|
+
await this.setOn(true);
|
|
743
|
+
this.Door.On = true;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
else if (this.botDeviceType === 'window') {
|
|
747
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetPosition: ${value}`);
|
|
748
|
+
if (value === 0) {
|
|
749
|
+
await this.setOn(false);
|
|
750
|
+
this.Window.On = false;
|
|
751
|
+
}
|
|
752
|
+
else {
|
|
753
|
+
await this.setOn(true);
|
|
754
|
+
this.Window.On = true;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
else if (this.botDeviceType === 'windowcovering') {
|
|
758
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetPosition: ${value}`);
|
|
759
|
+
if (value === 0) {
|
|
760
|
+
await this.setOn(false);
|
|
761
|
+
this.WindowCovering.On = false;
|
|
762
|
+
}
|
|
763
|
+
else {
|
|
764
|
+
await this.setOn(true);
|
|
765
|
+
this.WindowCovering.On = true;
|
|
818
766
|
}
|
|
819
767
|
}
|
|
820
768
|
else if (this.botDeviceType === 'lock') {
|
|
821
769
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set LockTargetState: ${value}`);
|
|
822
770
|
if (value === this.hap.Characteristic.LockTargetState.SECURED) {
|
|
823
|
-
this.
|
|
771
|
+
await this.setOn(false);
|
|
772
|
+
this.Lock.On = false;
|
|
824
773
|
}
|
|
825
774
|
else {
|
|
826
|
-
this.
|
|
775
|
+
await this.setOn(true);
|
|
776
|
+
this.Lock.On = true;
|
|
827
777
|
}
|
|
828
778
|
}
|
|
829
779
|
else if (this.botDeviceType === 'faucet') {
|
|
830
780
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Active: ${value}`);
|
|
831
781
|
if (value === this.hap.Characteristic.Active.INACTIVE) {
|
|
832
|
-
this.
|
|
782
|
+
await this.setOn(false);
|
|
783
|
+
this.Faucet.On = false;
|
|
833
784
|
}
|
|
834
785
|
else {
|
|
835
|
-
this.
|
|
786
|
+
await this.setOn(true);
|
|
787
|
+
this.Faucet.On = true;
|
|
836
788
|
}
|
|
837
789
|
}
|
|
838
790
|
else if (this.botDeviceType === 'stateful') {
|
|
839
791
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ProgrammableSwitchOutputState: ${value}`);
|
|
840
792
|
if (value === 0) {
|
|
841
|
-
this.
|
|
793
|
+
await this.setOn(false);
|
|
794
|
+
this.StatefulProgrammableSwitch.On = false;
|
|
842
795
|
}
|
|
843
796
|
else {
|
|
844
|
-
this.
|
|
797
|
+
await this.setOn(true);
|
|
798
|
+
this.StatefulProgrammableSwitch.On = true;
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
else if (this.botDeviceType === 'switch') {
|
|
802
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ProgrammableSwitchOutputState: ${value}`);
|
|
803
|
+
if (value === 0) {
|
|
804
|
+
await this.setOn(false);
|
|
805
|
+
this.Switch.On = false;
|
|
806
|
+
}
|
|
807
|
+
else {
|
|
808
|
+
await this.setOn(true);
|
|
809
|
+
this.Switch.On = true;
|
|
845
810
|
}
|
|
846
811
|
}
|
|
847
812
|
else {
|
|
848
813
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set On: ${value}`);
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
814
|
+
await this.setOn(Boolean(value));
|
|
815
|
+
this.Outlet.On = value;
|
|
816
|
+
}
|
|
817
|
+
if (this.device.bot?.mode === 'multipress') {
|
|
818
|
+
if (value === true) {
|
|
819
|
+
this.multiPressCount++;
|
|
820
|
+
this.debugLog(`${this.device.deviceType} set to Multi-Press. Multi-Press count: ${this.multiPressCount}`);
|
|
854
821
|
}
|
|
855
|
-
this.On = value;
|
|
856
822
|
}
|
|
857
823
|
this.doBotUpdate.next();
|
|
858
824
|
}
|
|
@@ -862,508 +828,360 @@ export class Bot {
|
|
|
862
828
|
async updateHomeKitCharacteristics() {
|
|
863
829
|
// State
|
|
864
830
|
if (this.botDeviceType === 'garagedoor') {
|
|
865
|
-
if (this.On === undefined) {
|
|
866
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
831
|
+
if (this.GarageDoor.On === undefined) {
|
|
832
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.GarageDoor.On}`);
|
|
867
833
|
}
|
|
868
834
|
else {
|
|
869
|
-
if (this.On) {
|
|
870
|
-
this.
|
|
871
|
-
this.
|
|
872
|
-
this.debugLog(`${this.device.deviceType}:
|
|
835
|
+
if (this.GarageDoor.On) {
|
|
836
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.TargetDoorState, this.hap.Characteristic.TargetDoorState.OPEN);
|
|
837
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.CurrentDoorState, this.hap.Characteristic.CurrentDoorState.OPEN);
|
|
838
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
839
|
+
+ ` TargetDoorState: Open, CurrentDoorState: Open (${this.GarageDoor.On})`);
|
|
873
840
|
}
|
|
874
841
|
else {
|
|
875
|
-
this.
|
|
876
|
-
this.
|
|
877
|
-
this.debugLog(`${this.device.deviceType}:
|
|
842
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.TargetDoorState, this.hap.Characteristic.TargetDoorState.CLOSED);
|
|
843
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.CurrentDoorState, this.hap.Characteristic.CurrentDoorState.CLOSED);
|
|
844
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
845
|
+
+ ` TargetDoorState: Open, CurrentDoorState: Open (${this.GarageDoor.On})`);
|
|
878
846
|
}
|
|
879
847
|
}
|
|
880
|
-
this.
|
|
848
|
+
await this.setOn(Boolean(this.GarageDoor.On));
|
|
849
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Garage Door On: ${this.GarageDoor.On}`);
|
|
881
850
|
}
|
|
882
851
|
else if (this.botDeviceType === 'door') {
|
|
883
|
-
if (this.On === undefined) {
|
|
884
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
852
|
+
if (this.Door.On === undefined) {
|
|
853
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Door.On}`);
|
|
885
854
|
}
|
|
886
855
|
else {
|
|
887
|
-
if (this.On) {
|
|
888
|
-
this.
|
|
889
|
-
this.
|
|
890
|
-
this.
|
|
891
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
856
|
+
if (this.Door.On) {
|
|
857
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 100);
|
|
858
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 100);
|
|
859
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
860
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
861
|
+
+ ` TargetPosition: 100, CurrentPosition: 100 (${this.Door.On})`);
|
|
892
862
|
}
|
|
893
863
|
else {
|
|
894
|
-
this.
|
|
895
|
-
this.
|
|
896
|
-
this.
|
|
897
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
864
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
865
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
866
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
867
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
868
|
+
+ ` TargetPosition: 0, CurrentPosition: 0 (${this.Door.On})`);
|
|
898
869
|
}
|
|
899
870
|
}
|
|
900
|
-
this.
|
|
871
|
+
await this.setOn(Boolean(this.Door.On));
|
|
872
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Door On: ${this.Door.On}`);
|
|
901
873
|
}
|
|
902
874
|
else if (this.botDeviceType === 'window') {
|
|
903
|
-
if (this.On === undefined) {
|
|
904
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
875
|
+
if (this.Window.On === undefined) {
|
|
876
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Window.On}`);
|
|
905
877
|
}
|
|
906
878
|
else {
|
|
907
|
-
if (this.On) {
|
|
908
|
-
this.
|
|
909
|
-
this.
|
|
910
|
-
this.
|
|
911
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
879
|
+
if (this.Window.On) {
|
|
880
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 100);
|
|
881
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 100);
|
|
882
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
883
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
884
|
+
+ ` TargetPosition: 100, CurrentPosition: 100 (${this.Window.On})`);
|
|
912
885
|
}
|
|
913
886
|
else {
|
|
914
|
-
this.
|
|
915
|
-
this.
|
|
916
|
-
this.
|
|
917
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
887
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
888
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
889
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
890
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
891
|
+
+ ` TargetPosition: 0, CurrentPosition: 0 (${this.Window.On})`);
|
|
918
892
|
}
|
|
919
893
|
}
|
|
920
|
-
this.
|
|
894
|
+
await this.setOn(Boolean(this.Window.On));
|
|
895
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Window On: ${this.Window.On}`);
|
|
921
896
|
}
|
|
922
897
|
else if (this.botDeviceType === 'windowcovering') {
|
|
923
|
-
if (this.On === undefined) {
|
|
924
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
898
|
+
if (this.WindowCovering.On === undefined) {
|
|
899
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.WindowCovering.On}`);
|
|
925
900
|
}
|
|
926
901
|
else {
|
|
927
|
-
if (this.On) {
|
|
928
|
-
this.
|
|
929
|
-
this.
|
|
930
|
-
this.
|
|
931
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
902
|
+
if (this.WindowCovering.On) {
|
|
903
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 100);
|
|
904
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 100);
|
|
905
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
906
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
907
|
+
+ ` TargetPosition: 100, CurrentPosition: 100 (${this.WindowCovering.On})`);
|
|
932
908
|
}
|
|
933
909
|
else {
|
|
934
|
-
this.
|
|
935
|
-
this.
|
|
936
|
-
this.
|
|
937
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
910
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
911
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
912
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
913
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
914
|
+
+ ` TargetPosition: 0, CurrentPosition: 0 (${this.WindowCovering.On})`);
|
|
938
915
|
}
|
|
939
916
|
}
|
|
940
|
-
this.
|
|
917
|
+
await this.setOn(Boolean(this.WindowCovering.On));
|
|
918
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Window Covering On: ${this.WindowCovering.On}`);
|
|
941
919
|
}
|
|
942
920
|
else if (this.botDeviceType === 'lock') {
|
|
943
|
-
if (this.On === undefined) {
|
|
944
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
921
|
+
if (this.Lock.On === undefined) {
|
|
922
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Lock.On}`);
|
|
945
923
|
}
|
|
946
924
|
else {
|
|
947
|
-
if (this.On) {
|
|
948
|
-
this.
|
|
949
|
-
this.
|
|
950
|
-
this.debugLog(`${this.device.deviceType}: `
|
|
951
|
-
|
|
925
|
+
if (this.Lock.On) {
|
|
926
|
+
this.Lock.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.hap.Characteristic.LockTargetState.UNSECURED);
|
|
927
|
+
this.Lock.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.hap.Characteristic.LockCurrentState.UNSECURED);
|
|
928
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristicc`
|
|
929
|
+
+ ` LockTargetState: UNSECURED, LockCurrentState: UNSECURED (${this.Lock.On})`);
|
|
952
930
|
}
|
|
953
931
|
else {
|
|
954
|
-
this.
|
|
955
|
-
this.
|
|
956
|
-
this.debugLog(`${this.device.deviceType}:
|
|
932
|
+
this.Lock.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.hap.Characteristic.LockTargetState.SECURED);
|
|
933
|
+
this.Lock.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.hap.Characteristic.LockCurrentState.SECURED);
|
|
934
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
935
|
+
+ ` LockTargetState: SECURED, LockCurrentState: SECURED (${this.Lock.On})`);
|
|
957
936
|
}
|
|
958
937
|
}
|
|
959
|
-
this.
|
|
938
|
+
await this.setOn(Boolean(this.Lock.On));
|
|
939
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Lock On: ${this.Lock.On}`);
|
|
960
940
|
}
|
|
961
941
|
else if (this.botDeviceType === 'faucet') {
|
|
962
|
-
if (this.On === undefined) {
|
|
963
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
942
|
+
if (this.Faucet.On === undefined) {
|
|
943
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Faucet.On}`);
|
|
964
944
|
}
|
|
965
945
|
else {
|
|
966
|
-
if (this.On) {
|
|
967
|
-
this.
|
|
968
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.On}`);
|
|
946
|
+
if (this.Faucet.On) {
|
|
947
|
+
this.Faucet.Service.updateCharacteristic(this.hap.Characteristic.Active, this.hap.Characteristic.Active.ACTIVE);
|
|
948
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.Faucet.On}`);
|
|
969
949
|
}
|
|
970
950
|
else {
|
|
971
|
-
this.
|
|
972
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.On}`);
|
|
951
|
+
this.Faucet.Service.updateCharacteristic(this.hap.Characteristic.Active, this.hap.Characteristic.Active.INACTIVE);
|
|
952
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.Faucet.On}`);
|
|
973
953
|
}
|
|
974
954
|
}
|
|
975
|
-
this.
|
|
955
|
+
await this.setOn(Boolean(this.Faucet.On));
|
|
956
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Faucet On: ${this.Faucet.On}`);
|
|
976
957
|
}
|
|
977
958
|
else if (this.botDeviceType === 'fan') {
|
|
978
|
-
if (this.On === undefined) {
|
|
979
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
959
|
+
if (this.Fan.On === undefined) {
|
|
960
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Fan.On}`);
|
|
980
961
|
}
|
|
981
962
|
else {
|
|
982
|
-
if (this.On) {
|
|
983
|
-
this.
|
|
984
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
963
|
+
if (this.Fan.On) {
|
|
964
|
+
this.Fan.Service.updateCharacteristic(this.hap.Characteristic.On, this.Fan.On);
|
|
965
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.Fan.On}`);
|
|
985
966
|
}
|
|
986
967
|
else {
|
|
987
|
-
this.
|
|
988
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
968
|
+
this.Fan.Service.updateCharacteristic(this.hap.Characteristic.On, this.Fan.On);
|
|
969
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.Fan.On}`);
|
|
989
970
|
}
|
|
990
971
|
}
|
|
991
|
-
this.
|
|
972
|
+
await this.setOn(Boolean(this.Fan.On));
|
|
973
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Fan On: ${this.Fan.On}`);
|
|
992
974
|
}
|
|
993
975
|
else if (this.botDeviceType === 'stateful') {
|
|
994
|
-
if (this.On === undefined) {
|
|
995
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
976
|
+
if (this.StatefulProgrammableSwitch.On === undefined) {
|
|
977
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.StatefulProgrammableSwitch.On}`);
|
|
996
978
|
}
|
|
997
979
|
else {
|
|
998
|
-
if (this.On) {
|
|
999
|
-
this.
|
|
1000
|
-
this.
|
|
1001
|
-
this.debugLog(`${this.device.deviceType}: `
|
|
1002
|
-
|
|
980
|
+
if (this.StatefulProgrammableSwitch.On) {
|
|
981
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent, this.hap.Characteristic.ProgrammableSwitchEvent.SINGLE_PRESS);
|
|
982
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, 1);
|
|
983
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
984
|
+
+ ` ProgrammableSwitchEvent: SINGLE, ProgrammableSwitchOutputState: 1 (${this.StatefulProgrammableSwitch.On})`);
|
|
1003
985
|
}
|
|
1004
986
|
else {
|
|
1005
|
-
this.
|
|
1006
|
-
this.
|
|
1007
|
-
this.debugLog(`${this.device.deviceType}: `
|
|
1008
|
-
|
|
987
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent, this.hap.Characteristic.ProgrammableSwitchEvent.SINGLE_PRESS);
|
|
988
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, 0);
|
|
989
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
990
|
+
+ ` ProgrammableSwitchEvent: SINGLE, ProgrammableSwitchOutputState: 0 (${this.StatefulProgrammableSwitch.On})`);
|
|
1009
991
|
}
|
|
1010
992
|
}
|
|
1011
|
-
this.
|
|
993
|
+
await this.setOn(Boolean(this.StatefulProgrammableSwitch.On));
|
|
994
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatefulProgrammableSwitch On: ${this.StatefulProgrammableSwitch.On}`);
|
|
1012
995
|
}
|
|
1013
996
|
else if (this.botDeviceType === 'switch') {
|
|
1014
|
-
if (this.On === undefined) {
|
|
1015
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
997
|
+
if (this.Switch.On === undefined) {
|
|
998
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Switch.On}`);
|
|
1016
999
|
}
|
|
1017
1000
|
else {
|
|
1018
|
-
this.
|
|
1019
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
1001
|
+
this.Switch.Service.updateCharacteristic(this.hap.Characteristic.On, this.Switch.On);
|
|
1002
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.Switch.On}`);
|
|
1003
|
+
await this.setOn(Boolean(this.Switch.On));
|
|
1020
1004
|
}
|
|
1021
1005
|
}
|
|
1022
1006
|
else {
|
|
1023
|
-
if (this.On === undefined) {
|
|
1024
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
1007
|
+
if (this.Outlet.On === undefined) {
|
|
1008
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.Outlet.On}`);
|
|
1025
1009
|
}
|
|
1026
1010
|
else {
|
|
1027
|
-
this.
|
|
1028
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
1011
|
+
this.Outlet.Service.updateCharacteristic(this.hap.Characteristic.On, this.Outlet.On);
|
|
1012
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.Outlet.On}`);
|
|
1029
1013
|
}
|
|
1030
1014
|
}
|
|
1031
|
-
this.
|
|
1015
|
+
await this.setOn(Boolean(this.Outlet.On));
|
|
1016
|
+
this.accessory.context.On = await this.getOn();
|
|
1032
1017
|
// BatteryLevel
|
|
1033
|
-
if (this.BatteryLevel === undefined) {
|
|
1034
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}`);
|
|
1018
|
+
if (this.Battery.BatteryLevel === undefined) {
|
|
1019
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
1035
1020
|
}
|
|
1036
1021
|
else {
|
|
1037
|
-
this.accessory.context.BatteryLevel = this.BatteryLevel;
|
|
1038
|
-
this.
|
|
1039
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.BatteryLevel}`);
|
|
1022
|
+
this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
|
|
1023
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
|
|
1024
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
1040
1025
|
}
|
|
1041
1026
|
// StatusLowBattery
|
|
1042
|
-
if (this.StatusLowBattery === undefined) {
|
|
1043
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.StatusLowBattery}`);
|
|
1027
|
+
if (this.Battery.StatusLowBattery === undefined) {
|
|
1028
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
1044
1029
|
}
|
|
1045
1030
|
else {
|
|
1046
|
-
this.accessory.context.StatusLowBattery = this.StatusLowBattery;
|
|
1047
|
-
this.
|
|
1048
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
1031
|
+
this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
|
|
1032
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
|
|
1033
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
1034
|
+
+ ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
1049
1035
|
}
|
|
1050
1036
|
}
|
|
1051
1037
|
async removeOutletService(accessory) {
|
|
1052
1038
|
// If outletService still present, then remove first
|
|
1053
|
-
|
|
1054
|
-
|
|
1039
|
+
if (this.Outlet?.Service) {
|
|
1040
|
+
this.Outlet.Service = this.accessory.getService(this.hap.Service.Outlet);
|
|
1055
1041
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Outlet Service`);
|
|
1042
|
+
accessory.removeService(this.Outlet.Service);
|
|
1056
1043
|
}
|
|
1057
|
-
accessory.removeService(this.outletService);
|
|
1058
1044
|
}
|
|
1059
1045
|
async removeGarageDoorService(accessory) {
|
|
1060
1046
|
// If garageDoorService still present, then remove first
|
|
1061
|
-
|
|
1062
|
-
|
|
1047
|
+
if (this.GarageDoor?.Service) {
|
|
1048
|
+
this.GarageDoor.Service = this.accessory.getService(this.hap.Service.GarageDoorOpener);
|
|
1063
1049
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Garage Door Service`);
|
|
1050
|
+
accessory.removeService(this.GarageDoor.Service);
|
|
1064
1051
|
}
|
|
1065
|
-
accessory.removeService(this.garageDoorService);
|
|
1066
1052
|
}
|
|
1067
1053
|
async removeDoorService(accessory) {
|
|
1068
1054
|
// If doorService still present, then remove first
|
|
1069
|
-
|
|
1070
|
-
|
|
1055
|
+
if (this.Door?.Service) {
|
|
1056
|
+
this.Door.Service = this.accessory.getService(this.hap.Service.Door);
|
|
1071
1057
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Door Service`);
|
|
1058
|
+
accessory.removeService(this.Door.Service);
|
|
1072
1059
|
}
|
|
1073
|
-
accessory.removeService(this.doorService);
|
|
1074
1060
|
}
|
|
1075
1061
|
async removeLockService(accessory) {
|
|
1076
1062
|
// If lockService still present, then remove first
|
|
1077
|
-
|
|
1078
|
-
|
|
1063
|
+
if (this.Lock?.Service) {
|
|
1064
|
+
this.Lock.Service = this.accessory.getService(this.hap.Service.LockMechanism);
|
|
1079
1065
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Lock Service`);
|
|
1066
|
+
accessory.removeService(this.Lock.Service);
|
|
1080
1067
|
}
|
|
1081
|
-
accessory.removeService(this.lockService);
|
|
1082
1068
|
}
|
|
1083
1069
|
async removeFaucetService(accessory) {
|
|
1084
1070
|
// If faucetService still present, then remove first
|
|
1085
|
-
|
|
1086
|
-
|
|
1071
|
+
if (this.Faucet?.Service) {
|
|
1072
|
+
this.Faucet.Service = this.accessory.getService(this.hap.Service.Faucet);
|
|
1087
1073
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Faucet Service`);
|
|
1074
|
+
accessory.removeService(this.Faucet.Service);
|
|
1088
1075
|
}
|
|
1089
|
-
accessory.removeService(this.faucetService);
|
|
1090
1076
|
}
|
|
1091
1077
|
async removeFanService(accessory) {
|
|
1092
1078
|
// If fanService still present, then remove first
|
|
1093
|
-
|
|
1094
|
-
|
|
1079
|
+
if (this.Fan?.Service) {
|
|
1080
|
+
this.Fan.Service = this.accessory.getService(this.hap.Service.Fanv2);
|
|
1095
1081
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Fan Service`);
|
|
1082
|
+
accessory.removeService(this.Fan.Service);
|
|
1096
1083
|
}
|
|
1097
|
-
accessory.removeService(this.fanService);
|
|
1098
1084
|
}
|
|
1099
1085
|
async removeWindowService(accessory) {
|
|
1100
1086
|
// If windowService still present, then remove first
|
|
1101
|
-
|
|
1102
|
-
|
|
1087
|
+
if (this.Window?.Service) {
|
|
1088
|
+
this.Window.Service = this.accessory.getService(this.hap.Service.Window);
|
|
1103
1089
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Window Service`);
|
|
1090
|
+
accessory.removeService(this.Window.Service);
|
|
1104
1091
|
}
|
|
1105
|
-
accessory.removeService(this.windowService);
|
|
1106
1092
|
}
|
|
1107
1093
|
async removeWindowCoveringService(accessory) {
|
|
1108
1094
|
// If windowCoveringService still present, then remove first
|
|
1109
|
-
|
|
1110
|
-
|
|
1095
|
+
if (this.WindowCovering?.Service) {
|
|
1096
|
+
this.WindowCovering.Service = this.accessory.getService(this.hap.Service.WindowCovering);
|
|
1111
1097
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Window Covering Service`);
|
|
1098
|
+
accessory.removeService(this.WindowCovering.Service);
|
|
1112
1099
|
}
|
|
1113
|
-
accessory.removeService(this.windowCoveringService);
|
|
1114
1100
|
}
|
|
1115
1101
|
async removeStatefulProgrammableSwitchService(accessory) {
|
|
1116
1102
|
// If statefulProgrammableSwitchService still present, then remove first
|
|
1117
|
-
|
|
1118
|
-
|
|
1103
|
+
if (this.StatefulProgrammableSwitch?.Service) {
|
|
1104
|
+
this.StatefulProgrammableSwitch.Service = this.accessory.getService(this.hap.Service.StatefulProgrammableSwitch);
|
|
1119
1105
|
this.warnLog(`${this.device.deviceType}: ${accessory.displayName} Removing Leftover Stateful Programmable Switch Service`);
|
|
1106
|
+
accessory.removeService(this.StatefulProgrammableSwitch.Service);
|
|
1120
1107
|
}
|
|
1121
|
-
accessory.removeService(this.statefulProgrammableSwitchService);
|
|
1122
1108
|
}
|
|
1123
1109
|
async removeSwitchService(accessory) {
|
|
1124
1110
|
// If switchService still present, then remove first
|
|
1125
|
-
|
|
1126
|
-
|
|
1111
|
+
if (this.Switch?.Service) {
|
|
1112
|
+
this.Switch.Service = this.accessory.getService(this.hap.Service.Switch);
|
|
1127
1113
|
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();
|
|
1114
|
+
accessory.removeService(this.Switch.Service);
|
|
1179
1115
|
}
|
|
1180
1116
|
}
|
|
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;
|
|
1117
|
+
async getOn() {
|
|
1118
|
+
let On;
|
|
1119
|
+
if (this.botDeviceType === 'garagedoor') {
|
|
1120
|
+
On = this.GarageDoor.On ? true : false;
|
|
1198
1121
|
}
|
|
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.`);
|
|
1122
|
+
else if (this.botDeviceType === 'door') {
|
|
1123
|
+
On = this.Door.On ? true : false;
|
|
1205
1124
|
}
|
|
1206
|
-
else if (
|
|
1207
|
-
this.
|
|
1208
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1125
|
+
else if (this.botDeviceType === 'window') {
|
|
1126
|
+
On = this.Window.On ? true : false;
|
|
1209
1127
|
}
|
|
1210
|
-
else if (
|
|
1211
|
-
this.
|
|
1212
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1128
|
+
else if (this.botDeviceType === 'windowcovering') {
|
|
1129
|
+
On = this.WindowCovering.On ? true : false;
|
|
1213
1130
|
}
|
|
1214
|
-
else if (
|
|
1215
|
-
this.
|
|
1216
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1131
|
+
else if (this.botDeviceType === 'lock') {
|
|
1132
|
+
On = this.Lock.On ? true : false;
|
|
1217
1133
|
}
|
|
1218
|
-
else {
|
|
1219
|
-
|
|
1134
|
+
else if (this.botDeviceType === 'faucet') {
|
|
1135
|
+
On = this.Faucet.On ? true : false;
|
|
1220
1136
|
}
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
if (device.bot?.allowPush) {
|
|
1224
|
-
this.allowPush = true;
|
|
1137
|
+
else if (this.botDeviceType === 'fan') {
|
|
1138
|
+
On = this.Fan.On ? true : false;
|
|
1225
1139
|
}
|
|
1226
|
-
else {
|
|
1227
|
-
this.
|
|
1140
|
+
else if (this.botDeviceType === 'stateful') {
|
|
1141
|
+
On = this.StatefulProgrammableSwitch.On ? true : false;
|
|
1228
1142
|
}
|
|
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
|
-
}
|
|
1143
|
+
else if (this.botDeviceType === 'switch') {
|
|
1144
|
+
On = this.Switch.On ? true : false;
|
|
1237
1145
|
}
|
|
1238
1146
|
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();
|
|
1147
|
+
On = this.Outlet.On ? true : false;
|
|
1320
1148
|
}
|
|
1149
|
+
return On;
|
|
1321
1150
|
}
|
|
1322
|
-
async
|
|
1151
|
+
async setOn(On) {
|
|
1323
1152
|
if (this.botDeviceType === 'garagedoor') {
|
|
1324
|
-
this.
|
|
1325
|
-
this.garageDoorService?.updateCharacteristic(this.hap.Characteristic.CurrentDoorState, e);
|
|
1326
|
-
this.garageDoorService?.updateCharacteristic(this.hap.Characteristic.ObstructionDetected, e);
|
|
1153
|
+
this.GarageDoor.On = On;
|
|
1327
1154
|
}
|
|
1328
1155
|
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);
|
|
1156
|
+
this.Door.On = On;
|
|
1332
1157
|
}
|
|
1333
1158
|
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);
|
|
1159
|
+
this.Window.On = On;
|
|
1337
1160
|
}
|
|
1338
1161
|
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);
|
|
1162
|
+
this.WindowCovering.On = On;
|
|
1342
1163
|
}
|
|
1343
1164
|
else if (this.botDeviceType === 'lock') {
|
|
1344
|
-
this.
|
|
1345
|
-
this.doorService?.updateCharacteristic(this.hap.Characteristic.LockCurrentState, e);
|
|
1165
|
+
this.Lock.On = On;
|
|
1346
1166
|
}
|
|
1347
1167
|
else if (this.botDeviceType === 'faucet') {
|
|
1348
|
-
this.
|
|
1168
|
+
this.Faucet.On = On;
|
|
1349
1169
|
}
|
|
1350
1170
|
else if (this.botDeviceType === 'fan') {
|
|
1351
|
-
this.
|
|
1171
|
+
this.Fan.On = On;
|
|
1352
1172
|
}
|
|
1353
1173
|
else if (this.botDeviceType === 'stateful') {
|
|
1354
|
-
this.
|
|
1355
|
-
this.statefulProgrammableSwitchService?.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, e);
|
|
1174
|
+
this.StatefulProgrammableSwitch.On = On;
|
|
1356
1175
|
}
|
|
1357
1176
|
else if (this.botDeviceType === 'switch') {
|
|
1358
|
-
this.
|
|
1177
|
+
this.Switch.On = On;
|
|
1359
1178
|
}
|
|
1360
1179
|
else {
|
|
1361
|
-
this.
|
|
1180
|
+
this.Outlet.On = On;
|
|
1362
1181
|
}
|
|
1363
|
-
this.batteryService?.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
|
|
1364
|
-
this.batteryService?.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
|
|
1365
1182
|
}
|
|
1366
|
-
async
|
|
1183
|
+
async getBotConfigSettings(device) {
|
|
1184
|
+
//Bot Device Type
|
|
1367
1185
|
if (!device.bot?.deviceType && this.accessory.context.deviceType) {
|
|
1368
1186
|
this.botDeviceType = this.accessory.context.deviceType;
|
|
1369
1187
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Type: ${this.botDeviceType}, from Accessory Cache.`);
|
|
@@ -1379,43 +1197,36 @@ export class Bot {
|
|
|
1379
1197
|
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} No Device Type Set, deviceType: ${this.device.bot?.deviceType}`);
|
|
1380
1198
|
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using default deviceType: ${this.botDeviceType}`);
|
|
1381
1199
|
}
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
this.
|
|
1386
|
-
this.
|
|
1387
|
-
}
|
|
1388
|
-
else {
|
|
1389
|
-
this.On = this.accessory.context.On;
|
|
1200
|
+
// Bot Mode
|
|
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.`);
|
|
1390
1205
|
}
|
|
1391
|
-
if (
|
|
1392
|
-
this.
|
|
1206
|
+
else if (device.bot?.mode === 'switch') {
|
|
1207
|
+
this.botMode = 'switch';
|
|
1208
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1393
1209
|
}
|
|
1394
|
-
else {
|
|
1395
|
-
this.
|
|
1210
|
+
else if (device.bot?.mode === 'press') {
|
|
1211
|
+
this.botMode = 'press';
|
|
1212
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1396
1213
|
}
|
|
1397
|
-
if (
|
|
1398
|
-
this.
|
|
1399
|
-
this.
|
|
1214
|
+
else if (device.bot?.mode === 'multipress') {
|
|
1215
|
+
this.botMode = 'multipress';
|
|
1216
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Bot Mode: ${this.botMode}`);
|
|
1400
1217
|
}
|
|
1401
1218
|
else {
|
|
1402
|
-
this.
|
|
1403
|
-
}
|
|
1404
|
-
if (this.FirmwareRevision === undefined) {
|
|
1405
|
-
this.FirmwareRevision = this.platform.version;
|
|
1406
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
1219
|
+
throw new Error(`${this.device.deviceType}: ${this.accessory.displayName} Bot Mode: ${this.botMode}`);
|
|
1407
1220
|
}
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
this.
|
|
1412
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
|
|
1221
|
+
// Bot Double Press
|
|
1222
|
+
if (device.bot?.doublePress) {
|
|
1223
|
+
this.doublePress = device.bot?.doublePress;
|
|
1224
|
+
this.accessory.context.doublePress = this.doublePress;
|
|
1413
1225
|
}
|
|
1414
|
-
else
|
|
1415
|
-
this.
|
|
1416
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
|
|
1226
|
+
else {
|
|
1227
|
+
this.doublePress = 1;
|
|
1417
1228
|
}
|
|
1418
|
-
//
|
|
1229
|
+
// Bot Press PushRate
|
|
1419
1230
|
if (device?.bot?.pushRatePress) {
|
|
1420
1231
|
this.pushRatePress = device?.bot?.pushRatePress;
|
|
1421
1232
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Bot pushRatePress: ${this.pushRatePress}`);
|
|
@@ -1424,102 +1235,118 @@ export class Bot {
|
|
|
1424
1235
|
this.pushRatePress = 15;
|
|
1425
1236
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default Bot pushRatePress: ${this.pushRatePress}`);
|
|
1426
1237
|
}
|
|
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;
|
|
1238
|
+
// Bot Allow Push
|
|
1239
|
+
if (device.bot?.allowPush) {
|
|
1240
|
+
this.allowPush = true;
|
|
1447
1241
|
}
|
|
1448
|
-
|
|
1449
|
-
|
|
1242
|
+
else {
|
|
1243
|
+
this.allowPush = false;
|
|
1450
1244
|
}
|
|
1451
|
-
|
|
1452
|
-
|
|
1245
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Allowing Push Changes: ${this.allowPush}`);
|
|
1246
|
+
// Bot Multi Press Count
|
|
1247
|
+
this.multiPressCount = 0;
|
|
1248
|
+
}
|
|
1249
|
+
async BLEPushConnection() {
|
|
1250
|
+
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
1251
|
+
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Push Changes`);
|
|
1252
|
+
await this.openAPIpushChanges();
|
|
1453
1253
|
}
|
|
1454
|
-
|
|
1455
|
-
|
|
1254
|
+
}
|
|
1255
|
+
async BLERefreshConnection(switchbot) {
|
|
1256
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} wasn't able to establish BLE Connection, node-switchbot:`
|
|
1257
|
+
+ ` ${JSON.stringify(switchbot)}`);
|
|
1258
|
+
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
1259
|
+
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Refresh Status`);
|
|
1260
|
+
await this.openAPIRefreshStatus();
|
|
1456
1261
|
}
|
|
1457
|
-
|
|
1458
|
-
|
|
1262
|
+
}
|
|
1263
|
+
async offlineOff() {
|
|
1264
|
+
if (this.device.offline) {
|
|
1265
|
+
if (this.botDeviceType === 'garagedoor') {
|
|
1266
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.TargetDoorState, this.hap.Characteristic.TargetDoorState.CLOSED);
|
|
1267
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.CurrentDoorState, this.hap.Characteristic.CurrentDoorState.CLOSED);
|
|
1268
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.ObstructionDetected, false);
|
|
1269
|
+
}
|
|
1270
|
+
else if (this.botDeviceType === 'door') {
|
|
1271
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
1272
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
1273
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
1274
|
+
}
|
|
1275
|
+
else if (this.botDeviceType === 'window') {
|
|
1276
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
1277
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
1278
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
1279
|
+
}
|
|
1280
|
+
else if (this.botDeviceType === 'windowcovering') {
|
|
1281
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, 0);
|
|
1282
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, 0);
|
|
1283
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.PositionState, this.hap.Characteristic.PositionState.STOPPED);
|
|
1284
|
+
}
|
|
1285
|
+
else if (this.botDeviceType === 'lock') {
|
|
1286
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.hap.Characteristic.LockTargetState.SECURED);
|
|
1287
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.hap.Characteristic.LockCurrentState.SECURED);
|
|
1288
|
+
}
|
|
1289
|
+
else if (this.botDeviceType === 'faucet') {
|
|
1290
|
+
this.Faucet.Service.updateCharacteristic(this.hap.Characteristic.Active, this.hap.Characteristic.Active.INACTIVE);
|
|
1291
|
+
}
|
|
1292
|
+
else if (this.botDeviceType === 'fan') {
|
|
1293
|
+
this.Fan.Service.updateCharacteristic(this.hap.Characteristic.On, false);
|
|
1294
|
+
}
|
|
1295
|
+
else if (this.botDeviceType === 'stateful') {
|
|
1296
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent, this.hap.Characteristic.ProgrammableSwitchEvent.SINGLE_PRESS);
|
|
1297
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, 0);
|
|
1298
|
+
}
|
|
1299
|
+
else if (this.botDeviceType === 'switch') {
|
|
1300
|
+
this.Switch.Service.updateCharacteristic(this.hap.Characteristic.On, false);
|
|
1301
|
+
}
|
|
1302
|
+
else {
|
|
1303
|
+
this.Outlet.Service.updateCharacteristic(this.hap.Characteristic.On, false);
|
|
1304
|
+
}
|
|
1459
1305
|
}
|
|
1460
1306
|
}
|
|
1461
|
-
async
|
|
1462
|
-
if (this.
|
|
1463
|
-
this.
|
|
1464
|
-
this.
|
|
1307
|
+
async apiError(e) {
|
|
1308
|
+
if (this.botDeviceType === 'garagedoor') {
|
|
1309
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.TargetDoorState, e);
|
|
1310
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.CurrentDoorState, e);
|
|
1311
|
+
this.GarageDoor.Service.updateCharacteristic(this.hap.Characteristic.ObstructionDetected, e);
|
|
1465
1312
|
}
|
|
1466
|
-
else if (
|
|
1467
|
-
this.
|
|
1468
|
-
this.
|
|
1313
|
+
else if (this.botDeviceType === 'door') {
|
|
1314
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, e);
|
|
1315
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, e);
|
|
1316
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.PositionState, e);
|
|
1469
1317
|
}
|
|
1470
|
-
else if (this.
|
|
1471
|
-
this.
|
|
1472
|
-
this.
|
|
1318
|
+
else if (this.botDeviceType === 'window') {
|
|
1319
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, e);
|
|
1320
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, e);
|
|
1321
|
+
this.Window.Service.updateCharacteristic(this.hap.Characteristic.PositionState, e);
|
|
1473
1322
|
}
|
|
1474
|
-
else {
|
|
1475
|
-
this.
|
|
1476
|
-
this.
|
|
1323
|
+
else if (this.botDeviceType === 'windowcovering') {
|
|
1324
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.TargetPosition, e);
|
|
1325
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.CurrentPosition, e);
|
|
1326
|
+
this.WindowCovering.Service.updateCharacteristic(this.hap.Characteristic.PositionState, e);
|
|
1477
1327
|
}
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
*/
|
|
1482
|
-
infoLog(...log) {
|
|
1483
|
-
if (this.enablingDeviceLogging()) {
|
|
1484
|
-
this.platform.log.info(String(...log));
|
|
1328
|
+
else if (this.botDeviceType === 'lock') {
|
|
1329
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, e);
|
|
1330
|
+
this.Door.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, e);
|
|
1485
1331
|
}
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
if (this.enablingDeviceLogging()) {
|
|
1489
|
-
this.platform.log.warn(String(...log));
|
|
1332
|
+
else if (this.botDeviceType === 'faucet') {
|
|
1333
|
+
this.Faucet.Service.updateCharacteristic(this.hap.Characteristic.Active, e);
|
|
1490
1334
|
}
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
if (this.enablingDeviceLogging()) {
|
|
1494
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
1495
|
-
this.platform.log.warn('[DEBUG]', String(...log));
|
|
1496
|
-
}
|
|
1335
|
+
else if (this.botDeviceType === 'fan') {
|
|
1336
|
+
this.Fan.Service.updateCharacteristic(this.hap.Characteristic.On, e);
|
|
1497
1337
|
}
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
this.platform.log.error(String(...log));
|
|
1338
|
+
else if (this.botDeviceType === 'stateful') {
|
|
1339
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchEvent, e);
|
|
1340
|
+
this.StatefulProgrammableSwitch.Service.updateCharacteristic(this.hap.Characteristic.ProgrammableSwitchOutputState, e);
|
|
1502
1341
|
}
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
if (this.enablingDeviceLogging()) {
|
|
1506
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
1507
|
-
this.platform.log.error('[DEBUG]', String(...log));
|
|
1508
|
-
}
|
|
1342
|
+
else if (this.botDeviceType === 'switch') {
|
|
1343
|
+
this.Switch.Service.updateCharacteristic(this.hap.Characteristic.On, e);
|
|
1509
1344
|
}
|
|
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
|
-
}
|
|
1345
|
+
else {
|
|
1346
|
+
this.Outlet.Service.updateCharacteristic(this.hap.Characteristic.On, e);
|
|
1519
1347
|
}
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
|
|
1348
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
|
|
1349
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
|
|
1523
1350
|
}
|
|
1524
1351
|
}
|
|
1525
1352
|
//# sourceMappingURL=bot.js.map
|