@switchbot/homebridge-switchbot 3.5.1-beta.9 → 3.5.2-beta.0
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 +61 -47
- 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 +60 -26
- 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 +48 -30
- 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 +54 -37
- 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 +46 -32
- 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 +42 -28
- package/dist/device/curtain.js.map +1 -1
- package/dist/device/device.d.ts +7 -4
- package/dist/device/device.d.ts.map +1 -1
- package/dist/device/device.js +61 -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 +54 -33
- 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 +50 -31
- 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 +48 -29
- 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 +45 -28
- 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 +47 -29
- 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 +39 -26
- 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 +44 -28
- 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 +43 -28
- 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 +38 -25
- 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 +31 -18
- 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 +38 -23
- 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 -27
- 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 +14 -14
- package/src/device/blindtilt.ts +65 -49
- package/src/device/bot.ts +80 -27
- package/src/device/ceilinglight.ts +58 -32
- package/src/device/colorbulb.ts +58 -44
- package/src/device/contact.ts +50 -32
- package/src/device/curtain.ts +52 -29
- package/src/device/device.ts +63 -135
- package/src/device/fan.ts +68 -34
- package/src/device/hub.ts +63 -34
- package/src/device/humidifier.ts +61 -34
- package/src/device/iosensor.ts +52 -31
- package/src/device/lightstrip.ts +53 -30
- package/src/device/lock.ts +56 -27
- package/src/device/meter.ts +61 -30
- package/src/device/meterplus.ts +57 -30
- package/src/device/motion.ts +51 -27
- package/src/device/plug.ts +39 -19
- package/src/device/robotvacuumcleaner.ts +54 -25
- package/src/device/waterdetector.ts +63 -29
- 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/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>;
|
|
@@ -52,6 +61,9 @@ export class Lock extends deviceBase {
|
|
|
52
61
|
device: device & devicesConfig,
|
|
53
62
|
) {
|
|
54
63
|
super(platform, accessory, device);
|
|
64
|
+
// Set category
|
|
65
|
+
accessory.category = this.hap.Categories.DOOR_LOCK;
|
|
66
|
+
|
|
55
67
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
56
68
|
this.doLockUpdate = new Subject();
|
|
57
69
|
this.lockUpdateInProgress = false;
|
|
@@ -103,7 +115,7 @@ export class Lock extends deviceBase {
|
|
|
103
115
|
// Contact Sensor Service
|
|
104
116
|
if (device.lock?.hide_contactsensor) {
|
|
105
117
|
if (this.ContactSensor) {
|
|
106
|
-
this.debugLog(
|
|
118
|
+
this.debugLog('Removing Contact Sensor Service');
|
|
107
119
|
this.ContactSensor.Service = this.accessory.getService(this.hap.Service.ContactSensor) as Service;
|
|
108
120
|
accessory.removeService(this.ContactSensor.Service);
|
|
109
121
|
}
|
|
@@ -129,7 +141,7 @@ export class Lock extends deviceBase {
|
|
|
129
141
|
// Initialize Latch Button Service
|
|
130
142
|
if (device.lock?.activate_latchbutton === false) {
|
|
131
143
|
if (this.Switch) {
|
|
132
|
-
this.debugLog(
|
|
144
|
+
this.debugLog('Removing Latch Button Service');
|
|
133
145
|
this.Switch.Service = accessory.getService(this.hap.Service.Switch) as Service;
|
|
134
146
|
accessory.removeService(this.Switch.Service);
|
|
135
147
|
}
|
|
@@ -153,12 +165,11 @@ export class Lock extends deviceBase {
|
|
|
153
165
|
}
|
|
154
166
|
|
|
155
167
|
// Retrieve initial values and updateHomekit
|
|
168
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
156
169
|
this.refreshStatus();
|
|
157
170
|
|
|
158
|
-
// Update Homekit
|
|
159
|
-
this.updateHomeKitCharacteristics();
|
|
160
|
-
|
|
161
171
|
//regisiter webhook event handler
|
|
172
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
162
173
|
this.registerWebhook();
|
|
163
174
|
|
|
164
175
|
// Start an update interval
|
|
@@ -188,57 +199,70 @@ export class Lock extends deviceBase {
|
|
|
188
199
|
});
|
|
189
200
|
}
|
|
190
201
|
|
|
191
|
-
async BLEparseStatus(
|
|
202
|
+
async BLEparseStatus(): Promise<void> {
|
|
192
203
|
await this.debugLog('BLEparseStatus');
|
|
204
|
+
await this.debugLog(`(lockState) = BLE:(${this.serviceData.status}), current:(${this.LockMechanism.LockCurrentState})`);
|
|
205
|
+
|
|
193
206
|
// LockCurrentState
|
|
194
|
-
this.LockMechanism.LockCurrentState = serviceData.status === 'locked'
|
|
207
|
+
this.LockMechanism.LockCurrentState = this.serviceData.status === 'locked'
|
|
195
208
|
? this.hap.Characteristic.LockCurrentState.SECURED : this.hap.Characteristic.LockCurrentState.UNSECURED;
|
|
196
209
|
await this.debugLog(`LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
|
|
210
|
+
|
|
197
211
|
// LockTargetState
|
|
198
|
-
this.LockMechanism.LockTargetState = serviceData.status === 'locked'
|
|
212
|
+
this.LockMechanism.LockTargetState = this.serviceData.status === 'locked'
|
|
199
213
|
? this.hap.Characteristic.LockTargetState.SECURED : this.hap.Characteristic.LockTargetState.UNSECURED;
|
|
200
214
|
await this.debugLog(`LockTargetState: ${this.LockMechanism.LockTargetState}`);
|
|
215
|
+
|
|
201
216
|
// Contact Sensor
|
|
202
217
|
if (!this.device.lock?.hide_contactsensor && this.ContactSensor?.Service) {
|
|
203
|
-
this.ContactSensor.ContactSensorState = serviceData.door_open === 'opened'
|
|
218
|
+
this.ContactSensor.ContactSensorState = this.serviceData.door_open === 'opened'
|
|
204
219
|
? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED : this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
205
220
|
await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
206
221
|
}
|
|
222
|
+
|
|
207
223
|
// BatteryLevel
|
|
208
|
-
this.Battery.BatteryLevel =
|
|
224
|
+
this.Battery.BatteryLevel = this.serviceData.battery;
|
|
209
225
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
226
|
+
|
|
210
227
|
// StatusLowBattery
|
|
211
228
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
212
229
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
213
230
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
214
231
|
}
|
|
215
232
|
|
|
216
|
-
async openAPIparseStatus(
|
|
233
|
+
async openAPIparseStatus(): Promise<void> {
|
|
217
234
|
await this.debugLog('openAPIparseStatus');
|
|
235
|
+
await this.debugLog(`(lockState) = OpenAPI:(${this.deviceStatus.lockState}), current:(${this.LockMechanism.LockCurrentState})`);
|
|
236
|
+
|
|
218
237
|
// LockCurrentState
|
|
219
|
-
this.LockMechanism.LockCurrentState = deviceStatus.lockState === 'locked'
|
|
238
|
+
this.LockMechanism.LockCurrentState = this.deviceStatus.lockState === 'locked'
|
|
220
239
|
? this.hap.Characteristic.LockCurrentState.SECURED : this.hap.Characteristic.LockCurrentState.UNSECURED;
|
|
221
240
|
await this.debugLog(`LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
|
|
241
|
+
|
|
222
242
|
// LockTargetState
|
|
223
|
-
this.LockMechanism.LockTargetState = deviceStatus.lockState === 'locked'
|
|
243
|
+
this.LockMechanism.LockTargetState = this.deviceStatus.lockState === 'locked'
|
|
224
244
|
? this.hap.Characteristic.LockTargetState.SECURED : this.hap.Characteristic.LockTargetState.UNSECURED;
|
|
225
245
|
await this.debugLog(`LockTargetState: ${this.LockMechanism.LockTargetState}`);
|
|
246
|
+
|
|
226
247
|
// ContactSensorState
|
|
227
248
|
if (!this.device.lock?.hide_contactsensor && this.ContactSensor?.Service) {
|
|
228
|
-
this.ContactSensor.ContactSensorState = deviceStatus.doorState === 'opened'
|
|
249
|
+
this.ContactSensor.ContactSensorState = this.deviceStatus.doorState === 'opened'
|
|
229
250
|
? this.hap.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED : this.hap.Characteristic.ContactSensorState.CONTACT_DETECTED;
|
|
230
251
|
await this.debugLog(`ContactSensorState: ${this.ContactSensor.ContactSensorState}`);
|
|
231
252
|
}
|
|
253
|
+
|
|
232
254
|
// BatteryLevel
|
|
233
|
-
this.Battery.BatteryLevel =
|
|
255
|
+
this.Battery.BatteryLevel = this.deviceStatus.battery;
|
|
234
256
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
257
|
+
|
|
235
258
|
// StatusLowBattery
|
|
236
259
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
237
260
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
238
261
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
262
|
+
|
|
239
263
|
// Firmware Version
|
|
240
|
-
if (deviceStatus.version) {
|
|
241
|
-
const version = deviceStatus.version.toString();
|
|
264
|
+
if (this.deviceStatus.version) {
|
|
265
|
+
const version = this.deviceStatus.version.toString();
|
|
242
266
|
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
243
267
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
244
268
|
this.accessory
|
|
@@ -247,20 +271,22 @@ export class Lock extends deviceBase {
|
|
|
247
271
|
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
248
272
|
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
249
273
|
.updateValue(deviceVersion);
|
|
250
|
-
this.accessory.context.
|
|
251
|
-
await this.debugSuccessLog(`
|
|
274
|
+
this.accessory.context.version = deviceVersion;
|
|
275
|
+
await this.debugSuccessLog(`version: ${this.accessory.context.version}`);
|
|
252
276
|
}
|
|
253
277
|
}
|
|
254
278
|
|
|
255
|
-
async parseStatusWebhook(
|
|
279
|
+
async parseStatusWebhook(): Promise<void> {
|
|
256
280
|
await this.debugLog('parseStatusWebhook');
|
|
257
|
-
await this.debugLog(`(lockState) = Webhook:(${
|
|
281
|
+
await this.debugLog(`(lockState) = Webhook:(${this.webhookContext.lockState}), current:(${this.LockMechanism.LockCurrentState})`);
|
|
282
|
+
|
|
258
283
|
// LockCurrentState
|
|
259
|
-
this.LockMechanism.LockCurrentState =
|
|
284
|
+
this.LockMechanism.LockCurrentState = this.webhookContext.lockState === 'LOCKED'
|
|
260
285
|
? this.hap.Characteristic.LockCurrentState.SECURED : this.hap.Characteristic.LockCurrentState.UNSECURED;
|
|
261
286
|
await this.debugLog(`LockCurrentState: ${this.LockMechanism.LockCurrentState}`);
|
|
287
|
+
|
|
262
288
|
// LockTargetState
|
|
263
|
-
this.LockMechanism.LockTargetState =
|
|
289
|
+
this.LockMechanism.LockTargetState = this.webhookContext.lockState === 'LOCKED'
|
|
264
290
|
? this.hap.Characteristic.LockTargetState.SECURED : this.hap.Characteristic.LockTargetState.UNSECURED;
|
|
265
291
|
await this.debugLog(`LockTargetState: ${this.LockMechanism.LockTargetState}`);
|
|
266
292
|
}
|
|
@@ -295,7 +321,8 @@ export class Lock extends deviceBase {
|
|
|
295
321
|
// Update HomeKit
|
|
296
322
|
if ((serviceData.model === SwitchBotBLEModel.Lock || SwitchBotBLEModel.LockPro)
|
|
297
323
|
&& (serviceData.modelName === SwitchBotBLEModelName.Lock || SwitchBotBLEModelName.LockPro)) {
|
|
298
|
-
|
|
324
|
+
this.serviceData = serviceData;
|
|
325
|
+
await this.BLEparseStatus();
|
|
299
326
|
await this.updateHomeKitCharacteristics();
|
|
300
327
|
} else {
|
|
301
328
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -313,7 +340,8 @@ export class Lock extends deviceBase {
|
|
|
313
340
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
314
341
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
315
342
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
316
|
-
|
|
343
|
+
this.deviceStatus = deviceStatus.body;
|
|
344
|
+
await this.openAPIparseStatus();
|
|
317
345
|
await this.updateHomeKitCharacteristics();
|
|
318
346
|
} else {
|
|
319
347
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -331,7 +359,8 @@ export class Lock extends deviceBase {
|
|
|
331
359
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: lockWebhookContext | lockProWebhookContext) => {
|
|
332
360
|
try {
|
|
333
361
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
334
|
-
|
|
362
|
+
this.webhookContext = context;
|
|
363
|
+
await this.parseStatusWebhook();
|
|
335
364
|
await this.updateHomeKitCharacteristics();
|
|
336
365
|
} catch (e: any) {
|
|
337
366
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
|
@@ -519,7 +548,7 @@ export class Lock extends deviceBase {
|
|
|
519
548
|
}
|
|
520
549
|
|
|
521
550
|
async BLERefreshConnection(switchbot: any): Promise<void> {
|
|
522
|
-
await this.errorLog(`wasn't able to establish BLE Connection, node-switchbot: ${
|
|
551
|
+
await this.errorLog(`wasn't able to establish BLE Connection, node-switchbot: ${switchbot}`);
|
|
523
552
|
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
524
553
|
await this.warnLog('Using OpenAPI Connection to Refresh Status');
|
|
525
554
|
await this.openAPIRefreshStatus();
|
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>;
|
|
@@ -47,6 +56,9 @@ export class Meter extends deviceBase {
|
|
|
47
56
|
device: device & devicesConfig,
|
|
48
57
|
) {
|
|
49
58
|
super(platform, accessory, device);
|
|
59
|
+
// Set category
|
|
60
|
+
accessory.category = this.hap.Categories.SENSOR;
|
|
61
|
+
|
|
50
62
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
51
63
|
this.doMeterUpdate = new Subject();
|
|
52
64
|
this.meterUpdateInProgress = false;
|
|
@@ -79,7 +91,7 @@ export class Meter extends deviceBase {
|
|
|
79
91
|
// Initialize Temperature Sensor Service
|
|
80
92
|
if (device.meter?.hide_temperature) {
|
|
81
93
|
if (this.TemperatureSensor) {
|
|
82
|
-
this.debugLog(
|
|
94
|
+
this.debugLog('Removing Temperature Sensor Service');
|
|
83
95
|
this.TemperatureSensor.Service = this.accessory.getService(this.hap.Service.TemperatureSensor) as Service;
|
|
84
96
|
accessory.removeService(this.TemperatureSensor.Service);
|
|
85
97
|
}
|
|
@@ -110,7 +122,7 @@ export class Meter extends deviceBase {
|
|
|
110
122
|
// Initialize Humidity Sensor Service
|
|
111
123
|
if (device.meter?.hide_humidity) {
|
|
112
124
|
if (this.HumiditySensor) {
|
|
113
|
-
this.debugLog(
|
|
125
|
+
this.debugLog('Removing Humidity Sensor Service');
|
|
114
126
|
this.HumiditySensor.Service = this.accessory.getService(this.hap.Service.HumiditySensor) as Service;
|
|
115
127
|
accessory.removeService(this.HumiditySensor.Service);
|
|
116
128
|
}
|
|
@@ -136,12 +148,11 @@ export class Meter extends deviceBase {
|
|
|
136
148
|
}
|
|
137
149
|
|
|
138
150
|
// Retrieve initial values and updateHomekit
|
|
151
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
139
152
|
this.refreshStatus();
|
|
140
153
|
|
|
141
|
-
// Retrieve initial values and update Homekit
|
|
142
|
-
this.updateHomeKitCharacteristics();
|
|
143
|
-
|
|
144
154
|
//regisiter webhook event handler
|
|
155
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
145
156
|
this.registerWebhook();
|
|
146
157
|
|
|
147
158
|
// Start an update interval
|
|
@@ -152,51 +163,65 @@ export class Meter extends deviceBase {
|
|
|
152
163
|
});
|
|
153
164
|
}
|
|
154
165
|
|
|
155
|
-
async BLEparseStatus(
|
|
166
|
+
async BLEparseStatus(): Promise<void> {
|
|
156
167
|
await this.debugLog('BLEparseStatus');
|
|
168
|
+
await this.debugLog(`(scale, temperature, humidity) = BLE:(${this.serviceData.fahrenheit}, ${this.serviceData.temperature.c},`
|
|
169
|
+
+ ` ${this.serviceData.humidity}), current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
170
|
+
|
|
157
171
|
// CurrentRelativeHumidity
|
|
158
172
|
if (!this.device.iosensor?.hide_humidity && this.HumiditySensor?.Service) {
|
|
159
|
-
this.HumiditySensor.CurrentRelativeHumidity = serviceData.humidity;
|
|
173
|
+
this.HumiditySensor.CurrentRelativeHumidity = this.serviceData.humidity;
|
|
160
174
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
|
|
161
175
|
}
|
|
176
|
+
|
|
162
177
|
// Current Temperature
|
|
163
178
|
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;
|
|
179
|
+
const CELSIUS = this.serviceData.temperature.c < 0 ? 0 : this.serviceData.temperature.c > 100 ? 100 : this.serviceData.temperature.c;
|
|
165
180
|
this.TemperatureSensor.CurrentTemperature = CELSIUS;
|
|
166
181
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
|
|
167
182
|
}
|
|
183
|
+
|
|
168
184
|
// BatteryLevel
|
|
169
|
-
this.Battery.BatteryLevel =
|
|
185
|
+
this.Battery.BatteryLevel = this.serviceData.battery;
|
|
170
186
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
187
|
+
|
|
171
188
|
// StatusLowBattery
|
|
172
189
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
173
190
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
174
191
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
175
192
|
}
|
|
176
193
|
|
|
177
|
-
async openAPIparseStatus(
|
|
194
|
+
async openAPIparseStatus(): Promise<void> {
|
|
178
195
|
await this.debugLog('openAPIparseStatus');
|
|
196
|
+
await this.debugLog(`(battery, temperature, humidity) = OpenAPI:(${this.deviceStatus.battery}, ${this.deviceStatus.temperature},`
|
|
197
|
+
+ ` ${this.deviceStatus.humidity}), current:(${this.Battery?.BatteryLevel}, ${this.TemperatureSensor?.CurrentTemperature},`
|
|
198
|
+
+ ` ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
199
|
+
|
|
179
200
|
// CurrentRelativeHumidity
|
|
180
201
|
if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
|
|
181
|
-
this.HumiditySensor.CurrentRelativeHumidity = deviceStatus.humidity;
|
|
202
|
+
this.HumiditySensor.CurrentRelativeHumidity = this.deviceStatus.humidity;
|
|
182
203
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
|
|
183
204
|
}
|
|
205
|
+
|
|
184
206
|
// CurrentTemperature
|
|
185
207
|
if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
186
|
-
this.TemperatureSensor.CurrentTemperature = deviceStatus.temperature;
|
|
208
|
+
this.TemperatureSensor.CurrentTemperature = this.deviceStatus.temperature;
|
|
187
209
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
|
|
188
210
|
}
|
|
211
|
+
|
|
189
212
|
// BatteryLevel
|
|
190
|
-
this.Battery.BatteryLevel =
|
|
213
|
+
this.Battery.BatteryLevel = this.deviceStatus.battery;
|
|
191
214
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
215
|
+
|
|
192
216
|
// StatusLowBattery
|
|
193
217
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
194
218
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
195
219
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
220
|
+
|
|
196
221
|
// FirmwareVersion
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
222
|
+
if (this.deviceStatus.version) {
|
|
223
|
+
const version = this.deviceStatus.version.toString();
|
|
224
|
+
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
200
225
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
201
226
|
this.accessory
|
|
202
227
|
.getService(this.hap.Service.AccessoryInformation)!
|
|
@@ -204,29 +229,32 @@ export class Meter extends deviceBase {
|
|
|
204
229
|
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
205
230
|
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
206
231
|
.updateValue(deviceVersion);
|
|
207
|
-
this.accessory.context.
|
|
208
|
-
await this.debugSuccessLog(`
|
|
232
|
+
this.accessory.context.version = deviceVersion;
|
|
233
|
+
await this.debugSuccessLog(`version: ${this.accessory.context.version}`);
|
|
209
234
|
}
|
|
210
235
|
}
|
|
211
236
|
|
|
212
|
-
async parseStatusWebhook(
|
|
237
|
+
async parseStatusWebhook(): Promise<void> {
|
|
213
238
|
await this.debugLog('parseStatusWebhook');
|
|
214
|
-
await this.debugLog(`(scale, temperature, humidity) = Webhook:(${
|
|
215
|
-
this.device.meter?.convertUnitTo)}, ${
|
|
216
|
-
+ ` ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
239
|
+
await this.debugLog(`(scale, temperature, humidity) = Webhook:(${this.webhookContext.scale}, ${convertUnits(this.webhookContext.temperature,
|
|
240
|
+
this.webhookContext.scale, this.device.meter?.convertUnitTo)}, ${this.webhookContext.humidity}),`
|
|
241
|
+
+ ` current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
217
242
|
// Check if the scale is not CELSIUS
|
|
218
|
-
if (
|
|
219
|
-
await this.warnLog(`received a non-CELSIUS Webhook scale: ${
|
|
243
|
+
if (this.webhookContext.scale !== 'CELSIUS' && this.device.hub?.convertUnitTo === undefined) {
|
|
244
|
+
await this.warnLog(`received a non-CELSIUS Webhook scale: ${this.webhookContext.scale}, Use the *convertUnitsTo* config under Hub settings,`
|
|
220
245
|
+ ' if displaying incorrectly in HomeKit.');
|
|
221
246
|
}
|
|
247
|
+
|
|
222
248
|
// CurrentRelativeHumidity
|
|
223
249
|
if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
|
|
224
|
-
this.HumiditySensor.CurrentRelativeHumidity =
|
|
250
|
+
this.HumiditySensor.CurrentRelativeHumidity = this.webhookContext.humidity;
|
|
225
251
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
|
|
226
252
|
}
|
|
253
|
+
|
|
227
254
|
// CurrentTemperature
|
|
228
255
|
if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
229
|
-
this.TemperatureSensor.CurrentTemperature = convertUnits(
|
|
256
|
+
this.TemperatureSensor.CurrentTemperature = convertUnits(this.webhookContext.temperature, this.webhookContext.scale,
|
|
257
|
+
this.device.hub?.convertUnitTo);
|
|
230
258
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
|
|
231
259
|
}
|
|
232
260
|
}
|
|
@@ -260,7 +288,8 @@ export class Meter extends deviceBase {
|
|
|
260
288
|
const serviceData = await this.monitorAdvertisementPackets(switchbot) as meterServiceData;
|
|
261
289
|
// Update HomeKit
|
|
262
290
|
if (serviceData.model === SwitchBotBLEModel.Meter && serviceData.modelName === SwitchBotBLEModelName.Meter) {
|
|
263
|
-
|
|
291
|
+
this.serviceData = serviceData;
|
|
292
|
+
await this.BLEparseStatus();
|
|
264
293
|
await this.updateHomeKitCharacteristics();
|
|
265
294
|
} else {
|
|
266
295
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -278,7 +307,8 @@ export class Meter extends deviceBase {
|
|
|
278
307
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
279
308
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
280
309
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
281
|
-
|
|
310
|
+
this.deviceStatus = deviceStatus.body;
|
|
311
|
+
await this.openAPIparseStatus();
|
|
282
312
|
await this.updateHomeKitCharacteristics();
|
|
283
313
|
} else {
|
|
284
314
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -296,7 +326,8 @@ export class Meter extends deviceBase {
|
|
|
296
326
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: meterWebhookContext) => {
|
|
297
327
|
try {
|
|
298
328
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
299
|
-
|
|
329
|
+
this.webhookContext = context;
|
|
330
|
+
await this.parseStatusWebhook();
|
|
300
331
|
await this.updateHomeKitCharacteristics();
|
|
301
332
|
} catch (e: any) {
|
|
302
333
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
|
@@ -330,7 +361,7 @@ export class Meter extends deviceBase {
|
|
|
330
361
|
}
|
|
331
362
|
|
|
332
363
|
async BLERefreshConnection(switchbot: any): Promise<void> {
|
|
333
|
-
await this.errorLog(`wasn't able to establish BLE Connection, node-switchbot: ${
|
|
364
|
+
await this.errorLog(`wasn't able to establish BLE Connection, node-switchbot: ${switchbot}`);
|
|
334
365
|
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
335
366
|
await this.warnLog('Using OpenAPI Connection to Refresh Status');
|
|
336
367
|
await this.openAPIRefreshStatus();
|
package/src/device/meterplus.ts
CHANGED
|
@@ -42,6 +42,15 @@ export class MeterPlus extends deviceBase {
|
|
|
42
42
|
CurrentTemperature: CharacteristicValue;
|
|
43
43
|
};
|
|
44
44
|
|
|
45
|
+
// OpenAPI
|
|
46
|
+
deviceStatus!: meterPlusStatus;
|
|
47
|
+
|
|
48
|
+
//Webhook
|
|
49
|
+
webhookContext!: meterPlusWebhookContext;
|
|
50
|
+
|
|
51
|
+
// BLE
|
|
52
|
+
serviceData!: meterPlusServiceData;
|
|
53
|
+
|
|
45
54
|
// Updates
|
|
46
55
|
meterUpdateInProgress!: boolean;
|
|
47
56
|
doMeterUpdate: Subject<void>;
|
|
@@ -52,6 +61,9 @@ export class MeterPlus extends deviceBase {
|
|
|
52
61
|
device: device & devicesConfig,
|
|
53
62
|
) {
|
|
54
63
|
super(platform, accessory, device);
|
|
64
|
+
// Set category
|
|
65
|
+
accessory.category = this.hap.Categories.SENSOR;
|
|
66
|
+
|
|
55
67
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
56
68
|
this.doMeterUpdate = new Subject();
|
|
57
69
|
this.meterUpdateInProgress = false;
|
|
@@ -84,7 +96,7 @@ export class MeterPlus extends deviceBase {
|
|
|
84
96
|
// Initialize Temperature Sensor Service
|
|
85
97
|
if (device.meter?.hide_temperature) {
|
|
86
98
|
if (this.TemperatureSensor) {
|
|
87
|
-
this.debugLog(
|
|
99
|
+
this.debugLog('Removing Temperature Sensor Service');
|
|
88
100
|
this.TemperatureSensor.Service = this.accessory.getService(this.hap.Service.TemperatureSensor) as Service;
|
|
89
101
|
accessory.removeService(this.TemperatureSensor.Service);
|
|
90
102
|
}
|
|
@@ -115,7 +127,7 @@ export class MeterPlus extends deviceBase {
|
|
|
115
127
|
// Initialize Humidity Sensor Service
|
|
116
128
|
if (device.meter?.hide_humidity) {
|
|
117
129
|
if (this.HumiditySensor) {
|
|
118
|
-
this.debugLog(
|
|
130
|
+
this.debugLog('Removing Humidity Sensor Service');
|
|
119
131
|
this.HumiditySensor.Service = this.accessory.getService(this.hap.Service.HumiditySensor) as Service;
|
|
120
132
|
accessory.removeService(this.HumiditySensor.Service);
|
|
121
133
|
}
|
|
@@ -141,12 +153,11 @@ export class MeterPlus extends deviceBase {
|
|
|
141
153
|
}
|
|
142
154
|
|
|
143
155
|
// Retrieve initial values and updateHomekit
|
|
156
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
144
157
|
this.refreshStatus();
|
|
145
158
|
|
|
146
|
-
// Retrieve initial values and updateHomekit
|
|
147
|
-
this.updateHomeKitCharacteristics();
|
|
148
|
-
|
|
149
159
|
//regisiter webhook event handler
|
|
160
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
150
161
|
this.registerWebhook();
|
|
151
162
|
|
|
152
163
|
// Start an update interval
|
|
@@ -157,21 +168,24 @@ export class MeterPlus extends deviceBase {
|
|
|
157
168
|
});
|
|
158
169
|
}
|
|
159
170
|
|
|
160
|
-
async BLEparseStatus(
|
|
171
|
+
async BLEparseStatus(): Promise<void> {
|
|
161
172
|
await this.debugLog('BLEparseStatus');
|
|
173
|
+
await this.debugLog(`(temperature, humidity) = BLE:(${this.serviceData.temperature.c}, ${this.serviceData.humidity}),`
|
|
174
|
+
+ ` current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
175
|
+
|
|
162
176
|
// CurrentRelativeHumidity
|
|
163
177
|
if (!this.device.iosensor?.hide_humidity && this.HumiditySensor?.Service) {
|
|
164
|
-
this.HumiditySensor.CurrentRelativeHumidity = serviceData.humidity;
|
|
178
|
+
this.HumiditySensor.CurrentRelativeHumidity = this.serviceData.humidity;
|
|
165
179
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
|
|
166
180
|
}
|
|
167
181
|
// Current Temperature
|
|
168
182
|
if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
169
|
-
const CELSIUS = serviceData.temperature.c < 0 ? 0 : serviceData.temperature.c > 100 ? 100 : serviceData.temperature.c;
|
|
183
|
+
const CELSIUS = this.serviceData.temperature.c < 0 ? 0 : this.serviceData.temperature.c > 100 ? 100 : this.serviceData.temperature.c;
|
|
170
184
|
this.TemperatureSensor.CurrentTemperature = CELSIUS;
|
|
171
185
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
|
|
172
186
|
}
|
|
173
187
|
// BatteryLevel
|
|
174
|
-
this.Battery.BatteryLevel =
|
|
188
|
+
this.Battery.BatteryLevel = this.serviceData.battery;
|
|
175
189
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
176
190
|
// StatusLowBattery
|
|
177
191
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
@@ -179,29 +193,36 @@ export class MeterPlus extends deviceBase {
|
|
|
179
193
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
180
194
|
}
|
|
181
195
|
|
|
182
|
-
async openAPIparseStatus(
|
|
196
|
+
async openAPIparseStatus(): Promise<void> {
|
|
183
197
|
await this.debugLog('openAPIparseStatus');
|
|
198
|
+
await this.debugLog(`(temperature, humidity) = OpenAPI:(${this.deviceStatus.temperature}, ${this.deviceStatus.humidity}),`
|
|
199
|
+
+ ` current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
200
|
+
|
|
184
201
|
// CurrentRelativeHumidity
|
|
185
202
|
if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
|
|
186
|
-
this.HumiditySensor.CurrentRelativeHumidity = deviceStatus.humidity;
|
|
203
|
+
this.HumiditySensor.CurrentRelativeHumidity = this.deviceStatus.humidity;
|
|
187
204
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
|
|
188
205
|
}
|
|
206
|
+
|
|
189
207
|
// CurrentTemperature
|
|
190
208
|
if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
191
|
-
this.TemperatureSensor.CurrentTemperature = deviceStatus.temperature;
|
|
209
|
+
this.TemperatureSensor.CurrentTemperature = this.deviceStatus.temperature;
|
|
192
210
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
|
|
193
211
|
}
|
|
212
|
+
|
|
194
213
|
// BatteryLevel
|
|
195
|
-
this.Battery.BatteryLevel =
|
|
214
|
+
this.Battery.BatteryLevel = this.deviceStatus.battery;
|
|
196
215
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
216
|
+
|
|
197
217
|
// StatusLowBattery
|
|
198
218
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
199
219
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
200
220
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
221
|
+
|
|
201
222
|
// FirmwareVersion
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
223
|
+
if (this.deviceStatus.version) {
|
|
224
|
+
const version = this.deviceStatus.version.toString();
|
|
225
|
+
this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
205
226
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
206
227
|
this.accessory
|
|
207
228
|
.getService(this.hap.Service.AccessoryInformation)!
|
|
@@ -209,29 +230,32 @@ export class MeterPlus extends deviceBase {
|
|
|
209
230
|
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
210
231
|
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
211
232
|
.updateValue(deviceVersion);
|
|
212
|
-
this.accessory.context.
|
|
213
|
-
this.debugSuccessLog(`
|
|
233
|
+
this.accessory.context.version = deviceVersion;
|
|
234
|
+
this.debugSuccessLog(`v: ${this.accessory.context.version}`);
|
|
214
235
|
}
|
|
215
236
|
}
|
|
216
237
|
|
|
217
|
-
async parseStatusWebhook(
|
|
238
|
+
async parseStatusWebhook(): Promise<void> {
|
|
218
239
|
await this.debugLog('parseStatusWebhook');
|
|
219
|
-
await this.debugLog(`(scale, temperature, humidity) = Webhook:(${
|
|
220
|
-
this.device.meter?.convertUnitTo)}, ${
|
|
221
|
-
+ ` ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
240
|
+
await this.debugLog(`(scale, temperature, humidity) = Webhook:(${this.webhookContext.scale}, ${convertUnits(this.webhookContext.temperature,
|
|
241
|
+
this.webhookContext.scale, this.device.meter?.convertUnitTo)}, ${this.webhookContext.humidity}),`
|
|
242
|
+
+ ` current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity})`);
|
|
222
243
|
// Check if the scale is not CELSIUS
|
|
223
|
-
if (
|
|
224
|
-
await this.warnLog(`received a non-CELSIUS Webhook scale: ${
|
|
244
|
+
if (this.webhookContext.scale !== 'CELSIUS' && this.device.hub?.convertUnitTo === undefined) {
|
|
245
|
+
await this.warnLog(`received a non-CELSIUS Webhook scale: ${this.webhookContext.scale}, Use the *convertUnitsTo* config under Hub settings,`
|
|
225
246
|
+ ' if displaying incorrectly in HomeKit.');
|
|
226
247
|
}
|
|
248
|
+
|
|
227
249
|
// CurrentRelativeHumidity
|
|
228
250
|
if (!this.device.meter?.hide_humidity && this.HumiditySensor?.Service) {
|
|
229
|
-
this.HumiditySensor.CurrentRelativeHumidity =
|
|
251
|
+
this.HumiditySensor.CurrentRelativeHumidity = this.webhookContext.humidity;
|
|
230
252
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
|
|
231
253
|
}
|
|
254
|
+
|
|
232
255
|
// CurrentTemperature
|
|
233
256
|
if (!this.device.meter?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
234
|
-
this.TemperatureSensor.CurrentTemperature = convertUnits(
|
|
257
|
+
this.TemperatureSensor.CurrentTemperature = convertUnits(this.webhookContext.temperature, this.webhookContext.scale,
|
|
258
|
+
this.device.hub?.convertUnitTo);
|
|
235
259
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
|
|
236
260
|
}
|
|
237
261
|
}
|
|
@@ -265,7 +289,8 @@ export class MeterPlus extends deviceBase {
|
|
|
265
289
|
const serviceData = await this.monitorAdvertisementPackets(switchbot) as meterPlusServiceData;
|
|
266
290
|
// Update HomeKit
|
|
267
291
|
if (serviceData.model === SwitchBotBLEModel.MeterPlus && serviceData.modelName === SwitchBotBLEModelName.MeterPlus) {
|
|
268
|
-
|
|
292
|
+
this.serviceData = serviceData;
|
|
293
|
+
await this.BLEparseStatus();
|
|
269
294
|
await this.updateHomeKitCharacteristics();
|
|
270
295
|
} else {
|
|
271
296
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -283,7 +308,8 @@ export class MeterPlus extends deviceBase {
|
|
|
283
308
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
284
309
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
285
310
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
286
|
-
|
|
311
|
+
this.deviceStatus = deviceStatus.body;
|
|
312
|
+
await this.openAPIparseStatus();
|
|
287
313
|
await this.updateHomeKitCharacteristics();
|
|
288
314
|
} else {
|
|
289
315
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -301,7 +327,8 @@ export class MeterPlus extends deviceBase {
|
|
|
301
327
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: meterPlusWebhookContext) => {
|
|
302
328
|
try {
|
|
303
329
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
304
|
-
|
|
330
|
+
this.webhookContext = context;
|
|
331
|
+
await this.parseStatusWebhook();
|
|
305
332
|
await this.updateHomeKitCharacteristics();
|
|
306
333
|
} catch (e: any) {
|
|
307
334
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
|
@@ -335,7 +362,7 @@ export class MeterPlus extends deviceBase {
|
|
|
335
362
|
}
|
|
336
363
|
|
|
337
364
|
async BLERefreshConnection(switchbot: any): Promise<void> {
|
|
338
|
-
await this.errorLog(`wasn't able to establish BLE Connection, node-switchbot: ${
|
|
365
|
+
await this.errorLog(`wasn't able to establish BLE Connection, node-switchbot: ${switchbot}`);
|
|
339
366
|
if (this.platform.config.credentials?.token && this.device.connectionType === 'BLE/OpenAPI') {
|
|
340
367
|
await this.warnLog('Using OpenAPI Connection to Refresh Status');
|
|
341
368
|
await this.openAPIRefreshStatus();
|