@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/plug.ts
CHANGED
|
@@ -21,6 +21,15 @@ export class Plug extends deviceBase {
|
|
|
21
21
|
On: CharacteristicValue;
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
+
// OpenAPI
|
|
25
|
+
deviceStatus!: plugStatus | plugMiniStatus;
|
|
26
|
+
|
|
27
|
+
//Webhook
|
|
28
|
+
webhookContext!: plugWebhookContext | plugMiniUSWebhookContext | plugMiniJPWebhookContext;
|
|
29
|
+
|
|
30
|
+
// BLE
|
|
31
|
+
serviceData!: plugMiniUSServiceData | plugMiniJPServiceData;
|
|
32
|
+
|
|
24
33
|
// Updates
|
|
25
34
|
plugUpdateInProgress!: boolean;
|
|
26
35
|
doPlugUpdate!: Subject<void>;
|
|
@@ -31,6 +40,9 @@ export class Plug extends deviceBase {
|
|
|
31
40
|
device: device & devicesConfig,
|
|
32
41
|
) {
|
|
33
42
|
super(platform, accessory, device);
|
|
43
|
+
// Set category
|
|
44
|
+
accessory.category = this.hap.Categories.OUTLET;
|
|
45
|
+
|
|
34
46
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
35
47
|
this.doPlugUpdate = new Subject();
|
|
36
48
|
this.plugUpdateInProgress = false;
|
|
@@ -54,12 +66,11 @@ export class Plug extends deviceBase {
|
|
|
54
66
|
.onSet(this.OnSet.bind(this));
|
|
55
67
|
|
|
56
68
|
// Retrieve initial values and updateHomekit
|
|
69
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
57
70
|
this.refreshStatus();
|
|
58
71
|
|
|
59
|
-
// Update Homekit
|
|
60
|
-
this.updateHomeKitCharacteristics();
|
|
61
|
-
|
|
62
72
|
//regisiter webhook event handler
|
|
73
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
63
74
|
this.registerWebhook();
|
|
64
75
|
|
|
65
76
|
// Start an update interval
|
|
@@ -89,22 +100,27 @@ export class Plug extends deviceBase {
|
|
|
89
100
|
});
|
|
90
101
|
}
|
|
91
102
|
|
|
92
|
-
async BLEparseStatus(
|
|
103
|
+
async BLEparseStatus(): Promise<void> {
|
|
93
104
|
await this.debugLog('BLEparseStatus');
|
|
105
|
+
await this.debugLog(`(powerState) = BLE: (${this.serviceData.state}), current:(${this.Outlet.On})`);
|
|
106
|
+
|
|
94
107
|
// On
|
|
95
|
-
this.Outlet.On = serviceData.state === 'on' ? true : false;
|
|
108
|
+
this.Outlet.On = this.serviceData.state === 'on' ? true : false;
|
|
96
109
|
await this.debugLog(`On: ${this.Outlet.On}`);
|
|
97
110
|
}
|
|
98
111
|
|
|
99
|
-
async openAPIparseStatus(
|
|
112
|
+
async openAPIparseStatus() {
|
|
100
113
|
await this.debugLog('openAPIparseStatus');
|
|
114
|
+
await this.debugLog(`(powerState) = OpenAPI: (${this.deviceStatus.power}), current:(${this.Outlet.On})`);
|
|
115
|
+
|
|
101
116
|
// On
|
|
102
|
-
this.Outlet.On = deviceStatus.power === 'on' ? true : false;
|
|
117
|
+
this.Outlet.On = this.deviceStatus.power === 'on' ? true : false;
|
|
103
118
|
await this.debugLog(`On: ${this.Outlet.On}`);
|
|
119
|
+
|
|
104
120
|
// Firmware Version
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
121
|
+
if (this.deviceStatus.version) {
|
|
122
|
+
const version = this.deviceStatus.version.toString();
|
|
123
|
+
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
108
124
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
109
125
|
this.accessory
|
|
110
126
|
.getService(this.hap.Service.AccessoryInformation)!
|
|
@@ -112,16 +128,17 @@ export class Plug extends deviceBase {
|
|
|
112
128
|
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
113
129
|
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
114
130
|
.updateValue(deviceVersion);
|
|
115
|
-
this.accessory.context.
|
|
116
|
-
await this.debugSuccessLog(`
|
|
131
|
+
this.accessory.context.version = deviceVersion;
|
|
132
|
+
await this.debugSuccessLog(`version: ${this.accessory.context.version}`);
|
|
117
133
|
}
|
|
118
134
|
}
|
|
119
135
|
|
|
120
|
-
async parseStatusWebhook(
|
|
136
|
+
async parseStatusWebhook(): Promise<void> {
|
|
121
137
|
await this.debugLog('parseStatusWebhook');
|
|
122
|
-
await this.debugLog(`(powerState) = Webhook: (${
|
|
138
|
+
await this.debugLog(`(powerState) = Webhook: (${this.webhookContext.powerState}), current:(${this.Outlet.On})`);
|
|
139
|
+
|
|
123
140
|
// On
|
|
124
|
-
this.Outlet.On =
|
|
141
|
+
this.Outlet.On = this.webhookContext.powerState === 'ON' ? true : false;
|
|
125
142
|
await this.debugLog(`On: ${this.Outlet.On}`);
|
|
126
143
|
}
|
|
127
144
|
|
|
@@ -155,7 +172,8 @@ export class Plug extends deviceBase {
|
|
|
155
172
|
// Update HomeKit
|
|
156
173
|
if ((serviceData.model === SwitchBotBLEModel.PlugMiniUS || SwitchBotBLEModel.PlugMiniJP)
|
|
157
174
|
&& serviceData.modelName === (SwitchBotBLEModelName.PlugMini || SwitchBotBLEModelName.PlugMini)) {
|
|
158
|
-
|
|
175
|
+
this.serviceData = serviceData;
|
|
176
|
+
await this.BLEparseStatus();
|
|
159
177
|
await this.updateHomeKitCharacteristics();
|
|
160
178
|
} else {
|
|
161
179
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -173,7 +191,8 @@ export class Plug extends deviceBase {
|
|
|
173
191
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
174
192
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
175
193
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
176
|
-
|
|
194
|
+
this.deviceStatus = deviceStatus.body;
|
|
195
|
+
await this.openAPIparseStatus();
|
|
177
196
|
await this.updateHomeKitCharacteristics();
|
|
178
197
|
} else {
|
|
179
198
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -192,7 +211,8 @@ export class Plug extends deviceBase {
|
|
|
192
211
|
| plugMiniJPWebhookContext) => {
|
|
193
212
|
try {
|
|
194
213
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
195
|
-
|
|
214
|
+
this.webhookContext = context;
|
|
215
|
+
await this.parseStatusWebhook();
|
|
196
216
|
await this.updateHomeKitCharacteristics();
|
|
197
217
|
} catch (e: any) {
|
|
198
218
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
|
@@ -35,6 +35,15 @@ export class RobotVacuumCleaner extends deviceBase {
|
|
|
35
35
|
ChargingState: CharacteristicValue;
|
|
36
36
|
};
|
|
37
37
|
|
|
38
|
+
// OpenAPI
|
|
39
|
+
deviceStatus!: robotVacuumCleanerS1Status | robotVacuumCleanerS1PlusStatus | floorCleaningRobotS10Status;
|
|
40
|
+
|
|
41
|
+
//Webhook
|
|
42
|
+
webhookContext!: robotVacuumCleanerS1WebhookContext | robotVacuumCleanerS1PlusWebhookContext | floorCleaningRobotS10WebhookContext;
|
|
43
|
+
|
|
44
|
+
// BLE
|
|
45
|
+
serviceData!: robotVacuumCleanerServiceData;
|
|
46
|
+
|
|
38
47
|
// Updates
|
|
39
48
|
robotVacuumCleanerUpdateInProgress!: boolean;
|
|
40
49
|
doRobotVacuumCleanerUpdate!: Subject<void>;
|
|
@@ -45,6 +54,9 @@ export class RobotVacuumCleaner extends deviceBase {
|
|
|
45
54
|
device: device & devicesConfig,
|
|
46
55
|
) {
|
|
47
56
|
super(platform, accessory, device);
|
|
57
|
+
// Set category
|
|
58
|
+
accessory.category = this.hap.Categories.OTHER;
|
|
59
|
+
|
|
48
60
|
// this is subject we use to track when we need to POST changes to the SwitchBot API
|
|
49
61
|
this.doRobotVacuumCleanerUpdate = new Subject();
|
|
50
62
|
this.robotVacuumCleanerUpdateInProgress = false;
|
|
@@ -115,12 +127,11 @@ export class RobotVacuumCleaner extends deviceBase {
|
|
|
115
127
|
});
|
|
116
128
|
|
|
117
129
|
// Retrieve initial values and updateHomekit
|
|
130
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
118
131
|
this.refreshStatus();
|
|
119
132
|
|
|
120
|
-
// Update Homekit
|
|
121
|
-
this.updateHomeKitCharacteristics();
|
|
122
|
-
|
|
123
133
|
//regisiter webhook event handler
|
|
134
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
124
135
|
this.registerWebhook();
|
|
125
136
|
|
|
126
137
|
// Start an update interval
|
|
@@ -150,39 +161,51 @@ export class RobotVacuumCleaner extends deviceBase {
|
|
|
150
161
|
});
|
|
151
162
|
}
|
|
152
163
|
|
|
153
|
-
async BLEparseStatus(
|
|
164
|
+
async BLEparseStatus(): Promise<void> {
|
|
154
165
|
await this.debugLog('BLEparseStatus');
|
|
166
|
+
await this.debugLog(`(state, battery) = BLE: (${this.serviceData.state}, ${this.serviceData.battery}),`
|
|
167
|
+
+ ` current: (${this.LightBulb.On}, ${this.Battery.BatteryLevel})`);
|
|
168
|
+
|
|
155
169
|
// On
|
|
156
|
-
this.LightBulb.On = serviceData.state === 'on' ? true : false;
|
|
170
|
+
this.LightBulb.On = this.serviceData.state === 'on' ? true : false;
|
|
157
171
|
await this.debugLog(`On: ${this.LightBulb.On}`);
|
|
172
|
+
|
|
158
173
|
// BatteryLevel
|
|
159
|
-
this.Battery.BatteryLevel =
|
|
174
|
+
this.Battery.BatteryLevel = this.serviceData.battery;
|
|
160
175
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
176
|
+
|
|
161
177
|
// StatusLowBattery
|
|
162
178
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
163
179
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
164
180
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
165
181
|
}
|
|
166
182
|
|
|
167
|
-
async openAPIparseStatus(
|
|
183
|
+
async openAPIparseStatus() {
|
|
168
184
|
await this.debugLog('openAPIparseStatus');
|
|
185
|
+
await this.debugLog(`(onlineStatus, battery, workingStatus) = API: (${this.deviceStatus.onlineStatus}, ${this.deviceStatus.battery},`
|
|
186
|
+
+ ` ${this.deviceStatus.workingStatus}), current: (${this.LightBulb.On}, ${this.Battery.BatteryLevel}, ${this.Battery.ChargingState})`);
|
|
187
|
+
|
|
169
188
|
// On
|
|
170
|
-
this.LightBulb.On = deviceStatus.onlineStatus === 'online' ? true : false;
|
|
189
|
+
this.LightBulb.On = this.deviceStatus.onlineStatus === 'online' ? true : false;
|
|
171
190
|
await this.debugLog(`On: ${this.LightBulb.On}`);
|
|
191
|
+
|
|
172
192
|
// BatteryLevel
|
|
173
|
-
this.Battery.BatteryLevel =
|
|
193
|
+
this.Battery.BatteryLevel = this.deviceStatus.battery;
|
|
174
194
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
195
|
+
|
|
175
196
|
// StatusLowBattery
|
|
176
197
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
177
198
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
178
199
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
200
|
+
|
|
179
201
|
// ChargingState
|
|
180
|
-
this.Battery.ChargingState = deviceStatus.workingStatus === 'Charging'
|
|
202
|
+
this.Battery.ChargingState = this.deviceStatus.workingStatus === 'Charging'
|
|
181
203
|
? this.hap.Characteristic.ChargingState.CHARGING : this.hap.Characteristic.ChargingState.NOT_CHARGING;
|
|
182
204
|
await this.debugLog(`ChargingState: ${this.Battery.ChargingState}`);
|
|
205
|
+
|
|
183
206
|
// Firmware Version
|
|
184
|
-
if (deviceStatus.version) {
|
|
185
|
-
const version = deviceStatus.version.toString();
|
|
207
|
+
if (this.deviceStatus.version) {
|
|
208
|
+
const version = this.deviceStatus.version.toString();
|
|
186
209
|
await this.debugLog(`Firmware Version: ${version.replace(/^V|-.*$/g, '')}`);
|
|
187
210
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
188
211
|
this.accessory
|
|
@@ -191,28 +214,31 @@ export class RobotVacuumCleaner extends deviceBase {
|
|
|
191
214
|
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
192
215
|
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
193
216
|
.updateValue(deviceVersion);
|
|
194
|
-
this.accessory.context.
|
|
195
|
-
await this.debugSuccessLog(`
|
|
217
|
+
this.accessory.context.version = deviceVersion;
|
|
218
|
+
await this.debugSuccessLog(`version: ${this.accessory.context.version}`);
|
|
196
219
|
}
|
|
197
220
|
}
|
|
198
221
|
|
|
199
|
-
async parseStatusWebhook(
|
|
200
|
-
| floorCleaningRobotS10WebhookContext): Promise<void> {
|
|
222
|
+
async parseStatusWebhook(): Promise<void> {
|
|
201
223
|
await this.debugLog('parseStatusWebhook');
|
|
202
|
-
await this.debugLog(`(onlineStatus, battery, workingStatus) = Webhook: (${
|
|
203
|
-
+ ` current: (${this.LightBulb.On}, ${this.Battery.BatteryLevel}, ${this.Battery.ChargingState})`);
|
|
224
|
+
await this.debugLog(`(onlineStatus, battery, workingStatus) = Webhook: (${this.webhookContext.onlineStatus}, ${this.webhookContext.battery},`
|
|
225
|
+
+ ` ${this.webhookContext.workingStatus}), current: (${this.LightBulb.On}, ${this.Battery.BatteryLevel}, ${this.Battery.ChargingState})`);
|
|
226
|
+
|
|
204
227
|
// On
|
|
205
|
-
this.LightBulb.On =
|
|
228
|
+
this.LightBulb.On = this.webhookContext.onlineStatus === 'online' ? true : false;
|
|
206
229
|
await this.debugLog(`On: ${this.LightBulb.On}`);
|
|
230
|
+
|
|
207
231
|
// BatteryLevel
|
|
208
|
-
this.Battery.BatteryLevel =
|
|
232
|
+
this.Battery.BatteryLevel = this.webhookContext.battery;
|
|
209
233
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
234
|
+
|
|
210
235
|
// StatusLowBattery
|
|
211
236
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
212
237
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
213
238
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
239
|
+
|
|
214
240
|
// ChargingState
|
|
215
|
-
this.Battery.ChargingState =
|
|
241
|
+
this.Battery.ChargingState = this.webhookContext.workingStatus === 'Charging'
|
|
216
242
|
? this.hap.Characteristic.ChargingState.CHARGING : this.hap.Characteristic.ChargingState.NOT_CHARGING;
|
|
217
243
|
await this.debugLog(`ChargingState: ${this.Battery.ChargingState}`);
|
|
218
244
|
}
|
|
@@ -246,7 +272,8 @@ export class RobotVacuumCleaner extends deviceBase {
|
|
|
246
272
|
const serviceData = await this.monitorAdvertisementPackets(switchbot) as unknown as robotVacuumCleanerServiceData;
|
|
247
273
|
// Update HomeKit
|
|
248
274
|
if (serviceData.model === SwitchBotBLEModel.Unknown && serviceData.modelName === SwitchBotBLEModelName.Unknown) {
|
|
249
|
-
|
|
275
|
+
this.serviceData = serviceData;
|
|
276
|
+
await this.BLEparseStatus();
|
|
250
277
|
await this.updateHomeKitCharacteristics();
|
|
251
278
|
} else {
|
|
252
279
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -264,7 +291,8 @@ export class RobotVacuumCleaner extends deviceBase {
|
|
|
264
291
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
265
292
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
266
293
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
267
|
-
|
|
294
|
+
this.deviceStatus = deviceStatus.body;
|
|
295
|
+
await this.openAPIparseStatus();
|
|
268
296
|
await this.updateHomeKitCharacteristics();
|
|
269
297
|
} else {
|
|
270
298
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -283,7 +311,8 @@ export class RobotVacuumCleaner extends deviceBase {
|
|
|
283
311
|
| robotVacuumCleanerS1PlusWebhookContext | floorCleaningRobotS10WebhookContext) => {
|
|
284
312
|
try {
|
|
285
313
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
286
|
-
|
|
314
|
+
this.webhookContext = context;
|
|
315
|
+
await this.parseStatusWebhook();
|
|
287
316
|
await this.updateHomeKitCharacteristics();
|
|
288
317
|
} catch (e: any) {
|
|
289
318
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
|
@@ -36,6 +36,15 @@ export class WaterDetector extends deviceBase {
|
|
|
36
36
|
LeakDetected: CharacteristicValue;
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
+
// OpenAPI
|
|
40
|
+
deviceStatus!: waterLeakDetectorStatus;
|
|
41
|
+
|
|
42
|
+
//Webhook
|
|
43
|
+
webhookContext!: waterLeakDetectorWebhookContext;
|
|
44
|
+
|
|
45
|
+
// BLE
|
|
46
|
+
serviceData!: waterLeakDetectorServiceData;
|
|
47
|
+
|
|
39
48
|
// Updates
|
|
40
49
|
WaterDetectorUpdateInProgress!: boolean;
|
|
41
50
|
doWaterDetectorUpdate: Subject<void>;
|
|
@@ -46,6 +55,9 @@ export class WaterDetector 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.doWaterDetectorUpdate = new Subject();
|
|
51
63
|
this.WaterDetectorUpdateInProgress = false;
|
|
@@ -79,11 +91,11 @@ export class WaterDetector extends deviceBase {
|
|
|
79
91
|
// Initialize Leak Sensor Service
|
|
80
92
|
if (device.waterdetector?.hide_leak) {
|
|
81
93
|
if (this.LeakSensor) {
|
|
82
|
-
this.debugLog(
|
|
94
|
+
this.debugLog('Removing Leak Sensor Service');
|
|
83
95
|
this.LeakSensor.Service = this.accessory.getService(this.hap.Service.LeakSensor) as Service;
|
|
84
96
|
accessory.removeService(this.LeakSensor.Service);
|
|
85
97
|
} else {
|
|
86
|
-
this.debugLog(
|
|
98
|
+
this.debugLog('Leak Sensor Service Not Found');
|
|
87
99
|
}
|
|
88
100
|
} else {
|
|
89
101
|
accessory.context.LeakSensor = accessory.context.LeakSensor ?? {};
|
|
@@ -106,34 +118,40 @@ export class WaterDetector extends deviceBase {
|
|
|
106
118
|
}
|
|
107
119
|
|
|
108
120
|
// Retrieve initial values and updateHomekit
|
|
121
|
+
this.debugLog('Retrieve initial values and update Homekit');
|
|
109
122
|
this.refreshStatus();
|
|
110
123
|
|
|
111
|
-
// Retrieve initial values and updateHomekit
|
|
112
|
-
this.updateHomeKitCharacteristics();
|
|
113
|
-
|
|
114
124
|
//regisiter webhook event handler
|
|
125
|
+
this.debugLog('Registering Webhook Event Handler');
|
|
115
126
|
this.registerWebhook();
|
|
116
127
|
|
|
117
128
|
// Start an update interval
|
|
118
129
|
interval(this.deviceRefreshRate * 1000)
|
|
119
130
|
.pipe(skipWhile(() => this.WaterDetectorUpdateInProgress))
|
|
120
131
|
.subscribe(async () => {
|
|
132
|
+
await this.debugLog(`update interval: ${this.deviceRefreshRate * 1000} seconds`);
|
|
121
133
|
await this.refreshStatus();
|
|
122
134
|
});
|
|
123
135
|
}
|
|
124
136
|
|
|
125
|
-
async BLEparseStatus(
|
|
137
|
+
async BLEparseStatus(): Promise<void> {
|
|
126
138
|
await this.debugLog('BLEparseStatus');
|
|
139
|
+
await this.debugLog(`(state, status, battery) = BLE: (${this.serviceData.state}, ${this.serviceData.status}, ${this.serviceData.battery}),`
|
|
140
|
+
+ ` current:(${this.LeakSensor?.LeakDetected}, ${this.Battery.BatteryLevel})`);
|
|
141
|
+
|
|
142
|
+
//LeakSensor
|
|
127
143
|
if (this.device.waterdetector?.hide_leak && this.LeakSensor?.Service) {
|
|
144
|
+
|
|
128
145
|
// StatusActive
|
|
129
|
-
this.LeakSensor.StatusActive = serviceData.state;
|
|
146
|
+
this.LeakSensor.StatusActive = this.serviceData.state;
|
|
130
147
|
await this.debugLog(`StatusActive: ${this.LeakSensor.StatusActive}`);
|
|
148
|
+
|
|
131
149
|
// LeakDetected
|
|
132
|
-
this.LeakSensor.LeakDetected = serviceData.status;
|
|
150
|
+
this.LeakSensor.LeakDetected = this.serviceData.status;
|
|
133
151
|
this.debugLog(`LeakDetected: ${this.LeakSensor.LeakDetected}`);
|
|
134
152
|
}
|
|
135
153
|
// BatteryLevel
|
|
136
|
-
this.Battery.BatteryLevel =
|
|
154
|
+
this.Battery.BatteryLevel = this.serviceData.battery;
|
|
137
155
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
138
156
|
// StatusLowBattery
|
|
139
157
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
@@ -141,27 +159,36 @@ export class WaterDetector extends deviceBase {
|
|
|
141
159
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
142
160
|
}
|
|
143
161
|
|
|
144
|
-
async openAPIparseStatus(
|
|
162
|
+
async openAPIparseStatus(): Promise<void> {
|
|
145
163
|
await this.debugLog('openAPIparseStatus');
|
|
164
|
+
await this.debugLog(`(status, battery) = OpenAPI: (${this.deviceStatus.status}, ${this.deviceStatus.battery}),`
|
|
165
|
+
+ ` current:(${this.LeakSensor?.LeakDetected}, ${this.Battery.BatteryLevel})`);
|
|
166
|
+
|
|
167
|
+
//LeakSensor
|
|
146
168
|
if (!this.device.waterdetector?.hide_leak && this.LeakSensor?.Service) {
|
|
169
|
+
|
|
147
170
|
// StatusActive
|
|
148
|
-
this.LeakSensor.StatusActive = deviceStatus.battery === 0 ? false : true;
|
|
171
|
+
this.LeakSensor.StatusActive = this.deviceStatus.battery === 0 ? false : true;
|
|
149
172
|
await this.debugLog(`StatusActive: ${this.LeakSensor.StatusActive}`);
|
|
173
|
+
|
|
150
174
|
// LeakDetected
|
|
151
|
-
this.LeakSensor.LeakDetected = deviceStatus.status;
|
|
175
|
+
this.LeakSensor.LeakDetected = this.deviceStatus.status;
|
|
152
176
|
this.debugLog(`LeakDetected: ${this.LeakSensor.LeakDetected}`);
|
|
153
177
|
}
|
|
178
|
+
|
|
154
179
|
// BatteryLevel
|
|
155
|
-
this.Battery.BatteryLevel =
|
|
180
|
+
this.Battery.BatteryLevel = this.deviceStatus.battery;
|
|
156
181
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
182
|
+
|
|
157
183
|
// StatusLowBattery
|
|
158
184
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
159
185
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
160
186
|
await this.debugLog(`StatusLowBattery: ${this.Battery.StatusLowBattery}`);
|
|
187
|
+
|
|
161
188
|
// FirmwareVersion
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
189
|
+
if (this.deviceStatus.version) {
|
|
190
|
+
const version = this.deviceStatus.version.toString();
|
|
191
|
+
await this.debugLog(`FirmwareVersion: ${version.replace(/^V|-.*$/g, '')}`);
|
|
165
192
|
const deviceVersion = version.replace(/^V|-.*$/g, '') ?? '0.0.0';
|
|
166
193
|
this.accessory
|
|
167
194
|
.getService(this.hap.Service.AccessoryInformation)!
|
|
@@ -169,26 +196,32 @@ export class WaterDetector extends deviceBase {
|
|
|
169
196
|
.setCharacteristic(this.hap.Characteristic.FirmwareRevision, deviceVersion)
|
|
170
197
|
.getCharacteristic(this.hap.Characteristic.FirmwareRevision)
|
|
171
198
|
.updateValue(deviceVersion);
|
|
172
|
-
this.accessory.context.
|
|
173
|
-
await this.debugSuccessLog(`
|
|
199
|
+
this.accessory.context.version = deviceVersion;
|
|
200
|
+
await this.debugSuccessLog(`version: ${this.accessory.context.version}`);
|
|
174
201
|
}
|
|
175
202
|
}
|
|
176
203
|
|
|
177
|
-
async parseStatusWebhook(
|
|
204
|
+
async parseStatusWebhook(): Promise<void> {
|
|
178
205
|
await this.debugLog('parseStatusWebhook');
|
|
179
|
-
await this.debugLog(`(detectionState, battery) = Webhook: (${
|
|
206
|
+
await this.debugLog(`(detectionState, battery) = Webhook: (${this.webhookContext.detectionState}, ${this.webhookContext.battery}),`
|
|
180
207
|
+ ` current:(${this.LeakSensor?.LeakDetected}, ${this.Battery.BatteryLevel})`);
|
|
208
|
+
|
|
209
|
+
//LeakSensor
|
|
181
210
|
if (!this.device.waterdetector?.hide_leak && this.LeakSensor?.Service) {
|
|
211
|
+
|
|
182
212
|
// StatusActive
|
|
183
|
-
this.LeakSensor.StatusActive =
|
|
213
|
+
this.LeakSensor.StatusActive = this.webhookContext.detectionState ? true : false;
|
|
184
214
|
await this.debugLog(`StatusActive: ${this.LeakSensor.StatusActive}`);
|
|
215
|
+
|
|
185
216
|
// LeakDetected
|
|
186
|
-
this.LeakSensor.LeakDetected =
|
|
217
|
+
this.LeakSensor.LeakDetected = this.webhookContext.detectionState;
|
|
187
218
|
await this.debugLog(`LeakDetected: ${this.LeakSensor.LeakDetected}`);
|
|
188
219
|
}
|
|
220
|
+
|
|
189
221
|
// BatteryLevel
|
|
190
|
-
this.Battery.BatteryLevel =
|
|
222
|
+
this.Battery.BatteryLevel = this.webhookContext.battery;
|
|
191
223
|
await this.debugLog(`BatteryLevel: ${this.Battery.BatteryLevel}`);
|
|
224
|
+
|
|
192
225
|
// StatusLowBattery
|
|
193
226
|
this.Battery.StatusLowBattery = this.Battery.BatteryLevel < 10
|
|
194
227
|
? this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW : this.hap.Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
|
|
@@ -221,10 +254,11 @@ export class WaterDetector extends deviceBase {
|
|
|
221
254
|
// Start to monitor advertisement packets
|
|
222
255
|
(async () => {
|
|
223
256
|
// Start to monitor advertisement packets
|
|
224
|
-
const serviceData = await this.monitorAdvertisementPackets(switchbot) as
|
|
257
|
+
const serviceData = await this.monitorAdvertisementPackets(switchbot) as waterLeakDetectorServiceData;
|
|
225
258
|
// Update HomeKit
|
|
226
259
|
if (serviceData.model === SwitchBotBLEModel.Unknown && serviceData.modelName === SwitchBotBLEModelName.Unknown) {
|
|
227
|
-
|
|
260
|
+
this.serviceData = serviceData;
|
|
261
|
+
await this.BLEparseStatus();
|
|
228
262
|
await this.updateHomeKitCharacteristics();
|
|
229
263
|
} else {
|
|
230
264
|
await this.errorLog(`failed to get serviceData, serviceData: ${serviceData}`);
|
|
@@ -242,7 +276,8 @@ export class WaterDetector extends deviceBase {
|
|
|
242
276
|
await this.debugLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);;
|
|
243
277
|
if (await this.successfulStatusCodes(statusCode, deviceStatus)) {
|
|
244
278
|
await this.debugSuccessLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
245
|
-
|
|
279
|
+
this.deviceStatus = deviceStatus.body;
|
|
280
|
+
await this.openAPIparseStatus();
|
|
246
281
|
await this.updateHomeKitCharacteristics();
|
|
247
282
|
} else {
|
|
248
283
|
await this.debugWarnLog(`statusCode: ${statusCode}, deviceStatus: ${JSON.stringify(deviceStatus)}`);
|
|
@@ -260,7 +295,8 @@ export class WaterDetector extends deviceBase {
|
|
|
260
295
|
this.platform.webhookEventHandler[this.device.deviceId] = async (context: waterLeakDetectorWebhookContext) => {
|
|
261
296
|
try {
|
|
262
297
|
await this.debugLog(`received Webhook: ${JSON.stringify(context)}`);
|
|
263
|
-
|
|
298
|
+
this.webhookContext = context;
|
|
299
|
+
await this.parseStatusWebhook();
|
|
264
300
|
await this.updateHomeKitCharacteristics();
|
|
265
301
|
} catch (e: any) {
|
|
266
302
|
await this.errorLog(`failed to handle webhook. Received: ${JSON.stringify(context)} Error: ${e}`);
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
<tbody>
|
|
52
52
|
<tr>
|
|
53
53
|
<th scope="row">Device ID</th>
|
|
54
|
-
<td id="
|
|
54
|
+
<td id="deviceId"></td>
|
|
55
55
|
</tr>
|
|
56
56
|
<tr>
|
|
57
57
|
<th scope="row">Model</th>
|
|
@@ -166,7 +166,7 @@
|
|
|
166
166
|
const thisAcc = cachedAccessories.find((x) => x.UUID === UUID);
|
|
167
167
|
const context = thisAcc.context;
|
|
168
168
|
document.getElementById('displayName').innerHTML = thisAcc.displayName;
|
|
169
|
-
document.getElementById('
|
|
169
|
+
document.getElementById('deviceId').innerHTML = context.deviceId;
|
|
170
170
|
document.getElementById('model').innerHTML = context.model;
|
|
171
171
|
document.getElementById('version').innerHTML = context.version;
|
|
172
172
|
document.getElementById('deviceType').innerHTML = context.deviceType;
|