@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
package/src/device/colorbulb.ts
CHANGED
|
@@ -1,138 +1,96 @@
|
|
|
1
|
+
/* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* blindtilt.ts: @switchbot/homebridge-switchbot.
|
|
4
|
+
*/
|
|
1
5
|
import { request } from 'undici';
|
|
2
|
-
import {
|
|
6
|
+
import { deviceBase } from './device.js';
|
|
3
7
|
import { interval, Subject } from 'rxjs';
|
|
4
|
-
import {
|
|
8
|
+
import { Devices } from '../settings.js';
|
|
9
|
+
import { hs2rgb, rgb2hs, m2hs } from '../utils.js';
|
|
5
10
|
import { debounceTime, skipWhile, take, tap } from 'rxjs/operators';
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
} from 'homebridge';
|
|
11
|
+
|
|
12
|
+
import type { SwitchBotPlatform } from '../platform.js';
|
|
13
|
+
import type { device, devicesConfig, deviceStatus, serviceData} from '../settings.js';
|
|
14
|
+
import type { Service, PlatformAccessory, CharacteristicValue, ControllerConstructor, Controller, ControllerServiceMap } from 'homebridge';
|
|
10
15
|
|
|
11
16
|
/**
|
|
12
17
|
* Platform Accessory
|
|
13
18
|
* An instance of this class is created for each accessory your platform registers
|
|
14
19
|
* Each accessory may expose multiple services of different service types.
|
|
15
20
|
*/
|
|
16
|
-
export class ColorBulb {
|
|
17
|
-
public readonly api: API;
|
|
18
|
-
public readonly log: Logging;
|
|
19
|
-
public readonly config!: SwitchBotPlatformConfig;
|
|
20
|
-
protected readonly hap: HAP;
|
|
21
|
+
export class ColorBulb extends deviceBase {
|
|
21
22
|
// Services
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
// OpenAPI Status
|
|
33
|
-
OpenAPI_On: deviceStatus['power'];
|
|
34
|
-
OpenAPI_RGB: deviceStatus['color'];
|
|
35
|
-
OpenAPI_Brightness: deviceStatus['brightness'];
|
|
36
|
-
OpenAPI_FirmwareRevision: deviceStatus['version'];
|
|
37
|
-
OpenAPI_ColorTemperature?: deviceStatus['colorTemperature'];
|
|
38
|
-
|
|
39
|
-
// BLE Status
|
|
40
|
-
BLE_ColorTemperature: serviceData['color_temperature'];
|
|
41
|
-
BLE_Power: serviceData['power'];
|
|
42
|
-
BLE_Red: serviceData['red'];
|
|
43
|
-
BLE_Blue: serviceData['blue'];
|
|
44
|
-
BLE_Green: serviceData['green'];
|
|
45
|
-
BLE_On: serviceData['state'];
|
|
46
|
-
BLE_Delay: serviceData['delay'];
|
|
47
|
-
BLE_WifiRssi: serviceData['wifiRssi'];
|
|
48
|
-
BLE_Brightness: serviceData['brightness'];
|
|
49
|
-
BLE_Saturation;
|
|
50
|
-
BLE_Hue;
|
|
51
|
-
|
|
52
|
-
// BLE Others
|
|
53
|
-
BLE_IsConnected?: boolean;
|
|
54
|
-
|
|
55
|
-
// Config
|
|
56
|
-
set_minStep?: number;
|
|
57
|
-
scanDuration!: number;
|
|
58
|
-
deviceLogging!: string;
|
|
59
|
-
deviceRefreshRate!: number;
|
|
60
|
-
adaptiveLightingShift?: number;
|
|
23
|
+
private LightBulb: {
|
|
24
|
+
Name: CharacteristicValue;
|
|
25
|
+
Service: Service;
|
|
26
|
+
On: CharacteristicValue;
|
|
27
|
+
Hue: CharacteristicValue;
|
|
28
|
+
Saturation: CharacteristicValue;
|
|
29
|
+
Brightness: CharacteristicValue;
|
|
30
|
+
ColorTemperature?: CharacteristicValue;
|
|
31
|
+
};
|
|
61
32
|
|
|
62
33
|
// Adaptive Lighting
|
|
63
34
|
AdaptiveLightingController?: ControllerConstructor | Controller<ControllerServiceMap>;
|
|
64
|
-
|
|
65
|
-
maxKelvin!: number;
|
|
66
|
-
|
|
67
|
-
// Others
|
|
68
|
-
cacheKelvin!: number;
|
|
35
|
+
adaptiveLightingShift?: number;
|
|
69
36
|
|
|
70
37
|
// Updates
|
|
71
38
|
colorBulbUpdateInProgress!: boolean;
|
|
72
39
|
doColorBulbUpdate!: Subject<void>;
|
|
73
40
|
|
|
74
|
-
// Connection
|
|
75
|
-
private readonly OpenAPI: boolean;
|
|
76
|
-
private readonly BLE: boolean;
|
|
77
|
-
|
|
78
41
|
constructor(
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
42
|
+
readonly platform: SwitchBotPlatform,
|
|
43
|
+
accessory: PlatformAccessory,
|
|
44
|
+
device: device & devicesConfig,
|
|
82
45
|
) {
|
|
83
|
-
|
|
84
|
-
this.log = this.platform.log;
|
|
85
|
-
this.config = this.platform.config;
|
|
86
|
-
this.hap = this.api.hap;
|
|
87
|
-
// Connection
|
|
88
|
-
this.BLE = this.device.connectionType === 'BLE' || this.device.connectionType === 'BLE/OpenAPI';
|
|
89
|
-
this.OpenAPI = this.device.connectionType === 'OpenAPI' || this.device.connectionType === 'BLE/OpenAPI';
|
|
46
|
+
super(platform, accessory, device);
|
|
90
47
|
// default placeholders
|
|
91
|
-
this.deviceLogs(device);
|
|
92
|
-
this.scan(device);
|
|
93
|
-
this.refreshRate(device);
|
|
94
48
|
this.adaptiveLighting(device);
|
|
95
|
-
|
|
96
|
-
this.deviceConfig(device);
|
|
49
|
+
|
|
97
50
|
|
|
98
51
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
99
52
|
this.doColorBulbUpdate = new Subject();
|
|
100
53
|
this.colorBulbUpdateInProgress = false;
|
|
101
54
|
|
|
102
|
-
//
|
|
103
|
-
this.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
.
|
|
108
|
-
.
|
|
109
|
-
.
|
|
110
|
-
.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (this.adaptiveLightingShift === -1 && this.accessory.context.adaptiveLighting) {
|
|
120
|
-
this.accessory.removeService(this.lightBulbService);
|
|
121
|
-
this.lightBulbService = this.accessory.addService(this.hap.Service.Lightbulb);
|
|
122
|
-
this.accessory.context.adaptiveLighting = false;
|
|
123
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${this.accessory.context.adaptiveLighting}`);
|
|
55
|
+
// Initialize LightBulb property
|
|
56
|
+
this.LightBulb = {
|
|
57
|
+
Name: accessory.context.LightBulbName ?? accessory.displayName,
|
|
58
|
+
Service: accessory.getService(this.hap.Service.Lightbulb) ?? accessory.addService(this.hap.Service.Lightbulb) as Service,
|
|
59
|
+
On: accessory.context.On ?? false,
|
|
60
|
+
Hue: accessory.context.Hue ?? 0,
|
|
61
|
+
Saturation: accessory.context.Saturation ?? 0,
|
|
62
|
+
Brightness: accessory.context.Brightness ?? 0,
|
|
63
|
+
ColorTemperature: accessory.context.ColorTemperature ?? 140,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// Adaptive Lighting
|
|
67
|
+
if (this.adaptiveLightingShift === -1 && accessory.context.adaptiveLighting) {
|
|
68
|
+
accessory.removeService(this.LightBulb.Service);
|
|
69
|
+
this.LightBulb.Service = accessory.addService(this.hap.Service.Lightbulb);
|
|
70
|
+
accessory.context.adaptiveLighting = false;
|
|
71
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} adaptiveLighting: ${accessory.context.adaptiveLighting}`);
|
|
124
72
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
73
|
+
if (this.adaptiveLightingShift !== -1) {
|
|
74
|
+
this.AdaptiveLightingController = new platform.api.hap.AdaptiveLightingController(this.LightBulb.Service, {
|
|
75
|
+
customTemperatureAdjustment: this.adaptiveLightingShift,
|
|
76
|
+
});
|
|
77
|
+
accessory.configureController(this.AdaptiveLightingController);
|
|
78
|
+
accessory.context.adaptiveLighting = true;
|
|
79
|
+
this.debugLog(`${device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${accessory.context.adaptiveLighting},`
|
|
80
|
+
+ ` adaptiveLightingShift: ${this.adaptiveLightingShift}`);
|
|
129
81
|
}
|
|
82
|
+
this.debugLog(`${device.deviceType}: ${this.accessory.displayName} adaptiveLightingShift: ${this.adaptiveLightingShift}`);
|
|
130
83
|
|
|
131
|
-
//
|
|
132
|
-
this.
|
|
84
|
+
// Initialize LightBulb Characteristics
|
|
85
|
+
this.LightBulb.Service
|
|
86
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.LightBulb.Name)
|
|
87
|
+
.getCharacteristic(this.hap.Characteristic.On)
|
|
88
|
+
.onGet(() => {
|
|
89
|
+
return this.LightBulb.On;
|
|
90
|
+
})
|
|
91
|
+
.onSet(this.OnSet.bind(this));
|
|
133
92
|
|
|
134
|
-
|
|
135
|
-
this.lightBulbService
|
|
93
|
+
this.LightBulb.Service
|
|
136
94
|
.getCharacteristic(this.hap.Characteristic.Brightness)
|
|
137
95
|
.setProps({
|
|
138
96
|
minStep: this.minStep(device),
|
|
@@ -141,12 +99,11 @@ export class ColorBulb {
|
|
|
141
99
|
validValueRanges: [0, 100],
|
|
142
100
|
})
|
|
143
101
|
.onGet(() => {
|
|
144
|
-
return this.Brightness;
|
|
102
|
+
return this.LightBulb.Brightness;
|
|
145
103
|
})
|
|
146
104
|
.onSet(this.BrightnessSet.bind(this));
|
|
147
105
|
|
|
148
|
-
|
|
149
|
-
this.lightBulbService
|
|
106
|
+
this.LightBulb.Service
|
|
150
107
|
.getCharacteristic(this.hap.Characteristic.ColorTemperature)
|
|
151
108
|
.setProps({
|
|
152
109
|
minValue: 140,
|
|
@@ -154,12 +111,11 @@ export class ColorBulb {
|
|
|
154
111
|
validValueRanges: [140, 500],
|
|
155
112
|
})
|
|
156
113
|
.onGet(() => {
|
|
157
|
-
return this.ColorTemperature!;
|
|
114
|
+
return this.LightBulb.ColorTemperature!;
|
|
158
115
|
})
|
|
159
116
|
.onSet(this.ColorTemperatureSet.bind(this));
|
|
160
117
|
|
|
161
|
-
|
|
162
|
-
this.lightBulbService
|
|
118
|
+
this.LightBulb.Service
|
|
163
119
|
.getCharacteristic(this.hap.Characteristic.Hue)
|
|
164
120
|
.setProps({
|
|
165
121
|
minValue: 0,
|
|
@@ -167,12 +123,11 @@ export class ColorBulb {
|
|
|
167
123
|
validValueRanges: [0, 360],
|
|
168
124
|
})
|
|
169
125
|
.onGet(() => {
|
|
170
|
-
return this.Hue;
|
|
126
|
+
return this.LightBulb.Hue;
|
|
171
127
|
})
|
|
172
128
|
.onSet(this.HueSet.bind(this));
|
|
173
129
|
|
|
174
|
-
|
|
175
|
-
this.lightBulbService
|
|
130
|
+
this.LightBulb.Service
|
|
176
131
|
.getCharacteristic(this.hap.Characteristic.Saturation)
|
|
177
132
|
.setProps({
|
|
178
133
|
minValue: 0,
|
|
@@ -180,22 +135,13 @@ export class ColorBulb {
|
|
|
180
135
|
validValueRanges: [0, 100],
|
|
181
136
|
})
|
|
182
137
|
.onGet(() => {
|
|
183
|
-
return this.Saturation;
|
|
138
|
+
return this.LightBulb.Saturation;
|
|
184
139
|
})
|
|
185
140
|
.onSet(this.SaturationSet.bind(this));
|
|
141
|
+
accessory.context.LightBulbName = this.LightBulb.Name;
|
|
186
142
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
this.AdaptiveLightingController = new platform.api.hap.AdaptiveLightingController(this.lightBulbService, {
|
|
190
|
-
customTemperatureAdjustment: this.adaptiveLightingShift,
|
|
191
|
-
});
|
|
192
|
-
this.accessory.configureController(this.AdaptiveLightingController);
|
|
193
|
-
this.accessory.context.adaptiveLighting = true;
|
|
194
|
-
this.debugLog(
|
|
195
|
-
`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${this.accessory.context.adaptiveLighting},` +
|
|
196
|
-
` adaptiveLightingShift: ${this.adaptiveLightingShift}`,
|
|
197
|
-
);
|
|
198
|
-
}
|
|
143
|
+
// Retrieve initial values and updateHomekit
|
|
144
|
+
this.refreshStatus();
|
|
199
145
|
|
|
200
146
|
// Update Homekit
|
|
201
147
|
this.updateHomeKitCharacteristics();
|
|
@@ -208,19 +154,33 @@ export class ColorBulb {
|
|
|
208
154
|
});
|
|
209
155
|
|
|
210
156
|
//regisiter webhook event handler
|
|
211
|
-
if (
|
|
212
|
-
this.
|
|
157
|
+
if (device.webhook) {
|
|
158
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
|
|
213
159
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
|
|
214
160
|
try {
|
|
215
161
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
|
|
216
162
|
const { powerState, brightness, color, colorTemperature } = context;
|
|
217
|
-
const { On, Brightness, Hue, Saturation, ColorTemperature } = this;
|
|
163
|
+
const { On, Brightness, Hue, Saturation, ColorTemperature } = this.LightBulb;
|
|
218
164
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
|
|
219
165
|
'(powerState, brightness, color, colorTemperature) = ' +
|
|
220
166
|
`Webhook:(${powerState}, ${brightness}, ${color}, ${colorTemperature}), ` +
|
|
221
167
|
`current:(${On}, ${Brightness}, ${Hue}, ${Saturation}, ${ColorTemperature})`);
|
|
222
|
-
|
|
223
|
-
|
|
168
|
+
|
|
169
|
+
// On
|
|
170
|
+
this.LightBulb.On = powerState === 'ON' ? true : false;
|
|
171
|
+
if (this.accessory.context.Brightness !== this.LightBulb.On) {
|
|
172
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
173
|
+
} else {
|
|
174
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Brightness
|
|
178
|
+
this.LightBulb.Brightness = brightness;
|
|
179
|
+
if (this.accessory.context.Brightness !== this.LightBulb.Brightness) {
|
|
180
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
181
|
+
} else {
|
|
182
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
183
|
+
}
|
|
224
184
|
|
|
225
185
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(color)}`);
|
|
226
186
|
const [red, green, blue] = color!.split(':');
|
|
@@ -234,26 +194,26 @@ export class ColorBulb {
|
|
|
234
194
|
);
|
|
235
195
|
|
|
236
196
|
// Hue
|
|
237
|
-
this.Hue = hue;
|
|
238
|
-
if (this.accessory.context.Hue !== this.Hue) {
|
|
239
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
197
|
+
this.LightBulb.Hue = hue;
|
|
198
|
+
if (this.accessory.context.Hue !== this.LightBulb.Hue) {
|
|
199
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
240
200
|
} else {
|
|
241
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
201
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
242
202
|
}
|
|
243
203
|
|
|
244
204
|
// Saturation
|
|
245
|
-
this.Saturation = saturation;
|
|
246
|
-
if (this.accessory.context.Saturation !== this.Saturation) {
|
|
247
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
|
|
205
|
+
this.LightBulb.Saturation = saturation;
|
|
206
|
+
if (this.accessory.context.Saturation !== this.LightBulb.Saturation) {
|
|
207
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
248
208
|
} else {
|
|
249
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
|
|
209
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
250
210
|
}
|
|
251
211
|
|
|
252
|
-
this.ColorTemperature = colorTemperature;
|
|
253
|
-
if (this.accessory.context.ColorTemperature !== this.ColorTemperature) {
|
|
254
|
-
this.
|
|
212
|
+
this.LightBulb.ColorTemperature = colorTemperature;
|
|
213
|
+
if (this.accessory.context.ColorTemperature !== this.LightBulb.ColorTemperature) {
|
|
214
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
255
215
|
} else {
|
|
256
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
216
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
257
217
|
}
|
|
258
218
|
this.updateHomeKitCharacteristics();
|
|
259
219
|
} catch (e: any) {
|
|
@@ -287,89 +247,75 @@ export class ColorBulb {
|
|
|
287
247
|
}
|
|
288
248
|
|
|
289
249
|
/**
|
|
290
|
-
* Parse the device status from the
|
|
250
|
+
* Parse the device status from the SwitchBotBLE API
|
|
291
251
|
*/
|
|
292
|
-
async
|
|
293
|
-
if (!this.device.enableCloudService && this.OpenAPI) {
|
|
294
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} parseStatus enableCloudService: ${this.device.enableCloudService}`);
|
|
295
|
-
} else if (this.BLE) {
|
|
296
|
-
await this.BLEparseStatus();
|
|
297
|
-
} else if (this.OpenAPI && this.platform.config.credentials?.token) {
|
|
298
|
-
await this.openAPIparseStatus();
|
|
299
|
-
} else {
|
|
300
|
-
await this.offlineOff();
|
|
301
|
-
this.debugWarnLog(
|
|
302
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`,
|
|
303
|
-
);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
async BLEparseStatus(): Promise<void> {
|
|
252
|
+
async BLEparseStatus(serviceData: serviceData): Promise<void> {
|
|
308
253
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
|
|
309
254
|
// State
|
|
310
|
-
switch (
|
|
255
|
+
switch (serviceData.power) {
|
|
311
256
|
case true:
|
|
312
|
-
this.On = true;
|
|
257
|
+
this.LightBulb.On = true;
|
|
313
258
|
break;
|
|
314
259
|
default:
|
|
315
|
-
this.On = false;
|
|
260
|
+
this.LightBulb.On = false;
|
|
316
261
|
}
|
|
317
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
262
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
318
263
|
|
|
319
264
|
// Brightness
|
|
320
|
-
this.Brightness = Number(
|
|
321
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
|
|
265
|
+
this.LightBulb.Brightness = Number(serviceData.brightness);
|
|
266
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
322
267
|
|
|
323
268
|
// Color, Hue & Brightness
|
|
324
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${
|
|
325
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${
|
|
326
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${
|
|
269
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${serviceData.red}`);
|
|
270
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${serviceData.green}`);
|
|
271
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${serviceData.blue}`);
|
|
327
272
|
|
|
328
|
-
const [hue, saturation] = rgb2hs(Number(
|
|
273
|
+
const [hue, saturation] = rgb2hs(Number(serviceData.red), Number(serviceData.green), Number(serviceData.blue));
|
|
329
274
|
this.debugLog(
|
|
330
275
|
`${this.device.deviceType}: ${this.accessory.displayName}` +
|
|
331
|
-
` hs: ${JSON.stringify(rgb2hs(Number(
|
|
276
|
+
` hs: ${JSON.stringify(rgb2hs(Number(serviceData.red), Number(serviceData.green), Number(serviceData.blue)))}`,
|
|
332
277
|
);
|
|
333
|
-
this.BLE_Hue = hue;
|
|
334
|
-
this.BLE_Saturation = saturation;
|
|
335
278
|
|
|
336
279
|
// Hue
|
|
337
|
-
this.Hue =
|
|
338
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
280
|
+
this.LightBulb.Hue = hue;
|
|
281
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
339
282
|
|
|
340
283
|
// Saturation
|
|
341
|
-
this.Saturation =
|
|
342
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
|
|
284
|
+
this.LightBulb.Saturation = saturation;
|
|
285
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
343
286
|
|
|
344
287
|
// ColorTemperature
|
|
345
|
-
if (
|
|
346
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${
|
|
347
|
-
this.ColorTemperature =
|
|
288
|
+
if (serviceData.color_temperature) {
|
|
289
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${serviceData.color_temperature}`);
|
|
290
|
+
this.LightBulb.ColorTemperature = serviceData.color_temperature!;
|
|
348
291
|
|
|
349
|
-
this.ColorTemperature = Math.max(Math.min(this.ColorTemperature, 500), 140);
|
|
350
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
292
|
+
this.LightBulb.ColorTemperature = Math.max(Math.min(this.LightBulb.ColorTemperature, 500), 140);
|
|
293
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
351
294
|
}
|
|
352
295
|
}
|
|
353
296
|
|
|
354
|
-
|
|
297
|
+
/**
|
|
298
|
+
* Parse the device status from the SwitchBot OpenAPI
|
|
299
|
+
*/
|
|
300
|
+
async openAPIparseStatus(deviceStatus: deviceStatus): Promise<void> {
|
|
355
301
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
|
|
356
|
-
switch (
|
|
302
|
+
switch (deviceStatus.body.power) {
|
|
357
303
|
case 'on':
|
|
358
|
-
this.On = true;
|
|
304
|
+
this.LightBulb.On = true;
|
|
359
305
|
break;
|
|
360
306
|
default:
|
|
361
|
-
this.On = false;
|
|
307
|
+
this.LightBulb.On = false;
|
|
362
308
|
}
|
|
363
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
309
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
364
310
|
|
|
365
311
|
// Brightness
|
|
366
|
-
this.Brightness = Number(
|
|
367
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
|
|
312
|
+
this.LightBulb.Brightness = Number(deviceStatus.body.brightness);
|
|
313
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
368
314
|
|
|
369
315
|
// Color, Hue & Brightness
|
|
370
|
-
if (
|
|
371
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(
|
|
372
|
-
const [red, green, blue] =
|
|
316
|
+
if (deviceStatus.body.color) {
|
|
317
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(deviceStatus.body.color)}`);
|
|
318
|
+
const [red, green, blue] = deviceStatus.body.color!.split(':');
|
|
373
319
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${JSON.stringify(red)}`);
|
|
374
320
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${JSON.stringify(green)}`);
|
|
375
321
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${JSON.stringify(blue)}`);
|
|
@@ -380,28 +326,36 @@ export class ColorBulb {
|
|
|
380
326
|
);
|
|
381
327
|
|
|
382
328
|
// Hue
|
|
383
|
-
this.Hue = hue;
|
|
384
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
329
|
+
this.LightBulb.Hue = hue;
|
|
330
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
385
331
|
|
|
386
332
|
// Saturation
|
|
387
|
-
this.Saturation = saturation;
|
|
388
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
|
|
333
|
+
this.LightBulb.Saturation = saturation;
|
|
334
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
389
335
|
}
|
|
390
336
|
|
|
391
337
|
// ColorTemperature
|
|
392
|
-
if (!Number.isNaN(
|
|
393
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${
|
|
394
|
-
const mired = Math.round(1000000 /
|
|
338
|
+
if (!Number.isNaN(deviceStatus.body.colorTemperature)) {
|
|
339
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${deviceStatus.body.colorTemperature}`);
|
|
340
|
+
const mired = Math.round(1000000 / deviceStatus.body.colorTemperature!);
|
|
395
341
|
|
|
396
|
-
this.ColorTemperature = Number(mired);
|
|
342
|
+
this.LightBulb.ColorTemperature = Number(mired);
|
|
397
343
|
|
|
398
|
-
this.ColorTemperature = Math.max(Math.min(this.ColorTemperature, 500), 140);
|
|
399
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
344
|
+
this.LightBulb.ColorTemperature = Math.max(Math.min(this.LightBulb.ColorTemperature, 500), 140);
|
|
345
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
400
346
|
}
|
|
401
347
|
|
|
402
|
-
//
|
|
403
|
-
|
|
404
|
-
this.
|
|
348
|
+
// Firmware Version
|
|
349
|
+
const version = deviceStatus.body.version?.toString();
|
|
350
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
|
|
351
|
+
if (deviceStatus.body.version) {
|
|
352
|
+
this.accessory.context.version = version?.replace(/^V|-.*$/g, '');
|
|
353
|
+
this.accessory
|
|
354
|
+
.getService(this.hap.Service.AccessoryInformation)!
|
|
355
|
+
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
|
|
356
|
+
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
357
|
+
.updateValue(this.accessory.context.version);
|
|
358
|
+
}
|
|
405
359
|
}
|
|
406
360
|
|
|
407
361
|
/**
|
|
@@ -436,113 +390,43 @@ export class ColorBulb {
|
|
|
436
390
|
// Start to monitor advertisement packets
|
|
437
391
|
(async () => {
|
|
438
392
|
// Start to monitor advertisement packets
|
|
439
|
-
await switchbot.startScan({
|
|
440
|
-
model: 'u',
|
|
441
|
-
id: this.device.bleMac,
|
|
442
|
-
});
|
|
393
|
+
await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
|
|
443
394
|
// Set an event handler
|
|
444
395
|
switchbot.onadvertisement = (ad: any) => {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
396
|
+
if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
|
|
397
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
|
|
398
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
|
|
448
399
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
449
|
-
this.BLE_ColorTemperature = ad.serviceData.color_temperature;
|
|
450
|
-
this.BLE_Power = ad.serviceData.power;
|
|
451
|
-
this.BLE_On = ad.serviceData.state;
|
|
452
|
-
this.BLE_Red = ad.serviceData.red;
|
|
453
|
-
this.BLE_Green = ad.serviceData.green;
|
|
454
|
-
this.BLE_Blue = ad.serviceData.blue;
|
|
455
|
-
this.BLE_Brightness = ad.serviceData.brightness;
|
|
456
|
-
this.BLE_Delay = ad.serviceData.delay;
|
|
457
400
|
} else {
|
|
458
401
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
459
402
|
}
|
|
460
403
|
};
|
|
461
|
-
// Wait
|
|
404
|
+
// Wait 10 seconds
|
|
462
405
|
await switchbot.wait(this.scanDuration * 1000);
|
|
463
406
|
// Stop to monitor
|
|
464
407
|
await switchbot.stopScan();
|
|
465
408
|
// Update HomeKit
|
|
466
|
-
await this.BLEparseStatus();
|
|
409
|
+
await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
|
|
467
410
|
await this.updateHomeKitCharacteristics();
|
|
468
411
|
})();
|
|
469
|
-
|
|
470
|
-
switchbot
|
|
471
|
-
.startScan({
|
|
472
|
-
model: 'u',
|
|
473
|
-
id: this.device.bleMac,
|
|
474
|
-
})
|
|
475
|
-
.then(async () => {
|
|
476
|
-
// Set an event handler
|
|
477
|
-
switchbot.onadvertisement = async (ad: ad) => {
|
|
478
|
-
this.debugLog(
|
|
479
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
|
|
480
|
-
` BLE Address Found: ${ad.address}`,
|
|
481
|
-
);
|
|
482
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
483
|
-
this.BLE_Power = ad.serviceData.power;
|
|
484
|
-
this.BLE_On = ad.serviceData.state;
|
|
485
|
-
this.BLE_Red = ad.serviceData.red;
|
|
486
|
-
this.BLE_Green = ad.serviceData.green;
|
|
487
|
-
this.BLE_Blue = ad.serviceData.blue;
|
|
488
|
-
this.BLE_ColorTemperature = ad.serviceData.color_temperature;
|
|
489
|
-
this.BLE_Brightness = ad.serviceData.brightness;
|
|
490
|
-
this.BLE_Delay = ad.serviceData.delay;
|
|
491
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
492
|
-
this.debugLog(
|
|
493
|
-
`${this.device.deviceType}: ${this.accessory.displayName} state: ${ad.serviceData.state}, ` +
|
|
494
|
-
`delay: ${ad.serviceData.delay}, timer: ${ad.serviceData.timer}, syncUtcTime: ${ad.serviceData.syncUtcTime} ` +
|
|
495
|
-
`wifiRssi: ${ad.serviceData.wifiRssi}, overload: ${ad.serviceData.overload}, currentPower: ${ad.serviceData.currentPower}`,
|
|
496
|
-
);
|
|
497
|
-
|
|
498
|
-
if (ad.serviceData) {
|
|
499
|
-
this.BLE_IsConnected = true;
|
|
500
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
501
|
-
await this.stopScanning(switchbot);
|
|
502
|
-
} else {
|
|
503
|
-
this.BLE_IsConnected = false;
|
|
504
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
505
|
-
}
|
|
506
|
-
};
|
|
507
|
-
// Wait
|
|
508
|
-
return await sleep(this.scanDuration * 1000);
|
|
509
|
-
})
|
|
510
|
-
.then(async () => {
|
|
511
|
-
// Stop to monitor
|
|
512
|
-
await this.stopScanning(switchbot);
|
|
513
|
-
})
|
|
514
|
-
.catch(async (e: any) => {
|
|
515
|
-
this.apiError(e);
|
|
516
|
-
this.errorLog(
|
|
517
|
-
`${this.device.deviceType}: ${this.accessory.displayName} failed BLERefreshStatus with ${this.device.connectionType}` +
|
|
518
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
519
|
-
);
|
|
520
|
-
await this.BLERefreshConnection(switchbot);
|
|
521
|
-
});
|
|
522
|
-
} else {
|
|
412
|
+
if (switchbot === undefined) {
|
|
523
413
|
await this.BLERefreshConnection(switchbot);
|
|
524
|
-
}
|
|
414
|
+
}
|
|
525
415
|
}
|
|
526
416
|
|
|
527
|
-
async openAPIRefreshStatus() {
|
|
417
|
+
async openAPIRefreshStatus(): Promise<void> {
|
|
528
418
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
|
|
529
419
|
try {
|
|
530
|
-
const { body, statusCode } = await
|
|
531
|
-
headers: this.platform.generateHeaders()
|
|
532
|
-
});
|
|
420
|
+
const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries,
|
|
421
|
+
`${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
|
|
533
422
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
|
|
534
423
|
const deviceStatus: any = await body.json();
|
|
535
424
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
536
425
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
537
426
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
538
|
-
this.
|
|
427
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
539
428
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
540
|
-
this.
|
|
541
|
-
this.OpenAPI_RGB = deviceStatus.body.color;
|
|
542
|
-
this.OpenAPI_Brightness = deviceStatus.body.brightness;
|
|
543
|
-
this.OpenAPI_ColorTemperature = deviceStatus.body.colorTemperature;
|
|
544
|
-
this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
|
|
545
|
-
this.openAPIparseStatus();
|
|
429
|
+
this.openAPIparseStatus(deviceStatus);
|
|
546
430
|
this.updateHomeKitCharacteristics();
|
|
547
431
|
} else {
|
|
548
432
|
this.statusCode(statusCode);
|
|
@@ -592,8 +476,9 @@ export class ColorBulb {
|
|
|
592
476
|
|
|
593
477
|
async BLEpushChanges(): Promise<void> {
|
|
594
478
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`);
|
|
595
|
-
if (this.On !== this.accessory.context.On) {
|
|
596
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges
|
|
479
|
+
if (this.LightBulb.On !== this.accessory.context.On) {
|
|
480
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`
|
|
481
|
+
+ ` On: ${this.LightBulb.On}, OnCached: ${this.accessory.context.On}`);
|
|
597
482
|
const switchbot = await this.platform.connectBLE();
|
|
598
483
|
// Convert to BLE Address
|
|
599
484
|
this.device.bleMac = this.device
|
|
@@ -607,11 +492,11 @@ export class ColorBulb {
|
|
|
607
492
|
id: this.device.bleMac,
|
|
608
493
|
})
|
|
609
494
|
.then(async (device_list: any) => {
|
|
610
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
611
|
-
return await this.
|
|
612
|
-
max: this.
|
|
495
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
496
|
+
return await this.retryBLE({
|
|
497
|
+
max: await this.maxRetryBLE(),
|
|
613
498
|
fn: async () => {
|
|
614
|
-
if (this.On) {
|
|
499
|
+
if (this.LightBulb.On) {
|
|
615
500
|
return await device_list[0].turnOn({ id: this.device.bleMac });
|
|
616
501
|
} else {
|
|
617
502
|
return await device_list[0].turnOff({ id: this.device.bleMac });
|
|
@@ -621,7 +506,9 @@ export class ColorBulb {
|
|
|
621
506
|
})
|
|
622
507
|
.then(() => {
|
|
623
508
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
624
|
-
this.
|
|
509
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
510
|
+
+ `On: ${this.LightBulb.On} sent over BLE, sent successfully`);
|
|
511
|
+
this.LightBulb.On = false;
|
|
625
512
|
})
|
|
626
513
|
.catch(async (e: any) => {
|
|
627
514
|
this.apiError(e);
|
|
@@ -632,27 +519,28 @@ export class ColorBulb {
|
|
|
632
519
|
await this.BLEPushConnection();
|
|
633
520
|
});
|
|
634
521
|
// Push Brightness Update
|
|
635
|
-
if (this.On) {
|
|
522
|
+
if (this.LightBulb.On) {
|
|
636
523
|
await this.BLEpushBrightnessChanges();
|
|
637
524
|
}
|
|
638
525
|
// Push ColorTemperature Update
|
|
639
|
-
if (this.On) {
|
|
526
|
+
if (this.LightBulb.On) {
|
|
640
527
|
await this.BLEpushColorTemperatureChanges();
|
|
641
528
|
}
|
|
642
529
|
// Push Hue & Saturation Update
|
|
643
|
-
if (this.On) {
|
|
530
|
+
if (this.LightBulb.On) {
|
|
644
531
|
await this.BLEpushRGBChanges();
|
|
645
532
|
}
|
|
646
533
|
} else {
|
|
647
534
|
this.debugLog(
|
|
648
|
-
`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges.`
|
|
535
|
+
`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges.`
|
|
536
|
+
+ `On: ${this.LightBulb.On}, ` + `OnCached: ${this.accessory.context.On}`,
|
|
649
537
|
);
|
|
650
538
|
}
|
|
651
539
|
}
|
|
652
540
|
|
|
653
541
|
async BLEpushBrightnessChanges(): Promise<void> {
|
|
654
542
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushBrightnessChanges`);
|
|
655
|
-
if (this.Brightness !== this.accessory.context.Brightness) {
|
|
543
|
+
if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
|
|
656
544
|
const switchbot = await this.platform.connectBLE();
|
|
657
545
|
// Convert to BLE Address
|
|
658
546
|
this.device.bleMac = this.device
|
|
@@ -666,12 +554,12 @@ export class ColorBulb {
|
|
|
666
554
|
id: this.device.bleMac,
|
|
667
555
|
})
|
|
668
556
|
.then(async (device_list: any) => {
|
|
669
|
-
this.infoLog(`${this.accessory.displayName} Target Brightness: ${this.Brightness}`);
|
|
670
|
-
return await device_list[0].setBrightness(this.Brightness);
|
|
557
|
+
this.infoLog(`${this.accessory.displayName} Target Brightness: ${this.LightBulb.Brightness}`);
|
|
558
|
+
return await device_list[0].setBrightness(this.LightBulb.Brightness);
|
|
671
559
|
})
|
|
672
560
|
.then(() => {
|
|
673
561
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
674
|
-
this.On = false;
|
|
562
|
+
this.LightBulb.On = false;
|
|
675
563
|
})
|
|
676
564
|
.catch(async (e: any) => {
|
|
677
565
|
this.apiError(e);
|
|
@@ -684,7 +572,7 @@ export class ColorBulb {
|
|
|
684
572
|
} else {
|
|
685
573
|
this.debugLog(
|
|
686
574
|
`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushBrightnessChanges.` +
|
|
687
|
-
`Brightness: ${this.Brightness}, ` +
|
|
575
|
+
`Brightness: ${this.LightBulb.Brightness}, ` +
|
|
688
576
|
`BrightnessCached: ${this.accessory.context.Brightness}`,
|
|
689
577
|
);
|
|
690
578
|
}
|
|
@@ -692,7 +580,7 @@ export class ColorBulb {
|
|
|
692
580
|
|
|
693
581
|
async BLEpushColorTemperatureChanges(): Promise<void> {
|
|
694
582
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushColorTemperatureChanges`);
|
|
695
|
-
if (this.ColorTemperature !== this.accessory.context.ColorTemperature) {
|
|
583
|
+
if (this.LightBulb.ColorTemperature !== this.accessory.context.ColorTemperature) {
|
|
696
584
|
const switchbot = await this.platform.connectBLE();
|
|
697
585
|
// Convert to BLE Address
|
|
698
586
|
this.device.bleMac = this.device
|
|
@@ -706,12 +594,12 @@ export class ColorBulb {
|
|
|
706
594
|
id: this.device.bleMac,
|
|
707
595
|
})
|
|
708
596
|
.then(async (device_list: any) => {
|
|
709
|
-
this.infoLog(`${this.accessory.displayName} Target ColorTemperature: ${this.ColorTemperature}`);
|
|
710
|
-
return await device_list[0].setColorTemperature(this.ColorTemperature);
|
|
597
|
+
this.infoLog(`${this.accessory.displayName} Target ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
598
|
+
return await device_list[0].setColorTemperature(this.LightBulb.ColorTemperature);
|
|
711
599
|
})
|
|
712
600
|
.then(() => {
|
|
713
601
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
714
|
-
this.On = false;
|
|
602
|
+
this.LightBulb.On = false;
|
|
715
603
|
})
|
|
716
604
|
.catch(async (e: any) => {
|
|
717
605
|
this.apiError(e);
|
|
@@ -724,18 +612,18 @@ export class ColorBulb {
|
|
|
724
612
|
} else {
|
|
725
613
|
this.debugLog(
|
|
726
614
|
`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushColorTemperatureChanges.` +
|
|
727
|
-
`ColorTemperature: ${this.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`,
|
|
615
|
+
`ColorTemperature: ${this.LightBulb.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`,
|
|
728
616
|
);
|
|
729
617
|
}
|
|
730
618
|
}
|
|
731
619
|
|
|
732
620
|
async BLEpushRGBChanges(): Promise<void> {
|
|
733
621
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushRGBChanges`);
|
|
734
|
-
if (this.Hue !== this.accessory.context.Hue || this.Saturation !== this.accessory.context.Saturation) {
|
|
735
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.Hue)}`);
|
|
736
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.Saturation)}`);
|
|
622
|
+
if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
|
|
623
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
|
|
624
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
|
|
737
625
|
|
|
738
|
-
const [red, green, blue] = hs2rgb(Number(this.Hue), Number(this.Saturation));
|
|
626
|
+
const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
|
|
739
627
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
|
|
740
628
|
|
|
741
629
|
const switchbot = await this.platform.connectBLE();
|
|
@@ -751,12 +639,12 @@ export class ColorBulb {
|
|
|
751
639
|
id: this.device.bleMac,
|
|
752
640
|
})
|
|
753
641
|
.then(async (device_list: any) => {
|
|
754
|
-
this.infoLog(`${this.accessory.displayName} Target RGB: ${(this.Brightness, red, green, blue)}`);
|
|
755
|
-
return await device_list[0].setRGB(this.Brightness, red, green, blue);
|
|
642
|
+
this.infoLog(`${this.accessory.displayName} Target RGB: ${(this.LightBulb.Brightness, red, green, blue)}`);
|
|
643
|
+
return await device_list[0].setRGB(this.LightBulb.Brightness, red, green, blue);
|
|
756
644
|
})
|
|
757
645
|
.then(() => {
|
|
758
646
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
759
|
-
this.On = false;
|
|
647
|
+
this.LightBulb.On = false;
|
|
760
648
|
})
|
|
761
649
|
.catch(async (e: any) => {
|
|
762
650
|
this.apiError(e);
|
|
@@ -768,17 +656,17 @@ export class ColorBulb {
|
|
|
768
656
|
});
|
|
769
657
|
} else {
|
|
770
658
|
this.debugLog(
|
|
771
|
-
`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushRGBChanges. Hue: ${this.Hue}, ` +
|
|
772
|
-
`HueCached: ${this.accessory.context.Hue}, Saturation: ${this.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
|
|
659
|
+
`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushRGBChanges. Hue: ${this.LightBulb.Hue}, ` +
|
|
660
|
+
`HueCached: ${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
|
|
773
661
|
);
|
|
774
662
|
}
|
|
775
663
|
}
|
|
776
664
|
|
|
777
665
|
async openAPIpushChanges(): Promise<void> {
|
|
778
666
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
|
|
779
|
-
if (this.On !== this.accessory.context.On) {
|
|
667
|
+
if (this.LightBulb.On !== this.accessory.context.On) {
|
|
780
668
|
let command = '';
|
|
781
|
-
if (this.On) {
|
|
669
|
+
if (this.LightBulb.On) {
|
|
782
670
|
command = 'turnOn';
|
|
783
671
|
} else {
|
|
784
672
|
command = 'turnOff';
|
|
@@ -803,6 +691,8 @@ export class ColorBulb {
|
|
|
803
691
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
804
692
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
805
693
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
694
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
695
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(bodyChange)} sent successfully`);
|
|
806
696
|
} else {
|
|
807
697
|
this.statusCode(statusCode);
|
|
808
698
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -817,30 +707,30 @@ export class ColorBulb {
|
|
|
817
707
|
} else {
|
|
818
708
|
this.debugLog(
|
|
819
709
|
`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges.` +
|
|
820
|
-
`On: ${this.On}, ` +
|
|
710
|
+
`On: ${this.LightBulb.On}, ` +
|
|
821
711
|
`OnCached: ${this.accessory.context.On}`,
|
|
822
712
|
);
|
|
823
713
|
}
|
|
824
714
|
// Push Hue & Saturation Update
|
|
825
|
-
if (this.On) {
|
|
715
|
+
if (this.LightBulb.On) {
|
|
826
716
|
await this.pushHueSaturationChanges();
|
|
827
717
|
}
|
|
828
718
|
// Push ColorTemperature Update
|
|
829
|
-
if (this.On) {
|
|
719
|
+
if (this.LightBulb.On) {
|
|
830
720
|
await this.pushColorTemperatureChanges();
|
|
831
721
|
}
|
|
832
722
|
// Push Brightness Update
|
|
833
|
-
if (this.On) {
|
|
723
|
+
if (this.LightBulb.On) {
|
|
834
724
|
await this.pushBrightnessChanges();
|
|
835
725
|
}
|
|
836
726
|
}
|
|
837
727
|
|
|
838
728
|
async pushHueSaturationChanges(): Promise<void> {
|
|
839
729
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushHueSaturationChanges`);
|
|
840
|
-
if (this.Hue !== this.accessory.context.Hue || this.Saturation !== this.accessory.context.Saturation) {
|
|
841
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.Hue)}`);
|
|
842
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.Saturation)}`);
|
|
843
|
-
const [red, green, blue] = hs2rgb(Number(this.Hue), Number(this.Saturation));
|
|
730
|
+
if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
|
|
731
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
|
|
732
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
|
|
733
|
+
const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
|
|
844
734
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
|
|
845
735
|
const bodyChange = JSON.stringify({
|
|
846
736
|
command: 'setColor',
|
|
@@ -862,6 +752,8 @@ export class ColorBulb {
|
|
|
862
752
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
863
753
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
864
754
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
755
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
756
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(deviceStatus)} sent successfully`);
|
|
865
757
|
} else {
|
|
866
758
|
this.statusCode(statusCode);
|
|
867
759
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -875,17 +767,17 @@ export class ColorBulb {
|
|
|
875
767
|
}
|
|
876
768
|
} else {
|
|
877
769
|
this.debugLog(
|
|
878
|
-
`${this.device.deviceType}: ${this.accessory.displayName} No pushHueSaturationChanges. Hue: ${this.Hue}, ` +
|
|
879
|
-
`HueCached: ${this.accessory.context.Hue}, Saturation: ${this.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
|
|
770
|
+
`${this.device.deviceType}: ${this.accessory.displayName} No pushHueSaturationChanges. Hue: ${this.LightBulb.Hue}, ` +
|
|
771
|
+
`HueCached: ${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
|
|
880
772
|
);
|
|
881
773
|
}
|
|
882
774
|
}
|
|
883
775
|
|
|
884
776
|
async pushColorTemperatureChanges(): Promise<void> {
|
|
885
777
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushColorTemperatureChanges`);
|
|
886
|
-
if (this.ColorTemperature !== this.accessory.context.ColorTemperature) {
|
|
887
|
-
const kelvin = Math.round(1000000 / Number(this.ColorTemperature));
|
|
888
|
-
this.
|
|
778
|
+
if (this.LightBulb.ColorTemperature !== this.accessory.context.ColorTemperature) {
|
|
779
|
+
const kelvin = Math.round(1000000 / Number(this.LightBulb.ColorTemperature));
|
|
780
|
+
this.accessory.context.kelvin = kelvin;
|
|
889
781
|
const bodyChange = JSON.stringify({
|
|
890
782
|
command: 'setColorTemperature',
|
|
891
783
|
parameter: `${kelvin}`,
|
|
@@ -906,31 +798,29 @@ export class ColorBulb {
|
|
|
906
798
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
907
799
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
908
800
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
801
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
802
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(deviceStatus)} sent successfully`);
|
|
909
803
|
} else {
|
|
910
804
|
this.statusCode(statusCode);
|
|
911
805
|
this.statusCode(deviceStatus.statusCode);
|
|
912
806
|
}
|
|
913
807
|
} catch (e: any) {
|
|
914
808
|
this.apiError(e);
|
|
915
|
-
this.errorLog(
|
|
916
|
-
|
|
917
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
918
|
-
);
|
|
809
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed pushColorTemperatureChanges with ${this.device.connectionType}`
|
|
810
|
+
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
919
811
|
}
|
|
920
812
|
} else {
|
|
921
|
-
this.debugLog(
|
|
922
|
-
|
|
923
|
-
`ColorTemperature: ${this.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`,
|
|
924
|
-
);
|
|
813
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushColorTemperatureChanges.`
|
|
814
|
+
+ `ColorTemperature: ${this.LightBulb.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`);
|
|
925
815
|
}
|
|
926
816
|
}
|
|
927
817
|
|
|
928
818
|
async pushBrightnessChanges(): Promise<void> {
|
|
929
819
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushBrightnessChanges`);
|
|
930
|
-
if (this.Brightness !== this.accessory.context.Brightness) {
|
|
820
|
+
if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
|
|
931
821
|
const bodyChange = JSON.stringify({
|
|
932
822
|
command: 'setBrightness',
|
|
933
|
-
parameter: `${this.Brightness}`,
|
|
823
|
+
parameter: `${this.LightBulb.Brightness}`,
|
|
934
824
|
commandType: 'command',
|
|
935
825
|
});
|
|
936
826
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
|
|
@@ -948,6 +838,8 @@ export class ColorBulb {
|
|
|
948
838
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
949
839
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
950
840
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
841
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
842
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(deviceStatus)} sent successfully`);
|
|
951
843
|
} else {
|
|
952
844
|
this.statusCode(statusCode);
|
|
953
845
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -962,7 +854,7 @@ export class ColorBulb {
|
|
|
962
854
|
} else {
|
|
963
855
|
this.debugLog(
|
|
964
856
|
`${this.device.deviceType}: ${this.accessory.displayName} No pushBrightnessChanges.` +
|
|
965
|
-
`Brightness: ${this.Brightness}, ` +
|
|
857
|
+
`Brightness: ${this.LightBulb.Brightness}, ` +
|
|
966
858
|
`BrightnessCached: ${this.accessory.context.Brightness}`,
|
|
967
859
|
);
|
|
968
860
|
}
|
|
@@ -972,13 +864,13 @@ export class ColorBulb {
|
|
|
972
864
|
* Handle requests to set the value of the "On" characteristic
|
|
973
865
|
*/
|
|
974
866
|
async OnSet(value: CharacteristicValue): Promise<void> {
|
|
975
|
-
if (this.On === this.accessory.context.On) {
|
|
867
|
+
if (this.LightBulb.On === this.accessory.context.On) {
|
|
976
868
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set On: ${value}`);
|
|
977
869
|
} else {
|
|
978
870
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set On: ${value}`);
|
|
979
871
|
}
|
|
980
872
|
|
|
981
|
-
this.On = value;
|
|
873
|
+
this.LightBulb.On = value;
|
|
982
874
|
this.doColorBulbUpdate.next();
|
|
983
875
|
}
|
|
984
876
|
|
|
@@ -986,15 +878,15 @@ export class ColorBulb {
|
|
|
986
878
|
* Handle requests to set the value of the "Brightness" characteristic
|
|
987
879
|
*/
|
|
988
880
|
async BrightnessSet(value: CharacteristicValue): Promise<void> {
|
|
989
|
-
if (this.Brightness === this.accessory.context.Brightness) {
|
|
881
|
+
if (this.LightBulb.Brightness === this.accessory.context.Brightness) {
|
|
990
882
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Brightness: ${value}`);
|
|
991
|
-
} else if (this.On) {
|
|
883
|
+
} else if (this.LightBulb.On) {
|
|
992
884
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
|
|
993
885
|
} else {
|
|
994
886
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
|
|
995
887
|
}
|
|
996
888
|
|
|
997
|
-
this.Brightness = value;
|
|
889
|
+
this.LightBulb.Brightness = value;
|
|
998
890
|
this.doColorBulbUpdate.next();
|
|
999
891
|
}
|
|
1000
892
|
|
|
@@ -1002,30 +894,32 @@ export class ColorBulb {
|
|
|
1002
894
|
* Handle requests to set the value of the "ColorTemperature" characteristic
|
|
1003
895
|
*/
|
|
1004
896
|
async ColorTemperatureSet(value: CharacteristicValue): Promise<void> {
|
|
1005
|
-
if (this.ColorTemperature === this.accessory.context.ColorTemperature) {
|
|
897
|
+
if (this.LightBulb.ColorTemperature === this.accessory.context.ColorTemperature) {
|
|
1006
898
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set ColorTemperature: ${value}`);
|
|
1007
|
-
} else if (this.On) {
|
|
899
|
+
} else if (this.LightBulb.On) {
|
|
1008
900
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
|
|
1009
901
|
} else {
|
|
1010
902
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
|
|
1011
903
|
}
|
|
1012
904
|
|
|
905
|
+
const minKelvin = 2000;
|
|
906
|
+
const maxKelvin = 9000;
|
|
1013
907
|
// Convert mired to kelvin to nearest 100 (SwitchBot seems to need this)
|
|
1014
908
|
const kelvin = Math.round(1000000 / Number(value) / 100) * 100;
|
|
1015
909
|
|
|
1016
910
|
// Check and increase/decrease kelvin to range of device
|
|
1017
|
-
const k = Math.min(Math.max(kelvin,
|
|
911
|
+
const k = Math.min(Math.max(kelvin, minKelvin), maxKelvin);
|
|
1018
912
|
|
|
1019
|
-
if (!this.accessory.context.On || this.
|
|
913
|
+
if (!this.accessory.context.On || this.accessory.context.kelvin === k) {
|
|
1020
914
|
return;
|
|
1021
915
|
}
|
|
1022
916
|
|
|
1023
917
|
// Updating the hue/sat to the corresponding values mimics native adaptive lighting
|
|
1024
918
|
const hs = m2hs(value);
|
|
1025
|
-
this.
|
|
1026
|
-
this.
|
|
919
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, hs[0]);
|
|
920
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, hs[1]);
|
|
1027
921
|
|
|
1028
|
-
this.ColorTemperature = value;
|
|
922
|
+
this.LightBulb.ColorTemperature = value;
|
|
1029
923
|
this.doColorBulbUpdate.next();
|
|
1030
924
|
}
|
|
1031
925
|
|
|
@@ -1033,17 +927,17 @@ export class ColorBulb {
|
|
|
1033
927
|
* Handle requests to set the value of the "Hue" characteristic
|
|
1034
928
|
*/
|
|
1035
929
|
async HueSet(value: CharacteristicValue): Promise<void> {
|
|
1036
|
-
if (this.Hue === this.accessory.context.Hue) {
|
|
930
|
+
if (this.LightBulb.Hue === this.accessory.context.Hue) {
|
|
1037
931
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Hue: ${value}`);
|
|
1038
|
-
} else if (this.On) {
|
|
932
|
+
} else if (this.LightBulb.On) {
|
|
1039
933
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
|
|
1040
934
|
} else {
|
|
1041
935
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
|
|
1042
936
|
}
|
|
1043
937
|
|
|
1044
|
-
this.
|
|
938
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
|
|
1045
939
|
|
|
1046
|
-
this.Hue = value;
|
|
940
|
+
this.LightBulb.Hue = value;
|
|
1047
941
|
this.doColorBulbUpdate.next();
|
|
1048
942
|
}
|
|
1049
943
|
|
|
@@ -1051,60 +945,61 @@ export class ColorBulb {
|
|
|
1051
945
|
* Handle requests to set the value of the "Saturation" characteristic
|
|
1052
946
|
*/
|
|
1053
947
|
async SaturationSet(value: CharacteristicValue): Promise<void> {
|
|
1054
|
-
if (this.Saturation === this.accessory.context.Saturation) {
|
|
948
|
+
if (this.LightBulb.Saturation === this.accessory.context.Saturation) {
|
|
1055
949
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Saturation: ${value}`);
|
|
1056
|
-
} else if (this.On) {
|
|
950
|
+
} else if (this.LightBulb.On) {
|
|
1057
951
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
|
|
1058
952
|
} else {
|
|
1059
953
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
|
|
1060
954
|
}
|
|
1061
955
|
|
|
1062
|
-
this.
|
|
956
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
|
|
1063
957
|
|
|
1064
|
-
this.Saturation = value;
|
|
958
|
+
this.LightBulb.Saturation = value;
|
|
1065
959
|
this.doColorBulbUpdate.next();
|
|
1066
960
|
}
|
|
1067
961
|
|
|
1068
962
|
async updateHomeKitCharacteristics(): Promise<void> {
|
|
1069
963
|
// On
|
|
1070
|
-
if (this.On === undefined) {
|
|
1071
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
964
|
+
if (this.LightBulb.On === undefined) {
|
|
965
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
1072
966
|
} else {
|
|
1073
|
-
this.accessory.context.On = this.On;
|
|
1074
|
-
this.
|
|
1075
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
967
|
+
this.accessory.context.On = this.LightBulb.On;
|
|
968
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, this.LightBulb.On);
|
|
969
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.LightBulb.On}`);
|
|
1076
970
|
}
|
|
1077
971
|
// Brightness
|
|
1078
|
-
if (this.Brightness === undefined) {
|
|
1079
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
|
|
972
|
+
if (this.LightBulb.Brightness === undefined) {
|
|
973
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
1080
974
|
} else {
|
|
1081
|
-
this.accessory.context.Brightness = this.Brightness;
|
|
1082
|
-
this.
|
|
1083
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.Brightness}`);
|
|
975
|
+
this.accessory.context.Brightness = this.LightBulb.Brightness;
|
|
976
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, this.LightBulb.Brightness);
|
|
977
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.LightBulb.Brightness}`);
|
|
1084
978
|
}
|
|
1085
979
|
// ColorTemperature
|
|
1086
|
-
if (this.ColorTemperature === undefined) {
|
|
1087
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
980
|
+
if (this.LightBulb.ColorTemperature === undefined) {
|
|
981
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
1088
982
|
} else {
|
|
1089
|
-
this.accessory.context.ColorTemperature = this.ColorTemperature;
|
|
1090
|
-
this.
|
|
1091
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
983
|
+
this.accessory.context.ColorTemperature = this.LightBulb.ColorTemperature;
|
|
984
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, this.LightBulb.ColorTemperature);
|
|
985
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
986
|
+
+ ` ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
1092
987
|
}
|
|
1093
988
|
// Hue
|
|
1094
|
-
if (this.Hue === undefined) {
|
|
1095
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
989
|
+
if (this.LightBulb.Hue === undefined) {
|
|
990
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
1096
991
|
} else {
|
|
1097
|
-
this.accessory.context.Hue = this.Hue;
|
|
1098
|
-
this.
|
|
1099
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.Hue}`);
|
|
992
|
+
this.accessory.context.Hue = this.LightBulb.Hue;
|
|
993
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, this.LightBulb.Hue);
|
|
994
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.LightBulb.Hue}`);
|
|
1100
995
|
}
|
|
1101
996
|
// Saturation
|
|
1102
|
-
if (this.Saturation === undefined) {
|
|
1103
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
|
|
997
|
+
if (this.LightBulb.Saturation === undefined) {
|
|
998
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
1104
999
|
} else {
|
|
1105
|
-
this.accessory.context.Saturation = this.Saturation;
|
|
1106
|
-
this.
|
|
1107
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Saturation: ${this.Saturation}`);
|
|
1000
|
+
this.accessory.context.Saturation = this.LightBulb.Saturation;
|
|
1001
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, this.LightBulb.Saturation);
|
|
1002
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Saturation: ${this.LightBulb.Saturation}`);
|
|
1108
1003
|
}
|
|
1109
1004
|
}
|
|
1110
1005
|
|
|
@@ -1118,35 +1013,6 @@ export class ColorBulb {
|
|
|
1118
1013
|
}
|
|
1119
1014
|
}
|
|
1120
1015
|
|
|
1121
|
-
async stopScanning(switchbot: any) {
|
|
1122
|
-
switchbot.stopScan();
|
|
1123
|
-
if (this.BLE_IsConnected) {
|
|
1124
|
-
await this.BLEparseStatus();
|
|
1125
|
-
await this.updateHomeKitCharacteristics();
|
|
1126
|
-
} else {
|
|
1127
|
-
await this.BLERefreshConnection(switchbot);
|
|
1128
|
-
}
|
|
1129
|
-
}
|
|
1130
|
-
|
|
1131
|
-
async getCustomBLEAddress(switchbot: any) {
|
|
1132
|
-
if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
|
|
1133
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} customBLEaddress: ${this.device.customBLEaddress}`);
|
|
1134
|
-
(async () => {
|
|
1135
|
-
// Start to monitor advertisement packets
|
|
1136
|
-
await switchbot.startScan({
|
|
1137
|
-
model: 'u',
|
|
1138
|
-
});
|
|
1139
|
-
// Set an event handler
|
|
1140
|
-
switchbot.onadvertisement = (ad: any) => {
|
|
1141
|
-
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} ad: ${JSON.stringify(ad, null, ' ')}`);
|
|
1142
|
-
};
|
|
1143
|
-
await sleep(10000);
|
|
1144
|
-
// Stop to monitor
|
|
1145
|
-
switchbot.stopScan();
|
|
1146
|
-
})();
|
|
1147
|
-
}
|
|
1148
|
-
}
|
|
1149
|
-
|
|
1150
1016
|
async BLEPushConnection() {
|
|
1151
1017
|
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
1152
1018
|
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Push Changes`);
|
|
@@ -1163,284 +1029,27 @@ export class ColorBulb {
|
|
|
1163
1029
|
}
|
|
1164
1030
|
}
|
|
1165
1031
|
|
|
1166
|
-
async retry({ max, fn }: { max: number; fn: { (): any; (): Promise<any> } }): Promise<null> {
|
|
1167
|
-
return fn().catch(async (e: any) => {
|
|
1168
|
-
if (max === 0) {
|
|
1169
|
-
throw e;
|
|
1170
|
-
}
|
|
1171
|
-
this.infoLog(e);
|
|
1172
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Retrying`);
|
|
1173
|
-
await sleep(1000);
|
|
1174
|
-
return this.retry({ max: max - 1, fn });
|
|
1175
|
-
});
|
|
1176
|
-
}
|
|
1177
|
-
|
|
1178
|
-
maxRetry(): number {
|
|
1179
|
-
if (this.device.maxRetry) {
|
|
1180
|
-
return this.device.maxRetry;
|
|
1181
|
-
} else {
|
|
1182
|
-
return 5;
|
|
1183
|
-
}
|
|
1184
|
-
}
|
|
1185
|
-
|
|
1186
1032
|
minStep(device: device & devicesConfig): number {
|
|
1033
|
+
let set_minStep: number;
|
|
1187
1034
|
if (device.colorbulb?.set_minStep) {
|
|
1188
|
-
|
|
1035
|
+
set_minStep = device.colorbulb?.set_minStep;
|
|
1189
1036
|
} else {
|
|
1190
|
-
|
|
1191
|
-
}
|
|
1192
|
-
return this.set_minStep;
|
|
1193
|
-
}
|
|
1194
|
-
|
|
1195
|
-
async scan(device: device & devicesConfig): Promise<void> {
|
|
1196
|
-
if (device.scanDuration) {
|
|
1197
|
-
this.scanDuration = this.accessory.context.scanDuration = device.scanDuration;
|
|
1198
|
-
if (this.BLE) {
|
|
1199
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config scanDuration: ${this.scanDuration}`);
|
|
1200
|
-
}
|
|
1201
|
-
} else {
|
|
1202
|
-
this.scanDuration = this.accessory.context.scanDuration = 1;
|
|
1203
|
-
if (this.BLE) {
|
|
1204
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default scanDuration: ${this.scanDuration}`);
|
|
1205
|
-
}
|
|
1206
|
-
}
|
|
1207
|
-
}
|
|
1208
|
-
|
|
1209
|
-
async statusCode(statusCode: number): Promise<void> {
|
|
1210
|
-
switch (statusCode) {
|
|
1211
|
-
case 151:
|
|
1212
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
|
|
1213
|
-
break;
|
|
1214
|
-
case 152:
|
|
1215
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
|
|
1216
|
-
break;
|
|
1217
|
-
case 160:
|
|
1218
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
|
|
1219
|
-
break;
|
|
1220
|
-
case 161:
|
|
1221
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
|
|
1222
|
-
this.offlineOff();
|
|
1223
|
-
break;
|
|
1224
|
-
case 171:
|
|
1225
|
-
this.errorLog(
|
|
1226
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
|
|
1227
|
-
`Hub: ${this.device.hubDeviceId}`,
|
|
1228
|
-
);
|
|
1229
|
-
this.offlineOff();
|
|
1230
|
-
break;
|
|
1231
|
-
case 190:
|
|
1232
|
-
this.errorLog(
|
|
1233
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
|
|
1234
|
-
` Or command format is invalid, statusCode: ${statusCode}`,
|
|
1235
|
-
);
|
|
1236
|
-
break;
|
|
1237
|
-
case 100:
|
|
1238
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
|
|
1239
|
-
break;
|
|
1240
|
-
case 200:
|
|
1241
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
|
|
1242
|
-
break;
|
|
1243
|
-
case 400:
|
|
1244
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
|
|
1245
|
-
+ `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
|
|
1246
|
-
break;
|
|
1247
|
-
case 401:
|
|
1248
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
|
|
1249
|
-
+ `but the request has not been authenticated, statusCode: ${statusCode}`);
|
|
1250
|
-
break;
|
|
1251
|
-
case 403:
|
|
1252
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
|
|
1253
|
-
+ `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
|
|
1254
|
-
break;
|
|
1255
|
-
case 404:
|
|
1256
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
|
|
1257
|
-
+ `statusCode: ${statusCode}`);
|
|
1258
|
-
break;
|
|
1259
|
-
case 406:
|
|
1260
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
|
|
1261
|
-
+ `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
|
|
1262
|
-
break;
|
|
1263
|
-
case 415:
|
|
1264
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
|
|
1265
|
-
+ `header that is not supported by the server, statusCode: ${statusCode}`);
|
|
1266
|
-
break;
|
|
1267
|
-
case 422:
|
|
1268
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
|
|
1269
|
-
+ `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
|
|
1270
|
-
break;
|
|
1271
|
-
case 429:
|
|
1272
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
|
|
1273
|
-
+ `requests allowed for a given time window, statusCode: ${statusCode}`);
|
|
1274
|
-
break;
|
|
1275
|
-
case 500:
|
|
1276
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
|
|
1277
|
-
+ `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
|
|
1278
|
-
break;
|
|
1279
|
-
default:
|
|
1280
|
-
this.infoLog(
|
|
1281
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
|
|
1282
|
-
`${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`,
|
|
1283
|
-
);
|
|
1037
|
+
set_minStep = 1;
|
|
1284
1038
|
}
|
|
1039
|
+
return set_minStep;
|
|
1285
1040
|
}
|
|
1286
1041
|
|
|
1287
1042
|
async offlineOff(): Promise<void> {
|
|
1288
1043
|
if (this.device.offline) {
|
|
1289
|
-
|
|
1290
|
-
await this.updateHomeKitCharacteristics();
|
|
1044
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, false);
|
|
1291
1045
|
}
|
|
1292
1046
|
}
|
|
1293
1047
|
|
|
1294
1048
|
apiError(e: any): void {
|
|
1295
|
-
this.
|
|
1296
|
-
this.
|
|
1297
|
-
this.
|
|
1298
|
-
this.
|
|
1299
|
-
this.
|
|
1300
|
-
}
|
|
1301
|
-
|
|
1302
|
-
async deviceContext(): Promise<void> {
|
|
1303
|
-
if (this.On === undefined) {
|
|
1304
|
-
this.On = false;
|
|
1305
|
-
} else {
|
|
1306
|
-
this.On = this.accessory.context.On;
|
|
1307
|
-
}
|
|
1308
|
-
if (this.Hue === undefined) {
|
|
1309
|
-
this.Hue = 0;
|
|
1310
|
-
} else {
|
|
1311
|
-
this.Hue = this.accessory.context.Hue;
|
|
1312
|
-
}
|
|
1313
|
-
if (this.Brightness === undefined) {
|
|
1314
|
-
this.Brightness = 0;
|
|
1315
|
-
} else {
|
|
1316
|
-
this.Brightness = this.accessory.context.Brightness;
|
|
1317
|
-
}
|
|
1318
|
-
if (this.Saturation === undefined) {
|
|
1319
|
-
this.Saturation = 0;
|
|
1320
|
-
} else {
|
|
1321
|
-
this.Saturation = this.accessory.context.Saturation;
|
|
1322
|
-
}
|
|
1323
|
-
if (this.ColorTemperature === undefined) {
|
|
1324
|
-
this.ColorTemperature = 140;
|
|
1325
|
-
} else {
|
|
1326
|
-
this.ColorTemperature = this.accessory.context.ColorTemperature;
|
|
1327
|
-
}
|
|
1328
|
-
this.minKelvin = 2000;
|
|
1329
|
-
this.maxKelvin = 9000;
|
|
1330
|
-
if (this.FirmwareRevision === undefined) {
|
|
1331
|
-
this.FirmwareRevision = this.platform.version;
|
|
1332
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
1333
|
-
}
|
|
1334
|
-
}
|
|
1335
|
-
|
|
1336
|
-
async refreshRate(device: device & devicesConfig): Promise<void> {
|
|
1337
|
-
if (device.refreshRate) {
|
|
1338
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate;
|
|
1339
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
|
|
1340
|
-
} else if (this.platform.config.options!.refreshRate) {
|
|
1341
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = this.platform.config.options!.refreshRate;
|
|
1342
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
|
|
1343
|
-
}
|
|
1344
|
-
}
|
|
1345
|
-
|
|
1346
|
-
async deviceConfig(device: device & devicesConfig): Promise<void> {
|
|
1347
|
-
let config = {};
|
|
1348
|
-
if (device.colorbulb) {
|
|
1349
|
-
config = device.colorbulb;
|
|
1350
|
-
}
|
|
1351
|
-
if (device.connectionType !== undefined) {
|
|
1352
|
-
config['connectionType'] = device.connectionType;
|
|
1353
|
-
}
|
|
1354
|
-
if (device.external !== undefined) {
|
|
1355
|
-
config['external'] = device.external;
|
|
1356
|
-
}
|
|
1357
|
-
if (device.logging !== undefined) {
|
|
1358
|
-
config['logging'] = device.logging;
|
|
1359
|
-
}
|
|
1360
|
-
if (device.refreshRate !== undefined) {
|
|
1361
|
-
config['refreshRate'] = device.refreshRate;
|
|
1362
|
-
}
|
|
1363
|
-
if (device.scanDuration !== undefined) {
|
|
1364
|
-
config['scanDuration'] = device.scanDuration;
|
|
1365
|
-
}
|
|
1366
|
-
if (device.offline !== undefined) {
|
|
1367
|
-
config['offline'] = device.offline;
|
|
1368
|
-
}
|
|
1369
|
-
if (device.maxRetry !== undefined) {
|
|
1370
|
-
config['maxRetry'] = device.maxRetry;
|
|
1371
|
-
}
|
|
1372
|
-
if (device.webhook !== undefined) {
|
|
1373
|
-
config['webhook'] = device.webhook;
|
|
1374
|
-
}
|
|
1375
|
-
if (Object.entries(config).length !== 0) {
|
|
1376
|
-
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
|
|
1377
|
-
}
|
|
1378
|
-
}
|
|
1379
|
-
|
|
1380
|
-
async deviceLogs(device: device & devicesConfig): Promise<void> {
|
|
1381
|
-
if (this.platform.debugMode) {
|
|
1382
|
-
this.deviceLogging = this.accessory.context.logging = 'debugMode';
|
|
1383
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
|
|
1384
|
-
} else if (device.logging) {
|
|
1385
|
-
this.deviceLogging = this.accessory.context.logging = device.logging;
|
|
1386
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
|
|
1387
|
-
} else if (this.platform.config.options?.logging) {
|
|
1388
|
-
this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
|
|
1389
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
|
|
1390
|
-
} else {
|
|
1391
|
-
this.deviceLogging = this.accessory.context.logging = 'standard';
|
|
1392
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
|
|
1393
|
-
}
|
|
1394
|
-
}
|
|
1395
|
-
|
|
1396
|
-
/**
|
|
1397
|
-
* Logging for Device
|
|
1398
|
-
*/
|
|
1399
|
-
infoLog(...log: any[]): void {
|
|
1400
|
-
if (this.enablingDeviceLogging()) {
|
|
1401
|
-
this.platform.log.info(String(...log));
|
|
1402
|
-
}
|
|
1403
|
-
}
|
|
1404
|
-
|
|
1405
|
-
warnLog(...log: any[]): void {
|
|
1406
|
-
if (this.enablingDeviceLogging()) {
|
|
1407
|
-
this.platform.log.warn(String(...log));
|
|
1408
|
-
}
|
|
1409
|
-
}
|
|
1410
|
-
|
|
1411
|
-
debugWarnLog(...log: any[]): void {
|
|
1412
|
-
if (this.enablingDeviceLogging()) {
|
|
1413
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
1414
|
-
this.platform.log.warn('[DEBUG]', String(...log));
|
|
1415
|
-
}
|
|
1416
|
-
}
|
|
1417
|
-
}
|
|
1418
|
-
|
|
1419
|
-
errorLog(...log: any[]): void {
|
|
1420
|
-
if (this.enablingDeviceLogging()) {
|
|
1421
|
-
this.platform.log.error(String(...log));
|
|
1422
|
-
}
|
|
1423
|
-
}
|
|
1424
|
-
|
|
1425
|
-
debugErrorLog(...log: any[]): void {
|
|
1426
|
-
if (this.enablingDeviceLogging()) {
|
|
1427
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
1428
|
-
this.platform.log.error('[DEBUG]', String(...log));
|
|
1429
|
-
}
|
|
1430
|
-
}
|
|
1431
|
-
}
|
|
1432
|
-
|
|
1433
|
-
debugLog(...log: any[]): void {
|
|
1434
|
-
if (this.enablingDeviceLogging()) {
|
|
1435
|
-
if (this.deviceLogging === 'debug') {
|
|
1436
|
-
this.platform.log.info('[DEBUG]', String(...log));
|
|
1437
|
-
} else {
|
|
1438
|
-
this.platform.log.debug(String(...log));
|
|
1439
|
-
}
|
|
1440
|
-
}
|
|
1441
|
-
}
|
|
1442
|
-
|
|
1443
|
-
enablingDeviceLogging(): boolean {
|
|
1444
|
-
return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
|
|
1049
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, e);
|
|
1050
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, e);
|
|
1051
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, e);
|
|
1052
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, e);
|
|
1053
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, e);
|
|
1445
1054
|
}
|
|
1446
1055
|
}
|