@switchbot/homebridge-switchbot 3.5.1-beta.8 → 3.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/config.schema.json +19 -3
- package/dist/device/blindtilt.d.ts +6 -4
- package/dist/device/blindtilt.d.ts.map +1 -1
- package/dist/device/blindtilt.js +60 -46
- package/dist/device/blindtilt.js.map +1 -1
- package/dist/device/bot.d.ts +6 -3
- package/dist/device/bot.d.ts.map +1 -1
- package/dist/device/bot.js +59 -25
- package/dist/device/bot.js.map +1 -1
- package/dist/device/ceilinglight.d.ts +6 -3
- package/dist/device/ceilinglight.d.ts.map +1 -1
- package/dist/device/ceilinglight.js +47 -29
- package/dist/device/ceilinglight.js.map +1 -1
- package/dist/device/colorbulb.d.ts +6 -3
- package/dist/device/colorbulb.d.ts.map +1 -1
- package/dist/device/colorbulb.js +53 -36
- package/dist/device/colorbulb.js.map +1 -1
- package/dist/device/contact.d.ts +6 -3
- package/dist/device/contact.d.ts.map +1 -1
- package/dist/device/contact.js +45 -31
- package/dist/device/contact.js.map +1 -1
- package/dist/device/curtain.d.ts +6 -4
- package/dist/device/curtain.d.ts.map +1 -1
- package/dist/device/curtain.js +41 -27
- package/dist/device/curtain.js.map +1 -1
- package/dist/device/device.d.ts +6 -3
- package/dist/device/device.d.ts.map +1 -1
- package/dist/device/device.js +59 -152
- package/dist/device/device.js.map +1 -1
- package/dist/device/fan.d.ts +6 -3
- package/dist/device/fan.d.ts.map +1 -1
- package/dist/device/fan.js +53 -32
- package/dist/device/fan.js.map +1 -1
- package/dist/device/hub.d.ts +6 -3
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +49 -30
- package/dist/device/hub.js.map +1 -1
- package/dist/device/humidifier.d.ts +6 -3
- package/dist/device/humidifier.d.ts.map +1 -1
- package/dist/device/humidifier.js +47 -28
- package/dist/device/humidifier.js.map +1 -1
- package/dist/device/iosensor.d.ts +6 -3
- package/dist/device/iosensor.d.ts.map +1 -1
- package/dist/device/iosensor.js +44 -27
- package/dist/device/iosensor.js.map +1 -1
- package/dist/device/lightstrip.d.ts +6 -3
- package/dist/device/lightstrip.d.ts.map +1 -1
- package/dist/device/lightstrip.js +46 -28
- package/dist/device/lightstrip.js.map +1 -1
- package/dist/device/lock.d.ts +6 -3
- package/dist/device/lock.d.ts.map +1 -1
- package/dist/device/lock.js +38 -25
- package/dist/device/lock.js.map +1 -1
- package/dist/device/meter.d.ts +6 -3
- package/dist/device/meter.d.ts.map +1 -1
- package/dist/device/meter.js +43 -27
- package/dist/device/meter.js.map +1 -1
- package/dist/device/meterplus.d.ts +6 -3
- package/dist/device/meterplus.d.ts.map +1 -1
- package/dist/device/meterplus.js +42 -27
- package/dist/device/meterplus.js.map +1 -1
- package/dist/device/motion.d.ts +6 -3
- package/dist/device/motion.d.ts.map +1 -1
- package/dist/device/motion.js +37 -24
- package/dist/device/motion.js.map +1 -1
- package/dist/device/plug.d.ts +6 -3
- package/dist/device/plug.d.ts.map +1 -1
- package/dist/device/plug.js +30 -17
- package/dist/device/plug.js.map +1 -1
- package/dist/device/robotvacuumcleaner.d.ts +6 -3
- package/dist/device/robotvacuumcleaner.d.ts.map +1 -1
- package/dist/device/robotvacuumcleaner.js +37 -22
- package/dist/device/robotvacuumcleaner.js.map +1 -1
- package/dist/device/waterdetector.d.ts +6 -3
- package/dist/device/waterdetector.d.ts.map +1 -1
- package/dist/device/waterdetector.js +44 -25
- package/dist/device/waterdetector.js.map +1 -1
- package/dist/homebridge-ui/public/index.html +2 -2
- package/dist/irdevice/airconditioner.d.ts +1 -3
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js +67 -177
- package/dist/irdevice/airconditioner.js.map +1 -1
- package/dist/irdevice/airpurifier.d.ts +0 -1
- package/dist/irdevice/airpurifier.d.ts.map +1 -1
- package/dist/irdevice/airpurifier.js +24 -53
- package/dist/irdevice/airpurifier.js.map +1 -1
- package/dist/irdevice/camera.d.ts.map +1 -1
- package/dist/irdevice/camera.js +12 -17
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js +22 -38
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +22 -10
- package/dist/irdevice/irdevice.d.ts.map +1 -1
- package/dist/irdevice/irdevice.js +94 -100
- package/dist/irdevice/irdevice.js.map +1 -1
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js +20 -38
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.d.ts.map +1 -1
- package/dist/irdevice/other.js +79 -77
- package/dist/irdevice/other.js.map +1 -1
- package/dist/irdevice/tv.d.ts.map +1 -1
- package/dist/irdevice/tv.js +38 -53
- package/dist/irdevice/tv.js.map +1 -1
- package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
- package/dist/irdevice/vacuumcleaner.js +11 -16
- package/dist/irdevice/vacuumcleaner.js.map +1 -1
- package/dist/irdevice/waterheater.d.ts.map +1 -1
- package/dist/irdevice/waterheater.js +11 -16
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/platform.d.ts +4 -6
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +564 -665
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +10 -8
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js.map +1 -1
- package/dist/types/bledevicestatus.d.ts +2 -1
- package/dist/types/bledevicestatus.d.ts.map +1 -1
- package/dist/types/devicestatus.d.ts +1 -1
- package/dist/types/devicestatus.d.ts.map +1 -1
- package/package.json +11 -11
- package/src/device/blindtilt.ts +64 -48
- package/src/device/bot.ts +79 -26
- package/src/device/ceilinglight.ts +57 -31
- package/src/device/colorbulb.ts +57 -43
- package/src/device/contact.ts +49 -31
- package/src/device/curtain.ts +51 -28
- package/src/device/device.ts +61 -135
- package/src/device/fan.ts +67 -33
- package/src/device/hub.ts +62 -33
- package/src/device/humidifier.ts +60 -33
- package/src/device/iosensor.ts +51 -30
- package/src/device/lightstrip.ts +52 -29
- package/src/device/lock.ts +55 -26
- package/src/device/meter.ts +60 -29
- package/src/device/meterplus.ts +56 -29
- package/src/device/motion.ts +50 -26
- package/src/device/plug.ts +38 -18
- package/src/device/robotvacuumcleaner.ts +53 -24
- package/src/device/waterdetector.ts +63 -27
- package/src/homebridge-ui/public/index.html +2 -2
- package/src/irdevice/airconditioner.ts +76 -165
- package/src/irdevice/airpurifier.ts +29 -49
- package/src/irdevice/camera.ts +13 -16
- package/src/irdevice/fan.ts +25 -35
- package/src/irdevice/irdevice.ts +97 -96
- package/src/irdevice/light.ts +21 -35
- package/src/irdevice/other.ts +79 -77
- package/src/irdevice/tv.ts +40 -51
- package/src/irdevice/vacuumcleaner.ts +12 -15
- package/src/irdevice/waterheater.ts +12 -15
- package/src/platform.ts +566 -696
- package/src/settings.ts +11 -8
- package/src/types/bledevicestatus.ts +4 -2
- package/src/types/devicestatus.ts +1 -1
- package/.github/npm-version-script.cjs +0 -81
package/src/device/hub.ts
CHANGED
|
@@ -36,6 +36,15 @@ export class Hub extends deviceBase {
|
|
|
36
36
|
CurrentTemperature: CharacteristicValue;
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
+
// OpenAPI
|
|
40
|
+
deviceStatus!: hub2Status;
|
|
41
|
+
|
|
42
|
+
//Webhook
|
|
43
|
+
webhookContext!: hub2WebhookContext;
|
|
44
|
+
|
|
45
|
+
// BLE
|
|
46
|
+
serviceData!: hub2ServiceData;
|
|
47
|
+
|
|
39
48
|
// Updates
|
|
40
49
|
hubUpdateInProgress!: boolean;
|
|
41
50
|
doHubUpdate!: Subject<void>;
|
|
@@ -46,6 +55,9 @@ export class Hub extends deviceBase {
|
|
|
46
55
|
device: device & devicesConfig,
|
|
47
56
|
) {
|
|
48
57
|
super(platform, accessory, device);
|
|
58
|
+
// Set category
|
|
59
|
+
accessory.category = this.hap.Categories.SENSOR;
|
|
60
|
+
|
|
49
61
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
50
62
|
this.doHubUpdate = new Subject();
|
|
51
63
|
this.hubUpdateInProgress = false;
|
|
@@ -53,7 +65,7 @@ export class Hub extends deviceBase {
|
|
|
53
65
|
// Initialize Temperature Sensor Service
|
|
54
66
|
if (device.hub?.hide_temperature) {
|
|
55
67
|
if (this.TemperatureSensor) {
|
|
56
|
-
this.debugLog(
|
|
68
|
+
this.debugLog('Removing Temperature Sensor Service');
|
|
57
69
|
this.TemperatureSensor.Service = this.accessory.getService(this.hap.Service.TemperatureSensor) as Service;
|
|
58
70
|
accessory.removeService(this.TemperatureSensor.Service);
|
|
59
71
|
}
|
|
@@ -85,7 +97,7 @@ export class Hub extends deviceBase {
|
|
|
85
97
|
// Initialize Humidity Sensor Service
|
|
86
98
|
if (device.hub?.hide_humidity) {
|
|
87
99
|
if (this.HumiditySensor) {
|
|
88
|
-
this.debugLog(
|
|
100
|
+
this.debugLog('Removing Humidity Sensor Service');
|
|
89
101
|
this.HumiditySensor.Service = this.accessory.getService(this.hap.Service.HumiditySensor) as Service;
|
|
90
102
|
accessory.removeService(this.HumiditySensor.Service);
|
|
91
103
|
}
|
|
@@ -113,7 +125,7 @@ export class Hub extends deviceBase {
|
|
|
113
125
|
// Initialize Light Sensor Service
|
|
114
126
|
if (device.hub?.hide_lightsensor) {
|
|
115
127
|
if (this.LightSensor) {
|
|
116
|
-
this.debugLog(
|
|
128
|
+
this.debugLog('Removing Light Sensor Service');
|
|
117
129
|
this.LightSensor.Service = this.accessory.getService(this.hap.Service.LightSensor) as Service;
|
|
118
130
|
accessory.removeService(this.LightSensor.Service);
|
|
119
131
|
}
|
|
@@ -139,12 +151,11 @@ export class Hub extends deviceBase {
|
|
|
139
151
|
}
|
|
140
152
|
|
|
141
153
|
// Retrieve initial values and updateHomekit
|
|
154
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
142
155
|
this.refreshStatus();
|
|
143
156
|
|
|
144
|
-
// Retrieve initial values and update Homekit
|
|
145
|
-
this.updateHomeKitCharacteristics();
|
|
146
|
-
|
|
147
157
|
//regisiter webhook event handler
|
|
158
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
148
159
|
this.registerWebhook();
|
|
149
160
|
|
|
150
161
|
// Start an update interval
|
|
@@ -156,39 +167,49 @@ export class Hub extends deviceBase {
|
|
|
156
167
|
|
|
157
168
|
}
|
|
158
169
|
|
|
159
|
-
async BLEparseStatus(
|
|
170
|
+
async BLEparseStatus(): Promise<void> {
|
|
160
171
|
await this.debugLog('BLEparseStatus');
|
|
172
|
+
await this.debugLog(`(temperature, humidity, lightLevel) = BLE:(${this.serviceData.temperature}, ${this.serviceData.humidity},`
|
|
173
|
+
+ ` ${this.serviceData.lightLevel}), current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity},`
|
|
174
|
+
+ ` ${this.LightSensor?.CurrentAmbientLightLevel})`);
|
|
175
|
+
|
|
161
176
|
// CurrentTemperature
|
|
162
177
|
if (!this.device.hub?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
163
|
-
this.TemperatureSensor.CurrentTemperature = serviceData.temperature;
|
|
178
|
+
this.TemperatureSensor.CurrentTemperature = this.serviceData.temperature;
|
|
164
179
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
|
|
165
180
|
}
|
|
181
|
+
|
|
166
182
|
// CurrentRelativeHumidity
|
|
167
183
|
if (!this.device.hub?.hide_humidity && this.HumiditySensor?.Service) {
|
|
168
|
-
this.HumiditySensor!.CurrentRelativeHumidity =
|
|
184
|
+
this.HumiditySensor!.CurrentRelativeHumidity = this.serviceData.humidity;
|
|
169
185
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
|
|
170
186
|
}
|
|
187
|
+
|
|
171
188
|
// CurrentAmbientLightLevel
|
|
172
189
|
if (!this.device.hub?.hide_lightsensor && this.LightSensor?.Service) {
|
|
173
190
|
const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
|
|
174
191
|
const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
|
|
175
|
-
const lightLevel =
|
|
192
|
+
const lightLevel = this.serviceData.lightLevel;
|
|
176
193
|
this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 19);
|
|
177
|
-
await this.debugLog(`LightLevel: ${serviceData.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
194
|
+
await this.debugLog(`LightLevel: ${this.serviceData.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
178
195
|
}
|
|
179
196
|
}
|
|
180
197
|
|
|
181
|
-
async openAPIparseStatus(
|
|
198
|
+
async openAPIparseStatus(): Promise<void> {
|
|
182
199
|
await this.debugLog('openAPIparseStatus');
|
|
200
|
+
await this.debugLog(`(temperature, humidity, lightLevel) = OpenAPI:(${this.deviceStatus.temperature}, ${this.deviceStatus.humidity},`
|
|
201
|
+
+ ` ${this.deviceStatus.lightLevel}), current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity},`
|
|
202
|
+
+ ` ${this.LightSensor?.CurrentAmbientLightLevel})`);
|
|
203
|
+
|
|
183
204
|
// CurrentRelativeHumidity
|
|
184
205
|
if (!this.device.hub?.hide_humidity && this.HumiditySensor?.Service) {
|
|
185
|
-
this.HumiditySensor.CurrentRelativeHumidity = deviceStatus.humidity;
|
|
206
|
+
this.HumiditySensor.CurrentRelativeHumidity = this.deviceStatus.humidity;
|
|
186
207
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`);
|
|
187
208
|
}
|
|
188
209
|
|
|
189
210
|
// CurrentTemperature
|
|
190
211
|
if (!this.device.hub?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
191
|
-
this.TemperatureSensor.CurrentTemperature = deviceStatus.temperature;
|
|
212
|
+
this.TemperatureSensor.CurrentTemperature = this.deviceStatus.temperature;
|
|
192
213
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`);
|
|
193
214
|
}
|
|
194
215
|
|
|
@@ -196,15 +217,15 @@ export class Hub extends deviceBase {
|
|
|
196
217
|
if (!this.device.hub?.hide_lightsensor && this.LightSensor?.Service) {
|
|
197
218
|
const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
|
|
198
219
|
const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
|
|
199
|
-
const lightLevel =
|
|
220
|
+
const lightLevel = this.deviceStatus.lightLevel;
|
|
200
221
|
this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(lightLevel, set_minLux, set_maxLux, 19);
|
|
201
|
-
await this.debugLog(`LightLevel: ${deviceStatus.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
|
|
222
|
+
await this.debugLog(`LightLevel: ${this.deviceStatus.lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`);
|
|
202
223
|
}
|
|
203
224
|
|
|
204
225
|
// Firmware Version
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
226
|
+
if (this.deviceStatus.version) {
|
|
227
|
+
const version = this.deviceStatus.version.toString();
|
|
228
|
+
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
208
229
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
209
230
|
this.accessory
|
|
210
231
|
.getService(this.hap.Service.AccessoryInformation)!
|
|
@@ -212,36 +233,41 @@ export class Hub extends deviceBase {
|
|
|
212
233
|
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
213
234
|
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
214
235
|
.updateValue(deviceVersion);
|
|
215
|
-
this.accessory.context.
|
|
216
|
-
await this.debugSuccessLog(`
|
|
236
|
+
this.accessory.context.version = deviceVersion;
|
|
237
|
+
await this.debugSuccessLog(`version: ${this.accessory.context.version}`);
|
|
217
238
|
}
|
|
218
239
|
}
|
|
219
240
|
|
|
220
|
-
async parseStatusWebhook(
|
|
241
|
+
async parseStatusWebhook(): Promise<void> {
|
|
221
242
|
await this.debugLog('parseStatusWebhook');
|
|
222
|
-
await this.debugLog(`(scale, temperature, humidity, lightLevel) = Webhook:(${
|
|
223
|
-
|
|
243
|
+
await this.debugLog(`(scale, temperature, humidity, lightLevel) = Webhook:(${this.webhookContext.scale},`
|
|
244
|
+
+ ` ${convertUnits(this.webhookContext.temperature, this.webhookContext.scale, this.device.hub?.convertUnitTo)},`
|
|
245
|
+
+ ` ${this.webhookContext.humidity}, ${this.webhookContext.lightLevel}), current:(${this.TemperatureSensor?.CurrentTemperature},`
|
|
224
246
|
+ ` ${this.HumiditySensor?.CurrentRelativeHumidity}, ${this.LightSensor?.CurrentAmbientLightLevel})`);
|
|
225
247
|
// Check if the scale is not CELSIUS
|
|
226
|
-
if (
|
|
227
|
-
await this.warnLog(`received a non-CELSIUS Webhook scale: ${
|
|
248
|
+
if (this.webhookContext.scale !== 'CELSIUS' && this.device.hub?.convertUnitTo === undefined) {
|
|
249
|
+
await this.warnLog(`received a non-CELSIUS Webhook scale: ${this.webhookContext.scale}, Use the *convertUnitsTo* config under Hub settings,`
|
|
228
250
|
+ ' if displaying incorrectly in HomeKit.');
|
|
229
251
|
}
|
|
252
|
+
|
|
230
253
|
// CurrentRelativeHumidity
|
|
231
254
|
if (!this.device.hub?.hide_humidity && this.HumiditySensor?.Service) {
|
|
232
|
-
this.HumiditySensor.CurrentRelativeHumidity =
|
|
255
|
+
this.HumiditySensor.CurrentRelativeHumidity = this.webhookContext.humidity;
|
|
233
256
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}`);
|
|
234
257
|
}
|
|
258
|
+
|
|
235
259
|
// CurrentTemperature
|
|
236
260
|
if (!this.device.hub?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
237
|
-
this.TemperatureSensor.CurrentTemperature = convertUnits(
|
|
261
|
+
this.TemperatureSensor.CurrentTemperature = convertUnits(this.webhookContext.temperature, this.webhookContext.scale,
|
|
262
|
+
this.device.hub?.convertUnitTo);
|
|
238
263
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
|
|
239
264
|
}
|
|
265
|
+
|
|
240
266
|
// CurrentAmbientLightLevel
|
|
241
267
|
if (!this.device.hub?.hide_lightsensor && this.LightSensor?.Service) {
|
|
242
268
|
const set_minLux = this.device.blindTilt?.set_minLux ?? 1;
|
|
243
269
|
const set_maxLux = this.device.blindTilt?.set_maxLux ?? 6001;
|
|
244
|
-
this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(
|
|
270
|
+
this.LightSensor.CurrentAmbientLightLevel = await this.getLightLevel(this.webhookContext.lightLevel, set_minLux, set_maxLux, 19);
|
|
245
271
|
await this.debugLog(`CurrentAmbientLightLevel: ${this.LightSensor.CurrentAmbientLightLevel}`);
|
|
246
272
|
}
|
|
247
273
|
}
|
|
@@ -272,10 +298,11 @@ export class Hub extends deviceBase {
|
|
|
272
298
|
// Start to monitor advertisement packets
|
|
273
299
|
(async () => {
|
|
274
300
|
// Start to monitor advertisement packets
|
|
275
|
-
const serviceData = await this.monitorAdvertisementPackets(switchbot) as
|
|
301
|
+
const serviceData = await this.monitorAdvertisementPackets(switchbot) as hub2ServiceData;
|
|
276
302
|
// Update HomeKit
|
|
277
303
|
if (serviceData.model === SwitchBotBLEModel.Hub2 && serviceData.modelName === SwitchBotBLEModelName.Hub2) {
|
|
278
|
-
|
|
304
|
+
this.serviceData = serviceData;
|
|
305
|
+
await this.BLEparseStatus();
|
|
279
306
|
await this.updateHomeKitCharacteristics();
|
|
280
307
|
} else {
|
|
281
308
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -293,7 +320,8 @@ export class Hub extends deviceBase {
|
|
|
293
320
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
294
321
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
295
322
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
296
|
-
|
|
323
|
+
this.deviceStatus = deviceStatus.body;
|
|
324
|
+
await this.openAPIparseStatus();
|
|
297
325
|
await this.updateHomeKitCharacteristics();
|
|
298
326
|
} else {
|
|
299
327
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -311,7 +339,8 @@ export class Hub extends deviceBase {
|
|
|
311
339
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: hub2WebhookContext) => {
|
|
312
340
|
try {
|
|
313
341
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
314
|
-
|
|
342
|
+
this.webhookContext = context;
|
|
343
|
+
await this.parseStatusWebhook();
|
|
315
344
|
await this.updateHomeKitCharacteristics();
|
|
316
345
|
} catch (e: any) {
|
|
317
346
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
package/src/device/humidifier.ts
CHANGED
|
@@ -39,6 +39,15 @@ export class Humidifier extends deviceBase {
|
|
|
39
39
|
CurrentTemperature: CharacteristicValue;
|
|
40
40
|
};
|
|
41
41
|
|
|
42
|
+
// OpenAPI
|
|
43
|
+
deviceStatus!: humidifierStatus;
|
|
44
|
+
|
|
45
|
+
//Webhook
|
|
46
|
+
webhookContext!: humidifierWebhookContext;
|
|
47
|
+
|
|
48
|
+
// BLE
|
|
49
|
+
serviceData!: humidifierServiceData;
|
|
50
|
+
|
|
42
51
|
// Updates
|
|
43
52
|
humidifierUpdateInProgress!: boolean;
|
|
44
53
|
doHumidifierUpdate!: Subject<void>;
|
|
@@ -49,6 +58,9 @@ export class Humidifier extends deviceBase {
|
|
|
49
58
|
device: device & devicesConfig,
|
|
50
59
|
) {
|
|
51
60
|
super(platform, accessory, device);
|
|
61
|
+
// Set category
|
|
62
|
+
accessory.category = this.hap.Categories.AIR_HUMIDIFIER;
|
|
63
|
+
|
|
52
64
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
53
65
|
this.doHumidifierUpdate = new Subject();
|
|
54
66
|
this.humidifierUpdateInProgress = false;
|
|
@@ -110,7 +122,7 @@ export class Humidifier extends deviceBase {
|
|
|
110
122
|
// Initialize the Temperature Sensor Service
|
|
111
123
|
if (device.humidifier?.hide_temperature) {
|
|
112
124
|
if (this.TemperatureSensor) {
|
|
113
|
-
this.debugLog(
|
|
125
|
+
this.debugLog('Removing Temperature Sensor Service');
|
|
114
126
|
this.TemperatureSensor!.Service = this.accessory.getService(this.hap.Service.TemperatureSensor) as Service;
|
|
115
127
|
accessory.removeService(this.TemperatureSensor!.Service);
|
|
116
128
|
}
|
|
@@ -139,12 +151,11 @@ export class Humidifier extends deviceBase {
|
|
|
139
151
|
}
|
|
140
152
|
|
|
141
153
|
// Retrieve initial values and updateHomekit
|
|
154
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
142
155
|
this.refreshStatus();
|
|
143
156
|
|
|
144
|
-
// Retrieve initial values and updateHomekit
|
|
145
|
-
this.updateHomeKitCharacteristics();
|
|
146
|
-
|
|
147
157
|
//regisiter webhook event handler
|
|
158
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
148
159
|
this.registerWebhook();
|
|
149
160
|
|
|
150
161
|
// Start an update interval
|
|
@@ -174,18 +185,23 @@ export class Humidifier extends deviceBase {
|
|
|
174
185
|
});
|
|
175
186
|
}
|
|
176
187
|
|
|
177
|
-
async BLEparseStatus(
|
|
188
|
+
async BLEparseStatus(): Promise<void> {
|
|
178
189
|
await this.debugLog('BLEparseStatus');
|
|
190
|
+
await this.debugLog(`(onState, percentage, autoMode) = BLE:(${this.serviceData.onState}, ${this.serviceData.percentage},`
|
|
191
|
+
+ ` ${this.serviceData.autoMode}), current:(${this.HumidifierDehumidifier.Active}, ${this.HumidifierDehumidifier.CurrentRelativeHumidity},`
|
|
192
|
+
+ ` ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState}, ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold})`,
|
|
193
|
+
);
|
|
194
|
+
|
|
179
195
|
// Active
|
|
180
|
-
this.HumidifierDehumidifier.Active = serviceData.onState ? this.hap.Characteristic.Active.ACTIVE : this.hap.Characteristic.Active.INACTIVE;
|
|
196
|
+
this.HumidifierDehumidifier.Active = this.serviceData.onState ? this.hap.Characteristic.Active.ACTIVE : this.hap.Characteristic.Active.INACTIVE;
|
|
181
197
|
await this.debugLog(`Active: ${this.HumidifierDehumidifier.Active}`);
|
|
182
198
|
|
|
183
199
|
// Current Relative Humidity
|
|
184
|
-
this.HumidifierDehumidifier.CurrentRelativeHumidity = serviceData.percentage;
|
|
200
|
+
this.HumidifierDehumidifier.CurrentRelativeHumidity = this.serviceData.percentage;
|
|
185
201
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
186
202
|
|
|
187
203
|
// Target Humidifier Dehumidifier State
|
|
188
|
-
switch (serviceData.autoMode) {
|
|
204
|
+
switch (this.serviceData.autoMode) {
|
|
189
205
|
case true:
|
|
190
206
|
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState =
|
|
191
207
|
this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER;
|
|
@@ -194,7 +210,7 @@ export class Humidifier extends deviceBase {
|
|
|
194
210
|
break;
|
|
195
211
|
default:
|
|
196
212
|
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
197
|
-
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = serviceData.percentage > 100 ? 100 : serviceData.percentage;
|
|
213
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = this.serviceData.percentage > 100 ? 100 : this.serviceData.percentage;
|
|
198
214
|
if (this.HumidifierDehumidifier.CurrentRelativeHumidity > this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold) {
|
|
199
215
|
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.IDLE;
|
|
200
216
|
} else if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
@@ -208,24 +224,30 @@ export class Humidifier extends deviceBase {
|
|
|
208
224
|
+ ` CurrentHumidifierDehumidifierState: ${this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState}`);
|
|
209
225
|
}
|
|
210
226
|
|
|
211
|
-
async openAPIparseStatus(
|
|
227
|
+
async openAPIparseStatus(): Promise<void> {
|
|
212
228
|
await this.debugLog('openAPIparseStatus');
|
|
229
|
+
await this.debugLog(`(power, auto, temperature, lackWater, nebulizationEfficiency, version) = OpenAPI:(${this.deviceStatus.power},`
|
|
230
|
+
+ ` ${this.deviceStatus.auto}, ${this.deviceStatus.temperature}, ${this.deviceStatus.lackWater},`
|
|
231
|
+
+ ` ${this.deviceStatus.nebulizationEfficiency}, ${this.deviceStatus.version}), current:(${this.HumidifierDehumidifier.Active},`
|
|
232
|
+
+ ` ${this.HumidifierDehumidifier.CurrentRelativeHumidity}, ${this.HumidifierDehumidifier.TargetHumidifierDehumidifierState},`
|
|
233
|
+
+ ` ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold})`);
|
|
234
|
+
|
|
213
235
|
// Active
|
|
214
|
-
this.HumidifierDehumidifier.Active = deviceStatus.power === 'on'
|
|
236
|
+
this.HumidifierDehumidifier.Active = this.deviceStatus.power === 'on'
|
|
215
237
|
? this.hap.Characteristic.Active.ACTIVE : this.hap.Characteristic.Active.INACTIVE;
|
|
216
238
|
await this.debugLog(`Active: ${this.HumidifierDehumidifier.Active}`);
|
|
217
239
|
|
|
218
240
|
// Current Relative Humidity
|
|
219
|
-
this.HumidifierDehumidifier.CurrentRelativeHumidity = deviceStatus.temperature!;
|
|
241
|
+
this.HumidifierDehumidifier.CurrentRelativeHumidity = this.deviceStatus.temperature!;
|
|
220
242
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
221
243
|
|
|
222
244
|
// Current Temperature
|
|
223
245
|
if (!this.device.humidifier?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
224
|
-
this.TemperatureSensor.CurrentTemperature = deviceStatus.temperature;
|
|
246
|
+
this.TemperatureSensor.CurrentTemperature = this.deviceStatus.temperature;
|
|
225
247
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
|
|
226
248
|
}
|
|
227
249
|
// Target Humidifier Dehumidifier State
|
|
228
|
-
switch (deviceStatus.auto) {
|
|
250
|
+
switch (this.deviceStatus.auto) {
|
|
229
251
|
case true:
|
|
230
252
|
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState =
|
|
231
253
|
this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER_OR_DEHUMIDIFIER;
|
|
@@ -234,8 +256,8 @@ export class Humidifier extends deviceBase {
|
|
|
234
256
|
break;
|
|
235
257
|
default:
|
|
236
258
|
this.HumidifierDehumidifier.TargetHumidifierDehumidifierState = this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER;
|
|
237
|
-
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = deviceStatus.nebulizationEfficiency > 100
|
|
238
|
-
? 100 : deviceStatus.nebulizationEfficiency;
|
|
259
|
+
this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold = this.deviceStatus.nebulizationEfficiency > 100
|
|
260
|
+
? 100 : this.deviceStatus.nebulizationEfficiency;
|
|
239
261
|
if (this.HumidifierDehumidifier.CurrentRelativeHumidity > this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold) {
|
|
240
262
|
this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState = this.hap.Characteristic.CurrentHumidifierDehumidifierState.IDLE;
|
|
241
263
|
} else if (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.INACTIVE) {
|
|
@@ -249,7 +271,7 @@ export class Humidifier extends deviceBase {
|
|
|
249
271
|
+ ` CurrentHumidifierDehumidifierState: ${this.HumidifierDehumidifier.CurrentHumidifierDehumidifierState}`);
|
|
250
272
|
|
|
251
273
|
// Water Level
|
|
252
|
-
if (deviceStatus.lackWater) {
|
|
274
|
+
if (this.deviceStatus.lackWater) {
|
|
253
275
|
this.HumidifierDehumidifier.WaterLevel = 0;
|
|
254
276
|
} else {
|
|
255
277
|
this.HumidifierDehumidifier.WaterLevel = 100;
|
|
@@ -257,8 +279,8 @@ export class Humidifier extends deviceBase {
|
|
|
257
279
|
await this.debugLog(`WaterLevel: ${this.HumidifierDehumidifier.WaterLevel}`);
|
|
258
280
|
|
|
259
281
|
// Firmware Version
|
|
260
|
-
if (deviceStatus.version) {
|
|
261
|
-
const version = deviceStatus.version.toString();
|
|
282
|
+
if (this.deviceStatus.version) {
|
|
283
|
+
const version = this.deviceStatus.version.toString();
|
|
262
284
|
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
263
285
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
264
286
|
this.accessory
|
|
@@ -267,23 +289,25 @@ export class Humidifier extends deviceBase {
|
|
|
267
289
|
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
268
290
|
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
269
291
|
.updateValue(deviceVersion);
|
|
270
|
-
this.accessory.context.
|
|
271
|
-
await this.debugSuccessLog(`
|
|
292
|
+
this.accessory.context.version = deviceVersion;
|
|
293
|
+
await this.debugSuccessLog(`version: ${this.accessory.context.version}`);
|
|
272
294
|
}
|
|
273
295
|
}
|
|
274
296
|
|
|
275
|
-
async parseStatusWebhook(
|
|
297
|
+
async parseStatusWebhook(): Promise<void> {
|
|
276
298
|
await this.debugLog('parseStatusWebhook');
|
|
277
|
-
await this.debugLog(`(temperature, humidity) = Webhook:(${convertUnits(
|
|
278
|
-
|
|
299
|
+
await this.debugLog(`(temperature, humidity) = Webhook:(${convertUnits(this.webhookContext.temperature, this.webhookContext.scale,
|
|
300
|
+
this.device.iosensor?.convertUnitTo)}, ${this.webhookContext.humidity}), current:(${this.TemperatureSensor?.CurrentTemperature},`
|
|
301
|
+
+ ` ${this.HumidifierDehumidifier.CurrentRelativeHumidity})`);
|
|
279
302
|
|
|
280
303
|
// CurrentRelativeHumidity
|
|
281
|
-
this.HumidifierDehumidifier.CurrentRelativeHumidity =
|
|
304
|
+
this.HumidifierDehumidifier.CurrentRelativeHumidity = this.webhookContext.humidity;
|
|
282
305
|
await this.debugLog(`CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
283
306
|
|
|
284
307
|
// CurrentTemperature
|
|
285
308
|
if (!this.device.humidifier?.hide_temperature && this.TemperatureSensor?.Service) {
|
|
286
|
-
this.TemperatureSensor.CurrentTemperature = convertUnits(
|
|
309
|
+
this.TemperatureSensor.CurrentTemperature = convertUnits(this.webhookContext.temperature, this.webhookContext.scale,
|
|
310
|
+
this.device.iosensor?.convertUnitTo);
|
|
287
311
|
await this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}`);
|
|
288
312
|
}
|
|
289
313
|
}
|
|
@@ -314,10 +338,11 @@ export class Humidifier extends deviceBase {
|
|
|
314
338
|
// Start to monitor advertisement packets
|
|
315
339
|
(async () => {
|
|
316
340
|
// Start to monitor advertisement packets
|
|
317
|
-
const serviceData= await this.monitorAdvertisementPackets(switchbot) as
|
|
341
|
+
const serviceData = await this.monitorAdvertisementPackets(switchbot) as humidifierServiceData;
|
|
318
342
|
// Update HomeKit
|
|
319
343
|
if (serviceData.model === SwitchBotBLEModel.Humidifier && serviceData.modelName === SwitchBotBLEModelName.Humidifier) {
|
|
320
|
-
|
|
344
|
+
this.serviceData = serviceData;
|
|
345
|
+
await this.BLEparseStatus();
|
|
321
346
|
await this.updateHomeKitCharacteristics();
|
|
322
347
|
} else {
|
|
323
348
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -335,7 +360,8 @@ export class Humidifier extends deviceBase {
|
|
|
335
360
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
336
361
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
337
362
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
338
|
-
|
|
363
|
+
this.deviceStatus = deviceStatus.body;
|
|
364
|
+
await this.openAPIparseStatus();
|
|
339
365
|
await this.updateHomeKitCharacteristics();
|
|
340
366
|
} else {
|
|
341
367
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -353,7 +379,8 @@ export class Humidifier extends deviceBase {
|
|
|
353
379
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: humidifierWebhookContext) => {
|
|
354
380
|
try {
|
|
355
381
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
356
|
-
|
|
382
|
+
this.webhookContext = context;
|
|
383
|
+
await this.parseStatusWebhook();
|
|
357
384
|
await this.updateHomeKitCharacteristics();
|
|
358
385
|
} catch (e: any) {
|
|
359
386
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
|
@@ -414,8 +441,8 @@ export class Humidifier extends deviceBase {
|
|
|
414
441
|
}
|
|
415
442
|
} else {
|
|
416
443
|
await this.debugLog(`No changes (BLEpushChanges), Active: ${this.HumidifierDehumidifier.Active},`
|
|
417
|
-
|
|
418
|
-
|
|
444
|
+
+ ` RelativeHumidityHumidifierThreshold: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold},`
|
|
445
|
+
+ ` CurrentRelativeHumidity: ${this.HumidifierDehumidifier.CurrentRelativeHumidity}`);
|
|
419
446
|
}
|
|
420
447
|
}
|
|
421
448
|
|
|
@@ -423,7 +450,7 @@ export class Humidifier extends deviceBase {
|
|
|
423
450
|
await this.debugLog('openAPIpushChanges');
|
|
424
451
|
if ((this.HumidifierDehumidifier.TargetHumidifierDehumidifierState === this.hap.Characteristic.TargetHumidifierDehumidifierState.HUMIDIFIER)
|
|
425
452
|
&& (this.HumidifierDehumidifier.Active === this.hap.Characteristic.Active.ACTIVE)
|
|
426
|
-
|
|
453
|
+
&& (this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold !== this.HumidifierDehumidifier.CurrentRelativeHumidity)) {
|
|
427
454
|
await this.debugLog(`Auto Off, RelativeHumidityHumidifierThreshold: ${this.HumidifierDehumidifier.RelativeHumidityHumidifierThreshold}!`);
|
|
428
455
|
const bodyChange = JSON.stringify({
|
|
429
456
|
command: 'setMode',
|