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