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