@switchbot/homebridge-switchbot 3.5.0-beta.5 → 3.5.0-beta.51
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 +2 -0
- package/config.schema.json +120 -17
- package/dist/device/blindtilt.d.ts +21 -94
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +352 -757
- 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 +588 -761
- 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 +214 -588
- 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 +256 -634
- 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 +209 -532
- 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 +340 -787
- 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 +682 -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 +505 -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 +247 -597
- 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 +218 -579
- 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 +179 -585
- 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 +257 -569
- 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 +215 -543
- 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 +175 -578
- 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 +164 -578
- 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 +142 -520
- 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 +87 -453
- 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 +145 -452
- 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 +126 -665
- package/dist/device/waterdetector.js.map +1 -1
- package/dist/homebridge-ui/public/index.html +2 -2
- 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 +512 -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 +291 -147
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +41 -11
- 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/eslint.config.js +87 -0
- package/package.json +16 -15
- package/src/custom.d.ts +2 -1
- package/src/device/blindtilt.ts +378 -783
- package/src/device/bot.ts +621 -845
- package/src/device/ceilinglight.ts +227 -608
- package/src/device/colorbulb.ts +269 -657
- package/src/device/contact.ts +235 -555
- package/src/device/curtain.ts +360 -811
- package/src/device/device.ts +710 -0
- package/src/device/fan.ts +554 -0
- package/src/device/hub.ts +274 -625
- package/src/device/humidifier.ts +246 -624
- package/src/device/iosensor.ts +205 -611
- package/src/device/lightstrip.ts +278 -597
- package/src/device/lock.ts +252 -583
- package/src/device/meter.ts +200 -601
- package/src/device/meterplus.ts +189 -603
- package/src/device/motion.ts +161 -542
- package/src/device/plug.ts +97 -481
- package/src/device/robotvacuumcleaner.ts +166 -478
- package/src/device/waterdetector.ts +143 -689
- package/src/homebridge-ui/public/index.html +2 -2
- 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 +528 -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 +301 -155
- package/src/settings.ts +57 -566
- package/src/utils.ts +642 -1
package/src/device/humidifier.ts
CHANGED
|
@@ -1,119 +1,90 @@
|
|
|
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
|
+
import { convertUnits } from '../utils.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Platform Accessory
|
|
11
12
|
* An instance of this class is created for each accessory your platform registers
|
|
12
13
|
* Each accessory may expose multiple services of different service types.
|
|
13
14
|
*/
|
|
14
|
-
export class Humidifier {
|
|
15
|
-
public readonly api: API;
|
|
16
|
-
public readonly log: Logging;
|
|
17
|
-
public readonly config!: SwitchBotPlatformConfig;
|
|
18
|
-
protected readonly hap: HAP;
|
|
15
|
+
export class Humidifier extends deviceBase {
|
|
19
16
|
// 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;
|
|
17
|
+
private HumidifierDehumidifier: {
|
|
18
|
+
Service: Service;
|
|
19
|
+
Active: CharacteristicValue;
|
|
20
|
+
WaterLevel: CharacteristicValue;
|
|
21
|
+
CurrentRelativeHumidity: CharacteristicValue;
|
|
22
|
+
TargetHumidifierDehumidifierState: CharacteristicValue;
|
|
23
|
+
CurrentHumidifierDehumidifierState: CharacteristicValue;
|
|
24
|
+
RelativeHumidityHumidifierThreshold: CharacteristicValue;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
private TemperatureSensor?: {
|
|
28
|
+
Service: Service;
|
|
29
|
+
CurrentTemperature: CharacteristicValue;
|
|
30
|
+
};
|
|
53
31
|
|
|
54
32
|
// Updates
|
|
55
33
|
humidifierUpdateInProgress!: boolean;
|
|
56
34
|
doHumidifierUpdate!: Subject<void>;
|
|
57
35
|
|
|
58
|
-
// Connection
|
|
59
|
-
private readonly OpenAPI: boolean;
|
|
60
|
-
private readonly BLE: boolean;
|
|
61
|
-
|
|
62
36
|
constructor(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
37
|
+
readonly platform: SwitchBotPlatform,
|
|
38
|
+
accessory: PlatformAccessory,
|
|
39
|
+
device: device & devicesConfig,
|
|
66
40
|
) {
|
|
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
|
-
|
|
41
|
+
super(platform, accessory, device);
|
|
81
42
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
82
43
|
this.doHumidifierUpdate = new Subject();
|
|
83
44
|
this.humidifierUpdateInProgress = false;
|
|
84
45
|
|
|
46
|
+
// Initialize the HumidifierDehumidifier Service
|
|
47
|
+
this.HumidifierDehumidifier = {
|
|
48
|
+
Service: accessory.getService(this.hap.Service.HumidifierDehumidifier)!,
|
|
49
|
+
Active: accessory.context.Active || this.hap.Characteristic.Active.ACTIVE,
|
|
50
|
+
WaterLevel: accessory.context.WaterLevel || 100,
|
|
51
|
+
CurrentRelativeHumidity: accessory.context.CurrentRelativeHumidity || 50,
|
|
52
|
+
TargetHumidifierDehumidifierState: accessory.context.TargetHumidifierDehumidifierState
|
|
53
|
+
|| this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER,
|
|
54
|
+
CurrentHumidifierDehumidifierState: accessory.context.CurrentHumidifierDehumidifierState
|
|
55
|
+
|| this.hap.Characteristic.CurrentHumidifierDehumidifierState.INACTIVE,
|
|
56
|
+
RelativeHumidityHumidifierThreshold: accessory.context.RelativeHumidityHumidifierThreshold || 50,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// Initialize the Temperature Sensor Service
|
|
60
|
+
if (!device.humidifier?.hide_temperature) {
|
|
61
|
+
this.TemperatureSensor = {
|
|
62
|
+
Service: accessory.getService(this.hap.Service.TemperatureSensor)!,
|
|
63
|
+
CurrentTemperature: accessory.context.CurrentTemperature || 30,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
85
67
|
// Retrieve initial values and updateHomekit
|
|
86
68
|
this.refreshStatus();
|
|
87
69
|
|
|
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
70
|
// get the service if it exists, otherwise create a new service
|
|
97
71
|
// you can create multiple services for each accessory
|
|
98
|
-
const
|
|
99
|
-
(this.
|
|
100
|
-
|| accessory.addService(this.hap.Service.HumidifierDehumidifier)),
|
|
72
|
+
const HumidifierDehumidifierService = `${accessory.displayName} Humidifier`;
|
|
73
|
+
(this.HumidifierDehumidifier.Service = accessory.getService(this.hap.Service.HumidifierDehumidifier)
|
|
74
|
+
|| accessory.addService(this.hap.Service.HumidifierDehumidifier)), HumidifierDehumidifierService;
|
|
101
75
|
|
|
102
|
-
this.
|
|
103
|
-
if (!this.humidifierService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
|
|
104
|
-
this.humidifierService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
105
|
-
}
|
|
76
|
+
this.HumidifierDehumidifier.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
106
77
|
|
|
107
78
|
// each service must implement at-minimum the "required characteristics" for the given service type
|
|
108
79
|
// see https://developers.homebridge.io/#/service/HumidifierDehumidifier
|
|
109
80
|
|
|
110
81
|
// create handlers for required characteristics
|
|
111
|
-
this.
|
|
82
|
+
this.HumidifierDehumidifier.Service.setCharacteristic(
|
|
112
83
|
this.hap.Characteristic.CurrentHumidifierDehumidifierState,
|
|
113
|
-
this.CurrentHumidifierDehumidifierState,
|
|
84
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState,
|
|
114
85
|
);
|
|
115
86
|
|
|
116
|
-
this.
|
|
87
|
+
this.HumidifierDehumidifier.Service
|
|
117
88
|
.getCharacteristic(this.hap.Characteristic.TargetHumidifierDehumidifierState)
|
|
118
89
|
.setProps({
|
|
119
90
|
validValueRanges: [0, 1],
|
|
@@ -123,34 +94,31 @@ export class Humidifier {
|
|
|
123
94
|
})
|
|
124
95
|
.onSet(this.TargetHumidifierDehumidifierStateSet.bind(this));
|
|
125
96
|
|
|
126
|
-
this.
|
|
97
|
+
this.HumidifierDehumidifier.Service.getCharacteristic(this.hap.Characteristic.Active).onSet(this.ActiveSet.bind(this));
|
|
127
98
|
|
|
128
|
-
this.
|
|
99
|
+
this.HumidifierDehumidifier.Service
|
|
129
100
|
.getCharacteristic(this.hap.Characteristic.RelativeHumidityHumidifierThreshold)
|
|
130
101
|
.setProps({
|
|
131
102
|
validValueRanges: [0, 100],
|
|
132
103
|
minValue: 0,
|
|
133
104
|
maxValue: 100,
|
|
134
|
-
minStep: this.minStep(),
|
|
105
|
+
minStep: this.minStep(device),
|
|
135
106
|
})
|
|
136
107
|
.onSet(this.RelativeHumidityHumidifierThresholdSet.bind(this));
|
|
137
108
|
|
|
138
109
|
// Temperature Sensor Service
|
|
139
110
|
if (device.humidifier?.hide_temperature || this.BLE) {
|
|
140
111
|
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Temperature Sensor Service`);
|
|
141
|
-
this.
|
|
142
|
-
accessory.removeService(this.
|
|
143
|
-
} else if (!this.
|
|
112
|
+
this.TemperatureSensor!.Service = this.accessory.getService(this.hap.Service.TemperatureSensor) as Service;
|
|
113
|
+
accessory.removeService(this.TemperatureSensor!.Service);
|
|
114
|
+
} else if (!this.TemperatureSensor?.Service && !this.BLE) {
|
|
144
115
|
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Add Temperature Sensor Service`);
|
|
145
|
-
const
|
|
146
|
-
(this.
|
|
147
|
-
|| this.accessory.addService(this.hap.Service.TemperatureSensor)),
|
|
116
|
+
const TemperatureSensorService = `${accessory.displayName} Temperature Sensor`;
|
|
117
|
+
(this.TemperatureSensor!.Service = this.accessory.getService(this.hap.Service.TemperatureSensor)
|
|
118
|
+
|| this.accessory.addService(this.hap.Service.TemperatureSensor)), TemperatureSensorService;
|
|
148
119
|
|
|
149
|
-
this.
|
|
150
|
-
|
|
151
|
-
this.temperatureservice.addCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Temperature Sensor`);
|
|
152
|
-
}
|
|
153
|
-
this.temperatureservice
|
|
120
|
+
this.TemperatureSensor!.Service.setCharacteristic(this.hap.Characteristic.Name, TemperatureSensorService);
|
|
121
|
+
this.TemperatureSensor!.Service
|
|
154
122
|
.getCharacteristic(this.hap.Characteristic.CurrentTemperature)
|
|
155
123
|
.setProps({
|
|
156
124
|
validValueRanges: [-273.15, 100],
|
|
@@ -159,7 +127,7 @@ export class Humidifier {
|
|
|
159
127
|
minStep: 0.1,
|
|
160
128
|
})
|
|
161
129
|
.onGet(() => {
|
|
162
|
-
return this.CurrentTemperature;
|
|
130
|
+
return this.TemperatureSensor!.CurrentTemperature;
|
|
163
131
|
});
|
|
164
132
|
} else {
|
|
165
133
|
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Temperature Sensor Service Not Added`);
|
|
@@ -176,22 +144,23 @@ export class Humidifier {
|
|
|
176
144
|
});
|
|
177
145
|
|
|
178
146
|
//regisiter webhook event handler
|
|
179
|
-
if (
|
|
180
|
-
this.
|
|
147
|
+
if (device.webhook) {
|
|
148
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
|
|
181
149
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
|
|
182
150
|
try {
|
|
183
151
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
152
|
+
const { temperature, humidity } = context;
|
|
153
|
+
const { CurrentRelativeHumidity } = this.HumidifierDehumidifier;
|
|
154
|
+
const { CurrentTemperature } = this.TemperatureSensor || { CurrentTemperature: undefined };
|
|
155
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
|
|
188
156
|
'(temperature, humidity) = ' +
|
|
189
|
-
`Webhook:(${temperature}, ${humidity}), ` +
|
|
157
|
+
`Webhook:(${convertUnits(temperature, context.scale, device.iosensor?.convertUnitTo)}, ${humidity}), ` +
|
|
190
158
|
`current:(${CurrentTemperature}, ${CurrentRelativeHumidity})`);
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
159
|
+
this.HumidifierDehumidifier.CurrentRelativeHumidity = humidity;
|
|
160
|
+
if (!this.device.humidifier?.hide_temperature) {
|
|
161
|
+
this.TemperatureSensor!.CurrentTemperature = convertUnits(temperature, context.scale, device.iosensor?.convertUnitTo);
|
|
194
162
|
}
|
|
163
|
+
this.updateHomeKitCharacteristics();
|
|
195
164
|
} catch (e: any) {
|
|
196
165
|
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
197
166
|
+ `failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
|
@@ -222,105 +191,95 @@ export class Humidifier {
|
|
|
222
191
|
});
|
|
223
192
|
}
|
|
224
193
|
|
|
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> {
|
|
194
|
+
async BLEparseStatus(serviceData: serviceData): Promise<void> {
|
|
244
195
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
|
|
196
|
+
// Target Humidifier Dehumidifier State
|
|
197
|
+
if (serviceData.autoMode) {
|
|
198
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
199
|
+
}
|
|
245
200
|
// Current Relative Humidity
|
|
246
|
-
this.CurrentRelativeHumidity =
|
|
247
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
201
|
+
this.HumidifierDehumidifier.CurrentRelativeHumidity = serviceData.percentage!;
|
|
202
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
203
|
+
+ ` CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
248
204
|
// Active
|
|
249
|
-
if (
|
|
250
|
-
this.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
205
|
+
if (serviceData.onState) {
|
|
206
|
+
this.HumidifierDehumidifier.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
251
207
|
} else {
|
|
252
|
-
this.Active = this.hap.Characteristic.Active.INACTIVE;
|
|
208
|
+
this.HumidifierDehumidifier.Active = this.hap.Characteristic.Active.INACTIVE;
|
|
253
209
|
}
|
|
254
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.Active}`);
|
|
210
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.HumidifierDehumidifier.Active}`);
|
|
255
211
|
}
|
|
256
212
|
|
|
257
|
-
async openAPIparseStatus(): Promise<void> {
|
|
213
|
+
async openAPIparseStatus(deviceStatus: deviceStatus): Promise<void> {
|
|
258
214
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
|
|
259
215
|
// Current Relative Humidity
|
|
260
|
-
this.CurrentRelativeHumidity =
|
|
261
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
216
|
+
this.HumidifierDehumidifier.CurrentRelativeHumidity = deviceStatus.body.temperature!;
|
|
217
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
218
|
+
+ ` CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
262
219
|
// Current Temperature
|
|
263
220
|
if (!this.device.humidifier?.hide_temperature) {
|
|
264
|
-
this.CurrentTemperature =
|
|
265
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.CurrentTemperature}`);
|
|
221
|
+
this.TemperatureSensor!.CurrentTemperature = deviceStatus.body.temperature!;
|
|
222
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.TemperatureSensor!.CurrentTemperature}`);
|
|
266
223
|
}
|
|
267
224
|
// Target Humidifier Dehumidifier State
|
|
268
|
-
switch (
|
|
225
|
+
switch (deviceStatus.body.auto) {
|
|
269
226
|
case true:
|
|
270
|
-
this.TargetHumidifierDehumidifierState =
|
|
271
|
-
|
|
272
|
-
this.
|
|
227
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState =
|
|
228
|
+
this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER;
|
|
229
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.HUMIDIFYING;
|
|
230
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = this.HumidifierDehumidifier.CurrentRelativeHumidity;
|
|
273
231
|
break;
|
|
274
232
|
default:
|
|
275
|
-
this.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
276
|
-
if (
|
|
277
|
-
this.RelativeHumidityHumidifierThreshold = 100;
|
|
233
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
234
|
+
if (deviceStatus.body.nebulizationEfficiency! > 100) {
|
|
235
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = 100;
|
|
278
236
|
} else {
|
|
279
|
-
this.RelativeHumidityHumidifierThreshold =
|
|
237
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = deviceStatus.body.nebulizationEfficiency!;
|
|
280
238
|
}
|
|
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;
|
|
239
|
+
if (this.HumidifierDehumidifier.CurrentRelativeHumidity > this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold) {
|
|
240
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.IDLE;
|
|
241
|
+
} else if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
242
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.INACTIVE;
|
|
285
243
|
} else {
|
|
286
|
-
this.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.HUMIDIFYING;
|
|
244
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.HUMIDIFYING;
|
|
287
245
|
}
|
|
288
246
|
}
|
|
289
|
-
this.debugLog(
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
`
|
|
295
|
-
);
|
|
296
|
-
this.debugLog(
|
|
297
|
-
`${this.device.deviceType}: ${this.accessory.displayName}` + ` CurrentHumidifierDehumidifierState: ${this.CurrentHumidifierDehumidifierState}`,
|
|
298
|
-
);
|
|
247
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
248
|
+
+ ` TargetHumidifierDehumidifierState: ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState}`);
|
|
249
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
250
|
+
+ ` RelativeHumidityHumidifierThreshold: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}`);
|
|
251
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
252
|
+
+ ` CurrentHumidifierDehumidifierState: ${this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState}`);
|
|
299
253
|
// Active
|
|
300
|
-
switch (
|
|
254
|
+
switch (deviceStatus.body.power) {
|
|
301
255
|
case 'on':
|
|
302
|
-
this.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
256
|
+
this.HumidifierDehumidifier.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
303
257
|
break;
|
|
304
258
|
default:
|
|
305
|
-
this.Active = this.hap.Characteristic.Active.INACTIVE;
|
|
259
|
+
this.HumidifierDehumidifier.Active = this.hap.Characteristic.Active.INACTIVE;
|
|
306
260
|
}
|
|
307
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.Active}`);
|
|
261
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.HumidifierDehumidifier.Active}`);
|
|
308
262
|
// Water Level
|
|
309
|
-
if (
|
|
310
|
-
this.WaterLevel = 0;
|
|
263
|
+
if (deviceStatus.body.lackWater) {
|
|
264
|
+
this.HumidifierDehumidifier.WaterLevel = 0;
|
|
311
265
|
} else {
|
|
312
|
-
this.WaterLevel = 100;
|
|
266
|
+
this.HumidifierDehumidifier.WaterLevel = 100;
|
|
313
267
|
}
|
|
314
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} WaterLevel: ${this.WaterLevel}`);
|
|
268
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} WaterLevel: ${this.HumidifierDehumidifier.WaterLevel}`);
|
|
315
269
|
|
|
316
|
-
//
|
|
317
|
-
|
|
318
|
-
this.
|
|
270
|
+
// Firmware Version
|
|
271
|
+
const version = deviceStatus.body.version?.toString();
|
|
272
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
|
|
273
|
+
if (deviceStatus.body.version) {
|
|
274
|
+
this.accessory.context.version = version?.replace(/^V|-.*$/g, '');
|
|
275
|
+
this.accessory
|
|
276
|
+
.getService(this.hap.Service.AccessoryInformation)!
|
|
277
|
+
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
|
|
278
|
+
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
279
|
+
.updateValue(this.accessory.context.version);
|
|
280
|
+
}
|
|
319
281
|
}
|
|
320
282
|
|
|
321
|
-
/**
|
|
322
|
-
* Asks the SwitchBot API for the latest device information
|
|
323
|
-
*/
|
|
324
283
|
async refreshStatus(): Promise<void> {
|
|
325
284
|
if (!this.device.enableCloudService && this.OpenAPI) {
|
|
326
285
|
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} refreshStatus enableCloudService: ${this.device.enableCloudService}`);
|
|
@@ -350,103 +309,43 @@ export class Humidifier {
|
|
|
350
309
|
// Start to monitor advertisement packets
|
|
351
310
|
(async () => {
|
|
352
311
|
// Start to monitor advertisement packets
|
|
353
|
-
await switchbot.startScan({
|
|
354
|
-
model: 'e',
|
|
355
|
-
id: this.device.bleMac,
|
|
356
|
-
});
|
|
312
|
+
await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
|
|
357
313
|
// Set an event handler
|
|
358
314
|
switchbot.onadvertisement = (ad: any) => {
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
315
|
+
if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
|
|
316
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
|
|
317
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
|
|
362
318
|
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
319
|
} else {
|
|
367
320
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
368
321
|
}
|
|
369
322
|
};
|
|
370
|
-
// Wait
|
|
323
|
+
// Wait 10 seconds
|
|
371
324
|
await switchbot.wait(this.scanDuration * 1000);
|
|
372
325
|
// Stop to monitor
|
|
373
326
|
await switchbot.stopScan();
|
|
374
327
|
// Update HomeKit
|
|
375
|
-
await this.BLEparseStatus();
|
|
328
|
+
await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
|
|
376
329
|
await this.updateHomeKitCharacteristics();
|
|
377
330
|
})();
|
|
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 {
|
|
331
|
+
if (switchbot === undefined) {
|
|
425
332
|
await this.BLERefreshConnection(switchbot);
|
|
426
|
-
}
|
|
333
|
+
}
|
|
427
334
|
}
|
|
428
335
|
|
|
429
336
|
async openAPIRefreshStatus(): Promise<void> {
|
|
430
337
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
|
|
431
338
|
try {
|
|
432
|
-
const { body, statusCode } = await
|
|
433
|
-
headers: this.platform.generateHeaders()
|
|
434
|
-
});
|
|
339
|
+
const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries,
|
|
340
|
+
`${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
|
|
435
341
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
|
|
436
342
|
const deviceStatus: any = await body.json();
|
|
437
343
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
438
344
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
439
345
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
440
|
-
this.
|
|
346
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
441
347
|
+ `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();
|
|
348
|
+
this.openAPIparseStatus(deviceStatus);
|
|
450
349
|
this.updateHomeKitCharacteristics();
|
|
451
350
|
} else {
|
|
452
351
|
this.statusCode(statusCode);
|
|
@@ -500,11 +399,13 @@ export class Humidifier {
|
|
|
500
399
|
id: this.device.bleMac,
|
|
501
400
|
})
|
|
502
401
|
.then(async (device_list: any) => {
|
|
503
|
-
this.infoLog(`${this.accessory.displayName}
|
|
504
|
-
return await device_list[0].percentage(this.RelativeHumidityHumidifierThreshold);
|
|
402
|
+
this.infoLog(`${this.accessory.displayName} Active: ${this.HumidifierDehumidifier.Active}`);
|
|
403
|
+
return await device_list[0].percentage(this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold);
|
|
505
404
|
})
|
|
506
405
|
.then(() => {
|
|
507
406
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
407
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
408
|
+
+ `Active: ${this.HumidifierDehumidifier.Active} sent over BLE, sent successfully`);
|
|
508
409
|
})
|
|
509
410
|
.catch(async (e: any) => {
|
|
510
411
|
this.apiError(e);
|
|
@@ -519,13 +420,14 @@ export class Humidifier {
|
|
|
519
420
|
async openAPIpushChanges(): Promise<void> {
|
|
520
421
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
|
|
521
422
|
if (
|
|
522
|
-
this.TargetHumidifierDehumidifierState === this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER &&
|
|
523
|
-
this.Active === this.hap.Characteristic.Active.ACTIVE
|
|
423
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState === this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER &&
|
|
424
|
+
this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE
|
|
524
425
|
) {
|
|
525
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
426
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
427
|
+
+ ` Pushing Manual: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}!`);
|
|
526
428
|
const bodyChange = JSON.stringify({
|
|
527
429
|
command: 'setMode',
|
|
528
|
-
parameter: `${this.RelativeHumidityHumidifierThreshold}`,
|
|
430
|
+
parameter: `${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}`,
|
|
529
431
|
commandType: 'command',
|
|
530
432
|
});
|
|
531
433
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
|
|
@@ -543,6 +445,8 @@ export class Humidifier {
|
|
|
543
445
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
544
446
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
545
447
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
448
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
449
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(deviceStatus)} sent successfully`);
|
|
546
450
|
} else {
|
|
547
451
|
this.statusCode(statusCode);
|
|
548
452
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -555,8 +459,9 @@ export class Humidifier {
|
|
|
555
459
|
);
|
|
556
460
|
}
|
|
557
461
|
} else if (
|
|
558
|
-
this.TargetHumidifierDehumidifierState ===
|
|
559
|
-
this.
|
|
462
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState ===
|
|
463
|
+
this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER &&
|
|
464
|
+
this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE
|
|
560
465
|
) {
|
|
561
466
|
await this.pushAutoChanges();
|
|
562
467
|
} else {
|
|
@@ -570,8 +475,9 @@ export class Humidifier {
|
|
|
570
475
|
async pushAutoChanges(): Promise<void> {
|
|
571
476
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushAutoChanges`);
|
|
572
477
|
if (
|
|
573
|
-
this.TargetHumidifierDehumidifierState ===
|
|
574
|
-
this.
|
|
478
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState ===
|
|
479
|
+
this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER &&
|
|
480
|
+
this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE
|
|
575
481
|
) {
|
|
576
482
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Pushing Auto`);
|
|
577
483
|
const bodyChange = JSON.stringify({
|
|
@@ -594,6 +500,8 @@ export class Humidifier {
|
|
|
594
500
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
595
501
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
596
502
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
503
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
504
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(deviceStatus)} sent successfully`);
|
|
597
505
|
} else {
|
|
598
506
|
this.statusCode(statusCode);
|
|
599
507
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -606,10 +514,8 @@ export class Humidifier {
|
|
|
606
514
|
);
|
|
607
515
|
}
|
|
608
516
|
} else {
|
|
609
|
-
this.debugLog(
|
|
610
|
-
|
|
611
|
-
`TargetHumidifierDehumidifierState: ${this.TargetHumidifierDehumidifierState}, Active: ${this.Active}`,
|
|
612
|
-
);
|
|
517
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushAutoChanges. TargetHumidifierDehumidifierState:`
|
|
518
|
+
+ ` ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState}, Active: ${this.HumidifierDehumidifier.Active}`);
|
|
613
519
|
}
|
|
614
520
|
}
|
|
615
521
|
|
|
@@ -618,7 +524,7 @@ export class Humidifier {
|
|
|
618
524
|
*/
|
|
619
525
|
async pushActiveChanges(): Promise<void> {
|
|
620
526
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushActiveChanges`);
|
|
621
|
-
if (this.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
527
|
+
if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
622
528
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Pushing Off`);
|
|
623
529
|
const bodyChange = JSON.stringify({
|
|
624
530
|
command: 'turnOff',
|
|
@@ -640,6 +546,8 @@ export class Humidifier {
|
|
|
640
546
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
641
547
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
642
548
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
549
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
550
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(deviceStatus)} sent successfully`);
|
|
643
551
|
} else {
|
|
644
552
|
this.statusCode(statusCode);
|
|
645
553
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -652,7 +560,7 @@ export class Humidifier {
|
|
|
652
560
|
);
|
|
653
561
|
}
|
|
654
562
|
} else {
|
|
655
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushActiveChanges. Active: ${this.Active}`);
|
|
563
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushActiveChanges. Active: ${this.HumidifierDehumidifier.Active}`);
|
|
656
564
|
}
|
|
657
565
|
}
|
|
658
566
|
|
|
@@ -660,13 +568,13 @@ export class Humidifier {
|
|
|
660
568
|
* Handle requests to set the "Active" characteristic
|
|
661
569
|
*/
|
|
662
570
|
async ActiveSet(value: CharacteristicValue): Promise<void> {
|
|
663
|
-
if (this.Active === this.accessory.context.Active) {
|
|
571
|
+
if (this.HumidifierDehumidifier.Active === this.accessory.context.Active) {
|
|
664
572
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Active: ${value}`);
|
|
665
573
|
} else {
|
|
666
574
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Active: ${value}`);
|
|
667
575
|
}
|
|
668
576
|
|
|
669
|
-
this.Active = value;
|
|
577
|
+
this.HumidifierDehumidifier.Active = value;
|
|
670
578
|
this.doHumidifierUpdate.next();
|
|
671
579
|
}
|
|
672
580
|
|
|
@@ -674,13 +582,13 @@ export class Humidifier {
|
|
|
674
582
|
* Handle requests to set the "Target Humidifier Dehumidifier State" characteristic
|
|
675
583
|
*/
|
|
676
584
|
async TargetHumidifierDehumidifierStateSet(value: CharacteristicValue): Promise<void> {
|
|
677
|
-
if (this.Active === this.hap.Characteristic.Active.ACTIVE) {
|
|
585
|
+
if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE) {
|
|
678
586
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetHumidifierDehumidifierState: ${value}`);
|
|
679
587
|
} else {
|
|
680
588
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set TargetHumidifierDehumidifierState: ${value}`);
|
|
681
589
|
}
|
|
682
590
|
|
|
683
|
-
this.TargetHumidifierDehumidifierState = value;
|
|
591
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState = value;
|
|
684
592
|
this.doHumidifierUpdate.next();
|
|
685
593
|
}
|
|
686
594
|
|
|
@@ -688,16 +596,16 @@ export class Humidifier {
|
|
|
688
596
|
* Handle requests to set the "Relative Humidity Humidifier Threshold" characteristic
|
|
689
597
|
*/
|
|
690
598
|
async RelativeHumidityHumidifierThresholdSet(value: CharacteristicValue): Promise<void> {
|
|
691
|
-
if (this.Active === this.hap.Characteristic.Active.ACTIVE) {
|
|
599
|
+
if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE) {
|
|
692
600
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set RelativeHumidityHumidifierThreshold: ${value}`);
|
|
693
601
|
} else {
|
|
694
602
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set RelativeHumidityHumidifierThreshold: ${value}`);
|
|
695
603
|
}
|
|
696
604
|
|
|
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;
|
|
605
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = value;
|
|
606
|
+
if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
607
|
+
this.HumidifierDehumidifier.Active = this.hap.Characteristic.Active.ACTIVE;
|
|
608
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.IDLE;
|
|
701
609
|
}
|
|
702
610
|
this.doHumidifierUpdate.next();
|
|
703
611
|
}
|
|
@@ -706,117 +614,76 @@ export class Humidifier {
|
|
|
706
614
|
* Updates the status for each of the HomeKit Characteristics
|
|
707
615
|
*/
|
|
708
616
|
async updateHomeKitCharacteristics(): Promise<void> {
|
|
709
|
-
if (this.CurrentRelativeHumidity === undefined) {
|
|
710
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
617
|
+
if (this.HumidifierDehumidifier.CurrentRelativeHumidity === undefined) {
|
|
618
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
619
|
+
+ ` CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
711
620
|
} else {
|
|
712
|
-
this.
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
this.accessory.context.CurrentRelativeHumidity = this.CurrentRelativeHumidity;
|
|
621
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity,
|
|
622
|
+
this.HumidifierDehumidifier.CurrentRelativeHumidity);
|
|
623
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
624
|
+
+ ` CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
625
|
+
this.accessory.context.CurrentRelativeHumidity = this.HumidifierDehumidifier.CurrentRelativeHumidity;
|
|
717
626
|
}
|
|
718
627
|
if (this.OpenAPI) {
|
|
719
|
-
if (this.WaterLevel === undefined) {
|
|
720
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} WaterLevel: ${this.WaterLevel}`);
|
|
628
|
+
if (this.HumidifierDehumidifier.WaterLevel === undefined) {
|
|
629
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} WaterLevel: ${this.HumidifierDehumidifier.WaterLevel}`);
|
|
721
630
|
} else {
|
|
722
|
-
this.
|
|
723
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
724
|
-
|
|
631
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.WaterLevel, this.HumidifierDehumidifier.WaterLevel);
|
|
632
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
633
|
+
+ ` WaterLevel: ${this.HumidifierDehumidifier.WaterLevel}`);
|
|
634
|
+
this.accessory.context.WaterLevel = this.HumidifierDehumidifier.WaterLevel;
|
|
725
635
|
}
|
|
726
636
|
}
|
|
727
|
-
if (this.CurrentHumidifierDehumidifierState === undefined) {
|
|
728
|
-
this.debugLog(
|
|
729
|
-
|
|
730
|
-
` CurrentHumidifierDehumidifierState: ${this.CurrentHumidifierDehumidifierState}`,
|
|
731
|
-
);
|
|
637
|
+
if (this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState === undefined) {
|
|
638
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}` +
|
|
639
|
+
` CurrentHumidifierDehumidifierState: ${this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState}`);
|
|
732
640
|
} 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}`,
|
|
641
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentHumidifierDehumidifierState,
|
|
642
|
+
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState);
|
|
643
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic` +
|
|
644
|
+
` CurrentHumidifierDehumidifierState: ${this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState}`);
|
|
645
|
+
this.accessory.context.CurrentHumidifierDehumidifierState = this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState;
|
|
646
|
+
}
|
|
647
|
+
if (this.HumidifierDehumidifier.TargetHumidifierDehumidifierState === undefined) {
|
|
648
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
649
|
+
+ ` TargetHumidifierDehumidifierState: ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState}`,
|
|
746
650
|
);
|
|
747
651
|
} 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}`);
|
|
652
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.TargetHumidifierDehumidifierState,
|
|
653
|
+
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState);
|
|
654
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
655
|
+
+ ` TargetHumidifierDehumidifierState: ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState}`);
|
|
656
|
+
this.accessory.context.TargetHumidifierDehumidifierState = this.HumidifierDehumidifier.TargetHumidifierDehumidifierState;
|
|
657
|
+
}
|
|
658
|
+
if (this.HumidifierDehumidifier.Active === undefined) {
|
|
659
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Active: ${this.HumidifierDehumidifier.Active}`);
|
|
760
660
|
} else {
|
|
761
|
-
this.
|
|
762
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.Active}`);
|
|
763
|
-
this.accessory.context.Active = this.Active;
|
|
661
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.Active, this.HumidifierDehumidifier.Active);
|
|
662
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.HumidifierDehumidifier.Active}`);
|
|
663
|
+
this.accessory.context.Active = this.HumidifierDehumidifier.Active;
|
|
764
664
|
}
|
|
765
|
-
if (this.RelativeHumidityHumidifierThreshold === undefined) {
|
|
766
|
-
this.debugLog(
|
|
767
|
-
|
|
768
|
-
` RelativeHumidityHumidifierThreshold: ${this.RelativeHumidityHumidifierThreshold}`,
|
|
769
|
-
);
|
|
665
|
+
if (this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold === undefined) {
|
|
666
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}` +
|
|
667
|
+
` RelativeHumidityHumidifierThreshold: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}`);
|
|
770
668
|
} 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;
|
|
669
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.RelativeHumidityHumidifierThreshold,
|
|
670
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold);
|
|
671
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic` +
|
|
672
|
+
` RelativeHumidityHumidifierThreshold: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}`);
|
|
673
|
+
this.accessory.context.RelativeHumidityHumidifierThreshold = this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold;
|
|
780
674
|
}
|
|
781
675
|
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}`);
|
|
676
|
+
if (this.TemperatureSensor!.CurrentTemperature === undefined) {
|
|
677
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.TemperatureSensor!.CurrentTemperature}`);
|
|
784
678
|
} else {
|
|
785
|
-
this.
|
|
786
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
787
|
-
|
|
679
|
+
this.TemperatureSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.TemperatureSensor!.CurrentTemperature);
|
|
680
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
681
|
+
+ ` CurrentTemperature: ${this.TemperatureSensor!.CurrentTemperature}`);
|
|
682
|
+
this.accessory.context.CurrentTemperature = this.TemperatureSensor!.CurrentTemperature;
|
|
788
683
|
}
|
|
789
684
|
}
|
|
790
685
|
}
|
|
791
686
|
|
|
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
687
|
async BLEPushConnection() {
|
|
821
688
|
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
822
689
|
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Push Changes`);
|
|
@@ -833,283 +700,38 @@ export class Humidifier {
|
|
|
833
700
|
}
|
|
834
701
|
}
|
|
835
702
|
|
|
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
|
-
}
|
|
703
|
+
minStep(device: device & devicesConfig): number {
|
|
704
|
+
let set_minStep: number;
|
|
705
|
+
if (device.humidifier?.set_minStep) {
|
|
706
|
+
set_minStep = device.humidifier?.set_minStep;
|
|
851
707
|
} 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
|
-
);
|
|
708
|
+
set_minStep = 1;
|
|
934
709
|
}
|
|
710
|
+
return set_minStep;
|
|
935
711
|
}
|
|
936
712
|
|
|
937
713
|
async offlineOff(): Promise<void> {
|
|
938
714
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} offline: ${this.device.offline}`);
|
|
939
715
|
if (this.device.offline) {
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
716
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentHumidifierDehumidifierState,
|
|
717
|
+
this.hap.Characteristic.CurrentHumidifierDehumidifierState.INACTIVE);
|
|
718
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.TargetHumidifierDehumidifierState,
|
|
719
|
+
this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER);
|
|
720
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.Active, this.hap.Characteristic.Active.INACTIVE);
|
|
945
721
|
}
|
|
946
722
|
}
|
|
947
723
|
|
|
948
724
|
async apiError(e: any): Promise<void> {
|
|
949
|
-
this.
|
|
725
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, e);
|
|
950
726
|
if (!this.BLE) {
|
|
951
|
-
this.
|
|
727
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.WaterLevel, e);
|
|
952
728
|
}
|
|
953
|
-
this.
|
|
954
|
-
this.
|
|
955
|
-
this.
|
|
956
|
-
this.
|
|
729
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentHumidifierDehumidifierState, e);
|
|
730
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.TargetHumidifierDehumidifierState, e);
|
|
731
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.Active, e);
|
|
732
|
+
this.HumidifierDehumidifier.Service.updateCharacteristic(this.hap.Characteristic.RelativeHumidityHumidifierThreshold, e);
|
|
957
733
|
if (!this.device.humidifier?.hide_temperature && !this.BLE) {
|
|
958
|
-
this.
|
|
734
|
+
this.TemperatureSensor!.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, e);
|
|
959
735
|
}
|
|
960
736
|
}
|
|
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}`);
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
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
737
|
}
|