@switchbot/homebridge-switchbot 3.5.0-beta.3 → 3.5.0-beta.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -1
- package/config.schema.json +147 -9
- package/dist/device/blindtilt.d.ts +21 -94
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +347 -756
- package/dist/device/blindtilt.js.map +1 -1
- package/dist/device/bot.d.ts +25 -71
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +582 -759
- package/dist/device/bot.js.map +1 -1
- package/dist/device/ceilinglight.d.ts +13 -67
- package/dist/device/ceilinglight.d.ts.map +1 -1
- package/dist/device/ceilinglight.js +209 -587
- package/dist/device/ceilinglight.js.map +1 -1
- package/dist/device/colorbulb.d.ts +13 -74
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +250 -632
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.d.ts +14 -65
- package/dist/device/contact.d.ts.map +1 -1
- package/dist/device/contact.js +204 -531
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts +17 -86
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +335 -786
- 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 +654 -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 +499 -0
- package/dist/device/fan.js.map +1 -0
- package/dist/device/hub.d.ts +15 -59
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +242 -596
- package/dist/device/hub.js.map +1 -1
- package/dist/device/humidifier.d.ts +10 -65
- package/dist/device/humidifier.d.ts.map +1 -1
- package/dist/device/humidifier.js +207 -571
- 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 +174 -584
- package/dist/device/iosensor.js.map +1 -1
- package/dist/device/lightstrip.d.ts +10 -68
- package/dist/device/lightstrip.d.ts.map +1 -1
- package/dist/device/lightstrip.js +252 -568
- package/dist/device/lightstrip.js.map +1 -1
- package/dist/device/lock.d.ts +15 -62
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +210 -542
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.d.ts +13 -63
- package/dist/device/meter.d.ts.map +1 -1
- package/dist/device/meter.js +170 -577
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.d.ts +13 -64
- package/dist/device/meterplus.d.ts.map +1 -1
- package/dist/device/meterplus.js +159 -577
- 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 +136 -518
- 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 +82 -452
- package/dist/device/plug.js.map +1 -1
- package/dist/device/robotvacuumcleaner.d.ts +11 -62
- package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
- package/dist/device/robotvacuumcleaner.js +140 -451
- package/dist/device/robotvacuumcleaner.js.map +1 -1
- package/dist/device/waterdetector.d.ts +9 -70
- package/dist/device/waterdetector.d.ts.map +1 -1
- package/dist/device/waterdetector.js +121 -664
- package/dist/device/waterdetector.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/irdevice/airconditioner.d.ts +8 -48
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js +309 -419
- package/dist/irdevice/airconditioner.js.map +1 -1
- package/dist/irdevice/airpurifier.d.ts +7 -38
- package/dist/irdevice/airpurifier.d.ts.map +1 -1
- package/dist/irdevice/airpurifier.js +72 -304
- package/dist/irdevice/airpurifier.js.map +1 -1
- package/dist/irdevice/camera.d.ts +6 -35
- package/dist/irdevice/camera.d.ts.map +1 -1
- package/dist/irdevice/camera.js +34 -278
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts +6 -39
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +67 -311
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +40 -0
- package/dist/irdevice/irdevice.d.ts.map +1 -0
- package/dist/irdevice/irdevice.js +509 -0
- package/dist/irdevice/irdevice.js.map +1 -0
- package/dist/irdevice/light.d.ts +6 -34
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +23 -272
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.d.ts +18 -47
- package/dist/irdevice/other.d.ts.map +1 -1
- package/dist/irdevice/other.js +352 -546
- package/dist/irdevice/other.js.map +1 -1
- package/dist/irdevice/tv.d.ts +7 -39
- package/dist/irdevice/tv.d.ts.map +1 -1
- package/dist/irdevice/tv.js +82 -321
- package/dist/irdevice/tv.js.map +1 -1
- package/dist/irdevice/vacuumcleaner.d.ts +6 -35
- package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
- package/dist/irdevice/vacuumcleaner.js +41 -284
- package/dist/irdevice/vacuumcleaner.js.map +1 -1
- package/dist/irdevice/waterheater.d.ts +6 -35
- package/dist/irdevice/waterheater.d.ts.map +1 -1
- package/dist/irdevice/waterheater.js +42 -287
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/platform.d.ts +14 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +237 -94
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +40 -10
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +0 -552
- package/dist/settings.js.map +1 -1
- package/dist/utils.d.ts +77 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +638 -1
- package/dist/utils.js.map +1 -1
- package/package.json +16 -15
- package/src/custom.d.ts +2 -1
- package/src/device/blindtilt.ts +373 -782
- package/src/device/bot.ts +616 -844
- package/src/device/ceilinglight.ts +222 -607
- package/src/device/colorbulb.ts +264 -656
- package/src/device/contact.ts +229 -553
- package/src/device/curtain.ts +355 -810
- package/src/device/device.ts +681 -0
- package/src/device/fan.ts +548 -0
- package/src/device/hub.ts +268 -623
- package/src/device/humidifier.ts +237 -618
- package/src/device/iosensor.ts +200 -610
- package/src/device/lightstrip.ts +273 -596
- package/src/device/lock.ts +247 -582
- package/src/device/meter.ts +196 -601
- package/src/device/meterplus.ts +184 -602
- package/src/device/motion.ts +156 -541
- package/src/device/plug.ts +92 -480
- package/src/device/robotvacuumcleaner.ts +161 -477
- package/src/device/waterdetector.ts +139 -689
- package/src/index.ts +1 -1
- package/src/irdevice/airconditioner.ts +330 -446
- package/src/irdevice/airpurifier.ts +89 -321
- package/src/irdevice/camera.ts +42 -293
- package/src/irdevice/fan.ts +78 -327
- package/src/irdevice/irdevice.ts +526 -0
- package/src/irdevice/light.ts +32 -287
- package/src/irdevice/other.ts +396 -615
- package/src/irdevice/tv.ts +100 -339
- package/src/irdevice/vacuumcleaner.ts +49 -305
- package/src/irdevice/waterheater.ts +50 -310
- package/src/platform.ts +247 -102
- package/src/settings.ts +56 -565
- package/src/utils.ts +642 -1
package/src/device/humidifier.ts
CHANGED
|
@@ -1,119 +1,89 @@
|
|
|
1
1
|
import { request } from 'undici';
|
|
2
|
-
import {
|
|
2
|
+
import { deviceBase } from './device.js';
|
|
3
3
|
import { interval, Subject } from 'rxjs';
|
|
4
4
|
import { SwitchBotPlatform } from '../platform.js';
|
|
5
5
|
import { debounceTime, skipWhile, take, tap } from 'rxjs/operators';
|
|
6
|
-
import { Service, PlatformAccessory, CharacteristicValue
|
|
7
|
-
import { device, devicesConfig, serviceData, deviceStatus, Devices
|
|
6
|
+
import { Service, PlatformAccessory, CharacteristicValue } from 'homebridge';
|
|
7
|
+
import { device, devicesConfig, serviceData, deviceStatus, Devices } from '../settings.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Platform Accessory
|
|
11
11
|
* An instance of this class is created for each accessory your platform registers
|
|
12
12
|
* Each accessory may expose multiple services of different service types.
|
|
13
13
|
*/
|
|
14
|
-
export class Humidifier {
|
|
15
|
-
public readonly api: API;
|
|
16
|
-
public readonly log: Logging;
|
|
17
|
-
public readonly config!: SwitchBotPlatformConfig;
|
|
18
|
-
protected readonly hap: HAP;
|
|
14
|
+
export class Humidifier extends deviceBase {
|
|
19
15
|
// Services
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
OpenAPI_Active: deviceStatus['power'];
|
|
35
|
-
OpenAPI_WaterLevel: deviceStatus['lackWater'];
|
|
36
|
-
OpenAPI_FirmwareRevision: deviceStatus['version'];
|
|
37
|
-
OpenAPI_CurrentTemperature: deviceStatus['temperature'];
|
|
38
|
-
OpenAPI_CurrentRelativeHumidity: deviceStatus['humidity'];
|
|
39
|
-
OpenAPI_CurrentHumidifierDehumidifierState: deviceStatus['auto'];
|
|
40
|
-
OpenAPI_RelativeHumidityHumidifierThreshold: deviceStatus['nebulizationEfficiency'];
|
|
41
|
-
|
|
42
|
-
// BLE Others
|
|
43
|
-
connected?: boolean;
|
|
44
|
-
onState!: serviceData['onState'];
|
|
45
|
-
autoMode!: serviceData['autoMode'];
|
|
46
|
-
percentage!: serviceData['percentage'];
|
|
47
|
-
|
|
48
|
-
// Config
|
|
49
|
-
set_minStep?: number;
|
|
50
|
-
scanDuration!: number;
|
|
51
|
-
deviceLogging!: string;
|
|
52
|
-
deviceRefreshRate!: number;
|
|
16
|
+
private HumidifierDehumidifier: {
|
|
17
|
+
Service: Service;
|
|
18
|
+
Active: CharacteristicValue;
|
|
19
|
+
WaterLevel: CharacteristicValue;
|
|
20
|
+
CurrentRelativeHumidity: CharacteristicValue;
|
|
21
|
+
TargetHumidifierDehumidifierState: CharacteristicValue;
|
|
22
|
+
CurrentHumidifierDehumidifierState: CharacteristicValue;
|
|
23
|
+
RelativeHumidityHumidifierThreshold: CharacteristicValue;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
private TemperatureSensor?: {
|
|
27
|
+
Service: Service;
|
|
28
|
+
CurrentTemperature: CharacteristicValue;
|
|
29
|
+
};
|
|
53
30
|
|
|
54
31
|
// Updates
|
|
55
32
|
humidifierUpdateInProgress!: boolean;
|
|
56
33
|
doHumidifierUpdate!: Subject<void>;
|
|
57
34
|
|
|
58
|
-
// Connection
|
|
59
|
-
private readonly OpenAPI: boolean;
|
|
60
|
-
private readonly BLE: boolean;
|
|
61
|
-
|
|
62
35
|
constructor(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
36
|
+
readonly platform: SwitchBotPlatform,
|
|
37
|
+
accessory: PlatformAccessory,
|
|
38
|
+
device: device & devicesConfig,
|
|
66
39
|
) {
|
|
67
|
-
|
|
68
|
-
this.log = this.platform.log;
|
|
69
|
-
this.config = this.platform.config;
|
|
70
|
-
this.hap = this.api.hap;
|
|
71
|
-
// Connection
|
|
72
|
-
this.BLE = this.device.connectionType === 'BLE' || this.device.connectionType === 'BLE/OpenAPI';
|
|
73
|
-
this.OpenAPI = this.device.connectionType === 'OpenAPI' || this.device.connectionType === 'BLE/OpenAPI';
|
|
74
|
-
// default placeholders
|
|
75
|
-
this.deviceLogs(device);
|
|
76
|
-
this.scan(device);
|
|
77
|
-
this.refreshRate(device);
|
|
78
|
-
this.deviceContext();
|
|
79
|
-
this.deviceConfig(device);
|
|
80
|
-
|
|
40
|
+
super(platform, accessory, device);
|
|
81
41
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
82
42
|
this.doHumidifierUpdate = new Subject();
|
|
83
43
|
this.humidifierUpdateInProgress = false;
|
|
84
44
|
|
|
45
|
+
// Initialize the HumidifierDehumidifier Service
|
|
46
|
+
this.HumidifierDehumidifier = {
|
|
47
|
+
Service: accessory.getService(this.hap.Service.HumidifierDehumidifier)!,
|
|
48
|
+
Active: accessory.context.Active || this.hap.Characteristic.Active.ACTIVE,
|
|
49
|
+
WaterLevel: accessory.context.WaterLevel || 100,
|
|
50
|
+
CurrentRelativeHumidity: accessory.context.CurrentRelativeHumidity || 50,
|
|
51
|
+
TargetHumidifierDehumidifierState: accessory.context.TargetHumidifierDehumidifierState
|
|
52
|
+
|| this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER,
|
|
53
|
+
CurrentHumidifierDehumidifierState: accessory.context.CurrentHumidifierDehumidifierState
|
|
54
|
+
|| this.hap.Characteristic.CurrentHumidifierDehumidifierState.INACTIVE,
|
|
55
|
+
RelativeHumidityHumidifierThreshold: accessory.context.RelativeHumidityHumidifierThreshold || 50,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// Initialize the Temperature Sensor Service
|
|
59
|
+
if (!device.humidifier?.hide_temperature) {
|
|
60
|
+
this.TemperatureSensor = {
|
|
61
|
+
Service: accessory.getService(this.hap.Service.TemperatureSensor)!,
|
|
62
|
+
CurrentTemperature: accessory.context.CurrentTemperature || 30,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
85
66
|
// Retrieve initial values and updateHomekit
|
|
86
67
|
this.refreshStatus();
|
|
87
68
|
|
|
88
|
-
// set accessory information
|
|
89
|
-
accessory
|
|
90
|
-
.getService(this.hap.Service.AccessoryInformation)!
|
|
91
|
-
.setCharacteristic(this.hap.Characteristic.Manufacturer, 'SwitchBot')
|
|
92
|
-
.setCharacteristic(this.hap.Characteristic.Model, 'W0801800')
|
|
93
|
-
.setCharacteristic(this.hap.Characteristic.SerialNumber, device.deviceId)
|
|
94
|
-
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, accessory.context.FirmwareRevision);
|
|
95
|
-
|
|
96
69
|
// get the service if it exists, otherwise create a new service
|
|
97
70
|
// you can create multiple services for each accessory
|
|
98
|
-
const
|
|
99
|
-
(this.
|
|
100
|
-
|| accessory.addService(this.hap.Service.HumidifierDehumidifier)),
|
|
71
|
+
const HumidifierDehumidifierService = `${accessory.displayName} Humidifier`;
|
|
72
|
+
(this.HumidifierDehumidifier.Service = accessory.getService(this.hap.Service.HumidifierDehumidifier)
|
|
73
|
+
|| accessory.addService(this.hap.Service.HumidifierDehumidifier)), HumidifierDehumidifierService;
|
|
101
74
|
|
|
102
|
-
this.
|
|
103
|
-
if (!this.humidifierService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
|
|
104
|
-
this.humidifierService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
105
|
-
}
|
|
75
|
+
this.HumidifierDehumidifier.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
106
76
|
|
|
107
77
|
// each service must implement at-minimum the "required characteristics" for the given service type
|
|
108
78
|
// see https://developers.homebridge.io/#/service/HumidifierDehumidifier
|
|
109
79
|
|
|
110
80
|
// create handlers for required characteristics
|
|
111
|
-
this.
|
|
81
|
+
this.HumidifierDehumidifier.Service.setCharacteristic(
|
|
112
82
|
this.hap.Characteristic.CurrentHumidifierDehumidifierState,
|
|
113
|
-
this.CurrentHumidifierDehumidifierState,
|
|
83
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState,
|
|
114
84
|
);
|
|
115
85
|
|
|
116
|
-
this.
|
|
86
|
+
this.HumidifierDehumidifier.Service
|
|
117
87
|
.getCharacteristic(this.hap.Characteristic.TargetHumidifierDehumidifierState)
|
|
118
88
|
.setProps({
|
|
119
89
|
validValueRanges: [0, 1],
|
|
@@ -123,34 +93,31 @@ export class Humidifier {
|
|
|
123
93
|
})
|
|
124
94
|
.onSet(this.TargetHumidifierDehumidifierStateSet.bind(this));
|
|
125
95
|
|
|
126
|
-
this.
|
|
96
|
+
this.HumidifierDehumidifier.Service.getCharacteristic(this.hap.Characteristic.Active).onSet(this.ActiveSet.bind(this));
|
|
127
97
|
|
|
128
|
-
this.
|
|
98
|
+
this.HumidifierDehumidifier.Service
|
|
129
99
|
.getCharacteristic(this.hap.Characteristic.RelativeHumidityHumidifierThreshold)
|
|
130
100
|
.setProps({
|
|
131
101
|
validValueRanges: [0, 100],
|
|
132
102
|
minValue: 0,
|
|
133
103
|
maxValue: 100,
|
|
134
|
-
minStep: this.minStep(),
|
|
104
|
+
minStep: this.minStep(device),
|
|
135
105
|
})
|
|
136
106
|
.onSet(this.RelativeHumidityHumidifierThresholdSet.bind(this));
|
|
137
107
|
|
|
138
108
|
// Temperature Sensor Service
|
|
139
109
|
if (device.humidifier?.hide_temperature || this.BLE) {
|
|
140
110
|
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Temperature Sensor Service`);
|
|
141
|
-
this.
|
|
142
|
-
accessory.removeService(this.
|
|
143
|
-
} else if (!this.
|
|
111
|
+
this.TemperatureSensor!.Service = this.accessory.getService(this.hap.Service.TemperatureSensor) as Service;
|
|
112
|
+
accessory.removeService(this.TemperatureSensor!.Service);
|
|
113
|
+
} else if (!this.TemperatureSensor?.Service && !this.BLE) {
|
|
144
114
|
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Add Temperature Sensor Service`);
|
|
145
|
-
const
|
|
146
|
-
(this.
|
|
147
|
-
|| this.accessory.addService(this.hap.Service.TemperatureSensor)),
|
|
115
|
+
const TemperatureSensorService = `${accessory.displayName} Temperature Sensor`;
|
|
116
|
+
(this.TemperatureSensor!.Service = this.accessory.getService(this.hap.Service.TemperatureSensor)
|
|
117
|
+
|| this.accessory.addService(this.hap.Service.TemperatureSensor)), TemperatureSensorService;
|
|
148
118
|
|
|
149
|
-
this.
|
|
150
|
-
|
|
151
|
-
this.temperatureservice.addCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Temperature Sensor`);
|
|
152
|
-
}
|
|
153
|
-
this.temperatureservice
|
|
119
|
+
this.TemperatureSensor!.Service.setCharacteristic(this.hap.Characteristic.Name, TemperatureSensorService);
|
|
120
|
+
this.TemperatureSensor!.Service
|
|
154
121
|
.getCharacteristic(this.hap.Characteristic.CurrentTemperature)
|
|
155
122
|
.setProps({
|
|
156
123
|
validValueRanges: [-273.15, 100],
|
|
@@ -159,7 +126,7 @@ export class Humidifier {
|
|
|
159
126
|
minStep: 0.1,
|
|
160
127
|
})
|
|
161
128
|
.onGet(() => {
|
|
162
|
-
return this.CurrentTemperature;
|
|
129
|
+
return this.TemperatureSensor!.CurrentTemperature;
|
|
163
130
|
});
|
|
164
131
|
} else {
|
|
165
132
|
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Temperature Sensor Service Not Added`);
|
|
@@ -176,20 +143,23 @@ export class Humidifier {
|
|
|
176
143
|
});
|
|
177
144
|
|
|
178
145
|
//regisiter webhook event handler
|
|
179
|
-
if (
|
|
180
|
-
this.
|
|
146
|
+
if (device.webhook) {
|
|
147
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
|
|
181
148
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
|
|
182
149
|
try {
|
|
183
150
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
|
|
184
151
|
if (context.scale === 'CELSIUS') {
|
|
185
152
|
const { temperature, humidity } = context;
|
|
186
|
-
const {
|
|
153
|
+
const { CurrentRelativeHumidity } = this.HumidifierDehumidifier;
|
|
154
|
+
const { CurrentTemperature } = this.TemperatureSensor || { CurrentTemperature: undefined };
|
|
187
155
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
|
|
188
156
|
'(temperature, humidity) = ' +
|
|
189
157
|
`Webhook:(${temperature}, ${humidity}), ` +
|
|
190
158
|
`current:(${CurrentTemperature}, ${CurrentRelativeHumidity})`);
|
|
191
|
-
this.CurrentRelativeHumidity = humidity;
|
|
192
|
-
this.
|
|
159
|
+
this.HumidifierDehumidifier.CurrentRelativeHumidity = humidity;
|
|
160
|
+
if (!this.device.humidifier?.hide_temperature) {
|
|
161
|
+
this.TemperatureSensor!.CurrentTemperature = temperature;
|
|
162
|
+
}
|
|
193
163
|
this.updateHomeKitCharacteristics();
|
|
194
164
|
}
|
|
195
165
|
} catch (e: any) {
|
|
@@ -222,105 +192,91 @@ export class Humidifier {
|
|
|
222
192
|
});
|
|
223
193
|
}
|
|
224
194
|
|
|
225
|
-
|
|
226
|
-
* Parse the device status from the SwitchBot api
|
|
227
|
-
*/
|
|
228
|
-
async parseStatus(): Promise<void> {
|
|
229
|
-
if (!this.device.enableCloudService && this.OpenAPI) {
|
|
230
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} parseStatus enableCloudService: ${this.device.enableCloudService}`);
|
|
231
|
-
} else if (this.BLE) {
|
|
232
|
-
await this.BLEparseStatus();
|
|
233
|
-
} else if (this.OpenAPI && this.platform.config.credentials?.token) {
|
|
234
|
-
await this.openAPIparseStatus();
|
|
235
|
-
} else {
|
|
236
|
-
await this.offlineOff();
|
|
237
|
-
this.debugWarnLog(
|
|
238
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`,
|
|
239
|
-
);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
async BLEparseStatus(): Promise<void> {
|
|
195
|
+
async BLEparseStatus(serviceData: serviceData): Promise<void> {
|
|
244
196
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
|
|
197
|
+
// Target Humidifier Dehumidifier State
|
|
198
|
+
if (serviceData.autoMode) {
|
|
199
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
200
|
+
}
|
|
245
201
|
// Current Relative Humidity
|
|
246
|
-
this.CurrentRelativeHumidity =
|
|
247
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
202
|
+
this.HumidifierDehumidifier.CurrentRelativeHumidity = serviceData.percentage!;
|
|
203
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
204
|
+
+ ` CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
248
205
|
// Active
|
|
249
|
-
if (
|
|
250
|
-
this.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
206
|
+
if (serviceData.onState) {
|
|
207
|
+
this.HumidifierDehumidifier.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
251
208
|
} else {
|
|
252
|
-
this.Active = this.hap.Characteristic.Active.INACTIVE;
|
|
209
|
+
this.HumidifierDehumidifier.Active = this.hap.Characteristic.Active.INACTIVE;
|
|
253
210
|
}
|
|
254
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.Active}`);
|
|
211
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.HumidifierDehumidifier.Active}`);
|
|
255
212
|
}
|
|
256
213
|
|
|
257
|
-
async openAPIparseStatus(): Promise<void> {
|
|
214
|
+
async openAPIparseStatus(deviceStatus: deviceStatus): Promise<void> {
|
|
258
215
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
|
|
259
216
|
// Current Relative Humidity
|
|
260
|
-
this.CurrentRelativeHumidity =
|
|
261
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
217
|
+
this.HumidifierDehumidifier.CurrentRelativeHumidity = deviceStatus.body.temperature!;
|
|
218
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
219
|
+
+ ` CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
262
220
|
// Current Temperature
|
|
263
221
|
if (!this.device.humidifier?.hide_temperature) {
|
|
264
|
-
this.CurrentTemperature =
|
|
265
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.CurrentTemperature}`);
|
|
222
|
+
this.TemperatureSensor!.CurrentTemperature = deviceStatus.body.temperature!;
|
|
223
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.TemperatureSensor!.CurrentTemperature}`);
|
|
266
224
|
}
|
|
267
225
|
// Target Humidifier Dehumidifier State
|
|
268
|
-
switch (
|
|
226
|
+
switch (deviceStatus.body.auto) {
|
|
269
227
|
case true:
|
|
270
|
-
this.TargetHumidifierDehumidifierState =
|
|
271
|
-
|
|
272
|
-
this.
|
|
228
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState =
|
|
229
|
+
this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER;
|
|
230
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.HUMIDIFYING;
|
|
231
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = this.HumidifierDehumidifier.CurrentRelativeHumidity;
|
|
273
232
|
break;
|
|
274
233
|
default:
|
|
275
|
-
this.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
276
|
-
if (
|
|
277
|
-
this.RelativeHumidityHumidifierThreshold = 100;
|
|
234
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
235
|
+
if (deviceStatus.body.nebulizationEfficiency! > 100) {
|
|
236
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = 100;
|
|
278
237
|
} else {
|
|
279
|
-
this.RelativeHumidityHumidifierThreshold =
|
|
238
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = deviceStatus.body.nebulizationEfficiency!;
|
|
280
239
|
}
|
|
281
|
-
if (this.CurrentRelativeHumidity > this.RelativeHumidityHumidifierThreshold) {
|
|
282
|
-
this.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.IDLE;
|
|
283
|
-
} else if (this.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
284
|
-
this.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.INACTIVE;
|
|
240
|
+
if (this.HumidifierDehumidifier.CurrentRelativeHumidity > this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold) {
|
|
241
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.IDLE;
|
|
242
|
+
} else if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
243
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.INACTIVE;
|
|
285
244
|
} else {
|
|
286
|
-
this.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.HUMIDIFYING;
|
|
245
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.HUMIDIFYING;
|
|
287
246
|
}
|
|
288
247
|
}
|
|
289
|
-
this.debugLog(
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
`
|
|
295
|
-
);
|
|
296
|
-
this.debugLog(
|
|
297
|
-
`${this.device.deviceType}: ${this.accessory.displayName}` + ` CurrentHumidifierDehumidifierState: ${this.CurrentHumidifierDehumidifierState}`,
|
|
298
|
-
);
|
|
248
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
249
|
+
+ ` TargetHumidifierDehumidifierState: ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState}`);
|
|
250
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
251
|
+
+ ` RelativeHumidityHumidifierThreshold: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}`);
|
|
252
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
253
|
+
+ ` CurrentHumidifierDehumidifierState: ${this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState}`);
|
|
299
254
|
// Active
|
|
300
|
-
switch (
|
|
255
|
+
switch (deviceStatus.body.power) {
|
|
301
256
|
case 'on':
|
|
302
|
-
this.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
257
|
+
this.HumidifierDehumidifier.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
303
258
|
break;
|
|
304
259
|
default:
|
|
305
|
-
this.Active = this.hap.Characteristic.Active.INACTIVE;
|
|
260
|
+
this.HumidifierDehumidifier.Active = this.hap.Characteristic.Active.INACTIVE;
|
|
306
261
|
}
|
|
307
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.Active}`);
|
|
262
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.HumidifierDehumidifier.Active}`);
|
|
308
263
|
// Water Level
|
|
309
|
-
if (
|
|
310
|
-
this.WaterLevel = 0;
|
|
264
|
+
if (deviceStatus.body.lackWater) {
|
|
265
|
+
this.HumidifierDehumidifier.WaterLevel = 0;
|
|
311
266
|
} else {
|
|
312
|
-
this.WaterLevel = 100;
|
|
267
|
+
this.HumidifierDehumidifier.WaterLevel = 100;
|
|
313
268
|
}
|
|
314
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} WaterLevel: ${this.WaterLevel}`);
|
|
269
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} WaterLevel: ${this.HumidifierDehumidifier.WaterLevel}`);
|
|
315
270
|
|
|
316
271
|
// FirmwareRevision
|
|
317
|
-
this.FirmwareRevision =
|
|
318
|
-
this.accessory
|
|
272
|
+
this.accessory.context.FirmwareRevision = deviceStatus.body.version;
|
|
273
|
+
this.accessory
|
|
274
|
+
.getService(this.hap.Service.AccessoryInformation)!
|
|
275
|
+
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.FirmwareRevision)
|
|
276
|
+
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
277
|
+
.updateValue(this.accessory.context.FirmwareRevision);
|
|
319
278
|
}
|
|
320
279
|
|
|
321
|
-
/**
|
|
322
|
-
* Asks the SwitchBot API for the latest device information
|
|
323
|
-
*/
|
|
324
280
|
async refreshStatus(): Promise<void> {
|
|
325
281
|
if (!this.device.enableCloudService && this.OpenAPI) {
|
|
326
282
|
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} refreshStatus enableCloudService: ${this.device.enableCloudService}`);
|
|
@@ -350,103 +306,43 @@ export class Humidifier {
|
|
|
350
306
|
// Start to monitor advertisement packets
|
|
351
307
|
(async () => {
|
|
352
308
|
// Start to monitor advertisement packets
|
|
353
|
-
await switchbot.startScan({
|
|
354
|
-
model: 'e',
|
|
355
|
-
id: this.device.bleMac,
|
|
356
|
-
});
|
|
309
|
+
await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
|
|
357
310
|
// Set an event handler
|
|
358
311
|
switchbot.onadvertisement = (ad: any) => {
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
312
|
+
if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
|
|
313
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
|
|
314
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
|
|
362
315
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
363
|
-
this.autoMode = ad.serviceData.autoMode;
|
|
364
|
-
this.onState = ad.serviceData.onState;
|
|
365
|
-
this.percentage = ad.serviceData.percentage > 100 ? 100 : ad.serviceData.percentage;
|
|
366
316
|
} else {
|
|
367
317
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
368
318
|
}
|
|
369
319
|
};
|
|
370
|
-
// Wait
|
|
320
|
+
// Wait 10 seconds
|
|
371
321
|
await switchbot.wait(this.scanDuration * 1000);
|
|
372
322
|
// Stop to monitor
|
|
373
323
|
await switchbot.stopScan();
|
|
374
324
|
// Update HomeKit
|
|
375
|
-
await this.BLEparseStatus();
|
|
325
|
+
await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
|
|
376
326
|
await this.updateHomeKitCharacteristics();
|
|
377
327
|
})();
|
|
378
|
-
|
|
379
|
-
switchbot
|
|
380
|
-
.startScan({
|
|
381
|
-
model: 'e',
|
|
382
|
-
id: this.device.bleMac,
|
|
383
|
-
})
|
|
384
|
-
.then(async () => {
|
|
385
|
-
// Set an event handler
|
|
386
|
-
switchbot.onadvertisement = async (ad: ad) => {
|
|
387
|
-
this.debugLog(
|
|
388
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
|
|
389
|
-
` BLE Address Found: ${ad.address}`,
|
|
390
|
-
);
|
|
391
|
-
this.autoMode = ad.serviceData.autoMode;
|
|
392
|
-
this.onState = ad.serviceData.onState;
|
|
393
|
-
this.percentage = ad.serviceData.percentage;
|
|
394
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
395
|
-
this.debugLog(
|
|
396
|
-
`${this.device.deviceType}: ${this.accessory.displayName} model: ${ad.serviceData.model}, modelName: ${ad.serviceData.modelName},` +
|
|
397
|
-
`autoMode: ${ad.serviceData.autoMode}, onState: ${ad.serviceData.onState}, percentage: ${ad.serviceData.percentage}`,
|
|
398
|
-
);
|
|
399
|
-
|
|
400
|
-
if (ad.serviceData) {
|
|
401
|
-
this.connected = true;
|
|
402
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.connected}`);
|
|
403
|
-
await this.stopScanning(switchbot);
|
|
404
|
-
} else {
|
|
405
|
-
this.connected = false;
|
|
406
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.connected}`);
|
|
407
|
-
}
|
|
408
|
-
};
|
|
409
|
-
// Wait
|
|
410
|
-
return await sleep(this.scanDuration * 1000);
|
|
411
|
-
})
|
|
412
|
-
.then(async () => {
|
|
413
|
-
// Stop to monitor
|
|
414
|
-
await this.stopScanning(switchbot);
|
|
415
|
-
})
|
|
416
|
-
.catch(async (e: any) => {
|
|
417
|
-
this.apiError(e);
|
|
418
|
-
this.errorLog(
|
|
419
|
-
`${this.device.deviceType}: ${this.accessory.displayName} failed BLERefreshStatus with ${this.device.connectionType}` +
|
|
420
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
421
|
-
);
|
|
422
|
-
await this.BLERefreshConnection(switchbot);
|
|
423
|
-
});
|
|
424
|
-
} else {
|
|
328
|
+
if (switchbot === undefined) {
|
|
425
329
|
await this.BLERefreshConnection(switchbot);
|
|
426
|
-
}
|
|
330
|
+
}
|
|
427
331
|
}
|
|
428
332
|
|
|
429
333
|
async openAPIRefreshStatus(): Promise<void> {
|
|
430
334
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
|
|
431
335
|
try {
|
|
432
|
-
const { body, statusCode } = await
|
|
433
|
-
headers: this.platform.generateHeaders()
|
|
434
|
-
});
|
|
336
|
+
const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries,
|
|
337
|
+
`${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
|
|
435
338
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
|
|
436
339
|
const deviceStatus: any = await body.json();
|
|
437
340
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
438
341
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
439
342
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
440
|
-
this.
|
|
343
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
441
344
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
442
|
-
this.
|
|
443
|
-
this.OpenAPI_Active = deviceStatus.body.power;
|
|
444
|
-
this.OpenAPI_WaterLevel = deviceStatus.body.lackWater;
|
|
445
|
-
this.OpenAPI_CurrentRelativeHumidity = deviceStatus.body.humidity;
|
|
446
|
-
this.OpenAPI_CurrentTemperature = deviceStatus.body.temperature;
|
|
447
|
-
this.OpenAPI_RelativeHumidityHumidifierThreshold = deviceStatus.body.nebulizationEfficiency;
|
|
448
|
-
this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
|
|
449
|
-
this.openAPIparseStatus();
|
|
345
|
+
this.openAPIparseStatus(deviceStatus);
|
|
450
346
|
this.updateHomeKitCharacteristics();
|
|
451
347
|
} else {
|
|
452
348
|
this.statusCode(statusCode);
|
|
@@ -500,11 +396,13 @@ export class Humidifier {
|
|
|
500
396
|
id: this.device.bleMac,
|
|
501
397
|
})
|
|
502
398
|
.then(async (device_list: any) => {
|
|
503
|
-
this.infoLog(`${this.accessory.displayName}
|
|
504
|
-
return await device_list[0].percentage(this.RelativeHumidityHumidifierThreshold);
|
|
399
|
+
this.infoLog(`${this.accessory.displayName} Active: ${this.HumidifierDehumidifier.Active}`);
|
|
400
|
+
return await device_list[0].percentage(this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold);
|
|
505
401
|
})
|
|
506
402
|
.then(() => {
|
|
507
403
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
404
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
405
|
+
+ `Active: ${this.HumidifierDehumidifier.Active} sent over BLE, sent successfully`);
|
|
508
406
|
})
|
|
509
407
|
.catch(async (e: any) => {
|
|
510
408
|
this.apiError(e);
|
|
@@ -519,13 +417,14 @@ export class Humidifier {
|
|
|
519
417
|
async openAPIpushChanges(): Promise<void> {
|
|
520
418
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
|
|
521
419
|
if (
|
|
522
|
-
this.TargetHumidifierDehumidifierState === this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER &&
|
|
523
|
-
this.Active === this.hap.Characteristic.Active.ACTIVE
|
|
420
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState === this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER &&
|
|
421
|
+
this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE
|
|
524
422
|
) {
|
|
525
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
423
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
424
|
+
+ ` Pushing Manual: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}!`);
|
|
526
425
|
const bodyChange = JSON.stringify({
|
|
527
426
|
command: 'setMode',
|
|
528
|
-
parameter: `${this.RelativeHumidityHumidifierThreshold}`,
|
|
427
|
+
parameter: `${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}`,
|
|
529
428
|
commandType: 'command',
|
|
530
429
|
});
|
|
531
430
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
|
|
@@ -543,6 +442,8 @@ export class Humidifier {
|
|
|
543
442
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
544
443
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
545
444
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
445
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
446
|
+
+ `request to SwitchBot API, body: ${deviceStatus} sent successfully`);
|
|
546
447
|
} else {
|
|
547
448
|
this.statusCode(statusCode);
|
|
548
449
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -555,8 +456,9 @@ export class Humidifier {
|
|
|
555
456
|
);
|
|
556
457
|
}
|
|
557
458
|
} else if (
|
|
558
|
-
this.TargetHumidifierDehumidifierState ===
|
|
559
|
-
this.
|
|
459
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState ===
|
|
460
|
+
this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER &&
|
|
461
|
+
this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE
|
|
560
462
|
) {
|
|
561
463
|
await this.pushAutoChanges();
|
|
562
464
|
} else {
|
|
@@ -570,8 +472,9 @@ export class Humidifier {
|
|
|
570
472
|
async pushAutoChanges(): Promise<void> {
|
|
571
473
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushAutoChanges`);
|
|
572
474
|
if (
|
|
573
|
-
this.TargetHumidifierDehumidifierState ===
|
|
574
|
-
this.
|
|
475
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState ===
|
|
476
|
+
this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER &&
|
|
477
|
+
this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE
|
|
575
478
|
) {
|
|
576
479
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Pushing Auto`);
|
|
577
480
|
const bodyChange = JSON.stringify({
|
|
@@ -594,6 +497,8 @@ export class Humidifier {
|
|
|
594
497
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
595
498
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
596
499
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
500
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
501
|
+
+ `request to SwitchBot API, body: ${deviceStatus} sent successfully`);
|
|
597
502
|
} else {
|
|
598
503
|
this.statusCode(statusCode);
|
|
599
504
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -606,10 +511,8 @@ export class Humidifier {
|
|
|
606
511
|
);
|
|
607
512
|
}
|
|
608
513
|
} else {
|
|
609
|
-
this.debugLog(
|
|
610
|
-
|
|
611
|
-
`TargetHumidifierDehumidifierState: ${this.TargetHumidifierDehumidifierState}, Active: ${this.Active}`,
|
|
612
|
-
);
|
|
514
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushAutoChanges. TargetHumidifierDehumidifierState:`
|
|
515
|
+
+ ` ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState}, Active: ${this.HumidifierDehumidifier.Active}`);
|
|
613
516
|
}
|
|
614
517
|
}
|
|
615
518
|
|
|
@@ -618,7 +521,7 @@ export class Humidifier {
|
|
|
618
521
|
*/
|
|
619
522
|
async pushActiveChanges(): Promise<void> {
|
|
620
523
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushActiveChanges`);
|
|
621
|
-
if (this.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
524
|
+
if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
622
525
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Pushing Off`);
|
|
623
526
|
const bodyChange = JSON.stringify({
|
|
624
527
|
command: 'turnOff',
|
|
@@ -640,6 +543,8 @@ export class Humidifier {
|
|
|
640
543
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
641
544
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
642
545
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
546
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
547
|
+
+ `request to SwitchBot API, body: ${deviceStatus} sent successfully`);
|
|
643
548
|
} else {
|
|
644
549
|
this.statusCode(statusCode);
|
|
645
550
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -652,7 +557,7 @@ export class Humidifier {
|
|
|
652
557
|
);
|
|
653
558
|
}
|
|
654
559
|
} else {
|
|
655
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushActiveChanges. Active: ${this.Active}`);
|
|
560
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushActiveChanges. Active: ${this.HumidifierDehumidifier.Active}`);
|
|
656
561
|
}
|
|
657
562
|
}
|
|
658
563
|
|
|
@@ -660,13 +565,13 @@ export class Humidifier {
|
|
|
660
565
|
* Handle requests to set the "Active" characteristic
|
|
661
566
|
*/
|
|
662
567
|
async ActiveSet(value: CharacteristicValue): Promise<void> {
|
|
663
|
-
if (this.Active === this.accessory.context.Active) {
|
|
568
|
+
if (this.HumidifierDehumidifier.Active === this.accessory.context.Active) {
|
|
664
569
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Active: ${value}`);
|
|
665
570
|
} else {
|
|
666
571
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Active: ${value}`);
|
|
667
572
|
}
|
|
668
573
|
|
|
669
|
-
this.Active = value;
|
|
574
|
+
this.HumidifierDehumidifier.Active = value;
|
|
670
575
|
this.doHumidifierUpdate.next();
|
|
671
576
|
}
|
|
672
577
|
|
|
@@ -674,13 +579,13 @@ export class Humidifier {
|
|
|
674
579
|
* Handle requests to set the "Target Humidifier Dehumidifier State" characteristic
|
|
675
580
|
*/
|
|
676
581
|
async TargetHumidifierDehumidifierStateSet(value: CharacteristicValue): Promise<void> {
|
|
677
|
-
if (this.Active === this.hap.Characteristic.Active.ACTIVE) {
|
|
582
|
+
if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE) {
|
|
678
583
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetHumidifierDehumidifierState: ${value}`);
|
|
679
584
|
} else {
|
|
680
585
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetHumidifierDehumidifierState: ${value}`);
|
|
681
586
|
}
|
|
682
587
|
|
|
683
|
-
this.TargetHumidifierDehumidifierState = value;
|
|
588
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState = value;
|
|
684
589
|
this.doHumidifierUpdate.next();
|
|
685
590
|
}
|
|
686
591
|
|
|
@@ -688,16 +593,16 @@ export class Humidifier {
|
|
|
688
593
|
* Handle requests to set the "Relative Humidity Humidifier Threshold" characteristic
|
|
689
594
|
*/
|
|
690
595
|
async RelativeHumidityHumidifierThresholdSet(value: CharacteristicValue): Promise<void> {
|
|
691
|
-
if (this.Active === this.hap.Characteristic.Active.ACTIVE) {
|
|
596
|
+
if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE) {
|
|
692
597
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set RelativeHumidityHumidifierThreshold: ${value}`);
|
|
693
598
|
} else {
|
|
694
599
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set RelativeHumidityHumidifierThreshold: ${value}`);
|
|
695
600
|
}
|
|
696
601
|
|
|
697
|
-
this.RelativeHumidityHumidifierThreshold = value;
|
|
698
|
-
if (this.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
699
|
-
this.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
700
|
-
this.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.IDLE;
|
|
602
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = value;
|
|
603
|
+
if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
604
|
+
this.HumidifierDehumidifier.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
605
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.IDLE;
|
|
701
606
|
}
|
|
702
607
|
this.doHumidifierUpdate.next();
|
|
703
608
|
}
|
|
@@ -706,117 +611,76 @@ export class Humidifier {
|
|
|
706
611
|
* Updates the status for each of the HomeKit Characteristics
|
|
707
612
|
*/
|
|
708
613
|
async updateHomeKitCharacteristics(): Promise<void> {
|
|
709
|
-
if (this.CurrentRelativeHumidity === undefined) {
|
|
710
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
614
|
+
if (this.HumidifierDehumidifier.CurrentRelativeHumidity === undefined) {
|
|
615
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
616
|
+
+ ` CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
711
617
|
} else {
|
|
712
|
-
this.
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
this.accessory.context.CurrentRelativeHumidity = this.CurrentRelativeHumidity;
|
|
618
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity,
|
|
619
|
+
this.HumidifierDehumidifier.CurrentRelativeHumidity);
|
|
620
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
621
|
+
+ ` CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
622
|
+
this.accessory.context.CurrentRelativeHumidity = this.HumidifierDehumidifier.CurrentRelativeHumidity;
|
|
717
623
|
}
|
|
718
624
|
if (this.OpenAPI) {
|
|
719
|
-
if (this.WaterLevel === undefined) {
|
|
720
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} WaterLevel: ${this.WaterLevel}`);
|
|
625
|
+
if (this.HumidifierDehumidifier.WaterLevel === undefined) {
|
|
626
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} WaterLevel: ${this.HumidifierDehumidifier.WaterLevel}`);
|
|
721
627
|
} else {
|
|
722
|
-
this.
|
|
723
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
724
|
-
|
|
628
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.WaterLevel, this.HumidifierDehumidifier.WaterLevel);
|
|
629
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
630
|
+
+ ` WaterLevel: ${this.HumidifierDehumidifier.WaterLevel}`);
|
|
631
|
+
this.accessory.context.WaterLevel = this.HumidifierDehumidifier.WaterLevel;
|
|
725
632
|
}
|
|
726
633
|
}
|
|
727
|
-
if (this.CurrentHumidifierDehumidifierState === undefined) {
|
|
728
|
-
this.debugLog(
|
|
729
|
-
|
|
730
|
-
` CurrentHumidifierDehumidifierState: ${this.CurrentHumidifierDehumidifierState}`,
|
|
731
|
-
);
|
|
634
|
+
if (this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState === undefined) {
|
|
635
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}` +
|
|
636
|
+
` CurrentHumidifierDehumidifierState: ${this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState}`);
|
|
732
637
|
} else {
|
|
733
|
-
this.
|
|
734
|
-
this.
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
this.
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
}
|
|
743
|
-
if (this.TargetHumidifierDehumidifierState === undefined) {
|
|
744
|
-
this.debugLog(
|
|
745
|
-
`${this.device.deviceType}: ${this.accessory.displayName}` + ` TargetHumidifierDehumidifierState: ${this.TargetHumidifierDehumidifierState}`,
|
|
638
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentHumidifierDehumidifierState,
|
|
639
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState);
|
|
640
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic` +
|
|
641
|
+
` CurrentHumidifierDehumidifierState: ${this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState}`);
|
|
642
|
+
this.accessory.context.CurrentHumidifierDehumidifierState = this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState;
|
|
643
|
+
}
|
|
644
|
+
if (this.HumidifierDehumidifier.TargetHumidifierDehumidifierState === undefined) {
|
|
645
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
646
|
+
+ ` TargetHumidifierDehumidifierState: ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState}`,
|
|
746
647
|
);
|
|
747
648
|
} else {
|
|
748
|
-
this.
|
|
749
|
-
this.
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
this.
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
);
|
|
756
|
-
this.accessory.context.TargetHumidifierDehumidifierState = this.TargetHumidifierDehumidifierState;
|
|
757
|
-
}
|
|
758
|
-
if (this.Active === undefined) {
|
|
759
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.Active}`);
|
|
649
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.TargetHumidifierDehumidifierState,
|
|
650
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState);
|
|
651
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
652
|
+
+ ` TargetHumidifierDehumidifierState: ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState}`);
|
|
653
|
+
this.accessory.context.TargetHumidifierDehumidifierState = this.HumidifierDehumidifier.TargetHumidifierDehumidifierState;
|
|
654
|
+
}
|
|
655
|
+
if (this.HumidifierDehumidifier.Active === undefined) {
|
|
656
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.HumidifierDehumidifier.Active}`);
|
|
760
657
|
} else {
|
|
761
|
-
this.
|
|
762
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.Active}`);
|
|
763
|
-
this.accessory.context.Active = this.Active;
|
|
658
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.Active, this.HumidifierDehumidifier.Active);
|
|
659
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.HumidifierDehumidifier.Active}`);
|
|
660
|
+
this.accessory.context.Active = this.HumidifierDehumidifier.Active;
|
|
764
661
|
}
|
|
765
|
-
if (this.RelativeHumidityHumidifierThreshold === undefined) {
|
|
766
|
-
this.debugLog(
|
|
767
|
-
|
|
768
|
-
` RelativeHumidityHumidifierThreshold: ${this.RelativeHumidityHumidifierThreshold}`,
|
|
769
|
-
);
|
|
662
|
+
if (this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold === undefined) {
|
|
663
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}` +
|
|
664
|
+
` RelativeHumidityHumidifierThreshold: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}`);
|
|
770
665
|
} else {
|
|
771
|
-
this.
|
|
772
|
-
this.
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
this.
|
|
776
|
-
`${this.device.deviceType}: ${this.accessory.displayName}` +
|
|
777
|
-
` updateCharacteristic RelativeHumidityHumidifierThreshold: ${this.RelativeHumidityHumidifierThreshold}`,
|
|
778
|
-
);
|
|
779
|
-
this.accessory.context.RelativeHumidityHumidifierThreshold = this.RelativeHumidityHumidifierThreshold;
|
|
666
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.RelativeHumidityHumidifierThreshold,
|
|
667
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold);
|
|
668
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic` +
|
|
669
|
+
` RelativeHumidityHumidifierThreshold: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}`);
|
|
670
|
+
this.accessory.context.RelativeHumidityHumidifierThreshold = this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold;
|
|
780
671
|
}
|
|
781
672
|
if (!this.device.humidifier?.hide_temperature && !this.BLE) {
|
|
782
|
-
if (this.CurrentTemperature === undefined) {
|
|
783
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.CurrentTemperature}`);
|
|
673
|
+
if (this.TemperatureSensor!.CurrentTemperature === undefined) {
|
|
674
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.TemperatureSensor!.CurrentTemperature}`);
|
|
784
675
|
} else {
|
|
785
|
-
this.
|
|
786
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
787
|
-
|
|
676
|
+
this.TemperatureSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.TemperatureSensor!.CurrentTemperature);
|
|
677
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
678
|
+
+ ` CurrentTemperature: ${this.TemperatureSensor!.CurrentTemperature}`);
|
|
679
|
+
this.accessory.context.CurrentTemperature = this.TemperatureSensor!.CurrentTemperature;
|
|
788
680
|
}
|
|
789
681
|
}
|
|
790
682
|
}
|
|
791
683
|
|
|
792
|
-
async stopScanning(switchbot: any) {
|
|
793
|
-
switchbot.stopScan();
|
|
794
|
-
if (this.connected) {
|
|
795
|
-
await this.BLEparseStatus();
|
|
796
|
-
await this.updateHomeKitCharacteristics();
|
|
797
|
-
} else {
|
|
798
|
-
await this.BLERefreshConnection(switchbot);
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
|
|
802
|
-
async getCustomBLEAddress(switchbot: any) {
|
|
803
|
-
if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
|
|
804
|
-
(async () => {
|
|
805
|
-
// Start to monitor advertisement packets
|
|
806
|
-
await switchbot.startScan({
|
|
807
|
-
model: 'e',
|
|
808
|
-
});
|
|
809
|
-
// Set an event handler
|
|
810
|
-
switchbot.onadvertisement = (ad: any) => {
|
|
811
|
-
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} ad: ${JSON.stringify(ad, null, ' ')}`);
|
|
812
|
-
};
|
|
813
|
-
await sleep(10000);
|
|
814
|
-
// Stop to monitor
|
|
815
|
-
switchbot.stopScan();
|
|
816
|
-
})();
|
|
817
|
-
}
|
|
818
|
-
}
|
|
819
|
-
|
|
820
684
|
async BLEPushConnection() {
|
|
821
685
|
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
822
686
|
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Push Changes`);
|
|
@@ -833,283 +697,38 @@ export class Humidifier {
|
|
|
833
697
|
}
|
|
834
698
|
}
|
|
835
699
|
|
|
836
|
-
minStep(): number {
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
this.set_minStep = 1;
|
|
841
|
-
}
|
|
842
|
-
return this.set_minStep;
|
|
843
|
-
}
|
|
844
|
-
|
|
845
|
-
async scan(device: device & devicesConfig): Promise<void> {
|
|
846
|
-
if (device.scanDuration) {
|
|
847
|
-
this.scanDuration = this.accessory.context.scanDuration = device.scanDuration;
|
|
848
|
-
if (this.BLE) {
|
|
849
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config scanDuration: ${this.scanDuration}`);
|
|
850
|
-
}
|
|
700
|
+
minStep(device: device & devicesConfig): number {
|
|
701
|
+
let set_minStep: number;
|
|
702
|
+
if (device.humidifier?.set_minStep) {
|
|
703
|
+
set_minStep = device.humidifier?.set_minStep;
|
|
851
704
|
} else {
|
|
852
|
-
|
|
853
|
-
if (this.BLE) {
|
|
854
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default scanDuration: ${this.scanDuration}`);
|
|
855
|
-
}
|
|
856
|
-
}
|
|
857
|
-
}
|
|
858
|
-
|
|
859
|
-
async statusCode(statusCode: number): Promise<void> {
|
|
860
|
-
switch (statusCode) {
|
|
861
|
-
case 151:
|
|
862
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
|
|
863
|
-
break;
|
|
864
|
-
case 152:
|
|
865
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
|
|
866
|
-
break;
|
|
867
|
-
case 160:
|
|
868
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
|
|
869
|
-
break;
|
|
870
|
-
case 161:
|
|
871
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
|
|
872
|
-
this.offlineOff();
|
|
873
|
-
break;
|
|
874
|
-
case 171:
|
|
875
|
-
this.errorLog(
|
|
876
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
|
|
877
|
-
`Hub: ${this.device.hubDeviceId}`,
|
|
878
|
-
);
|
|
879
|
-
this.offlineOff();
|
|
880
|
-
break;
|
|
881
|
-
case 190:
|
|
882
|
-
this.errorLog(
|
|
883
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
|
|
884
|
-
` Or command format is invalid, statusCode: ${statusCode}`,
|
|
885
|
-
);
|
|
886
|
-
break;
|
|
887
|
-
case 100:
|
|
888
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
|
|
889
|
-
break;
|
|
890
|
-
case 200:
|
|
891
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
|
|
892
|
-
break;
|
|
893
|
-
case 400:
|
|
894
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
|
|
895
|
-
+ `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
|
|
896
|
-
break;
|
|
897
|
-
case 401:
|
|
898
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
|
|
899
|
-
+ `but the request has not been authenticated, statusCode: ${statusCode}`);
|
|
900
|
-
break;
|
|
901
|
-
case 403:
|
|
902
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
|
|
903
|
-
+ `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
|
|
904
|
-
break;
|
|
905
|
-
case 404:
|
|
906
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
|
|
907
|
-
+ `statusCode: ${statusCode}`);
|
|
908
|
-
break;
|
|
909
|
-
case 406:
|
|
910
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
|
|
911
|
-
+ `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
|
|
912
|
-
break;
|
|
913
|
-
case 415:
|
|
914
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
|
|
915
|
-
+ `header that is not supported by the server, statusCode: ${statusCode}`);
|
|
916
|
-
break;
|
|
917
|
-
case 422:
|
|
918
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
|
|
919
|
-
+ `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
|
|
920
|
-
break;
|
|
921
|
-
case 429:
|
|
922
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
|
|
923
|
-
+ `requests allowed for a given time window, statusCode: ${statusCode}`);
|
|
924
|
-
break;
|
|
925
|
-
case 500:
|
|
926
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
|
|
927
|
-
+ `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
|
|
928
|
-
break;
|
|
929
|
-
default:
|
|
930
|
-
this.infoLog(
|
|
931
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
|
|
932
|
-
`${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`,
|
|
933
|
-
);
|
|
705
|
+
set_minStep = 1;
|
|
934
706
|
}
|
|
707
|
+
return set_minStep;
|
|
935
708
|
}
|
|
936
709
|
|
|
937
710
|
async offlineOff(): Promise<void> {
|
|
938
711
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} offline: ${this.device.offline}`);
|
|
939
712
|
if (this.device.offline) {
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
713
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentHumidifierDehumidifierState,
|
|
714
|
+
this.hap.Characteristic.CurrentHumidifierDehumidifierState.INACTIVE);
|
|
715
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.TargetHumidifierDehumidifierState,
|
|
716
|
+
this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER);
|
|
717
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.Active, this.hap.Characteristic.Active.INACTIVE);
|
|
945
718
|
}
|
|
946
719
|
}
|
|
947
720
|
|
|
948
721
|
async apiError(e: any): Promise<void> {
|
|
949
|
-
this.
|
|
722
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, e);
|
|
950
723
|
if (!this.BLE) {
|
|
951
|
-
this.
|
|
724
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.WaterLevel, e);
|
|
952
725
|
}
|
|
953
|
-
this.
|
|
954
|
-
this.
|
|
955
|
-
this.
|
|
956
|
-
this.
|
|
726
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentHumidifierDehumidifierState, e);
|
|
727
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.TargetHumidifierDehumidifierState, e);
|
|
728
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.Active, e);
|
|
729
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.RelativeHumidityHumidifierThreshold, e);
|
|
957
730
|
if (!this.device.humidifier?.hide_temperature && !this.BLE) {
|
|
958
|
-
this.
|
|
959
|
-
}
|
|
960
|
-
}
|
|
961
|
-
|
|
962
|
-
async deviceContext() {
|
|
963
|
-
if (this.Active === undefined) {
|
|
964
|
-
this.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
965
|
-
} else {
|
|
966
|
-
this.Active = this.accessory.context.Active;
|
|
967
|
-
}
|
|
968
|
-
if (this.CurrentTemperature === undefined) {
|
|
969
|
-
this.CurrentTemperature = 30;
|
|
970
|
-
} else {
|
|
971
|
-
this.CurrentTemperature = this.accessory.context.CurrentTemperature;
|
|
972
|
-
}
|
|
973
|
-
if (this.CurrentRelativeHumidity === undefined) {
|
|
974
|
-
this.CurrentRelativeHumidity = 0;
|
|
975
|
-
} else {
|
|
976
|
-
this.CurrentRelativeHumidity = this.accessory.context.CurrentRelativeHumidity;
|
|
977
|
-
}
|
|
978
|
-
if (this.TargetHumidifierDehumidifierState === undefined) {
|
|
979
|
-
this.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
980
|
-
} else if (this.accessory.context.TargetHumidifierDehumidifierState === undefined) {
|
|
981
|
-
this.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
982
|
-
} else {
|
|
983
|
-
this.TargetHumidifierDehumidifierState = this.accessory.context.TargetHumidifierDehumidifierState;
|
|
984
|
-
}
|
|
985
|
-
if (this.CurrentHumidifierDehumidifierState === undefined) {
|
|
986
|
-
this.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.INACTIVE;
|
|
987
|
-
} else if (this.accessory.context.CurrentHumidifierDehumidifierState === undefined) {
|
|
988
|
-
this.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.INACTIVE;
|
|
989
|
-
} else {
|
|
990
|
-
this.CurrentHumidifierDehumidifierState = this.accessory.context.CurrentHumidifierDehumidifierState;
|
|
991
|
-
}
|
|
992
|
-
if (this.RelativeHumidityHumidifierThreshold === undefined) {
|
|
993
|
-
this.RelativeHumidityHumidifierThreshold = 0;
|
|
994
|
-
} else {
|
|
995
|
-
this.RelativeHumidityHumidifierThreshold = this.accessory.context.RelativeHumidityHumidifierThreshold;
|
|
996
|
-
}
|
|
997
|
-
if (this.WaterLevel === undefined) {
|
|
998
|
-
this.WaterLevel = 0;
|
|
999
|
-
} else {
|
|
1000
|
-
this.WaterLevel = this.accessory.context.WaterLevel;
|
|
1001
|
-
}
|
|
1002
|
-
if (this.FirmwareRevision === undefined) {
|
|
1003
|
-
this.FirmwareRevision = this.platform.version;
|
|
1004
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
1005
|
-
}
|
|
1006
|
-
}
|
|
1007
|
-
|
|
1008
|
-
async refreshRate(device: device & devicesConfig): Promise<void> {
|
|
1009
|
-
if (device.refreshRate) {
|
|
1010
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate;
|
|
1011
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
|
|
1012
|
-
} else if (this.platform.config.options!.refreshRate) {
|
|
1013
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = this.platform.config.options!.refreshRate;
|
|
1014
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
|
|
731
|
+
this.TemperatureSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, e);
|
|
1015
732
|
}
|
|
1016
733
|
}
|
|
1017
|
-
|
|
1018
|
-
async deviceConfig(device: device & devicesConfig): Promise<void> {
|
|
1019
|
-
let config = {};
|
|
1020
|
-
if (device.humidifier) {
|
|
1021
|
-
config = device.humidifier;
|
|
1022
|
-
}
|
|
1023
|
-
if (device.connectionType !== undefined) {
|
|
1024
|
-
config['connectionType'] = device.connectionType;
|
|
1025
|
-
}
|
|
1026
|
-
if (device.external !== undefined) {
|
|
1027
|
-
config['external'] = device.external;
|
|
1028
|
-
}
|
|
1029
|
-
if (device.logging !== undefined) {
|
|
1030
|
-
config['logging'] = device.logging;
|
|
1031
|
-
}
|
|
1032
|
-
if (device.refreshRate !== undefined) {
|
|
1033
|
-
config['refreshRate'] = device.refreshRate;
|
|
1034
|
-
}
|
|
1035
|
-
if (device.scanDuration !== undefined) {
|
|
1036
|
-
config['scanDuration'] = device.scanDuration;
|
|
1037
|
-
}
|
|
1038
|
-
if (device.offline !== undefined) {
|
|
1039
|
-
config['offline'] = device.offline;
|
|
1040
|
-
}
|
|
1041
|
-
if (device.webhook !== undefined) {
|
|
1042
|
-
config['webhook'] = device.webhook;
|
|
1043
|
-
}
|
|
1044
|
-
if (Object.entries(config).length !== 0) {
|
|
1045
|
-
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
|
|
1046
|
-
}
|
|
1047
|
-
}
|
|
1048
|
-
|
|
1049
|
-
async deviceLogs(device: device & devicesConfig): Promise<void> {
|
|
1050
|
-
if (this.platform.debugMode) {
|
|
1051
|
-
this.deviceLogging = this.accessory.context.logging = 'debugMode';
|
|
1052
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
|
|
1053
|
-
} else if (device.logging) {
|
|
1054
|
-
this.deviceLogging = this.accessory.context.logging = device.logging;
|
|
1055
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
|
|
1056
|
-
} else if (this.platform.config.options?.logging) {
|
|
1057
|
-
this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
|
|
1058
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
|
|
1059
|
-
} else {
|
|
1060
|
-
this.deviceLogging = this.accessory.context.logging = 'standard';
|
|
1061
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
|
|
1062
|
-
}
|
|
1063
|
-
}
|
|
1064
|
-
|
|
1065
|
-
/**
|
|
1066
|
-
* Logging for Device
|
|
1067
|
-
*/
|
|
1068
|
-
async infoLog(...log: any[]): Promise<void> {
|
|
1069
|
-
if (this.enablingDeviceLogging()) {
|
|
1070
|
-
this.platform.log.info(String(...log));
|
|
1071
|
-
}
|
|
1072
|
-
}
|
|
1073
|
-
|
|
1074
|
-
async warnLog(...log: any[]): Promise<void> {
|
|
1075
|
-
if (this.enablingDeviceLogging()) {
|
|
1076
|
-
this.platform.log.warn(String(...log));
|
|
1077
|
-
}
|
|
1078
|
-
}
|
|
1079
|
-
|
|
1080
|
-
async debugWarnLog(...log: any[]): Promise<void> {
|
|
1081
|
-
if (this.enablingDeviceLogging()) {
|
|
1082
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
1083
|
-
this.platform.log.warn('[DEBUG]', String(...log));
|
|
1084
|
-
}
|
|
1085
|
-
}
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
|
-
async errorLog(...log: any[]): Promise<void> {
|
|
1089
|
-
if (this.enablingDeviceLogging()) {
|
|
1090
|
-
this.platform.log.error(String(...log));
|
|
1091
|
-
}
|
|
1092
|
-
}
|
|
1093
|
-
|
|
1094
|
-
async debugErrorLog(...log: any[]): Promise<void> {
|
|
1095
|
-
if (this.enablingDeviceLogging()) {
|
|
1096
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
1097
|
-
this.platform.log.error('[DEBUG]', String(...log));
|
|
1098
|
-
}
|
|
1099
|
-
}
|
|
1100
|
-
}
|
|
1101
|
-
|
|
1102
|
-
async debugLog(...log: any[]): Promise<void> {
|
|
1103
|
-
if (this.enablingDeviceLogging()) {
|
|
1104
|
-
if (this.deviceLogging === 'debug') {
|
|
1105
|
-
this.platform.log.info('[DEBUG]', String(...log));
|
|
1106
|
-
} else {
|
|
1107
|
-
this.platform.log.debug(String(...log));
|
|
1108
|
-
}
|
|
1109
|
-
}
|
|
1110
|
-
}
|
|
1111
|
-
|
|
1112
|
-
enablingDeviceLogging(): boolean {
|
|
1113
|
-
return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
|
|
1114
|
-
}
|
|
1115
734
|
}
|