@switchbot/homebridge-switchbot 3.5.0-beta.6 → 3.5.0-beta.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +4 -1
- package/CHANGELOG.md +4 -1
- package/config.schema.json +120 -17
- package/dist/device/blindtilt.d.ts +23 -96
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +408 -779
- package/dist/device/blindtilt.js.map +1 -1
- package/dist/device/bot.d.ts +26 -72
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +696 -822
- package/dist/device/bot.js.map +1 -1
- package/dist/device/ceilinglight.d.ts +14 -68
- package/dist/device/ceilinglight.d.ts.map +1 -1
- package/dist/device/ceilinglight.js +237 -606
- package/dist/device/ceilinglight.js.map +1 -1
- package/dist/device/colorbulb.d.ts +14 -75
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +279 -658
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.d.ts +15 -66
- package/dist/device/contact.d.ts.map +1 -1
- package/dist/device/contact.js +242 -544
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts +19 -88
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +402 -805
- package/dist/device/curtain.js.map +1 -1
- package/dist/device/device.d.ts +59 -0
- package/dist/device/device.d.ts.map +1 -0
- package/dist/device/device.js +684 -0
- package/dist/device/device.js.map +1 -0
- package/dist/device/fan.d.ts +51 -0
- package/dist/device/fan.d.ts.map +1 -0
- package/dist/device/fan.js +535 -0
- package/dist/device/fan.js.map +1 -0
- package/dist/device/hub.d.ts +16 -60
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +246 -613
- package/dist/device/hub.js.map +1 -1
- package/dist/device/humidifier.d.ts +11 -66
- package/dist/device/humidifier.d.ts.map +1 -1
- package/dist/device/humidifier.js +232 -593
- package/dist/device/humidifier.js.map +1 -1
- package/dist/device/iosensor.d.ts +11 -64
- package/dist/device/iosensor.d.ts.map +1 -1
- package/dist/device/iosensor.js +185 -600
- package/dist/device/iosensor.js.map +1 -1
- package/dist/device/lightstrip.d.ts +11 -69
- package/dist/device/lightstrip.d.ts.map +1 -1
- package/dist/device/lightstrip.js +277 -586
- package/dist/device/lightstrip.js.map +1 -1
- package/dist/device/lock.d.ts +16 -63
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +241 -560
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.d.ts +14 -64
- package/dist/device/meter.d.ts.map +1 -1
- package/dist/device/meter.js +181 -593
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.d.ts +14 -65
- package/dist/device/meterplus.d.ts.map +1 -1
- package/dist/device/meterplus.js +170 -593
- package/dist/device/meterplus.js.map +1 -1
- package/dist/device/motion.d.ts +13 -69
- package/dist/device/motion.d.ts.map +1 -1
- package/dist/device/motion.js +178 -531
- package/dist/device/motion.js.map +1 -1
- package/dist/device/plug.d.ts +9 -57
- package/dist/device/plug.d.ts.map +1 -1
- package/dist/device/plug.js +92 -458
- package/dist/device/plug.js.map +1 -1
- package/dist/device/robotvacuumcleaner.d.ts +12 -63
- package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
- package/dist/device/robotvacuumcleaner.js +197 -521
- package/dist/device/robotvacuumcleaner.js.map +1 -1
- package/dist/device/waterdetector.d.ts +10 -65
- package/dist/device/waterdetector.d.ts.map +1 -1
- package/dist/device/waterdetector.js +139 -495
- package/dist/device/waterdetector.js.map +1 -1
- package/dist/homebridge-ui/public/index.html +22 -16
- package/dist/homebridge-ui/server.js +1 -1
- package/dist/homebridge-ui/server.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/irdevice/airconditioner.d.ts +9 -49
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js +309 -419
- package/dist/irdevice/airconditioner.js.map +1 -1
- package/dist/irdevice/airpurifier.d.ts +8 -39
- package/dist/irdevice/airpurifier.d.ts.map +1 -1
- package/dist/irdevice/airpurifier.js +72 -304
- package/dist/irdevice/airpurifier.js.map +1 -1
- package/dist/irdevice/camera.d.ts +7 -36
- package/dist/irdevice/camera.d.ts.map +1 -1
- package/dist/irdevice/camera.js +34 -278
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts +10 -43
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +100 -338
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +40 -0
- package/dist/irdevice/irdevice.d.ts.map +1 -0
- package/dist/irdevice/irdevice.js +330 -0
- package/dist/irdevice/irdevice.js.map +1 -0
- package/dist/irdevice/light.d.ts +12 -45
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +87 -357
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.d.ts +19 -48
- package/dist/irdevice/other.d.ts.map +1 -1
- package/dist/irdevice/other.js +352 -546
- package/dist/irdevice/other.js.map +1 -1
- package/dist/irdevice/tv.d.ts +8 -40
- package/dist/irdevice/tv.d.ts.map +1 -1
- package/dist/irdevice/tv.js +82 -321
- package/dist/irdevice/tv.js.map +1 -1
- package/dist/irdevice/vacuumcleaner.d.ts +7 -36
- package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
- package/dist/irdevice/vacuumcleaner.js +41 -284
- package/dist/irdevice/vacuumcleaner.js.map +1 -1
- package/dist/irdevice/waterheater.d.ts +7 -36
- package/dist/irdevice/waterheater.d.ts.map +1 -1
- package/dist/irdevice/waterheater.js +42 -287
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/platform.d.ts +19 -6
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +310 -169
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +62 -19
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +16 -552
- package/dist/settings.js.map +1 -1
- package/dist/utils.d.ts +77 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +638 -1
- package/dist/utils.js.map +1 -1
- package/eslint.config.js +96 -0
- package/package.json +19 -15
- package/src/custom.d.ts +2 -1
- package/src/device/blindtilt.ts +442 -814
- package/src/device/bot.ts +754 -915
- package/src/device/ceilinglight.ts +255 -633
- package/src/device/colorbulb.ts +294 -685
- package/src/device/contact.ts +277 -571
- package/src/device/curtain.ts +431 -835
- package/src/device/device.ts +709 -0
- package/src/device/fan.ts +591 -0
- package/src/device/hub.ts +286 -644
- package/src/device/humidifier.ts +266 -646
- package/src/device/iosensor.ts +220 -625
- package/src/device/lightstrip.ts +305 -620
- package/src/device/lock.ts +280 -600
- package/src/device/meter.ts +216 -617
- package/src/device/meterplus.ts +205 -619
- package/src/device/motion.ts +206 -556
- package/src/device/plug.ts +107 -490
- package/src/device/robotvacuumcleaner.ts +223 -550
- package/src/device/waterdetector.ts +160 -519
- package/src/homebridge-ui/public/index.html +22 -16
- package/src/homebridge-ui/server.ts +1 -1
- package/src/index.ts +4 -3
- package/src/irdevice/airconditioner.ts +333 -447
- package/src/irdevice/airpurifier.ts +92 -322
- package/src/irdevice/camera.ts +45 -294
- package/src/irdevice/fan.ts +115 -353
- package/src/irdevice/irdevice.ts +346 -0
- package/src/irdevice/light.ts +110 -385
- package/src/irdevice/other.ts +399 -616
- package/src/irdevice/tv.ts +103 -340
- package/src/irdevice/vacuumcleaner.ts +52 -306
- package/src/irdevice/waterheater.ts +53 -311
- package/src/platform.ts +355 -216
- package/src/settings.ts +116 -611
- package/src/utils.ts +642 -1
- package/src/device/waterdetector.json +0 -11
package/dist/device/meterplus.js
CHANGED
|
@@ -1,100 +1,62 @@
|
|
|
1
|
-
import asyncmqtt from 'async-mqtt';
|
|
2
|
-
import { hostname } from 'os';
|
|
3
|
-
import { interval } from 'rxjs';
|
|
4
|
-
import { request } from 'undici';
|
|
5
1
|
import { Devices } from '../settings.js';
|
|
6
|
-
import {
|
|
2
|
+
import { deviceBase } from './device.js';
|
|
3
|
+
import { Subject, interval, skipWhile } from 'rxjs';
|
|
7
4
|
/**
|
|
8
5
|
* Platform Accessory
|
|
9
6
|
* An instance of this class is created for each accessory your platform registers
|
|
10
7
|
* Each accessory may expose multiple services of different service types.
|
|
11
8
|
*/
|
|
12
|
-
export class MeterPlus {
|
|
9
|
+
export class MeterPlus extends deviceBase {
|
|
13
10
|
platform;
|
|
14
|
-
accessory;
|
|
15
|
-
device;
|
|
16
|
-
api;
|
|
17
|
-
log;
|
|
18
|
-
config;
|
|
19
|
-
hap;
|
|
20
11
|
// Services
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
StatusLowBattery;
|
|
28
|
-
CurrentTemperature;
|
|
29
|
-
CurrentRelativeHumidity;
|
|
30
|
-
// OpenAPI Status
|
|
31
|
-
OpenAPI_BatteryLevel;
|
|
32
|
-
OpenAPI_FirmwareRevision;
|
|
33
|
-
OpenAPI_CurrentTemperature;
|
|
34
|
-
OpenAPI_CurrentRelativeHumidity;
|
|
35
|
-
// BLE Status
|
|
36
|
-
BLE_Celsius;
|
|
37
|
-
BLE_Fahrenheit;
|
|
38
|
-
BLE_BatteryLevel;
|
|
39
|
-
BLE_CurrentTemperature;
|
|
40
|
-
BLE_CurrentRelativeHumidity;
|
|
41
|
-
// BLE Others
|
|
42
|
-
BLE_IsConnected;
|
|
43
|
-
//MQTT stuff
|
|
44
|
-
mqttClient = null;
|
|
45
|
-
// EVE history service handler
|
|
46
|
-
historyService;
|
|
47
|
-
// Config
|
|
48
|
-
scanDuration;
|
|
49
|
-
deviceLogging;
|
|
50
|
-
deviceRefreshRate;
|
|
51
|
-
// Connection
|
|
52
|
-
OpenAPI;
|
|
53
|
-
BLE;
|
|
12
|
+
Battery;
|
|
13
|
+
HumiditySensor;
|
|
14
|
+
TemperatureSensor;
|
|
15
|
+
// Updates
|
|
16
|
+
meterUpdateInProgress;
|
|
17
|
+
doMeterUpdate;
|
|
54
18
|
constructor(platform, accessory, device) {
|
|
19
|
+
super(platform, accessory, device);
|
|
55
20
|
this.platform = platform;
|
|
56
|
-
this
|
|
57
|
-
this.
|
|
58
|
-
this.
|
|
59
|
-
|
|
60
|
-
this.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
this.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
this.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, accessory.context.FirmwareRevision);
|
|
82
|
-
// Temperature Sensor Service
|
|
21
|
+
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
22
|
+
this.doMeterUpdate = new Subject();
|
|
23
|
+
this.meterUpdateInProgress = false;
|
|
24
|
+
// Initialize Battery Service
|
|
25
|
+
this.Battery = {
|
|
26
|
+
Name: accessory.context.BatteryName ?? `${accessory.displayName} Battery`,
|
|
27
|
+
Service: accessory.getService(this.hap.Service.Battery) ?? accessory.addService(this.hap.Service.Battery),
|
|
28
|
+
BatteryLevel: accessory.context.BatteryLevel ?? 100,
|
|
29
|
+
StatusLowBattery: accessory.context.StatusLowBattery ?? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL,
|
|
30
|
+
};
|
|
31
|
+
// Initialize Battery Characteristics
|
|
32
|
+
this.Battery.Service
|
|
33
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.Battery.Name)
|
|
34
|
+
.setCharacteristic(this.hap.Characteristic.ChargingState, this.hap.Characteristic.ChargingState.NOT_CHARGEABLE)
|
|
35
|
+
.getCharacteristic(this.hap.Characteristic.BatteryLevel)
|
|
36
|
+
.onGet(() => {
|
|
37
|
+
return this.Battery.BatteryLevel;
|
|
38
|
+
});
|
|
39
|
+
this.Battery.Service
|
|
40
|
+
.getCharacteristic(this.hap.Characteristic.StatusLowBattery)
|
|
41
|
+
.onGet(() => {
|
|
42
|
+
return this.Battery.StatusLowBattery;
|
|
43
|
+
});
|
|
44
|
+
accessory.context.BatteryName = this.Battery.Name;
|
|
45
|
+
// Initialize Temperature Sensor Service
|
|
83
46
|
if (device.meter?.hide_temperature) {
|
|
84
47
|
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Temperature Sensor Service`);
|
|
85
|
-
this.
|
|
86
|
-
accessory.removeService(this.
|
|
87
|
-
}
|
|
88
|
-
else
|
|
89
|
-
this.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
this.temperatureService
|
|
48
|
+
this.TemperatureSensor.Service = this.accessory.getService(this.hap.Service.TemperatureSensor);
|
|
49
|
+
accessory.removeService(this.TemperatureSensor.Service);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this.TemperatureSensor = {
|
|
53
|
+
Name: accessory.context.TemperatureSensorName ?? `${accessory.displayName} Temperature Sensor`,
|
|
54
|
+
Service: accessory.getService(this.hap.Service.TemperatureSensor) ?? this.accessory.addService(this.hap.Service.TemperatureSensor),
|
|
55
|
+
CurrentTemperature: accessory.context.CurrentTemperature ?? 30,
|
|
56
|
+
};
|
|
57
|
+
// Initialize Temperature Sensor Characteristics
|
|
58
|
+
this.TemperatureSensor.Service
|
|
59
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.TemperatureSensor.Name)
|
|
98
60
|
.getCharacteristic(this.hap.Characteristic.CurrentTemperature)
|
|
99
61
|
.setProps({
|
|
100
62
|
unit: "celsius" /* Units['CELSIUS'] */,
|
|
@@ -104,70 +66,64 @@ export class MeterPlus {
|
|
|
104
66
|
minStep: 0.1,
|
|
105
67
|
})
|
|
106
68
|
.onGet(() => {
|
|
107
|
-
return this.CurrentTemperature;
|
|
69
|
+
return this.TemperatureSensor.CurrentTemperature;
|
|
108
70
|
});
|
|
71
|
+
accessory.context.TemperatureSensorName = this.TemperatureSensor.Name;
|
|
109
72
|
}
|
|
110
|
-
|
|
111
|
-
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Temperature Sensor Service Not Added`);
|
|
112
|
-
}
|
|
113
|
-
// Humidity Sensor Service
|
|
73
|
+
// Initialize Humidity Sensor Service
|
|
114
74
|
if (device.meter?.hide_humidity) {
|
|
115
75
|
this.debugLog(`${this.device.deviceType}: ${accessory.displayName} Removing Humidity Sensor Service`);
|
|
116
|
-
this.
|
|
117
|
-
accessory.removeService(this.
|
|
118
|
-
}
|
|
119
|
-
else
|
|
120
|
-
this.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
this.humidityService
|
|
76
|
+
this.HumiditySensor.Service = this.accessory.getService(this.hap.Service.HumiditySensor);
|
|
77
|
+
accessory.removeService(this.HumiditySensor.Service);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this.HumiditySensor = {
|
|
81
|
+
Name: accessory.context.HumiditySensorName ?? `${accessory.displayName} Humidity Sensor`,
|
|
82
|
+
Service: accessory.getService(this.hap.Service.HumiditySensor) ?? this.accessory.addService(this.hap.Service.HumiditySensor),
|
|
83
|
+
CurrentRelativeHumidity: accessory.context.CurrentRelativeHumidity ?? 50,
|
|
84
|
+
};
|
|
85
|
+
// Initialize Humidity Sensor Characteristics
|
|
86
|
+
this.HumiditySensor.Service
|
|
87
|
+
.setCharacteristic(this.hap.Characteristic.Name, this.HumiditySensor.Name)
|
|
129
88
|
.getCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity)
|
|
130
89
|
.setProps({
|
|
131
90
|
minStep: 0.1,
|
|
132
91
|
})
|
|
133
92
|
.onGet(() => {
|
|
134
|
-
return this.CurrentRelativeHumidity;
|
|
93
|
+
return this.HumiditySensor.CurrentRelativeHumidity;
|
|
135
94
|
});
|
|
95
|
+
accessory.context.HumiditySensorName = this.HumiditySensor.Name;
|
|
136
96
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
// Battery Service
|
|
141
|
-
const batteryService = `${accessory.displayName} Battery`;
|
|
142
|
-
(this.batteryService = this.accessory.getService(this.hap.Service.Battery)
|
|
143
|
-
|| accessory.addService(this.hap.Service.Battery)), batteryService;
|
|
144
|
-
this.batteryService.setCharacteristic(this.hap.Characteristic.Name, `${accessory.displayName} Battery`);
|
|
145
|
-
if (!this.batteryService.testCharacteristic(this.hap.Characteristic.ConfiguredName)) {
|
|
146
|
-
this.batteryService.addCharacteristic(this.hap.Characteristic.ConfiguredName, `${accessory.displayName} Battery`);
|
|
147
|
-
}
|
|
148
|
-
this.batteryService.setCharacteristic(this.hap.Characteristic.ChargingState, this.hap.Characteristic.ChargingState.NOT_CHARGEABLE);
|
|
97
|
+
// Retrieve initial values and updateHomekit
|
|
98
|
+
this.refreshStatus();
|
|
149
99
|
// Retrieve initial values and updateHomekit
|
|
150
100
|
this.updateHomeKitCharacteristics();
|
|
151
101
|
// Start an update interval
|
|
152
102
|
interval(this.deviceRefreshRate * 1000)
|
|
103
|
+
.pipe(skipWhile(() => this.meterUpdateInProgress))
|
|
153
104
|
.subscribe(async () => {
|
|
154
105
|
await this.refreshStatus();
|
|
155
106
|
});
|
|
156
107
|
//regisiter webhook event handler
|
|
157
|
-
if (
|
|
158
|
-
this.
|
|
108
|
+
if (device.webhook) {
|
|
109
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} is listening webhook.`);
|
|
159
110
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context) => {
|
|
160
111
|
try {
|
|
161
112
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} received Webhook: ${JSON.stringify(context)}`);
|
|
162
113
|
if (context.scale === 'CELSIUS') {
|
|
163
114
|
const { temperature, humidity } = context;
|
|
164
|
-
const {
|
|
115
|
+
const { CurrentRelativeHumidity } = this.HumiditySensor || { CurrentRelativeHumidity: undefined };
|
|
116
|
+
const { CurrentTemperature } = this.TemperatureSensor || { CurrentTemperature: undefined };
|
|
165
117
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ` +
|
|
166
118
|
'(temperature, humidity) = ' +
|
|
167
119
|
`Webhook:(${temperature}, ${humidity}), ` +
|
|
168
120
|
`current:(${CurrentTemperature}, ${CurrentRelativeHumidity})`);
|
|
169
|
-
this.
|
|
170
|
-
|
|
121
|
+
if (this.device.meter?.hide_humidity) {
|
|
122
|
+
this.HumiditySensor.CurrentRelativeHumidity = humidity;
|
|
123
|
+
}
|
|
124
|
+
if (this.device.meter?.hide_temperature) {
|
|
125
|
+
this.TemperatureSensor.CurrentTemperature = temperature;
|
|
126
|
+
}
|
|
171
127
|
this.updateHomeKitCharacteristics();
|
|
172
128
|
}
|
|
173
129
|
}
|
|
@@ -178,84 +134,65 @@ export class MeterPlus {
|
|
|
178
134
|
};
|
|
179
135
|
}
|
|
180
136
|
}
|
|
181
|
-
|
|
182
|
-
* Parse the device status from the SwitchBot api
|
|
183
|
-
*/
|
|
184
|
-
async parseStatus() {
|
|
185
|
-
if (!this.device.enableCloudService && this.OpenAPI) {
|
|
186
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} parseStatus enableCloudService: ${this.device.enableCloudService}`);
|
|
187
|
-
}
|
|
188
|
-
else if (this.BLE) {
|
|
189
|
-
await this.BLEparseStatus();
|
|
190
|
-
}
|
|
191
|
-
else if (this.OpenAPI && this.platform.config.credentials?.token) {
|
|
192
|
-
await this.openAPIparseStatus();
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
await this.offlineOff();
|
|
196
|
-
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Connection Type:` + ` ${this.device.connectionType}, parseStatus will not happen.`);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
async BLEparseStatus() {
|
|
137
|
+
async BLEparseStatus(serviceData) {
|
|
200
138
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BLEparseStatus`);
|
|
201
139
|
// Battery
|
|
202
|
-
this.BatteryLevel = Number(
|
|
203
|
-
if (this.BatteryLevel < 15) {
|
|
204
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
140
|
+
this.Battery.BatteryLevel = Number(serviceData.battery);
|
|
141
|
+
if (this.Battery.BatteryLevel < 15) {
|
|
142
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
205
143
|
}
|
|
206
144
|
else {
|
|
207
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
145
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
208
146
|
}
|
|
209
|
-
this.debugLog(`${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}, StatusLowBattery: ${this.StatusLowBattery}`);
|
|
147
|
+
this.debugLog(`${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}, StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
210
148
|
// Humidity
|
|
211
149
|
if (!this.device.meter?.hide_humidity) {
|
|
212
|
-
this.CurrentRelativeHumidity =
|
|
213
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Humidity: ${this.CurrentRelativeHumidity}%`);
|
|
150
|
+
this.HumiditySensor.CurrentRelativeHumidity = serviceData.humidity;
|
|
151
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Humidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
|
|
214
152
|
}
|
|
215
153
|
// Current Temperature
|
|
216
154
|
if (!this.device.meter?.hide_temperature) {
|
|
217
|
-
|
|
218
|
-
this.CurrentTemperature =
|
|
219
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Temperature: ${this.CurrentTemperature}°c`);
|
|
155
|
+
serviceData.temperature.c < 0 ? 0 : serviceData.temperature.c > 100 ? 100 : serviceData.temperature.c;
|
|
156
|
+
this.TemperatureSensor.CurrentTemperature = serviceData.temperature.c;
|
|
157
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Temperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
|
|
220
158
|
}
|
|
221
159
|
}
|
|
222
|
-
async openAPIparseStatus() {
|
|
160
|
+
async openAPIparseStatus(deviceStatus) {
|
|
223
161
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIparseStatus`);
|
|
224
162
|
// BatteryLevel
|
|
225
|
-
this.BatteryLevel = Number(
|
|
226
|
-
if (this.BatteryLevel <
|
|
227
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
163
|
+
this.Battery.BatteryLevel = Number(deviceStatus.body.battery);
|
|
164
|
+
if (this.Battery.BatteryLevel < 10) {
|
|
165
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
|
|
228
166
|
}
|
|
229
167
|
else {
|
|
230
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
168
|
+
this.Battery.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
169
|
+
}
|
|
170
|
+
if (Number.isNaN(this.Battery.BatteryLevel)) {
|
|
171
|
+
this.Battery.BatteryLevel = 100;
|
|
231
172
|
}
|
|
232
|
-
this.debugLog(`${this.
|
|
173
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel},`
|
|
174
|
+
+ ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
233
175
|
// CurrentRelativeHumidity
|
|
234
176
|
if (!this.device.meter?.hide_humidity) {
|
|
235
|
-
this.CurrentRelativeHumidity =
|
|
236
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Humidity: ${this.CurrentRelativeHumidity}%`);
|
|
177
|
+
this.HumiditySensor.CurrentRelativeHumidity = deviceStatus.body.humidity;
|
|
178
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Humidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
|
|
237
179
|
}
|
|
238
180
|
// CurrentTemperature
|
|
239
181
|
if (!this.device.meter?.hide_temperature) {
|
|
240
|
-
this.CurrentTemperature =
|
|
241
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Temperature: ${this.CurrentTemperature}°c`);
|
|
242
|
-
}
|
|
243
|
-
//
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
182
|
+
this.TemperatureSensor.CurrentTemperature = deviceStatus.body.temperature;
|
|
183
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Temperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
|
|
184
|
+
}
|
|
185
|
+
// Firmware Version
|
|
186
|
+
const version = deviceStatus.body.version?.toString();
|
|
187
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Firmware Version: ${version?.replace(/^V|-.*$/g, '')}`);
|
|
188
|
+
if (deviceStatus.body.version) {
|
|
189
|
+
this.accessory.context.version = version?.replace(/^V|-.*$/g, '');
|
|
190
|
+
this.accessory
|
|
191
|
+
.getService(this.hap.Service.AccessoryInformation)
|
|
192
|
+
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, this.accessory.context.version)
|
|
193
|
+
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
194
|
+
.updateValue(this.accessory.context.version);
|
|
247
195
|
}
|
|
248
|
-
else {
|
|
249
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
250
|
-
}
|
|
251
|
-
if (Number.isNaN(this.BatteryLevel)) {
|
|
252
|
-
this.BatteryLevel = 100;
|
|
253
|
-
}
|
|
254
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel},`
|
|
255
|
-
+ ` StatusLowBattery: ${this.StatusLowBattery}`);
|
|
256
|
-
// FirmwareRevision
|
|
257
|
-
this.FirmwareRevision = this.OpenAPI_FirmwareRevision;
|
|
258
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
259
196
|
}
|
|
260
197
|
/**
|
|
261
198
|
* Asks the SwitchBot API for the latest device information
|
|
@@ -288,108 +225,43 @@ export class MeterPlus {
|
|
|
288
225
|
this.getCustomBLEAddress(switchbot);
|
|
289
226
|
// Start to monitor advertisement packets
|
|
290
227
|
(async () => {
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
id: this.device.bleMac,
|
|
294
|
-
});
|
|
228
|
+
// Start to monitor advertisement packets
|
|
229
|
+
await switchbot.startScan({ model: this.device.bleModel, id: this.device.bleMac });
|
|
295
230
|
// Set an event handler
|
|
296
231
|
switchbot.onadvertisement = (ad) => {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
232
|
+
if (this.device.bleMac === ad.address && ad.model === this.device.bleModel) {
|
|
233
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} ${JSON.stringify(ad, null, ' ')}`);
|
|
234
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} address: ${ad.address}, model: ${ad.model}`);
|
|
300
235
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
301
|
-
this.BLE_CurrentRelativeHumidity = ad.serviceData.humidity < 0 ? 0 : ad.serviceData.humidity > 100 ? 100 : ad.serviceData.humidity;
|
|
302
|
-
this.BLE_CurrentTemperature = ad.serviceData.temperature;
|
|
303
|
-
this.BLE_Celsius = ad.serviceData.temperature.c;
|
|
304
|
-
this.BLE_Fahrenheit = ad.serviceData.temperature.f;
|
|
305
|
-
this.BLE_BatteryLevel = ad.serviceData.battery;
|
|
306
236
|
}
|
|
307
237
|
else {
|
|
308
238
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
309
239
|
}
|
|
310
240
|
};
|
|
311
|
-
// Wait
|
|
241
|
+
// Wait 10 seconds
|
|
312
242
|
await switchbot.wait(this.scanDuration * 1000);
|
|
313
243
|
// Stop to monitor
|
|
314
244
|
await switchbot.stopScan();
|
|
315
245
|
// Update HomeKit
|
|
316
|
-
await this.BLEparseStatus();
|
|
246
|
+
await this.BLEparseStatus(switchbot.onadvertisement.serviceData);
|
|
317
247
|
await this.updateHomeKitCharacteristics();
|
|
318
248
|
})();
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
model: 'i',
|
|
323
|
-
id: this.device.bleMac,
|
|
324
|
-
})
|
|
325
|
-
.then(async () => {
|
|
326
|
-
// Set an event handler
|
|
327
|
-
switchbot.onadvertisement = async (ad: ad) => {
|
|
328
|
-
this.debugLog(
|
|
329
|
-
`${this.device.deviceType}: ${this.accessory.displayName} Config BLE Address: ${this.device.bleMac},` +
|
|
330
|
-
` BLE Address Found: ${ad.address}`,
|
|
331
|
-
);
|
|
332
|
-
if (ad.serviceData.humidity! > 0) {
|
|
333
|
-
// reject unreliable data
|
|
334
|
-
this.BLE_CurrentRelativeHumidity = ad.serviceData.humidity;
|
|
335
|
-
}
|
|
336
|
-
this.BLE_CurrentTemperature = ad.serviceData.temperature;
|
|
337
|
-
this.BLE_Celsius = ad.serviceData.temperature!.c;
|
|
338
|
-
this.BLE_Fahrenheit = ad.serviceData.temperature!.f;
|
|
339
|
-
this.BLE_BatteryLevel = ad.serviceData.battery;
|
|
340
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} serviceData: ${JSON.stringify(ad.serviceData)}`);
|
|
341
|
-
this.debugLog(
|
|
342
|
-
`${this.device.deviceType}: ${this.accessory.displayName} model: ${ad.serviceData.model}, modelName: ${ad.serviceData.modelName}, ` +
|
|
343
|
-
`temperature: ${JSON.stringify(ad.serviceData.temperature?.c)}, humidity: ${ad.serviceData.humidity}, ` +
|
|
344
|
-
`battery: ${ad.serviceData.battery}`,
|
|
345
|
-
);
|
|
346
|
-
|
|
347
|
-
if (ad.serviceData) {
|
|
348
|
-
this.BLE_IsConnected = true;
|
|
349
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
350
|
-
await this.stopScanning(switchbot);
|
|
351
|
-
} else {
|
|
352
|
-
this.BLE_IsConnected = false;
|
|
353
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} connected: ${this.BLE_IsConnected}`);
|
|
354
|
-
}
|
|
355
|
-
};
|
|
356
|
-
// Wait
|
|
357
|
-
return await sleep(this.scanDuration * 1000);
|
|
358
|
-
})
|
|
359
|
-
.then(async () => {
|
|
360
|
-
// Stop to monitor
|
|
361
|
-
await this.stopScanning(switchbot);
|
|
362
|
-
})
|
|
363
|
-
.catch(async (e: any) => {
|
|
364
|
-
this.apiError(e);
|
|
365
|
-
this.errorLog(
|
|
366
|
-
`${this.device.deviceType}: ${this.accessory.displayName} failed BLERefreshStatus with ${this.device.connectionType}` +
|
|
367
|
-
` Connection, Error Message: ${JSON.stringify(e.message)}`,
|
|
368
|
-
);
|
|
369
|
-
await this.BLERefreshConnection(switchbot);
|
|
370
|
-
});
|
|
371
|
-
} else {
|
|
372
|
-
await this.BLERefreshConnection(switchbot);
|
|
373
|
-
}*/
|
|
249
|
+
if (switchbot === undefined) {
|
|
250
|
+
await this.BLERefreshConnection(switchbot);
|
|
251
|
+
}
|
|
374
252
|
}
|
|
375
253
|
async openAPIRefreshStatus() {
|
|
376
254
|
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} openAPIRefreshStatus`);
|
|
377
255
|
try {
|
|
378
|
-
const { body, statusCode } = await
|
|
379
|
-
headers: this.platform.generateHeaders(),
|
|
380
|
-
});
|
|
256
|
+
const { body, statusCode } = await this.platform.retryRequest(this.deviceMaxRetries, this.deviceDelayBetweenRetries, `${Devices}/${this.device.deviceId}/status`, { headers: this.platform.generateHeaders() });
|
|
381
257
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} statusCode: ${statusCode}`);
|
|
382
258
|
const deviceStatus = await body.json();
|
|
383
259
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
384
260
|
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} deviceStatus statusCode: ${deviceStatus.statusCode}`);
|
|
385
261
|
if ((statusCode === 200 || statusCode === 100) && (deviceStatus.statusCode === 200 || deviceStatus.statusCode === 100)) {
|
|
386
|
-
this.
|
|
262
|
+
this.debugSuccessLog(`${this.device.deviceType}: ${this.accessory.displayName} `
|
|
387
263
|
+ `statusCode: ${statusCode} & deviceStatus StatusCode: ${deviceStatus.statusCode}`);
|
|
388
|
-
this.
|
|
389
|
-
this.OpenAPI_CurrentTemperature = deviceStatus.body.temperature;
|
|
390
|
-
this.OpenAPI_BatteryLevel = deviceStatus.body.battery;
|
|
391
|
-
this.OpenAPI_FirmwareRevision = deviceStatus.body.version;
|
|
392
|
-
this.openAPIparseStatus();
|
|
264
|
+
this.openAPIparseStatus(deviceStatus);
|
|
393
265
|
this.updateHomeKitCharacteristics();
|
|
394
266
|
}
|
|
395
267
|
else {
|
|
@@ -411,149 +283,78 @@ export class MeterPlus {
|
|
|
411
283
|
const entry = { time: Math.round(new Date().valueOf() / 1000) };
|
|
412
284
|
// CurrentRelativeHumidity
|
|
413
285
|
if (!this.device.meter?.hide_humidity) {
|
|
414
|
-
if (this.CurrentRelativeHumidity === undefined) {
|
|
415
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}
|
|
286
|
+
if (this.HumiditySensor.CurrentRelativeHumidity === undefined) {
|
|
287
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
288
|
+
+ ` CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
|
|
416
289
|
}
|
|
417
290
|
else {
|
|
291
|
+
this.accessory.context.CurrentRelativeHumidity = this.HumiditySensor.CurrentRelativeHumidity;
|
|
292
|
+
this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, this.HumiditySensor.CurrentRelativeHumidity);
|
|
293
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}`
|
|
294
|
+
+ ` updateCharacteristic CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
|
|
418
295
|
if (this.device.mqttURL) {
|
|
419
|
-
mqttmessage.push(`"humidity": ${this.CurrentRelativeHumidity}`);
|
|
296
|
+
mqttmessage.push(`"humidity": ${this.HumiditySensor.CurrentRelativeHumidity}`);
|
|
420
297
|
}
|
|
421
298
|
if (this.device.history) {
|
|
422
|
-
entry['humidity'] = this.CurrentRelativeHumidity;
|
|
299
|
+
entry['humidity'] = this.HumiditySensor.CurrentRelativeHumidity;
|
|
423
300
|
}
|
|
424
|
-
this.accessory.context.CurrentRelativeHumidity = this.CurrentRelativeHumidity;
|
|
425
|
-
this.humidityService?.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, this.CurrentRelativeHumidity);
|
|
426
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName}` +
|
|
427
|
-
` updateCharacteristic CurrentRelativeHumidity: ${this.CurrentRelativeHumidity}`);
|
|
428
301
|
}
|
|
429
302
|
}
|
|
430
303
|
// CurrentTemperature
|
|
431
304
|
if (!this.device.meter?.hide_temperature) {
|
|
432
|
-
if (this.CurrentTemperature === undefined) {
|
|
433
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.CurrentTemperature}`);
|
|
305
|
+
if (this.TemperatureSensor.CurrentTemperature === undefined) {
|
|
306
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
|
|
434
307
|
}
|
|
435
308
|
else {
|
|
309
|
+
this.accessory.context.CurrentTemperature = this.TemperatureSensor.CurrentTemperature;
|
|
310
|
+
this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.TemperatureSensor.CurrentTemperature);
|
|
311
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
312
|
+
+ ` CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
|
|
436
313
|
if (this.device.mqttURL) {
|
|
437
|
-
mqttmessage.push(`"temperature": ${this.CurrentTemperature}`);
|
|
314
|
+
mqttmessage.push(`"temperature": ${this.TemperatureSensor.CurrentTemperature}`);
|
|
438
315
|
}
|
|
439
316
|
if (this.device.history) {
|
|
440
|
-
entry['temp'] = this.CurrentTemperature;
|
|
317
|
+
entry['temp'] = this.TemperatureSensor.CurrentTemperature;
|
|
441
318
|
}
|
|
442
|
-
this.accessory.context.CurrentTemperature = this.CurrentTemperature;
|
|
443
|
-
this.temperatureService?.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, this.CurrentTemperature);
|
|
444
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic CurrentTemperature: ${this.CurrentTemperature}`);
|
|
445
319
|
}
|
|
446
320
|
}
|
|
447
321
|
// BatteryLevel
|
|
448
|
-
if (this.BatteryLevel === undefined) {
|
|
449
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.BatteryLevel}`);
|
|
322
|
+
if (this.Battery.BatteryLevel === undefined) {
|
|
323
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
450
324
|
}
|
|
451
325
|
else {
|
|
326
|
+
this.accessory.context.BatteryLevel = this.Battery.BatteryLevel;
|
|
327
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.Battery.BatteryLevel);
|
|
328
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
452
329
|
if (this.device.mqttURL) {
|
|
453
|
-
mqttmessage.push(`"battery": ${this.BatteryLevel}`);
|
|
330
|
+
mqttmessage.push(`"battery": ${this.Battery.BatteryLevel}`);
|
|
454
331
|
}
|
|
455
|
-
this.accessory.context.BatteryLevel = this.BatteryLevel;
|
|
456
|
-
this.batteryService?.updateCharacteristic(this.hap.Characteristic.BatteryLevel, this.BatteryLevel);
|
|
457
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic BatteryLevel: ${this.BatteryLevel}`);
|
|
458
332
|
}
|
|
459
333
|
// StatusLowBattery
|
|
460
|
-
if (this.StatusLowBattery === undefined) {
|
|
461
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.StatusLowBattery}`);
|
|
334
|
+
if (this.Battery.StatusLowBattery === undefined) {
|
|
335
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
462
336
|
}
|
|
463
337
|
else {
|
|
338
|
+
this.accessory.context.StatusLowBattery = this.Battery.StatusLowBattery;
|
|
339
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.Battery.StatusLowBattery);
|
|
340
|
+
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic`
|
|
341
|
+
+ ` StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
464
342
|
if (this.device.mqttURL) {
|
|
465
|
-
mqttmessage.push(`"lowBattery": ${this.StatusLowBattery}`);
|
|
343
|
+
mqttmessage.push(`"lowBattery": ${this.Battery.StatusLowBattery}`);
|
|
466
344
|
}
|
|
467
|
-
this.accessory.context.StatusLowBattery = this.StatusLowBattery;
|
|
468
|
-
this.batteryService?.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, this.StatusLowBattery);
|
|
469
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} updateCharacteristic StatusLowBattery: ${this.StatusLowBattery}`);
|
|
470
345
|
}
|
|
471
|
-
// MQTT
|
|
346
|
+
// MQTT Publish
|
|
472
347
|
if (this.device.mqttURL) {
|
|
473
348
|
this.mqttPublish(`{${mqttmessage.join(',')}}`);
|
|
474
349
|
}
|
|
475
|
-
|
|
350
|
+
// History Service
|
|
351
|
+
if (!this.device.meter?.hide_humidity && (Number(this.HumiditySensor.CurrentRelativeHumidity) > 0)) {
|
|
476
352
|
// reject unreliable data
|
|
477
353
|
if (this.device.history) {
|
|
478
354
|
this.historyService?.addEntry(entry);
|
|
479
355
|
}
|
|
480
356
|
}
|
|
481
357
|
}
|
|
482
|
-
/*
|
|
483
|
-
* Publish MQTT message for topics of
|
|
484
|
-
* 'homebridge-switchbot/meter/xx:xx:xx:xx:xx:xx'
|
|
485
|
-
*/
|
|
486
|
-
mqttPublish(message) {
|
|
487
|
-
const mac = this.device.deviceId
|
|
488
|
-
?.toLowerCase()
|
|
489
|
-
.match(/[\s\S]{1,2}/g)
|
|
490
|
-
?.join(':');
|
|
491
|
-
const options = this.device.mqttPubOptions || {};
|
|
492
|
-
this.mqttClient?.publish(`homebridge-switchbot/meter/${mac}`, `${message}`, options);
|
|
493
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MQTT message: ${message} options:${JSON.stringify(options)}`);
|
|
494
|
-
}
|
|
495
|
-
/*
|
|
496
|
-
* Setup MQTT hadler if URL is specified.
|
|
497
|
-
*/
|
|
498
|
-
async setupMqtt(device) {
|
|
499
|
-
if (device.mqttURL) {
|
|
500
|
-
try {
|
|
501
|
-
const { connectAsync } = asyncmqtt;
|
|
502
|
-
this.mqttClient = await connectAsync(device.mqttURL, device.mqttOptions || {});
|
|
503
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} MQTT connection has been established successfully.`);
|
|
504
|
-
this.mqttClient.on('error', (e) => {
|
|
505
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Failed to publish MQTT messages. ${e}`);
|
|
506
|
-
});
|
|
507
|
-
}
|
|
508
|
-
catch (e) {
|
|
509
|
-
this.mqttClient = null;
|
|
510
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Failed to establish MQTT connection. ${e}`);
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
/*
|
|
515
|
-
* Setup EVE history graph feature if enabled.
|
|
516
|
-
*/
|
|
517
|
-
async setupHistoryService(device) {
|
|
518
|
-
const mac = this.device
|
|
519
|
-
.deviceId.match(/.{1,2}/g)
|
|
520
|
-
.join(':')
|
|
521
|
-
.toLowerCase();
|
|
522
|
-
this.historyService = device.history
|
|
523
|
-
? new this.platform.fakegatoAPI('room', this.accessory, {
|
|
524
|
-
log: this.platform.log,
|
|
525
|
-
storage: 'fs',
|
|
526
|
-
filename: `${hostname().split('.')[0]}_${mac}_persist.json`,
|
|
527
|
-
})
|
|
528
|
-
: null;
|
|
529
|
-
}
|
|
530
|
-
async stopScanning(switchbot) {
|
|
531
|
-
switchbot.stopScan();
|
|
532
|
-
if (this.BLE_IsConnected) {
|
|
533
|
-
await this.BLEparseStatus();
|
|
534
|
-
await this.updateHomeKitCharacteristics();
|
|
535
|
-
}
|
|
536
|
-
else {
|
|
537
|
-
await this.BLERefreshConnection(switchbot);
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
async getCustomBLEAddress(switchbot) {
|
|
541
|
-
if (this.device.customBLEaddress && this.deviceLogging.includes('debug')) {
|
|
542
|
-
(async () => {
|
|
543
|
-
// Start to monitor advertisement packets
|
|
544
|
-
await switchbot.startScan({
|
|
545
|
-
model: 'i',
|
|
546
|
-
});
|
|
547
|
-
// Set an event handler
|
|
548
|
-
switchbot.onadvertisement = (ad) => {
|
|
549
|
-
this.warnLog(`${this.device.deviceType}: ${this.accessory.displayName} ad: ${JSON.stringify(ad, null, ' ')}`);
|
|
550
|
-
};
|
|
551
|
-
await sleep(10000);
|
|
552
|
-
// Stop to monitor
|
|
553
|
-
switchbot.stopScan();
|
|
554
|
-
})();
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
358
|
async BLERefreshConnection(switchbot) {
|
|
558
359
|
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} wasn't able to establish BLE Connection, node-switchbot:`
|
|
559
360
|
+ ` ${JSON.stringify(switchbot)}`);
|
|
@@ -562,250 +363,26 @@ export class MeterPlus {
|
|
|
562
363
|
await this.openAPIRefreshStatus();
|
|
563
364
|
}
|
|
564
365
|
}
|
|
565
|
-
model(device) {
|
|
566
|
-
let model;
|
|
567
|
-
if (device.deviceType === 'Meter Plus (JP)') {
|
|
568
|
-
model = 'W2201500';
|
|
569
|
-
}
|
|
570
|
-
else {
|
|
571
|
-
model = 'W2301500';
|
|
572
|
-
}
|
|
573
|
-
return model;
|
|
574
|
-
}
|
|
575
|
-
async scan(device) {
|
|
576
|
-
if (device.scanDuration) {
|
|
577
|
-
this.scanDuration = this.accessory.context.scanDuration = device.scanDuration;
|
|
578
|
-
if (this.BLE) {
|
|
579
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config scanDuration: ${this.scanDuration}`);
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
else {
|
|
583
|
-
this.scanDuration = this.accessory.context.scanDuration = 1;
|
|
584
|
-
if (this.BLE) {
|
|
585
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Default scanDuration: ${this.scanDuration}`);
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
async statusCode(statusCode) {
|
|
590
|
-
switch (statusCode) {
|
|
591
|
-
case 151:
|
|
592
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command not supported by this deviceType, statusCode: ${statusCode}`);
|
|
593
|
-
break;
|
|
594
|
-
case 152:
|
|
595
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device not found, statusCode: ${statusCode}`);
|
|
596
|
-
break;
|
|
597
|
-
case 160:
|
|
598
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Command is not supported, statusCode: ${statusCode}`);
|
|
599
|
-
break;
|
|
600
|
-
case 161:
|
|
601
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device is offline, statusCode: ${statusCode}`);
|
|
602
|
-
this.offlineOff();
|
|
603
|
-
break;
|
|
604
|
-
case 171:
|
|
605
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Hub Device is offline, statusCode: ${statusCode}. ` +
|
|
606
|
-
`Hub: ${this.device.hubDeviceId}`);
|
|
607
|
-
this.offlineOff();
|
|
608
|
-
break;
|
|
609
|
-
case 190:
|
|
610
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Device internal error due to device states not synchronized with server,` +
|
|
611
|
-
` Or command format is invalid, statusCode: ${statusCode}`);
|
|
612
|
-
break;
|
|
613
|
-
case 100:
|
|
614
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Command successfully sent, statusCode: ${statusCode}`);
|
|
615
|
-
break;
|
|
616
|
-
case 200:
|
|
617
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Request successful, statusCode: ${statusCode}`);
|
|
618
|
-
break;
|
|
619
|
-
case 400:
|
|
620
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Bad Request, The client has issued an invalid request. `
|
|
621
|
-
+ `This is commonly used to specify validation errors in a request payload, statusCode: ${statusCode}`);
|
|
622
|
-
break;
|
|
623
|
-
case 401:
|
|
624
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unauthorized, Authorization for the API is required, `
|
|
625
|
-
+ `but the request has not been authenticated, statusCode: ${statusCode}`);
|
|
626
|
-
break;
|
|
627
|
-
case 403:
|
|
628
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Forbidden, The request has been authenticated but does not `
|
|
629
|
-
+ `have appropriate permissions, or a requested resource is not found, statusCode: ${statusCode}`);
|
|
630
|
-
break;
|
|
631
|
-
case 404:
|
|
632
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Found, Specifies the requested path does not exist, `
|
|
633
|
-
+ `statusCode: ${statusCode}`);
|
|
634
|
-
break;
|
|
635
|
-
case 406:
|
|
636
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Not Acceptable, The client has requested a MIME type via `
|
|
637
|
-
+ `the Accept header for a value not supported by the server, statusCode: ${statusCode}`);
|
|
638
|
-
break;
|
|
639
|
-
case 415:
|
|
640
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unsupported Media Type, The client has defined a contentType `
|
|
641
|
-
+ `header that is not supported by the server, statusCode: ${statusCode}`);
|
|
642
|
-
break;
|
|
643
|
-
case 422:
|
|
644
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Unprocessable Entity, The client has made a valid request, `
|
|
645
|
-
+ `but the server cannot process it. This is often used for APIs for which certain limits have been exceeded, statusCode: ${statusCode}`);
|
|
646
|
-
break;
|
|
647
|
-
case 429:
|
|
648
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Too Many Requests, The client has exceeded the number of `
|
|
649
|
-
+ `requests allowed for a given time window, statusCode: ${statusCode}`);
|
|
650
|
-
break;
|
|
651
|
-
case 500:
|
|
652
|
-
this.errorLog(`${this.device.deviceType}: ${this.accessory.displayName} Internal Server Error, An unexpected error on the SmartThings `
|
|
653
|
-
+ `servers has occurred. These errors should be rare, statusCode: ${statusCode}`);
|
|
654
|
-
break;
|
|
655
|
-
default:
|
|
656
|
-
this.infoLog(`${this.device.deviceType}: ${this.accessory.displayName} Unknown statusCode: ` +
|
|
657
|
-
`${statusCode}, Submit Bugs Here: ' + 'https://tinyurl.com/SwitchBotBug`);
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
366
|
async offlineOff() {
|
|
661
367
|
if (this.device.offline) {
|
|
662
|
-
|
|
663
|
-
|
|
368
|
+
if (!this.device.meter?.hide_humidity) {
|
|
369
|
+
this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, 50);
|
|
370
|
+
}
|
|
371
|
+
if (!this.device.meter?.hide_temperature) {
|
|
372
|
+
this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, 30);
|
|
373
|
+
}
|
|
374
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, 100);
|
|
664
375
|
}
|
|
665
376
|
}
|
|
666
377
|
async apiError(e) {
|
|
667
378
|
if (!this.device.meter?.hide_humidity) {
|
|
668
|
-
this.
|
|
379
|
+
this.HumiditySensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentRelativeHumidity, e);
|
|
669
380
|
}
|
|
670
381
|
if (!this.device.meter?.hide_temperature) {
|
|
671
|
-
this.
|
|
672
|
-
}
|
|
673
|
-
this.batteryService?.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
|
|
674
|
-
this.batteryService?.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
|
|
675
|
-
}
|
|
676
|
-
async deviceContext() {
|
|
677
|
-
if (this.CurrentRelativeHumidity === undefined) {
|
|
678
|
-
this.CurrentRelativeHumidity = 0;
|
|
679
|
-
}
|
|
680
|
-
else {
|
|
681
|
-
this.CurrentRelativeHumidity = this.accessory.context.CurrentRelativeHumidity;
|
|
682
|
-
}
|
|
683
|
-
if (this.CurrentTemperature === undefined) {
|
|
684
|
-
this.CurrentTemperature = 0;
|
|
685
|
-
}
|
|
686
|
-
else {
|
|
687
|
-
this.CurrentTemperature = this.accessory.context.CurrentTemperature;
|
|
688
|
-
}
|
|
689
|
-
if (this.BatteryLevel === undefined) {
|
|
690
|
-
this.BatteryLevel = 100;
|
|
691
|
-
}
|
|
692
|
-
else {
|
|
693
|
-
this.BatteryLevel = this.accessory.context.BatteryLevel;
|
|
694
|
-
}
|
|
695
|
-
if (this.StatusLowBattery === undefined) {
|
|
696
|
-
this.StatusLowBattery = this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
697
|
-
this.accessory.context.StatusLowBattery = this.StatusLowBattery;
|
|
698
|
-
}
|
|
699
|
-
else {
|
|
700
|
-
this.StatusLowBattery = this.accessory.context.StatusLowBattery;
|
|
701
|
-
}
|
|
702
|
-
if (this.FirmwareRevision === undefined) {
|
|
703
|
-
this.FirmwareRevision = this.platform.version;
|
|
704
|
-
this.accessory.context.FirmwareRevision = this.FirmwareRevision;
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
async refreshRate(device) {
|
|
708
|
-
if (device.refreshRate) {
|
|
709
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = device.refreshRate;
|
|
710
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config refreshRate: ${this.deviceRefreshRate}`);
|
|
711
|
-
}
|
|
712
|
-
else if (this.platform.config.options.refreshRate) {
|
|
713
|
-
this.deviceRefreshRate = this.accessory.context.refreshRate = this.platform.config.options.refreshRate;
|
|
714
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config refreshRate: ${this.deviceRefreshRate}`);
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
async deviceConfig(device) {
|
|
718
|
-
let config = {};
|
|
719
|
-
if (device.meter) {
|
|
720
|
-
config = device.meter;
|
|
382
|
+
this.TemperatureSensor.Service.updateCharacteristic(this.hap.Characteristic.CurrentTemperature, e);
|
|
721
383
|
}
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
}
|
|
725
|
-
if (device.external !== undefined) {
|
|
726
|
-
config['external'] = device.external;
|
|
727
|
-
}
|
|
728
|
-
if (device.mqttURL !== undefined) {
|
|
729
|
-
config['mqttURL'] = device.mqttURL;
|
|
730
|
-
}
|
|
731
|
-
if (device.logging !== undefined) {
|
|
732
|
-
config['logging'] = device.logging;
|
|
733
|
-
}
|
|
734
|
-
if (device.refreshRate !== undefined) {
|
|
735
|
-
config['refreshRate'] = device.refreshRate;
|
|
736
|
-
}
|
|
737
|
-
if (device.scanDuration !== undefined) {
|
|
738
|
-
config['scanDuration'] = device.scanDuration;
|
|
739
|
-
}
|
|
740
|
-
if (device.webhook !== undefined) {
|
|
741
|
-
config['webhook'] = device.webhook;
|
|
742
|
-
}
|
|
743
|
-
if (Object.entries(config).length !== 0) {
|
|
744
|
-
this.debugWarnLog(`${this.device.deviceType}: ${this.accessory.displayName} Config: ${JSON.stringify(config)}`);
|
|
745
|
-
}
|
|
746
|
-
}
|
|
747
|
-
async deviceLogs(device) {
|
|
748
|
-
if (this.platform.debugMode) {
|
|
749
|
-
this.deviceLogging = this.accessory.context.logging = 'debugMode';
|
|
750
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Debug Mode Logging: ${this.deviceLogging}`);
|
|
751
|
-
}
|
|
752
|
-
else if (device.logging) {
|
|
753
|
-
this.deviceLogging = this.accessory.context.logging = device.logging;
|
|
754
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Device Config Logging: ${this.deviceLogging}`);
|
|
755
|
-
}
|
|
756
|
-
else if (this.platform.config.options?.logging) {
|
|
757
|
-
this.deviceLogging = this.accessory.context.logging = this.platform.config.options?.logging;
|
|
758
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Using Platform Config Logging: ${this.deviceLogging}`);
|
|
759
|
-
}
|
|
760
|
-
else {
|
|
761
|
-
this.deviceLogging = this.accessory.context.logging = 'standard';
|
|
762
|
-
this.debugLog(`${this.device.deviceType}: ${this.accessory.displayName} Logging Not Set, Using: ${this.deviceLogging}`);
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
/**
|
|
766
|
-
* Logging for Device
|
|
767
|
-
*/
|
|
768
|
-
infoLog(...log) {
|
|
769
|
-
if (this.enablingDeviceLogging()) {
|
|
770
|
-
this.platform.log.info(String(...log));
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
warnLog(...log) {
|
|
774
|
-
if (this.enablingDeviceLogging()) {
|
|
775
|
-
this.platform.log.warn(String(...log));
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
debugWarnLog(...log) {
|
|
779
|
-
if (this.enablingDeviceLogging()) {
|
|
780
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
781
|
-
this.platform.log.warn('[DEBUG]', String(...log));
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
errorLog(...log) {
|
|
786
|
-
if (this.enablingDeviceLogging()) {
|
|
787
|
-
this.platform.log.error(String(...log));
|
|
788
|
-
}
|
|
789
|
-
}
|
|
790
|
-
debugErrorLog(...log) {
|
|
791
|
-
if (this.enablingDeviceLogging()) {
|
|
792
|
-
if (this.deviceLogging?.includes('debug')) {
|
|
793
|
-
this.platform.log.error('[DEBUG]', String(...log));
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
debugLog(...log) {
|
|
798
|
-
if (this.enablingDeviceLogging()) {
|
|
799
|
-
if (this.deviceLogging === 'debug') {
|
|
800
|
-
this.platform.log.info('[DEBUG]', String(...log));
|
|
801
|
-
}
|
|
802
|
-
else {
|
|
803
|
-
this.platform.log.debug(String(...log));
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
}
|
|
807
|
-
enablingDeviceLogging() {
|
|
808
|
-
return this.deviceLogging.includes('debug') || this.deviceLogging === 'standard';
|
|
384
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.BatteryLevel, e);
|
|
385
|
+
this.Battery.Service.updateCharacteristic(this.hap.Characteristic.StatusLowBattery, e);
|
|
809
386
|
}
|
|
810
387
|
}
|
|
811
388
|
//# sourceMappingURL=meterplus.js.map
|