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