@switchbot/homebridge-switchbot 3.5.0-beta.9 → 3.5.0
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 +166 -24
- package/dist/device/blindtilt.d.ts +21 -96
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +439 -817
- package/dist/device/blindtilt.js.map +1 -1
- package/dist/device/bot.d.ts +27 -72
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +835 -865
- package/dist/device/bot.js.map +1 -1
- package/dist/device/ceilinglight.d.ts +15 -69
- package/dist/device/ceilinglight.d.ts.map +1 -1
- package/dist/device/ceilinglight.js +287 -653
- package/dist/device/ceilinglight.js.map +1 -1
- package/dist/device/colorbulb.d.ts +15 -76
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +354 -732
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.d.ts +14 -66
- package/dist/device/contact.d.ts.map +1 -1
- package/dist/device/contact.js +268 -576
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts +18 -89
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +431 -851
- package/dist/device/curtain.js.map +1 -1
- package/dist/device/device.d.ts +60 -0
- package/dist/device/device.d.ts.map +1 -0
- package/dist/device/device.js +739 -0
- package/dist/device/device.js.map +1 -0
- package/dist/device/fan.d.ts +63 -0
- package/dist/device/fan.d.ts.map +1 -0
- package/dist/device/fan.js +698 -0
- package/dist/device/fan.js.map +1 -0
- package/dist/device/hub.d.ts +15 -60
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +257 -631
- 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 +266 -629
- package/dist/device/humidifier.js.map +1 -1
- package/dist/device/iosensor.d.ts +12 -64
- package/dist/device/iosensor.d.ts.map +1 -1
- package/dist/device/iosensor.js +215 -615
- package/dist/device/iosensor.js.map +1 -1
- package/dist/device/lightstrip.d.ts +12 -70
- package/dist/device/lightstrip.d.ts.map +1 -1
- package/dist/device/lightstrip.js +336 -645
- package/dist/device/lightstrip.js.map +1 -1
- package/dist/device/lock.d.ts +17 -63
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +290 -595
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.d.ts +15 -64
- package/dist/device/meter.d.ts.map +1 -1
- package/dist/device/meter.js +211 -608
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.d.ts +15 -65
- package/dist/device/meterplus.d.ts.map +1 -1
- package/dist/device/meterplus.js +205 -615
- package/dist/device/meterplus.js.map +1 -1
- package/dist/device/motion.d.ts +12 -69
- package/dist/device/motion.d.ts.map +1 -1
- package/dist/device/motion.js +202 -563
- package/dist/device/motion.js.map +1 -1
- package/dist/device/plug.d.ts +10 -57
- package/dist/device/plug.d.ts.map +1 -1
- package/dist/device/plug.js +125 -484
- package/dist/device/plug.js.map +1 -1
- package/dist/device/robotvacuumcleaner.d.ts +13 -63
- package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
- package/dist/device/robotvacuumcleaner.js +233 -549
- package/dist/device/robotvacuumcleaner.js.map +1 -1
- package/dist/device/waterdetector.d.ts +11 -63
- package/dist/device/waterdetector.d.ts.map +1 -1
- package/dist/device/waterdetector.js +170 -493
- 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 +10 -50
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js +340 -468
- 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 +105 -319
- 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 +44 -285
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts +7 -43
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +92 -350
- 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 +369 -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 +118 -362
- 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 +438 -570
- 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 +91 -339
- 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 +45 -285
- 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 +47 -291
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/platform.d.ts +22 -8
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +342 -191
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +64 -17
- 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 +20 -16
- package/src/custom.d.ts +2 -1
- package/src/device/blindtilt.ts +472 -888
- package/src/device/bot.ts +893 -968
- package/src/device/ceilinglight.ts +304 -709
- package/src/device/colorbulb.ts +370 -803
- package/src/device/contact.ts +301 -611
- package/src/device/curtain.ts +460 -908
- package/src/device/device.ts +755 -0
- package/src/device/fan.ts +749 -0
- package/src/device/hub.ts +294 -664
- package/src/device/humidifier.ts +299 -696
- package/src/device/iosensor.ts +251 -644
- package/src/device/lightstrip.ts +362 -712
- package/src/device/lock.ts +328 -653
- package/src/device/meter.ts +247 -637
- package/src/device/meterplus.ts +240 -644
- package/src/device/motion.ts +230 -598
- package/src/device/plug.ts +139 -525
- package/src/device/robotvacuumcleaner.ts +258 -593
- package/src/device/waterdetector.ts +191 -522
- 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 +370 -527
- package/src/irdevice/airpurifier.ts +132 -356
- package/src/irdevice/camera.ts +58 -311
- package/src/irdevice/fan.ts +109 -379
- package/src/irdevice/irdevice.ts +382 -0
- package/src/irdevice/light.ts +157 -412
- package/src/irdevice/other.ts +507 -648
- package/src/irdevice/tv.ts +121 -375
- package/src/irdevice/vacuumcleaner.ts +59 -311
- package/src/irdevice/waterheater.ts +61 -320
- package/src/platform.ts +395 -259
- package/src/settings.ts +118 -609
- package/src/utils.ts +642 -1
- package/.github/npm-version-script.cjs +0 -81
- package/src/device/waterdetector.json +0 -11
package/src/device/colorbulb.ts
CHANGED
|
@@ -1,152 +1,110 @@
|
|
|
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
|
-
this.deviceContext();
|
|
96
|
-
this.deviceConfig(device);
|
|
97
49
|
|
|
98
50
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
99
51
|
this.doColorBulbUpdate = new Subject();
|
|
100
52
|
this.colorBulbUpdateInProgress = false;
|
|
101
53
|
|
|
102
|
-
//
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
.
|
|
108
|
-
.
|
|
109
|
-
.
|
|
110
|
-
.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
(this.
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
this.accessory.
|
|
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}`);
|
|
54
|
+
// Initialize LightBulb property
|
|
55
|
+
accessory.context.LightBulb = accessory.context.LightBulb ?? {};
|
|
56
|
+
this.LightBulb = {
|
|
57
|
+
Name: accessory.context.LightBulb.Name ?? 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
|
+
accessory.context.LightBulb = this.LightBulb as object;
|
|
66
|
+
|
|
67
|
+
// Adaptive Lighting
|
|
68
|
+
if (this.adaptiveLightingShift === -1 && accessory.context.adaptiveLighting) {
|
|
69
|
+
accessory.removeService(this.LightBulb.Service);
|
|
70
|
+
this.LightBulb.Service = accessory.addService(this.hap.Service.Lightbulb);
|
|
71
|
+
accessory.context.adaptiveLighting = false;
|
|
72
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} adaptiveLighting: ${accessory.context.adaptiveLighting}`);
|
|
124
73
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
74
|
+
if (this.adaptiveLightingShift !== -1) {
|
|
75
|
+
this.AdaptiveLightingController = new platform.api.hap.AdaptiveLightingController(this.LightBulb.Service, {
|
|
76
|
+
customTemperatureAdjustment: this.adaptiveLightingShift,
|
|
77
|
+
});
|
|
78
|
+
accessory.configureController(this.AdaptiveLightingController);
|
|
79
|
+
accessory.context.adaptiveLighting = true;
|
|
80
|
+
this.debugLog(`${device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${accessory.context.adaptiveLighting},`
|
|
81
|
+
+ ` adaptiveLightingShift: ${this.adaptiveLightingShift}`);
|
|
129
82
|
}
|
|
83
|
+
this.debugLog(`${device.deviceType}: ${this.accessory.displayName} adaptiveLightingShift: ${this.adaptiveLightingShift}`);
|
|
130
84
|
|
|
131
|
-
//
|
|
132
|
-
this.
|
|
85
|
+
// Initialize LightBulb Characteristics
|
|
86
|
+
this.LightBulb.Service
|
|
87
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.LightBulb.Name)
|
|
88
|
+
.getCharacteristic(this.hap.Characteristic.On)
|
|
89
|
+
.onGet(() => {
|
|
90
|
+
return this.LightBulb.On;
|
|
91
|
+
})
|
|
92
|
+
.onSet(this.OnSet.bind(this));
|
|
133
93
|
|
|
134
|
-
|
|
135
|
-
this.lightBulbService
|
|
94
|
+
this.LightBulb.Service
|
|
136
95
|
.getCharacteristic(this.hap.Characteristic.Brightness)
|
|
137
96
|
.setProps({
|
|
138
|
-
minStep:
|
|
97
|
+
minStep: device.colorbulb?.set_minStep ?? 1,
|
|
139
98
|
minValue: 0,
|
|
140
99
|
maxValue: 100,
|
|
141
100
|
validValueRanges: [0, 100],
|
|
142
101
|
})
|
|
143
102
|
.onGet(() => {
|
|
144
|
-
return this.Brightness;
|
|
103
|
+
return this.LightBulb.Brightness;
|
|
145
104
|
})
|
|
146
105
|
.onSet(this.BrightnessSet.bind(this));
|
|
147
106
|
|
|
148
|
-
|
|
149
|
-
this.lightBulbService
|
|
107
|
+
this.LightBulb.Service
|
|
150
108
|
.getCharacteristic(this.hap.Characteristic.ColorTemperature)
|
|
151
109
|
.setProps({
|
|
152
110
|
minValue: 140,
|
|
@@ -154,12 +112,11 @@ export class ColorBulb {
|
|
|
154
112
|
validValueRanges: [140, 500],
|
|
155
113
|
})
|
|
156
114
|
.onGet(() => {
|
|
157
|
-
return this.ColorTemperature!;
|
|
115
|
+
return this.LightBulb.ColorTemperature!;
|
|
158
116
|
})
|
|
159
117
|
.onSet(this.ColorTemperatureSet.bind(this));
|
|
160
118
|
|
|
161
|
-
|
|
162
|
-
this.lightBulbService
|
|
119
|
+
this.LightBulb.Service
|
|
163
120
|
.getCharacteristic(this.hap.Characteristic.Hue)
|
|
164
121
|
.setProps({
|
|
165
122
|
minValue: 0,
|
|
@@ -167,12 +124,11 @@ export class ColorBulb {
|
|
|
167
124
|
validValueRanges: [0, 360],
|
|
168
125
|
})
|
|
169
126
|
.onGet(() => {
|
|
170
|
-
return this.Hue;
|
|
127
|
+
return this.LightBulb.Hue;
|
|
171
128
|
})
|
|
172
129
|
.onSet(this.HueSet.bind(this));
|
|
173
130
|
|
|
174
|
-
|
|
175
|
-
this.lightBulbService
|
|
131
|
+
this.LightBulb.Service
|
|
176
132
|
.getCharacteristic(this.hap.Characteristic.Saturation)
|
|
177
133
|
.setProps({
|
|
178
134
|
minValue: 0,
|
|
@@ -180,22 +136,12 @@ export class ColorBulb {
|
|
|
180
136
|
validValueRanges: [0, 100],
|
|
181
137
|
})
|
|
182
138
|
.onGet(() => {
|
|
183
|
-
return this.Saturation;
|
|
139
|
+
return this.LightBulb.Saturation;
|
|
184
140
|
})
|
|
185
141
|
.onSet(this.SaturationSet.bind(this));
|
|
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,60 +154,7 @@ export class ColorBulb {
|
|
|
208
154
|
});
|
|
209
155
|
|
|
210
156
|
//regisiter webhook event handler
|
|
211
|
-
|
|
212
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
|
|
213
|
-
this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
|
|
214
|
-
try {
|
|
215
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
|
|
216
|
-
const { powerState, brightness, color, colorTemperature } = context;
|
|
217
|
-
const { On, Brightness, Hue, Saturation, ColorTemperature } = this;
|
|
218
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
|
|
219
|
-
'(powerState, brightness, color, colorTemperature) = ' +
|
|
220
|
-
`Webhook:(${powerState}, ${brightness}, ${color}, ${colorTemperature}), ` +
|
|
221
|
-
`current:(${On}, ${Brightness}, ${Hue}, ${Saturation}, ${ColorTemperature})`);
|
|
222
|
-
this.On = powerState === 'ON' ? true : false;
|
|
223
|
-
this.Brightness = brightness;
|
|
224
|
-
|
|
225
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(color)}`);
|
|
226
|
-
const [red, green, blue] = color!.split(':');
|
|
227
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${JSON.stringify(red)}`);
|
|
228
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${JSON.stringify(green)}`);
|
|
229
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${JSON.stringify(blue)}`);
|
|
230
|
-
|
|
231
|
-
const [hue, saturation] = rgb2hs(Number(red), Number(green), Number(blue));
|
|
232
|
-
this.debugLog(
|
|
233
|
-
`${this.device.deviceType}: ${this.accessory.displayName}` + ` hs: ${JSON.stringify(rgb2hs(Number(red), Number(green), Number(blue)))}`,
|
|
234
|
-
);
|
|
235
|
-
|
|
236
|
-
// 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}`);
|
|
240
|
-
} else {
|
|
241
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// 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}`);
|
|
248
|
-
} else {
|
|
249
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
this.ColorTemperature = colorTemperature;
|
|
253
|
-
if (this.accessory.context.ColorTemperature !== this.ColorTemperature) {
|
|
254
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
255
|
-
} else {
|
|
256
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
257
|
-
}
|
|
258
|
-
this.updateHomeKitCharacteristics();
|
|
259
|
-
} catch (e: any) {
|
|
260
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
261
|
-
+ `failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
|
262
|
-
}
|
|
263
|
-
};
|
|
264
|
-
}
|
|
157
|
+
this.registerWebhook(accessory, device);
|
|
265
158
|
|
|
266
159
|
// Watch for Bulb change events
|
|
267
160
|
// We put in a debounce of 100ms so we don't make duplicate calls
|
|
@@ -270,138 +163,130 @@ export class ColorBulb {
|
|
|
270
163
|
tap(() => {
|
|
271
164
|
this.colorBulbUpdateInProgress = true;
|
|
272
165
|
}),
|
|
273
|
-
debounceTime(this.
|
|
166
|
+
debounceTime(this.devicePushRate * 1000),
|
|
274
167
|
)
|
|
275
168
|
.subscribe(async () => {
|
|
276
169
|
try {
|
|
277
170
|
await this.pushChanges();
|
|
278
171
|
} catch (e: any) {
|
|
279
172
|
this.apiError(e);
|
|
280
|
-
this.errorLog(
|
|
281
|
-
|
|
282
|
-
` Error Message: ${JSON.stringify(e.message)}`,
|
|
283
|
-
);
|
|
173
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed pushChanges with ${this.device.connectionType} Connection,`
|
|
174
|
+
+ ` Error Message: ${JSON.stringify(e.message)}`);
|
|
284
175
|
}
|
|
285
176
|
this.colorBulbUpdateInProgress = false;
|
|
286
177
|
});
|
|
287
178
|
}
|
|
288
179
|
|
|
289
180
|
/**
|
|
290
|
-
* Parse the device status from the
|
|
181
|
+
* Parse the device status from the SwitchBotBLE API
|
|
291
182
|
*/
|
|
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> {
|
|
183
|
+
async BLEparseStatus(serviceData: serviceData): Promise<void> {
|
|
308
184
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
|
|
309
185
|
// State
|
|
310
|
-
switch (
|
|
186
|
+
switch (serviceData.power) {
|
|
311
187
|
case true:
|
|
312
|
-
this.On = true;
|
|
188
|
+
this.LightBulb.On = true;
|
|
313
189
|
break;
|
|
314
190
|
default:
|
|
315
|
-
this.On = false;
|
|
191
|
+
this.LightBulb.On = false;
|
|
316
192
|
}
|
|
317
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
193
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
318
194
|
|
|
319
195
|
// Brightness
|
|
320
|
-
this.Brightness = Number(
|
|
321
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
|
|
196
|
+
this.LightBulb.Brightness = Number(serviceData.brightness);
|
|
197
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
322
198
|
|
|
323
199
|
// 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: ${
|
|
327
|
-
|
|
328
|
-
const [hue, saturation] = rgb2hs(Number(
|
|
329
|
-
this.debugLog(
|
|
330
|
-
|
|
331
|
-
` hs: ${JSON.stringify(rgb2hs(Number(this.BLE_Red), Number(this.BLE_Green), Number(this.BLE_Blue)))}`,
|
|
332
|
-
);
|
|
333
|
-
this.BLE_Hue = hue;
|
|
334
|
-
this.BLE_Saturation = saturation;
|
|
200
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${serviceData.red}`);
|
|
201
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${serviceData.green}`);
|
|
202
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${serviceData.blue}`);
|
|
203
|
+
|
|
204
|
+
const [hue, saturation] = rgb2hs(Number(serviceData.red), Number(serviceData.green), Number(serviceData.blue));
|
|
205
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
206
|
+
+ ` hs: ${JSON.stringify(rgb2hs(Number(serviceData.red), Number(serviceData.green), Number(serviceData.blue)))}`);
|
|
335
207
|
|
|
336
208
|
// Hue
|
|
337
|
-
this.Hue =
|
|
338
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
209
|
+
this.LightBulb.Hue = hue;
|
|
210
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
339
211
|
|
|
340
212
|
// Saturation
|
|
341
|
-
this.Saturation =
|
|
342
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
|
|
213
|
+
this.LightBulb.Saturation = saturation;
|
|
214
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
343
215
|
|
|
344
216
|
// ColorTemperature
|
|
345
|
-
if (
|
|
346
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${
|
|
347
|
-
this.ColorTemperature =
|
|
217
|
+
if (serviceData.color_temperature) {
|
|
218
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${serviceData.color_temperature}`);
|
|
219
|
+
this.LightBulb.ColorTemperature = serviceData.color_temperature!;
|
|
348
220
|
|
|
349
|
-
this.ColorTemperature = Math.max(Math.min(this.ColorTemperature, 500), 140);
|
|
350
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
221
|
+
this.LightBulb.ColorTemperature = Math.max(Math.min(this.LightBulb.ColorTemperature, 500), 140);
|
|
222
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
351
223
|
}
|
|
352
224
|
}
|
|
353
225
|
|
|
354
|
-
|
|
226
|
+
/**
|
|
227
|
+
* Parse the device status from the SwitchBot OpenAPI
|
|
228
|
+
*/
|
|
229
|
+
async openAPIparseStatus(deviceStatus: deviceStatus): Promise<void> {
|
|
355
230
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
|
|
356
|
-
switch (
|
|
231
|
+
switch (deviceStatus.body.power) {
|
|
357
232
|
case 'on':
|
|
358
|
-
this.On = true;
|
|
233
|
+
this.LightBulb.On = true;
|
|
359
234
|
break;
|
|
360
235
|
default:
|
|
361
|
-
this.On = false;
|
|
236
|
+
this.LightBulb.On = false;
|
|
362
237
|
}
|
|
363
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
238
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
364
239
|
|
|
365
240
|
// Brightness
|
|
366
|
-
this.Brightness = Number(
|
|
367
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
|
|
241
|
+
this.LightBulb.Brightness = Number(deviceStatus.body.brightness);
|
|
242
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
368
243
|
|
|
369
244
|
// Color, Hue & Brightness
|
|
370
|
-
if (
|
|
371
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(
|
|
372
|
-
const [red, green, blue] =
|
|
245
|
+
if (deviceStatus.body.color) {
|
|
246
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(deviceStatus.body.color)}`);
|
|
247
|
+
const [red, green, blue] = deviceStatus.body.color!.split(':');
|
|
373
248
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${JSON.stringify(red)}`);
|
|
374
249
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${JSON.stringify(green)}`);
|
|
375
250
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${JSON.stringify(blue)}`);
|
|
376
251
|
|
|
377
252
|
const [hue, saturation] = rgb2hs(Number(red), Number(green), Number(blue));
|
|
378
|
-
this.debugLog(
|
|
379
|
-
|
|
380
|
-
);
|
|
253
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
254
|
+
+ ` hs: ${JSON.stringify(rgb2hs(Number(red), Number(green), Number(blue)))}`);
|
|
381
255
|
|
|
382
256
|
// Hue
|
|
383
|
-
this.Hue = hue;
|
|
384
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
257
|
+
this.LightBulb.Hue = hue;
|
|
258
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
385
259
|
|
|
386
260
|
// Saturation
|
|
387
|
-
this.Saturation = saturation;
|
|
388
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
|
|
261
|
+
this.LightBulb.Saturation = saturation;
|
|
262
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
389
263
|
}
|
|
390
264
|
|
|
391
265
|
// ColorTemperature
|
|
392
|
-
if (!Number.isNaN(
|
|
393
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${
|
|
394
|
-
const mired = Math.round(1000000 /
|
|
266
|
+
if (!Number.isNaN(deviceStatus.body.colorTemperature)) {
|
|
267
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${deviceStatus.body.colorTemperature}`);
|
|
268
|
+
const mired = Math.round(1000000 / deviceStatus.body.colorTemperature!);
|
|
395
269
|
|
|
396
|
-
this.ColorTemperature = Number(mired);
|
|
270
|
+
this.LightBulb.ColorTemperature = Number(mired);
|
|
397
271
|
|
|
398
|
-
this.ColorTemperature = Math.max(Math.min(this.ColorTemperature, 500), 140);
|
|
399
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
272
|
+
this.LightBulb.ColorTemperature = Math.max(Math.min(this.LightBulb.ColorTemperature, 500), 140);
|
|
273
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
400
274
|
}
|
|
401
275
|
|
|
402
|
-
//
|
|
403
|
-
|
|
404
|
-
this.
|
|
276
|
+
// Firmware Version
|
|
277
|
+
const version = deviceStatus.body.version?.toString();
|
|
278
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
|
|
279
|
+
if (deviceStatus.body.version) {
|
|
280
|
+
const deviceVersion = version?.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
281
|
+
this.accessory
|
|
282
|
+
.getService(this.hap.Service.AccessoryInformation)!
|
|
283
|
+
.setCharacteristic(this.hap.Characteristic.HardwareRevision, deviceVersion)
|
|
284
|
+
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
285
|
+
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
286
|
+
.updateValue(deviceVersion);
|
|
287
|
+
this.accessory.context.deviceVersion = deviceVersion;
|
|
288
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceVersion: ${this.accessory.context.deviceVersion}`);
|
|
289
|
+
}
|
|
405
290
|
}
|
|
406
291
|
|
|
407
292
|
/**
|
|
@@ -416,10 +301,8 @@ export class ColorBulb {
|
|
|
416
301
|
await this.openAPIRefreshStatus();
|
|
417
302
|
} else {
|
|
418
303
|
await this.offlineOff();
|
|
419
|
-
this.debugWarnLog(
|
|
420
|
-
|
|
421
|
-
` ${this.device.connectionType}, refreshStatus will not happen.`,
|
|
422
|
-
);
|
|
304
|
+
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:`
|
|
305
|
+
+ ` ${this.device.connectionType}, refreshStatus will not happen.`);
|
|
423
306
|
}
|
|
424
307
|
}
|
|
425
308
|
|
|
@@ -436,113 +319,43 @@ export class ColorBulb {
|
|
|
436
319
|
// Start to monitor advertisement packets
|
|
437
320
|
(async () => {
|
|
438
321
|
// Start to monitor advertisement packets
|
|
439
|
-
await switchbot.startScan({
|
|
440
|
-
model: 'u',
|
|
441
|
-
id: this.device.bleMac,
|
|
442
|
-
});
|
|
322
|
+
await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
|
|
443
323
|
// Set an event handler
|
|
444
324
|
switchbot.onadvertisement = (ad: any) => {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
325
|
+
if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
|
|
326
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
|
|
327
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
|
|
448
328
|
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
329
|
} else {
|
|
458
330
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
459
331
|
}
|
|
460
332
|
};
|
|
461
|
-
// Wait
|
|
333
|
+
// Wait 10 seconds
|
|
462
334
|
await switchbot.wait(this.scanDuration * 1000);
|
|
463
335
|
// Stop to monitor
|
|
464
336
|
await switchbot.stopScan();
|
|
465
337
|
// Update HomeKit
|
|
466
|
-
await this.BLEparseStatus();
|
|
338
|
+
await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
|
|
467
339
|
await this.updateHomeKitCharacteristics();
|
|
468
340
|
})();
|
|
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 {
|
|
341
|
+
if (switchbot === undefined) {
|
|
523
342
|
await this.BLERefreshConnection(switchbot);
|
|
524
|
-
}
|
|
343
|
+
}
|
|
525
344
|
}
|
|
526
345
|
|
|
527
|
-
async openAPIRefreshStatus() {
|
|
346
|
+
async openAPIRefreshStatus(): Promise<void> {
|
|
528
347
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
|
|
529
348
|
try {
|
|
530
|
-
const { body, statusCode } = await
|
|
531
|
-
headers: this.platform.generateHeaders()
|
|
532
|
-
});
|
|
349
|
+
const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries,
|
|
350
|
+
`${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
|
|
533
351
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
|
|
534
352
|
const deviceStatus: any = await body.json();
|
|
535
353
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
536
354
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
537
355
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
538
|
-
this.
|
|
356
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
539
357
|
+ `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();
|
|
358
|
+
this.openAPIparseStatus(deviceStatus);
|
|
546
359
|
this.updateHomeKitCharacteristics();
|
|
547
360
|
} else {
|
|
548
361
|
this.statusCode(statusCode);
|
|
@@ -550,10 +363,81 @@ export class ColorBulb {
|
|
|
550
363
|
}
|
|
551
364
|
} catch (e: any) {
|
|
552
365
|
this.apiError(e);
|
|
553
|
-
this.errorLog(
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
366
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIRefreshStatus with ${this.device.connectionType}`
|
|
367
|
+
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
async registerWebhook(accessory: PlatformAccessory, device: device & devicesConfig) {
|
|
372
|
+
if (device.webhook) {
|
|
373
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} is listening webhook.`);
|
|
374
|
+
this.platform.webhookEventHandler[device.deviceId] = async (context) => {
|
|
375
|
+
try {
|
|
376
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
|
|
377
|
+
const { powerState, brightness, color, colorTemperature } = context;
|
|
378
|
+
const { On, Brightness, Hue, Saturation, ColorTemperature } = this.LightBulb;
|
|
379
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} ` +
|
|
380
|
+
'(powerState, brightness, color, colorTemperature) = ' +
|
|
381
|
+
`Webhook:(${powerState}, ${brightness}, ${color}, ${colorTemperature}), `
|
|
382
|
+
+ `current:(${On}, ${Brightness}, ${Hue}, ${Saturation}, ${ColorTemperature})`);
|
|
383
|
+
|
|
384
|
+
// On
|
|
385
|
+
this.LightBulb.On = powerState === 'ON' ? true : false;
|
|
386
|
+
if (accessory.context.Brightness !== this.LightBulb.On) {
|
|
387
|
+
this.infoLog(`${device.deviceType}: ${accessory.displayName} On: ${this.LightBulb.On}`);
|
|
388
|
+
} else {
|
|
389
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} On: ${this.LightBulb.On}`);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// Brightness
|
|
393
|
+
this.LightBulb.Brightness = brightness;
|
|
394
|
+
if (accessory.context.Brightness !== this.LightBulb.Brightness) {
|
|
395
|
+
this.infoLog(`${device.deviceType}: ${accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
396
|
+
} else {
|
|
397
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} color: ${JSON.stringify(color)}`);
|
|
401
|
+
const [red, green, blue] = color!.split(':');
|
|
402
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} red: ${JSON.stringify(red)}`);
|
|
403
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} green: ${JSON.stringify(green)}`);
|
|
404
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} blue: ${JSON.stringify(blue)}`);
|
|
405
|
+
|
|
406
|
+
const [hue, saturation] = rgb2hs(Number(red), Number(green), Number(blue));
|
|
407
|
+
this.debugLog(
|
|
408
|
+
`${device.deviceType}: ${accessory.displayName}`
|
|
409
|
+
+ ` hs: ${JSON.stringify(rgb2hs(Number(red), Number(green), Number(blue)))}`);
|
|
410
|
+
|
|
411
|
+
// Hue
|
|
412
|
+
this.LightBulb.Hue = hue;
|
|
413
|
+
if (accessory.context.Hue !== this.LightBulb.Hue) {
|
|
414
|
+
this.infoLog(`${device.deviceType}: ${accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
415
|
+
} else {
|
|
416
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// Saturation
|
|
420
|
+
this.LightBulb.Saturation = saturation;
|
|
421
|
+
if (accessory.context.Saturation !== this.LightBulb.Saturation) {
|
|
422
|
+
this.infoLog(`${device.deviceType}: ${accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
423
|
+
} else {
|
|
424
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
this.LightBulb.ColorTemperature = colorTemperature;
|
|
428
|
+
if (accessory.context.ColorTemperature !== this.LightBulb.ColorTemperature) {
|
|
429
|
+
this.infoLog(`${device.deviceType}: ${accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
430
|
+
} else {
|
|
431
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
432
|
+
}
|
|
433
|
+
this.updateHomeKitCharacteristics();
|
|
434
|
+
} catch (e: any) {
|
|
435
|
+
this.errorLog(`${device.deviceType}: ${accessory.displayName} `
|
|
436
|
+
+ `failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
} else {
|
|
440
|
+
this.debugWarnLog(`${device.deviceType}: ${accessory.displayName} is not listening webhook.`);
|
|
557
441
|
}
|
|
558
442
|
}
|
|
559
443
|
|
|
@@ -571,15 +455,14 @@ export class ColorBulb {
|
|
|
571
455
|
async pushChanges(): Promise<void> {
|
|
572
456
|
if (!this.device.enableCloudService && this.OpenAPI) {
|
|
573
457
|
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} pushChanges enableCloudService: ${this.device.enableCloudService}`);
|
|
574
|
-
|
|
575
|
-
|
|
458
|
+
} else if (this.BLE) {
|
|
459
|
+
await this.BLEpushChanges();
|
|
576
460
|
} else if (this.OpenAPI && this.platform.config.credentials?.token) {
|
|
577
461
|
await this.openAPIpushChanges();
|
|
578
462
|
} else {
|
|
579
463
|
await this.offlineOff();
|
|
580
|
-
this.debugWarnLog(
|
|
581
|
-
|
|
582
|
-
);
|
|
464
|
+
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:`
|
|
465
|
+
+ ` ${this.device.connectionType}, pushChanges will not happen.`);
|
|
583
466
|
}
|
|
584
467
|
// Refresh the status from the API
|
|
585
468
|
interval(15000)
|
|
@@ -592,8 +475,9 @@ export class ColorBulb {
|
|
|
592
475
|
|
|
593
476
|
async BLEpushChanges(): Promise<void> {
|
|
594
477
|
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
|
|
478
|
+
if (this.LightBulb.On !== this.accessory.context.On) {
|
|
479
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`
|
|
480
|
+
+ ` On: ${this.LightBulb.On}, OnCached: ${this.accessory.context.On}`);
|
|
597
481
|
const switchbot = await this.platform.connectBLE();
|
|
598
482
|
// Convert to BLE Address
|
|
599
483
|
this.device.bleMac = this.device
|
|
@@ -607,11 +491,11 @@ export class ColorBulb {
|
|
|
607
491
|
id: this.device.bleMac,
|
|
608
492
|
})
|
|
609
493
|
.then(async (device_list: any) => {
|
|
610
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
611
|
-
return await this.
|
|
612
|
-
max: this.
|
|
494
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
495
|
+
return await this.retryBLE({
|
|
496
|
+
max: await this.maxRetryBLE(),
|
|
613
497
|
fn: async () => {
|
|
614
|
-
if (this.On) {
|
|
498
|
+
if (this.LightBulb.On) {
|
|
615
499
|
return await device_list[0].turnOn({ id: this.device.bleMac });
|
|
616
500
|
} else {
|
|
617
501
|
return await device_list[0].turnOff({ id: this.device.bleMac });
|
|
@@ -621,38 +505,37 @@ export class ColorBulb {
|
|
|
621
505
|
})
|
|
622
506
|
.then(() => {
|
|
623
507
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
624
|
-
this.
|
|
508
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
509
|
+
+ `On: ${this.LightBulb.On} sent over BLE, sent successfully`);
|
|
510
|
+
this.LightBulb.On = false;
|
|
625
511
|
})
|
|
626
512
|
.catch(async (e: any) => {
|
|
627
513
|
this.apiError(e);
|
|
628
|
-
this.errorLog(
|
|
629
|
-
|
|
630
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
631
|
-
);
|
|
514
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushChanges with ${this.device.connectionType}`
|
|
515
|
+
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
632
516
|
await this.BLEPushConnection();
|
|
633
517
|
});
|
|
634
518
|
// Push Brightness Update
|
|
635
|
-
if (this.On) {
|
|
519
|
+
if (this.LightBulb.On) {
|
|
636
520
|
await this.BLEpushBrightnessChanges();
|
|
637
521
|
}
|
|
638
522
|
// Push ColorTemperature Update
|
|
639
|
-
if (this.On) {
|
|
523
|
+
if (this.LightBulb.On) {
|
|
640
524
|
await this.BLEpushColorTemperatureChanges();
|
|
641
525
|
}
|
|
642
526
|
// Push Hue & Saturation Update
|
|
643
|
-
if (this.On) {
|
|
527
|
+
if (this.LightBulb.On) {
|
|
644
528
|
await this.BLEpushRGBChanges();
|
|
645
529
|
}
|
|
646
530
|
} else {
|
|
647
|
-
this.debugLog(
|
|
648
|
-
|
|
649
|
-
);
|
|
531
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges, On: ${this.LightBulb.On},`
|
|
532
|
+
+ ` OnCached: ${this.accessory.context.On}`);
|
|
650
533
|
}
|
|
651
534
|
}
|
|
652
535
|
|
|
653
536
|
async BLEpushBrightnessChanges(): Promise<void> {
|
|
654
537
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushBrightnessChanges`);
|
|
655
|
-
if (this.Brightness !== this.accessory.context.Brightness) {
|
|
538
|
+
if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
|
|
656
539
|
const switchbot = await this.platform.connectBLE();
|
|
657
540
|
// Convert to BLE Address
|
|
658
541
|
this.device.bleMac = this.device
|
|
@@ -666,33 +549,28 @@ export class ColorBulb {
|
|
|
666
549
|
id: this.device.bleMac,
|
|
667
550
|
})
|
|
668
551
|
.then(async (device_list: any) => {
|
|
669
|
-
this.infoLog(`${this.accessory.displayName} Target Brightness: ${this.Brightness}`);
|
|
670
|
-
return await device_list[0].setBrightness(this.Brightness);
|
|
552
|
+
this.infoLog(`${this.accessory.displayName} Target Brightness: ${this.LightBulb.Brightness}`);
|
|
553
|
+
return await device_list[0].setBrightness(this.LightBulb.Brightness);
|
|
671
554
|
})
|
|
672
555
|
.then(() => {
|
|
673
556
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
674
|
-
this.On = false;
|
|
557
|
+
this.LightBulb.On = false;
|
|
675
558
|
})
|
|
676
559
|
.catch(async (e: any) => {
|
|
677
560
|
this.apiError(e);
|
|
678
|
-
this.errorLog(
|
|
679
|
-
|
|
680
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
681
|
-
);
|
|
561
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushBrightnessChanges with ${this.device.connectionType}`
|
|
562
|
+
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
682
563
|
await this.BLEPushConnection();
|
|
683
564
|
});
|
|
684
565
|
} else {
|
|
685
|
-
this.debugLog(
|
|
686
|
-
|
|
687
|
-
`Brightness: ${this.Brightness}, ` +
|
|
688
|
-
`BrightnessCached: ${this.accessory.context.Brightness}`,
|
|
689
|
-
);
|
|
566
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushBrightnessChanges.`
|
|
567
|
+
+ `Brightness: ${this.LightBulb.Brightness}, BrightnessCached: ${this.accessory.context.Brightness}`);
|
|
690
568
|
}
|
|
691
569
|
}
|
|
692
570
|
|
|
693
571
|
async BLEpushColorTemperatureChanges(): Promise<void> {
|
|
694
572
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushColorTemperatureChanges`);
|
|
695
|
-
if (this.ColorTemperature !== this.accessory.context.ColorTemperature) {
|
|
573
|
+
if (this.LightBulb.ColorTemperature !== this.accessory.context.ColorTemperature) {
|
|
696
574
|
const switchbot = await this.platform.connectBLE();
|
|
697
575
|
// Convert to BLE Address
|
|
698
576
|
this.device.bleMac = this.device
|
|
@@ -706,36 +584,32 @@ export class ColorBulb {
|
|
|
706
584
|
id: this.device.bleMac,
|
|
707
585
|
})
|
|
708
586
|
.then(async (device_list: any) => {
|
|
709
|
-
this.infoLog(`${this.accessory.displayName} Target ColorTemperature: ${this.ColorTemperature}`);
|
|
710
|
-
return await device_list[0].setColorTemperature(this.ColorTemperature);
|
|
587
|
+
this.infoLog(`${this.accessory.displayName} Target ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
588
|
+
return await device_list[0].setColorTemperature(this.LightBulb.ColorTemperature);
|
|
711
589
|
})
|
|
712
590
|
.then(() => {
|
|
713
591
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
714
|
-
this.On = false;
|
|
592
|
+
this.LightBulb.On = false;
|
|
715
593
|
})
|
|
716
594
|
.catch(async (e: any) => {
|
|
717
595
|
this.apiError(e);
|
|
718
|
-
this.errorLog(
|
|
719
|
-
`${this.device.
|
|
720
|
-
`${this.device.connectionType} Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
721
|
-
);
|
|
596
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushColorTemperatureChanges with `
|
|
597
|
+
+ `${this.device.connectionType} Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
722
598
|
await this.BLEPushConnection();
|
|
723
599
|
});
|
|
724
600
|
} else {
|
|
725
|
-
this.debugLog(
|
|
726
|
-
|
|
727
|
-
`ColorTemperature: ${this.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`,
|
|
728
|
-
);
|
|
601
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushColorTemperatureChanges.`
|
|
602
|
+
+ `ColorTemperature: ${this.LightBulb.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`);
|
|
729
603
|
}
|
|
730
604
|
}
|
|
731
605
|
|
|
732
606
|
async BLEpushRGBChanges(): Promise<void> {
|
|
733
607
|
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)}`);
|
|
608
|
+
if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
|
|
609
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
|
|
610
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
|
|
737
611
|
|
|
738
|
-
const [red, green, blue] = hs2rgb(Number(this.Hue), Number(this.Saturation));
|
|
612
|
+
const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
|
|
739
613
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
|
|
740
614
|
|
|
741
615
|
const switchbot = await this.platform.connectBLE();
|
|
@@ -751,34 +625,30 @@ export class ColorBulb {
|
|
|
751
625
|
id: this.device.bleMac,
|
|
752
626
|
})
|
|
753
627
|
.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);
|
|
628
|
+
this.infoLog(`${this.accessory.displayName} Target RGB: ${(this.LightBulb.Brightness, red, green, blue)}`);
|
|
629
|
+
return await device_list[0].setRGB(this.LightBulb.Brightness, red, green, blue);
|
|
756
630
|
})
|
|
757
631
|
.then(() => {
|
|
758
632
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
759
|
-
this.On = false;
|
|
633
|
+
this.LightBulb.On = false;
|
|
760
634
|
})
|
|
761
635
|
.catch(async (e: any) => {
|
|
762
636
|
this.apiError(e);
|
|
763
|
-
this.errorLog(
|
|
764
|
-
|
|
765
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
766
|
-
);
|
|
637
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushRGBChanges with ${this.device.connectionType}`
|
|
638
|
+
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
767
639
|
await this.BLEPushConnection();
|
|
768
640
|
});
|
|
769
641
|
} else {
|
|
770
|
-
this.debugLog(
|
|
771
|
-
`${this.
|
|
772
|
-
`HueCached: ${this.accessory.context.Hue}, Saturation: ${this.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
|
|
773
|
-
);
|
|
642
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushRGBChanges. Hue: ${this.LightBulb.Hue}, HueCached: `
|
|
643
|
+
+ `${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`);
|
|
774
644
|
}
|
|
775
645
|
}
|
|
776
646
|
|
|
777
647
|
async openAPIpushChanges(): Promise<void> {
|
|
778
648
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
|
|
779
|
-
if (this.On !== this.accessory.context.On) {
|
|
649
|
+
if (this.LightBulb.On !== this.accessory.context.On) {
|
|
780
650
|
let command = '';
|
|
781
|
-
if (this.On) {
|
|
651
|
+
if (this.LightBulb.On) {
|
|
782
652
|
command = 'turnOn';
|
|
783
653
|
} else {
|
|
784
654
|
command = 'turnOff';
|
|
@@ -803,44 +673,41 @@ export class ColorBulb {
|
|
|
803
673
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
804
674
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
805
675
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
676
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
677
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
|
|
806
678
|
} else {
|
|
807
679
|
this.statusCode(statusCode);
|
|
808
680
|
this.statusCode(deviceStatus.statusCode);
|
|
809
681
|
}
|
|
810
682
|
} catch (e: any) {
|
|
811
683
|
this.apiError(e);
|
|
812
|
-
this.errorLog(
|
|
813
|
-
|
|
814
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
815
|
-
);
|
|
684
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed openAPIpushChanges with ${this.device.connectionType}`
|
|
685
|
+
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
816
686
|
}
|
|
817
687
|
} else {
|
|
818
|
-
this.debugLog(
|
|
819
|
-
|
|
820
|
-
`On: ${this.On}, ` +
|
|
821
|
-
`OnCached: ${this.accessory.context.On}`,
|
|
822
|
-
);
|
|
688
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges,`
|
|
689
|
+
+ `On: ${this.LightBulb.On}, OnCached: ${this.accessory.context.On}`);
|
|
823
690
|
}
|
|
824
691
|
// Push Hue & Saturation Update
|
|
825
|
-
if (this.On) {
|
|
692
|
+
if (this.LightBulb.On) {
|
|
826
693
|
await this.pushHueSaturationChanges();
|
|
827
694
|
}
|
|
828
695
|
// Push ColorTemperature Update
|
|
829
|
-
if (this.On) {
|
|
696
|
+
if (this.LightBulb.On) {
|
|
830
697
|
await this.pushColorTemperatureChanges();
|
|
831
698
|
}
|
|
832
699
|
// Push Brightness Update
|
|
833
|
-
if (this.On) {
|
|
700
|
+
if (this.LightBulb.On) {
|
|
834
701
|
await this.pushBrightnessChanges();
|
|
835
702
|
}
|
|
836
703
|
}
|
|
837
704
|
|
|
838
705
|
async pushHueSaturationChanges(): Promise<void> {
|
|
839
706
|
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));
|
|
707
|
+
if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
|
|
708
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
|
|
709
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
|
|
710
|
+
const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
|
|
844
711
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
|
|
845
712
|
const bodyChange = JSON.stringify({
|
|
846
713
|
command: 'setColor',
|
|
@@ -862,30 +729,28 @@ export class ColorBulb {
|
|
|
862
729
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
863
730
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
864
731
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
732
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
733
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
|
|
865
734
|
} else {
|
|
866
735
|
this.statusCode(statusCode);
|
|
867
736
|
this.statusCode(deviceStatus.statusCode);
|
|
868
737
|
}
|
|
869
738
|
} catch (e: any) {
|
|
870
739
|
this.apiError(e);
|
|
871
|
-
this.errorLog(
|
|
872
|
-
|
|
873
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
874
|
-
);
|
|
740
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed pushHueSaturationChanges with ${this.device.connectionType}`
|
|
741
|
+
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
875
742
|
}
|
|
876
743
|
} else {
|
|
877
|
-
this.debugLog(
|
|
878
|
-
`${this.
|
|
879
|
-
`HueCached: ${this.accessory.context.Hue}, Saturation: ${this.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
|
|
880
|
-
);
|
|
744
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushHueSaturationChanges. Hue: ${this.LightBulb.Hue}, HueCached: `
|
|
745
|
+
+ `${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`);
|
|
881
746
|
}
|
|
882
747
|
}
|
|
883
748
|
|
|
884
749
|
async pushColorTemperatureChanges(): Promise<void> {
|
|
885
750
|
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.
|
|
751
|
+
if (this.LightBulb.ColorTemperature !== this.accessory.context.ColorTemperature) {
|
|
752
|
+
const kelvin = Math.round(1000000 / Number(this.LightBulb.ColorTemperature));
|
|
753
|
+
this.accessory.context.kelvin = kelvin;
|
|
889
754
|
const bodyChange = JSON.stringify({
|
|
890
755
|
command: 'setColorTemperature',
|
|
891
756
|
parameter: `${kelvin}`,
|
|
@@ -906,31 +771,29 @@ export class ColorBulb {
|
|
|
906
771
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
907
772
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
908
773
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
774
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
775
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
|
|
909
776
|
} else {
|
|
910
777
|
this.statusCode(statusCode);
|
|
911
778
|
this.statusCode(deviceStatus.statusCode);
|
|
912
779
|
}
|
|
913
780
|
} catch (e: any) {
|
|
914
781
|
this.apiError(e);
|
|
915
|
-
this.errorLog(
|
|
916
|
-
|
|
917
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
918
|
-
);
|
|
782
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed pushColorTemperatureChanges with ${this.device.connectionType}`
|
|
783
|
+
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
919
784
|
}
|
|
920
785
|
} else {
|
|
921
|
-
this.debugLog(
|
|
922
|
-
|
|
923
|
-
`ColorTemperature: ${this.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`,
|
|
924
|
-
);
|
|
786
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushColorTemperatureChanges.`
|
|
787
|
+
+ `ColorTemperature: ${this.LightBulb.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`);
|
|
925
788
|
}
|
|
926
789
|
}
|
|
927
790
|
|
|
928
791
|
async pushBrightnessChanges(): Promise<void> {
|
|
929
792
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushBrightnessChanges`);
|
|
930
|
-
if (this.Brightness !== this.accessory.context.Brightness) {
|
|
793
|
+
if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
|
|
931
794
|
const bodyChange = JSON.stringify({
|
|
932
795
|
command: 'setBrightness',
|
|
933
|
-
parameter: `${this.Brightness}`,
|
|
796
|
+
parameter: `${this.LightBulb.Brightness}`,
|
|
934
797
|
commandType: 'command',
|
|
935
798
|
});
|
|
936
799
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
|
|
@@ -948,23 +811,20 @@ export class ColorBulb {
|
|
|
948
811
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
949
812
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
950
813
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
814
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
815
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
|
|
951
816
|
} else {
|
|
952
817
|
this.statusCode(statusCode);
|
|
953
818
|
this.statusCode(deviceStatus.statusCode);
|
|
954
819
|
}
|
|
955
820
|
} catch (e: any) {
|
|
956
821
|
this.apiError(e);
|
|
957
|
-
this.errorLog(
|
|
958
|
-
|
|
959
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
960
|
-
);
|
|
822
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed pushBrightnessChanges with ${this.device.connectionType}`
|
|
823
|
+
+ ` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
961
824
|
}
|
|
962
825
|
} else {
|
|
963
|
-
this.debugLog(
|
|
964
|
-
|
|
965
|
-
`Brightness: ${this.Brightness}, ` +
|
|
966
|
-
`BrightnessCached: ${this.accessory.context.Brightness}`,
|
|
967
|
-
);
|
|
826
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushBrightnessChanges.`
|
|
827
|
+
+ `Brightness: ${this.LightBulb.Brightness}, BrightnessCached: ${this.accessory.context.Brightness}`);
|
|
968
828
|
}
|
|
969
829
|
}
|
|
970
830
|
|
|
@@ -972,13 +832,13 @@ export class ColorBulb {
|
|
|
972
832
|
* Handle requests to set the value of the "On" characteristic
|
|
973
833
|
*/
|
|
974
834
|
async OnSet(value: CharacteristicValue): Promise<void> {
|
|
975
|
-
if (this.On === this.accessory.context.On) {
|
|
835
|
+
if (this.LightBulb.On === this.accessory.context.On) {
|
|
976
836
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set On: ${value}`);
|
|
977
837
|
} else {
|
|
978
838
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set On: ${value}`);
|
|
979
839
|
}
|
|
980
840
|
|
|
981
|
-
this.On = value;
|
|
841
|
+
this.LightBulb.On = value;
|
|
982
842
|
this.doColorBulbUpdate.next();
|
|
983
843
|
}
|
|
984
844
|
|
|
@@ -986,15 +846,15 @@ export class ColorBulb {
|
|
|
986
846
|
* Handle requests to set the value of the "Brightness" characteristic
|
|
987
847
|
*/
|
|
988
848
|
async BrightnessSet(value: CharacteristicValue): Promise<void> {
|
|
989
|
-
if (this.Brightness === this.accessory.context.Brightness) {
|
|
849
|
+
if (this.LightBulb.Brightness === this.accessory.context.Brightness) {
|
|
990
850
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Brightness: ${value}`);
|
|
991
|
-
} else if (this.On) {
|
|
851
|
+
} else if (this.LightBulb.On) {
|
|
992
852
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
|
|
993
853
|
} else {
|
|
994
854
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
|
|
995
855
|
}
|
|
996
856
|
|
|
997
|
-
this.Brightness = value;
|
|
857
|
+
this.LightBulb.Brightness = value;
|
|
998
858
|
this.doColorBulbUpdate.next();
|
|
999
859
|
}
|
|
1000
860
|
|
|
@@ -1002,30 +862,32 @@ export class ColorBulb {
|
|
|
1002
862
|
* Handle requests to set the value of the "ColorTemperature" characteristic
|
|
1003
863
|
*/
|
|
1004
864
|
async ColorTemperatureSet(value: CharacteristicValue): Promise<void> {
|
|
1005
|
-
if (this.ColorTemperature === this.accessory.context.ColorTemperature) {
|
|
865
|
+
if (this.LightBulb.ColorTemperature === this.accessory.context.ColorTemperature) {
|
|
1006
866
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set ColorTemperature: ${value}`);
|
|
1007
|
-
} else if (this.On) {
|
|
867
|
+
} else if (this.LightBulb.On) {
|
|
1008
868
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
|
|
1009
869
|
} else {
|
|
1010
870
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
|
|
1011
871
|
}
|
|
1012
872
|
|
|
873
|
+
const minKelvin = 2000;
|
|
874
|
+
const maxKelvin = 9000;
|
|
1013
875
|
// Convert mired to kelvin to nearest 100 (SwitchBot seems to need this)
|
|
1014
876
|
const kelvin = Math.round(1000000 / Number(value) / 100) * 100;
|
|
1015
877
|
|
|
1016
878
|
// Check and increase/decrease kelvin to range of device
|
|
1017
|
-
const k = Math.min(Math.max(kelvin,
|
|
879
|
+
const k = Math.min(Math.max(kelvin, minKelvin), maxKelvin);
|
|
1018
880
|
|
|
1019
|
-
if (!this.accessory.context.On || this.
|
|
881
|
+
if (!this.accessory.context.On || this.accessory.context.kelvin === k) {
|
|
1020
882
|
return;
|
|
1021
883
|
}
|
|
1022
884
|
|
|
1023
885
|
// Updating the hue/sat to the corresponding values mimics native adaptive lighting
|
|
1024
886
|
const hs = m2hs(value);
|
|
1025
|
-
this.
|
|
1026
|
-
this.
|
|
887
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, hs[0]);
|
|
888
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, hs[1]);
|
|
1027
889
|
|
|
1028
|
-
this.ColorTemperature = value;
|
|
890
|
+
this.LightBulb.ColorTemperature = value;
|
|
1029
891
|
this.doColorBulbUpdate.next();
|
|
1030
892
|
}
|
|
1031
893
|
|
|
@@ -1033,17 +895,17 @@ export class ColorBulb {
|
|
|
1033
895
|
* Handle requests to set the value of the "Hue" characteristic
|
|
1034
896
|
*/
|
|
1035
897
|
async HueSet(value: CharacteristicValue): Promise<void> {
|
|
1036
|
-
if (this.Hue === this.accessory.context.Hue) {
|
|
898
|
+
if (this.LightBulb.Hue === this.accessory.context.Hue) {
|
|
1037
899
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Hue: ${value}`);
|
|
1038
|
-
} else if (this.On) {
|
|
900
|
+
} else if (this.LightBulb.On) {
|
|
1039
901
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
|
|
1040
902
|
} else {
|
|
1041
903
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
|
|
1042
904
|
}
|
|
1043
905
|
|
|
1044
|
-
this.
|
|
906
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
|
|
1045
907
|
|
|
1046
|
-
this.Hue = value;
|
|
908
|
+
this.LightBulb.Hue = value;
|
|
1047
909
|
this.doColorBulbUpdate.next();
|
|
1048
910
|
}
|
|
1049
911
|
|
|
@@ -1051,60 +913,61 @@ export class ColorBulb {
|
|
|
1051
913
|
* Handle requests to set the value of the "Saturation" characteristic
|
|
1052
914
|
*/
|
|
1053
915
|
async SaturationSet(value: CharacteristicValue): Promise<void> {
|
|
1054
|
-
if (this.Saturation === this.accessory.context.Saturation) {
|
|
916
|
+
if (this.LightBulb.Saturation === this.accessory.context.Saturation) {
|
|
1055
917
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Saturation: ${value}`);
|
|
1056
|
-
} else if (this.On) {
|
|
918
|
+
} else if (this.LightBulb.On) {
|
|
1057
919
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
|
|
1058
920
|
} else {
|
|
1059
921
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
|
|
1060
922
|
}
|
|
1061
923
|
|
|
1062
|
-
this.
|
|
924
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
|
|
1063
925
|
|
|
1064
|
-
this.Saturation = value;
|
|
926
|
+
this.LightBulb.Saturation = value;
|
|
1065
927
|
this.doColorBulbUpdate.next();
|
|
1066
928
|
}
|
|
1067
929
|
|
|
1068
930
|
async updateHomeKitCharacteristics(): Promise<void> {
|
|
1069
931
|
// On
|
|
1070
|
-
if (this.On === undefined) {
|
|
1071
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
932
|
+
if (this.LightBulb.On === undefined) {
|
|
933
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
1072
934
|
} else {
|
|
1073
|
-
this.accessory.context.On = this.On;
|
|
1074
|
-
this.
|
|
1075
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
935
|
+
this.accessory.context.On = this.LightBulb.On;
|
|
936
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, this.LightBulb.On);
|
|
937
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.LightBulb.On}`);
|
|
1076
938
|
}
|
|
1077
939
|
// Brightness
|
|
1078
|
-
if (this.Brightness === undefined) {
|
|
1079
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
|
|
940
|
+
if (this.LightBulb.Brightness === undefined) {
|
|
941
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
1080
942
|
} else {
|
|
1081
|
-
this.accessory.context.Brightness = this.Brightness;
|
|
1082
|
-
this.
|
|
1083
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.Brightness}`);
|
|
943
|
+
this.accessory.context.Brightness = this.LightBulb.Brightness;
|
|
944
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, this.LightBulb.Brightness);
|
|
945
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.LightBulb.Brightness}`);
|
|
1084
946
|
}
|
|
1085
947
|
// ColorTemperature
|
|
1086
|
-
if (this.ColorTemperature === undefined) {
|
|
1087
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
948
|
+
if (this.LightBulb.ColorTemperature === undefined) {
|
|
949
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
1088
950
|
} else {
|
|
1089
|
-
this.accessory.context.ColorTemperature = this.ColorTemperature;
|
|
1090
|
-
this.
|
|
1091
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
951
|
+
this.accessory.context.ColorTemperature = this.LightBulb.ColorTemperature;
|
|
952
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, this.LightBulb.ColorTemperature);
|
|
953
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
954
|
+
+ ` ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
1092
955
|
}
|
|
1093
956
|
// Hue
|
|
1094
|
-
if (this.Hue === undefined) {
|
|
1095
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
957
|
+
if (this.LightBulb.Hue === undefined) {
|
|
958
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
1096
959
|
} else {
|
|
1097
|
-
this.accessory.context.Hue = this.Hue;
|
|
1098
|
-
this.
|
|
1099
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.Hue}`);
|
|
960
|
+
this.accessory.context.Hue = this.LightBulb.Hue;
|
|
961
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, this.LightBulb.Hue);
|
|
962
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.LightBulb.Hue}`);
|
|
1100
963
|
}
|
|
1101
964
|
// Saturation
|
|
1102
|
-
if (this.Saturation === undefined) {
|
|
1103
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
|
|
965
|
+
if (this.LightBulb.Saturation === undefined) {
|
|
966
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
1104
967
|
} else {
|
|
1105
|
-
this.accessory.context.Saturation = this.Saturation;
|
|
1106
|
-
this.
|
|
1107
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Saturation: ${this.Saturation}`);
|
|
968
|
+
this.accessory.context.Saturation = this.LightBulb.Saturation;
|
|
969
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, this.LightBulb.Saturation);
|
|
970
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Saturation: ${this.LightBulb.Saturation}`);
|
|
1108
971
|
}
|
|
1109
972
|
}
|
|
1110
973
|
|
|
@@ -1118,35 +981,6 @@ export class ColorBulb {
|
|
|
1118
981
|
}
|
|
1119
982
|
}
|
|
1120
983
|
|
|
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
984
|
async BLEPushConnection() {
|
|
1151
985
|
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
1152
986
|
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Push Changes`);
|
|
@@ -1163,284 +997,17 @@ export class ColorBulb {
|
|
|
1163
997
|
}
|
|
1164
998
|
}
|
|
1165
999
|
|
|
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
|
-
minStep(device: device & devicesConfig): number {
|
|
1187
|
-
if (device.colorbulb?.set_minStep) {
|
|
1188
|
-
this.set_minStep = device.colorbulb?.set_minStep;
|
|
1189
|
-
} else {
|
|
1190
|
-
this.set_minStep = 1;
|
|
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
|
-
);
|
|
1284
|
-
}
|
|
1285
|
-
}
|
|
1286
|
-
|
|
1287
1000
|
async offlineOff(): Promise<void> {
|
|
1288
1001
|
if (this.device.offline) {
|
|
1289
|
-
|
|
1290
|
-
await this.updateHomeKitCharacteristics();
|
|
1002
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, false);
|
|
1291
1003
|
}
|
|
1292
1004
|
}
|
|
1293
1005
|
|
|
1294
1006
|
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';
|
|
1007
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, e);
|
|
1008
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, e);
|
|
1009
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, e);
|
|
1010
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, e);
|
|
1011
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, e);
|
|
1445
1012
|
}
|
|
1446
1013
|
}
|