homebridge-xiaomi-roborock-vacuum
Version:
Xiaomi Vacuum Cleaner - 1st (Mi Robot), 2nd (Roborock S50 + S55), 3rd Generation (Roborock S6) and S5 Max - plugin for Homebridge.
107 lines (92 loc) • 2.56 kB
JavaScript
;
const tokens = require("./tokens");
/**
* Management of a device. Supports quering it for information and changing
* the WiFi settings.
*/
class DeviceManagement {
constructor(device) {
this.api = device.handle.api;
}
get model() {
return this.api.model;
}
get token() {
const token = this.api.token;
return token ? token.toString("hex") : null;
}
get autoToken() {
return this.api.autoToken;
}
get address() {
return this.api.address;
}
/**
* Get information about this device. Includes model info, token and
* connection information.
*/
info() {
return this.api.call("miIO.info");
}
/**
* Update the wireless settings of this device. Needs `ssid` and `passwd`
* to be set in the options object.
*
* `uid` can be set to associate the device with a Mi Home user id.
*/
updateWireless(options) {
if (typeof options.ssid !== "string") {
throw new Error("options.ssid must be a string");
}
if (typeof options.passwd !== "string") {
throw new Error("options.passwd must be a string");
}
return this.api.call("miIO.config_router", options).then((result) => {
if (result !== 0 && result !== "OK" && result !== "ok") {
throw new Error("Failed updating wireless");
}
return true;
});
}
/**
* Get the wireless state of this device. Includes if the device is
* online and counters for things such as authentication failures and
* connection success and failures.
*/
wirelessState() {
return this.api.call("miIO.wifi_assoc_state");
}
/**
* Update the token used to connect to this device.
*
* @param {string|Buffer} token
*/
updateToken(token) {
if (token instanceof Buffer) {
token = token.toString("hex");
} else if (typeof token !== "string") {
return Promise.reject(
new Error("Token must be a hex-string or a Buffer")
);
}
// Lazily imported to solve recursive dependencies
const connectToDevice = require("./connectToDevice");
return connectToDevice({
address: this.address,
port: this.port,
token: token,
})
.then((device) => {
// Connection to device could be performed
return tokens
.update(this.api.id, token)
.then(() => device.destroy())
.then(() => true);
})
.catch((err) => {
// Connection to device failed with the token
return false;
});
}
}
module.exports = DeviceManagement;