@switchbot/homebridge-switchbot 3.5.0-beta.7 → 3.5.0-beta.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +4 -1
- package/CHANGELOG.md +4 -1
- package/config.schema.json +120 -17
- package/dist/device/blindtilt.d.ts +23 -96
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +425 -778
- package/dist/device/blindtilt.js.map +1 -1
- package/dist/device/bot.d.ts +26 -72
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +803 -837
- package/dist/device/bot.js.map +1 -1
- package/dist/device/ceilinglight.d.ts +14 -68
- package/dist/device/ceilinglight.d.ts.map +1 -1
- package/dist/device/ceilinglight.js +241 -606
- package/dist/device/ceilinglight.js.map +1 -1
- package/dist/device/colorbulb.d.ts +14 -75
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +283 -658
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.d.ts +15 -66
- package/dist/device/contact.d.ts.map +1 -1
- package/dist/device/contact.js +254 -545
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts +19 -88
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +412 -806
- 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 +711 -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 +540 -0
- package/dist/device/fan.js.map +1 -0
- package/dist/device/hub.d.ts +16 -60
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +261 -616
- package/dist/device/hub.js.map +1 -1
- package/dist/device/humidifier.d.ts +11 -66
- package/dist/device/humidifier.d.ts.map +1 -1
- package/dist/device/humidifier.js +240 -594
- 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 +196 -600
- package/dist/device/iosensor.js.map +1 -1
- package/dist/device/lightstrip.d.ts +11 -69
- package/dist/device/lightstrip.d.ts.map +1 -1
- package/dist/device/lightstrip.js +281 -586
- package/dist/device/lightstrip.js.map +1 -1
- package/dist/device/lock.d.ts +16 -63
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +252 -560
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.d.ts +14 -64
- package/dist/device/meter.d.ts.map +1 -1
- package/dist/device/meter.js +191 -593
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.d.ts +14 -65
- package/dist/device/meterplus.d.ts.map +1 -1
- package/dist/device/meterplus.js +180 -593
- package/dist/device/meterplus.js.map +1 -1
- package/dist/device/motion.d.ts +13 -69
- package/dist/device/motion.d.ts.map +1 -1
- package/dist/device/motion.js +188 -532
- 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 +96 -458
- package/dist/device/plug.js.map +1 -1
- package/dist/device/robotvacuumcleaner.d.ts +12 -63
- package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
- package/dist/device/robotvacuumcleaner.js +202 -521
- package/dist/device/robotvacuumcleaner.js.map +1 -1
- package/dist/device/waterdetector.d.ts +10 -63
- package/dist/device/waterdetector.d.ts.map +1 -1
- package/dist/device/waterdetector.js +146 -475
- package/dist/device/waterdetector.js.map +1 -1
- package/dist/homebridge-ui/public/index.html +22 -16
- package/dist/homebridge-ui/server.js +1 -1
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/irdevice/airconditioner.d.ts +10 -50
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js +324 -452
- package/dist/irdevice/airconditioner.js.map +1 -1
- package/dist/irdevice/airpurifier.d.ts +8 -39
- package/dist/irdevice/airpurifier.d.ts.map +1 -1
- package/dist/irdevice/airpurifier.js +93 -307
- package/dist/irdevice/airpurifier.js.map +1 -1
- package/dist/irdevice/camera.d.ts +7 -36
- package/dist/irdevice/camera.d.ts.map +1 -1
- package/dist/irdevice/camera.js +39 -281
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts +10 -43
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +113 -341
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +40 -0
- package/dist/irdevice/irdevice.d.ts.map +1 -0
- package/dist/irdevice/irdevice.js +330 -0
- package/dist/irdevice/irdevice.js.map +1 -0
- package/dist/irdevice/light.d.ts +12 -45
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +118 -362
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.d.ts +19 -48
- package/dist/irdevice/other.d.ts.map +1 -1
- package/dist/irdevice/other.js +438 -570
- package/dist/irdevice/other.js.map +1 -1
- package/dist/irdevice/tv.d.ts +8 -40
- package/dist/irdevice/tv.d.ts.map +1 -1
- package/dist/irdevice/tv.js +87 -335
- package/dist/irdevice/tv.js.map +1 -1
- package/dist/irdevice/vacuumcleaner.d.ts +7 -36
- package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
- package/dist/irdevice/vacuumcleaner.js +45 -285
- package/dist/irdevice/vacuumcleaner.js.map +1 -1
- package/dist/irdevice/waterheater.d.ts +7 -36
- package/dist/irdevice/waterheater.d.ts.map +1 -1
- package/dist/irdevice/waterheater.js +47 -291
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/platform.d.ts +19 -6
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +310 -172
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +62 -19
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +16 -552
- package/dist/settings.js.map +1 -1
- package/dist/utils.d.ts +77 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +638 -1
- package/dist/utils.js.map +1 -1
- package/eslint.config.js +96 -0
- package/package.json +19 -15
- package/src/custom.d.ts +2 -1
- package/src/device/blindtilt.ts +462 -817
- package/src/device/bot.ts +862 -931
- package/src/device/ceilinglight.ts +259 -633
- package/src/device/colorbulb.ts +300 -688
- package/src/device/contact.ts +288 -571
- package/src/device/curtain.ts +441 -838
- package/src/device/device.ts +734 -0
- package/src/device/fan.ts +596 -0
- package/src/device/hub.ts +299 -645
- package/src/device/humidifier.ts +274 -647
- package/src/device/iosensor.ts +233 -626
- package/src/device/lightstrip.ts +309 -620
- package/src/device/lock.ts +292 -601
- package/src/device/meter.ts +228 -619
- package/src/device/meterplus.ts +216 -619
- package/src/device/motion.ts +218 -559
- package/src/device/plug.ts +111 -490
- package/src/device/robotvacuumcleaner.ts +228 -550
- package/src/device/waterdetector.ts +169 -501
- package/src/homebridge-ui/public/index.html +22 -16
- package/src/homebridge-ui/server.ts +1 -1
- package/src/index.ts +4 -3
- package/src/irdevice/airconditioner.ts +350 -477
- package/src/irdevice/airpurifier.ts +120 -330
- package/src/irdevice/camera.ts +53 -301
- package/src/irdevice/fan.ts +130 -360
- package/src/irdevice/irdevice.ts +346 -0
- package/src/irdevice/light.ts +157 -412
- package/src/irdevice/other.ts +507 -648
- package/src/irdevice/tv.ts +117 -367
- package/src/irdevice/vacuumcleaner.ts +59 -311
- package/src/irdevice/waterheater.ts +61 -320
- package/src/platform.ts +355 -219
- package/src/settings.ts +116 -611
- package/src/utils.ts +642 -1
- package/src/device/waterdetector.json +0 -11
package/src/device/lock.ts
CHANGED
|
@@ -1,174 +1,153 @@
|
|
|
1
1
|
import { request } from 'undici';
|
|
2
|
-
import {
|
|
2
|
+
import { deviceBase } from './device.js';
|
|
3
3
|
import { interval, Subject } from 'rxjs';
|
|
4
|
-
import {
|
|
4
|
+
import { Devices } from '../settings.js';
|
|
5
5
|
import { debounceTime, skipWhile, take, tap } from 'rxjs/operators';
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
public readonly config!: SwitchBotPlatformConfig;
|
|
13
|
-
protected readonly hap: HAP;
|
|
6
|
+
|
|
7
|
+
import type { SwitchBotPlatform } from '../platform.js';
|
|
8
|
+
import type { Service, PlatformAccessory, CharacteristicValue } from 'homebridge';
|
|
9
|
+
import type { device, devicesConfig, deviceStatus, serviceData } from '../settings.js';
|
|
10
|
+
|
|
11
|
+
export class Lock extends deviceBase {
|
|
14
12
|
// Services
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
// BLE Others
|
|
41
|
-
BLE_IsConnected?: boolean;
|
|
42
|
-
|
|
43
|
-
// Config
|
|
44
|
-
scanDuration!: number;
|
|
45
|
-
deviceLogging!: string;
|
|
46
|
-
deviceRefreshRate!: number;
|
|
13
|
+
private LockMechanism: {
|
|
14
|
+
Name: CharacteristicValue;
|
|
15
|
+
Service: Service;
|
|
16
|
+
LockTargetState: CharacteristicValue;
|
|
17
|
+
LockCurrentState: CharacteristicValue;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
private Battery: {
|
|
21
|
+
Name: CharacteristicValue;
|
|
22
|
+
Service: Service;
|
|
23
|
+
BatteryLevel: CharacteristicValue;
|
|
24
|
+
StatusLowBattery: CharacteristicValue;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
private ContactSensor?: {
|
|
28
|
+
Name: CharacteristicValue;
|
|
29
|
+
Service: Service;
|
|
30
|
+
ContactSensorState: CharacteristicValue;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
private Switch?: {
|
|
34
|
+
Name: CharacteristicValue;
|
|
35
|
+
Service: Service;
|
|
36
|
+
On: CharacteristicValue;
|
|
37
|
+
};
|
|
47
38
|
|
|
48
39
|
// Updates
|
|
49
40
|
lockUpdateInProgress!: boolean;
|
|
50
41
|
doLockUpdate!: Subject<void>;
|
|
51
42
|
|
|
52
|
-
// Connection
|
|
53
|
-
private readonly OpenAPI: boolean;
|
|
54
|
-
private readonly BLE: boolean;
|
|
55
|
-
|
|
56
43
|
constructor(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
44
|
+
readonly platform: SwitchBotPlatform,
|
|
45
|
+
accessory: PlatformAccessory,
|
|
46
|
+
device: device & devicesConfig,
|
|
60
47
|
) {
|
|
61
|
-
|
|
62
|
-
this.log = this.platform.log;
|
|
63
|
-
this.config = this.platform.config;
|
|
64
|
-
this.hap = this.api.hap;
|
|
65
|
-
// Connection
|
|
66
|
-
this.BLE = this.device.connectionType === 'BLE' || this.device.connectionType === 'BLE/OpenAPI';
|
|
67
|
-
this.OpenAPI = this.device.connectionType === 'OpenAPI' || this.device.connectionType === 'BLE/OpenAPI';
|
|
68
|
-
// default placeholders
|
|
69
|
-
this.deviceLogs(device);
|
|
70
|
-
this.scan(device);
|
|
71
|
-
this.refreshRate(device);
|
|
72
|
-
this.deviceContext();
|
|
73
|
-
this.deviceConfig(device);
|
|
74
|
-
|
|
48
|
+
super(platform, accessory, device);
|
|
75
49
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
76
50
|
this.doLockUpdate = new Subject();
|
|
77
51
|
this.lockUpdateInProgress = false;
|
|
78
52
|
|
|
79
|
-
//
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
.
|
|
85
|
-
.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
} else
|
|
118
|
-
if (!this.latchButtonService) {
|
|
119
|
-
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Adding Latch Button Service`);
|
|
120
|
-
const latchServiceName = `${accessory.displayName} Latch`;
|
|
121
|
-
this.latchButtonService = accessory.getService(this.hap.Service.Switch)
|
|
122
|
-
|| accessory.addService(this.hap.Service.Switch, latchServiceName, 'LatchButtonServiceIdentifier');
|
|
123
|
-
|
|
124
|
-
this.latchButtonService.setCharacteristic(this.hap.Characteristic.Name, latchServiceName);
|
|
125
|
-
|
|
126
|
-
if (!this.latchButtonService.testCharacteristic(this.hap.Characteristic.On)) {
|
|
127
|
-
this.latchButtonService.addCharacteristic(this.hap.Characteristic.On);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
this.latchButtonService.getCharacteristic(this.hap.Characteristic.On)
|
|
131
|
-
.on('set', (value, callback) => {
|
|
132
|
-
if (typeof value === 'boolean') {
|
|
133
|
-
this.handleLatchCharacteristic(value, callback);
|
|
134
|
-
} else {
|
|
135
|
-
callback(new Error('Wrong characteristic value type'));
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
} else {
|
|
139
|
-
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Latch Button Service already exists`);
|
|
140
|
-
}
|
|
53
|
+
// Initialize LockMechanism Service
|
|
54
|
+
accessory.context.LockMechanism = accessory.context.LockMechanism ?? {};
|
|
55
|
+
this.LockMechanism = {
|
|
56
|
+
Name: accessory.context.LockMechanism.Name ?? accessory.displayName,
|
|
57
|
+
Service: accessory.getService(this.hap.Service.LockMechanism) ?? accessory.addService(this.hap.Service.LockMechanism) as Service,
|
|
58
|
+
LockTargetState: accessory.context.LockTargetState ?? this.hap.Characteristic.LockTargetState.SECURED,
|
|
59
|
+
LockCurrentState: accessory.context.LockCurrentState ?? this.hap.Characteristic.LockCurrentState.SECURED,
|
|
60
|
+
};
|
|
61
|
+
accessory.context.LockMechanism = this.LockMechanism as object;
|
|
62
|
+
|
|
63
|
+
// Initialize LockMechanism Characteristics
|
|
64
|
+
this.LockMechanism.Service
|
|
65
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.LockMechanism.Name)
|
|
66
|
+
.getCharacteristic(this.hap.Characteristic.LockTargetState)
|
|
67
|
+
.onGet(() => {
|
|
68
|
+
return this.LockMechanism.LockTargetState;
|
|
69
|
+
})
|
|
70
|
+
.onSet(this.LockTargetStateSet.bind(this));
|
|
71
|
+
|
|
72
|
+
// Initialize Battery property
|
|
73
|
+
accessory.context.Battery = accessory.context.Battery ?? {};
|
|
74
|
+
this.Battery = {
|
|
75
|
+
Name: accessory.context.Battery.Name ?? `${accessory.displayName} Battery`,
|
|
76
|
+
Service: accessory.getService(this.hap.Service.Battery) ?? accessory.addService(this.hap.Service.Battery) as Service,
|
|
77
|
+
BatteryLevel: accessory.context.BatteryLevel ?? 100,
|
|
78
|
+
StatusLowBattery: accessory.context.StatusLowBattery ?? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL,
|
|
79
|
+
};
|
|
80
|
+
accessory.context.Battery = this.Battery as object;
|
|
81
|
+
|
|
82
|
+
// Initialize Battery Characteristics
|
|
83
|
+
this.Battery.Service
|
|
84
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.Battery.Name)
|
|
85
|
+
.setCharacteristic(this.hap.Characteristic.ChargingState, this.hap.Characteristic.ChargingState.NOT_CHARGEABLE)
|
|
86
|
+
.getCharacteristic(this.hap.Characteristic.BatteryLevel)
|
|
87
|
+
.onGet(() => {
|
|
88
|
+
return this.Battery.BatteryLevel;
|
|
89
|
+
});
|
|
141
90
|
|
|
91
|
+
this.Battery.Service
|
|
92
|
+
.getCharacteristic(this.hap.Characteristic.StatusLowBattery)
|
|
93
|
+
.onGet(() => {
|
|
94
|
+
return this.Battery.StatusLowBattery;
|
|
95
|
+
});
|
|
142
96
|
|
|
143
97
|
// Contact Sensor Service
|
|
144
98
|
if (device.lock?.hide_contactsensor) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Add Contact Sensor Service`);
|
|
150
|
-
const contactSensorService = `${accessory.displayName} Contact Sensor`;
|
|
151
|
-
(this.contactSensorService = this.accessory.getService(this.hap.Service.ContactSensor)
|
|
152
|
-
|| this.accessory.addService(this.hap.Service.ContactSensor)), contactSensorService;
|
|
153
|
-
|
|
154
|
-
this.contactSensorService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Contact Sensor`);
|
|
155
|
-
if (!this.contactSensorService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
|
|
156
|
-
this.contactSensorService.addCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Contact Sensor`);
|
|
99
|
+
if (this.ContactSensor) {
|
|
100
|
+
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Contact Sensor Service`);
|
|
101
|
+
this.ContactSensor.Service = this.accessory.getService(this.hap.Service.ContactSensor) as Service;
|
|
102
|
+
accessory.removeService(this.ContactSensor.Service);
|
|
157
103
|
}
|
|
158
104
|
} else {
|
|
159
|
-
|
|
105
|
+
accessory.context.ContactSensor = accessory.context.ContactSensor ?? {};
|
|
106
|
+
this.ContactSensor = {
|
|
107
|
+
Name: accessory.context.ContactSensor.Name ?? `${accessory.displayName} Contact Sensor`,
|
|
108
|
+
Service: accessory.getService(this.hap.Service.ContactSensor) ?? this.accessory.addService(this.hap.Service.ContactSensor) as Service,
|
|
109
|
+
ContactSensorState: accessory.context.ContactSensorState ?? this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED,
|
|
110
|
+
};
|
|
111
|
+
accessory.context.ContactSensor = this.ContactSensor as object;
|
|
112
|
+
|
|
113
|
+
// Initialize Contact Sensor Characteristics
|
|
114
|
+
this.ContactSensor.Service
|
|
115
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.ContactSensor.Name)
|
|
116
|
+
.setCharacteristic(this.hap.Characteristic.StatusActive, true)
|
|
117
|
+
.getCharacteristic(this.hap.Characteristic.ContactSensorState)
|
|
118
|
+
.onGet(() => {
|
|
119
|
+
return this.ContactSensor!.ContactSensorState;
|
|
120
|
+
});
|
|
160
121
|
}
|
|
161
122
|
|
|
162
|
-
//
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
123
|
+
// Initialize Latch Button Service
|
|
124
|
+
if (device.lock?.activate_latchbutton === false) {
|
|
125
|
+
if (this.Switch) {
|
|
126
|
+
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Latch Button Service`);
|
|
127
|
+
this.Switch.Service = accessory.getService(this.hap.Service.Switch) as Service;
|
|
128
|
+
accessory.removeService(this.Switch.Service);
|
|
129
|
+
}
|
|
130
|
+
} else {
|
|
131
|
+
accessory.context.Switch = accessory.context.Switch ?? {};
|
|
132
|
+
this.Switch = {
|
|
133
|
+
Name: accessory.context.Switch.Name ?? `${accessory.displayName} Latch`,
|
|
134
|
+
Service: accessory.getService(this.hap.Service.Switch) ?? accessory.addService(this.hap.Service.Switch) as Service,
|
|
135
|
+
On: accessory.context.On ?? false,
|
|
136
|
+
};
|
|
137
|
+
accessory.context.Switch = this.Switch as object;
|
|
138
|
+
|
|
139
|
+
// Initialize Latch Button Characteristics
|
|
140
|
+
this.Switch.Service
|
|
141
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.Switch.Name)
|
|
142
|
+
.getCharacteristic(this.hap.Characteristic.On)
|
|
143
|
+
.onGet(() => {
|
|
144
|
+
return this.Switch!.On;
|
|
145
|
+
})
|
|
146
|
+
.onSet(this.OnSet.bind(this));
|
|
170
147
|
}
|
|
171
|
-
|
|
148
|
+
|
|
149
|
+
// Retrieve initial values and updateHomekit
|
|
150
|
+
this.refreshStatus();
|
|
172
151
|
|
|
173
152
|
// Update Homekit
|
|
174
153
|
this.updateHomeKitCharacteristics();
|
|
@@ -181,18 +160,18 @@ export class Lock {
|
|
|
181
160
|
});
|
|
182
161
|
|
|
183
162
|
//regisiter webhook event handler
|
|
184
|
-
if (
|
|
185
|
-
this.
|
|
163
|
+
if (device.webhook) {
|
|
164
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
|
|
186
165
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
|
|
187
166
|
try {
|
|
188
167
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
|
|
189
168
|
const { lockState } = context;
|
|
190
|
-
const { LockCurrentState } = this;
|
|
169
|
+
const { LockCurrentState } = this.LockMechanism;
|
|
191
170
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
|
|
192
171
|
'(lockState) = ' +
|
|
193
172
|
`Webhook:(${lockState}), ` +
|
|
194
173
|
`current:(${LockCurrentState})`);
|
|
195
|
-
this.LockCurrentState = lockState === 'LOCKED' ? 1 : 0;
|
|
174
|
+
this.LockMechanism.LockCurrentState = lockState === 'LOCKED' ? 1 : 0;
|
|
196
175
|
this.updateHomeKitCharacteristics();
|
|
197
176
|
} catch (e: any) {
|
|
198
177
|
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
@@ -224,134 +203,91 @@ export class Lock {
|
|
|
224
203
|
});
|
|
225
204
|
}
|
|
226
205
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
*/
|
|
230
|
-
async handleLatchCharacteristic(value: boolean, callback) {
|
|
231
|
-
this.debugLog(`handleLatchCharacteristic called with value: ${value}`);
|
|
232
|
-
|
|
233
|
-
if (value) {
|
|
234
|
-
this.debugLog('Attempting to open the latch');
|
|
235
|
-
|
|
236
|
-
this.openAPIpushChanges(value).then(() => {
|
|
237
|
-
this.debugLog('Latch opened successfully');
|
|
238
|
-
this.debugLog(`LatchButtonService is: ${this.latchButtonService ? 'available' : 'not available'}`);
|
|
239
|
-
|
|
240
|
-
// simulate button press to turn the switch back off
|
|
241
|
-
if (this.latchButtonService) {
|
|
242
|
-
const latchButtonService = this.latchButtonService;
|
|
243
|
-
// Simulate a button press by waiting a short period before turning the switch off
|
|
244
|
-
setTimeout(() => {
|
|
245
|
-
latchButtonService.getCharacteristic(this.hap.Characteristic.On).updateValue(false);
|
|
246
|
-
this.debugLog('Latch button switched off automatically.');
|
|
247
|
-
}, 500); // 500 ms delay
|
|
248
|
-
}
|
|
249
|
-
callback(null);
|
|
250
|
-
}).catch((error) => {
|
|
251
|
-
// Log the error if the operation failed
|
|
252
|
-
this.debugLog(`Error opening latch: ${error}`);
|
|
253
|
-
|
|
254
|
-
// Ensure we turn the switch back off even in case of an error
|
|
255
|
-
if (this.latchButtonService) {
|
|
256
|
-
this.latchButtonService.getCharacteristic(this.hap.Characteristic.On).updateValue(false);
|
|
257
|
-
this.debugLog('Latch button switched off after an error.');
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
callback(error);
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
} else {
|
|
264
|
-
this.debugLog('Switch is off, nothing to do');
|
|
265
|
-
callback(null);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Parse the device status from the SwitchBot api
|
|
272
|
-
*/
|
|
273
|
-
async parseStatus(): Promise<void> {
|
|
274
|
-
if (!this.device.enableCloudService && this.OpenAPI) {
|
|
275
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} parseStatus enableCloudService: ${this.device.enableCloudService}`);
|
|
276
|
-
/* } else if (this.BLE) {
|
|
277
|
-
await this.BLEparseStatus();*/
|
|
278
|
-
} else if (this.OpenAPI && this.platform.config.credentials?.token) {
|
|
279
|
-
await this.openAPIparseStatus();
|
|
280
|
-
} else {
|
|
281
|
-
await this.offlineOff();
|
|
282
|
-
this.debugWarnLog(
|
|
283
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`,
|
|
284
|
-
);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
async BLEparseStatus(): Promise<void> {
|
|
206
|
+
async BLEparseStatus(serviceData: serviceData): Promise<void> {
|
|
207
|
+
// BLE Status
|
|
289
208
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
|
|
290
|
-
switch (
|
|
209
|
+
switch (serviceData.status) {
|
|
291
210
|
case 'locked':
|
|
292
|
-
this.LockCurrentState = this.hap.Characteristic.LockCurrentState.SECURED;
|
|
293
|
-
this.LockTargetState = this.hap.Characteristic.LockTargetState.SECURED;
|
|
211
|
+
this.LockMechanism.LockCurrentState = this.hap.Characteristic.LockCurrentState.SECURED;
|
|
212
|
+
this.LockMechanism.LockTargetState = this.hap.Characteristic.LockTargetState.SECURED;
|
|
294
213
|
break;
|
|
295
214
|
default:
|
|
296
|
-
this.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNSECURED;
|
|
297
|
-
this.LockTargetState = this.hap.Characteristic.LockTargetState.UNSECURED;
|
|
215
|
+
this.LockMechanism.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNSECURED;
|
|
216
|
+
this.LockMechanism.LockTargetState = this.hap.Characteristic.LockTargetState.UNSECURED;
|
|
298
217
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
218
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
219
|
+
+ ` LockTargetState: ${this.LockMechanism.LockTargetState}, LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
|
|
220
|
+
|
|
221
|
+
// Contact Sensor
|
|
222
|
+
if (!this.device.lock?.hide_contactsensor) {
|
|
223
|
+
switch (serviceData.door_open) {
|
|
224
|
+
case 'opened':
|
|
225
|
+
this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
|
|
226
|
+
break;
|
|
227
|
+
default:
|
|
228
|
+
this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
229
|
+
}
|
|
230
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor!.ContactSensorState}`);
|
|
231
|
+
|
|
305
232
|
}
|
|
306
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LockTargetState}`);
|
|
307
233
|
// Battery
|
|
308
|
-
this.BatteryLevel = Number(
|
|
309
|
-
if (this.BatteryLevel < 10) {
|
|
310
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
234
|
+
this.Battery.BatteryLevel = Number(serviceData.battery);
|
|
235
|
+
if (this.Battery.BatteryLevel < 10) {
|
|
236
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
311
237
|
} else {
|
|
312
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
238
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
313
239
|
}
|
|
314
|
-
this.debugLog(
|
|
315
|
-
|
|
316
|
-
);
|
|
240
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
241
|
+
+ ` BatteryLevel: ${this.Battery.BatteryLevel}, StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
317
242
|
}
|
|
318
243
|
|
|
319
|
-
async openAPIparseStatus(): Promise<void> {
|
|
244
|
+
async openAPIparseStatus(deviceStatus: deviceStatus): Promise<void> {
|
|
320
245
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
|
|
321
|
-
switch (
|
|
246
|
+
switch (deviceStatus.body.lockState) {
|
|
322
247
|
case 'locked':
|
|
323
|
-
this.LockCurrentState = this.hap.Characteristic.LockCurrentState.SECURED;
|
|
324
|
-
this.LockTargetState = this.hap.Characteristic.LockTargetState.SECURED;
|
|
248
|
+
this.LockMechanism.LockCurrentState = this.hap.Characteristic.LockCurrentState.SECURED;
|
|
249
|
+
this.LockMechanism.LockTargetState = this.hap.Characteristic.LockTargetState.SECURED;
|
|
325
250
|
break;
|
|
326
251
|
default:
|
|
327
|
-
this.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNSECURED;
|
|
328
|
-
this.LockTargetState = this.hap.Characteristic.LockTargetState.UNSECURED;
|
|
252
|
+
this.LockMechanism.LockCurrentState = this.hap.Characteristic.LockCurrentState.UNSECURED;
|
|
253
|
+
this.LockMechanism.LockTargetState = this.hap.Characteristic.LockTargetState.UNSECURED;
|
|
329
254
|
}
|
|
330
|
-
switch (
|
|
255
|
+
switch (deviceStatus.body.doorState) {
|
|
331
256
|
case 'opened':
|
|
332
|
-
this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
|
|
257
|
+
this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
|
|
333
258
|
break;
|
|
334
259
|
default:
|
|
335
|
-
this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
260
|
+
this.ContactSensor!.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
336
261
|
}
|
|
337
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LockTargetState}`);
|
|
262
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LockMechanism.LockTargetState}`);
|
|
338
263
|
|
|
339
264
|
// Battery
|
|
340
|
-
this.BatteryLevel = Number(
|
|
341
|
-
if (this.BatteryLevel < 10) {
|
|
342
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
265
|
+
this.Battery.BatteryLevel = Number(deviceStatus.body.battery);
|
|
266
|
+
if (this.Battery.BatteryLevel < 10) {
|
|
267
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
343
268
|
} else {
|
|
344
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
269
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
345
270
|
}
|
|
346
|
-
if (Number.isNaN(this.BatteryLevel)) {
|
|
347
|
-
this.BatteryLevel = 100;
|
|
271
|
+
if (Number.isNaN(this.Battery.BatteryLevel)) {
|
|
272
|
+
this.Battery.BatteryLevel = 100;
|
|
348
273
|
}
|
|
349
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel},`
|
|
350
|
-
+ ` StatusLowBattery: ${this.StatusLowBattery}`);
|
|
274
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},`
|
|
275
|
+
+ ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
351
276
|
|
|
352
|
-
//
|
|
353
|
-
|
|
354
|
-
this.
|
|
277
|
+
// Firmware Version
|
|
278
|
+
const version = deviceStatus.body.version?.toString();
|
|
279
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
|
|
280
|
+
if (deviceStatus.body.version) {
|
|
281
|
+
const deviceVersion = version?.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
282
|
+
this.accessory
|
|
283
|
+
.getService(this.hap.Service.AccessoryInformation)!
|
|
284
|
+
.setCharacteristic(this.hap.Characteristic.HardwareRevision, deviceVersion)
|
|
285
|
+
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
286
|
+
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
287
|
+
.updateValue(deviceVersion);
|
|
288
|
+
this.accessory.context.deviceVersion = deviceVersion;
|
|
289
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceVersion: ${this.accessory.context.deviceVersion}`);
|
|
290
|
+
}
|
|
355
291
|
}
|
|
356
292
|
|
|
357
293
|
/**
|
|
@@ -386,103 +322,43 @@ export class Lock {
|
|
|
386
322
|
// Start to monitor advertisement packets
|
|
387
323
|
(async () => {
|
|
388
324
|
// Start to monitor advertisement packets
|
|
389
|
-
await switchbot.startScan({
|
|
390
|
-
model: 'o',
|
|
391
|
-
id: this.device.bleMac,
|
|
392
|
-
});
|
|
325
|
+
await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
|
|
393
326
|
// Set an event handler
|
|
394
327
|
switchbot.onadvertisement = (ad: any) => {
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
328
|
+
if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
|
|
329
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
|
|
330
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
|
|
398
331
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
399
|
-
this.BLE_BatteryLevel = ad.serviceData.battery;
|
|
400
|
-
this.BLE_Calibration = ad.serviceData.calibration;
|
|
401
|
-
this.BLE_LockCurrentState = ad.serviceData.status;
|
|
402
|
-
this.BLE_ContactSensorState = ad.serviceData.door_open;
|
|
403
332
|
} else {
|
|
404
333
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
405
334
|
}
|
|
406
335
|
};
|
|
407
|
-
// Wait
|
|
336
|
+
// Wait 10 seconds
|
|
408
337
|
await switchbot.wait(this.scanDuration * 1000);
|
|
409
338
|
// Stop to monitor
|
|
410
339
|
await switchbot.stopScan();
|
|
411
340
|
// Update HomeKit
|
|
412
|
-
await this.BLEparseStatus();
|
|
341
|
+
await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
|
|
413
342
|
await this.updateHomeKitCharacteristics();
|
|
414
343
|
})();
|
|
415
|
-
|
|
416
|
-
switchbot
|
|
417
|
-
.startScan({
|
|
418
|
-
model: 'o',
|
|
419
|
-
id: this.device.bleMac,
|
|
420
|
-
})
|
|
421
|
-
.then(async () => {
|
|
422
|
-
// Set an event handler
|
|
423
|
-
switchbot.onadvertisement = async (ad: ad) => {
|
|
424
|
-
this.debugLog(
|
|
425
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
|
|
426
|
-
` BLE Address Found: ${ad.address}`,
|
|
427
|
-
);
|
|
428
|
-
this.BLE_BatteryLevel = ad.serviceData.battery;
|
|
429
|
-
this.BLE_Calibration = ad.serviceData.calibration;
|
|
430
|
-
this.BLE_LockCurrentState = ad.serviceData.status;
|
|
431
|
-
this.BLE_ContactSensorState = ad.serviceData.door_open;
|
|
432
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
433
|
-
this.debugLog(
|
|
434
|
-
`${this.device.deviceType}: ${this.accessory.displayName} battery: ${ad.serviceData.battery}, ` +
|
|
435
|
-
`calibration: ${ad.serviceData.calibration}, status: ${ad.serviceData.status}, battery: ${ad.serviceData.battery}, ` +
|
|
436
|
-
`door_open: ${ad.serviceData.door_open}`,
|
|
437
|
-
);
|
|
438
|
-
|
|
439
|
-
if (ad.serviceData) {
|
|
440
|
-
this.BLE_IsConnected = true;
|
|
441
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
442
|
-
await this.stopScanning(switchbot);
|
|
443
|
-
} else {
|
|
444
|
-
this.BLE_IsConnected = false;
|
|
445
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
446
|
-
}
|
|
447
|
-
};
|
|
448
|
-
// Wait
|
|
449
|
-
return await sleep(this.scanDuration * 1000);
|
|
450
|
-
})
|
|
451
|
-
.then(async () => {
|
|
452
|
-
// Stop to monitor
|
|
453
|
-
await this.stopScanning(switchbot);
|
|
454
|
-
})
|
|
455
|
-
.catch(async (e: any) => {
|
|
456
|
-
this.apiError(e);
|
|
457
|
-
this.errorLog(
|
|
458
|
-
`${this.device.deviceType}: ${this.accessory.displayName} failed BLERefreshStatus with ${this.device.connectionType}` +
|
|
459
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
460
|
-
);
|
|
461
|
-
await this.BLERefreshConnection(switchbot);
|
|
462
|
-
});
|
|
463
|
-
} else {
|
|
344
|
+
if (switchbot === undefined) {
|
|
464
345
|
await this.BLERefreshConnection(switchbot);
|
|
465
|
-
}
|
|
346
|
+
}
|
|
466
347
|
}
|
|
467
348
|
|
|
468
349
|
async openAPIRefreshStatus(): Promise<void> {
|
|
469
350
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
|
|
470
351
|
try {
|
|
471
|
-
const { body, statusCode } = await
|
|
472
|
-
headers: this.platform.generateHeaders()
|
|
473
|
-
});
|
|
352
|
+
const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries,
|
|
353
|
+
`${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
|
|
474
354
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
|
|
475
355
|
const deviceStatus: any = await body.json();
|
|
476
356
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
477
357
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
478
358
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
479
|
-
this.
|
|
359
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
480
360
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
481
|
-
this.
|
|
482
|
-
this.OpenAPI_ContactSensorState = deviceStatus.body.doorState;
|
|
483
|
-
this.OpenAPI_BatteryLevel = deviceStatus.body.battery;
|
|
484
|
-
this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
|
|
485
|
-
this.openAPIparseStatus();
|
|
361
|
+
this.openAPIparseStatus(deviceStatus);
|
|
486
362
|
this.updateHomeKitCharacteristics();
|
|
487
363
|
} else {
|
|
488
364
|
this.statusCode(statusCode);
|
|
@@ -527,9 +403,9 @@ export class Lock {
|
|
|
527
403
|
|
|
528
404
|
async BLEpushChanges(): Promise<void> {
|
|
529
405
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`);
|
|
530
|
-
if (this.LockTargetState !== this.accessory.context.LockTargetState) {
|
|
406
|
+
if (this.LockMechanism.LockTargetState !== this.accessory.context.LockTargetState) {
|
|
531
407
|
this.debugLog(
|
|
532
|
-
`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges LockTargetState: ${this.LockTargetState}` +
|
|
408
|
+
`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges LockTargetState: ${this.LockMechanism.LockTargetState}` +
|
|
533
409
|
` LockTargetStateCached: ${this.accessory.context.LockTargetState}`,
|
|
534
410
|
);
|
|
535
411
|
const switchbot = await this.platform.connectBLE();
|
|
@@ -546,7 +422,9 @@ export class Lock {
|
|
|
546
422
|
})
|
|
547
423
|
.then(() => {
|
|
548
424
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
549
|
-
this.
|
|
425
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
426
|
+
+ `LockTargetState: ${this.LockMechanism.LockTargetState} sent over BLE, sent successfully`);
|
|
427
|
+
this.LockMechanism.LockTargetState = this.hap.Characteristic.LockTargetState.SECURED;
|
|
550
428
|
})
|
|
551
429
|
.catch(async (e: any) => {
|
|
552
430
|
this.apiError(e);
|
|
@@ -559,7 +437,7 @@ export class Lock {
|
|
|
559
437
|
} else {
|
|
560
438
|
this.debugLog(
|
|
561
439
|
`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges.` +
|
|
562
|
-
`LockTargetState: ${this.LockTargetState}, ` +
|
|
440
|
+
`LockTargetState: ${this.LockMechanism.LockTargetState}, ` +
|
|
563
441
|
`LockTargetStateCached: ${this.accessory.context.LockTargetState}`,
|
|
564
442
|
);
|
|
565
443
|
}
|
|
@@ -568,13 +446,13 @@ export class Lock {
|
|
|
568
446
|
async openAPIpushChanges(LatchUnlock?): Promise<void> {
|
|
569
447
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
|
|
570
448
|
|
|
571
|
-
if ((this.LockTargetState !== this.accessory.context.LockTargetState) || LatchUnlock) {
|
|
449
|
+
if ((this.LockMechanism.LockTargetState !== this.accessory.context.LockTargetState) || LatchUnlock) {
|
|
572
450
|
// Determine the command based on the LockTargetState or the forceUnlock parameter
|
|
573
451
|
let command = '';
|
|
574
452
|
if (LatchUnlock) {
|
|
575
453
|
command = 'unlock';
|
|
576
454
|
} else {
|
|
577
|
-
command = this.LockTargetState ? 'lock' : 'unlock';
|
|
455
|
+
command = this.LockMechanism.LockTargetState ? 'lock' : 'unlock';
|
|
578
456
|
}
|
|
579
457
|
const bodyChange = JSON.stringify({
|
|
580
458
|
command: `${command}`,
|
|
@@ -596,6 +474,8 @@ export class Lock {
|
|
|
596
474
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
597
475
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
598
476
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
477
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
478
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
|
|
599
479
|
} else {
|
|
600
480
|
this.statusCode(statusCode);
|
|
601
481
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -610,7 +490,7 @@ export class Lock {
|
|
|
610
490
|
} else {
|
|
611
491
|
this.debugLog(
|
|
612
492
|
`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges.` +
|
|
613
|
-
`LockTargetState: ${this.LockTargetState}, ` +
|
|
493
|
+
`LockTargetState: ${this.LockMechanism.LockTargetState}, ` +
|
|
614
494
|
`LockTargetStateCached: ${this.accessory.context.LockTargetState}`,
|
|
615
495
|
);
|
|
616
496
|
}
|
|
@@ -620,81 +500,97 @@ export class Lock {
|
|
|
620
500
|
* Handle requests to set the value of the "On" characteristic
|
|
621
501
|
*/
|
|
622
502
|
async LockTargetStateSet(value: CharacteristicValue): Promise<void> {
|
|
623
|
-
if (this.LockTargetState === this.accessory.context.LockTargetState) {
|
|
503
|
+
if (this.LockMechanism.LockTargetState === this.accessory.context.LockTargetState) {
|
|
624
504
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set LockTargetState: ${value}`);
|
|
625
505
|
} else {
|
|
626
506
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set LockTargetState: ${value}`);
|
|
627
507
|
}
|
|
628
508
|
|
|
629
|
-
this.LockTargetState = value;
|
|
509
|
+
this.LockMechanism.LockTargetState = value;
|
|
510
|
+
this.doLockUpdate.next();
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Handle requests to set the value of the "On" characteristic
|
|
515
|
+
*/
|
|
516
|
+
async OnSet(value: CharacteristicValue): Promise<void> {
|
|
517
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Latch Button Set On: ${value}`);
|
|
518
|
+
if (value) {
|
|
519
|
+
this.debugLog('Attempting to open the latch');
|
|
520
|
+
|
|
521
|
+
this.openAPIpushChanges(value).then(() => {
|
|
522
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Latch opened successfully`);
|
|
523
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
524
|
+
+ ` SwitchService is: ${this.Switch!.Service ? 'available' : 'not available'}`);
|
|
525
|
+
|
|
526
|
+
// simulate button press to turn the switch back off
|
|
527
|
+
if (this.Switch!.Service) {
|
|
528
|
+
const SwitchService = this.Switch!.Service;
|
|
529
|
+
// Simulate a button press by waiting a short period before turning the switch off
|
|
530
|
+
setTimeout(() => {
|
|
531
|
+
SwitchService.getCharacteristic(this.hap.Characteristic.On).updateValue(false);
|
|
532
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Latch button switched off automatically.`);
|
|
533
|
+
}, 500); // 500 ms delay
|
|
534
|
+
}
|
|
535
|
+
}).catch((e: any) => {
|
|
536
|
+
// Log the error if the operation failed
|
|
537
|
+
this.debugLog(`Error opening latch: ${e}`);
|
|
538
|
+
// Ensure we turn the switch back off even in case of an error
|
|
539
|
+
if (this.Switch!.Service) {
|
|
540
|
+
this.Switch!.Service.getCharacteristic(this.hap.Characteristic.On).updateValue(false);
|
|
541
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Latch button switched off after an error.`);
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
} else {
|
|
545
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Switch is off, nothing to do`);
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
this.Switch!.On = value;
|
|
630
549
|
this.doLockUpdate.next();
|
|
631
550
|
}
|
|
632
551
|
|
|
633
552
|
async updateHomeKitCharacteristics(): Promise<void> {
|
|
634
553
|
if (!this.device.lock?.hide_contactsensor) {
|
|
635
|
-
if (this.ContactSensorState === undefined) {
|
|
636
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
|
|
554
|
+
if (this.ContactSensor!.ContactSensorState === undefined) {
|
|
555
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor!.ContactSensorState}`);
|
|
637
556
|
} else {
|
|
638
|
-
this.accessory.context.ContactSensorState = this.ContactSensorState;
|
|
639
|
-
this.
|
|
640
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
557
|
+
this.accessory.context.ContactSensorState = this.ContactSensor!.ContactSensorState;
|
|
558
|
+
this.ContactSensor!.Service.updateCharacteristic(this.hap.Characteristic.ContactSensorState, this.ContactSensor!.ContactSensorState);
|
|
559
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
560
|
+
+ ` ContactSensorState: ${this.ContactSensor!.ContactSensorState}`);
|
|
641
561
|
}
|
|
642
562
|
}
|
|
643
|
-
if (this.LockTargetState === undefined) {
|
|
644
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LockTargetState: ${this.LockTargetState}`);
|
|
645
|
-
} else {
|
|
646
|
-
this.accessory.context.LockTargetState = this.LockTargetState;
|
|
647
|
-
this.lockService.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.LockTargetState);
|
|
648
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic LockTargetState: ${this.LockTargetState}`);
|
|
649
|
-
}
|
|
650
|
-
if (this.LockCurrentState === undefined) {
|
|
651
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LockCurrentState: ${this.LockCurrentState}`);
|
|
563
|
+
if (this.LockMechanism.LockTargetState === undefined) {
|
|
564
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LockTargetState: ${this.LockMechanism.LockTargetState}`);
|
|
652
565
|
} else {
|
|
653
|
-
this.accessory.context.
|
|
654
|
-
this.
|
|
655
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
566
|
+
this.accessory.context.LockTargetState = this.LockMechanism.LockTargetState;
|
|
567
|
+
this.LockMechanism.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.LockMechanism.LockTargetState);
|
|
568
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
569
|
+
+ ` LockTargetState: ${this.LockMechanism.LockTargetState}`);
|
|
656
570
|
}
|
|
657
|
-
if (this.
|
|
658
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
571
|
+
if (this.LockMechanism.LockCurrentState === undefined) {
|
|
572
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
|
|
659
573
|
} else {
|
|
660
|
-
this.accessory.context.
|
|
661
|
-
this.
|
|
662
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
574
|
+
this.accessory.context.LockCurrentState = this.LockMechanism.LockCurrentState;
|
|
575
|
+
this.LockMechanism.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.LockMechanism.LockCurrentState);
|
|
576
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
577
|
+
+ ` LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
|
|
663
578
|
}
|
|
664
|
-
if (this.
|
|
665
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
579
|
+
if (this.Battery.BatteryLevel === undefined) {
|
|
580
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
666
581
|
} else {
|
|
667
|
-
this.accessory.context.
|
|
668
|
-
this.
|
|
669
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
582
|
+
this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
|
|
583
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
|
|
584
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
585
|
+
+ ` BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
670
586
|
}
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
async stopScanning(switchbot: any) {
|
|
674
|
-
switchbot.stopScan();
|
|
675
|
-
if (this.BLE_IsConnected) {
|
|
676
|
-
await this.BLEparseStatus();
|
|
677
|
-
await this.updateHomeKitCharacteristics();
|
|
587
|
+
if (this.Battery.StatusLowBattery === undefined) {
|
|
588
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
678
589
|
} else {
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
async getCustomBLEAddress(switchbot: any) {
|
|
684
|
-
if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
|
|
685
|
-
(async () => {
|
|
686
|
-
// Start to monitor advertisement packets
|
|
687
|
-
await switchbot.startScan({
|
|
688
|
-
model: 'c',
|
|
689
|
-
});
|
|
690
|
-
// Set an event handler
|
|
691
|
-
switchbot.onadvertisement = (ad: any) => {
|
|
692
|
-
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} ad: ${JSON.stringify(ad, null, ' ')}`);
|
|
693
|
-
};
|
|
694
|
-
await sleep(10000);
|
|
695
|
-
// Stop to monitor
|
|
696
|
-
switchbot.stopScan();
|
|
697
|
-
})();
|
|
590
|
+
this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
|
|
591
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
|
|
592
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
593
|
+
+ ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
698
594
|
}
|
|
699
595
|
}
|
|
700
596
|
|
|
@@ -714,227 +610,22 @@ export class Lock {
|
|
|
714
610
|
}
|
|
715
611
|
}
|
|
716
612
|
|
|
717
|
-
async scan(device: device & devicesConfig): Promise<void> {
|
|
718
|
-
if (device.scanDuration) {
|
|
719
|
-
this.scanDuration = this.accessory.context.scanDuration = device.scanDuration;
|
|
720
|
-
if (this.BLE) {
|
|
721
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config scanDuration: ${this.scanDuration}`);
|
|
722
|
-
}
|
|
723
|
-
} else {
|
|
724
|
-
this.scanDuration = this.accessory.context.scanDuration = 1;
|
|
725
|
-
if (this.BLE) {
|
|
726
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default scanDuration: ${this.scanDuration}`);
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
async statusCode(statusCode: number): Promise<void> {
|
|
732
|
-
switch (statusCode) {
|
|
733
|
-
case 151:
|
|
734
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
|
|
735
|
-
break;
|
|
736
|
-
case 152:
|
|
737
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
|
|
738
|
-
break;
|
|
739
|
-
case 160:
|
|
740
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
|
|
741
|
-
break;
|
|
742
|
-
case 161:
|
|
743
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
|
|
744
|
-
this.offlineOff();
|
|
745
|
-
break;
|
|
746
|
-
case 171:
|
|
747
|
-
this.errorLog(
|
|
748
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
|
|
749
|
-
`Hub: ${this.device.hubDeviceId}`,
|
|
750
|
-
);
|
|
751
|
-
this.offlineOff();
|
|
752
|
-
break;
|
|
753
|
-
case 190:
|
|
754
|
-
this.errorLog(
|
|
755
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
|
|
756
|
-
` Or command format is invalid, statusCode: ${statusCode}`,
|
|
757
|
-
);
|
|
758
|
-
break;
|
|
759
|
-
case 100:
|
|
760
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
|
|
761
|
-
break;
|
|
762
|
-
case 200:
|
|
763
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
|
|
764
|
-
break;
|
|
765
|
-
case 400:
|
|
766
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
|
|
767
|
-
+ `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
|
|
768
|
-
break;
|
|
769
|
-
case 401:
|
|
770
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
|
|
771
|
-
+ `but the request has not been authenticated, statusCode: ${statusCode}`);
|
|
772
|
-
break;
|
|
773
|
-
case 403:
|
|
774
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
|
|
775
|
-
+ `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
|
|
776
|
-
break;
|
|
777
|
-
case 404:
|
|
778
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
|
|
779
|
-
+ `statusCode: ${statusCode}`);
|
|
780
|
-
break;
|
|
781
|
-
case 406:
|
|
782
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
|
|
783
|
-
+ `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
|
|
784
|
-
break;
|
|
785
|
-
case 415:
|
|
786
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
|
|
787
|
-
+ `header that is not supported by the server, statusCode: ${statusCode}`);
|
|
788
|
-
break;
|
|
789
|
-
case 422:
|
|
790
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
|
|
791
|
-
+ `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
|
|
792
|
-
break;
|
|
793
|
-
case 429:
|
|
794
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
|
|
795
|
-
+ `requests allowed for a given time window, statusCode: ${statusCode}`);
|
|
796
|
-
break;
|
|
797
|
-
case 500:
|
|
798
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
|
|
799
|
-
+ `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
|
|
800
|
-
break;
|
|
801
|
-
default:
|
|
802
|
-
this.infoLog(
|
|
803
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
|
|
804
|
-
`${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`,
|
|
805
|
-
);
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
|
|
809
613
|
async offlineOff(): Promise<void> {
|
|
810
614
|
if (this.device.offline) {
|
|
811
|
-
|
|
812
|
-
|
|
615
|
+
if (!this.device.lock?.hide_contactsensor) {
|
|
616
|
+
this.ContactSensor!.Service.updateCharacteristic(this.hap.Characteristic.ContactSensorState,
|
|
617
|
+
this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED);
|
|
618
|
+
}
|
|
619
|
+
this.LockMechanism.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, this.hap.Characteristic.LockTargetState.SECURED);
|
|
620
|
+
this.LockMechanism.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, this.hap.Characteristic.LockCurrentState.SECURED);
|
|
813
621
|
}
|
|
814
622
|
}
|
|
815
623
|
|
|
816
624
|
async apiError(e: any): Promise<void> {
|
|
817
625
|
if (!this.device.lock?.hide_contactsensor) {
|
|
818
|
-
this.
|
|
819
|
-
}
|
|
820
|
-
this.lockService.updateCharacteristic(this.hap.Characteristic.LockTargetState, e);
|
|
821
|
-
this.lockService.updateCharacteristic(this.hap.Characteristic.LockCurrentState, e);
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
async deviceContext() {
|
|
825
|
-
if (this.LockTargetState === undefined) {
|
|
826
|
-
this.LockTargetState = false;
|
|
827
|
-
} else {
|
|
828
|
-
this.LockTargetState = this.accessory.context.On;
|
|
829
|
-
}
|
|
830
|
-
if (this.FirmwareRevision === undefined) {
|
|
831
|
-
this.FirmwareRevision = this.platform.version;
|
|
832
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
833
|
-
}
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
async refreshRate(device: device & devicesConfig): Promise<void> {
|
|
837
|
-
if (device.refreshRate) {
|
|
838
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate;
|
|
839
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
|
|
840
|
-
} else if (this.platform.config.options!.refreshRate) {
|
|
841
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = this.platform.config.options!.refreshRate;
|
|
842
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
|
|
843
|
-
}
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
async deviceConfig(device: device & devicesConfig): Promise<void> {
|
|
847
|
-
let config = {};
|
|
848
|
-
if (device.lock) {
|
|
849
|
-
config = device.lock;
|
|
850
|
-
}
|
|
851
|
-
if (device.connectionType !== undefined) {
|
|
852
|
-
config['connectionType'] = device.connectionType;
|
|
853
|
-
}
|
|
854
|
-
if (device.external !== undefined) {
|
|
855
|
-
config['external'] = device.external;
|
|
856
|
-
}
|
|
857
|
-
if (device.logging !== undefined) {
|
|
858
|
-
config['logging'] = device.logging;
|
|
859
|
-
}
|
|
860
|
-
if (device.refreshRate !== undefined) {
|
|
861
|
-
config['refreshRate'] = device.refreshRate;
|
|
862
|
-
}
|
|
863
|
-
if (device.scanDuration !== undefined) {
|
|
864
|
-
config['scanDuration'] = device.scanDuration;
|
|
865
|
-
}
|
|
866
|
-
if (device.webhook !== undefined) {
|
|
867
|
-
config['webhook'] = device.webhook;
|
|
626
|
+
this.ContactSensor!.Service.updateCharacteristic(this.hap.Characteristic.ContactSensorState, e);
|
|
868
627
|
}
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
}
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
async deviceLogs(device: device & devicesConfig): Promise<void> {
|
|
875
|
-
if (this.platform.debugMode) {
|
|
876
|
-
this.deviceLogging = this.accessory.context.logging = 'debugMode';
|
|
877
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
|
|
878
|
-
} else if (device.logging) {
|
|
879
|
-
this.deviceLogging = this.accessory.context.logging = device.logging;
|
|
880
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
|
|
881
|
-
} else if (this.platform.config.options?.logging) {
|
|
882
|
-
this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
|
|
883
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
|
|
884
|
-
} else {
|
|
885
|
-
this.deviceLogging = this.accessory.context.logging = 'standard';
|
|
886
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
|
|
887
|
-
}
|
|
888
|
-
}
|
|
889
|
-
|
|
890
|
-
/**
|
|
891
|
-
* Logging for Device
|
|
892
|
-
*/
|
|
893
|
-
infoLog(...log: any[]): void {
|
|
894
|
-
if (this.enablingDeviceLogging()) {
|
|
895
|
-
this.platform.log.info(String(...log));
|
|
896
|
-
}
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
warnLog(...log: any[]): void {
|
|
900
|
-
if (this.enablingDeviceLogging()) {
|
|
901
|
-
this.platform.log.warn(String(...log));
|
|
902
|
-
}
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
debugWarnLog(...log: any[]): void {
|
|
906
|
-
if (this.enablingDeviceLogging()) {
|
|
907
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
908
|
-
this.platform.log.warn('[DEBUG]', String(...log));
|
|
909
|
-
}
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
|
|
913
|
-
errorLog(...log: any[]): void {
|
|
914
|
-
if (this.enablingDeviceLogging()) {
|
|
915
|
-
this.platform.log.error(String(...log));
|
|
916
|
-
}
|
|
917
|
-
}
|
|
918
|
-
|
|
919
|
-
debugErrorLog(...log: any[]): void {
|
|
920
|
-
if (this.enablingDeviceLogging()) {
|
|
921
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
922
|
-
this.platform.log.error('[DEBUG]', String(...log));
|
|
923
|
-
}
|
|
924
|
-
}
|
|
925
|
-
}
|
|
926
|
-
|
|
927
|
-
debugLog(...log: any[]): void {
|
|
928
|
-
if (this.enablingDeviceLogging()) {
|
|
929
|
-
if (this.deviceLogging === 'debug') {
|
|
930
|
-
this.platform.log.info('[DEBUG]', String(...log));
|
|
931
|
-
} else {
|
|
932
|
-
this.platform.log.debug(String(...log));
|
|
933
|
-
}
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
|
|
937
|
-
enablingDeviceLogging(): boolean {
|
|
938
|
-
return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
|
|
628
|
+
this.LockMechanism.Service.updateCharacteristic(this.hap.Characteristic.LockTargetState, e);
|
|
629
|
+
this.LockMechanism.Service.updateCharacteristic(this.hap.Characteristic.LockCurrentState, e);
|
|
939
630
|
}
|
|
940
631
|
}
|