@switchbot/homebridge-switchbot 3.5.1-beta.8 → 3.5.1
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 +7 -0
- package/config.schema.json +19 -3
- package/dist/device/blindtilt.d.ts +6 -4
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +60 -46
- package/dist/device/blindtilt.js.map +1 -1
- package/dist/device/bot.d.ts +6 -3
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +59 -25
- package/dist/device/bot.js.map +1 -1
- package/dist/device/ceilinglight.d.ts +6 -3
- package/dist/device/ceilinglight.d.ts.map +1 -1
- package/dist/device/ceilinglight.js +47 -29
- package/dist/device/ceilinglight.js.map +1 -1
- package/dist/device/colorbulb.d.ts +6 -3
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +53 -36
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.d.ts +6 -3
- package/dist/device/contact.d.ts.map +1 -1
- package/dist/device/contact.js +45 -31
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts +6 -4
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +41 -27
- package/dist/device/curtain.js.map +1 -1
- package/dist/device/device.d.ts +6 -3
- package/dist/device/device.d.ts.map +1 -1
- package/dist/device/device.js +59 -152
- package/dist/device/device.js.map +1 -1
- package/dist/device/fan.d.ts +6 -3
- package/dist/device/fan.d.ts.map +1 -1
- package/dist/device/fan.js +53 -32
- package/dist/device/fan.js.map +1 -1
- package/dist/device/hub.d.ts +6 -3
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +49 -30
- package/dist/device/hub.js.map +1 -1
- package/dist/device/humidifier.d.ts +6 -3
- package/dist/device/humidifier.d.ts.map +1 -1
- package/dist/device/humidifier.js +47 -28
- package/dist/device/humidifier.js.map +1 -1
- package/dist/device/iosensor.d.ts +6 -3
- package/dist/device/iosensor.d.ts.map +1 -1
- package/dist/device/iosensor.js +44 -27
- package/dist/device/iosensor.js.map +1 -1
- package/dist/device/lightstrip.d.ts +6 -3
- package/dist/device/lightstrip.d.ts.map +1 -1
- package/dist/device/lightstrip.js +46 -28
- package/dist/device/lightstrip.js.map +1 -1
- package/dist/device/lock.d.ts +6 -3
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +38 -25
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.d.ts +6 -3
- package/dist/device/meter.d.ts.map +1 -1
- package/dist/device/meter.js +43 -27
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.d.ts +6 -3
- package/dist/device/meterplus.d.ts.map +1 -1
- package/dist/device/meterplus.js +42 -27
- package/dist/device/meterplus.js.map +1 -1
- package/dist/device/motion.d.ts +6 -3
- package/dist/device/motion.d.ts.map +1 -1
- package/dist/device/motion.js +37 -24
- package/dist/device/motion.js.map +1 -1
- package/dist/device/plug.d.ts +6 -3
- package/dist/device/plug.d.ts.map +1 -1
- package/dist/device/plug.js +30 -17
- package/dist/device/plug.js.map +1 -1
- package/dist/device/robotvacuumcleaner.d.ts +6 -3
- package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
- package/dist/device/robotvacuumcleaner.js +37 -22
- package/dist/device/robotvacuumcleaner.js.map +1 -1
- package/dist/device/waterdetector.d.ts +6 -3
- package/dist/device/waterdetector.d.ts.map +1 -1
- package/dist/device/waterdetector.js +44 -25
- package/dist/device/waterdetector.js.map +1 -1
- package/dist/homebridge-ui/public/index.html +2 -2
- package/dist/irdevice/airconditioner.d.ts +1 -3
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js +67 -177
- package/dist/irdevice/airconditioner.js.map +1 -1
- package/dist/irdevice/airpurifier.d.ts +0 -1
- package/dist/irdevice/airpurifier.d.ts.map +1 -1
- package/dist/irdevice/airpurifier.js +24 -53
- package/dist/irdevice/airpurifier.js.map +1 -1
- package/dist/irdevice/camera.d.ts.map +1 -1
- package/dist/irdevice/camera.js +12 -17
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +22 -38
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +22 -10
- package/dist/irdevice/irdevice.d.ts.map +1 -1
- package/dist/irdevice/irdevice.js +94 -100
- package/dist/irdevice/irdevice.js.map +1 -1
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +20 -38
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.d.ts.map +1 -1
- package/dist/irdevice/other.js +79 -77
- package/dist/irdevice/other.js.map +1 -1
- package/dist/irdevice/tv.d.ts.map +1 -1
- package/dist/irdevice/tv.js +38 -53
- package/dist/irdevice/tv.js.map +1 -1
- package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
- package/dist/irdevice/vacuumcleaner.js +11 -16
- package/dist/irdevice/vacuumcleaner.js.map +1 -1
- package/dist/irdevice/waterheater.d.ts.map +1 -1
- package/dist/irdevice/waterheater.js +11 -16
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/platform.d.ts +4 -6
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +564 -665
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +10 -8
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js.map +1 -1
- package/dist/types/bledevicestatus.d.ts +2 -1
- package/dist/types/bledevicestatus.d.ts.map +1 -1
- package/dist/types/devicestatus.d.ts +1 -1
- package/dist/types/devicestatus.d.ts.map +1 -1
- package/package.json +11 -11
- package/src/device/blindtilt.ts +64 -48
- package/src/device/bot.ts +79 -26
- package/src/device/ceilinglight.ts +57 -31
- package/src/device/colorbulb.ts +57 -43
- package/src/device/contact.ts +49 -31
- package/src/device/curtain.ts +51 -28
- package/src/device/device.ts +61 -135
- package/src/device/fan.ts +67 -33
- package/src/device/hub.ts +62 -33
- package/src/device/humidifier.ts +60 -33
- package/src/device/iosensor.ts +51 -30
- package/src/device/lightstrip.ts +52 -29
- package/src/device/lock.ts +55 -26
- package/src/device/meter.ts +60 -29
- package/src/device/meterplus.ts +56 -29
- package/src/device/motion.ts +50 -26
- package/src/device/plug.ts +38 -18
- package/src/device/robotvacuumcleaner.ts +53 -24
- package/src/device/waterdetector.ts +63 -27
- package/src/homebridge-ui/public/index.html +2 -2
- package/src/irdevice/airconditioner.ts +76 -165
- package/src/irdevice/airpurifier.ts +29 -49
- package/src/irdevice/camera.ts +13 -16
- package/src/irdevice/fan.ts +25 -35
- package/src/irdevice/irdevice.ts +97 -96
- package/src/irdevice/light.ts +21 -35
- package/src/irdevice/other.ts +79 -77
- package/src/irdevice/tv.ts +40 -51
- package/src/irdevice/vacuumcleaner.ts +12 -15
- package/src/irdevice/waterheater.ts +12 -15
- package/src/platform.ts +566 -696
- package/src/settings.ts +11 -8
- package/src/types/bledevicestatus.ts +4 -2
- package/src/types/devicestatus.ts +1 -1
- package/.github/npm-version-script.cjs +0 -81
package/src/device/colorbulb.ts
CHANGED
|
@@ -32,6 +32,15 @@ export class ColorBulb extends deviceBase {
|
|
|
32
32
|
ColorTemperature?: CharacteristicValue;
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
+
// OpenAPI
|
|
36
|
+
deviceStatus!: colorBulbStatus;
|
|
37
|
+
|
|
38
|
+
//Webhook
|
|
39
|
+
webhookContext!: colorBulbWebhookContext;
|
|
40
|
+
|
|
41
|
+
// BLE
|
|
42
|
+
serviceData!: colorBulbServiceData;
|
|
43
|
+
|
|
35
44
|
// Adaptive Lighting
|
|
36
45
|
AdaptiveLightingController?: ControllerConstructor | Controller<ControllerServiceMap>;
|
|
37
46
|
adaptiveLightingShift?: number;
|
|
@@ -46,6 +55,9 @@ export class ColorBulb extends deviceBase {
|
|
|
46
55
|
device: device & devicesConfig,
|
|
47
56
|
) {
|
|
48
57
|
super(platform, accessory, device);
|
|
58
|
+
// Set category
|
|
59
|
+
accessory.category = this.hap.Categories.LIGHTBULB;
|
|
60
|
+
|
|
49
61
|
// default placeholders
|
|
50
62
|
this.adaptiveLighting(device);
|
|
51
63
|
|
|
@@ -79,10 +91,10 @@ export class ColorBulb extends deviceBase {
|
|
|
79
91
|
});
|
|
80
92
|
accessory.configureController(this.AdaptiveLightingController);
|
|
81
93
|
accessory.context.adaptiveLighting = true;
|
|
82
|
-
this.debugLog(
|
|
94
|
+
this.debugLog(`adaptiveLighting: ${accessory.context.adaptiveLighting},`
|
|
83
95
|
+ ` adaptiveLightingShift: ${this.adaptiveLightingShift}`);
|
|
84
96
|
}
|
|
85
|
-
this.debugLog(
|
|
97
|
+
this.debugLog(`adaptiveLightingShift: ${this.adaptiveLightingShift}`);
|
|
86
98
|
|
|
87
99
|
// Initialize LightBulb Characteristics
|
|
88
100
|
this.LightBulb.Service
|
|
@@ -143,10 +155,12 @@ export class ColorBulb extends deviceBase {
|
|
|
143
155
|
.onSet(this.SaturationSet.bind(this));
|
|
144
156
|
|
|
145
157
|
// Retrieve initial values and updateHomekit
|
|
158
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
146
159
|
this.refreshStatus();
|
|
147
160
|
|
|
148
|
-
//
|
|
149
|
-
this.
|
|
161
|
+
//regisiter webhook event handler
|
|
162
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
163
|
+
this.registerWebhook();
|
|
150
164
|
|
|
151
165
|
//regisiter webhook event handler
|
|
152
166
|
this.registerWebhook();
|
|
@@ -181,18 +195,18 @@ export class ColorBulb extends deviceBase {
|
|
|
181
195
|
/**
|
|
182
196
|
* Parse the device status from the SwitchBotBLE API
|
|
183
197
|
*/
|
|
184
|
-
async BLEparseStatus(
|
|
198
|
+
async BLEparseStatus(): Promise<void> {
|
|
185
199
|
await this.debugLog('BLEparseStatus');
|
|
186
200
|
// On
|
|
187
|
-
this.LightBulb.On = serviceData.power;
|
|
201
|
+
this.LightBulb.On = this.serviceData.power;
|
|
188
202
|
await this.debugLog(`On: ${this.LightBulb.On}`);
|
|
189
203
|
// Brightness
|
|
190
|
-
this.LightBulb.Brightness = serviceData.brightness;
|
|
204
|
+
this.LightBulb.Brightness = this.serviceData.brightness;
|
|
191
205
|
await this.debugLog(`Brightness: ${this.LightBulb.Brightness}`);
|
|
192
206
|
// Color, Hue & Brightness
|
|
193
|
-
await this.debugLog(`red: ${serviceData.red}, green: ${serviceData.green}, blue: ${serviceData.blue}`);
|
|
194
|
-
const [hue, saturation] = rgb2hs(serviceData.red, serviceData.green, serviceData.blue);
|
|
195
|
-
await this.debugLog(`hs: ${JSON.stringify(rgb2hs(serviceData.red, serviceData.green, serviceData.blue))}`);
|
|
207
|
+
await this.debugLog(`red: ${this.serviceData.red}, green: ${this.serviceData.green}, blue: ${this.serviceData.blue}`);
|
|
208
|
+
const [hue, saturation] = rgb2hs(this.serviceData.red, this.serviceData.green, this.serviceData.blue);
|
|
209
|
+
await this.debugLog(`hs: ${JSON.stringify(rgb2hs(this.serviceData.red, this.serviceData.green, this.serviceData.blue))}`);
|
|
196
210
|
// Hue
|
|
197
211
|
this.LightBulb.Hue = hue;
|
|
198
212
|
await this.debugLog(`Hue: ${this.LightBulb.Hue}`);
|
|
@@ -200,48 +214,42 @@ export class ColorBulb extends deviceBase {
|
|
|
200
214
|
this.LightBulb.Saturation = saturation;
|
|
201
215
|
await this.debugLog(`Saturation: ${this.LightBulb.Saturation}`);
|
|
202
216
|
// ColorTemperature
|
|
203
|
-
|
|
217
|
+
const miredColorTemperature = Math.round(1000000 / this.serviceData.color_temperature);
|
|
218
|
+
this.LightBulb.ColorTemperature = Math.max(Math.min(miredColorTemperature, 500), 140);
|
|
204
219
|
await this.debugLog(`ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
205
220
|
}
|
|
206
221
|
|
|
207
222
|
/**
|
|
208
223
|
* Parse the device status from the SwitchBot OpenAPI
|
|
209
224
|
*/
|
|
210
|
-
async openAPIparseStatus(
|
|
225
|
+
async openAPIparseStatus(): Promise<void> {
|
|
211
226
|
await this.debugLog('openAPIparseStatus');
|
|
212
|
-
|
|
213
227
|
// On
|
|
214
|
-
this.LightBulb.On = deviceStatus.power === 'on' ? true : false;
|
|
228
|
+
this.LightBulb.On = this.deviceStatus.power === 'on' ? true : false;
|
|
215
229
|
await this.debugLog(`On: ${this.LightBulb.On}`);
|
|
216
|
-
|
|
217
230
|
// Brightness
|
|
218
|
-
this.LightBulb.Brightness = deviceStatus.brightness;
|
|
231
|
+
this.LightBulb.Brightness = this.deviceStatus.brightness;
|
|
219
232
|
await this.debugLog(`Brightness: ${this.LightBulb.Brightness}`);
|
|
220
|
-
|
|
221
233
|
// Color, Hue & Brightness
|
|
222
|
-
await this.debugLog(`color: ${JSON.stringify(deviceStatus.color)}`);
|
|
223
|
-
const [red, green, blue] = deviceStatus.color.split(':');
|
|
234
|
+
await this.debugLog(`color: ${JSON.stringify(this.deviceStatus.color)}`);
|
|
235
|
+
const [red, green, blue] = this.deviceStatus.color.split(':');
|
|
224
236
|
await this.debugLog(`red: ${JSON.stringify(red)}, green: ${JSON.stringify(green)}, blue: ${JSON.stringify(blue)}`);
|
|
225
237
|
const [hue, saturation] = rgb2hs(red, green, blue);
|
|
226
238
|
await this.debugLog(`hs: ${JSON.stringify(rgb2hs(red, green, blue))}`);
|
|
227
|
-
|
|
228
239
|
// Hue
|
|
229
240
|
this.LightBulb.Hue = hue;
|
|
230
241
|
await this.debugLog(`Hue: ${this.LightBulb.Hue}`);
|
|
231
|
-
|
|
232
242
|
// Saturation
|
|
233
243
|
this.LightBulb.Saturation = saturation;
|
|
234
244
|
await this.debugLog(`Saturation: ${this.LightBulb.Saturation}`);
|
|
235
|
-
|
|
236
245
|
// ColorTemperature
|
|
237
|
-
const miredColorTemperature = Math.round(1000000 / deviceStatus.colorTemperature);
|
|
246
|
+
const miredColorTemperature = Math.round(1000000 / this.deviceStatus.colorTemperature);
|
|
238
247
|
this.LightBulb.ColorTemperature = Math.max(Math.min(miredColorTemperature, 500), 140);
|
|
239
248
|
await this.debugLog(`ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
240
|
-
|
|
241
249
|
// Firmware Version
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
250
|
+
if (this.deviceStatus.version) {
|
|
251
|
+
const version = this.deviceStatus.version.toString();
|
|
252
|
+
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
245
253
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
246
254
|
this.accessory
|
|
247
255
|
.getService(this.hap.Service.AccessoryInformation)!
|
|
@@ -249,25 +257,25 @@ export class ColorBulb extends deviceBase {
|
|
|
249
257
|
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
250
258
|
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
251
259
|
.updateValue(deviceVersion);
|
|
252
|
-
this.accessory.context.
|
|
253
|
-
await this.debugSuccessLog(`
|
|
260
|
+
this.accessory.context.version = deviceVersion;
|
|
261
|
+
await this.debugSuccessLog(`version: ${this.accessory.context.version}`);
|
|
254
262
|
}
|
|
255
263
|
}
|
|
256
264
|
|
|
257
|
-
async parseStatusWebhook(
|
|
265
|
+
async parseStatusWebhook(): Promise<void> {
|
|
258
266
|
await this.debugLog('parseStatusWebhook');
|
|
259
|
-
await this.debugLog(`(powerState, brightness, color, colorTemperature) = Webhook:(${
|
|
260
|
-
|
|
261
|
-
|
|
267
|
+
await this.debugLog(`(powerState, brightness, color, colorTemperature) = Webhook:(${this.webhookContext.powerState},`
|
|
268
|
+
+ ` ${this.webhookContext.brightness}, ${this.webhookContext.color}, ${this.webhookContext.colorTemperature}), current:(${this.LightBulb.On},`
|
|
269
|
+
+ ` ${this.LightBulb.Brightness}, ${this.LightBulb.Hue}, ${this.LightBulb.Saturation}, ${this.LightBulb.ColorTemperature})`);
|
|
262
270
|
// On
|
|
263
|
-
this.LightBulb.On =
|
|
271
|
+
this.LightBulb.On = this.webhookContext.powerState === 'ON' ? true : false;
|
|
264
272
|
await this.debugLog(`On: ${this.LightBulb.On}`);
|
|
265
273
|
// Brightness
|
|
266
|
-
this.LightBulb.Brightness =
|
|
274
|
+
this.LightBulb.Brightness = this.webhookContext.brightness;
|
|
267
275
|
await this.debugLog(`Brightness: ${this.LightBulb.Brightness}`);
|
|
268
276
|
// Color, Hue & Brightness
|
|
269
|
-
await this.debugLog(`color: ${JSON.stringify(
|
|
270
|
-
const [red, green, blue] =
|
|
277
|
+
await this.debugLog(`color: ${JSON.stringify(this.webhookContext.color)}`);
|
|
278
|
+
const [red, green, blue] = this.webhookContext.color.split(':');
|
|
271
279
|
await this.debugLog(`red: ${JSON.stringify(red)}, green: ${JSON.stringify(green)}, blue: ${JSON.stringify(blue)}`);
|
|
272
280
|
const [hue, saturation] = rgb2hs(red, green, blue);
|
|
273
281
|
await this.debugLog(`hs: ${JSON.stringify(rgb2hs(red, green, blue))}`);
|
|
@@ -278,7 +286,8 @@ export class ColorBulb extends deviceBase {
|
|
|
278
286
|
this.LightBulb.Saturation = saturation;
|
|
279
287
|
await this.debugLog(`Saturation: ${this.LightBulb.Saturation}`);
|
|
280
288
|
// ColorTemperature
|
|
281
|
-
|
|
289
|
+
const miredColorTemperature = Math.round(1000000 / this.webhookContext.colorTemperature);
|
|
290
|
+
this.LightBulb.ColorTemperature = Math.max(Math.min(miredColorTemperature, 500), 140);
|
|
282
291
|
await this.debugLog(`ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
283
292
|
}
|
|
284
293
|
|
|
@@ -311,7 +320,8 @@ export class ColorBulb extends deviceBase {
|
|
|
311
320
|
const serviceData = await this.monitorAdvertisementPackets(switchbot) as colorBulbServiceData;
|
|
312
321
|
// Update HomeKit
|
|
313
322
|
if (serviceData.model === SwitchBotBLEModel.ColorBulb && serviceData.modelName === SwitchBotBLEModelName.ColorBulb) {
|
|
314
|
-
|
|
323
|
+
this.serviceData = serviceData;
|
|
324
|
+
await this.BLEparseStatus();
|
|
315
325
|
await this.updateHomeKitCharacteristics();
|
|
316
326
|
} else {
|
|
317
327
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -329,7 +339,8 @@ export class ColorBulb extends deviceBase {
|
|
|
329
339
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
330
340
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
331
341
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
332
|
-
|
|
342
|
+
this.deviceStatus = deviceStatus.body;
|
|
343
|
+
await this.openAPIparseStatus();
|
|
333
344
|
await this.updateHomeKitCharacteristics();
|
|
334
345
|
} else {
|
|
335
346
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -347,7 +358,8 @@ export class ColorBulb extends deviceBase {
|
|
|
347
358
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: colorBulbWebhookContext) => {
|
|
348
359
|
try {
|
|
349
360
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
350
|
-
|
|
361
|
+
this.webhookContext = context;
|
|
362
|
+
await this.parseStatusWebhook();
|
|
351
363
|
await this.updateHomeKitCharacteristics();
|
|
352
364
|
} catch (e: any) {
|
|
353
365
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
|
@@ -464,7 +476,7 @@ export class ColorBulb extends deviceBase {
|
|
|
464
476
|
switchbot
|
|
465
477
|
.discover({ model: this.device.bleModel, id: this.device.bleMac })
|
|
466
478
|
.then(async (device_list: any) => {
|
|
467
|
-
await this.infoLog(
|
|
479
|
+
await this.infoLog(`Target Brightness: ${this.LightBulb.Brightness}`);
|
|
468
480
|
return await device_list[0].setBrightness(this.LightBulb.Brightness);
|
|
469
481
|
})
|
|
470
482
|
.then(async () => {
|
|
@@ -489,6 +501,8 @@ export class ColorBulb extends deviceBase {
|
|
|
489
501
|
async BLEpushColorTemperatureChanges(): Promise<void> {
|
|
490
502
|
await this.debugLog('BLEpushColorTemperatureChanges');
|
|
491
503
|
if (this.LightBulb.ColorTemperature !== this.accessory.context.ColorTemperature) {
|
|
504
|
+
const kelvin = Math.round(1000000 / Number(this.LightBulb.ColorTemperature));
|
|
505
|
+
this.accessory.context.kelvin = kelvin;
|
|
492
506
|
const switchbot = await this.platform.connectBLE(this.accessory, this.device);
|
|
493
507
|
await this.convertBLEAddress();
|
|
494
508
|
if (switchbot !== false) {
|
|
@@ -496,7 +510,7 @@ export class ColorBulb extends deviceBase {
|
|
|
496
510
|
.discover({ model: this.device.bleModel, id: this.device.bleMac })
|
|
497
511
|
.then(async (device_list: any) => {
|
|
498
512
|
await this.infoLog(`ColorTemperature: ${this.LightBulb.ColorTemperature}`);
|
|
499
|
-
return await device_list[0].setColorTemperature(
|
|
513
|
+
return await device_list[0].setColorTemperature(kelvin);
|
|
500
514
|
})
|
|
501
515
|
.then(async () => {
|
|
502
516
|
await this.successLog(`ColorTemperature: ${this.LightBulb.ColorTemperature} sent over SwitchBot BLE, sent successfully`);
|
package/src/device/contact.ts
CHANGED
|
@@ -46,6 +46,15 @@ export class Contact extends deviceBase {
|
|
|
46
46
|
CurrentAmbientLightLevel: CharacteristicValue;
|
|
47
47
|
};
|
|
48
48
|
|
|
49
|
+
// OpenAPI
|
|
50
|
+
deviceStatus!: contactSensorStatus;
|
|
51
|
+
|
|
52
|
+
//Webhook
|
|
53
|
+
webhookContext!: contactSensorWebhookContext;
|
|
54
|
+
|
|
55
|
+
// BLE
|
|
56
|
+
serviceData!: contactSensorServiceData;
|
|
57
|
+
|
|
49
58
|
// Updates
|
|
50
59
|
contactUpdateInProgress!: boolean;
|
|
51
60
|
doContactUpdate!: Subject<void>;
|
|
@@ -56,6 +65,9 @@ export class Contact extends deviceBase {
|
|
|
56
65
|
device: device & devicesConfig,
|
|
57
66
|
) {
|
|
58
67
|
super(platform, accessory, device);
|
|
68
|
+
// Set category
|
|
69
|
+
accessory.category = this.hap.Categories.SENSOR;
|
|
70
|
+
|
|
59
71
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
60
72
|
this.doContactUpdate = new Subject();
|
|
61
73
|
this.contactUpdateInProgress = false;
|
|
@@ -107,7 +119,7 @@ export class Contact extends deviceBase {
|
|
|
107
119
|
// Initialize Motion Sensor Service
|
|
108
120
|
if (this.device.contact?.hide_motionsensor) {
|
|
109
121
|
if (this.MotionSensor) {
|
|
110
|
-
this.debugLog(
|
|
122
|
+
this.debugLog('Removing Motion Sensor Service');
|
|
111
123
|
this.MotionSensor.Service = accessory.getService(this.hap.Service.MotionSensor) as Service;
|
|
112
124
|
accessory.removeService(this.MotionSensor.Service);
|
|
113
125
|
}
|
|
@@ -133,7 +145,7 @@ export class Contact extends deviceBase {
|
|
|
133
145
|
// Initialize Light Sensor Service
|
|
134
146
|
if (device.contact?.hide_lightsensor) {
|
|
135
147
|
if (this.LightSensor) {
|
|
136
|
-
this.debugLog(
|
|
148
|
+
this.debugLog('Removing Light Sensor Service');
|
|
137
149
|
this.LightSensor.Service = accessory.getService(this.hap.Service.LightSensor) as Service;
|
|
138
150
|
accessory.removeService(this.LightSensor.Service);
|
|
139
151
|
}
|
|
@@ -157,10 +169,12 @@ export class Contact extends deviceBase {
|
|
|
157
169
|
}
|
|
158
170
|
|
|
159
171
|
// Retrieve initial values and updateHomekit
|
|
172
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
160
173
|
this.refreshStatus();
|
|
161
174
|
|
|
162
|
-
//
|
|
163
|
-
this.
|
|
175
|
+
//regisiter webhook event handler
|
|
176
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
177
|
+
this.registerWebhook();
|
|
164
178
|
|
|
165
179
|
//regisiter webhook event handler
|
|
166
180
|
this.registerWebhook();
|
|
@@ -173,28 +187,28 @@ export class Contact extends deviceBase {
|
|
|
173
187
|
});
|
|
174
188
|
}
|
|
175
189
|
|
|
176
|
-
async BLEparseStatus(
|
|
190
|
+
async BLEparseStatus(): Promise<void> {
|
|
177
191
|
await this.debugLog('BLEparseStatus');
|
|
178
192
|
// ContactSensorState
|
|
179
|
-
this.ContactSensor.ContactSensorState = serviceData.doorState === 'open'
|
|
193
|
+
this.ContactSensor.ContactSensorState = this.serviceData.doorState === 'open'
|
|
180
194
|
? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED : this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
181
195
|
await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
182
196
|
|
|
183
197
|
// MotionDetected
|
|
184
198
|
if (!this.device.contact?.hide_motionsensor && this.MotionSensor?.Service) {
|
|
185
|
-
this.MotionSensor.MotionDetected = serviceData.movement;
|
|
199
|
+
this.MotionSensor.MotionDetected = this.serviceData.movement;
|
|
186
200
|
await this.debugLog(`MotionDetected: ${this.MotionSensor.MotionDetected}`);
|
|
187
201
|
}
|
|
188
202
|
// CurrentAmbientLightLevel
|
|
189
203
|
if (!this.device.contact?.hide_lightsensor && this.LightSensor?.Service) {
|
|
190
204
|
const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
|
|
191
205
|
const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
|
|
192
|
-
const lightLevel = serviceData.lightLevel === 'bright' ? set_maxLux : set_minLux;
|
|
206
|
+
const lightLevel = this.serviceData.lightLevel === 'bright' ? set_maxLux : set_minLux;
|
|
193
207
|
this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 2);
|
|
194
|
-
await this.debugLog(`LightLevel: ${serviceData.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
208
|
+
await this.debugLog(`LightLevel: ${this.serviceData.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
195
209
|
}
|
|
196
210
|
// BatteryLevel
|
|
197
|
-
this.Battery.BatteryLevel = serviceData.battery;
|
|
211
|
+
this.Battery.BatteryLevel = this.serviceData.battery;
|
|
198
212
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
199
213
|
// StatusLowBattery
|
|
200
214
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
@@ -202,37 +216,37 @@ export class Contact extends deviceBase {
|
|
|
202
216
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
203
217
|
}
|
|
204
218
|
|
|
205
|
-
async openAPIparseStatus(
|
|
219
|
+
async openAPIparseStatus(): Promise<void> {
|
|
206
220
|
await this.debugLog('openAPIparseStatus');
|
|
207
221
|
// Contact State
|
|
208
|
-
this.ContactSensor.ContactSensorState = deviceStatus.openState === 'open'
|
|
222
|
+
this.ContactSensor.ContactSensorState = this.deviceStatus.openState === 'open'
|
|
209
223
|
? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED : this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
210
224
|
await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
211
225
|
|
|
212
226
|
// MotionDetected
|
|
213
227
|
if (!this.device.contact?.hide_motionsensor && this.MotionSensor?.Service) {
|
|
214
|
-
this.MotionSensor.MotionDetected = deviceStatus.moveDetected;
|
|
228
|
+
this.MotionSensor.MotionDetected = this.deviceStatus.moveDetected;
|
|
215
229
|
await this.debugLog(`MotionDetected: ${this.MotionSensor.MotionDetected}`);
|
|
216
230
|
}
|
|
217
231
|
// Light Level
|
|
218
232
|
if (!this.device.contact?.hide_lightsensor && this.LightSensor?.Service) {
|
|
219
233
|
const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
|
|
220
234
|
const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
|
|
221
|
-
const lightLevel = deviceStatus.brightness === 'bright' ? set_maxLux : set_minLux;
|
|
235
|
+
const lightLevel = this.deviceStatus.brightness === 'bright' ? set_maxLux : set_minLux;
|
|
222
236
|
this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 2);
|
|
223
|
-
await this.debugLog(`LightLevel: ${deviceStatus.brightness}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
237
|
+
await this.debugLog(`LightLevel: ${this.deviceStatus.brightness}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
224
238
|
}
|
|
225
239
|
// BatteryLevel
|
|
226
|
-
this.Battery.BatteryLevel =
|
|
240
|
+
this.Battery.BatteryLevel = this.deviceStatus.battery;
|
|
227
241
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
228
242
|
// StatusLowBattery
|
|
229
243
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
230
244
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
231
245
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
232
246
|
// FirmwareVersion
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
247
|
+
if (this.deviceStatus.version) {
|
|
248
|
+
const version = this.deviceStatus.version.toString();
|
|
249
|
+
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
236
250
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
237
251
|
this.accessory
|
|
238
252
|
.getService(this.hap.Service.AccessoryInformation)!
|
|
@@ -240,29 +254,30 @@ export class Contact extends deviceBase {
|
|
|
240
254
|
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
241
255
|
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
242
256
|
.updateValue(deviceVersion);
|
|
243
|
-
this.accessory.context.
|
|
244
|
-
await this.debugLog(`
|
|
257
|
+
this.accessory.context.version = deviceVersion;
|
|
258
|
+
await this.debugLog(`version: ${this.accessory.context.version}`);
|
|
245
259
|
}
|
|
246
260
|
}
|
|
247
261
|
|
|
248
|
-
async parseStatusWebhook(
|
|
262
|
+
async parseStatusWebhook(): Promise<void> {
|
|
249
263
|
await this.debugLog('parseStatusWebhook');
|
|
250
|
-
await this.debugLog(`(detectionState, brightness, openState) = Webhook:(${
|
|
251
|
-
+ ` current:(${this.MotionSensor?.MotionDetected}, ${this.LightSensor?.CurrentAmbientLightLevel}
|
|
264
|
+
await this.debugLog(`(detectionState, brightness, openState) = Webhook:(${this.webhookContext.detectionState}, ${this.webhookContext.brightness},`
|
|
265
|
+
+ ` ${this.webhookContext.openState}), current:(${this.MotionSensor?.MotionDetected}, ${this.LightSensor?.CurrentAmbientLightLevel},`
|
|
266
|
+
+ ` ${this.ContactSensor.ContactSensorState})`);
|
|
252
267
|
// ContactSensorState
|
|
253
|
-
this.ContactSensor.ContactSensorState =
|
|
268
|
+
this.ContactSensor.ContactSensorState = this.webhookContext.openState === 'open' ? 1 : 0;
|
|
254
269
|
await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
255
270
|
if (!this.device.contact?.hide_motionsensor && this.MotionSensor?.Service) {
|
|
256
271
|
// MotionDetected
|
|
257
|
-
this.MotionSensor.MotionDetected =
|
|
272
|
+
this.MotionSensor.MotionDetected = this.webhookContext.detectionState === 'DETECTED' ? true : false;
|
|
258
273
|
await this.debugLog(`MotionDetected: ${this.MotionSensor.MotionDetected}`);
|
|
259
274
|
}
|
|
260
275
|
if (!this.device.contact?.hide_lightsensor && this.LightSensor?.Service) {
|
|
261
276
|
const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
|
|
262
277
|
const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
|
|
263
|
-
const lightLevel =
|
|
278
|
+
const lightLevel = this.webhookContext.brightness === 'bright' ? set_maxLux : set_minLux;
|
|
264
279
|
this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 2);
|
|
265
|
-
await this.debugLog(`LightLevel: ${
|
|
280
|
+
await this.debugLog(`LightLevel: ${this.webhookContext.brightness}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
266
281
|
}
|
|
267
282
|
}
|
|
268
283
|
|
|
@@ -295,7 +310,8 @@ export class Contact extends deviceBase {
|
|
|
295
310
|
const serviceData = await this.monitorAdvertisementPackets(switchbot) as contactSensorServiceData;
|
|
296
311
|
// Update HomeKit
|
|
297
312
|
if (serviceData.model === SwitchBotBLEModel.ContactSensor && serviceData.modelName === SwitchBotBLEModelName.ContactSensor) {
|
|
298
|
-
|
|
313
|
+
this.serviceData = serviceData;
|
|
314
|
+
await this.BLEparseStatus();
|
|
299
315
|
await this.updateHomeKitCharacteristics();
|
|
300
316
|
} else {
|
|
301
317
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -313,7 +329,8 @@ export class Contact extends deviceBase {
|
|
|
313
329
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
314
330
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
315
331
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
316
|
-
|
|
332
|
+
this.deviceStatus = deviceStatus.body;
|
|
333
|
+
await this.openAPIparseStatus();
|
|
317
334
|
await this.updateHomeKitCharacteristics();
|
|
318
335
|
} else {
|
|
319
336
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -331,7 +348,8 @@ export class Contact extends deviceBase {
|
|
|
331
348
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: contactSensorWebhookContext) => {
|
|
332
349
|
try {
|
|
333
350
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
334
|
-
|
|
351
|
+
this.webhookContext = context;
|
|
352
|
+
await this.parseStatusWebhook();
|
|
335
353
|
await this.updateHomeKitCharacteristics();
|
|
336
354
|
} catch (e: any) {
|
|
337
355
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
package/src/device/curtain.ts
CHANGED
|
@@ -40,6 +40,15 @@ export class Curtain extends deviceBase {
|
|
|
40
40
|
CurrentAmbientLightLevel?: CharacteristicValue;
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
+
// OpenAPI
|
|
44
|
+
deviceStatus!: curtainStatus;
|
|
45
|
+
|
|
46
|
+
//Webhook
|
|
47
|
+
webhookContext!: curtainWebhookContext | curtain3WebhookContext;
|
|
48
|
+
|
|
49
|
+
// BLE
|
|
50
|
+
serviceData!: curtainServiceData | curtain3ServiceData;
|
|
51
|
+
|
|
43
52
|
// Target
|
|
44
53
|
setNewTarget!: boolean;
|
|
45
54
|
setNewTargetTimer!: NodeJS.Timeout;
|
|
@@ -54,6 +63,8 @@ export class Curtain extends deviceBase {
|
|
|
54
63
|
device: device & devicesConfig,
|
|
55
64
|
) {
|
|
56
65
|
super(platform, accessory, device);
|
|
66
|
+
// Set category
|
|
67
|
+
accessory.category = this.hap.Categories.WINDOW_COVERING;
|
|
57
68
|
|
|
58
69
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
59
70
|
this.doCurtainUpdate = new Subject();
|
|
@@ -175,12 +186,11 @@ export class Curtain extends deviceBase {
|
|
|
175
186
|
}
|
|
176
187
|
|
|
177
188
|
// Retrieve initial values and updateHomekit
|
|
189
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
178
190
|
this.refreshStatus();
|
|
179
191
|
|
|
180
|
-
// Update Homekit
|
|
181
|
-
this.updateHomeKitCharacteristics();
|
|
182
|
-
|
|
183
192
|
//regisiter webhook event handler
|
|
193
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
184
194
|
this.registerWebhook();
|
|
185
195
|
|
|
186
196
|
// History
|
|
@@ -256,7 +266,7 @@ export class Curtain extends deviceBase {
|
|
|
256
266
|
});
|
|
257
267
|
const motion: Service =
|
|
258
268
|
this.accessory.getService(this.hap.Service.MotionSensor) ||
|
|
259
|
-
this.accessory.addService(this.hap.Service.MotionSensor,
|
|
269
|
+
this.accessory.addService(this.hap.Service.MotionSensor, 'Motion');
|
|
260
270
|
motion.addOptionalCharacteristic(this.platform.eve.Characteristics.LastActivation);
|
|
261
271
|
motion.getCharacteristic(this.platform.eve.Characteristics.LastActivation).onGet(() => {
|
|
262
272
|
const lastActivation = this.accessory.context.lastActivation
|
|
@@ -293,22 +303,24 @@ export class Curtain extends deviceBase {
|
|
|
293
303
|
}, 10 * 60 * 1000);
|
|
294
304
|
}
|
|
295
305
|
|
|
296
|
-
async BLEparseStatus(
|
|
306
|
+
async BLEparseStatus(): Promise<void> {
|
|
297
307
|
await this.debugLog('BLEparseStatus');
|
|
308
|
+
await this.debugLog(`(position, battery) = BLE:(${this.serviceData.position}, ${this.serviceData.battery}),`
|
|
309
|
+
+ ` current:(${this.WindowCovering.CurrentPosition}, ${this.Battery.BatteryLevel})`);
|
|
298
310
|
// CurrentPosition
|
|
299
|
-
this.WindowCovering.CurrentPosition = 100 -
|
|
311
|
+
this.WindowCovering.CurrentPosition = 100 -this.serviceData.position;
|
|
300
312
|
await this.getCurrentPostion();
|
|
301
313
|
// CurrentAmbientLightLevel
|
|
302
314
|
if (!this.device.curtain?.hide_lightsensor && this.LightSensor?.Service) {
|
|
303
315
|
const set_minLux = this.device.curtain?.set_minLux ?? 1;
|
|
304
316
|
const set_maxLux = this.device.curtain?.set_maxLux ?? 6001;
|
|
305
|
-
const lightLevel =
|
|
317
|
+
const lightLevel = this.serviceData.lightLevel;
|
|
306
318
|
this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 19);
|
|
307
|
-
this.debugLog(`LightLevel: ${serviceData.lightLevel},`
|
|
319
|
+
this.debugLog(`LightLevel: ${this.serviceData.lightLevel},`
|
|
308
320
|
+ ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
309
321
|
}
|
|
310
322
|
// BatteryLevel
|
|
311
|
-
this.Battery.BatteryLevel =
|
|
323
|
+
this.Battery.BatteryLevel = this.serviceData.battery;
|
|
312
324
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
313
325
|
// StatusLowBattery
|
|
314
326
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
@@ -316,16 +328,18 @@ export class Curtain extends deviceBase {
|
|
|
316
328
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
317
329
|
}
|
|
318
330
|
|
|
319
|
-
async openAPIparseStatus(
|
|
331
|
+
async openAPIparseStatus(): Promise<void> {
|
|
320
332
|
await this.debugLog('openAPIparseStatus');
|
|
333
|
+
await this.debugLog(`(slidePosition, battery) = OpenAPI:(${this.deviceStatus.slidePosition}, ${this.deviceStatus.battery}),`
|
|
334
|
+
+ ` current:(${this.WindowCovering.CurrentPosition}, ${this.Battery.BatteryLevel})`);
|
|
321
335
|
// CurrentPosition
|
|
322
|
-
this.WindowCovering.CurrentPosition = 100 - deviceStatus.slidePosition;
|
|
336
|
+
this.WindowCovering.CurrentPosition = 100 - this.deviceStatus.slidePosition;
|
|
323
337
|
await this.setMinMax();
|
|
324
|
-
await this.debugLog(`
|
|
338
|
+
await this.debugLog(`CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
|
|
325
339
|
if (this.setNewTarget) {
|
|
326
340
|
await this.infoLog('Checking Status ...');
|
|
327
341
|
}
|
|
328
|
-
if (this.setNewTarget && deviceStatus.moving) {
|
|
342
|
+
if (this.setNewTarget && this.deviceStatus.moving) {
|
|
329
343
|
await this.setMinMax();
|
|
330
344
|
if (Number(this.WindowCovering.TargetPosition) > this.WindowCovering.CurrentPosition) {
|
|
331
345
|
await this.debugLog(`Closing, CurrentPosition: ${this.WindowCovering.CurrentPosition}`);
|
|
@@ -351,25 +365,28 @@ export class Curtain extends deviceBase {
|
|
|
351
365
|
}
|
|
352
366
|
await this.debugLog(`CurrentPosition: ${this.WindowCovering.CurrentPosition}, TargetPosition: ${this.WindowCovering.TargetPosition},`
|
|
353
367
|
+ ` PositionState: ${this.WindowCovering.PositionState},`);
|
|
368
|
+
|
|
354
369
|
// Brightness
|
|
355
370
|
if (!this.device.curtain?.hide_lightsensor && this.LightSensor?.Service) {
|
|
356
371
|
const set_minLux = this.device.curtain?.set_minLux ?? 1;
|
|
357
372
|
const set_maxLux = this.device.curtain?.set_maxLux ?? 6001;
|
|
358
|
-
const lightLevel = deviceStatus.lightLevel === 'bright' ? set_maxLux : set_minLux;
|
|
373
|
+
const lightLevel = this.deviceStatus.lightLevel === 'bright' ? set_maxLux : set_minLux;
|
|
359
374
|
this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 2);
|
|
360
|
-
await this.debugLog(
|
|
361
|
-
+ ` CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
375
|
+
await this.debugLog(`CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
362
376
|
}
|
|
377
|
+
|
|
363
378
|
// BatteryLevel
|
|
364
|
-
this.Battery.BatteryLevel =
|
|
379
|
+
this.Battery.BatteryLevel = this.deviceStatus.battery;
|
|
365
380
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
381
|
+
|
|
366
382
|
// StatusLowBattery
|
|
367
383
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
368
384
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
369
385
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
386
|
+
|
|
370
387
|
// Firmware Version
|
|
371
|
-
if (deviceStatus.version) {
|
|
372
|
-
const version = deviceStatus.version.toString();
|
|
388
|
+
if (this.deviceStatus.version) {
|
|
389
|
+
const version = this.deviceStatus.version.toString();
|
|
373
390
|
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
374
391
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
375
392
|
this.accessory
|
|
@@ -378,21 +395,24 @@ export class Curtain extends deviceBase {
|
|
|
378
395
|
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
379
396
|
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
380
397
|
.updateValue(deviceVersion);
|
|
381
|
-
this.accessory.context.
|
|
382
|
-
await this.debugSuccessLog(`
|
|
398
|
+
this.accessory.context.version = deviceVersion;
|
|
399
|
+
await this.debugSuccessLog(`version: ${this.accessory.context.version}`);
|
|
383
400
|
}
|
|
384
401
|
}
|
|
385
402
|
|
|
386
|
-
async parseStatusWebhook(
|
|
403
|
+
async parseStatusWebhook(): Promise<void> {
|
|
387
404
|
await this.debugLog('parseStatusWebhook');
|
|
388
|
-
await this.debugLog(`(slidePosition, battery) = Webhook:(${
|
|
405
|
+
await this.debugLog(`(slidePosition, battery) = Webhook:(${this.webhookContext.slidePosition}, ${this.webhookContext.battery}),`
|
|
389
406
|
+ ` current:(${this.WindowCovering.CurrentPosition}, ${this.Battery.BatteryLevel})`);
|
|
407
|
+
|
|
390
408
|
// CurrentPosition
|
|
391
|
-
this.WindowCovering.CurrentPosition = 100 -
|
|
409
|
+
this.WindowCovering.CurrentPosition = 100 - this.webhookContext.slidePosition;
|
|
392
410
|
await this.getCurrentPostion();
|
|
411
|
+
|
|
393
412
|
// BatteryLevel
|
|
394
|
-
this.Battery.BatteryLevel =
|
|
413
|
+
this.Battery.BatteryLevel = this.webhookContext.battery;
|
|
395
414
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
415
|
+
|
|
396
416
|
// StatusLowBattery
|
|
397
417
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
398
418
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
@@ -429,7 +449,8 @@ export class Curtain extends deviceBase {
|
|
|
429
449
|
// Update HomeKit
|
|
430
450
|
if ((serviceData.model === SwitchBotBLEModel.Curtain || SwitchBotBLEModel.Curtain3)
|
|
431
451
|
&& (serviceData.modelName === SwitchBotBLEModelName.Curtain || SwitchBotBLEModelName.Curtain3)) {
|
|
432
|
-
|
|
452
|
+
this.serviceData = serviceData;
|
|
453
|
+
await this.BLEparseStatus();
|
|
433
454
|
await this.updateHomeKitCharacteristics();
|
|
434
455
|
} else {
|
|
435
456
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -447,7 +468,8 @@ export class Curtain extends deviceBase {
|
|
|
447
468
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
448
469
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
449
470
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
450
|
-
|
|
471
|
+
this.deviceStatus = deviceStatus.body;
|
|
472
|
+
await this.openAPIparseStatus();
|
|
451
473
|
await this.updateHomeKitCharacteristics();
|
|
452
474
|
} else {
|
|
453
475
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -465,7 +487,8 @@ export class Curtain extends deviceBase {
|
|
|
465
487
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: curtainWebhookContext | curtain3WebhookContext) => {
|
|
466
488
|
try {
|
|
467
489
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
468
|
-
|
|
490
|
+
this.webhookContext = context;
|
|
491
|
+
await this.parseStatusWebhook();
|
|
469
492
|
await this.updateHomeKitCharacteristics();
|
|
470
493
|
} catch (e: any) {
|
|
471
494
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|