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