@switchbot/homebridge-switchbot 3.5.1-beta.12 → 3.5.1-beta.14
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/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 +56 -44
- 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 +37 -23
- 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 +39 -20
- 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 +41 -30
- 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 +39 -27
- 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 +34 -21
- 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 +54 -125
- 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 +47 -28
- 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 +42 -25
- 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 +42 -25
- 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 +38 -23
- 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 +42 -26
- 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 +32 -21
- 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 +37 -23
- 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 +36 -23
- 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 +32 -21
- 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 +26 -15
- 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 +33 -20
- 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 +37 -22
- package/dist/device/waterdetector.js.map +1 -1
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js +19 -72
- package/dist/irdevice/airconditioner.js.map +1 -1
- package/dist/irdevice/airpurifier.js +4 -4
- package/dist/irdevice/airpurifier.js.map +1 -1
- package/dist/irdevice/camera.d.ts.map +1 -1
- package/dist/irdevice/camera.js +3 -10
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +7 -25
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +1 -1
- package/dist/irdevice/irdevice.js +2 -2
- package/dist/irdevice/irdevice.js.map +1 -1
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +9 -27
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.js +1 -1
- package/dist/irdevice/other.js.map +1 -1
- package/dist/irdevice/tv.d.ts.map +1 -1
- package/dist/irdevice/tv.js +3 -18
- package/dist/irdevice/tv.js.map +1 -1
- package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
- package/dist/irdevice/vacuumcleaner.js +2 -9
- package/dist/irdevice/vacuumcleaner.js.map +1 -1
- package/dist/irdevice/waterheater.d.ts.map +1 -1
- package/dist/irdevice/waterheater.js +2 -9
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/platform.d.ts +3 -5
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +13 -13
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +9 -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 +9 -9
- package/src/device/blindtilt.ts +59 -46
- package/src/device/bot.ts +46 -24
- package/src/device/ceilinglight.ts +51 -20
- package/src/device/colorbulb.ts +44 -30
- package/src/device/contact.ts +42 -27
- package/src/device/curtain.ts +44 -22
- package/src/device/device.ts +56 -112
- package/src/device/fan.ts +60 -29
- package/src/device/hub.ts +54 -28
- package/src/device/humidifier.ts +54 -30
- package/src/device/iosensor.ts +44 -26
- package/src/device/lightstrip.ts +47 -27
- package/src/device/lock.ts +48 -22
- package/src/device/meter.ts +53 -25
- package/src/device/meterplus.ts +49 -25
- package/src/device/motion.ts +44 -23
- package/src/device/plug.ts +33 -16
- package/src/device/robotvacuumcleaner.ts +48 -22
- package/src/device/waterdetector.ts +55 -24
- package/src/irdevice/airconditioner.ts +19 -65
- package/src/irdevice/airpurifier.ts +4 -4
- package/src/irdevice/camera.ts +4 -9
- package/src/irdevice/fan.ts +10 -22
- package/src/irdevice/irdevice.ts +2 -2
- package/src/irdevice/light.ts +10 -24
- package/src/irdevice/other.ts +1 -1
- package/src/irdevice/tv.ts +5 -16
- package/src/irdevice/vacuumcleaner.ts +3 -8
- package/src/irdevice/waterheater.ts +3 -8
- package/src/platform.ts +14 -14
- package/src/settings.ts +10 -8
- package/src/types/bledevicestatus.ts +4 -2
- package/src/types/devicestatus.ts +1 -1
package/src/device/lightstrip.ts
CHANGED
|
@@ -32,6 +32,15 @@ export class StripLight extends deviceBase {
|
|
|
32
32
|
ColorTemperature?: CharacteristicValue;
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
+
// OpenAPI
|
|
36
|
+
deviceStatus!: stripLightStatus;
|
|
37
|
+
|
|
38
|
+
//Webhook
|
|
39
|
+
webhookContext!: stripLightWebhookContext;
|
|
40
|
+
|
|
41
|
+
// BLE
|
|
42
|
+
serviceData!: stripLightServiceData;
|
|
43
|
+
|
|
35
44
|
// Adaptive Lighting
|
|
36
45
|
AdaptiveLightingController?: ControllerConstructor | Controller<ControllerServiceMap>;
|
|
37
46
|
adaptiveLightingShift?: number;
|
|
@@ -146,12 +155,11 @@ export class StripLight extends deviceBase {
|
|
|
146
155
|
.onSet(this.SaturationSet.bind(this));
|
|
147
156
|
|
|
148
157
|
// Retrieve initial values and updateHomekit
|
|
158
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
149
159
|
this.refreshStatus();
|
|
150
160
|
|
|
151
|
-
// Update Homekit
|
|
152
|
-
this.updateHomeKitCharacteristics();
|
|
153
|
-
|
|
154
161
|
//regisiter webhook event handler
|
|
162
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
155
163
|
this.registerWebhook();
|
|
156
164
|
|
|
157
165
|
// Start an update interval
|
|
@@ -181,20 +189,24 @@ export class StripLight extends deviceBase {
|
|
|
181
189
|
});
|
|
182
190
|
}
|
|
183
191
|
|
|
184
|
-
async BLEparseStatus(
|
|
192
|
+
async BLEparseStatus(): Promise<void> {
|
|
185
193
|
await this.debugLog('BLEparseStatus');
|
|
194
|
+
await this.debugLog(`(power, brightness, color) = BLE:(${this.serviceData.power}, ${this.serviceData.brightness},`
|
|
195
|
+
+ ` ${this.serviceData.red}:${this.serviceData.green}:${this.serviceData.blue}), current:(${this.LightBulb.On},`
|
|
196
|
+
+ ` ${this.LightBulb.Brightness}, ${this.LightBulb.Hue}, ${this.LightBulb.Saturation})`);
|
|
197
|
+
|
|
186
198
|
// On
|
|
187
|
-
this.LightBulb.On = serviceData.power;
|
|
199
|
+
this.LightBulb.On = this.serviceData.power;
|
|
188
200
|
await this.debugLog(`On: ${this.LightBulb.On}`);
|
|
189
201
|
|
|
190
202
|
// Brightness
|
|
191
|
-
this.LightBulb.Brightness = serviceData.brightness;
|
|
203
|
+
this.LightBulb.Brightness = this.serviceData.brightness;
|
|
192
204
|
await this.debugLog(`Brightness: ${this.LightBulb.Brightness}`);
|
|
193
205
|
|
|
194
206
|
// Color, Hue & Brightness
|
|
195
|
-
await this.debugLog(`red: ${serviceData.red}, green: ${serviceData.green}, blue: ${serviceData.blue}`);
|
|
196
|
-
const [hue, saturation] = rgb2hs(serviceData.red, serviceData.green, serviceData.blue);
|
|
197
|
-
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))}`);
|
|
198
210
|
|
|
199
211
|
// Hue
|
|
200
212
|
this.LightBulb.Hue = hue;
|
|
@@ -205,19 +217,23 @@ export class StripLight extends deviceBase {
|
|
|
205
217
|
this.debugLog(`Saturation: ${this.LightBulb.Saturation}`);
|
|
206
218
|
}
|
|
207
219
|
|
|
208
|
-
async openAPIparseStatus(
|
|
220
|
+
async openAPIparseStatus(): Promise<void> {
|
|
209
221
|
await this.debugLog('openAPIparseStatus');
|
|
222
|
+
await this.debugLog(`(power, brightness, color) = API:(${this.deviceStatus.power}, ${this.deviceStatus.brightness},`
|
|
223
|
+
+ ` ${this.deviceStatus.color}), current:(${this.LightBulb.On}, ${this.LightBulb.Brightness}, ${this.LightBulb.Hue},`
|
|
224
|
+
+ ` ${this.LightBulb.Saturation})`);
|
|
225
|
+
|
|
210
226
|
// On
|
|
211
|
-
this.LightBulb.On = deviceStatus.power === 'on' ? true : false;
|
|
227
|
+
this.LightBulb.On = this.deviceStatus.power === 'on' ? true : false;
|
|
212
228
|
await this.debugLog(`On: ${this.LightBulb.On}`);
|
|
213
229
|
|
|
214
230
|
// Brightness
|
|
215
|
-
this.LightBulb.Brightness = deviceStatus.brightness;
|
|
231
|
+
this.LightBulb.Brightness = this.deviceStatus.brightness;
|
|
216
232
|
await this.debugLog(`Brightness: ${this.LightBulb.Brightness}`);
|
|
217
233
|
|
|
218
234
|
// Color, Hue & Brightness
|
|
219
|
-
await this.debugLog(`color: ${JSON.stringify(deviceStatus.color)}`);
|
|
220
|
-
const [red, green, blue] = deviceStatus.color.split(':');
|
|
235
|
+
await this.debugLog(`color: ${JSON.stringify(this.deviceStatus.color)}`);
|
|
236
|
+
const [red, green, blue] = this.deviceStatus.color.split(':');
|
|
221
237
|
await this.debugLog(`red: ${JSON.stringify(red)}, green: ${JSON.stringify(green)}, blue: ${JSON.stringify(blue)}`);
|
|
222
238
|
const [hue, saturation] = rgb2hs(red, green, blue);
|
|
223
239
|
await this.debugLog(`hs: ${JSON.stringify(rgb2hs(red, green, blue))}`);
|
|
@@ -231,9 +247,9 @@ export class StripLight extends deviceBase {
|
|
|
231
247
|
await this.debugLog(`Saturation: ${this.LightBulb.Saturation}`);
|
|
232
248
|
|
|
233
249
|
// Firmware Version
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
250
|
+
if (this.deviceStatus.version) {
|
|
251
|
+
const version = this.deviceStatus.version.toString();
|
|
252
|
+
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
237
253
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
238
254
|
this.accessory
|
|
239
255
|
.getService(this.hap.Service.AccessoryInformation)!
|
|
@@ -246,22 +262,23 @@ export class StripLight extends deviceBase {
|
|
|
246
262
|
}
|
|
247
263
|
}
|
|
248
264
|
|
|
249
|
-
async parseStatusWebhook(
|
|
265
|
+
async parseStatusWebhook(): Promise<void> {
|
|
250
266
|
await this.debugLog('parseStatusWebhook');
|
|
251
|
-
await this.debugLog(`(powerState, brightness, color) = Webhook:(${
|
|
252
|
-
+ `
|
|
267
|
+
await this.debugLog(`(powerState, brightness, color) = Webhook:(${this.webhookContext.powerState}, ${this.webhookContext.brightness},`
|
|
268
|
+
+ ` ${this.webhookContext.color}), current:(${this.LightBulb.On}, ${this.LightBulb.Brightness}, ${this.LightBulb.Hue},`
|
|
269
|
+
+ ` ${this.LightBulb.Saturation})`);
|
|
253
270
|
|
|
254
271
|
// On
|
|
255
|
-
this.LightBulb.On =
|
|
272
|
+
this.LightBulb.On = this.webhookContext.powerState === 'ON' ? true : false;
|
|
256
273
|
await this.debugLog(`On: ${this.LightBulb.On}`);
|
|
257
274
|
|
|
258
275
|
// Brightness
|
|
259
|
-
this.LightBulb.Brightness =
|
|
276
|
+
this.LightBulb.Brightness = this.webhookContext.brightness;
|
|
260
277
|
await this.debugLog(`Brightness: ${this.LightBulb.Brightness}`);
|
|
261
278
|
|
|
262
279
|
// Color, Hue & Brightness
|
|
263
|
-
await this.debugLog(`color: ${JSON.stringify(
|
|
264
|
-
const [red, green, blue] =
|
|
280
|
+
await this.debugLog(`color: ${JSON.stringify(this.webhookContext.color)}`);
|
|
281
|
+
const [red, green, blue] = this.webhookContext.color.split(':');
|
|
265
282
|
await this.debugLog(`red: ${JSON.stringify(red)}, green: ${JSON.stringify(green)}, blue: ${JSON.stringify(blue)}`);
|
|
266
283
|
const [hue, saturation] = rgb2hs(red, green, blue);
|
|
267
284
|
await this.debugLog(`hs: ${JSON.stringify(rgb2hs(red, green, blue))}`);
|
|
@@ -304,7 +321,8 @@ export class StripLight extends deviceBase {
|
|
|
304
321
|
const serviceData = await this.monitorAdvertisementPackets(switchbot) as stripLightServiceData;
|
|
305
322
|
// Update HomeKit
|
|
306
323
|
if (serviceData.model === SwitchBotBLEModel.StripLight && serviceData.modelName === SwitchBotBLEModelName.StripLight) {
|
|
307
|
-
|
|
324
|
+
this.serviceData = serviceData;
|
|
325
|
+
await this.BLEparseStatus();
|
|
308
326
|
await this.updateHomeKitCharacteristics();
|
|
309
327
|
} else {
|
|
310
328
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -322,7 +340,8 @@ export class StripLight extends deviceBase {
|
|
|
322
340
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
323
341
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
324
342
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
325
|
-
|
|
343
|
+
this.deviceStatus = deviceStatus.body;
|
|
344
|
+
await this.openAPIparseStatus();
|
|
326
345
|
await this.updateHomeKitCharacteristics();
|
|
327
346
|
} else {
|
|
328
347
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -340,7 +359,8 @@ export class StripLight extends deviceBase {
|
|
|
340
359
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: stripLightWebhookContext) => {
|
|
341
360
|
try {
|
|
342
361
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
343
|
-
|
|
362
|
+
this.webhookContext = context;
|
|
363
|
+
await this.parseStatusWebhook();
|
|
344
364
|
await this.updateHomeKitCharacteristics();
|
|
345
365
|
} catch (e: any) {
|
|
346
366
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
package/src/device/lock.ts
CHANGED
|
@@ -42,6 +42,15 @@ export class Lock extends deviceBase {
|
|
|
42
42
|
On: CharacteristicValue;
|
|
43
43
|
};
|
|
44
44
|
|
|
45
|
+
// OpenAPI
|
|
46
|
+
deviceStatus!: lockStatus | lockProStatus;
|
|
47
|
+
|
|
48
|
+
//Webhook
|
|
49
|
+
webhookContext!: lockWebhookContext | lockProWebhookContext;
|
|
50
|
+
|
|
51
|
+
// BLE
|
|
52
|
+
serviceData!: lockServiceData | lockProServiceData;
|
|
53
|
+
|
|
45
54
|
// Updates
|
|
46
55
|
lockUpdateInProgress!: boolean;
|
|
47
56
|
doLockUpdate!: Subject<void>;
|
|
@@ -153,12 +162,11 @@ export class Lock extends deviceBase {
|
|
|
153
162
|
}
|
|
154
163
|
|
|
155
164
|
// Retrieve initial values and updateHomekit
|
|
165
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
156
166
|
this.refreshStatus();
|
|
157
167
|
|
|
158
|
-
// Update Homekit
|
|
159
|
-
this.updateHomeKitCharacteristics();
|
|
160
|
-
|
|
161
168
|
//regisiter webhook event handler
|
|
169
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
162
170
|
this.registerWebhook();
|
|
163
171
|
|
|
164
172
|
// Start an update interval
|
|
@@ -188,57 +196,70 @@ export class Lock extends deviceBase {
|
|
|
188
196
|
});
|
|
189
197
|
}
|
|
190
198
|
|
|
191
|
-
async BLEparseStatus(
|
|
199
|
+
async BLEparseStatus(): Promise<void> {
|
|
192
200
|
await this.debugLog('BLEparseStatus');
|
|
201
|
+
await this.debugLog(`(lockState) = BLE:(${this.serviceData.status}), current:(${this.LockMechanism.LockCurrentState})`);
|
|
202
|
+
|
|
193
203
|
// LockCurrentState
|
|
194
|
-
this.LockMechanism.LockCurrentState = serviceData.status === 'locked'
|
|
204
|
+
this.LockMechanism.LockCurrentState = this.serviceData.status === 'locked'
|
|
195
205
|
? this.hap.Characteristic.LockCurrentState.SECURED : this.hap.Characteristic.LockCurrentState.UNSECURED;
|
|
196
206
|
await this.debugLog(`LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
|
|
207
|
+
|
|
197
208
|
// LockTargetState
|
|
198
|
-
this.LockMechanism.LockTargetState = serviceData.status === 'locked'
|
|
209
|
+
this.LockMechanism.LockTargetState = this.serviceData.status === 'locked'
|
|
199
210
|
? this.hap.Characteristic.LockTargetState.SECURED : this.hap.Characteristic.LockTargetState.UNSECURED;
|
|
200
211
|
await this.debugLog(`LockTargetState: ${this.LockMechanism.LockTargetState}`);
|
|
212
|
+
|
|
201
213
|
// Contact Sensor
|
|
202
214
|
if (!this.device.lock?.hide_contactsensor && this.ContactSensor?.Service) {
|
|
203
|
-
this.ContactSensor.ContactSensorState = serviceData.door_open === 'opened'
|
|
215
|
+
this.ContactSensor.ContactSensorState = this.serviceData.door_open === 'opened'
|
|
204
216
|
? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED : this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
205
217
|
await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
206
218
|
}
|
|
219
|
+
|
|
207
220
|
// BatteryLevel
|
|
208
|
-
this.Battery.BatteryLevel =
|
|
221
|
+
this.Battery.BatteryLevel = this.serviceData.battery;
|
|
209
222
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
223
|
+
|
|
210
224
|
// StatusLowBattery
|
|
211
225
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
212
226
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
213
227
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
214
228
|
}
|
|
215
229
|
|
|
216
|
-
async openAPIparseStatus(
|
|
230
|
+
async openAPIparseStatus(): Promise<void> {
|
|
217
231
|
await this.debugLog('openAPIparseStatus');
|
|
232
|
+
await this.debugLog(`(lockState) = OpenAPI:(${this.deviceStatus.lockState}), current:(${this.LockMechanism.LockCurrentState})`);
|
|
233
|
+
|
|
218
234
|
// LockCurrentState
|
|
219
|
-
this.LockMechanism.LockCurrentState = deviceStatus.lockState === 'locked'
|
|
235
|
+
this.LockMechanism.LockCurrentState = this.deviceStatus.lockState === 'locked'
|
|
220
236
|
? this.hap.Characteristic.LockCurrentState.SECURED : this.hap.Characteristic.LockCurrentState.UNSECURED;
|
|
221
237
|
await this.debugLog(`LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
|
|
238
|
+
|
|
222
239
|
// LockTargetState
|
|
223
|
-
this.LockMechanism.LockTargetState = deviceStatus.lockState === 'locked'
|
|
240
|
+
this.LockMechanism.LockTargetState = this.deviceStatus.lockState === 'locked'
|
|
224
241
|
? this.hap.Characteristic.LockTargetState.SECURED : this.hap.Characteristic.LockTargetState.UNSECURED;
|
|
225
242
|
await this.debugLog(`LockTargetState: ${this.LockMechanism.LockTargetState}`);
|
|
243
|
+
|
|
226
244
|
// ContactSensorState
|
|
227
245
|
if (!this.device.lock?.hide_contactsensor && this.ContactSensor?.Service) {
|
|
228
|
-
this.ContactSensor.ContactSensorState = deviceStatus.doorState === 'opened'
|
|
246
|
+
this.ContactSensor.ContactSensorState = this.deviceStatus.doorState === 'opened'
|
|
229
247
|
? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED : this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
230
248
|
await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
231
249
|
}
|
|
250
|
+
|
|
232
251
|
// BatteryLevel
|
|
233
|
-
this.Battery.BatteryLevel =
|
|
252
|
+
this.Battery.BatteryLevel = this.deviceStatus.battery;
|
|
234
253
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
254
|
+
|
|
235
255
|
// StatusLowBattery
|
|
236
256
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
237
257
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
238
258
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
259
|
+
|
|
239
260
|
// Firmware Version
|
|
240
|
-
if (deviceStatus.version) {
|
|
241
|
-
const version = deviceStatus.version.toString();
|
|
261
|
+
if (this.deviceStatus.version) {
|
|
262
|
+
const version = this.deviceStatus.version.toString();
|
|
242
263
|
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
243
264
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
244
265
|
this.accessory
|
|
@@ -252,15 +273,17 @@ export class Lock extends deviceBase {
|
|
|
252
273
|
}
|
|
253
274
|
}
|
|
254
275
|
|
|
255
|
-
async parseStatusWebhook(
|
|
276
|
+
async parseStatusWebhook(): Promise<void> {
|
|
256
277
|
await this.debugLog('parseStatusWebhook');
|
|
257
|
-
await this.debugLog(`(lockState) = Webhook:(${
|
|
278
|
+
await this.debugLog(`(lockState) = Webhook:(${this.webhookContext.lockState}), current:(${this.LockMechanism.LockCurrentState})`);
|
|
279
|
+
|
|
258
280
|
// LockCurrentState
|
|
259
|
-
this.LockMechanism.LockCurrentState =
|
|
281
|
+
this.LockMechanism.LockCurrentState = this.webhookContext.lockState === 'LOCKED'
|
|
260
282
|
? this.hap.Characteristic.LockCurrentState.SECURED : this.hap.Characteristic.LockCurrentState.UNSECURED;
|
|
261
283
|
await this.debugLog(`LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
|
|
284
|
+
|
|
262
285
|
// LockTargetState
|
|
263
|
-
this.LockMechanism.LockTargetState =
|
|
286
|
+
this.LockMechanism.LockTargetState = this.webhookContext.lockState === 'LOCKED'
|
|
264
287
|
? this.hap.Characteristic.LockTargetState.SECURED : this.hap.Characteristic.LockTargetState.UNSECURED;
|
|
265
288
|
await this.debugLog(`LockTargetState: ${this.LockMechanism.LockTargetState}`);
|
|
266
289
|
}
|
|
@@ -295,7 +318,8 @@ export class Lock extends deviceBase {
|
|
|
295
318
|
// Update HomeKit
|
|
296
319
|
if ((serviceData.model === SwitchBotBLEModel.Lock || SwitchBotBLEModel.LockPro)
|
|
297
320
|
&& (serviceData.modelName === SwitchBotBLEModelName.Lock || SwitchBotBLEModelName.LockPro)) {
|
|
298
|
-
|
|
321
|
+
this.serviceData = serviceData;
|
|
322
|
+
await this.BLEparseStatus();
|
|
299
323
|
await this.updateHomeKitCharacteristics();
|
|
300
324
|
} else {
|
|
301
325
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -313,7 +337,8 @@ export class Lock extends deviceBase {
|
|
|
313
337
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
314
338
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
315
339
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
316
|
-
|
|
340
|
+
this.deviceStatus = deviceStatus.body;
|
|
341
|
+
await this.openAPIparseStatus();
|
|
317
342
|
await this.updateHomeKitCharacteristics();
|
|
318
343
|
} else {
|
|
319
344
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -331,7 +356,8 @@ export class Lock extends deviceBase {
|
|
|
331
356
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: lockWebhookContext | lockProWebhookContext) => {
|
|
332
357
|
try {
|
|
333
358
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
334
|
-
|
|
359
|
+
this.webhookContext = context;
|
|
360
|
+
await this.parseStatusWebhook();
|
|
335
361
|
await this.updateHomeKitCharacteristics();
|
|
336
362
|
} catch (e: any) {
|
|
337
363
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
package/src/device/meter.ts
CHANGED
|
@@ -37,6 +37,15 @@ export class Meter extends deviceBase {
|
|
|
37
37
|
CurrentTemperature: CharacteristicValue;
|
|
38
38
|
};
|
|
39
39
|
|
|
40
|
+
// OpenAPI
|
|
41
|
+
deviceStatus!: meterStatus;
|
|
42
|
+
|
|
43
|
+
//Webhook
|
|
44
|
+
webhookContext!: meterWebhookContext;
|
|
45
|
+
|
|
46
|
+
// BLE
|
|
47
|
+
serviceData!: meterServiceData;
|
|
48
|
+
|
|
40
49
|
// Updates
|
|
41
50
|
meterUpdateInProgress!: boolean;
|
|
42
51
|
doMeterUpdate: Subject<void>;
|
|
@@ -136,12 +145,11 @@ export class Meter extends deviceBase {
|
|
|
136
145
|
}
|
|
137
146
|
|
|
138
147
|
// Retrieve initial values and updateHomekit
|
|
148
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
139
149
|
this.refreshStatus();
|
|
140
150
|
|
|
141
|
-
// Retrieve initial values and update Homekit
|
|
142
|
-
this.updateHomeKitCharacteristics();
|
|
143
|
-
|
|
144
151
|
//regisiter webhook event handler
|
|
152
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
145
153
|
this.registerWebhook();
|
|
146
154
|
|
|
147
155
|
// Start an update interval
|
|
@@ -152,51 +160,65 @@ export class Meter extends deviceBase {
|
|
|
152
160
|
});
|
|
153
161
|
}
|
|
154
162
|
|
|
155
|
-
async BLEparseStatus(
|
|
163
|
+
async BLEparseStatus(): Promise<void> {
|
|
156
164
|
await this.debugLog('BLEparseStatus');
|
|
165
|
+
await this.debugLog(`(scale, temperature, humidity) = BLE:(${this.serviceData.fahrenheit}, ${this.serviceData.temperature.c},`
|
|
166
|
+
+ ` ${this.serviceData.humidity}), current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
167
|
+
|
|
157
168
|
// CurrentRelativeHumidity
|
|
158
169
|
if (!this.device.iosensor?.hide_humidity && this.HumiditySensor?.Service) {
|
|
159
|
-
this.HumiditySensor.CurrentRelativeHumidity = serviceData.humidity;
|
|
170
|
+
this.HumiditySensor.CurrentRelativeHumidity = this.serviceData.humidity;
|
|
160
171
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
|
|
161
172
|
}
|
|
173
|
+
|
|
162
174
|
// Current Temperature
|
|
163
175
|
if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
164
|
-
const CELSIUS = serviceData.temperature.c < 0 ? 0 : serviceData.temperature.c > 100 ? 100 : serviceData.temperature.c;
|
|
176
|
+
const CELSIUS = this.serviceData.temperature.c < 0 ? 0 : this.serviceData.temperature.c > 100 ? 100 : this.serviceData.temperature.c;
|
|
165
177
|
this.TemperatureSensor.CurrentTemperature = CELSIUS;
|
|
166
178
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
|
|
167
179
|
}
|
|
180
|
+
|
|
168
181
|
// BatteryLevel
|
|
169
|
-
this.Battery.BatteryLevel =
|
|
182
|
+
this.Battery.BatteryLevel = this.serviceData.battery;
|
|
170
183
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
184
|
+
|
|
171
185
|
// StatusLowBattery
|
|
172
186
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
173
187
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
174
188
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
175
189
|
}
|
|
176
190
|
|
|
177
|
-
async openAPIparseStatus(
|
|
191
|
+
async openAPIparseStatus(): Promise<void> {
|
|
178
192
|
await this.debugLog('openAPIparseStatus');
|
|
193
|
+
await this.debugLog(`(battery, temperature, humidity) = OpenAPI:(${this.deviceStatus.battery}, ${this.deviceStatus.temperature},`
|
|
194
|
+
+ ` ${this.deviceStatus.humidity}), current:(${this.Battery?.BatteryLevel}, ${this.TemperatureSensor?.CurrentTemperature},`
|
|
195
|
+
+ ` ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
196
|
+
|
|
179
197
|
// CurrentRelativeHumidity
|
|
180
198
|
if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
|
|
181
|
-
this.HumiditySensor.CurrentRelativeHumidity = deviceStatus.humidity;
|
|
199
|
+
this.HumiditySensor.CurrentRelativeHumidity = this.deviceStatus.humidity;
|
|
182
200
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
|
|
183
201
|
}
|
|
202
|
+
|
|
184
203
|
// CurrentTemperature
|
|
185
204
|
if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
186
|
-
this.TemperatureSensor.CurrentTemperature = deviceStatus.temperature;
|
|
205
|
+
this.TemperatureSensor.CurrentTemperature = this.deviceStatus.temperature;
|
|
187
206
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
|
|
188
207
|
}
|
|
208
|
+
|
|
189
209
|
// BatteryLevel
|
|
190
|
-
this.Battery.BatteryLevel =
|
|
210
|
+
this.Battery.BatteryLevel = this.deviceStatus.battery;
|
|
191
211
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
212
|
+
|
|
192
213
|
// StatusLowBattery
|
|
193
214
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
194
215
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
195
216
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
217
|
+
|
|
196
218
|
// FirmwareVersion
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
219
|
+
if (this.deviceStatus.version) {
|
|
220
|
+
const version = this.deviceStatus.version.toString();
|
|
221
|
+
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
200
222
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
201
223
|
this.accessory
|
|
202
224
|
.getService(this.hap.Service.AccessoryInformation)!
|
|
@@ -209,24 +231,27 @@ export class Meter extends deviceBase {
|
|
|
209
231
|
}
|
|
210
232
|
}
|
|
211
233
|
|
|
212
|
-
async parseStatusWebhook(
|
|
234
|
+
async parseStatusWebhook(): Promise<void> {
|
|
213
235
|
await this.debugLog('parseStatusWebhook');
|
|
214
|
-
await this.debugLog(`(scale, temperature, humidity) = Webhook:(${
|
|
215
|
-
this.device.meter?.convertUnitTo)}, ${
|
|
216
|
-
+ ` ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
236
|
+
await this.debugLog(`(scale, temperature, humidity) = Webhook:(${this.webhookContext.scale}, ${convertUnits(this.webhookContext.temperature,
|
|
237
|
+
this.webhookContext.scale, this.device.meter?.convertUnitTo)}, ${this.webhookContext.humidity}),`
|
|
238
|
+
+ ` current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
217
239
|
// Check if the scale is not CELSIUS
|
|
218
|
-
if (
|
|
219
|
-
await this.warnLog(`received a non-CELSIUS Webhook scale: ${
|
|
240
|
+
if (this.webhookContext.scale !== 'CELSIUS' && this.device.hub?.convertUnitTo === undefined) {
|
|
241
|
+
await this.warnLog(`received a non-CELSIUS Webhook scale: ${this.webhookContext.scale}, Use the *convertUnitsTo* config under Hub settings,`
|
|
220
242
|
+ ' if displaying incorrectly in HomeKit.');
|
|
221
243
|
}
|
|
244
|
+
|
|
222
245
|
// CurrentRelativeHumidity
|
|
223
246
|
if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
|
|
224
|
-
this.HumiditySensor.CurrentRelativeHumidity =
|
|
247
|
+
this.HumiditySensor.CurrentRelativeHumidity = this.webhookContext.humidity;
|
|
225
248
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
|
|
226
249
|
}
|
|
250
|
+
|
|
227
251
|
// CurrentTemperature
|
|
228
252
|
if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
229
|
-
this.TemperatureSensor.CurrentTemperature = convertUnits(
|
|
253
|
+
this.TemperatureSensor.CurrentTemperature = convertUnits(this.webhookContext.temperature, this.webhookContext.scale,
|
|
254
|
+
this.device.hub?.convertUnitTo);
|
|
230
255
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
|
|
231
256
|
}
|
|
232
257
|
}
|
|
@@ -260,7 +285,8 @@ export class Meter extends deviceBase {
|
|
|
260
285
|
const serviceData = await this.monitorAdvertisementPackets(switchbot) as meterServiceData;
|
|
261
286
|
// Update HomeKit
|
|
262
287
|
if (serviceData.model === SwitchBotBLEModel.Meter && serviceData.modelName === SwitchBotBLEModelName.Meter) {
|
|
263
|
-
|
|
288
|
+
this.serviceData = serviceData;
|
|
289
|
+
await this.BLEparseStatus();
|
|
264
290
|
await this.updateHomeKitCharacteristics();
|
|
265
291
|
} else {
|
|
266
292
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -278,7 +304,8 @@ export class Meter extends deviceBase {
|
|
|
278
304
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
279
305
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
280
306
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
281
|
-
|
|
307
|
+
this.deviceStatus = deviceStatus.body;
|
|
308
|
+
await this.openAPIparseStatus();
|
|
282
309
|
await this.updateHomeKitCharacteristics();
|
|
283
310
|
} else {
|
|
284
311
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -296,7 +323,8 @@ export class Meter extends deviceBase {
|
|
|
296
323
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: meterWebhookContext) => {
|
|
297
324
|
try {
|
|
298
325
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
299
|
-
|
|
326
|
+
this.webhookContext = context;
|
|
327
|
+
await this.parseStatusWebhook();
|
|
300
328
|
await this.updateHomeKitCharacteristics();
|
|
301
329
|
} catch (e: any) {
|
|
302
330
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|