@switchbot/homebridge-switchbot 3.5.0-beta.4 → 3.5.0-beta.40
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 +349 -756
- 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 +584 -759
- 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 +211 -587
- 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 +252 -632
- 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 +206 -531
- 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 +337 -786
- 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 +503 -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 +244 -596
- 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 +209 -571
- 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 +176 -584
- 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 +254 -568
- 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 +212 -542
- 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 +172 -577
- 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 +161 -577
- 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 +138 -518
- 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 +84 -452
- 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 +142 -451
- 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 +123 -664
- 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 +375 -782
- package/src/device/bot.ts +618 -844
- package/src/device/ceilinglight.ts +224 -607
- package/src/device/colorbulb.ts +266 -656
- package/src/device/contact.ts +231 -553
- package/src/device/curtain.ts +357 -810
- package/src/device/device.ts +699 -0
- package/src/device/fan.ts +552 -0
- package/src/device/hub.ts +271 -624
- package/src/device/humidifier.ts +239 -618
- package/src/device/iosensor.ts +202 -610
- package/src/device/lightstrip.ts +275 -596
- package/src/device/lock.ts +249 -582
- package/src/device/meter.ts +198 -601
- package/src/device/meterplus.ts +186 -602
- package/src/device/motion.ts +158 -541
- package/src/device/plug.ts +94 -480
- package/src/device/robotvacuumcleaner.ts +163 -477
- package/src/device/waterdetector.ts +141 -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,23 @@ 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
328
|
// FirmwareRevision
|
|
333
|
-
|
|
334
|
-
|
|
329
|
+
if (deviceStatus.body.version) {
|
|
330
|
+
this.accessory.context.version = deviceStatus.body.version;
|
|
331
|
+
this.accessory
|
|
332
|
+
.getService(this.hap.Service.AccessoryInformation)!
|
|
333
|
+
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
|
|
334
|
+
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
335
|
+
.updateValue(this.accessory.context.version);
|
|
336
|
+
}
|
|
335
337
|
}
|
|
336
338
|
|
|
337
339
|
/**
|
|
@@ -366,96 +368,43 @@ export class StripLight {
|
|
|
366
368
|
// Start to monitor advertisement packets
|
|
367
369
|
(async () => {
|
|
368
370
|
// Start to monitor advertisement packets
|
|
369
|
-
await switchbot.startScan({
|
|
370
|
-
model: 'r',
|
|
371
|
-
id: this.device.bleMac,
|
|
372
|
-
});
|
|
371
|
+
await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
|
|
373
372
|
// Set an event handler
|
|
374
373
|
switchbot.onadvertisement = (ad: any) => {
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
374
|
+
if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
|
|
375
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
|
|
376
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
|
|
378
377
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
379
378
|
} else {
|
|
380
379
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
381
380
|
}
|
|
382
381
|
};
|
|
383
|
-
// Wait
|
|
382
|
+
// Wait 10 seconds
|
|
384
383
|
await switchbot.wait(this.scanDuration * 1000);
|
|
385
384
|
// Stop to monitor
|
|
386
385
|
await switchbot.stopScan();
|
|
387
386
|
// Update HomeKit
|
|
388
|
-
await this.BLEparseStatus();
|
|
387
|
+
await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
|
|
389
388
|
await this.updateHomeKitCharacteristics();
|
|
390
389
|
})();
|
|
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 {
|
|
390
|
+
if (switchbot === undefined) {
|
|
437
391
|
await this.BLERefreshConnection(switchbot);
|
|
438
|
-
}
|
|
392
|
+
}
|
|
439
393
|
}
|
|
440
394
|
|
|
441
395
|
async openAPIRefreshStatus(): Promise<void> {
|
|
442
396
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
|
|
443
397
|
try {
|
|
444
|
-
const { body, statusCode } = await
|
|
445
|
-
headers: this.platform.generateHeaders()
|
|
446
|
-
});
|
|
398
|
+
const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries,
|
|
399
|
+
`${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
|
|
447
400
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
|
|
448
401
|
const deviceStatus: any = await body.json();
|
|
449
402
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
450
403
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
451
404
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
452
|
-
this.
|
|
405
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
453
406
|
+ `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();
|
|
407
|
+
this.openAPIparseStatus(deviceStatus);
|
|
459
408
|
this.updateHomeKitCharacteristics();
|
|
460
409
|
} else {
|
|
461
410
|
this.statusCode(statusCode);
|
|
@@ -504,8 +453,9 @@ export class StripLight {
|
|
|
504
453
|
|
|
505
454
|
async BLEpushChanges(): Promise<void> {
|
|
506
455
|
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
|
|
456
|
+
if (this.LightBulb.On !== this.accessory.context.On) {
|
|
457
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushChanges`
|
|
458
|
+
+ ` On: ${this.LightBulb.On} OnCached: ${this.accessory.context.On}`);
|
|
509
459
|
const switchbot = await this.platform.connectBLE();
|
|
510
460
|
// Convert to BLE Address
|
|
511
461
|
this.device.bleMac = this.device
|
|
@@ -519,11 +469,11 @@ export class StripLight {
|
|
|
519
469
|
id: this.device.bleMac,
|
|
520
470
|
})
|
|
521
471
|
.then(async (device_list: any) => {
|
|
522
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
523
|
-
return await this.
|
|
524
|
-
max: this.
|
|
472
|
+
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
473
|
+
return await this.retryBLE({
|
|
474
|
+
max: await this.maxRetryBLE(),
|
|
525
475
|
fn: async () => {
|
|
526
|
-
if (this.On) {
|
|
476
|
+
if (this.LightBulb.On) {
|
|
527
477
|
return await device_list[0].turnOn({ id: this.device.bleMac });
|
|
528
478
|
} else {
|
|
529
479
|
return await device_list[0].turnOff({ id: this.device.bleMac });
|
|
@@ -533,34 +483,40 @@ export class StripLight {
|
|
|
533
483
|
})
|
|
534
484
|
.then(() => {
|
|
535
485
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
536
|
-
this.
|
|
486
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
487
|
+
+ `On: ${this.LightBulb.On} sent over BLE, sent successfully`);
|
|
488
|
+
this.LightBulb.On = false;
|
|
537
489
|
})
|
|
538
490
|
.catch(async (e: any) => {
|
|
539
491
|
this.apiError(e);
|
|
540
|
-
this.errorLog(
|
|
541
|
-
|
|
542
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
543
|
-
);
|
|
492
|
+
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} failed BLEpushChanges with ${this.device.connectionType}` +
|
|
493
|
+
` Connection, Error Message: ${JSON.stringify(e.message)}`);
|
|
544
494
|
await this.BLEPushConnection();
|
|
545
495
|
});
|
|
546
496
|
// Push Brightness Update
|
|
547
|
-
if (this.On) {
|
|
497
|
+
if (this.LightBulb.On) {
|
|
548
498
|
await this.BLEpushBrightnessChanges();
|
|
549
499
|
}
|
|
550
500
|
// Push Hue & Saturation Update
|
|
551
|
-
if (this.On) {
|
|
501
|
+
if (this.LightBulb.On) {
|
|
552
502
|
await this.BLEpushRGBChanges();
|
|
553
503
|
}
|
|
504
|
+
if (this.LightBulb.ColorTemperature !== this.accessory.context.ColorTemperature) {
|
|
505
|
+
const kelvin = Math.round(1000000 / Number(this.LightBulb.ColorTemperature));
|
|
506
|
+
this.accessory.context.kelvin = kelvin;
|
|
507
|
+
} else {
|
|
508
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No pushColorTemperatureChanges.`
|
|
509
|
+
+ `ColorTemperature: ${this.LightBulb.ColorTemperature}, ColorTemperatureCached: ${this.accessory.context.ColorTemperature}`);
|
|
510
|
+
}
|
|
554
511
|
} else {
|
|
555
|
-
this.debugLog(
|
|
556
|
-
|
|
557
|
-
);
|
|
512
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushChanges,`
|
|
513
|
+
+ ` On: ${this.LightBulb.On}, OnCached: ${this.accessory.context.On}`);
|
|
558
514
|
}
|
|
559
515
|
}
|
|
560
516
|
|
|
561
517
|
async BLEpushBrightnessChanges(): Promise<void> {
|
|
562
518
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEpushBrightnessChanges`);
|
|
563
|
-
if (this.Brightness !== this.accessory.context.Brightness) {
|
|
519
|
+
if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
|
|
564
520
|
const switchbot = await this.platform.connectBLE();
|
|
565
521
|
// Convert to BLE Address
|
|
566
522
|
this.device.bleMac = this.device
|
|
@@ -574,12 +530,12 @@ export class StripLight {
|
|
|
574
530
|
id: this.device.bleMac,
|
|
575
531
|
})
|
|
576
532
|
.then(async (device_list: any) => {
|
|
577
|
-
this.infoLog(`${this.accessory.displayName} Target Brightness: ${this.Brightness}`);
|
|
578
|
-
return await device_list[0].setBrightness(this.Brightness);
|
|
533
|
+
this.infoLog(`${this.accessory.displayName} Target Brightness: ${this.LightBulb.Brightness}`);
|
|
534
|
+
return await device_list[0].setBrightness(this.LightBulb.Brightness);
|
|
579
535
|
})
|
|
580
536
|
.then(() => {
|
|
581
537
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
582
|
-
this.On = false;
|
|
538
|
+
this.LightBulb.On = false;
|
|
583
539
|
})
|
|
584
540
|
.catch(async (e: any) => {
|
|
585
541
|
this.apiError(e);
|
|
@@ -592,7 +548,7 @@ export class StripLight {
|
|
|
592
548
|
} else {
|
|
593
549
|
this.debugLog(
|
|
594
550
|
`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushBrightnessChanges.` +
|
|
595
|
-
`Brightness: ${this.Brightness}, ` +
|
|
551
|
+
`Brightness: ${this.LightBulb.Brightness}, ` +
|
|
596
552
|
`BrightnessCached: ${this.accessory.context.Brightness}`,
|
|
597
553
|
);
|
|
598
554
|
}
|
|
@@ -600,11 +556,11 @@ export class StripLight {
|
|
|
600
556
|
|
|
601
557
|
async BLEpushRGBChanges(): Promise<void> {
|
|
602
558
|
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)}`);
|
|
559
|
+
if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
|
|
560
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
|
|
561
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
|
|
606
562
|
|
|
607
|
-
const [red, green, blue] = hs2rgb(Number(this.Hue), Number(this.Saturation));
|
|
563
|
+
const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
|
|
608
564
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
|
|
609
565
|
|
|
610
566
|
const switchbot = await this.platform.connectBLE();
|
|
@@ -620,12 +576,12 @@ export class StripLight {
|
|
|
620
576
|
id: this.device.bleMac,
|
|
621
577
|
})
|
|
622
578
|
.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);
|
|
579
|
+
this.infoLog(`${this.accessory.displayName} Target RGB: ${(this.LightBulb.Brightness, red, green, blue)}`);
|
|
580
|
+
return await device_list[0].setRGB(this.LightBulb.Brightness, red, green, blue);
|
|
625
581
|
})
|
|
626
582
|
.then(() => {
|
|
627
583
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Done.`);
|
|
628
|
-
this.On = false;
|
|
584
|
+
this.LightBulb.On = false;
|
|
629
585
|
})
|
|
630
586
|
.catch(async (e: any) => {
|
|
631
587
|
this.apiError(e);
|
|
@@ -637,17 +593,17 @@ export class StripLight {
|
|
|
637
593
|
});
|
|
638
594
|
} else {
|
|
639
595
|
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}`,
|
|
596
|
+
`${this.device.deviceType}: ${this.accessory.displayName} No BLEpushRGBChanges. Hue: ${this.LightBulb.Hue}, ` +
|
|
597
|
+
`HueCached: ${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
|
|
642
598
|
);
|
|
643
599
|
}
|
|
644
600
|
}
|
|
645
601
|
|
|
646
602
|
async openAPIpushChanges() {
|
|
647
603
|
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) {
|
|
604
|
+
if (this.LightBulb.On !== this.accessory.context.On) {
|
|
605
|
+
const command = this.LightBulb.On ? 'turnOn' : 'turnOff';
|
|
606
|
+
/*if (this.LightBulb.On) {
|
|
651
607
|
command = 'turnOn';
|
|
652
608
|
} else {
|
|
653
609
|
command = 'turnOff';
|
|
@@ -672,6 +628,8 @@ export class StripLight {
|
|
|
672
628
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
673
629
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
674
630
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
631
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
632
|
+
+ `request to SwitchBot API, body: ${deviceStatus} sent successfully`);
|
|
675
633
|
} else {
|
|
676
634
|
this.statusCode(statusCode);
|
|
677
635
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -686,26 +644,26 @@ export class StripLight {
|
|
|
686
644
|
} else {
|
|
687
645
|
this.debugLog(
|
|
688
646
|
`${this.device.deviceType}: ${this.accessory.displayName} No openAPIpushChanges.` +
|
|
689
|
-
`On: ${this.On}, ` +
|
|
647
|
+
`On: ${this.LightBulb.On}, ` +
|
|
690
648
|
`OnCached: ${this.accessory.context.On}`,
|
|
691
649
|
);
|
|
692
650
|
}
|
|
693
651
|
// Push Hue & Saturation Update
|
|
694
|
-
if (this.On) {
|
|
652
|
+
if (this.LightBulb.On) {
|
|
695
653
|
await this.pushHueSaturationChanges();
|
|
696
654
|
}
|
|
697
655
|
// Push Brightness Update
|
|
698
|
-
if (this.On) {
|
|
656
|
+
if (this.LightBulb.On) {
|
|
699
657
|
await this.pushBrightnessChanges();
|
|
700
658
|
}
|
|
701
659
|
}
|
|
702
660
|
|
|
703
661
|
async pushHueSaturationChanges(): Promise<void> {
|
|
704
662
|
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));
|
|
663
|
+
if (this.LightBulb.Hue !== this.accessory.context.Hue || this.LightBulb.Saturation !== this.accessory.context.Saturation) {
|
|
664
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${JSON.stringify(this.LightBulb.Hue)}`);
|
|
665
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${JSON.stringify(this.LightBulb.Saturation)}`);
|
|
666
|
+
const [red, green, blue] = hs2rgb(Number(this.LightBulb.Hue), Number(this.LightBulb.Saturation));
|
|
709
667
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} rgb: ${JSON.stringify([red, green, blue])}`);
|
|
710
668
|
// Make Push On request to the API
|
|
711
669
|
const bodyChange = JSON.stringify({
|
|
@@ -728,6 +686,8 @@ export class StripLight {
|
|
|
728
686
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
729
687
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
730
688
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
689
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
690
|
+
+ `request to SwitchBot API, body: ${deviceStatus} sent successfully`);
|
|
731
691
|
} else {
|
|
732
692
|
this.statusCode(statusCode);
|
|
733
693
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -741,18 +701,18 @@ export class StripLight {
|
|
|
741
701
|
}
|
|
742
702
|
} else {
|
|
743
703
|
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}`,
|
|
704
|
+
`${this.device.deviceType}: ${this.accessory.displayName} No pushHueSaturationChanges. Hue: ${this.LightBulb.Hue}, ` +
|
|
705
|
+
`HueCached: ${this.accessory.context.Hue}, Saturation: ${this.LightBulb.Saturation}, SaturationCached: ${this.accessory.context.Saturation}`,
|
|
746
706
|
);
|
|
747
707
|
}
|
|
748
708
|
}
|
|
749
709
|
|
|
750
710
|
async pushBrightnessChanges(): Promise<void> {
|
|
751
711
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} pushBrightnessChanges`);
|
|
752
|
-
if (this.Brightness !== this.accessory.context.Brightness) {
|
|
712
|
+
if (this.LightBulb.Brightness !== this.accessory.context.Brightness) {
|
|
753
713
|
const bodyChange = JSON.stringify({
|
|
754
714
|
command: 'setBrightness',
|
|
755
|
-
parameter: `${this.Brightness}`,
|
|
715
|
+
parameter: `${this.LightBulb.Brightness}`,
|
|
756
716
|
commandType: 'command',
|
|
757
717
|
});
|
|
758
718
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Sending request to SwitchBot API, body: ${bodyChange},`);
|
|
@@ -770,6 +730,8 @@ export class StripLight {
|
|
|
770
730
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
771
731
|
this.debugErrorLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
772
732
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
733
|
+
this.successLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
734
|
+
+ `request to SwitchBot API, body: ${deviceStatus} sent successfully`);
|
|
773
735
|
} else {
|
|
774
736
|
this.statusCode(statusCode);
|
|
775
737
|
this.statusCode(deviceStatus.statusCode);
|
|
@@ -784,7 +746,7 @@ export class StripLight {
|
|
|
784
746
|
} else {
|
|
785
747
|
this.debugLog(
|
|
786
748
|
`${this.device.deviceType}: ${this.accessory.displayName} No pushBrightnessChanges,` +
|
|
787
|
-
`Brightness: ${this.Brightness}, ` +
|
|
749
|
+
`Brightness: ${this.LightBulb.Brightness}, ` +
|
|
788
750
|
`BrightnessCached: ${this.accessory.context.Brightness}`,
|
|
789
751
|
);
|
|
790
752
|
}
|
|
@@ -794,13 +756,13 @@ export class StripLight {
|
|
|
794
756
|
* Handle requests to set the value of the "On" characteristic
|
|
795
757
|
*/
|
|
796
758
|
async OnSet(value: CharacteristicValue): Promise<void> {
|
|
797
|
-
if (this.On === this.accessory.context.On) {
|
|
759
|
+
if (this.LightBulb.On === this.accessory.context.On) {
|
|
798
760
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set On: ${value}`);
|
|
799
761
|
} else {
|
|
800
762
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set On: ${value}`);
|
|
801
763
|
}
|
|
802
764
|
|
|
803
|
-
this.On = value;
|
|
765
|
+
this.LightBulb.On = value;
|
|
804
766
|
this.doStripLightUpdate.next();
|
|
805
767
|
}
|
|
806
768
|
|
|
@@ -808,15 +770,15 @@ export class StripLight {
|
|
|
808
770
|
* Handle requests to set the value of the "Brightness" characteristic
|
|
809
771
|
*/
|
|
810
772
|
async BrightnessSet(value: CharacteristicValue): Promise<void> {
|
|
811
|
-
if (this.Brightness === this.accessory.context.Brightness) {
|
|
773
|
+
if (this.LightBulb.Brightness === this.accessory.context.Brightness) {
|
|
812
774
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Brightness: ${value}`);
|
|
813
|
-
} else if (this.On) {
|
|
775
|
+
} else if (this.LightBulb.On) {
|
|
814
776
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
|
|
815
777
|
} else {
|
|
816
778
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Brightness: ${value}`);
|
|
817
779
|
}
|
|
818
780
|
|
|
819
|
-
this.Brightness = value;
|
|
781
|
+
this.LightBulb.Brightness = value;
|
|
820
782
|
this.doStripLightUpdate.next();
|
|
821
783
|
}
|
|
822
784
|
|
|
@@ -824,30 +786,31 @@ export class StripLight {
|
|
|
824
786
|
* Handle requests to set the value of the "ColorTemperature" characteristic
|
|
825
787
|
*/
|
|
826
788
|
async ColorTemperatureSet(value: CharacteristicValue): Promise<void> {
|
|
827
|
-
if (this.ColorTemperature === this.accessory.context.ColorTemperature) {
|
|
789
|
+
if (this.LightBulb.ColorTemperature === this.accessory.context.ColorTemperature) {
|
|
828
790
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set ColorTemperature: ${value}`);
|
|
829
|
-
} else if (this.On) {
|
|
791
|
+
} else if (this.LightBulb.On) {
|
|
830
792
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
|
|
831
793
|
} else {
|
|
832
794
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set ColorTemperature: ${value}`);
|
|
833
795
|
}
|
|
834
796
|
|
|
797
|
+
const minKelvin = 2000;
|
|
798
|
+
const maxKelvin = 9000;
|
|
835
799
|
// Convert mired to kelvin to nearest 100 (SwitchBot seems to need this)
|
|
836
800
|
const kelvin = Math.round(1000000 / Number(value) / 100) * 100;
|
|
837
|
-
|
|
838
801
|
// Check and increase/decrease kelvin to range of device
|
|
839
|
-
const k = Math.min(Math.max(kelvin,
|
|
802
|
+
const k = Math.min(Math.max(kelvin, minKelvin), maxKelvin);
|
|
840
803
|
|
|
841
|
-
if (!this.accessory.context.On || this.
|
|
804
|
+
if (!this.accessory.context.On || this.accessory.context.maxKelvin === k) {
|
|
842
805
|
return;
|
|
843
806
|
}
|
|
844
807
|
|
|
845
808
|
// Updating the hue/sat to the corresponding values mimics native adaptive lighting
|
|
846
809
|
const hs = m2hs(value);
|
|
847
|
-
this.
|
|
848
|
-
this.
|
|
810
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, hs[0]);
|
|
811
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, hs[1]);
|
|
849
812
|
|
|
850
|
-
this.ColorTemperature = value;
|
|
813
|
+
this.LightBulb.ColorTemperature = value;
|
|
851
814
|
this.doStripLightUpdate.next();
|
|
852
815
|
}
|
|
853
816
|
|
|
@@ -855,17 +818,17 @@ export class StripLight {
|
|
|
855
818
|
* Handle requests to set the value of the "Hue" characteristic
|
|
856
819
|
*/
|
|
857
820
|
async HueSet(value: CharacteristicValue): Promise<void> {
|
|
858
|
-
if (this.Hue === this.accessory.context.Hue) {
|
|
821
|
+
if (this.LightBulb.Hue === this.accessory.context.Hue) {
|
|
859
822
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Hue: ${value}`);
|
|
860
|
-
} else if (this.On) {
|
|
823
|
+
} else if (this.LightBulb.On) {
|
|
861
824
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
|
|
862
825
|
} else {
|
|
863
826
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Hue: ${value}`);
|
|
864
827
|
}
|
|
865
828
|
|
|
866
|
-
this.
|
|
829
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
|
|
867
830
|
|
|
868
|
-
this.Hue = value;
|
|
831
|
+
this.LightBulb.Hue = value;
|
|
869
832
|
this.doStripLightUpdate.next();
|
|
870
833
|
}
|
|
871
834
|
|
|
@@ -873,89 +836,61 @@ export class StripLight {
|
|
|
873
836
|
* Handle requests to set the value of the "Saturation" characteristic
|
|
874
837
|
*/
|
|
875
838
|
async SaturationSet(value: CharacteristicValue): Promise<void> {
|
|
876
|
-
if (this.Saturation === this.accessory.context.Saturation) {
|
|
839
|
+
if (this.LightBulb.Saturation === this.accessory.context.Saturation) {
|
|
877
840
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} No Changes, Set Saturation: ${value}`);
|
|
878
|
-
} else if (this.On) {
|
|
841
|
+
} else if (this.LightBulb.On) {
|
|
879
842
|
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
|
|
880
843
|
} else {
|
|
881
844
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Set Saturation: ${value}`);
|
|
882
845
|
}
|
|
883
846
|
|
|
884
|
-
this.
|
|
847
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, 140);
|
|
885
848
|
|
|
886
|
-
this.Saturation = value;
|
|
849
|
+
this.LightBulb.Saturation = value;
|
|
887
850
|
this.doStripLightUpdate.next();
|
|
888
851
|
}
|
|
889
852
|
|
|
890
853
|
async updateHomeKitCharacteristics(): Promise<void> {
|
|
891
854
|
// On
|
|
892
|
-
if (this.On === undefined) {
|
|
893
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.On}`);
|
|
855
|
+
if (this.LightBulb.On === undefined) {
|
|
856
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} On: ${this.LightBulb.On}`);
|
|
894
857
|
} else {
|
|
895
|
-
this.accessory.context.On = this.On;
|
|
896
|
-
this.
|
|
897
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.On}`);
|
|
858
|
+
this.accessory.context.On = this.LightBulb.On;
|
|
859
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, this.LightBulb.On);
|
|
860
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic On: ${this.LightBulb.On}`);
|
|
898
861
|
}
|
|
899
862
|
// Brightness
|
|
900
|
-
if (this.Brightness === undefined) {
|
|
901
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.Brightness}`);
|
|
863
|
+
if (this.LightBulb.Brightness === undefined) {
|
|
864
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Brightness: ${this.LightBulb.Brightness}`);
|
|
902
865
|
} else {
|
|
903
|
-
this.accessory.context.Brightness = this.Brightness;
|
|
904
|
-
this.
|
|
905
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.Brightness}`);
|
|
866
|
+
this.accessory.context.Brightness = this.LightBulb.Brightness;
|
|
867
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, this.LightBulb.Brightness);
|
|
868
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Brightness: ${this.LightBulb.Brightness}`);
|
|
906
869
|
}
|
|
907
870
|
// ColorTemperature
|
|
908
|
-
if (this.ColorTemperature === undefined) {
|
|
909
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.ColorTemperature}`);
|
|
871
|
+
if (this.LightBulb.ColorTemperature === undefined) {
|
|
872
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
910
873
|
} else {
|
|
911
|
-
this.accessory.context.ColorTemperature = this.ColorTemperature;
|
|
912
|
-
this.
|
|
913
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic
|
|
874
|
+
this.accessory.context.ColorTemperature = this.LightBulb.ColorTemperature;
|
|
875
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, this.LightBulb.ColorTemperature);
|
|
876
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
877
|
+
+ ` ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
914
878
|
}
|
|
915
879
|
// Hue
|
|
916
|
-
if (this.Hue === undefined) {
|
|
917
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.Hue}`);
|
|
880
|
+
if (this.LightBulb.Hue === undefined) {
|
|
881
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Hue: ${this.LightBulb.Hue}`);
|
|
918
882
|
} else {
|
|
919
|
-
this.accessory.context.Hue = this.Hue;
|
|
920
|
-
this.
|
|
921
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.Hue}`);
|
|
883
|
+
this.accessory.context.Hue = this.LightBulb.Hue;
|
|
884
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, this.LightBulb.Hue);
|
|
885
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Hue: ${this.LightBulb.Hue}`);
|
|
922
886
|
}
|
|
923
887
|
// 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();
|
|
888
|
+
if (this.LightBulb.Saturation === undefined) {
|
|
889
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Saturation: ${this.LightBulb.Saturation}`);
|
|
938
890
|
} 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
|
-
})();
|
|
891
|
+
this.accessory.context.Saturation = this.LightBulb.Saturation;
|
|
892
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, this.LightBulb.Saturation);
|
|
893
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic Saturation: ${this.LightBulb.Saturation}`);
|
|
959
894
|
}
|
|
960
895
|
}
|
|
961
896
|
|
|
@@ -975,33 +910,14 @@ export class StripLight {
|
|
|
975
910
|
}
|
|
976
911
|
}
|
|
977
912
|
|
|
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
913
|
minStep(device: device & devicesConfig): number {
|
|
914
|
+
let set_minStep: number;
|
|
999
915
|
if (device.striplight?.set_minStep) {
|
|
1000
|
-
|
|
916
|
+
set_minStep = device.striplight?.set_minStep;
|
|
1001
917
|
} else {
|
|
1002
|
-
|
|
918
|
+
set_minStep = 1;
|
|
1003
919
|
}
|
|
1004
|
-
return
|
|
920
|
+
return set_minStep;
|
|
1005
921
|
}
|
|
1006
922
|
|
|
1007
923
|
async adaptiveLighting(device: device & devicesConfig): Promise<void> {
|
|
@@ -1014,254 +930,17 @@ export class StripLight {
|
|
|
1014
930
|
}
|
|
1015
931
|
}
|
|
1016
932
|
|
|
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
933
|
async offlineOff(): Promise<void> {
|
|
1110
934
|
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
|
-
}
|
|
935
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, false);
|
|
1261
936
|
}
|
|
1262
937
|
}
|
|
1263
938
|
|
|
1264
|
-
|
|
1265
|
-
|
|
939
|
+
async apiError(e: any): Promise<void> {
|
|
940
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.On, e);
|
|
941
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Hue, e);
|
|
942
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Brightness, e);
|
|
943
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.Saturation, e);
|
|
944
|
+
this.LightBulb.Service.updateCharacteristic(this.hap.Characteristic.ColorTemperature, e);
|
|
1266
945
|
}
|
|
1267
946
|
}
|