@switchbot/homebridge-switchbot 3.5.0-beta.7 → 3.5.0-beta.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +4 -1
- package/CHANGELOG.md +4 -1
- package/config.schema.json +120 -17
- package/dist/device/blindtilt.d.ts +23 -96
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +425 -778
- package/dist/device/blindtilt.js.map +1 -1
- package/dist/device/bot.d.ts +26 -72
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +803 -837
- package/dist/device/bot.js.map +1 -1
- package/dist/device/ceilinglight.d.ts +14 -68
- package/dist/device/ceilinglight.d.ts.map +1 -1
- package/dist/device/ceilinglight.js +241 -606
- package/dist/device/ceilinglight.js.map +1 -1
- package/dist/device/colorbulb.d.ts +14 -75
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +283 -658
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.d.ts +15 -66
- package/dist/device/contact.d.ts.map +1 -1
- package/dist/device/contact.js +254 -545
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts +19 -88
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +412 -806
- package/dist/device/curtain.js.map +1 -1
- package/dist/device/device.d.ts +59 -0
- package/dist/device/device.d.ts.map +1 -0
- package/dist/device/device.js +711 -0
- package/dist/device/device.js.map +1 -0
- package/dist/device/fan.d.ts +51 -0
- package/dist/device/fan.d.ts.map +1 -0
- package/dist/device/fan.js +540 -0
- package/dist/device/fan.js.map +1 -0
- package/dist/device/hub.d.ts +16 -60
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +261 -616
- 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 +240 -594
- package/dist/device/humidifier.js.map +1 -1
- package/dist/device/iosensor.d.ts +11 -64
- package/dist/device/iosensor.d.ts.map +1 -1
- package/dist/device/iosensor.js +196 -600
- package/dist/device/iosensor.js.map +1 -1
- package/dist/device/lightstrip.d.ts +11 -69
- package/dist/device/lightstrip.d.ts.map +1 -1
- package/dist/device/lightstrip.js +281 -586
- package/dist/device/lightstrip.js.map +1 -1
- package/dist/device/lock.d.ts +16 -63
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +252 -560
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.d.ts +14 -64
- package/dist/device/meter.d.ts.map +1 -1
- package/dist/device/meter.js +191 -593
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.d.ts +14 -65
- package/dist/device/meterplus.d.ts.map +1 -1
- package/dist/device/meterplus.js +180 -593
- package/dist/device/meterplus.js.map +1 -1
- package/dist/device/motion.d.ts +13 -69
- package/dist/device/motion.d.ts.map +1 -1
- package/dist/device/motion.js +188 -532
- package/dist/device/motion.js.map +1 -1
- package/dist/device/plug.d.ts +9 -57
- package/dist/device/plug.d.ts.map +1 -1
- package/dist/device/plug.js +96 -458
- package/dist/device/plug.js.map +1 -1
- package/dist/device/robotvacuumcleaner.d.ts +12 -63
- package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
- package/dist/device/robotvacuumcleaner.js +202 -521
- package/dist/device/robotvacuumcleaner.js.map +1 -1
- package/dist/device/waterdetector.d.ts +10 -63
- package/dist/device/waterdetector.d.ts.map +1 -1
- package/dist/device/waterdetector.js +146 -475
- 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 +324 -452
- 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 +93 -307
- 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 +39 -281
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts +10 -43
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +113 -341
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +40 -0
- package/dist/irdevice/irdevice.d.ts.map +1 -0
- package/dist/irdevice/irdevice.js +330 -0
- package/dist/irdevice/irdevice.js.map +1 -0
- package/dist/irdevice/light.d.ts +12 -45
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +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 +87 -335
- 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 +19 -6
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +310 -172
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +62 -19
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +16 -552
- package/dist/settings.js.map +1 -1
- package/dist/utils.d.ts +77 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +638 -1
- package/dist/utils.js.map +1 -1
- package/eslint.config.js +96 -0
- package/package.json +19 -15
- package/src/custom.d.ts +2 -1
- package/src/device/blindtilt.ts +462 -817
- package/src/device/bot.ts +862 -931
- package/src/device/ceilinglight.ts +259 -633
- package/src/device/colorbulb.ts +300 -688
- package/src/device/contact.ts +288 -571
- package/src/device/curtain.ts +441 -838
- package/src/device/device.ts +734 -0
- package/src/device/fan.ts +596 -0
- package/src/device/hub.ts +299 -645
- package/src/device/humidifier.ts +274 -647
- package/src/device/iosensor.ts +233 -626
- package/src/device/lightstrip.ts +309 -620
- package/src/device/lock.ts +292 -601
- package/src/device/meter.ts +228 -619
- package/src/device/meterplus.ts +216 -619
- package/src/device/motion.ts +218 -559
- package/src/device/plug.ts +111 -490
- package/src/device/robotvacuumcleaner.ts +228 -550
- package/src/device/waterdetector.ts +169 -501
- 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 +350 -477
- package/src/irdevice/airpurifier.ts +120 -330
- package/src/irdevice/camera.ts +53 -301
- package/src/irdevice/fan.ts +130 -360
- package/src/irdevice/irdevice.ts +346 -0
- package/src/irdevice/light.ts +157 -412
- package/src/irdevice/other.ts +507 -648
- package/src/irdevice/tv.ts +117 -367
- package/src/irdevice/vacuumcleaner.ts +59 -311
- package/src/irdevice/waterheater.ts +61 -320
- package/src/platform.ts +355 -219
- package/src/settings.ts +116 -611
- package/src/utils.ts +642 -1
- package/src/device/waterdetector.json +0 -11
|
@@ -1,109 +1,75 @@
|
|
|
1
|
+
/* Copyright(C) 2021-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* ceilinglight.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';
|
|
8
|
+
import { Devices } from '../settings.js';
|
|
9
|
+
import { hs2rgb, rgb2hs, m2hs } from '../utils.js';
|
|
4
10
|
import { debounceTime, skipWhile, take, tap } from 'rxjs/operators';
|
|
5
|
-
import { hs2rgb, rgb2hs, m2hs, Devices } from '../settings.js';
|
|
6
11
|
/**
|
|
7
12
|
* Platform Accessory
|
|
8
13
|
* An instance of this class is created for each accessory your platform registers
|
|
9
14
|
* Each accessory may expose multiple services of different service types.
|
|
10
15
|
*/
|
|
11
|
-
export class CeilingLight {
|
|
16
|
+
export class CeilingLight extends deviceBase {
|
|
12
17
|
platform;
|
|
13
|
-
accessory;
|
|
14
|
-
device;
|
|
15
|
-
api;
|
|
16
|
-
log;
|
|
17
|
-
config;
|
|
18
|
-
hap;
|
|
19
18
|
// Services
|
|
20
|
-
|
|
21
|
-
// Characteristic Values
|
|
22
|
-
On;
|
|
23
|
-
Hue;
|
|
24
|
-
Saturation;
|
|
25
|
-
Brightness;
|
|
26
|
-
ColorTemperature;
|
|
27
|
-
FirmwareRevision;
|
|
28
|
-
// OpenAPI Status
|
|
29
|
-
OpenAPI_On;
|
|
30
|
-
OpenAPI_RGB;
|
|
31
|
-
OpenAPI_Brightness;
|
|
32
|
-
OpenAPI_FirmwareRevision;
|
|
33
|
-
OpenAPI_ColorTemperature;
|
|
34
|
-
// BLE Status
|
|
35
|
-
BLE_Delay;
|
|
36
|
-
BLE_On;
|
|
37
|
-
BLE_WifiRssi;
|
|
38
|
-
// BLE Others
|
|
39
|
-
BLE_IsConnected;
|
|
40
|
-
// Config
|
|
41
|
-
set_minStep;
|
|
42
|
-
scanDuration;
|
|
43
|
-
deviceLogging;
|
|
44
|
-
deviceRefreshRate;
|
|
45
|
-
adaptiveLightingShift;
|
|
19
|
+
LightBulb;
|
|
46
20
|
// Adaptive Lighting
|
|
47
21
|
AdaptiveLightingController;
|
|
48
|
-
|
|
49
|
-
maxKelvin;
|
|
50
|
-
// Others
|
|
51
|
-
cacheKelvin;
|
|
22
|
+
adaptiveLightingShift;
|
|
52
23
|
// Updates
|
|
53
24
|
ceilingLightUpdateInProgress;
|
|
54
25
|
doCeilingLightUpdate;
|
|
55
|
-
// Connection
|
|
56
|
-
OpenAPI;
|
|
57
|
-
BLE;
|
|
58
26
|
constructor(platform, accessory, device) {
|
|
27
|
+
super(platform, accessory, device);
|
|
59
28
|
this.platform = platform;
|
|
60
|
-
this.accessory = accessory;
|
|
61
|
-
this.device = device;
|
|
62
|
-
this.api = this.platform.api;
|
|
63
|
-
this.log = this.platform.log;
|
|
64
|
-
this.config = this.platform.config;
|
|
65
|
-
this.hap = this.api.hap;
|
|
66
|
-
// Connection
|
|
67
|
-
this.BLE = this.device.connectionType === 'BLE' || this.device.connectionType === 'BLE/OpenAPI';
|
|
68
|
-
this.OpenAPI = this.device.connectionType === 'OpenAPI' || this.device.connectionType === 'BLE/OpenAPI';
|
|
69
29
|
// default placeholders
|
|
70
|
-
this.deviceLogs(device);
|
|
71
|
-
this.scan(device);
|
|
72
|
-
this.refreshRate(device);
|
|
73
30
|
this.adaptiveLighting(device);
|
|
74
|
-
this.deviceContext();
|
|
75
|
-
this.deviceConfig(device);
|
|
76
31
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
77
32
|
this.doCeilingLightUpdate = new Subject();
|
|
78
33
|
this.ceilingLightUpdateInProgress = false;
|
|
79
|
-
//
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
.getService(this.hap.Service.
|
|
84
|
-
.
|
|
85
|
-
.
|
|
86
|
-
.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
this.accessory.
|
|
95
|
-
|
|
96
|
-
this.accessory.context.adaptiveLighting
|
|
97
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${this.accessory.context.adaptiveLighting}`);
|
|
34
|
+
// Initialize LightBulb Service
|
|
35
|
+
accessory.context.LightBulb = accessory.context.LightBulb ?? {};
|
|
36
|
+
this.LightBulb = {
|
|
37
|
+
Name: accessory.context.LightBul.bName ?? accessory.displayName,
|
|
38
|
+
Service: accessory.getService(this.hap.Service.Lightbulb) ?? accessory.addService(this.hap.Service.Lightbulb),
|
|
39
|
+
On: accessory.context.On ?? false,
|
|
40
|
+
Hue: accessory.context.Hue ?? 0,
|
|
41
|
+
Saturation: accessory.context.Saturation ?? 0,
|
|
42
|
+
Brightness: accessory.context.Brightness ?? 0,
|
|
43
|
+
ColorTemperature: accessory.context.ColorTemperature ?? 140,
|
|
44
|
+
};
|
|
45
|
+
accessory.context.LightBulb = this.LightBulb;
|
|
46
|
+
// Adaptive Lighting
|
|
47
|
+
if (this.adaptiveLightingShift === -1 && accessory.context.adaptiveLighting) {
|
|
48
|
+
accessory.removeService(this.LightBulb.Service);
|
|
49
|
+
this.LightBulb.Service = accessory.addService(this.hap.Service.Lightbulb);
|
|
50
|
+
accessory.context.adaptiveLighting = false;
|
|
51
|
+
this.debugLog(`${device.deviceType}: ${accessory.displayName} adaptiveLighting: ${accessory.context.adaptiveLighting}`);
|
|
98
52
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
53
|
+
if (this.adaptiveLightingShift !== -1) {
|
|
54
|
+
this.AdaptiveLightingController = new platform.api.hap.AdaptiveLightingController(this.LightBulb.Service, {
|
|
55
|
+
customTemperatureAdjustment: this.adaptiveLightingShift,
|
|
56
|
+
});
|
|
57
|
+
this.accessory.configureController(this.AdaptiveLightingController);
|
|
58
|
+
this.accessory.context.adaptiveLighting = true;
|
|
59
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${this.accessory.context.adaptiveLighting},`
|
|
60
|
+
+ ` adaptiveLightingShift: ${this.adaptiveLightingShift}`);
|
|
102
61
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
62
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLightingShift: ${this.adaptiveLightingShift}`);
|
|
63
|
+
// Initialize LightBulb Characteristics
|
|
64
|
+
this.LightBulb.Service
|
|
65
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.LightBulb.Name)
|
|
66
|
+
.getCharacteristic(this.hap.Characteristic.On)
|
|
67
|
+
.onGet(() => {
|
|
68
|
+
return this.LightBulb.On;
|
|
69
|
+
})
|
|
70
|
+
.onSet(this.OnSet.bind(this));
|
|
71
|
+
// Initialize LightBulb Brightness
|
|
72
|
+
this.LightBulb.Service
|
|
107
73
|
.getCharacteristic(this.hap.Characteristic.Brightness)
|
|
108
74
|
.setProps({
|
|
109
75
|
minStep: this.minStep(device),
|
|
@@ -112,11 +78,11 @@ export class CeilingLight {
|
|
|
112
78
|
validValueRanges: [0, 100],
|
|
113
79
|
})
|
|
114
80
|
.onGet(() => {
|
|
115
|
-
return this.Brightness;
|
|
81
|
+
return this.LightBulb.Brightness;
|
|
116
82
|
})
|
|
117
83
|
.onSet(this.BrightnessSet.bind(this));
|
|
118
|
-
//
|
|
119
|
-
this.
|
|
84
|
+
// Initialize LightBulb ColorTemperature
|
|
85
|
+
this.LightBulb.Service
|
|
120
86
|
.getCharacteristic(this.hap.Characteristic.ColorTemperature)
|
|
121
87
|
.setProps({
|
|
122
88
|
minValue: 140,
|
|
@@ -124,11 +90,11 @@ export class CeilingLight {
|
|
|
124
90
|
validValueRanges: [140, 500],
|
|
125
91
|
})
|
|
126
92
|
.onGet(() => {
|
|
127
|
-
return this.ColorTemperature;
|
|
93
|
+
return this.LightBulb.ColorTemperature;
|
|
128
94
|
})
|
|
129
95
|
.onSet(this.ColorTemperatureSet.bind(this));
|
|
130
|
-
//
|
|
131
|
-
this.
|
|
96
|
+
// Initialize LightBulb Hue
|
|
97
|
+
this.LightBulb.Service
|
|
132
98
|
.getCharacteristic(this.hap.Characteristic.Hue)
|
|
133
99
|
.setProps({
|
|
134
100
|
minValue: 0,
|
|
@@ -136,11 +102,11 @@ export class CeilingLight {
|
|
|
136
102
|
validValueRanges: [0, 360],
|
|
137
103
|
})
|
|
138
104
|
.onGet(() => {
|
|
139
|
-
return this.Hue;
|
|
105
|
+
return this.LightBulb.Hue;
|
|
140
106
|
})
|
|
141
107
|
.onSet(this.HueSet.bind(this));
|
|
142
|
-
//
|
|
143
|
-
this.
|
|
108
|
+
// Initialize LightBulb Saturation
|
|
109
|
+
this.LightBulb.Service
|
|
144
110
|
.getCharacteristic(this.hap.Characteristic.Saturation)
|
|
145
111
|
.setProps({
|
|
146
112
|
minValue: 0,
|
|
@@ -148,19 +114,11 @@ export class CeilingLight {
|
|
|
148
114
|
validValueRanges: [0, 100],
|
|
149
115
|
})
|
|
150
116
|
.onGet(() => {
|
|
151
|
-
return this.Saturation;
|
|
117
|
+
return this.LightBulb.Saturation;
|
|
152
118
|
})
|
|
153
119
|
.onSet(this.SaturationSet.bind(this));
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
this.AdaptiveLightingController = new platform.api.hap.AdaptiveLightingController(this.lightBulbService, {
|
|
157
|
-
customTemperatureAdjustment: this.adaptiveLightingShift,
|
|
158
|
-
});
|
|
159
|
-
this.accessory.configureController(this.AdaptiveLightingController);
|
|
160
|
-
this.accessory.context.adaptiveLighting = true;
|
|
161
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLighting: ${this.accessory.context.adaptiveLighting},` +
|
|
162
|
-
` adaptiveLightingShift: ${this.adaptiveLightingShift}`);
|
|
163
|
-
}
|
|
120
|
+
// Retrieve initial values and updateHomekit
|
|
121
|
+
this.refreshStatus();
|
|
164
122
|
// Update Homekit
|
|
165
123
|
this.updateHomeKitCharacteristics();
|
|
166
124
|
// Start an update interval
|
|
@@ -170,20 +128,41 @@ export class CeilingLight {
|
|
|
170
128
|
await this.refreshStatus();
|
|
171
129
|
});
|
|
172
130
|
//regisiter webhook event handler
|
|
173
|
-
if (
|
|
174
|
-
this.
|
|
131
|
+
if (device.webhook) {
|
|
132
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
|
|
175
133
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
|
|
176
134
|
try {
|
|
177
135
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
|
|
178
136
|
const { powerState, brightness, colorTemperature } = context;
|
|
179
|
-
const { On, Brightness, ColorTemperature } = this;
|
|
137
|
+
const { On, Brightness, ColorTemperature } = this.LightBulb;
|
|
180
138
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
|
|
181
139
|
'(powerState, brightness, colorTemperature) = ' +
|
|
182
140
|
`Webhook:(${powerState}, ${brightness}, ${colorTemperature}), ` +
|
|
183
141
|
`current:(${On}, ${Brightness}, ${ColorTemperature})`);
|
|
184
|
-
|
|
185
|
-
this.
|
|
186
|
-
this.
|
|
142
|
+
// On
|
|
143
|
+
this.LightBulb.On = powerState === 'ON' ? true : false;
|
|
144
|
+
if (this.accessory.context.Brightness !== this.LightBulb.On) {
|
|
145
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
149
|
+
}
|
|
150
|
+
// Brightness
|
|
151
|
+
this.LightBulb.Brightness = brightness;
|
|
152
|
+
if (this.accessory.context.Brightness !== this.LightBulb.Brightness) {
|
|
153
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
157
|
+
}
|
|
158
|
+
// ColorTemperature
|
|
159
|
+
this.LightBulb.ColorTemperature = colorTemperature;
|
|
160
|
+
if (this.accessory.context.ColorTemperature !== this.LightBulb.ColorTemperature) {
|
|
161
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
165
|
+
}
|
|
187
166
|
this.updateHomeKitCharacteristics();
|
|
188
167
|
}
|
|
189
168
|
catch (e) {
|
|
@@ -210,88 +189,75 @@ export class CeilingLight {
|
|
|
210
189
|
this.ceilingLightUpdateInProgress = false;
|
|
211
190
|
});
|
|
212
191
|
}
|
|
213
|
-
model(device) {
|
|
214
|
-
let model;
|
|
215
|
-
if (device.deviceType === 'Ceiling Light') {
|
|
216
|
-
model = 'W2612230' || 'W2612240';
|
|
217
|
-
}
|
|
218
|
-
else if (device.deviceType === 'Ceiling Light Pro') {
|
|
219
|
-
model = 'W2612210' || 'W2612220';
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
model = 'unknown';
|
|
223
|
-
}
|
|
224
|
-
return model;
|
|
225
|
-
}
|
|
226
192
|
/**
|
|
227
|
-
* Parse the device status from the
|
|
193
|
+
* Parse the device status from the SwitchBotBLE API
|
|
228
194
|
*/
|
|
229
|
-
async
|
|
230
|
-
if (!this.device.enableCloudService && this.OpenAPI) {
|
|
231
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} parseStatus enableCloudService: ${this.device.enableCloudService}`);
|
|
232
|
-
}
|
|
233
|
-
/*if (this.BLE) {
|
|
234
|
-
await this.BLEparseStatus();
|
|
235
|
-
} else*/ if (this.OpenAPI && this.platform.config.credentials?.token) {
|
|
236
|
-
await this.openAPIparseStatus();
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
await this.offlineOff();
|
|
240
|
-
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
async BLEparseStatus() {
|
|
195
|
+
async BLEparseStatus(serviceData) {
|
|
244
196
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
|
|
245
197
|
// State
|
|
246
|
-
switch (
|
|
198
|
+
switch (serviceData.state) {
|
|
247
199
|
case 'on':
|
|
248
|
-
this.On = true;
|
|
200
|
+
this.LightBulb.On = true;
|
|
249
201
|
break;
|
|
250
202
|
default:
|
|
251
|
-
this.On = false;
|
|
203
|
+
this.LightBulb.On = false;
|
|
252
204
|
}
|
|
253
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
205
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
254
206
|
}
|
|
255
|
-
|
|
207
|
+
/**
|
|
208
|
+
* Parse the device status from the SwitchBot OpenAPI
|
|
209
|
+
*/
|
|
210
|
+
async openAPIparseStatus(deviceStatus) {
|
|
256
211
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
|
|
257
|
-
switch (
|
|
212
|
+
switch (deviceStatus.body.power) {
|
|
258
213
|
case 'on':
|
|
259
|
-
this.On = true;
|
|
214
|
+
this.LightBulb.On = true;
|
|
260
215
|
break;
|
|
261
216
|
default:
|
|
262
|
-
this.On = false;
|
|
217
|
+
this.LightBulb.On = false;
|
|
263
218
|
}
|
|
264
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
219
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
265
220
|
// Brightness
|
|
266
|
-
this.Brightness = Number(
|
|
267
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
|
|
221
|
+
this.LightBulb.Brightness = Number(deviceStatus.body.brightness);
|
|
222
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
268
223
|
// Color, Hue & Brightness
|
|
269
|
-
if (
|
|
270
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(
|
|
271
|
-
const [red, green, blue] =
|
|
224
|
+
if (deviceStatus.body.color) {
|
|
225
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} color: ${JSON.stringify(deviceStatus.body.color)}`);
|
|
226
|
+
const [red, green, blue] = deviceStatus.body.color.split(':');
|
|
272
227
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} red: ${JSON.stringify(red)}`);
|
|
273
228
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} green: ${JSON.stringify(green)}`);
|
|
274
229
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} blue: ${JSON.stringify(blue)}`);
|
|
275
230
|
const [hue, saturation] = rgb2hs(Number(red), Number(green), Number(blue));
|
|
276
231
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}` + ` hs: ${JSON.stringify(rgb2hs(Number(red), Number(green), Number(blue)))}`);
|
|
277
232
|
// Hue
|
|
278
|
-
this.Hue = hue;
|
|
279
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
233
|
+
this.LightBulb.Hue = hue;
|
|
234
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
280
235
|
// Saturation
|
|
281
|
-
this.Saturation = saturation;
|
|
282
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
|
|
236
|
+
this.LightBulb.Saturation = saturation;
|
|
237
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
283
238
|
}
|
|
284
239
|
// ColorTemperature
|
|
285
|
-
if (!Number.isNaN(
|
|
286
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} OpenAPI ColorTemperature: ${
|
|
287
|
-
const mired = Math.round(1000000 /
|
|
288
|
-
this.ColorTemperature = Number(mired);
|
|
289
|
-
this.ColorTemperature = Math.max(Math.min(this.ColorTemperature, 500), 140);
|
|
290
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
240
|
+
if (!Number.isNaN(deviceStatus.body.colorTemperature)) {
|
|
241
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} OpenAPI ColorTemperature: ${deviceStatus.body.colorTemperature}`);
|
|
242
|
+
const mired = Math.round(1000000 / deviceStatus.body.colorTemperature);
|
|
243
|
+
this.LightBulb.ColorTemperature = Number(mired);
|
|
244
|
+
this.LightBulb.ColorTemperature = Math.max(Math.min(this.LightBulb.ColorTemperature, 500), 140);
|
|
245
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
246
|
+
}
|
|
247
|
+
// Firmware Version
|
|
248
|
+
const version = deviceStatus.body.version?.toString();
|
|
249
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
|
|
250
|
+
if (deviceStatus.body.version) {
|
|
251
|
+
const deviceVersion = version?.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
252
|
+
this.accessory
|
|
253
|
+
.getService(this.hap.Service.AccessoryInformation)
|
|
254
|
+
.setCharacteristic(this.hap.Characteristic.HardwareRevision, deviceVersion)
|
|
255
|
+
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
256
|
+
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
257
|
+
.updateValue(deviceVersion);
|
|
258
|
+
this.accessory.context.deviceVersion = deviceVersion;
|
|
259
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceVersion: ${this.accessory.context.deviceVersion}`);
|
|
291
260
|
}
|
|
292
|
-
// FirmwareRevision
|
|
293
|
-
this.FirmwareRevision = this.OpenAPI_FirmwareRevision;
|
|
294
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
295
261
|
}
|
|
296
262
|
/**
|
|
297
263
|
* Asks the SwitchBot API for the latest device information
|
|
@@ -324,110 +290,42 @@ export class CeilingLight {
|
|
|
324
290
|
// Start to monitor advertisement packets
|
|
325
291
|
(async () => {
|
|
326
292
|
// Start to monitor advertisement packets
|
|
327
|
-
await switchbot.startScan({
|
|
328
|
-
id: this.device.bleMac,
|
|
329
|
-
});
|
|
293
|
+
await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
|
|
330
294
|
// Set an event handler
|
|
331
295
|
switchbot.onadvertisement = (ad) => {
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
296
|
+
if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
|
|
297
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
|
|
298
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
|
|
335
299
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
336
|
-
this.BLE_On = ad.serviceData.state;
|
|
337
|
-
//this.delay = ad.serviceData.delay;
|
|
338
|
-
//this.timer = ad.serviceData.timer;
|
|
339
|
-
//this.syncUtcTime = ad.serviceData.syncUtcTime;
|
|
340
|
-
//this.wifiRssi = ad.serviceData.wifiRssi;
|
|
341
|
-
//this.overload = ad.serviceData.overload;
|
|
342
|
-
//this.currentPower = ad.serviceData.currentPower;
|
|
343
300
|
}
|
|
344
301
|
else {
|
|
345
302
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
346
303
|
}
|
|
347
304
|
};
|
|
348
|
-
// Wait
|
|
305
|
+
// Wait 10 seconds
|
|
349
306
|
await switchbot.wait(this.scanDuration * 1000);
|
|
350
307
|
// Stop to monitor
|
|
351
308
|
await switchbot.stopScan();
|
|
352
309
|
// Update HomeKit
|
|
353
|
-
await this.BLEparseStatus();
|
|
310
|
+
await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
|
|
354
311
|
await this.updateHomeKitCharacteristics();
|
|
355
312
|
})();
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
model: '',
|
|
360
|
-
id: this.device.bleMac,
|
|
361
|
-
})
|
|
362
|
-
.then(async () => {
|
|
363
|
-
// Set an event handler
|
|
364
|
-
switchbot.onadvertisement = async (ad: ad) => {
|
|
365
|
-
this.debugLog(
|
|
366
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
|
|
367
|
-
` BLE Address Found: ${ad.address}`,
|
|
368
|
-
);
|
|
369
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
370
|
-
this.BLE_On = ad.serviceData.state;
|
|
371
|
-
//this.delay = ad.serviceData.delay;
|
|
372
|
-
//this.timer = ad.serviceData.timer;
|
|
373
|
-
//this.syncUtcTime = ad.serviceData.syncUtcTime;
|
|
374
|
-
//this.wifiRssi = ad.serviceData.wifiRssi;
|
|
375
|
-
//this.overload = ad.serviceData.overload;
|
|
376
|
-
//this.currentPower = ad.serviceData.currentPower;
|
|
377
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
378
|
-
this.debugLog(
|
|
379
|
-
`${this.device.deviceType}: ${this.accessory.displayName} state: ${ad.serviceData.state}, ` +
|
|
380
|
-
`delay: ${ad.serviceData.delay}, timer: ${ad.serviceData.timer}, syncUtcTime: ${ad.serviceData.syncUtcTime} ` +
|
|
381
|
-
`wifiRssi: ${ad.serviceData.wifiRssi}, overload: ${ad.serviceData.overload}, currentPower: ${ad.serviceData.currentPower}`,
|
|
382
|
-
);
|
|
383
|
-
|
|
384
|
-
if (ad.serviceData) {
|
|
385
|
-
this.BLE_IsConnected = true;
|
|
386
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
387
|
-
await this.stopScanning(switchbot);
|
|
388
|
-
} else {
|
|
389
|
-
this.BLE_IsConnected = false;
|
|
390
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
391
|
-
}
|
|
392
|
-
};
|
|
393
|
-
// Wait
|
|
394
|
-
return await sleep(this.scanDuration * 1000);
|
|
395
|
-
})
|
|
396
|
-
.then(async () => {
|
|
397
|
-
// Stop to monitor
|
|
398
|
-
await this.stopScanning(switchbot);
|
|
399
|
-
})
|
|
400
|
-
.catch(async (e: any) => {
|
|
401
|
-
this.apiError(e);
|
|
402
|
-
this.errorLog(
|
|
403
|
-
`${this.device.deviceType}: ${this.accessory.displayName} failed BLERefreshStatus with ${this.device.connectionType}` +
|
|
404
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
405
|
-
);
|
|
406
|
-
await this.BLERefreshConnection(switchbot);
|
|
407
|
-
});
|
|
408
|
-
} else {
|
|
409
|
-
await this.BLERefreshConnection(switchbot);
|
|
410
|
-
}*/
|
|
313
|
+
if (switchbot === undefined) {
|
|
314
|
+
await this.BLERefreshConnection(switchbot);
|
|
315
|
+
}
|
|
411
316
|
}
|
|
412
317
|
async openAPIRefreshStatus() {
|
|
413
318
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
|
|
414
319
|
try {
|
|
415
|
-
const { body, statusCode } = await
|
|
416
|
-
headers: this.platform.generateHeaders(),
|
|
417
|
-
});
|
|
320
|
+
const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
|
|
418
321
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
|
|
419
322
|
const deviceStatus = await body.json();
|
|
420
323
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
421
324
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
422
325
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
423
|
-
this.
|
|
326
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
424
327
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
425
|
-
this.
|
|
426
|
-
this.OpenAPI_RGB = deviceStatus.body.color;
|
|
427
|
-
this.OpenAPI_Brightness = deviceStatus.body.brightness;
|
|
428
|
-
this.OpenAPI_ColorTemperature = deviceStatus.body.colorTemperature;
|
|
429
|
-
this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
|
|
430
|
-
this.openAPIparseStatus();
|
|
328
|
+
this.openAPIparseStatus(deviceStatus);
|
|
431
329
|
this.updateHomeKitCharacteristics();
|
|
432
330
|
}
|
|
433
331
|
else {
|
|
@@ -475,8 +373,9 @@ export class CeilingLight {
|
|
|
475
373
|
}
|
|
476
374
|
async BLEpushChanges() {
|
|
477
375
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`);
|
|
478
|
-
if (this.On !== this.accessory.context.On) {
|
|
479
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
376
|
+
if (this.LightBulb.On !== this.accessory.context.On) {
|
|
377
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
378
|
+
+ ` BLEpushChanges On: ${this.LightBulb.On} OnCached: ${this.accessory.context.On}`);
|
|
480
379
|
const switchbot = await this.platform.connectBLE();
|
|
481
380
|
// Convert to BLE Address
|
|
482
381
|
this.device.bleMac = this.device
|
|
@@ -490,11 +389,11 @@ export class CeilingLight {
|
|
|
490
389
|
id: this.device.bleMac,
|
|
491
390
|
})
|
|
492
391
|
.then(async (device_list) => {
|
|
493
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
494
|
-
return await this.
|
|
495
|
-
max: this.
|
|
392
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
393
|
+
return await this.retryBLE({
|
|
394
|
+
max: await this.maxRetryBLE(),
|
|
496
395
|
fn: async () => {
|
|
497
|
-
if (this.On) {
|
|
396
|
+
if (this.LightBulb.On) {
|
|
498
397
|
return await device_list[0].turnOn({ id: this.device.bleMac });
|
|
499
398
|
}
|
|
500
399
|
else {
|
|
@@ -505,7 +404,9 @@ export class CeilingLight {
|
|
|
505
404
|
})
|
|
506
405
|
.then(() => {
|
|
507
406
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
508
|
-
this.
|
|
407
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
408
|
+
+ `On: ${this.LightBulb.On} sent over BLE, sent successfully`);
|
|
409
|
+
this.LightBulb.On = false;
|
|
509
410
|
})
|
|
510
411
|
.catch(async (e) => {
|
|
511
412
|
this.apiError(e);
|
|
@@ -515,14 +416,15 @@ export class CeilingLight {
|
|
|
515
416
|
});
|
|
516
417
|
}
|
|
517
418
|
else {
|
|
518
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
419
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
420
|
+
+ ` No BLEpushChanges: On: ${this.LightBulb.On}, ` + `OnCached: ${this.accessory.context.On}`);
|
|
519
421
|
}
|
|
520
422
|
}
|
|
521
423
|
async openAPIpushChanges() {
|
|
522
424
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIpushChanges`);
|
|
523
|
-
if (this.On !== this.accessory.context.On) {
|
|
425
|
+
if (this.LightBulb.On !== this.accessory.context.On) {
|
|
524
426
|
let command = '';
|
|
525
|
-
if (this.On) {
|
|
427
|
+
if (this.LightBulb.On) {
|
|
526
428
|
command = 'turnOn';
|
|
527
429
|
}
|
|
528
430
|
else {
|
|
@@ -546,8 +448,10 @@ export class CeilingLight {
|
|
|
546
448
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
|
|
547
449
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
548
450
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
549
|
-
this.
|
|
451
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
550
452
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
453
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
454
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
|
|
551
455
|
}
|
|
552
456
|
else {
|
|
553
457
|
this.statusCode(statusCode);
|
|
@@ -562,28 +466,28 @@ export class CeilingLight {
|
|
|
562
466
|
}
|
|
563
467
|
else {
|
|
564
468
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges.` +
|
|
565
|
-
`On: ${this.On}, ` +
|
|
469
|
+
`On: ${this.LightBulb.On}, ` +
|
|
566
470
|
`OnCached: ${this.accessory.context.On}`);
|
|
567
471
|
}
|
|
568
472
|
// Push Hue & Saturation Update
|
|
569
|
-
if (this.On) {
|
|
473
|
+
if (this.LightBulb.On) {
|
|
570
474
|
await this.pushHueSaturationChanges();
|
|
571
475
|
}
|
|
572
476
|
// Push ColorTemperature Update
|
|
573
|
-
if (this.On) {
|
|
477
|
+
if (this.LightBulb.On) {
|
|
574
478
|
await this.pushColorTemperatureChanges();
|
|
575
479
|
}
|
|
576
480
|
// Push Brightness Update
|
|
577
|
-
if (this.On) {
|
|
481
|
+
if (this.LightBulb.On) {
|
|
578
482
|
await this.pushBrightnessChanges();
|
|
579
483
|
}
|
|
580
484
|
}
|
|
581
485
|
async pushHueSaturationChanges() {
|
|
582
486
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushHueSaturationChanges`);
|
|
583
|
-
if (this.Hue !== this.accessory.context.Hue || this.Saturation !== this.accessory.context.Saturation) {
|
|
584
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.Hue)}`);
|
|
585
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.Saturation)}`);
|
|
586
|
-
const [red, green, blue] = hs2rgb(Number(this.Hue), Number(this.Saturation));
|
|
487
|
+
if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
|
|
488
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
|
|
489
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
|
|
490
|
+
const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
|
|
587
491
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
|
|
588
492
|
const bodyChange = JSON.stringify({
|
|
589
493
|
command: 'setColor',
|
|
@@ -603,8 +507,10 @@ export class CeilingLight {
|
|
|
603
507
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
|
|
604
508
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
605
509
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
606
|
-
this.
|
|
510
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
607
511
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
512
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
513
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
|
|
608
514
|
}
|
|
609
515
|
else {
|
|
610
516
|
this.statusCode(statusCode);
|
|
@@ -618,15 +524,15 @@ export class CeilingLight {
|
|
|
618
524
|
}
|
|
619
525
|
}
|
|
620
526
|
else {
|
|
621
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushHueSaturationChanges. Hue: ${this.Hue}, ` +
|
|
622
|
-
`HueCached: ${this.accessory.context.Hue}, Saturation: ${this.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`);
|
|
527
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushHueSaturationChanges. Hue: ${this.LightBulb.Hue}, ` +
|
|
528
|
+
`HueCached: ${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`);
|
|
623
529
|
}
|
|
624
530
|
}
|
|
625
531
|
async pushColorTemperatureChanges() {
|
|
626
532
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushColorTemperatureChanges`);
|
|
627
|
-
if (this.ColorTemperature !== this.accessory.context.ColorTemperature) {
|
|
628
|
-
const kelvin = Math.round(1000000 / Number(this.ColorTemperature));
|
|
629
|
-
this.
|
|
533
|
+
if (this.LightBulb.ColorTemperature !== this.accessory.context.ColorTemperature) {
|
|
534
|
+
const kelvin = Math.round(1000000 / Number(this.LightBulb.ColorTemperature));
|
|
535
|
+
this.accessory.context.kelvin = kelvin;
|
|
630
536
|
const bodyChange = JSON.stringify({
|
|
631
537
|
command: 'setColorTemperature',
|
|
632
538
|
parameter: `${kelvin}`,
|
|
@@ -645,7 +551,7 @@ export class CeilingLight {
|
|
|
645
551
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
|
|
646
552
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
647
553
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
648
|
-
this.
|
|
554
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
649
555
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
650
556
|
}
|
|
651
557
|
else {
|
|
@@ -661,15 +567,15 @@ export class CeilingLight {
|
|
|
661
567
|
}
|
|
662
568
|
else {
|
|
663
569
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushColorTemperatureChanges.` +
|
|
664
|
-
`ColorTemperature: ${this.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`);
|
|
570
|
+
`ColorTemperature: ${this.LightBulb.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`);
|
|
665
571
|
}
|
|
666
572
|
}
|
|
667
573
|
async pushBrightnessChanges() {
|
|
668
574
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushBrightnessChanges`);
|
|
669
|
-
if (this.Brightness !== this.accessory.context.Brightness) {
|
|
575
|
+
if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
|
|
670
576
|
const bodyChange = JSON.stringify({
|
|
671
577
|
command: 'setBrightness',
|
|
672
|
-
parameter: `${this.Brightness}`,
|
|
578
|
+
parameter: `${this.LightBulb.Brightness}`,
|
|
673
579
|
commandType: 'command',
|
|
674
580
|
});
|
|
675
581
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
|
|
@@ -685,8 +591,10 @@ export class CeilingLight {
|
|
|
685
591
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus body: ${JSON.stringify(deviceStatus.body)}`);
|
|
686
592
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
687
593
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
688
|
-
this.
|
|
594
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
689
595
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
596
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
597
|
+
+ `request to SwitchBot API, body: ${JSON.stringify(JSON.parse(bodyChange))} sent successfully`);
|
|
690
598
|
}
|
|
691
599
|
else {
|
|
692
600
|
this.statusCode(statusCode);
|
|
@@ -701,7 +609,7 @@ export class CeilingLight {
|
|
|
701
609
|
}
|
|
702
610
|
else {
|
|
703
611
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushBrightnessChanges.` +
|
|
704
|
-
`Brightness: ${this.Brightness}, ` +
|
|
612
|
+
`Brightness: ${this.LightBulb.Brightness}, ` +
|
|
705
613
|
`BrightnessCached: ${this.accessory.context.Brightness}`);
|
|
706
614
|
}
|
|
707
615
|
}
|
|
@@ -709,132 +617,135 @@ export class CeilingLight {
|
|
|
709
617
|
* Handle requests to set the value of the "On" characteristic
|
|
710
618
|
*/
|
|
711
619
|
async OnSet(value) {
|
|
712
|
-
if (this.On === this.accessory.context.On) {
|
|
620
|
+
if (this.LightBulb.On === this.accessory.context.On) {
|
|
713
621
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set On: ${value}`);
|
|
714
622
|
}
|
|
715
623
|
else {
|
|
716
624
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set On: ${value}`);
|
|
717
625
|
}
|
|
718
|
-
this.On = value;
|
|
626
|
+
this.LightBulb.On = value;
|
|
719
627
|
this.doCeilingLightUpdate.next();
|
|
720
628
|
}
|
|
721
629
|
/**
|
|
722
630
|
* Handle requests to set the value of the "Brightness" characteristic
|
|
723
631
|
*/
|
|
724
632
|
async BrightnessSet(value) {
|
|
725
|
-
if (this.Brightness === this.accessory.context.Brightness) {
|
|
633
|
+
if (this.LightBulb.Brightness === this.accessory.context.Brightness) {
|
|
726
634
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Brightness: ${value}`);
|
|
727
635
|
}
|
|
728
|
-
else if (this.On) {
|
|
636
|
+
else if (this.LightBulb.On) {
|
|
729
637
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
|
|
730
638
|
}
|
|
731
639
|
else {
|
|
732
640
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
|
|
733
641
|
}
|
|
734
|
-
this.Brightness = value;
|
|
642
|
+
this.LightBulb.Brightness = value;
|
|
735
643
|
this.doCeilingLightUpdate.next();
|
|
736
644
|
}
|
|
737
645
|
/**
|
|
738
646
|
* Handle requests to set the value of the "ColorTemperature" characteristic
|
|
739
647
|
*/
|
|
740
648
|
async ColorTemperatureSet(value) {
|
|
741
|
-
if (this.ColorTemperature === this.accessory.context.ColorTemperature) {
|
|
649
|
+
if (this.LightBulb.ColorTemperature === this.accessory.context.ColorTemperature) {
|
|
742
650
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set ColorTemperature: ${value}`);
|
|
743
651
|
}
|
|
744
|
-
else if (this.On) {
|
|
652
|
+
else if (this.LightBulb.On) {
|
|
745
653
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
|
|
746
654
|
}
|
|
747
655
|
else {
|
|
748
656
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
|
|
749
657
|
}
|
|
658
|
+
const minKelvin = 2000;
|
|
659
|
+
const maxKelvin = 9000;
|
|
750
660
|
// Convert mired to kelvin to nearest 100 (SwitchBot seems to need this)
|
|
751
661
|
const kelvin = Math.round(1000000 / Number(value) / 100) * 100;
|
|
752
662
|
// Check and increase/decrease kelvin to range of device
|
|
753
|
-
const k = Math.min(Math.max(kelvin,
|
|
754
|
-
if (!this.accessory.context.On || this.
|
|
663
|
+
const k = Math.min(Math.max(kelvin, minKelvin), maxKelvin);
|
|
664
|
+
if (!this.accessory.context.On || this.accessory.context.kelvin === k) {
|
|
755
665
|
return;
|
|
756
666
|
}
|
|
757
667
|
// Updating the hue/sat to the corresponding values mimics native adaptive lighting
|
|
758
668
|
const hs = m2hs(value);
|
|
759
|
-
this.
|
|
760
|
-
this.
|
|
761
|
-
this.ColorTemperature = value;
|
|
669
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, hs[0]);
|
|
670
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, hs[1]);
|
|
671
|
+
this.LightBulb.ColorTemperature = value;
|
|
762
672
|
this.doCeilingLightUpdate.next();
|
|
763
673
|
}
|
|
764
674
|
/**
|
|
765
675
|
* Handle requests to set the value of the "Hue" characteristic
|
|
766
676
|
*/
|
|
767
677
|
async HueSet(value) {
|
|
768
|
-
if (this.Hue === this.accessory.context.Hue) {
|
|
678
|
+
if (this.LightBulb.Hue === this.accessory.context.Hue) {
|
|
769
679
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Hue: ${value}`);
|
|
770
680
|
}
|
|
771
|
-
else if (this.On) {
|
|
681
|
+
else if (this.LightBulb.On) {
|
|
772
682
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
|
|
773
683
|
}
|
|
774
684
|
else {
|
|
775
685
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
|
|
776
686
|
}
|
|
777
|
-
this.
|
|
778
|
-
this.Hue = value;
|
|
687
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
|
|
688
|
+
this.LightBulb.Hue = value;
|
|
779
689
|
this.doCeilingLightUpdate.next();
|
|
780
690
|
}
|
|
781
691
|
/**
|
|
782
692
|
* Handle requests to set the value of the "Saturation" characteristic
|
|
783
693
|
*/
|
|
784
694
|
async SaturationSet(value) {
|
|
785
|
-
if (this.Saturation === this.accessory.context.Saturation) {
|
|
695
|
+
if (this.LightBulb.Saturation === this.accessory.context.Saturation) {
|
|
786
696
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Saturation: ${value}`);
|
|
787
697
|
}
|
|
788
|
-
else if (this.On) {
|
|
698
|
+
else if (this.LightBulb.On) {
|
|
789
699
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
|
|
790
700
|
}
|
|
791
701
|
else {
|
|
792
702
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
|
|
793
703
|
}
|
|
794
|
-
this.
|
|
795
|
-
this.Saturation = value;
|
|
704
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
|
|
705
|
+
this.LightBulb.Saturation = value;
|
|
796
706
|
this.doCeilingLightUpdate.next();
|
|
797
707
|
}
|
|
798
708
|
async updateHomeKitCharacteristics() {
|
|
799
|
-
if (this.On === undefined) {
|
|
800
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
709
|
+
if (this.LightBulb.On === undefined) {
|
|
710
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
801
711
|
}
|
|
802
712
|
else {
|
|
803
|
-
this.accessory.context.On = this.On;
|
|
804
|
-
this.
|
|
805
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
713
|
+
this.accessory.context.On = this.LightBulb.On;
|
|
714
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, this.LightBulb.On);
|
|
715
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.LightBulb.On}`);
|
|
806
716
|
}
|
|
807
|
-
if (this.Brightness === undefined) {
|
|
808
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
|
|
717
|
+
if (this.LightBulb.Brightness === undefined) {
|
|
718
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
809
719
|
}
|
|
810
720
|
else {
|
|
811
|
-
this.accessory.context.Brightness = this.Brightness;
|
|
812
|
-
this.
|
|
813
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.Brightness}`);
|
|
721
|
+
this.accessory.context.Brightness = this.LightBulb.Brightness;
|
|
722
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, this.LightBulb.Brightness);
|
|
723
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.LightBulb.Brightness}`);
|
|
814
724
|
}
|
|
815
|
-
if (this.ColorTemperature === undefined) {
|
|
816
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
725
|
+
if (this.LightBulb.ColorTemperature === undefined) {
|
|
726
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
817
727
|
}
|
|
818
728
|
else {
|
|
819
|
-
this.accessory.context.ColorTemperature = this.ColorTemperature;
|
|
820
|
-
this.
|
|
821
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
729
|
+
this.accessory.context.ColorTemperature = this.LightBulb.ColorTemperature;
|
|
730
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, this.LightBulb.ColorTemperature);
|
|
731
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
732
|
+
+ ` updateCharacteristic ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
822
733
|
}
|
|
823
|
-
if (this.Hue === undefined) {
|
|
824
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
734
|
+
if (this.LightBulb.Hue === undefined) {
|
|
735
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
825
736
|
}
|
|
826
737
|
else {
|
|
827
|
-
this.accessory.context.Hue = this.Hue;
|
|
828
|
-
this.
|
|
829
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.Hue}`);
|
|
738
|
+
this.accessory.context.Hue = this.LightBulb.Hue;
|
|
739
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, this.LightBulb.Hue);
|
|
740
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.LightBulb.Hue}`);
|
|
830
741
|
}
|
|
831
|
-
if (this.Saturation === undefined) {
|
|
832
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.Saturation}`);
|
|
742
|
+
if (this.LightBulb.Saturation === undefined) {
|
|
743
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
833
744
|
}
|
|
834
745
|
else {
|
|
835
|
-
this.accessory.context.Saturation = this.Saturation;
|
|
836
|
-
this.
|
|
837
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Saturation: ${this.Saturation}`);
|
|
746
|
+
this.accessory.context.Saturation = this.LightBulb.Saturation;
|
|
747
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, this.LightBulb.Saturation);
|
|
748
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Saturation: ${this.LightBulb.Saturation}`);
|
|
838
749
|
}
|
|
839
750
|
}
|
|
840
751
|
async adaptiveLighting(device) {
|
|
@@ -847,34 +758,6 @@ export class CeilingLight {
|
|
|
847
758
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} adaptiveLightingShift: ${this.adaptiveLightingShift}`);
|
|
848
759
|
}
|
|
849
760
|
}
|
|
850
|
-
async stopScanning(switchbot) {
|
|
851
|
-
switchbot.stopScan();
|
|
852
|
-
if (this.BLE_IsConnected) {
|
|
853
|
-
await this.BLEparseStatus();
|
|
854
|
-
await this.updateHomeKitCharacteristics();
|
|
855
|
-
}
|
|
856
|
-
else {
|
|
857
|
-
await this.BLERefreshConnection(switchbot);
|
|
858
|
-
}
|
|
859
|
-
}
|
|
860
|
-
async getCustomBLEAddress(switchbot) {
|
|
861
|
-
if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
|
|
862
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} customBLEaddress: ${this.device.customBLEaddress}`);
|
|
863
|
-
(async () => {
|
|
864
|
-
// Start to monitor advertisement packets
|
|
865
|
-
await switchbot.startScan({
|
|
866
|
-
model: 'u',
|
|
867
|
-
});
|
|
868
|
-
// Set an event handler
|
|
869
|
-
switchbot.onadvertisement = (ad) => {
|
|
870
|
-
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} ad: ${JSON.stringify(ad, null, ' ')}`);
|
|
871
|
-
};
|
|
872
|
-
await sleep(10000);
|
|
873
|
-
// Stop to monitor
|
|
874
|
-
switchbot.stopScan();
|
|
875
|
-
})();
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
761
|
async BLEPushConnection() {
|
|
879
762
|
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
880
763
|
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} Using OpenAPI Connection to Push Changes`);
|
|
@@ -889,275 +772,27 @@ export class CeilingLight {
|
|
|
889
772
|
await this.openAPIRefreshStatus();
|
|
890
773
|
}
|
|
891
774
|
}
|
|
892
|
-
async retry({ max, fn }) {
|
|
893
|
-
return fn().catch(async (e) => {
|
|
894
|
-
if (max === 0) {
|
|
895
|
-
throw e;
|
|
896
|
-
}
|
|
897
|
-
this.infoLog(e);
|
|
898
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Retrying`);
|
|
899
|
-
await sleep(1000);
|
|
900
|
-
return this.retry({ max: max - 1, fn });
|
|
901
|
-
});
|
|
902
|
-
}
|
|
903
|
-
maxRetry() {
|
|
904
|
-
if (this.device.maxRetry) {
|
|
905
|
-
return this.device.maxRetry;
|
|
906
|
-
}
|
|
907
|
-
else {
|
|
908
|
-
return 5;
|
|
909
|
-
}
|
|
910
|
-
}
|
|
911
775
|
minStep(device) {
|
|
776
|
+
let set_minStep;
|
|
912
777
|
if (device.ceilinglight?.set_minStep) {
|
|
913
|
-
|
|
914
|
-
}
|
|
915
|
-
else {
|
|
916
|
-
this.set_minStep = 1;
|
|
917
|
-
}
|
|
918
|
-
return this.set_minStep;
|
|
919
|
-
}
|
|
920
|
-
async scan(device) {
|
|
921
|
-
if (device.scanDuration) {
|
|
922
|
-
this.scanDuration = this.accessory.context.scanDuration = device.scanDuration;
|
|
923
|
-
if (this.BLE) {
|
|
924
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config scanDuration: ${this.scanDuration}`);
|
|
925
|
-
}
|
|
778
|
+
set_minStep = device.ceilinglight?.set_minStep;
|
|
926
779
|
}
|
|
927
780
|
else {
|
|
928
|
-
|
|
929
|
-
if (this.BLE) {
|
|
930
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default scanDuration: ${this.scanDuration}`);
|
|
931
|
-
}
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
async statusCode(statusCode) {
|
|
935
|
-
switch (statusCode) {
|
|
936
|
-
case 151:
|
|
937
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
|
|
938
|
-
break;
|
|
939
|
-
case 152:
|
|
940
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
|
|
941
|
-
break;
|
|
942
|
-
case 160:
|
|
943
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
|
|
944
|
-
break;
|
|
945
|
-
case 161:
|
|
946
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
|
|
947
|
-
this.offlineOff();
|
|
948
|
-
break;
|
|
949
|
-
case 171:
|
|
950
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
|
|
951
|
-
`Hub: ${this.device.hubDeviceId}`);
|
|
952
|
-
this.offlineOff();
|
|
953
|
-
break;
|
|
954
|
-
case 190:
|
|
955
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
|
|
956
|
-
` Or command format is invalid, statusCode: ${statusCode}`);
|
|
957
|
-
break;
|
|
958
|
-
case 100:
|
|
959
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
|
|
960
|
-
break;
|
|
961
|
-
case 200:
|
|
962
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
|
|
963
|
-
break;
|
|
964
|
-
case 400:
|
|
965
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
|
|
966
|
-
+ `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
|
|
967
|
-
break;
|
|
968
|
-
case 401:
|
|
969
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
|
|
970
|
-
+ `but the request has not been authenticated, statusCode: ${statusCode}`);
|
|
971
|
-
break;
|
|
972
|
-
case 403:
|
|
973
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
|
|
974
|
-
+ `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
|
|
975
|
-
break;
|
|
976
|
-
case 404:
|
|
977
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
|
|
978
|
-
+ `statusCode: ${statusCode}`);
|
|
979
|
-
break;
|
|
980
|
-
case 406:
|
|
981
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
|
|
982
|
-
+ `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
|
|
983
|
-
break;
|
|
984
|
-
case 415:
|
|
985
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
|
|
986
|
-
+ `header that is not supported by the server, statusCode: ${statusCode}`);
|
|
987
|
-
break;
|
|
988
|
-
case 422:
|
|
989
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
|
|
990
|
-
+ `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
|
|
991
|
-
break;
|
|
992
|
-
case 429:
|
|
993
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
|
|
994
|
-
+ `requests allowed for a given time window, statusCode: ${statusCode}`);
|
|
995
|
-
break;
|
|
996
|
-
case 500:
|
|
997
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
|
|
998
|
-
+ `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
|
|
999
|
-
break;
|
|
1000
|
-
default:
|
|
1001
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
|
|
1002
|
-
`${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`);
|
|
781
|
+
set_minStep = 1;
|
|
1003
782
|
}
|
|
783
|
+
return set_minStep;
|
|
1004
784
|
}
|
|
1005
785
|
async offlineOff() {
|
|
1006
786
|
if (this.device.offline) {
|
|
1007
|
-
|
|
1008
|
-
await this.updateHomeKitCharacteristics();
|
|
787
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, false);
|
|
1009
788
|
}
|
|
1010
789
|
}
|
|
1011
790
|
apiError(e) {
|
|
1012
|
-
this.
|
|
1013
|
-
this.
|
|
1014
|
-
this.
|
|
1015
|
-
this.
|
|
1016
|
-
this.
|
|
1017
|
-
}
|
|
1018
|
-
async deviceContext() {
|
|
1019
|
-
if (this.On === undefined) {
|
|
1020
|
-
this.On = false;
|
|
1021
|
-
}
|
|
1022
|
-
else {
|
|
1023
|
-
this.On = this.accessory.context.On;
|
|
1024
|
-
}
|
|
1025
|
-
if (this.Hue === undefined) {
|
|
1026
|
-
this.Hue = 0;
|
|
1027
|
-
}
|
|
1028
|
-
else {
|
|
1029
|
-
this.Hue = this.accessory.context.Hue;
|
|
1030
|
-
}
|
|
1031
|
-
if (this.Brightness === undefined) {
|
|
1032
|
-
this.Brightness = 0;
|
|
1033
|
-
}
|
|
1034
|
-
else {
|
|
1035
|
-
this.Brightness = this.accessory.context.Brightness;
|
|
1036
|
-
}
|
|
1037
|
-
if (this.Brightness === undefined) {
|
|
1038
|
-
this.Saturation = 0;
|
|
1039
|
-
}
|
|
1040
|
-
else {
|
|
1041
|
-
this.Saturation = this.accessory.context.Saturation;
|
|
1042
|
-
}
|
|
1043
|
-
if (this.ColorTemperature === undefined) {
|
|
1044
|
-
this.ColorTemperature = 140;
|
|
1045
|
-
}
|
|
1046
|
-
else {
|
|
1047
|
-
this.ColorTemperature = this.accessory.context.ColorTemperature;
|
|
1048
|
-
}
|
|
1049
|
-
this.minKelvin = 2000;
|
|
1050
|
-
this.maxKelvin = 9000;
|
|
1051
|
-
if (this.FirmwareRevision === undefined) {
|
|
1052
|
-
this.FirmwareRevision = this.platform.version;
|
|
1053
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
1054
|
-
}
|
|
1055
|
-
}
|
|
1056
|
-
async refreshRate(device) {
|
|
1057
|
-
if (device.refreshRate) {
|
|
1058
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate;
|
|
1059
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
|
|
1060
|
-
}
|
|
1061
|
-
else if (this.platform.config.options.refreshRate) {
|
|
1062
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = this.platform.config.options.refreshRate;
|
|
1063
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
|
|
1064
|
-
}
|
|
1065
|
-
}
|
|
1066
|
-
async deviceConfig(device) {
|
|
1067
|
-
let config = {};
|
|
1068
|
-
if (device.ceilinglight) {
|
|
1069
|
-
config = device.ceilinglight;
|
|
1070
|
-
}
|
|
1071
|
-
if (device.connectionType !== undefined) {
|
|
1072
|
-
config['connectionType'] = device.connectionType;
|
|
1073
|
-
}
|
|
1074
|
-
if (device.external !== undefined) {
|
|
1075
|
-
config['external'] = device.external;
|
|
1076
|
-
}
|
|
1077
|
-
if (device.logging !== undefined) {
|
|
1078
|
-
config['logging'] = device.logging;
|
|
1079
|
-
}
|
|
1080
|
-
if (device.refreshRate !== undefined) {
|
|
1081
|
-
config['refreshRate'] = device.refreshRate;
|
|
1082
|
-
}
|
|
1083
|
-
if (device.scanDuration !== undefined) {
|
|
1084
|
-
config['scanDuration'] = device.scanDuration;
|
|
1085
|
-
}
|
|
1086
|
-
if (device.offline !== undefined) {
|
|
1087
|
-
config['offline'] = device.offline;
|
|
1088
|
-
}
|
|
1089
|
-
if (device.maxRetry !== undefined) {
|
|
1090
|
-
config['maxRetry'] = device.maxRetry;
|
|
1091
|
-
}
|
|
1092
|
-
if (device.webhook !== undefined) {
|
|
1093
|
-
config['webhook'] = device.webhook;
|
|
1094
|
-
}
|
|
1095
|
-
if (Object.entries(config).length !== 0) {
|
|
1096
|
-
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
|
|
1097
|
-
}
|
|
1098
|
-
}
|
|
1099
|
-
async deviceLogs(device) {
|
|
1100
|
-
if (this.platform.debugMode) {
|
|
1101
|
-
this.deviceLogging = this.accessory.context.logging = 'debugMode';
|
|
1102
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
|
|
1103
|
-
}
|
|
1104
|
-
else if (device.logging) {
|
|
1105
|
-
this.deviceLogging = this.accessory.context.logging = device.logging;
|
|
1106
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
|
|
1107
|
-
}
|
|
1108
|
-
else if (this.platform.config.options?.logging) {
|
|
1109
|
-
this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
|
|
1110
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
|
|
1111
|
-
}
|
|
1112
|
-
else {
|
|
1113
|
-
this.deviceLogging = this.accessory.context.logging = 'standard';
|
|
1114
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
|
|
1115
|
-
}
|
|
1116
|
-
}
|
|
1117
|
-
/**
|
|
1118
|
-
* Logging for Device
|
|
1119
|
-
*/
|
|
1120
|
-
infoLog(...log) {
|
|
1121
|
-
if (this.enablingDeviceLogging()) {
|
|
1122
|
-
this.platform.log.info(String(...log));
|
|
1123
|
-
}
|
|
1124
|
-
}
|
|
1125
|
-
warnLog(...log) {
|
|
1126
|
-
if (this.enablingDeviceLogging()) {
|
|
1127
|
-
this.platform.log.warn(String(...log));
|
|
1128
|
-
}
|
|
1129
|
-
}
|
|
1130
|
-
debugWarnLog(...log) {
|
|
1131
|
-
if (this.enablingDeviceLogging()) {
|
|
1132
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
1133
|
-
this.platform.log.warn('[DEBUG]', String(...log));
|
|
1134
|
-
}
|
|
1135
|
-
}
|
|
1136
|
-
}
|
|
1137
|
-
errorLog(...log) {
|
|
1138
|
-
if (this.enablingDeviceLogging()) {
|
|
1139
|
-
this.platform.log.error(String(...log));
|
|
1140
|
-
}
|
|
1141
|
-
}
|
|
1142
|
-
debugErrorLog(...log) {
|
|
1143
|
-
if (this.enablingDeviceLogging()) {
|
|
1144
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
1145
|
-
this.platform.log.error('[DEBUG]', String(...log));
|
|
1146
|
-
}
|
|
1147
|
-
}
|
|
1148
|
-
}
|
|
1149
|
-
debugLog(...log) {
|
|
1150
|
-
if (this.enablingDeviceLogging()) {
|
|
1151
|
-
if (this.deviceLogging === 'debug') {
|
|
1152
|
-
this.platform.log.info('[DEBUG]', String(...log));
|
|
1153
|
-
}
|
|
1154
|
-
else {
|
|
1155
|
-
this.platform.log.debug(String(...log));
|
|
1156
|
-
}
|
|
1157
|
-
}
|
|
1158
|
-
}
|
|
1159
|
-
enablingDeviceLogging() {
|
|
1160
|
-
return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
|
|
791
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, e);
|
|
792
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, e);
|
|
793
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, e);
|
|
794
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, e);
|
|
795
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, e);
|
|
1161
796
|
}
|
|
1162
797
|
}
|
|
1163
798
|
//# sourceMappingURL=ceilinglight.js.map
|