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