@switchbot/homebridge-switchbot 3.5.0-beta.6 → 3.5.0-beta.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +4 -1
- package/CHANGELOG.md +4 -1
- package/config.schema.json +120 -17
- package/dist/device/blindtilt.d.ts +23 -96
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +408 -779
- package/dist/device/blindtilt.js.map +1 -1
- package/dist/device/bot.d.ts +26 -72
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +696 -822
- package/dist/device/bot.js.map +1 -1
- package/dist/device/ceilinglight.d.ts +14 -68
- package/dist/device/ceilinglight.d.ts.map +1 -1
- package/dist/device/ceilinglight.js +237 -606
- package/dist/device/ceilinglight.js.map +1 -1
- package/dist/device/colorbulb.d.ts +14 -75
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +279 -658
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.d.ts +15 -66
- package/dist/device/contact.d.ts.map +1 -1
- package/dist/device/contact.js +242 -544
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts +19 -88
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +402 -805
- package/dist/device/curtain.js.map +1 -1
- package/dist/device/device.d.ts +59 -0
- package/dist/device/device.d.ts.map +1 -0
- package/dist/device/device.js +684 -0
- package/dist/device/device.js.map +1 -0
- package/dist/device/fan.d.ts +51 -0
- package/dist/device/fan.d.ts.map +1 -0
- package/dist/device/fan.js +535 -0
- package/dist/device/fan.js.map +1 -0
- package/dist/device/hub.d.ts +16 -60
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +246 -613
- package/dist/device/hub.js.map +1 -1
- package/dist/device/humidifier.d.ts +11 -66
- package/dist/device/humidifier.d.ts.map +1 -1
- package/dist/device/humidifier.js +232 -593
- package/dist/device/humidifier.js.map +1 -1
- package/dist/device/iosensor.d.ts +11 -64
- package/dist/device/iosensor.d.ts.map +1 -1
- package/dist/device/iosensor.js +185 -600
- package/dist/device/iosensor.js.map +1 -1
- package/dist/device/lightstrip.d.ts +11 -69
- package/dist/device/lightstrip.d.ts.map +1 -1
- package/dist/device/lightstrip.js +277 -586
- package/dist/device/lightstrip.js.map +1 -1
- package/dist/device/lock.d.ts +16 -63
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +241 -560
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.d.ts +14 -64
- package/dist/device/meter.d.ts.map +1 -1
- package/dist/device/meter.js +181 -593
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.d.ts +14 -65
- package/dist/device/meterplus.d.ts.map +1 -1
- package/dist/device/meterplus.js +170 -593
- package/dist/device/meterplus.js.map +1 -1
- package/dist/device/motion.d.ts +13 -69
- package/dist/device/motion.d.ts.map +1 -1
- package/dist/device/motion.js +178 -531
- package/dist/device/motion.js.map +1 -1
- package/dist/device/plug.d.ts +9 -57
- package/dist/device/plug.d.ts.map +1 -1
- package/dist/device/plug.js +92 -458
- package/dist/device/plug.js.map +1 -1
- package/dist/device/robotvacuumcleaner.d.ts +12 -63
- package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
- package/dist/device/robotvacuumcleaner.js +197 -521
- package/dist/device/robotvacuumcleaner.js.map +1 -1
- package/dist/device/waterdetector.d.ts +10 -65
- package/dist/device/waterdetector.d.ts.map +1 -1
- package/dist/device/waterdetector.js +139 -495
- package/dist/device/waterdetector.js.map +1 -1
- package/dist/homebridge-ui/public/index.html +22 -16
- package/dist/homebridge-ui/server.js +1 -1
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/irdevice/airconditioner.d.ts +9 -49
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js +309 -419
- package/dist/irdevice/airconditioner.js.map +1 -1
- package/dist/irdevice/airpurifier.d.ts +8 -39
- package/dist/irdevice/airpurifier.d.ts.map +1 -1
- package/dist/irdevice/airpurifier.js +72 -304
- package/dist/irdevice/airpurifier.js.map +1 -1
- package/dist/irdevice/camera.d.ts +7 -36
- package/dist/irdevice/camera.d.ts.map +1 -1
- package/dist/irdevice/camera.js +34 -278
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts +10 -43
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +100 -338
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +40 -0
- package/dist/irdevice/irdevice.d.ts.map +1 -0
- package/dist/irdevice/irdevice.js +330 -0
- package/dist/irdevice/irdevice.js.map +1 -0
- package/dist/irdevice/light.d.ts +12 -45
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +87 -357
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.d.ts +19 -48
- package/dist/irdevice/other.d.ts.map +1 -1
- package/dist/irdevice/other.js +352 -546
- package/dist/irdevice/other.js.map +1 -1
- package/dist/irdevice/tv.d.ts +8 -40
- package/dist/irdevice/tv.d.ts.map +1 -1
- package/dist/irdevice/tv.js +82 -321
- package/dist/irdevice/tv.js.map +1 -1
- package/dist/irdevice/vacuumcleaner.d.ts +7 -36
- package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
- package/dist/irdevice/vacuumcleaner.js +41 -284
- package/dist/irdevice/vacuumcleaner.js.map +1 -1
- package/dist/irdevice/waterheater.d.ts +7 -36
- package/dist/irdevice/waterheater.d.ts.map +1 -1
- package/dist/irdevice/waterheater.js +42 -287
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/platform.d.ts +19 -6
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +310 -169
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +62 -19
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +16 -552
- package/dist/settings.js.map +1 -1
- package/dist/utils.d.ts +77 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +638 -1
- package/dist/utils.js.map +1 -1
- package/eslint.config.js +96 -0
- package/package.json +19 -15
- package/src/custom.d.ts +2 -1
- package/src/device/blindtilt.ts +442 -814
- package/src/device/bot.ts +754 -915
- package/src/device/ceilinglight.ts +255 -633
- package/src/device/colorbulb.ts +294 -685
- package/src/device/contact.ts +277 -571
- package/src/device/curtain.ts +431 -835
- package/src/device/device.ts +709 -0
- package/src/device/fan.ts +591 -0
- package/src/device/hub.ts +286 -644
- package/src/device/humidifier.ts +266 -646
- package/src/device/iosensor.ts +220 -625
- package/src/device/lightstrip.ts +305 -620
- package/src/device/lock.ts +280 -600
- package/src/device/meter.ts +216 -617
- package/src/device/meterplus.ts +205 -619
- package/src/device/motion.ts +206 -556
- package/src/device/plug.ts +107 -490
- package/src/device/robotvacuumcleaner.ts +223 -550
- package/src/device/waterdetector.ts +160 -519
- package/src/homebridge-ui/public/index.html +22 -16
- package/src/homebridge-ui/server.ts +1 -1
- package/src/index.ts +4 -3
- package/src/irdevice/airconditioner.ts +333 -447
- package/src/irdevice/airpurifier.ts +92 -322
- package/src/irdevice/camera.ts +45 -294
- package/src/irdevice/fan.ts +115 -353
- package/src/irdevice/irdevice.ts +346 -0
- package/src/irdevice/light.ts +110 -385
- package/src/irdevice/other.ts +399 -616
- package/src/irdevice/tv.ts +103 -340
- package/src/irdevice/vacuumcleaner.ts +52 -306
- package/src/irdevice/waterheater.ts +53 -311
- package/src/platform.ts +355 -216
- package/src/settings.ts +116 -611
- package/src/utils.ts +642 -1
- package/src/device/waterdetector.json +0 -11
|
@@ -1,31 +1,40 @@
|
|
|
1
|
-
|
|
1
|
+
/* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* airpurifier.ts: @switchbot/homebridge-switchbot.
|
|
4
|
+
*/
|
|
2
5
|
import { request } from 'undici';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
6
|
+
import { Devices } from '../settings.js';
|
|
7
|
+
import { irdeviceBase } from './irdevice.js';
|
|
8
|
+
|
|
9
|
+
import type { SwitchBotPlatform } from '../platform.js';
|
|
10
|
+
import type { irDevicesConfig, irdevice } from '../settings.js';
|
|
11
|
+
import type { CharacteristicValue, PlatformAccessory, Service } from 'homebridge';
|
|
5
12
|
|
|
6
13
|
/**
|
|
7
14
|
* Platform Accessory
|
|
8
15
|
* An instance of this class is created for each accessory your platform registers
|
|
9
16
|
* Each accessory may expose multiple services of different service types.
|
|
10
17
|
*/
|
|
11
|
-
export class AirPurifier {
|
|
12
|
-
public readonly api: API;
|
|
13
|
-
public readonly log: Logging;
|
|
14
|
-
public readonly config!: SwitchBotPlatformConfig;
|
|
15
|
-
protected readonly hap: HAP;
|
|
18
|
+
export class AirPurifier extends irdeviceBase {
|
|
16
19
|
// Services
|
|
17
|
-
|
|
20
|
+
private AirPurifier: {
|
|
21
|
+
Service: Service;
|
|
22
|
+
Active: CharacteristicValue;
|
|
23
|
+
RotationSpeed: CharacteristicValue;
|
|
24
|
+
CurrentAirPurifierState: CharacteristicValue;
|
|
25
|
+
TargetAirPurifierState: CharacteristicValue;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
private TemperatureSensor: {
|
|
29
|
+
Service: Service;
|
|
30
|
+
CurrentTemperature: CharacteristicValue;
|
|
31
|
+
};
|
|
18
32
|
|
|
19
33
|
// Characteristic Values
|
|
20
|
-
Active!: CharacteristicValue;
|
|
21
34
|
APActive!: CharacteristicValue;
|
|
22
35
|
CurrentAPTemp!: CharacteristicValue;
|
|
23
36
|
CurrentAPMode!: CharacteristicValue;
|
|
24
|
-
RotationSpeed!: CharacteristicValue;
|
|
25
|
-
FirmwareRevision!: CharacteristicValue;
|
|
26
37
|
CurrentAPFanSpeed!: CharacteristicValue;
|
|
27
|
-
CurrentTemperature!: CharacteristicValue;
|
|
28
|
-
CurrentAirPurifierState!: CharacteristicValue;
|
|
29
38
|
CurrentHeaterCoolerState!: CharacteristicValue;
|
|
30
39
|
|
|
31
40
|
// Others
|
|
@@ -38,60 +47,50 @@ export class AirPurifier {
|
|
|
38
47
|
CurrentFanSpeed!: number;
|
|
39
48
|
static PURIFYING_AIR: number;
|
|
40
49
|
|
|
41
|
-
// Config
|
|
42
|
-
disablePushOn?: boolean;
|
|
43
|
-
disablePushOff?: boolean;
|
|
44
|
-
deviceLogging!: string;
|
|
45
|
-
|
|
46
50
|
constructor(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
51
|
+
readonly platform: SwitchBotPlatform,
|
|
52
|
+
accessory: PlatformAccessory,
|
|
53
|
+
device: irdevice & irDevicesConfig,
|
|
50
54
|
) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
//
|
|
63
|
-
|
|
64
|
-
.getService(this.hap.Service.
|
|
65
|
-
.
|
|
66
|
-
|
|
67
|
-
.setCharacteristic(this.hap.Characteristic.SerialNumber, device.deviceId)
|
|
68
|
-
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, accessory.context.FirmwareRevision);
|
|
55
|
+
super(platform, accessory, device);
|
|
56
|
+
|
|
57
|
+
// Initialize AirPurifier property
|
|
58
|
+
this.AirPurifier = {
|
|
59
|
+
Service: accessory.getService(this.hap.Service.Switch) as Service,
|
|
60
|
+
Active: accessory.context.Active || this.hap.Characteristic.Active.INACTIVE,
|
|
61
|
+
RotationSpeed: accessory.context.RotationSpeed || 0,
|
|
62
|
+
CurrentAirPurifierState: accessory.context.CurrentAirPurifierState || this.hap.Characteristic.CurrentAirPurifierState.INACTIVE,
|
|
63
|
+
TargetAirPurifierState: accessory.context.TargetAirPurifierState || this.hap.Characteristic.TargetAirPurifierState.AUTO,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// Initialize TemperatureSensor property
|
|
67
|
+
this.TemperatureSensor = {
|
|
68
|
+
Service: accessory.getService(this.hap.Service.TemperatureSensor) as Service,
|
|
69
|
+
CurrentTemperature: accessory.context.CurrentTemperature || 24,
|
|
70
|
+
};
|
|
69
71
|
|
|
70
72
|
// get the Television service if it exists, otherwise create a new Television service
|
|
71
73
|
// you can create multiple services for each accessory
|
|
72
|
-
const
|
|
73
|
-
(this.
|
|
74
|
-
|| accessory.addService(this.hap.Service.AirPurifier)),
|
|
74
|
+
const AirPurifierService = `${accessory.displayName} Air Purifier`;
|
|
75
|
+
(this.AirPurifier.Service = accessory.getService(this.hap.Service.AirPurifier)
|
|
76
|
+
|| accessory.addService(this.hap.Service.AirPurifier)), AirPurifierService;
|
|
75
77
|
|
|
76
|
-
this.
|
|
77
|
-
if (!this.airPurifierService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
|
|
78
|
-
this.airPurifierService.addCharacteristic(this.hap.Characteristic.ConfiguredName, accessory.displayName);
|
|
79
|
-
}
|
|
78
|
+
this.AirPurifier.Service.setCharacteristic(this.hap.Characteristic.Name, accessory.displayName);
|
|
80
79
|
// handle on / off events using the Active characteristic
|
|
81
|
-
this.
|
|
80
|
+
this.AirPurifier.Service.getCharacteristic(this.hap.Characteristic.Active).onSet(this.ActiveSet.bind(this));
|
|
82
81
|
|
|
83
|
-
this.
|
|
82
|
+
this.AirPurifier.Service.getCharacteristic(this.hap.Characteristic.CurrentAirPurifierState).onGet(() => {
|
|
84
83
|
return this.CurrentAirPurifierStateGet();
|
|
85
84
|
});
|
|
86
85
|
|
|
87
|
-
this.
|
|
86
|
+
this.AirPurifier.Service.getCharacteristic(this.hap.Characteristic.TargetAirPurifierState).onSet(this.TargetAirPurifierStateSet.bind(this));
|
|
88
87
|
}
|
|
89
88
|
|
|
90
89
|
async ActiveSet(value: CharacteristicValue): Promise<void> {
|
|
91
90
|
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} Set Active: ${value}`);
|
|
92
91
|
|
|
93
|
-
this.Active = value;
|
|
94
|
-
if (this.Active === this.hap.Characteristic.Active.ACTIVE) {
|
|
92
|
+
this.AirPurifier.Active = value;
|
|
93
|
+
if (this.AirPurifier.Active === this.hap.Characteristic.Active.ACTIVE) {
|
|
95
94
|
this.pushAirPurifierOnChanges();
|
|
96
95
|
} else {
|
|
97
96
|
this.pushAirPurifierOffChanges();
|
|
@@ -115,12 +114,12 @@ export class AirPurifier {
|
|
|
115
114
|
}
|
|
116
115
|
|
|
117
116
|
async CurrentAirPurifierStateGet(): Promise<number> {
|
|
118
|
-
if (this.Active === 1) {
|
|
119
|
-
this.CurrentAirPurifierState = this.hap.Characteristic.CurrentAirPurifierState.PURIFYING_AIR;
|
|
117
|
+
if (this.AirPurifier.Active === 1) {
|
|
118
|
+
this.AirPurifier.CurrentAirPurifierState = this.hap.Characteristic.CurrentAirPurifierState.PURIFYING_AIR;
|
|
120
119
|
} else {
|
|
121
|
-
this.CurrentAirPurifierState = this.hap.Characteristic.CurrentAirPurifierState.INACTIVE;
|
|
120
|
+
this.AirPurifier.CurrentAirPurifierState = this.hap.Characteristic.CurrentAirPurifierState.INACTIVE;
|
|
122
121
|
}
|
|
123
|
-
return this.CurrentAirPurifierState;
|
|
122
|
+
return this.AirPurifier.CurrentAirPurifierState;
|
|
124
123
|
}
|
|
125
124
|
|
|
126
125
|
/**
|
|
@@ -136,10 +135,10 @@ export class AirPurifier {
|
|
|
136
135
|
*/
|
|
137
136
|
async pushAirPurifierOnChanges(): Promise<void> {
|
|
138
137
|
this.debugLog(
|
|
139
|
-
`${this.device.remoteType}: ${this.accessory.displayName} pushAirPurifierOnChanges Active: ${this.Active},` +
|
|
138
|
+
`${this.device.remoteType}: ${this.accessory.displayName} pushAirPurifierOnChanges Active: ${this.AirPurifier.Active},` +
|
|
140
139
|
` disablePushOn: ${this.disablePushOn}`,
|
|
141
140
|
);
|
|
142
|
-
if (this.Active === this.hap.Characteristic.Active.ACTIVE && !this.disablePushOn) {
|
|
141
|
+
if (this.AirPurifier.Active === this.hap.Characteristic.Active.ACTIVE && !this.disablePushOn) {
|
|
143
142
|
const commandType: string = await this.commandType();
|
|
144
143
|
const command: string = await this.commandOn();
|
|
145
144
|
const bodyChange = JSON.stringify({
|
|
@@ -153,10 +152,10 @@ export class AirPurifier {
|
|
|
153
152
|
|
|
154
153
|
async pushAirPurifierOffChanges(): Promise<void> {
|
|
155
154
|
this.debugLog(
|
|
156
|
-
`${this.device.remoteType}: ${this.accessory.displayName} pushAirPurifierOffChanges Active: ${this.Active},` +
|
|
155
|
+
`${this.device.remoteType}: ${this.accessory.displayName} pushAirPurifierOffChanges Active: ${this.AirPurifier.Active},` +
|
|
157
156
|
` disablePushOff: ${this.disablePushOff}`,
|
|
158
157
|
);
|
|
159
|
-
if (this.Active === this.hap.Characteristic.Active.INACTIVE && !this.disablePushOn) {
|
|
158
|
+
if (this.AirPurifier.Active === this.hap.Characteristic.Active.INACTIVE && !this.disablePushOn) {
|
|
160
159
|
const commandType: string = await this.commandType();
|
|
161
160
|
const command: string = await this.commandOff();
|
|
162
161
|
const bodyChange = JSON.stringify({
|
|
@@ -170,7 +169,7 @@ export class AirPurifier {
|
|
|
170
169
|
|
|
171
170
|
async pushAirPurifierStatusChanges(): Promise<void> {
|
|
172
171
|
this.debugLog(
|
|
173
|
-
`${this.device.remoteType}: ${this.accessory.displayName} pushAirPurifierStatusChanges Active: ${this.Active},` +
|
|
172
|
+
`${this.device.remoteType}: ${this.accessory.displayName} pushAirPurifierStatusChanges Active: ${this.AirPurifier.Active},` +
|
|
174
173
|
` disablePushOff: ${this.disablePushOff}, disablePushOn: ${this.disablePushOn}`,
|
|
175
174
|
);
|
|
176
175
|
if (!this.Busy) {
|
|
@@ -185,21 +184,21 @@ export class AirPurifier {
|
|
|
185
184
|
|
|
186
185
|
async pushAirPurifierDetailsChanges(): Promise<void> {
|
|
187
186
|
this.debugLog(
|
|
188
|
-
`${this.device.remoteType}: ${this.accessory.displayName} pushAirPurifierDetailsChanges Active: ${this.Active},` +
|
|
187
|
+
`${this.device.remoteType}: ${this.accessory.displayName} pushAirPurifierDetailsChanges Active: ${this.AirPurifier.Active},` +
|
|
189
188
|
` disablePushOff: ${this.disablePushOff}, disablePushOn: ${this.disablePushOn}`,
|
|
190
189
|
);
|
|
191
|
-
this.CurrentAPTemp = this.CurrentTemperature || 24;
|
|
190
|
+
this.CurrentAPTemp = this.TemperatureSensor!.CurrentTemperature || 24;
|
|
192
191
|
this.CurrentAPMode = this.CurrentMode || 1;
|
|
193
192
|
this.CurrentAPFanSpeed = this.CurrentFanSpeed || 1;
|
|
194
|
-
this.APActive = this.Active === 1 ? 'on' : 'off';
|
|
193
|
+
this.APActive = this.AirPurifier.Active === 1 ? 'on' : 'off';
|
|
195
194
|
const parameter = `${this.CurrentAPTemp},${this.CurrentAPMode},${this.CurrentAPFanSpeed},${this.APActive}`;
|
|
196
195
|
const bodyChange = JSON.stringify({
|
|
197
196
|
command: 'setAll',
|
|
198
197
|
parameter: `${parameter}`,
|
|
199
198
|
commandType: 'command',
|
|
200
199
|
});
|
|
201
|
-
if (this.Active === 1) {
|
|
202
|
-
if ((Number(this.CurrentTemperature) || 24) < (this.LastTemperature || 30)) {
|
|
200
|
+
if (this.AirPurifier.Active === 1) {
|
|
201
|
+
if ((Number(this.TemperatureSensor!.CurrentTemperature) || 24) < (this.LastTemperature || 30)) {
|
|
203
202
|
this.CurrentHeaterCoolerState = this.hap.Characteristic.CurrentHeaterCoolerState.COOLING;
|
|
204
203
|
} else {
|
|
205
204
|
this.CurrentHeaterCoolerState = this.hap.Characteristic.CurrentHeaterCoolerState.HEATING;
|
|
@@ -225,8 +224,10 @@ export class AirPurifier {
|
|
|
225
224
|
this.debugWarnLog(`${this.device.remoteType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
226
225
|
this.debugWarnLog(`${this.device.remoteType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
227
226
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
228
|
-
this.
|
|
227
|
+
this.debugSuccessLog(`${this.device.remoteType}: ${this.accessory.displayName} `
|
|
229
228
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
229
|
+
this.successLog(`${this.device.remoteType}: ${this.accessory.displayName}`
|
|
230
|
+
+ ` request to SwitchBot API, body: ${JSON.stringify(bodyChange)} sent successfully`);
|
|
230
231
|
this.updateHomeKitCharacteristics();
|
|
231
232
|
} else {
|
|
232
233
|
this.statusCode(statusCode);
|
|
@@ -249,280 +250,49 @@ export class AirPurifier {
|
|
|
249
250
|
|
|
250
251
|
async updateHomeKitCharacteristics(): Promise<void> {
|
|
251
252
|
// Active
|
|
252
|
-
if (this.Active === undefined) {
|
|
253
|
-
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} Active: ${this.Active}`);
|
|
253
|
+
if (this.AirPurifier.Active === undefined) {
|
|
254
|
+
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} Active: ${this.AirPurifier.Active}`);
|
|
254
255
|
} else {
|
|
255
|
-
this.accessory.context.Active = this.Active;
|
|
256
|
-
this.
|
|
257
|
-
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.Active}`);
|
|
256
|
+
this.accessory.context.Active = this.AirPurifier.Active;
|
|
257
|
+
this.AirPurifier.Service.updateCharacteristic(this.hap.Characteristic.Active, this.AirPurifier.Active);
|
|
258
|
+
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} updateCharacteristic Active: ${this.AirPurifier.Active}`);
|
|
258
259
|
}
|
|
259
260
|
// CurrentAirPurifierState
|
|
260
|
-
if (this.CurrentAirPurifierState === undefined) {
|
|
261
|
-
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} CurrentAirPurifierState: ${this.CurrentAirPurifierState}`);
|
|
261
|
+
if (this.AirPurifier.CurrentAirPurifierState === undefined) {
|
|
262
|
+
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} CurrentAirPurifierState: ${this.AirPurifier.CurrentAirPurifierState}`);
|
|
262
263
|
} else {
|
|
263
|
-
this.accessory.context.CurrentAirPurifierState = this.CurrentAirPurifierState;
|
|
264
|
-
this.
|
|
265
|
-
this.debugLog(
|
|
266
|
-
|
|
267
|
-
);
|
|
264
|
+
this.accessory.context.CurrentAirPurifierState = this.AirPurifier.CurrentAirPurifierState;
|
|
265
|
+
this.AirPurifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentAirPurifierState, this.AirPurifier.CurrentAirPurifierState);
|
|
266
|
+
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} updateCharacteristic`
|
|
267
|
+
+ ` CurrentAirPurifierState: ${this.AirPurifier.CurrentAirPurifierState}`);
|
|
268
268
|
}
|
|
269
269
|
// CurrentHeaterCoolerState
|
|
270
270
|
if (this.CurrentHeaterCoolerState === undefined) {
|
|
271
271
|
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} CurrentHeaterCoolerState: ${this.CurrentHeaterCoolerState}`);
|
|
272
272
|
} else {
|
|
273
273
|
this.accessory.context.CurrentHeaterCoolerState = this.CurrentHeaterCoolerState;
|
|
274
|
-
this.
|
|
274
|
+
this.AirPurifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentHeaterCoolerState, this.CurrentHeaterCoolerState);
|
|
275
275
|
this.debugLog(
|
|
276
276
|
`${this.device.remoteType}: ${this.accessory.displayName}` +
|
|
277
277
|
` updateCharacteristic CurrentHeaterCoolerState: ${this.CurrentHeaterCoolerState}`,
|
|
278
278
|
);
|
|
279
279
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
if (device.disablePushOn === undefined) {
|
|
284
|
-
this.disablePushOn = false;
|
|
285
|
-
} else {
|
|
286
|
-
this.disablePushOn = device.disablePushOn;
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
async disablePushOffChanges(device: irdevice & irDevicesConfig): Promise<void> {
|
|
291
|
-
if (device.disablePushOff === undefined) {
|
|
292
|
-
this.disablePushOff = false;
|
|
293
|
-
} else {
|
|
294
|
-
this.disablePushOff = device.disablePushOff;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
async commandType(): Promise<string> {
|
|
299
|
-
let commandType: string;
|
|
300
|
-
if (this.device.customize) {
|
|
301
|
-
commandType = 'customize';
|
|
302
|
-
} else {
|
|
303
|
-
commandType = 'command';
|
|
304
|
-
}
|
|
305
|
-
return commandType;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
async commandOn(): Promise<string> {
|
|
309
|
-
let command: string;
|
|
310
|
-
if (this.device.customize && this.device.customOn) {
|
|
311
|
-
command = this.device.customOn;
|
|
312
|
-
} else {
|
|
313
|
-
command = 'turnOn';
|
|
314
|
-
}
|
|
315
|
-
return command;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
async commandOff(): Promise<string> {
|
|
319
|
-
let command: string;
|
|
320
|
-
if (this.device.customize && this.device.customOff) {
|
|
321
|
-
command = this.device.customOff;
|
|
280
|
+
// CurrentTemperature
|
|
281
|
+
if (this.TemperatureSensor.CurrentTemperature === undefined) {
|
|
282
|
+
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
|
|
322
283
|
} else {
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
async statusCode(statusCode: number): Promise<void> {
|
|
329
|
-
switch (statusCode) {
|
|
330
|
-
case 151:
|
|
331
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
|
|
332
|
-
break;
|
|
333
|
-
case 152:
|
|
334
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
|
|
335
|
-
break;
|
|
336
|
-
case 160:
|
|
337
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
|
|
338
|
-
break;
|
|
339
|
-
case 161:
|
|
340
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
|
|
341
|
-
break;
|
|
342
|
-
case 171:
|
|
343
|
-
this.errorLog(
|
|
344
|
-
`${this.device.remoteType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
|
|
345
|
-
`Hub: ${this.device.hubDeviceId}`,
|
|
346
|
-
);
|
|
347
|
-
break;
|
|
348
|
-
case 190:
|
|
349
|
-
this.errorLog(
|
|
350
|
-
`${this.device.remoteType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
|
|
351
|
-
` Or command format is invalid, statusCode: ${statusCode}`,
|
|
352
|
-
);
|
|
353
|
-
break;
|
|
354
|
-
case 100:
|
|
355
|
-
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
|
|
356
|
-
break;
|
|
357
|
-
case 200:
|
|
358
|
-
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
|
|
359
|
-
break;
|
|
360
|
-
case 400:
|
|
361
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
|
|
362
|
-
+ `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
|
|
363
|
-
break;
|
|
364
|
-
case 401:
|
|
365
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
|
|
366
|
-
+ `but the request has not been authenticated, statusCode: ${statusCode}`);
|
|
367
|
-
break;
|
|
368
|
-
case 403:
|
|
369
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
|
|
370
|
-
+ `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
|
|
371
|
-
break;
|
|
372
|
-
case 404:
|
|
373
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
|
|
374
|
-
+ `statusCode: ${statusCode}`);
|
|
375
|
-
break;
|
|
376
|
-
case 406:
|
|
377
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
|
|
378
|
-
+ `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
|
|
379
|
-
break;
|
|
380
|
-
case 415:
|
|
381
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
|
|
382
|
-
+ `header that is not supported by the server, statusCode: ${statusCode}`);
|
|
383
|
-
break;
|
|
384
|
-
case 422:
|
|
385
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, but `
|
|
386
|
-
+ `the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
|
|
387
|
-
break;
|
|
388
|
-
case 429:
|
|
389
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
|
|
390
|
-
+ `requests allowed for a given time window, statusCode: ${statusCode}`);
|
|
391
|
-
break;
|
|
392
|
-
case 500:
|
|
393
|
-
this.errorLog(`${this.device.remoteType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
|
|
394
|
-
+ `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
|
|
395
|
-
break;
|
|
396
|
-
default:
|
|
397
|
-
this.infoLog(
|
|
398
|
-
`${this.device.remoteType}: ${this.accessory.displayName} Unknown statusCode: ` +
|
|
399
|
-
`${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`,
|
|
400
|
-
);
|
|
284
|
+
this.accessory.context.CurrentTemperature = this.TemperatureSensor.CurrentTemperature;
|
|
285
|
+
this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.TemperatureSensor.CurrentTemperature);
|
|
286
|
+
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} updateCharacteristic`
|
|
287
|
+
+ ` CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
|
|
401
288
|
}
|
|
402
289
|
}
|
|
403
290
|
|
|
404
291
|
async apiError(e: any): Promise<void> {
|
|
405
|
-
this.
|
|
406
|
-
this.
|
|
407
|
-
this.
|
|
408
|
-
this.
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
private deviceContext() {
|
|
412
|
-
if (this.Active === undefined) {
|
|
413
|
-
this.Active = this.hap.Characteristic.Active.INACTIVE;
|
|
414
|
-
} else {
|
|
415
|
-
this.Active = this.accessory.context.Active;
|
|
416
|
-
}
|
|
417
|
-
if (this.CurrentTemperature === undefined) {
|
|
418
|
-
this.CurrentTemperature = 24;
|
|
419
|
-
} else {
|
|
420
|
-
this.CurrentTemperature = this.accessory.context.CurrentTemperature;
|
|
421
|
-
}
|
|
422
|
-
if (this.FirmwareRevision === undefined) {
|
|
423
|
-
this.FirmwareRevision = this.platform.version;
|
|
424
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
async deviceConfig(device: irdevice & irDevicesConfig): Promise<void> {
|
|
429
|
-
let config = {};
|
|
430
|
-
if (device.irpur) {
|
|
431
|
-
config = device.irpur;
|
|
432
|
-
}
|
|
433
|
-
if (device.logging !== undefined) {
|
|
434
|
-
config['logging'] = device.logging;
|
|
435
|
-
}
|
|
436
|
-
if (device.connectionType !== undefined) {
|
|
437
|
-
config['connectionType'] = device.connectionType;
|
|
438
|
-
}
|
|
439
|
-
if (device.external !== undefined) {
|
|
440
|
-
config['external'] = device.external;
|
|
441
|
-
}
|
|
442
|
-
if (device.customOn !== undefined) {
|
|
443
|
-
config['customOn'] = device.customOn;
|
|
444
|
-
}
|
|
445
|
-
if (device.customOff !== undefined) {
|
|
446
|
-
config['customOff'] = device.customOff;
|
|
447
|
-
}
|
|
448
|
-
if (device.customize !== undefined) {
|
|
449
|
-
config['customize'] = device.customize;
|
|
450
|
-
}
|
|
451
|
-
if (device.disablePushOn !== undefined) {
|
|
452
|
-
config['disablePushOn'] = device.disablePushOn;
|
|
453
|
-
}
|
|
454
|
-
if (device.disablePushOff !== undefined) {
|
|
455
|
-
config['disablePushOff'] = device.disablePushOff;
|
|
456
|
-
}
|
|
457
|
-
if (Object.entries(config).length !== 0) {
|
|
458
|
-
this.debugWarnLog(`${this.device.remoteType}: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
async deviceLogs(device: irdevice & irDevicesConfig): Promise<void> {
|
|
463
|
-
if (this.platform.debugMode) {
|
|
464
|
-
this.deviceLogging = this.accessory.context.logging = 'debugMode';
|
|
465
|
-
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
|
|
466
|
-
} else if (device.logging) {
|
|
467
|
-
this.deviceLogging = this.accessory.context.logging = device.logging;
|
|
468
|
-
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
|
|
469
|
-
} else if (this.platform.config.options?.logging) {
|
|
470
|
-
this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
|
|
471
|
-
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
|
|
472
|
-
} else {
|
|
473
|
-
this.deviceLogging = this.accessory.context.logging = 'standard';
|
|
474
|
-
this.debugLog(`${this.device.remoteType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
/**
|
|
479
|
-
* Logging for Device
|
|
480
|
-
*/
|
|
481
|
-
infoLog(...log: any[]): void {
|
|
482
|
-
if (this.enablingDeviceLogging()) {
|
|
483
|
-
this.platform.log.info(String(...log));
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
warnLog(...log: any[]): void {
|
|
488
|
-
if (this.enablingDeviceLogging()) {
|
|
489
|
-
this.platform.log.warn(String(...log));
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
debugWarnLog(...log: any[]): void {
|
|
494
|
-
if (this.enablingDeviceLogging()) {
|
|
495
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
496
|
-
this.platform.log.warn('[DEBUG]', String(...log));
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
errorLog(...log: any[]): void {
|
|
502
|
-
if (this.enablingDeviceLogging()) {
|
|
503
|
-
this.platform.log.error(String(...log));
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
debugErrorLog(...log: any[]): void {
|
|
508
|
-
if (this.enablingDeviceLogging()) {
|
|
509
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
510
|
-
this.platform.log.error('[DEBUG]', String(...log));
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
debugLog(...log: any[]): void {
|
|
516
|
-
if (this.enablingDeviceLogging()) {
|
|
517
|
-
if (this.deviceLogging === 'debug') {
|
|
518
|
-
this.platform.log.info('[DEBUG]', String(...log));
|
|
519
|
-
} else {
|
|
520
|
-
this.platform.log.debug(String(...log));
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
enablingDeviceLogging(): boolean {
|
|
526
|
-
return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
|
|
292
|
+
this.AirPurifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentHeaterCoolerState, e);
|
|
293
|
+
this.AirPurifier.Service.updateCharacteristic(this.hap.Characteristic.CurrentAirPurifierState, e);
|
|
294
|
+
this.AirPurifier.Service.updateCharacteristic(this.hap.Characteristic.TargetAirPurifierState, e);
|
|
295
|
+
this.AirPurifier.Service.updateCharacteristic(this.hap.Characteristic.Active, e);
|
|
296
|
+
this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, e);
|
|
527
297
|
}
|
|
528
298
|
}
|