@switchbot/homebridge-switchbot 3.5.0-beta.6 → 3.5.0-beta.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +4 -1
- package/CHANGELOG.md +4 -1
- package/config.schema.json +120 -17
- package/dist/device/blindtilt.d.ts +23 -96
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +408 -779
- package/dist/device/blindtilt.js.map +1 -1
- package/dist/device/bot.d.ts +26 -72
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +696 -822
- package/dist/device/bot.js.map +1 -1
- package/dist/device/ceilinglight.d.ts +14 -68
- package/dist/device/ceilinglight.d.ts.map +1 -1
- package/dist/device/ceilinglight.js +237 -606
- package/dist/device/ceilinglight.js.map +1 -1
- package/dist/device/colorbulb.d.ts +14 -75
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +279 -658
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.d.ts +15 -66
- package/dist/device/contact.d.ts.map +1 -1
- package/dist/device/contact.js +242 -544
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts +19 -88
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +402 -805
- package/dist/device/curtain.js.map +1 -1
- package/dist/device/device.d.ts +59 -0
- package/dist/device/device.d.ts.map +1 -0
- package/dist/device/device.js +684 -0
- package/dist/device/device.js.map +1 -0
- package/dist/device/fan.d.ts +51 -0
- package/dist/device/fan.d.ts.map +1 -0
- package/dist/device/fan.js +535 -0
- package/dist/device/fan.js.map +1 -0
- package/dist/device/hub.d.ts +16 -60
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +246 -613
- package/dist/device/hub.js.map +1 -1
- package/dist/device/humidifier.d.ts +11 -66
- package/dist/device/humidifier.d.ts.map +1 -1
- package/dist/device/humidifier.js +232 -593
- package/dist/device/humidifier.js.map +1 -1
- package/dist/device/iosensor.d.ts +11 -64
- package/dist/device/iosensor.d.ts.map +1 -1
- package/dist/device/iosensor.js +185 -600
- package/dist/device/iosensor.js.map +1 -1
- package/dist/device/lightstrip.d.ts +11 -69
- package/dist/device/lightstrip.d.ts.map +1 -1
- package/dist/device/lightstrip.js +277 -586
- package/dist/device/lightstrip.js.map +1 -1
- package/dist/device/lock.d.ts +16 -63
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +241 -560
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.d.ts +14 -64
- package/dist/device/meter.d.ts.map +1 -1
- package/dist/device/meter.js +181 -593
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.d.ts +14 -65
- package/dist/device/meterplus.d.ts.map +1 -1
- package/dist/device/meterplus.js +170 -593
- package/dist/device/meterplus.js.map +1 -1
- package/dist/device/motion.d.ts +13 -69
- package/dist/device/motion.d.ts.map +1 -1
- package/dist/device/motion.js +178 -531
- package/dist/device/motion.js.map +1 -1
- package/dist/device/plug.d.ts +9 -57
- package/dist/device/plug.d.ts.map +1 -1
- package/dist/device/plug.js +92 -458
- package/dist/device/plug.js.map +1 -1
- package/dist/device/robotvacuumcleaner.d.ts +12 -63
- package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
- package/dist/device/robotvacuumcleaner.js +197 -521
- package/dist/device/robotvacuumcleaner.js.map +1 -1
- package/dist/device/waterdetector.d.ts +10 -65
- package/dist/device/waterdetector.d.ts.map +1 -1
- package/dist/device/waterdetector.js +139 -495
- package/dist/device/waterdetector.js.map +1 -1
- package/dist/homebridge-ui/public/index.html +22 -16
- package/dist/homebridge-ui/server.js +1 -1
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/irdevice/airconditioner.d.ts +9 -49
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js +309 -419
- package/dist/irdevice/airconditioner.js.map +1 -1
- package/dist/irdevice/airpurifier.d.ts +8 -39
- package/dist/irdevice/airpurifier.d.ts.map +1 -1
- package/dist/irdevice/airpurifier.js +72 -304
- package/dist/irdevice/airpurifier.js.map +1 -1
- package/dist/irdevice/camera.d.ts +7 -36
- package/dist/irdevice/camera.d.ts.map +1 -1
- package/dist/irdevice/camera.js +34 -278
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts +10 -43
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +100 -338
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +40 -0
- package/dist/irdevice/irdevice.d.ts.map +1 -0
- package/dist/irdevice/irdevice.js +330 -0
- package/dist/irdevice/irdevice.js.map +1 -0
- package/dist/irdevice/light.d.ts +12 -45
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +87 -357
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.d.ts +19 -48
- package/dist/irdevice/other.d.ts.map +1 -1
- package/dist/irdevice/other.js +352 -546
- package/dist/irdevice/other.js.map +1 -1
- package/dist/irdevice/tv.d.ts +8 -40
- package/dist/irdevice/tv.d.ts.map +1 -1
- package/dist/irdevice/tv.js +82 -321
- package/dist/irdevice/tv.js.map +1 -1
- package/dist/irdevice/vacuumcleaner.d.ts +7 -36
- package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
- package/dist/irdevice/vacuumcleaner.js +41 -284
- package/dist/irdevice/vacuumcleaner.js.map +1 -1
- package/dist/irdevice/waterheater.d.ts +7 -36
- package/dist/irdevice/waterheater.d.ts.map +1 -1
- package/dist/irdevice/waterheater.js +42 -287
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/platform.d.ts +19 -6
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +310 -169
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +62 -19
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +16 -552
- package/dist/settings.js.map +1 -1
- package/dist/utils.d.ts +77 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +638 -1
- package/dist/utils.js.map +1 -1
- package/eslint.config.js +96 -0
- package/package.json +19 -15
- package/src/custom.d.ts +2 -1
- package/src/device/blindtilt.ts +442 -814
- package/src/device/bot.ts +754 -915
- package/src/device/ceilinglight.ts +255 -633
- package/src/device/colorbulb.ts +294 -685
- package/src/device/contact.ts +277 -571
- package/src/device/curtain.ts +431 -835
- package/src/device/device.ts +709 -0
- package/src/device/fan.ts +591 -0
- package/src/device/hub.ts +286 -644
- package/src/device/humidifier.ts +266 -646
- package/src/device/iosensor.ts +220 -625
- package/src/device/lightstrip.ts +305 -620
- package/src/device/lock.ts +280 -600
- package/src/device/meter.ts +216 -617
- package/src/device/meterplus.ts +205 -619
- package/src/device/motion.ts +206 -556
- package/src/device/plug.ts +107 -490
- package/src/device/robotvacuumcleaner.ts +223 -550
- package/src/device/waterdetector.ts +160 -519
- package/src/homebridge-ui/public/index.html +22 -16
- package/src/homebridge-ui/server.ts +1 -1
- package/src/index.ts +4 -3
- package/src/irdevice/airconditioner.ts +333 -447
- package/src/irdevice/airpurifier.ts +92 -322
- package/src/irdevice/camera.ts +45 -294
- package/src/irdevice/fan.ts +115 -353
- package/src/irdevice/irdevice.ts +346 -0
- package/src/irdevice/light.ts +110 -385
- package/src/irdevice/other.ts +399 -616
- package/src/irdevice/tv.ts +103 -340
- package/src/irdevice/vacuumcleaner.ts +52 -306
- package/src/irdevice/waterheater.ts +53 -311
- package/src/platform.ts +355 -216
- package/src/settings.ts +116 -611
- package/src/utils.ts +642 -1
- package/src/device/waterdetector.json +0 -11
package/dist/device/contact.js
CHANGED
|
@@ -1,165 +1,146 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* contact.ts: @switchbot/homebridge-switchbot.
|
|
4
|
+
*/
|
|
5
|
+
import { deviceBase } from './device.js';
|
|
3
6
|
import { interval, Subject } from 'rxjs';
|
|
4
|
-
import { skipWhile } from 'rxjs/operators';
|
|
5
7
|
import { Devices } from '../settings.js';
|
|
8
|
+
import { skipWhile } from 'rxjs/operators';
|
|
6
9
|
/**
|
|
7
10
|
* Platform Accessory
|
|
8
11
|
* An instance of this class is created for each accessory your platform registers
|
|
9
12
|
* Each accessory may expose multiple services of different service types.
|
|
10
13
|
*/
|
|
11
|
-
export class Contact {
|
|
14
|
+
export class Contact extends deviceBase {
|
|
12
15
|
platform;
|
|
13
|
-
accessory;
|
|
14
|
-
device;
|
|
15
|
-
api;
|
|
16
|
-
log;
|
|
17
|
-
config;
|
|
18
|
-
hap;
|
|
19
16
|
// Services
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
// Characteristic Values
|
|
25
|
-
BatteryLevel;
|
|
26
|
-
MotionDetected;
|
|
27
|
-
StatusLowBattery;
|
|
28
|
-
FirmwareRevision;
|
|
29
|
-
ContactSensorState;
|
|
30
|
-
CurrentAmbientLightLevel;
|
|
31
|
-
// OpenAPI Status
|
|
32
|
-
OpenAPI_BatteryLevel;
|
|
33
|
-
OpenAPI_FirmwareRevision;
|
|
34
|
-
OpenAPI_MotionDetected;
|
|
35
|
-
OpenAPI_ContactSensorState;
|
|
36
|
-
OpenAPI_CurrentAmbientLightLevel;
|
|
37
|
-
// BLE Status
|
|
38
|
-
BLE_BatteryLevel;
|
|
39
|
-
BLE_MotionDetected;
|
|
40
|
-
BLE_ContactSensorState;
|
|
41
|
-
BLE_CurrentAmbientLightLevel;
|
|
42
|
-
// BLE Others
|
|
43
|
-
scanning;
|
|
44
|
-
BLE_IsConnected;
|
|
45
|
-
// Config
|
|
46
|
-
set_minLux;
|
|
47
|
-
set_maxLux;
|
|
48
|
-
scanDuration;
|
|
49
|
-
deviceLogging;
|
|
50
|
-
deviceRefreshRate;
|
|
17
|
+
ContactSensor;
|
|
18
|
+
Battery;
|
|
19
|
+
MotionSensor;
|
|
20
|
+
LightSensor;
|
|
51
21
|
// Updates
|
|
52
|
-
|
|
22
|
+
contactUpdateInProgress;
|
|
53
23
|
doContactUpdate;
|
|
54
|
-
// Connection
|
|
55
|
-
OpenAPI;
|
|
56
|
-
BLE;
|
|
57
24
|
constructor(platform, accessory, device) {
|
|
25
|
+
super(platform, accessory, device);
|
|
58
26
|
this.platform = platform;
|
|
59
|
-
this.accessory = accessory;
|
|
60
|
-
this.device = device;
|
|
61
|
-
this.api = this.platform.api;
|
|
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
27
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
75
28
|
this.doContactUpdate = new Subject();
|
|
76
|
-
this.
|
|
77
|
-
//
|
|
78
|
-
this.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
.setCharacteristic(this.hap.Characteristic.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
29
|
+
this.contactUpdateInProgress = false;
|
|
30
|
+
// Initialize Contact Sensor property
|
|
31
|
+
this.ContactSensor = {
|
|
32
|
+
Name: accessory.context.ContactSensorName ?? accessory.displayName,
|
|
33
|
+
Service: accessory.getService(this.hap.Service.ContactSensor) ?? accessory.addService(this.hap.Service.ContactSensor),
|
|
34
|
+
ContactSensorState: accessory.context.ContactSensorState ?? this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED,
|
|
35
|
+
};
|
|
36
|
+
// Initialize ContactSensor Characteristics
|
|
37
|
+
this.ContactSensor.Service
|
|
38
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.ContactSensor.Name)
|
|
39
|
+
.setCharacteristic(this.hap.Characteristic.StatusActive, true)
|
|
40
|
+
.getCharacteristic(this.hap.Characteristic.ContactSensorState)
|
|
41
|
+
.onGet(() => {
|
|
42
|
+
return this.ContactSensor.ContactSensorState;
|
|
43
|
+
});
|
|
44
|
+
accessory.context.ContactSensorName = this.ContactSensor.Name;
|
|
45
|
+
// Initialize Battery property
|
|
46
|
+
this.Battery = {
|
|
47
|
+
Name: accessory.context.BatteryName ?? `${accessory.displayName} Battery`,
|
|
48
|
+
Service: accessory.getService(this.hap.Service.Battery) ?? accessory.addService(this.hap.Service.Battery),
|
|
49
|
+
BatteryLevel: accessory.context.BatteryLevel ?? 100,
|
|
50
|
+
StatusLowBattery: accessory.context.StatusLowBattery ?? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL,
|
|
51
|
+
};
|
|
52
|
+
// Initialize Battery Characteristics
|
|
53
|
+
this.Battery.Service
|
|
54
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.Battery.Name)
|
|
55
|
+
.setCharacteristic(this.hap.Characteristic.ChargingState, this.hap.Characteristic.ChargingState.NOT_CHARGEABLE)
|
|
56
|
+
.getCharacteristic(this.hap.Characteristic.BatteryLevel)
|
|
57
|
+
.onGet(() => {
|
|
58
|
+
return this.Battery.BatteryLevel;
|
|
59
|
+
});
|
|
60
|
+
this.Battery.Service
|
|
61
|
+
.setCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery)
|
|
62
|
+
.getCharacteristic(this.hap.Characteristic.StatusLowBattery)
|
|
63
|
+
.onGet(() => {
|
|
64
|
+
return this.Battery.StatusLowBattery;
|
|
65
|
+
});
|
|
66
|
+
accessory.context.BatteryName = this.Battery.Name;
|
|
67
|
+
// Initialize Motion Sensor Service
|
|
68
|
+
if (this.device.contact?.hide_motionsensor) {
|
|
69
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} Removing Motion Sensor Service`);
|
|
70
|
+
this.MotionSensor.Service = accessory.getService(this.hap.Service.MotionSensor);
|
|
71
|
+
accessory.removeService(this.MotionSensor.Service);
|
|
108
72
|
}
|
|
109
73
|
else {
|
|
110
|
-
this.
|
|
74
|
+
this.MotionSensor = {
|
|
75
|
+
Name: accessory.context.MotionSensorName ?? `${accessory.displayName} Motion Sensor`,
|
|
76
|
+
Service: accessory.getService(this.hap.Service.MotionSensor) ?? accessory.addService(this.hap.Service.MotionSensor),
|
|
77
|
+
MotionDetected: accessory.context.MotionDetected ?? false,
|
|
78
|
+
};
|
|
79
|
+
// Motion Sensor Characteristics
|
|
80
|
+
this.MotionSensor.Service
|
|
81
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.MotionSensor.Name)
|
|
82
|
+
.setCharacteristic(this.hap.Characteristic.StatusActive, true)
|
|
83
|
+
.getCharacteristic(this.hap.Characteristic.MotionDetected)
|
|
84
|
+
.onGet(() => {
|
|
85
|
+
return this.MotionSensor.MotionDetected;
|
|
86
|
+
});
|
|
87
|
+
accessory.context.MotionSensorName = this.MotionSensor.Name;
|
|
111
88
|
}
|
|
112
|
-
// Light Sensor Service
|
|
89
|
+
// Initialize Light Sensor Service
|
|
113
90
|
if (device.contact?.hide_lightsensor) {
|
|
114
91
|
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Light Sensor Service`);
|
|
115
|
-
this.
|
|
116
|
-
accessory.removeService(this.
|
|
117
|
-
}
|
|
118
|
-
else if (!this.lightSensorService) {
|
|
119
|
-
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Add Light Sensor Service`);
|
|
120
|
-
const lightSensorService = `${accessory.displayName} Light Sensor`;
|
|
121
|
-
(this.lightSensorService = this.accessory.getService(this.hap.Service.LightSensor)
|
|
122
|
-
|| this.accessory.addService(this.hap.Service.LightSensor)), lightSensorService;
|
|
123
|
-
this.lightSensorService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Light Sensor`);
|
|
124
|
-
this.lightSensorService.setCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Light Sensor`);
|
|
92
|
+
this.LightSensor.Service = accessory.getService(this.hap.Service.LightSensor);
|
|
93
|
+
accessory.removeService(this.LightSensor.Service);
|
|
125
94
|
}
|
|
126
95
|
else {
|
|
127
|
-
this.
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
96
|
+
this.LightSensor = {
|
|
97
|
+
Name: accessory.context.LightSensorName ?? `${accessory.displayName} Light Sensor`,
|
|
98
|
+
Service: accessory.getService(this.hap.Service.LightSensor) ?? accessory.addService(this.hap.Service.LightSensor),
|
|
99
|
+
CurrentAmbientLightLevel: accessory.context.CurrentAmbientLightLevel ?? 0.0001,
|
|
100
|
+
};
|
|
101
|
+
// Light Sensor Characteristics
|
|
102
|
+
this.LightSensor.Service
|
|
103
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.LightSensor.Name)
|
|
104
|
+
.setCharacteristic(this.hap.Characteristic.StatusActive, true)
|
|
105
|
+
.getCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel)
|
|
106
|
+
.onGet(() => {
|
|
107
|
+
return this.LightSensor.CurrentAmbientLightLevel;
|
|
108
|
+
});
|
|
109
|
+
accessory.context.LightSensorName = this.LightSensor.Name;
|
|
136
110
|
}
|
|
137
|
-
|
|
111
|
+
// Retrieve initial values and updateHomekit
|
|
112
|
+
this.refreshStatus();
|
|
138
113
|
// Retrieve initial values and updateHomekit
|
|
139
114
|
this.updateHomeKitCharacteristics();
|
|
140
115
|
// Start an update interval
|
|
141
116
|
interval(this.deviceRefreshRate * 1000)
|
|
142
|
-
.pipe(skipWhile(() => this.
|
|
117
|
+
.pipe(skipWhile(() => this.contactUpdateInProgress))
|
|
143
118
|
.subscribe(async () => {
|
|
144
119
|
await this.refreshStatus();
|
|
145
120
|
});
|
|
146
121
|
//regisiter webhook event handler
|
|
147
|
-
if (
|
|
148
|
-
this.
|
|
122
|
+
if (device.webhook) {
|
|
123
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
|
|
149
124
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
|
|
150
125
|
try {
|
|
151
126
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
|
|
152
127
|
const { detectionState, brightness, openState } = context;
|
|
153
|
-
const {
|
|
128
|
+
const { ContactSensorState } = this.ContactSensor;
|
|
129
|
+
const { CurrentAmbientLightLevel } = this.LightSensor ?? {};
|
|
130
|
+
const { MotionDetected } = this.MotionSensor ?? {};
|
|
154
131
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
|
|
155
132
|
'(detectionState, brightness, openState) = ' +
|
|
156
133
|
`Webhook:(${detectionState}, ${brightness}, ${openState}), ` +
|
|
157
134
|
`current:(${MotionDetected}, ${CurrentAmbientLightLevel}, ${ContactSensorState})`);
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
this.
|
|
161
|
-
|
|
162
|
-
|
|
135
|
+
const set_minLux = await this.minLux();
|
|
136
|
+
const set_maxLux = await this.maxLux();
|
|
137
|
+
this.ContactSensor.ContactSensorState = openState === 'open' ? 1 : 0;
|
|
138
|
+
if (!this.device.contact?.hide_motionsensor) {
|
|
139
|
+
this.MotionSensor.MotionDetected = detectionState === 'DETECTED' ? true : false;
|
|
140
|
+
}
|
|
141
|
+
if (!this.device.contact?.hide_lightsensor) {
|
|
142
|
+
this.LightSensor.CurrentAmbientLightLevel = brightness === 'bright' ? set_maxLux : set_minLux;
|
|
143
|
+
}
|
|
163
144
|
this.updateHomeKitCharacteristics();
|
|
164
145
|
}
|
|
165
146
|
catch (e) {
|
|
@@ -169,130 +150,124 @@ export class Contact {
|
|
|
169
150
|
};
|
|
170
151
|
}
|
|
171
152
|
}
|
|
172
|
-
|
|
173
|
-
* Parse the device status from the SwitchBot api
|
|
174
|
-
*/
|
|
175
|
-
async parseStatus() {
|
|
176
|
-
if (!this.device.enableCloudService && this.OpenAPI) {
|
|
177
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} parseStatus enableCloudService: ${this.device.enableCloudService}`);
|
|
178
|
-
}
|
|
179
|
-
else if (this.BLE) {
|
|
180
|
-
await this.BLEparseStatus();
|
|
181
|
-
}
|
|
182
|
-
else if (this.OpenAPI && this.platform.config.credentials?.token) {
|
|
183
|
-
await this.openAPIparseStatus();
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
await this.offlineOff();
|
|
187
|
-
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
async BLEparseStatus() {
|
|
153
|
+
async BLEparseStatus(serviceData) {
|
|
191
154
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
|
|
192
155
|
// Door State
|
|
193
|
-
switch (
|
|
156
|
+
switch (serviceData.doorState) {
|
|
194
157
|
case 'open':
|
|
195
158
|
case 1:
|
|
196
|
-
this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
|
|
159
|
+
this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
|
|
197
160
|
break;
|
|
198
161
|
case 'close':
|
|
199
162
|
case 0:
|
|
200
|
-
this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
163
|
+
this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
201
164
|
break;
|
|
202
165
|
default:
|
|
203
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} timeout no closed, doorstate: ${
|
|
166
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} timeout no closed, doorstate: ${serviceData.doorState}`);
|
|
204
167
|
}
|
|
205
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
|
|
206
|
-
if (this.ContactSensorState !== this.accessory.context.ContactSensorState &&
|
|
168
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
169
|
+
if (this.ContactSensor.ContactSensorState !== this.accessory.context.ContactSensorState &&
|
|
207
170
|
this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED) {
|
|
208
171
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Opened`);
|
|
209
172
|
}
|
|
210
173
|
// Movement
|
|
211
174
|
if (!this.device.contact?.hide_motionsensor) {
|
|
212
|
-
this.MotionDetected = Boolean(
|
|
213
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionDetected}`);
|
|
214
|
-
if (this.MotionDetected !== this.accessory.context.MotionDetected && this.MotionDetected) {
|
|
175
|
+
this.MotionSensor.MotionDetected = Boolean(serviceData.movement);
|
|
176
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionSensor.MotionDetected}`);
|
|
177
|
+
if (this.MotionSensor.MotionDetected !== this.accessory.context.MotionDetected && this.MotionSensor.MotionDetected) {
|
|
215
178
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Detected Motion`);
|
|
216
179
|
}
|
|
217
180
|
}
|
|
218
181
|
// Light Level
|
|
219
182
|
if (!this.device.contact?.hide_lightsensor) {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
switch (
|
|
183
|
+
const set_minLux = await this.minLux();
|
|
184
|
+
const set_maxLux = await this.maxLux();
|
|
185
|
+
switch (serviceData.lightLevel) {
|
|
223
186
|
case true:
|
|
224
|
-
this.CurrentAmbientLightLevel =
|
|
187
|
+
this.LightSensor.CurrentAmbientLightLevel = set_minLux;
|
|
225
188
|
break;
|
|
226
189
|
default:
|
|
227
|
-
this.CurrentAmbientLightLevel =
|
|
190
|
+
this.LightSensor.CurrentAmbientLightLevel = set_maxLux;
|
|
228
191
|
}
|
|
229
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${
|
|
230
|
-
` CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
|
|
231
|
-
if (this.CurrentAmbientLightLevel !== this.accessory.context.CurrentAmbientLightLevel) {
|
|
232
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
192
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} LightLevel: ${serviceData.lightLevel},` +
|
|
193
|
+
` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
194
|
+
if (this.LightSensor.CurrentAmbientLightLevel !== this.accessory.context.CurrentAmbientLightLevel) {
|
|
195
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
196
|
+
+ ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
233
197
|
}
|
|
234
198
|
}
|
|
235
199
|
// Battery
|
|
236
|
-
if (
|
|
237
|
-
|
|
200
|
+
if (serviceData.battery === undefined) {
|
|
201
|
+
serviceData.battery === 100;
|
|
238
202
|
}
|
|
239
|
-
this.BatteryLevel = Number(
|
|
240
|
-
if (this.BatteryLevel < 10) {
|
|
241
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
203
|
+
this.Battery.BatteryLevel = Number(serviceData.battery);
|
|
204
|
+
if (this.Battery.BatteryLevel < 10) {
|
|
205
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
242
206
|
}
|
|
243
207
|
else {
|
|
244
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
208
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
245
209
|
}
|
|
246
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}, `
|
|
210
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}, `
|
|
211
|
+
+ `StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
247
212
|
}
|
|
248
|
-
async openAPIparseStatus() {
|
|
213
|
+
async openAPIparseStatus(deviceStatus) {
|
|
249
214
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
|
|
250
215
|
// Contact State
|
|
251
|
-
if (
|
|
252
|
-
this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
|
|
253
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
|
|
216
|
+
if (deviceStatus.body.openState === 'open') {
|
|
217
|
+
this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED;
|
|
218
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
254
219
|
}
|
|
255
|
-
else if (
|
|
256
|
-
this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
257
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
|
|
220
|
+
else if (deviceStatus.body.openState === 'close') {
|
|
221
|
+
this.ContactSensor.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
222
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
258
223
|
}
|
|
259
224
|
else {
|
|
260
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openState: ${
|
|
225
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openState: ${deviceStatus.body.openState}`);
|
|
261
226
|
}
|
|
262
227
|
// Motion State
|
|
263
228
|
if (!this.device.contact?.hide_motionsensor) {
|
|
264
|
-
this.MotionDetected =
|
|
265
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionDetected}`);
|
|
229
|
+
this.MotionSensor.MotionDetected = deviceStatus.body.moveDetected;
|
|
230
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionSensor.MotionDetected}`);
|
|
266
231
|
}
|
|
267
232
|
// Light Level
|
|
268
233
|
if (!this.device.contact?.hide_lightsensor) {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
switch (
|
|
234
|
+
const set_minLux = await this.minLux();
|
|
235
|
+
const set_maxLux = await this.maxLux();
|
|
236
|
+
switch (deviceStatus.body.brightness) {
|
|
272
237
|
case 'dim':
|
|
273
|
-
this.CurrentAmbientLightLevel =
|
|
238
|
+
this.LightSensor.CurrentAmbientLightLevel = set_minLux;
|
|
274
239
|
break;
|
|
275
240
|
case 'bright':
|
|
276
241
|
default:
|
|
277
|
-
this.CurrentAmbientLightLevel =
|
|
242
|
+
this.LightSensor.CurrentAmbientLightLevel = set_maxLux;
|
|
278
243
|
}
|
|
279
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
244
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
245
|
+
+ ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
280
246
|
}
|
|
281
247
|
// Battery
|
|
282
|
-
if (
|
|
283
|
-
|
|
248
|
+
if (deviceStatus.body.battery === undefined) {
|
|
249
|
+
deviceStatus.body.battery === 100;
|
|
284
250
|
}
|
|
285
|
-
this.BatteryLevel = Number(
|
|
286
|
-
if (this.BatteryLevel < 10) {
|
|
287
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
251
|
+
this.Battery.BatteryLevel = Number(deviceStatus.body.battery);
|
|
252
|
+
if (this.Battery.BatteryLevel < 10) {
|
|
253
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
288
254
|
}
|
|
289
255
|
else {
|
|
290
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
256
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
257
|
+
}
|
|
258
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}, `
|
|
259
|
+
+ `StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
260
|
+
// Firmware Version
|
|
261
|
+
const version = deviceStatus.body.version?.toString();
|
|
262
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
|
|
263
|
+
if (deviceStatus.body.version) {
|
|
264
|
+
this.accessory.context.version = version?.replace(/^V|-.*$/g, '');
|
|
265
|
+
this.accessory
|
|
266
|
+
.getService(this.hap.Service.AccessoryInformation)
|
|
267
|
+
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
|
|
268
|
+
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
269
|
+
.updateValue(this.accessory.context.version);
|
|
291
270
|
}
|
|
292
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}, ` + `StatusLowBattery: ${this.StatusLowBattery}`);
|
|
293
|
-
// FirmwareRevision
|
|
294
|
-
this.FirmwareRevision = this.OpenAPI_FirmwareRevision;
|
|
295
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
296
271
|
}
|
|
297
272
|
/**
|
|
298
273
|
* Asks the SwitchBot API for the latest device information
|
|
@@ -317,120 +292,59 @@ export class Contact {
|
|
|
317
292
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLERefreshStatus`);
|
|
318
293
|
const switchbot = await this.platform.connectBLE();
|
|
319
294
|
// Convert to BLE Address
|
|
320
|
-
this.device.bleMac =
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
.join(':')
|
|
325
|
-
.toLowerCase();
|
|
295
|
+
this.device.bleMac = this.device
|
|
296
|
+
.deviceId.match(/.{1,2}/g)
|
|
297
|
+
.join(':')
|
|
298
|
+
.toLowerCase();
|
|
326
299
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLE Address: ${this.device.bleMac}`);
|
|
327
300
|
this.getCustomBLEAddress(switchbot);
|
|
328
301
|
// Start to monitor advertisement packets
|
|
329
302
|
(async () => {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
id: this.device.bleMac,
|
|
333
|
-
});
|
|
303
|
+
// Start to monitor advertisement packets
|
|
304
|
+
await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
|
|
334
305
|
// Set an event handler
|
|
335
306
|
switchbot.onadvertisement = (ad) => {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
307
|
+
if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
|
|
308
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
|
|
309
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
|
|
339
310
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
340
|
-
this.BLE_MotionDetected = ad.serviceData.movement;
|
|
341
|
-
this.BLE_BatteryLevel = ad.serviceData.battery;
|
|
342
|
-
this.BLE_CurrentAmbientLightLevel = ad.serviceData.lightLevel;
|
|
343
311
|
}
|
|
344
312
|
else {
|
|
345
313
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
346
314
|
}
|
|
347
315
|
};
|
|
348
|
-
// Wait
|
|
316
|
+
// Wait 10 seconds
|
|
349
317
|
await switchbot.wait(this.scanDuration * 1000);
|
|
350
318
|
// Stop to monitor
|
|
351
319
|
await switchbot.stopScan();
|
|
352
320
|
// Update HomeKit
|
|
353
|
-
await this.BLEparseStatus();
|
|
321
|
+
await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
|
|
354
322
|
await this.updateHomeKitCharacteristics();
|
|
355
323
|
})();
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
model: 'd',
|
|
360
|
-
id: this.device.bleMac,
|
|
361
|
-
})
|
|
362
|
-
.then(async () => {
|
|
363
|
-
// Set an event handler
|
|
364
|
-
this.scanning = true;
|
|
365
|
-
switchbot.onadvertisement = async (ad: ad) => {
|
|
366
|
-
this.debugLog(
|
|
367
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
|
|
368
|
-
` BLE Address Found: ${ad.address}`,
|
|
369
|
-
);
|
|
370
|
-
this.BLE_MotionDetected = ad.serviceData.movement;
|
|
371
|
-
this.BLE_BatteryLevel = ad.serviceData.battery;
|
|
372
|
-
this.BLE_ContactSensorState = ad.serviceData.doorState;
|
|
373
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
374
|
-
this.debugLog(
|
|
375
|
-
`${this.device.deviceType}: ${this.accessory.displayName} movement: ${ad.serviceData.movement}, doorState: ` +
|
|
376
|
-
`${ad.serviceData.doorState}, battery: ${ad.serviceData.battery}`,
|
|
377
|
-
);
|
|
378
|
-
|
|
379
|
-
if (ad.serviceData) {
|
|
380
|
-
this.BLE_IsConnected = true;
|
|
381
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
382
|
-
await this.stopScanning(switchbot);
|
|
383
|
-
this.scanning = false;
|
|
384
|
-
} else {
|
|
385
|
-
this.BLE_IsConnected = false;
|
|
386
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
387
|
-
}
|
|
388
|
-
};
|
|
389
|
-
// Wait
|
|
390
|
-
return await sleep(this.scanDuration * 1000);
|
|
391
|
-
})
|
|
392
|
-
.then(async () => {
|
|
393
|
-
// Stop to monitor
|
|
394
|
-
if (this.scanning) {
|
|
395
|
-
await this.stopScanning(switchbot);
|
|
396
|
-
}
|
|
397
|
-
})
|
|
398
|
-
.catch(async (e: any) => {
|
|
399
|
-
this.apiError(e);
|
|
400
|
-
this.errorLog(
|
|
401
|
-
`${this.device.deviceType}: ${this.accessory.displayName} failed BLERefreshStatus with ${this.device.connectionType}` +
|
|
402
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
403
|
-
);
|
|
404
|
-
await this.BLERefreshConnection(switchbot);
|
|
405
|
-
});
|
|
406
|
-
} else {
|
|
407
|
-
await this.BLERefreshConnection(switchbot);
|
|
408
|
-
}*/
|
|
324
|
+
if (switchbot === undefined) {
|
|
325
|
+
await this.BLERefreshConnection(switchbot);
|
|
326
|
+
}
|
|
409
327
|
}
|
|
410
328
|
async openAPIRefreshStatus() {
|
|
411
329
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
|
|
412
330
|
try {
|
|
413
|
-
const { body, statusCode } = await
|
|
414
|
-
headers: this.platform.generateHeaders(),
|
|
415
|
-
});
|
|
331
|
+
const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
|
|
416
332
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
|
|
417
333
|
const deviceStatus = await body.json();
|
|
418
334
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
419
335
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
420
336
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
421
|
-
this.
|
|
337
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
422
338
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
423
|
-
this.
|
|
424
|
-
this.OpenAPI_MotionDetected = deviceStatus.body.moveDetected;
|
|
425
|
-
this.OpenAPI_CurrentAmbientLightLevel = deviceStatus.body.brightness;
|
|
426
|
-
this.OpenAPI_BatteryLevel = deviceStatus.body.battery;
|
|
427
|
-
this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
|
|
428
|
-
this.openAPIparseStatus();
|
|
339
|
+
this.openAPIparseStatus(deviceStatus);
|
|
429
340
|
this.updateHomeKitCharacteristics();
|
|
430
341
|
}
|
|
431
342
|
else {
|
|
432
343
|
this.statusCode(statusCode);
|
|
433
344
|
this.statusCode(deviceStatus.statusCode);
|
|
345
|
+
if (deviceStatus.statusCode === 161 || deviceStatus.statusCode === 171) {
|
|
346
|
+
this.offlineOff();
|
|
347
|
+
}
|
|
434
348
|
}
|
|
435
349
|
}
|
|
436
350
|
catch (e) {
|
|
@@ -443,77 +357,54 @@ export class Contact {
|
|
|
443
357
|
* Updates the status for each of the HomeKit Characteristics
|
|
444
358
|
*/
|
|
445
359
|
async updateHomeKitCharacteristics() {
|
|
446
|
-
if (this.ContactSensorState === undefined) {
|
|
447
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensorState}`);
|
|
360
|
+
if (this.ContactSensor.ContactSensorState === undefined) {
|
|
361
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
448
362
|
}
|
|
449
363
|
else {
|
|
450
|
-
this.accessory.context.ContactSensorState = this.ContactSensorState;
|
|
451
|
-
this.
|
|
452
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
364
|
+
this.accessory.context.ContactSensorState = this.ContactSensor.ContactSensorState;
|
|
365
|
+
this.ContactSensor.Service.updateCharacteristic(this.hap.Characteristic.ContactSensorState, this.ContactSensor.ContactSensorState);
|
|
366
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
367
|
+
+ ` ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
453
368
|
}
|
|
454
369
|
if (!this.device.contact?.hide_motionsensor) {
|
|
455
|
-
if (this.MotionDetected === undefined) {
|
|
456
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionDetected}`);
|
|
370
|
+
if (this.MotionSensor.MotionDetected === undefined) {
|
|
371
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MotionDetected: ${this.MotionSensor.MotionDetected}`);
|
|
457
372
|
}
|
|
458
373
|
else {
|
|
459
|
-
this.accessory.context.MotionDetected = this.MotionDetected;
|
|
460
|
-
this.
|
|
461
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
374
|
+
this.accessory.context.MotionDetected = this.MotionSensor.MotionDetected;
|
|
375
|
+
this.MotionSensor.Service.updateCharacteristic(this.hap.Characteristic.MotionDetected, this.MotionSensor.MotionDetected);
|
|
376
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
377
|
+
+ ` MotionDetected: ${this.MotionSensor.MotionDetected}`);
|
|
462
378
|
}
|
|
463
379
|
}
|
|
464
380
|
if (!this.device.contact?.hide_lightsensor) {
|
|
465
|
-
if (this.CurrentAmbientLightLevel === undefined) {
|
|
466
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
381
|
+
if (this.LightSensor?.CurrentAmbientLightLevel === undefined) {
|
|
382
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
383
|
+
+ ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
467
384
|
}
|
|
468
385
|
else {
|
|
469
|
-
this.accessory.context.CurrentAmbientLightLevel = this.CurrentAmbientLightLevel;
|
|
470
|
-
this.
|
|
386
|
+
this.accessory.context.CurrentAmbientLightLevel = this.LightSensor.CurrentAmbientLightLevel;
|
|
387
|
+
this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, this.LightSensor.CurrentAmbientLightLevel);
|
|
471
388
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}` +
|
|
472
|
-
` updateCharacteristic CurrentAmbientLightLevel: ${this.CurrentAmbientLightLevel}`);
|
|
389
|
+
` updateCharacteristic CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
473
390
|
}
|
|
474
391
|
}
|
|
475
|
-
if (this.BatteryLevel === undefined) {
|
|
476
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}`);
|
|
392
|
+
if (this.Battery.BatteryLevel === undefined) {
|
|
393
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
477
394
|
}
|
|
478
395
|
else {
|
|
479
|
-
this.accessory.context.BatteryLevel = this.BatteryLevel;
|
|
480
|
-
this.
|
|
481
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.BatteryLevel}`);
|
|
396
|
+
this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
|
|
397
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
|
|
398
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
482
399
|
}
|
|
483
|
-
if (this.StatusLowBattery === undefined) {
|
|
484
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.StatusLowBattery}`);
|
|
400
|
+
if (this.Battery.StatusLowBattery === undefined) {
|
|
401
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
485
402
|
}
|
|
486
403
|
else {
|
|
487
|
-
this.accessory.context.StatusLowBattery = this.StatusLowBattery;
|
|
488
|
-
this.
|
|
489
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
490
|
-
|
|
491
|
-
}
|
|
492
|
-
async stopScanning(switchbot) {
|
|
493
|
-
switchbot.stopScan();
|
|
494
|
-
if (this.BLE_IsConnected) {
|
|
495
|
-
await this.BLEparseStatus();
|
|
496
|
-
await this.updateHomeKitCharacteristics();
|
|
497
|
-
}
|
|
498
|
-
else {
|
|
499
|
-
await this.BLERefreshConnection(switchbot);
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
async getCustomBLEAddress(switchbot) {
|
|
503
|
-
if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
|
|
504
|
-
(async () => {
|
|
505
|
-
// Start to monitor advertisement packets
|
|
506
|
-
await switchbot.startScan({
|
|
507
|
-
model: 'd',
|
|
508
|
-
});
|
|
509
|
-
// Set an event handler
|
|
510
|
-
switchbot.onadvertisement = (ad) => {
|
|
511
|
-
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} ad: ${JSON.stringify(ad, null, ' ')}`);
|
|
512
|
-
};
|
|
513
|
-
await sleep(10000);
|
|
514
|
-
// Stop to monitor
|
|
515
|
-
switchbot.stopScan();
|
|
516
|
-
})();
|
|
404
|
+
this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
|
|
405
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
|
|
406
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
407
|
+
+ ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
517
408
|
}
|
|
518
409
|
}
|
|
519
410
|
async BLERefreshConnection(switchbot) {
|
|
@@ -524,243 +415,50 @@ export class Contact {
|
|
|
524
415
|
await this.openAPIRefreshStatus();
|
|
525
416
|
}
|
|
526
417
|
}
|
|
527
|
-
minLux() {
|
|
418
|
+
async minLux() {
|
|
419
|
+
let set_minLux;
|
|
528
420
|
if (this.device.contact?.set_minLux) {
|
|
529
|
-
|
|
421
|
+
set_minLux = this.device.contact.set_minLux;
|
|
530
422
|
}
|
|
531
423
|
else {
|
|
532
|
-
|
|
424
|
+
set_minLux = 1;
|
|
533
425
|
}
|
|
534
|
-
return
|
|
426
|
+
return set_minLux;
|
|
535
427
|
}
|
|
536
|
-
maxLux() {
|
|
428
|
+
async maxLux() {
|
|
429
|
+
let set_maxLux;
|
|
537
430
|
if (this.device.contact?.set_maxLux) {
|
|
538
|
-
|
|
431
|
+
set_maxLux = this.device.contact.set_maxLux;
|
|
539
432
|
}
|
|
540
433
|
else {
|
|
541
|
-
|
|
542
|
-
}
|
|
543
|
-
return this.set_maxLux;
|
|
544
|
-
}
|
|
545
|
-
async scan(device) {
|
|
546
|
-
if (device.scanDuration) {
|
|
547
|
-
this.scanDuration = this.accessory.context.scanDuration = device.scanDuration;
|
|
548
|
-
if (this.BLE) {
|
|
549
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config scanDuration: ${this.scanDuration}`);
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
else {
|
|
553
|
-
this.scanDuration = this.accessory.context.scanDuration = 1;
|
|
554
|
-
if (this.BLE) {
|
|
555
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default scanDuration: ${this.scanDuration}`);
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
async statusCode(statusCode) {
|
|
560
|
-
switch (statusCode) {
|
|
561
|
-
case 151:
|
|
562
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
|
|
563
|
-
break;
|
|
564
|
-
case 152:
|
|
565
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
|
|
566
|
-
break;
|
|
567
|
-
case 160:
|
|
568
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
|
|
569
|
-
break;
|
|
570
|
-
case 161:
|
|
571
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
|
|
572
|
-
this.offlineOff();
|
|
573
|
-
break;
|
|
574
|
-
case 171:
|
|
575
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
|
|
576
|
-
`Hub: ${this.device.hubDeviceId}`);
|
|
577
|
-
this.offlineOff();
|
|
578
|
-
break;
|
|
579
|
-
case 190:
|
|
580
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
|
|
581
|
-
` Or command format is invalid, statusCode: ${statusCode}`);
|
|
582
|
-
break;
|
|
583
|
-
case 100:
|
|
584
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
|
|
585
|
-
break;
|
|
586
|
-
case 200:
|
|
587
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
|
|
588
|
-
break;
|
|
589
|
-
case 400:
|
|
590
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
|
|
591
|
-
+ `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
|
|
592
|
-
break;
|
|
593
|
-
case 401:
|
|
594
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
|
|
595
|
-
+ `but the request has not been authenticated, statusCode: ${statusCode}`);
|
|
596
|
-
break;
|
|
597
|
-
case 403:
|
|
598
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
|
|
599
|
-
+ `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
|
|
600
|
-
break;
|
|
601
|
-
case 404:
|
|
602
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
|
|
603
|
-
+ `statusCode: ${statusCode}`);
|
|
604
|
-
break;
|
|
605
|
-
case 406:
|
|
606
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
|
|
607
|
-
+ `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
|
|
608
|
-
break;
|
|
609
|
-
case 415:
|
|
610
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
|
|
611
|
-
+ `header that is not supported by the server, statusCode: ${statusCode}`);
|
|
612
|
-
break;
|
|
613
|
-
case 422:
|
|
614
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
|
|
615
|
-
+ `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
|
|
616
|
-
break;
|
|
617
|
-
case 429:
|
|
618
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
|
|
619
|
-
+ `requests allowed for a given time window, statusCode: ${statusCode}`);
|
|
620
|
-
break;
|
|
621
|
-
case 500:
|
|
622
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
|
|
623
|
-
+ `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
|
|
624
|
-
break;
|
|
625
|
-
default:
|
|
626
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
|
|
627
|
-
`${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`);
|
|
434
|
+
set_maxLux = 6001;
|
|
628
435
|
}
|
|
436
|
+
return set_maxLux;
|
|
629
437
|
}
|
|
630
438
|
async offlineOff() {
|
|
631
439
|
if (this.device.offline) {
|
|
632
|
-
|
|
633
|
-
|
|
440
|
+
this.ContactSensor.Service.updateCharacteristic(this.hap.Characteristic.ContactSensorState, this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED);
|
|
441
|
+
if (!this.device.contact?.hide_motionsensor) {
|
|
442
|
+
this.MotionSensor.Service.updateCharacteristic(this.hap.Characteristic.MotionDetected, false);
|
|
443
|
+
}
|
|
444
|
+
if (!this.device.contact?.hide_lightsensor) {
|
|
445
|
+
this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, 100);
|
|
446
|
+
}
|
|
634
447
|
}
|
|
635
448
|
}
|
|
636
449
|
async apiError(e) {
|
|
637
|
-
this.
|
|
450
|
+
this.ContactSensor.Service.updateCharacteristic(this.hap.Characteristic.ContactSensorState, e);
|
|
451
|
+
this.ContactSensor.Service.updateCharacteristic(this.hap.Characteristic.StatusActive, e);
|
|
638
452
|
if (!this.device.contact?.hide_motionsensor) {
|
|
639
|
-
this.
|
|
453
|
+
this.MotionSensor.Service.updateCharacteristic(this.hap.Characteristic.MotionDetected, e);
|
|
454
|
+
this.MotionSensor.Service.updateCharacteristic(this.hap.Characteristic.StatusActive, e);
|
|
640
455
|
}
|
|
641
456
|
if (!this.device.contact?.hide_lightsensor) {
|
|
642
|
-
this.
|
|
643
|
-
|
|
644
|
-
this.batteryService?.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
|
|
645
|
-
this.batteryService?.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
|
|
646
|
-
}
|
|
647
|
-
async deviceContext() {
|
|
648
|
-
if (this.MotionDetected === undefined) {
|
|
649
|
-
this.MotionDetected = false;
|
|
650
|
-
}
|
|
651
|
-
else {
|
|
652
|
-
this.MotionDetected = this.accessory.context.MotionDetected;
|
|
653
|
-
}
|
|
654
|
-
if (this.ContactSensorState === undefined) {
|
|
655
|
-
this.ContactSensorState = this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
656
|
-
}
|
|
657
|
-
else {
|
|
658
|
-
this.ContactSensorState = this.accessory.context.ContactSensorState;
|
|
659
|
-
}
|
|
660
|
-
if (this.FirmwareRevision === undefined) {
|
|
661
|
-
this.FirmwareRevision = this.platform.version;
|
|
662
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
async refreshRate(device) {
|
|
666
|
-
if (device.refreshRate) {
|
|
667
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate;
|
|
668
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
|
|
669
|
-
}
|
|
670
|
-
else if (this.platform.config.options.refreshRate) {
|
|
671
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = this.platform.config.options.refreshRate;
|
|
672
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
async deviceConfig(device) {
|
|
676
|
-
let config = {};
|
|
677
|
-
if (device.contact) {
|
|
678
|
-
config = device.contact;
|
|
679
|
-
}
|
|
680
|
-
if (device.connectionType !== undefined) {
|
|
681
|
-
config['connectionType'] = device.connectionType;
|
|
682
|
-
}
|
|
683
|
-
if (device.external !== undefined) {
|
|
684
|
-
config['external'] = device.external;
|
|
685
|
-
}
|
|
686
|
-
if (device.logging !== undefined) {
|
|
687
|
-
config['logging'] = device.logging;
|
|
688
|
-
}
|
|
689
|
-
if (device.refreshRate !== undefined) {
|
|
690
|
-
config['refreshRate'] = device.refreshRate;
|
|
457
|
+
this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentAmbientLightLevel, e);
|
|
458
|
+
this.LightSensor.Service.updateCharacteristic(this.hap.Characteristic.StatusActive, e);
|
|
691
459
|
}
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
}
|
|
695
|
-
if (device.webhook !== undefined) {
|
|
696
|
-
config['webhook'] = device.webhook;
|
|
697
|
-
}
|
|
698
|
-
if (Object.entries(config).length !== 0) {
|
|
699
|
-
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
async deviceLogs(device) {
|
|
703
|
-
if (this.platform.debugMode) {
|
|
704
|
-
this.deviceLogging = this.accessory.context.logging = 'debugMode';
|
|
705
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
|
|
706
|
-
}
|
|
707
|
-
else if (device.logging) {
|
|
708
|
-
this.deviceLogging = this.accessory.context.logging = device.logging;
|
|
709
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
|
|
710
|
-
}
|
|
711
|
-
else if (this.platform.config.options?.logging) {
|
|
712
|
-
this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
|
|
713
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
|
|
714
|
-
}
|
|
715
|
-
else {
|
|
716
|
-
this.deviceLogging = this.accessory.context.logging = 'standard';
|
|
717
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
/**
|
|
721
|
-
* Logging for Device
|
|
722
|
-
*/
|
|
723
|
-
infoLog(...log) {
|
|
724
|
-
if (this.enablingDeviceLogging()) {
|
|
725
|
-
this.platform.log.info(String(...log));
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
warnLog(...log) {
|
|
729
|
-
if (this.enablingDeviceLogging()) {
|
|
730
|
-
this.platform.log.warn(String(...log));
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
debugWarnLog(...log) {
|
|
734
|
-
if (this.enablingDeviceLogging()) {
|
|
735
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
736
|
-
this.platform.log.warn('[DEBUG]', String(...log));
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
errorLog(...log) {
|
|
741
|
-
if (this.enablingDeviceLogging()) {
|
|
742
|
-
this.platform.log.error(String(...log));
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
debugErrorLog(...log) {
|
|
746
|
-
if (this.enablingDeviceLogging()) {
|
|
747
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
748
|
-
this.platform.log.error('[DEBUG]', String(...log));
|
|
749
|
-
}
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
debugLog(...log) {
|
|
753
|
-
if (this.enablingDeviceLogging()) {
|
|
754
|
-
if (this.deviceLogging === 'debug') {
|
|
755
|
-
this.platform.log.info('[DEBUG]', String(...log));
|
|
756
|
-
}
|
|
757
|
-
else {
|
|
758
|
-
this.platform.log.debug(String(...log));
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
|
-
enablingDeviceLogging() {
|
|
763
|
-
return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
|
|
460
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
|
|
461
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
|
|
764
462
|
}
|
|
765
463
|
}
|
|
766
464
|
//# sourceMappingURL=contact.js.map
|