@switchbot/homebridge-switchbot 1.7.1-beta.0 → 1.7.1-beta.12
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 +12 -2
- package/config.schema.json +80 -36
- package/dist/devices/bots.d.ts +7 -5
- package/dist/devices/bots.d.ts.map +1 -1
- package/dist/devices/bots.js +72 -69
- package/dist/devices/bots.js.map +1 -1
- package/dist/devices/colorbulb.d.ts +9 -4
- package/dist/devices/colorbulb.d.ts.map +1 -1
- package/dist/devices/colorbulb.js +46 -36
- package/dist/devices/colorbulb.js.map +1 -1
- package/dist/devices/contact.d.ts +6 -3
- package/dist/devices/contact.d.ts.map +1 -1
- package/dist/devices/contact.js +59 -108
- package/dist/devices/contact.js.map +1 -1
- package/dist/devices/curtains.d.ts +11 -4
- package/dist/devices/curtains.d.ts.map +1 -1
- package/dist/devices/curtains.js +67 -44
- package/dist/devices/curtains.js.map +1 -1
- package/dist/devices/humidifiers.d.ts +8 -2
- package/dist/devices/humidifiers.d.ts.map +1 -1
- package/dist/devices/humidifiers.js +39 -36
- package/dist/devices/humidifiers.js.map +1 -1
- package/dist/devices/meters.d.ts +14 -12
- package/dist/devices/meters.d.ts.map +1 -1
- package/dist/devices/meters.js +63 -103
- package/dist/devices/meters.js.map +1 -1
- package/dist/devices/motion.d.ts +10 -3
- package/dist/devices/motion.d.ts.map +1 -1
- package/dist/devices/motion.js +114 -68
- package/dist/devices/motion.js.map +1 -1
- package/dist/devices/plugs.d.ts +3 -1
- package/dist/devices/plugs.d.ts.map +1 -1
- package/dist/devices/plugs.js +8 -1
- package/dist/devices/plugs.js.map +1 -1
- package/dist/irdevices/airconditioners.d.ts +1 -0
- package/dist/irdevices/airconditioners.d.ts.map +1 -1
- package/dist/irdevices/airconditioners.js +6 -0
- package/dist/irdevices/airconditioners.js.map +1 -1
- package/dist/irdevices/airpurifiers.d.ts +1 -0
- package/dist/irdevices/airpurifiers.d.ts.map +1 -1
- package/dist/irdevices/airpurifiers.js +6 -0
- package/dist/irdevices/airpurifiers.js.map +1 -1
- package/dist/irdevices/cameras.d.ts +1 -0
- package/dist/irdevices/cameras.d.ts.map +1 -1
- package/dist/irdevices/cameras.js +6 -0
- package/dist/irdevices/cameras.js.map +1 -1
- package/dist/irdevices/fans.d.ts +1 -0
- package/dist/irdevices/fans.d.ts.map +1 -1
- package/dist/irdevices/fans.js +6 -0
- package/dist/irdevices/fans.js.map +1 -1
- package/dist/irdevices/lights.d.ts +1 -0
- package/dist/irdevices/lights.d.ts.map +1 -1
- package/dist/irdevices/lights.js +6 -0
- package/dist/irdevices/lights.js.map +1 -1
- package/dist/irdevices/others.d.ts +1 -0
- package/dist/irdevices/others.d.ts.map +1 -1
- package/dist/irdevices/others.js +6 -0
- package/dist/irdevices/others.js.map +1 -1
- package/dist/irdevices/tvs.d.ts +1 -0
- package/dist/irdevices/tvs.d.ts.map +1 -1
- package/dist/irdevices/tvs.js +6 -0
- package/dist/irdevices/tvs.js.map +1 -1
- package/dist/irdevices/vacuumcleaners.d.ts +1 -0
- package/dist/irdevices/vacuumcleaners.d.ts.map +1 -1
- package/dist/irdevices/vacuumcleaners.js +6 -0
- package/dist/irdevices/vacuumcleaners.js.map +1 -1
- package/dist/irdevices/waterheaters.d.ts +1 -0
- package/dist/irdevices/waterheaters.d.ts.map +1 -1
- package/dist/irdevices/waterheaters.js +6 -0
- package/dist/irdevices/waterheaters.js.map +1 -1
- package/dist/platform.d.ts +2 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +14 -1
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +13 -1
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js.map +1 -1
- package/package.json +5 -5
- package/src/devices/bots.ts +74 -72
- package/src/devices/colorbulb.ts +52 -39
- package/src/devices/contact.ts +61 -113
- package/src/devices/curtains.ts +76 -48
- package/src/devices/humidifiers.ts +47 -37
- package/src/devices/meters.ts +79 -113
- package/src/devices/motion.ts +125 -74
- package/src/devices/plugs.ts +11 -2
- package/src/irdevices/airconditioners.ts +7 -0
- package/src/irdevices/airpurifiers.ts +7 -0
- package/src/irdevices/cameras.ts +7 -0
- package/src/irdevices/fans.ts +7 -0
- package/src/irdevices/lights.ts +7 -0
- package/src/irdevices/others.ts +7 -0
- package/src/irdevices/tvs.ts +7 -0
- package/src/irdevices/vacuumcleaners.ts +7 -0
- package/src/irdevices/waterheaters.ts +7 -0
- package/src/platform.ts +14 -1
- package/src/settings.ts +14 -1
|
@@ -3,7 +3,7 @@ import { interval, Subject } from 'rxjs';
|
|
|
3
3
|
import { SwitchBotPlatform } from '../platform';
|
|
4
4
|
import { debounceTime, skipWhile, take, tap } from 'rxjs/operators';
|
|
5
5
|
import { Service, PlatformAccessory, CharacteristicValue } from 'homebridge';
|
|
6
|
-
import { DeviceURL, device, devicesConfig, serviceData, ad, deviceStatusResponse, payload } from '../settings';
|
|
6
|
+
import { DeviceURL, device, devicesConfig, serviceData, ad, deviceStatusResponse, payload, deviceStatus } from '../settings';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Platform Accessory
|
|
@@ -25,6 +25,12 @@ export class Humidifier {
|
|
|
25
25
|
WaterLevel!: CharacteristicValue;
|
|
26
26
|
|
|
27
27
|
// OpenAPI
|
|
28
|
+
auto: deviceStatus['auto'];
|
|
29
|
+
power: deviceStatus['power'];
|
|
30
|
+
humidity: deviceStatus['humidity'];
|
|
31
|
+
lackWater: deviceStatus['lackWater'];
|
|
32
|
+
temperature: deviceStatus['temperature'];
|
|
33
|
+
nebulizationEfficiency: deviceStatus['nebulizationEfficiency'];
|
|
28
34
|
deviceStatus!: deviceStatusResponse;
|
|
29
35
|
|
|
30
36
|
// BLE Others
|
|
@@ -53,6 +59,7 @@ export class Humidifier {
|
|
|
53
59
|
this.logs();
|
|
54
60
|
this.scan();
|
|
55
61
|
this.refreshRate();
|
|
62
|
+
this.config(device);
|
|
56
63
|
this.CurrentRelativeHumidity = 0;
|
|
57
64
|
this.TargetHumidifierDehumidifierState = this.platform.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
58
65
|
this.CurrentHumidifierDehumidifierState = this.platform.Characteristic.CurrentHumidifierDehumidifierState.INACTIVE;
|
|
@@ -147,7 +154,7 @@ export class Humidifier {
|
|
|
147
154
|
minStep: 0.1,
|
|
148
155
|
})
|
|
149
156
|
.onGet(() => {
|
|
150
|
-
return
|
|
157
|
+
return this.CurrentTemperature;
|
|
151
158
|
});
|
|
152
159
|
} else {
|
|
153
160
|
this.debugLog(`Humidifier: ${accessory.displayName} Temperature Sensor Service Not Added`);
|
|
@@ -191,6 +198,22 @@ export class Humidifier {
|
|
|
191
198
|
});
|
|
192
199
|
}
|
|
193
200
|
|
|
201
|
+
config(device: device & devicesConfig) {
|
|
202
|
+
const config: any = device.humidifier;
|
|
203
|
+
if (device.humidifier !== undefined) {
|
|
204
|
+
if (device.ble !== undefined) {
|
|
205
|
+
config['ble'] = device.ble;
|
|
206
|
+
}
|
|
207
|
+
if (device.logging !== undefined) {
|
|
208
|
+
config['logging'] = device.logging;
|
|
209
|
+
}
|
|
210
|
+
if (device.refreshRate !== undefined) {
|
|
211
|
+
config['refreshRate'] = device.refreshRate;
|
|
212
|
+
}
|
|
213
|
+
this.warnLog(`Humidifier: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
194
217
|
refreshRate() {
|
|
195
218
|
if (this.device.refreshRate) {
|
|
196
219
|
this.deviceRefreshRate = this.accessory.context.refreshRate = this.device.refreshRate;
|
|
@@ -276,15 +299,15 @@ export class Humidifier {
|
|
|
276
299
|
if (this.platform.config.credentials?.openToken) {
|
|
277
300
|
this.debugLog(`Humidifier: ${this.accessory.displayName} OpenAPI parseStatus`);
|
|
278
301
|
// Current Relative Humidity
|
|
279
|
-
this.CurrentRelativeHumidity = this.
|
|
302
|
+
this.CurrentRelativeHumidity = this.humidity!;
|
|
280
303
|
this.debugLog(`Humidifier: ${this.accessory.displayName} CurrentRelativeHumidity: ${this.CurrentRelativeHumidity}`);
|
|
281
304
|
// Current Temperature
|
|
282
305
|
if (!this.device.humidifier?.hide_temperature) {
|
|
283
|
-
this.CurrentTemperature =
|
|
306
|
+
this.CurrentTemperature = this.temperature!;
|
|
284
307
|
this.debugLog(`Humidifier: ${this.accessory.displayName} CurrentTemperature: ${this.CurrentTemperature}`);
|
|
285
308
|
}
|
|
286
309
|
// Target Humidifier Dehumidifier State
|
|
287
|
-
switch (this.
|
|
310
|
+
switch (this.auto) {
|
|
288
311
|
case true:
|
|
289
312
|
this.TargetHumidifierDehumidifierState = this.platform.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER;
|
|
290
313
|
this.CurrentHumidifierDehumidifierState = this.platform.Characteristic.CurrentHumidifierDehumidifierState.HUMIDIFYING;
|
|
@@ -292,10 +315,10 @@ export class Humidifier {
|
|
|
292
315
|
break;
|
|
293
316
|
default:
|
|
294
317
|
this.TargetHumidifierDehumidifierState = this.platform.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
295
|
-
if (this.
|
|
318
|
+
if (this.nebulizationEfficiency! > 100) {
|
|
296
319
|
this.RelativeHumidityHumidifierThreshold = 100;
|
|
297
320
|
} else {
|
|
298
|
-
this.RelativeHumidityHumidifierThreshold = this.
|
|
321
|
+
this.RelativeHumidityHumidifierThreshold = this.nebulizationEfficiency!;
|
|
299
322
|
}
|
|
300
323
|
if (this.CurrentRelativeHumidity > this.RelativeHumidityHumidifierThreshold) {
|
|
301
324
|
this.CurrentHumidifierDehumidifierState = this.platform.Characteristic.CurrentHumidifierDehumidifierState.IDLE;
|
|
@@ -310,7 +333,7 @@ export class Humidifier {
|
|
|
310
333
|
+ ` RelativeHumidityHumidifierThreshold: ${this.RelativeHumidityHumidifierThreshold}`);
|
|
311
334
|
this.debugLog(`Humidifier: ${this.accessory.displayName} CurrentHumidifierDehumidifierState: ${this.CurrentHumidifierDehumidifierState}`);
|
|
312
335
|
// Active
|
|
313
|
-
switch (this.
|
|
336
|
+
switch (this.power) {
|
|
314
337
|
case 'on':
|
|
315
338
|
this.Active = this.platform.Characteristic.Active.ACTIVE;
|
|
316
339
|
break;
|
|
@@ -319,7 +342,7 @@ export class Humidifier {
|
|
|
319
342
|
}
|
|
320
343
|
this.debugLog(`Humidifier: ${this.accessory.displayName} Active: ${this.Active}`);
|
|
321
344
|
// Water Level
|
|
322
|
-
if (this.
|
|
345
|
+
if (this.lackWater) {
|
|
323
346
|
this.WaterLevel = 0;
|
|
324
347
|
} else {
|
|
325
348
|
this.WaterLevel = 100;
|
|
@@ -339,34 +362,12 @@ export class Humidifier {
|
|
|
339
362
|
}
|
|
340
363
|
}
|
|
341
364
|
|
|
342
|
-
public async connectBLE() {
|
|
343
|
-
let switchbot: any;
|
|
344
|
-
try {
|
|
345
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
346
|
-
const Switchbot = require('node-switchbot');
|
|
347
|
-
switchbot = new Switchbot();
|
|
348
|
-
// Convert to BLE Address
|
|
349
|
-
this.device.bleMac = ((this.device.deviceId!.match(/.{1,2}/g))!.join(':')).toLowerCase();
|
|
350
|
-
this.debugLog(`Humidifier: ${this.accessory.displayName} BLE Address: ${this.device.bleMac}`);
|
|
351
|
-
} catch (e: any) {
|
|
352
|
-
switchbot = false;
|
|
353
|
-
this.errorLog(`Humidifier: ${this.accessory.displayName} 'node-switchbot' found: ${switchbot}`);
|
|
354
|
-
if (this.deviceLogging === 'debug') {
|
|
355
|
-
this.errorLog(`Humidifier: ${this.accessory.displayName} 'node-switchbot' found: ${switchbot},`
|
|
356
|
-
+ ` Error Message: ${JSON.stringify(e.message)}`);
|
|
357
|
-
}
|
|
358
|
-
if (this.platform.debugMode) {
|
|
359
|
-
this.errorLog(`Humidifier: ${this.accessory.displayName} 'node-switchbot' found: ${switchbot},`
|
|
360
|
-
+ ` Error: ${JSON.stringify(e)}`);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
return switchbot;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
365
|
private async BLERefreshStatus() {
|
|
367
366
|
this.debugLog(`Humidifier: ${this.accessory.displayName} BLE refreshStatus`);
|
|
368
|
-
|
|
369
|
-
|
|
367
|
+
const switchbot = await this.platform.connectBLE();
|
|
368
|
+
// Convert to BLE Address
|
|
369
|
+
this.device.bleMac = ((this.device.deviceId!.match(/.{1,2}/g))!.join(':')).toLowerCase();
|
|
370
|
+
this.debugLog(`Curtain: ${this.accessory.displayName} BLE Address: ${this.device.bleMac}`);
|
|
370
371
|
// Start to monitor advertisement packets
|
|
371
372
|
if (switchbot !== false) {
|
|
372
373
|
switchbot.startScan({
|
|
@@ -438,10 +439,16 @@ export class Humidifier {
|
|
|
438
439
|
this.deviceStatus = (await this.platform.axios.get(`${DeviceURL}/${this.device.deviceId}/status`)).data;
|
|
439
440
|
if (this.deviceStatus.message === 'success') {
|
|
440
441
|
this.debugLog(`Humidifier: ${this.accessory.displayName} refreshStatus: ${JSON.stringify(this.deviceStatus)}`);
|
|
442
|
+
this.auto = this.deviceStatus.body.auto;
|
|
443
|
+
this.power = this.deviceStatus.body.power;
|
|
444
|
+
this.lackWater = this.deviceStatus.body.lackWater;
|
|
445
|
+
this.humidity = this.deviceStatus.body.humidity;
|
|
446
|
+
this.temperature = this.deviceStatus.body.temperature;
|
|
447
|
+
this.nebulizationEfficiency = this.deviceStatus.body.nebulizationEfficiency;
|
|
441
448
|
this.parseStatus();
|
|
442
449
|
this.updateHomeKitCharacteristics();
|
|
443
450
|
} else {
|
|
444
|
-
this.
|
|
451
|
+
this.errorLog(`Humidifier: ${this.accessory.displayName} message: ${JSON.stringify(this.deviceStatus.message)}`);
|
|
445
452
|
}
|
|
446
453
|
} catch (e: any) {
|
|
447
454
|
this.errorLog(`Humidifier: ${this.accessory.displayName} failed refreshStatus with OpenAPI Connection`);
|
|
@@ -477,7 +484,10 @@ export class Humidifier {
|
|
|
477
484
|
|
|
478
485
|
private async BLEpushChanges() {
|
|
479
486
|
this.debugLog(`Humidifier: ${this.accessory.displayName} BLE pushChanges`);
|
|
480
|
-
const switchbot = await this.connectBLE();
|
|
487
|
+
const switchbot = await this.platform.connectBLE();
|
|
488
|
+
// Convert to BLE Address
|
|
489
|
+
this.device.bleMac = ((this.device.deviceId!.match(/.{1,2}/g))!.join(':')).toLowerCase();
|
|
490
|
+
this.debugLog(`Curtain: ${this.accessory.displayName} BLE Address: ${this.device.bleMac}`);
|
|
481
491
|
if (switchbot !== false) {
|
|
482
492
|
switchbot.discover({ model: 'e', quick: true, id: this.device.bleMac }).then((device_list) => {
|
|
483
493
|
this.infoLog(`${this.accessory.displayName} Target Position: ${this.Active}`);
|
package/src/devices/meters.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { interval, Subject } from 'rxjs';
|
|
|
2
2
|
import { skipWhile } from 'rxjs/operators';
|
|
3
3
|
import { SwitchBotPlatform } from '../platform';
|
|
4
4
|
import { Service, PlatformAccessory, Units, CharacteristicValue } from 'homebridge';
|
|
5
|
-
import { DeviceURL, device, devicesConfig, serviceData, ad, switchbot, deviceStatusResponse, temperature } from '../settings';
|
|
5
|
+
import { DeviceURL, device, devicesConfig, serviceData, ad, switchbot, deviceStatusResponse, temperature, deviceStatus } from '../settings';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Platform Accessory
|
|
@@ -11,28 +11,30 @@ import { DeviceURL, device, devicesConfig, serviceData, ad, switchbot, deviceSta
|
|
|
11
11
|
*/
|
|
12
12
|
export class Meter {
|
|
13
13
|
// Services
|
|
14
|
-
private
|
|
15
|
-
temperatureservice?: Service;
|
|
16
|
-
humidityservice?: Service;
|
|
14
|
+
private batteryService?: Service;
|
|
15
|
+
private temperatureservice?: Service;
|
|
16
|
+
private humidityservice?: Service;
|
|
17
17
|
|
|
18
18
|
// Characteristic Values
|
|
19
19
|
CurrentRelativeHumidity!: CharacteristicValue;
|
|
20
20
|
CurrentRelativeHumidityCached!: CharacteristicValue;
|
|
21
|
-
CurrentTemperature
|
|
22
|
-
CurrentTemperatureCached
|
|
23
|
-
BatteryLevel
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
StatusLowBattery!: CharacteristicValue;
|
|
21
|
+
CurrentTemperature?: CharacteristicValue;
|
|
22
|
+
CurrentTemperatureCached?: CharacteristicValue;
|
|
23
|
+
BatteryLevel?: CharacteristicValue;
|
|
24
|
+
ChargingState?: CharacteristicValue;
|
|
25
|
+
StatusLowBattery?: CharacteristicValue;
|
|
27
26
|
Active!: CharacteristicValue;
|
|
28
27
|
WaterLevel!: CharacteristicValue;
|
|
29
28
|
|
|
30
29
|
// OpenAPI Others
|
|
30
|
+
Temperature: deviceStatus['temperature'];
|
|
31
|
+
Humidity: deviceStatus['humidity'];
|
|
31
32
|
deviceStatus!: deviceStatusResponse;
|
|
32
33
|
|
|
33
34
|
// BLE Others
|
|
34
35
|
connected?: boolean;
|
|
35
36
|
switchbot!: switchbot;
|
|
37
|
+
SwitchToOpenAPI?: boolean;
|
|
36
38
|
serviceData!: serviceData;
|
|
37
39
|
temperature!: temperature['c'];
|
|
38
40
|
battery!: serviceData['battery'];
|
|
@@ -56,17 +58,7 @@ export class Meter {
|
|
|
56
58
|
this.logs();
|
|
57
59
|
this.scan();
|
|
58
60
|
this.refreshRate();
|
|
59
|
-
|
|
60
|
-
this.BatteryLevel = 100;
|
|
61
|
-
} else {
|
|
62
|
-
this.BatteryLevel = this.accessory.context.BatteryLevel;
|
|
63
|
-
}
|
|
64
|
-
if (this.BatteryLevel < 15) {
|
|
65
|
-
this.StatusLowBattery = this.platform.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
66
|
-
} else {
|
|
67
|
-
this.StatusLowBattery = this.platform.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
68
|
-
}
|
|
69
|
-
this.ChargingState = this.platform.Characteristic.ChargingState.NOT_CHARGEABLE;
|
|
61
|
+
this.config(device);
|
|
70
62
|
if (this.CurrentRelativeHumidity === undefined) {
|
|
71
63
|
this.CurrentRelativeHumidity = 0;
|
|
72
64
|
} else {
|
|
@@ -96,26 +88,6 @@ export class Meter {
|
|
|
96
88
|
.setCharacteristic(this.platform.Characteristic.Model, 'SWITCHBOT-METERTH-S1')
|
|
97
89
|
.setCharacteristic(this.platform.Characteristic.SerialNumber, device.deviceId!);
|
|
98
90
|
|
|
99
|
-
// get the Battery service if it exists, otherwise create a new Battery service
|
|
100
|
-
// you can create multiple services for each accessory
|
|
101
|
-
(this.service =
|
|
102
|
-
accessory.getService(this.platform.Service.Battery) ||
|
|
103
|
-
accessory.addService(this.platform.Service.Battery)), `${accessory.displayName} Battery`;
|
|
104
|
-
|
|
105
|
-
// To avoid "Cannot add a Service with the same UUID another Service without also defining a unique 'subtype' property." error,
|
|
106
|
-
// when creating multiple services of the same type, you need to use the following syntax to specify a name and subtype id:
|
|
107
|
-
// accessory.getService('NAME') ?? accessory.addService(this.platform.Service.Battery, 'NAME', 'USER_DEFINED_SUBTYPE');
|
|
108
|
-
|
|
109
|
-
// set the service name, this is what is displayed as the default name on the Home app
|
|
110
|
-
// in this example we are using the name we stored in the `accessory.context` in the `discoverDevices` method.
|
|
111
|
-
this.service.setCharacteristic(this.platform.Characteristic.Name, accessory.displayName);
|
|
112
|
-
|
|
113
|
-
// each service must implement at-minimum the "required characteristics" for the given service type
|
|
114
|
-
// see https://developers.homebridge.io/#/service/Battery
|
|
115
|
-
|
|
116
|
-
// create handlers for required characteristics
|
|
117
|
-
this.service.setCharacteristic(this.platform.Characteristic.ChargingState, 2);
|
|
118
|
-
|
|
119
91
|
// Temperature Sensor Service
|
|
120
92
|
if (device.meter?.hide_temperature) {
|
|
121
93
|
this.debugLog(`Meter: ${accessory.displayName} Removing Temperature Sensor Service`);
|
|
@@ -127,7 +99,7 @@ export class Meter {
|
|
|
127
99
|
this.accessory.getService(this.platform.Service.TemperatureSensor) ||
|
|
128
100
|
this.accessory.addService(this.platform.Service.TemperatureSensor)), `${accessory.displayName} Temperature Sensor`;
|
|
129
101
|
|
|
130
|
-
this.
|
|
102
|
+
this.temperatureservice.setCharacteristic(this.platform.Characteristic.Name, `${accessory.displayName} Temperature Sensor`);
|
|
131
103
|
|
|
132
104
|
this.temperatureservice
|
|
133
105
|
.getCharacteristic(this.platform.Characteristic.CurrentTemperature)
|
|
@@ -139,7 +111,7 @@ export class Meter {
|
|
|
139
111
|
minStep: 0.1,
|
|
140
112
|
})
|
|
141
113
|
.onGet(() => {
|
|
142
|
-
return this.CurrentTemperature
|
|
114
|
+
return this.CurrentTemperature!;
|
|
143
115
|
});
|
|
144
116
|
} else {
|
|
145
117
|
this.debugLog(`Meter: ${accessory.displayName} Temperature Sensor Service Not Added`);
|
|
@@ -156,7 +128,7 @@ export class Meter {
|
|
|
156
128
|
this.accessory.getService(this.platform.Service.HumiditySensor) ||
|
|
157
129
|
this.accessory.addService(this.platform.Service.HumiditySensor)), `${accessory.displayName} Humidity Sensor`;
|
|
158
130
|
|
|
159
|
-
this.
|
|
131
|
+
this.humidityservice.setCharacteristic(this.platform.Characteristic.Name, `${accessory.displayName} Humidity Sensor`);
|
|
160
132
|
|
|
161
133
|
this.humidityservice
|
|
162
134
|
.getCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity)
|
|
@@ -170,6 +142,27 @@ export class Meter {
|
|
|
170
142
|
this.debugLog(`Meter: ${accessory.displayName} Humidity Sensor Service Not Added`);
|
|
171
143
|
}
|
|
172
144
|
|
|
145
|
+
// Battery Service
|
|
146
|
+
if (!device.ble) {
|
|
147
|
+
this.debugLog(`Meter: ${accessory.displayName} Removing Battery Service`);
|
|
148
|
+
this.batteryService = this.accessory.getService(this.platform.Service.Battery);
|
|
149
|
+
accessory.removeService(this.batteryService!);
|
|
150
|
+
} else if (device.ble && !this.batteryService) {
|
|
151
|
+
this.debugLog(`Meter: ${accessory.displayName} Add Battery Service`);
|
|
152
|
+
(this.batteryService =
|
|
153
|
+
this.accessory.getService(this.platform.Service.Battery) ||
|
|
154
|
+
this.accessory.addService(this.platform.Service.Battery)), `${accessory.displayName} Battery`;
|
|
155
|
+
|
|
156
|
+
this.batteryService.setCharacteristic(this.platform.Characteristic.Name, `${accessory.displayName} Battery`);
|
|
157
|
+
|
|
158
|
+
this.batteryService.setCharacteristic(this.platform.Characteristic.ChargingState, this.platform.Characteristic.ChargingState.NOT_CHARGEABLE);
|
|
159
|
+
|
|
160
|
+
} else {
|
|
161
|
+
this.debugLog(`Meter: ${accessory.displayName} Battery Service Not Added`);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
173
166
|
// Retrieve initial values and updateHomekit
|
|
174
167
|
this.updateHomeKitCharacteristics();
|
|
175
168
|
|
|
@@ -181,6 +174,12 @@ export class Meter {
|
|
|
181
174
|
});
|
|
182
175
|
}
|
|
183
176
|
|
|
177
|
+
config(device: device & devicesConfig) {
|
|
178
|
+
if (device.meter !== undefined || device.ble !== undefined) {
|
|
179
|
+
this.warnLog(`Meter: ${this.accessory.displayName} Config: ${JSON.stringify(device.meter)}, BLE: ${device.ble}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
184
183
|
refreshRate() {
|
|
185
184
|
if (this.device.refreshRate) {
|
|
186
185
|
this.deviceRefreshRate = this.accessory.context.refreshRate = this.device.refreshRate;
|
|
@@ -232,10 +231,10 @@ export class Meter {
|
|
|
232
231
|
* Parse the device status from the SwitchBot api
|
|
233
232
|
*/
|
|
234
233
|
async parseStatus() {
|
|
235
|
-
if (this.device.ble) {
|
|
236
|
-
await this.BLEparseStatus();
|
|
237
|
-
} else {
|
|
234
|
+
if (this.SwitchToOpenAPI || !this.device.ble) {
|
|
238
235
|
await this.openAPIparseStatus();
|
|
236
|
+
} else {
|
|
237
|
+
await this.BLEparseStatus();
|
|
239
238
|
}
|
|
240
239
|
}
|
|
241
240
|
|
|
@@ -251,9 +250,9 @@ export class Meter {
|
|
|
251
250
|
}
|
|
252
251
|
this.debugLog(`${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}, StatusLowBattery: ${this.StatusLowBattery}`);
|
|
253
252
|
|
|
253
|
+
// Humidity
|
|
254
254
|
if (!this.device.meter?.hide_humidity) {
|
|
255
|
-
|
|
256
|
-
this.CurrentRelativeHumidity = Number(this.humidity);
|
|
255
|
+
this.CurrentRelativeHumidity = this.humidity!;
|
|
257
256
|
this.debugLog(`Meter: ${this.accessory.displayName} Humidity: ${this.CurrentRelativeHumidity}%`);
|
|
258
257
|
}
|
|
259
258
|
|
|
@@ -266,27 +265,20 @@ export class Meter {
|
|
|
266
265
|
}
|
|
267
266
|
|
|
268
267
|
private async openAPIparseStatus() {
|
|
268
|
+
if (this.device.ble) {
|
|
269
|
+
this.SwitchToOpenAPI = false;
|
|
270
|
+
}
|
|
269
271
|
if (this.platform.config.credentials?.openToken) {
|
|
270
272
|
this.debugLog(`Meter: ${this.accessory.displayName} OpenAPI parseStatus`);
|
|
271
|
-
if (this.deviceStatus.body) {
|
|
272
|
-
this.BatteryLevel = 100;
|
|
273
|
-
} else {
|
|
274
|
-
this.BatteryLevel = 10;
|
|
275
|
-
}
|
|
276
|
-
if (this.BatteryLevel < 15) {
|
|
277
|
-
this.StatusLowBattery = this.platform.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
278
|
-
} else {
|
|
279
|
-
this.StatusLowBattery = this.platform.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
280
|
-
}
|
|
281
273
|
// Current Relative Humidity
|
|
282
274
|
if (!this.device.meter?.hide_humidity) {
|
|
283
|
-
this.CurrentRelativeHumidity = this.
|
|
275
|
+
this.CurrentRelativeHumidity = this.Humidity!;
|
|
284
276
|
this.debugLog(`Meter: ${this.accessory.displayName} Humidity: ${this.CurrentRelativeHumidity}%`);
|
|
285
277
|
}
|
|
286
278
|
|
|
287
279
|
// Current Temperature
|
|
288
280
|
if (!this.device.meter?.hide_temperature) {
|
|
289
|
-
this.CurrentTemperature =
|
|
281
|
+
this.CurrentTemperature = this.Temperature!;
|
|
290
282
|
this.debugLog(`Meter: ${this.accessory.displayName} Temperature: ${this.CurrentTemperature}°c`);
|
|
291
283
|
}
|
|
292
284
|
}
|
|
@@ -303,34 +295,12 @@ export class Meter {
|
|
|
303
295
|
}
|
|
304
296
|
}
|
|
305
297
|
|
|
306
|
-
private async connectBLE() {
|
|
307
|
-
let switchbot: any;
|
|
308
|
-
try {
|
|
309
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
310
|
-
const Switchbot = require('node-switchbot');
|
|
311
|
-
switchbot = new Switchbot();
|
|
312
|
-
// Convert to BLE Address
|
|
313
|
-
this.device.bleMac = ((this.device.deviceId!.match(/.{1,2}/g))!.join(':')).toLowerCase();
|
|
314
|
-
this.debugLog(`Meter: ${this.accessory.displayName} BLE Address: ${this.device.bleMac}`);
|
|
315
|
-
} catch (e: any) {
|
|
316
|
-
switchbot = false;
|
|
317
|
-
this.errorLog(`Meter: ${this.accessory.displayName} 'node-switchbot' found: ${switchbot}`);
|
|
318
|
-
if (this.deviceLogging === 'debug') {
|
|
319
|
-
this.errorLog(`Meter: ${this.accessory.displayName} 'node-switchbot' found: ${switchbot},`
|
|
320
|
-
+ ` Error Message: ${JSON.stringify(e.message)}`);
|
|
321
|
-
}
|
|
322
|
-
if (this.platform.debugMode) {
|
|
323
|
-
this.errorLog(`Meter: ${this.accessory.displayName} 'node-switchbot' found: ${switchbot},`
|
|
324
|
-
+ ` Error: ${JSON.stringify(e)}`);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
return switchbot;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
298
|
private async BLErefreshStatus() {
|
|
331
299
|
this.debugLog(`Meter: ${this.accessory.displayName} BLE RefreshStatus`);
|
|
332
|
-
|
|
333
|
-
|
|
300
|
+
const switchbot = await this.platform.connectBLE();
|
|
301
|
+
// Convert to BLE Address
|
|
302
|
+
this.device.bleMac = ((this.device.deviceId!.match(/.{1,2}/g))!.join(':')).toLowerCase();
|
|
303
|
+
this.debugLog(`Curtain: ${this.accessory.displayName} BLE Address: ${this.device.bleMac}`);
|
|
334
304
|
// Start to monitor advertisement packets
|
|
335
305
|
if (switchbot !== false) {
|
|
336
306
|
switchbot.startScan({
|
|
@@ -362,12 +332,6 @@ export class Meter {
|
|
|
362
332
|
// Stop to monitor
|
|
363
333
|
switchbot.stopScan();
|
|
364
334
|
if (this.connected) {
|
|
365
|
-
this.CurrentTemperatureCached = this.temperature;
|
|
366
|
-
this.accessory.context.CurrentTemperature = this.CurrentTemperatureCached;
|
|
367
|
-
this.CurrentRelativeHumidityCached = this.humidity!;
|
|
368
|
-
this.accessory.context.CurrentRelativeHumidity = this.CurrentRelativeHumidityCached;
|
|
369
|
-
this.BatteryLevelCached = this.battery!;
|
|
370
|
-
this.accessory.context.BatteryLevel = this.BatteryLevelCached;
|
|
371
335
|
this.parseStatus();
|
|
372
336
|
this.updateHomeKitCharacteristics();
|
|
373
337
|
} else {
|
|
@@ -385,6 +349,7 @@ export class Meter {
|
|
|
385
349
|
}
|
|
386
350
|
if (this.platform.config.credentials?.openToken) {
|
|
387
351
|
this.warnLog(`Meter: ${this.accessory.displayName} Using OpenAPI Connection`);
|
|
352
|
+
this.SwitchToOpenAPI = true;
|
|
388
353
|
this.openAPIRefreshStatus();
|
|
389
354
|
}
|
|
390
355
|
this.apiError(e);
|
|
@@ -398,6 +363,7 @@ export class Meter {
|
|
|
398
363
|
this.errorLog(`Meter: ${this.accessory.displayName} wasn't able to establish BLE Connection, node-switchbot: ${switchbot}`);
|
|
399
364
|
if (this.platform.config.credentials?.openToken) {
|
|
400
365
|
this.warnLog(`Meter: ${this.accessory.displayName} Using OpenAPI Connection`);
|
|
366
|
+
this.SwitchToOpenAPI = true;
|
|
401
367
|
await this.openAPIRefreshStatus();
|
|
402
368
|
}
|
|
403
369
|
}
|
|
@@ -408,12 +374,8 @@ export class Meter {
|
|
|
408
374
|
try {
|
|
409
375
|
this.deviceStatus = (await this.platform.axios.get(`${DeviceURL}/${this.device.deviceId}/status`)).data;
|
|
410
376
|
this.debugLog(`Meter: ${this.accessory.displayName} openAPIRefreshStatus: ${JSON.stringify(this.deviceStatus)}`);
|
|
411
|
-
this.
|
|
412
|
-
this.
|
|
413
|
-
this.CurrentRelativeHumidityCached = this.deviceStatus.body.humidity!;
|
|
414
|
-
this.accessory.context.CurrentRelativeHumidity = this.CurrentRelativeHumidityCached;
|
|
415
|
-
this.BatteryLevelCached = 100;
|
|
416
|
-
this.accessory.context.BatteryLevel = this.BatteryLevelCached;
|
|
377
|
+
this.Humidity = this.deviceStatus.body.humidity!;
|
|
378
|
+
this.Temperature = this.deviceStatus.body.temperature!;
|
|
417
379
|
this.parseStatus();
|
|
418
380
|
this.updateHomeKitCharacteristics();
|
|
419
381
|
} catch (e: any) {
|
|
@@ -435,18 +397,6 @@ export class Meter {
|
|
|
435
397
|
* Updates the status for each of the HomeKit Characteristics
|
|
436
398
|
*/
|
|
437
399
|
updateHomeKitCharacteristics() {
|
|
438
|
-
if (this.StatusLowBattery === undefined) {
|
|
439
|
-
this.debugLog(`Meter: ${this.accessory.displayName} StatusLowBattery: ${this.StatusLowBattery}`);
|
|
440
|
-
} else {
|
|
441
|
-
this.service.updateCharacteristic(this.platform.Characteristic.StatusLowBattery, this.StatusLowBattery);
|
|
442
|
-
this.debugLog(`Meter: ${this.accessory.displayName} updateCharacteristic StatusLowBattery: ${this.StatusLowBattery}`);
|
|
443
|
-
}
|
|
444
|
-
if (this.BatteryLevel === undefined) {
|
|
445
|
-
this.debugLog(`Meter: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}`);
|
|
446
|
-
} else {
|
|
447
|
-
this.service.updateCharacteristic(this.platform.Characteristic.BatteryLevel, this.BatteryLevel);
|
|
448
|
-
this.debugLog(`Meter: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.BatteryLevel}`);
|
|
449
|
-
}
|
|
450
400
|
if (!this.device.meter?.hide_humidity) {
|
|
451
401
|
if (this.CurrentRelativeHumidity === undefined) {
|
|
452
402
|
this.debugLog(`Meter: ${this.accessory.displayName} CurrentRelativeHumidity: ${this.CurrentRelativeHumidity}`);
|
|
@@ -463,17 +413,33 @@ export class Meter {
|
|
|
463
413
|
this.debugLog(`Meter: ${this.accessory.displayName} updateCharacteristic CurrentTemperature: ${this.CurrentTemperature}`);
|
|
464
414
|
}
|
|
465
415
|
}
|
|
416
|
+
if (this.device.ble) {
|
|
417
|
+
if (this.BatteryLevel === undefined) {
|
|
418
|
+
this.debugLog(`Bot: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}`);
|
|
419
|
+
} else {
|
|
420
|
+
this.batteryService?.updateCharacteristic(this.platform.Characteristic.BatteryLevel, this.BatteryLevel);
|
|
421
|
+
this.debugLog(`Bot: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.BatteryLevel}`);
|
|
422
|
+
}
|
|
423
|
+
if (this.StatusLowBattery === undefined) {
|
|
424
|
+
this.debugLog(`Bot: ${this.accessory.displayName} StatusLowBattery: ${this.StatusLowBattery}`);
|
|
425
|
+
} else {
|
|
426
|
+
this.batteryService?.updateCharacteristic(this.platform.Characteristic.StatusLowBattery, this.StatusLowBattery);
|
|
427
|
+
this.debugLog(`Bot: ${this.accessory.displayName} updateCharacteristic StatusLowBattery: ${this.StatusLowBattery}`);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
466
430
|
}
|
|
467
431
|
|
|
468
432
|
public apiError(e: any) {
|
|
469
|
-
this.service.updateCharacteristic(this.platform.Characteristic.StatusLowBattery, e);
|
|
470
|
-
this.service.updateCharacteristic(this.platform.Characteristic.BatteryLevel, e);
|
|
471
433
|
if (!this.device.meter?.hide_humidity) {
|
|
472
434
|
this.humidityservice?.updateCharacteristic(this.platform.Characteristic.CurrentRelativeHumidity, e);
|
|
473
435
|
}
|
|
474
436
|
if (!this.device.meter?.hide_temperature) {
|
|
475
437
|
this.temperatureservice?.updateCharacteristic(this.platform.Characteristic.CurrentTemperature, e);
|
|
476
438
|
}
|
|
439
|
+
if (this.device.ble) {
|
|
440
|
+
this.batteryService?.updateCharacteristic(this.platform.Characteristic.BatteryLevel, e);
|
|
441
|
+
this.batteryService?.updateCharacteristic(this.platform.Characteristic.StatusLowBattery, e);
|
|
442
|
+
}
|
|
477
443
|
//throw new this.platform.api.hap.HapStatusError(HAPStatus.SERVICE_COMMUNICATION_FAILURE);
|
|
478
444
|
}
|
|
479
445
|
|