Skip to content

Commit

Permalink
feat(vendor.viomi): ViomiCarpetModeControlCapability (#739)
Browse files Browse the repository at this point in the history
* viomi: Implement hacky carpet turbo mode capability

It seems like it's not possible to retrieve the current carpet turbo setting.
Therefore we remember it when we set it, but if it was never set we fail when
it is requested.

* Handle errors in carpet turbo router

* Remove obsolete carpet turbo intensity capability

* viomi: Make carpet turbo error more explanatory

* viomi: Read robot config for carpet mode setting
  • Loading branch information
depau committed Mar 7, 2021
1 parent 2804287 commit fe31438
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 29 deletions.
24 changes: 0 additions & 24 deletions lib/core/capabilities/CarpetTurboControlCapability.js

This file was deleted.

1 change: 0 additions & 1 deletion lib/core/capabilities/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ module.exports = {
IntensityPresetCapability: require("./IntensityPresetCapability"),
FanSpeedControlCapability: require("./FanSpeedControlCapability"),
WaterUsageControlCapability: require("./WaterUsageControlCapability"),
CarpetTurboControlCapability: require("./CarpetTurboControlCapability"),
LEDControlCapability: require("./LEDControlCapability"),
ConsumableMonitoringCapability: require("./ConsumableMonitoringCapability"),
ZoneCleaningCapability: require("./ZoneCleaningCapability"),
Expand Down
5 changes: 5 additions & 0 deletions lib/robots/viomi/ViomiValetudoRobot.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ class ViomiValetudoRobot extends MiioValetudoRobot {
robot: this
}));

this.registerCapability(new capabilities.ViomiCarpetModeControlCapability({
robot: this,
carpetConfigFile: "/mnt/UDISK/config/new_user_perference.txt"
}));

this.registerCapability(new capabilities.ViomiSpeakerTestCapability({
robot: this
}));
Expand Down
77 changes: 77 additions & 0 deletions lib/robots/viomi/capabilities/ViomiCarpetModeControlCapability.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
const CarpetModeControlCapability = require("../../../core/capabilities/CarpetModeControlCapability");
const fs = require("fs");
const readline = require("readline");


class ViomiCarpetModeControlCapability extends CarpetModeControlCapability {
/**
* @param {object} options
* @param {import("../../../core/ValetudoRobot")|any} options.robot
* @param {string} [options.carpetConfigFile]
*/
constructor(options) {
super(options);
this.carpetConfigPath = options.carpetConfigFile;
}

/**
* This function returns the last set carpet turbo mode setting..
* Viomi does not have a command to retrieve the current setting, so we fail if it was not set recently.
*
* @abstract
* @returns {Promise<boolean>}
*/
async isEnabled() {
// Disclaimer: nasty
// noinspection JSUnresolvedVariable
const state = this.robot.carpetModeEnabled;
if (state !== null && state !== undefined) {
return state;
}

if (this.robot.config.get("embedded") === true && this.carpetConfigPath && fs.existsSync(this.carpetConfigPath)) {
const fileStream = fs.createReadStream(this.carpetConfigPath);
const lineReader = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});

for await (const line of lineReader) {
if (line.startsWith("m_carpet_turbo")) {
if (line.trim().endsWith("=1")) {
this.robot.carpetModeEnabled = true;
} else if (line.endsWith("=0")) {
this.robot.carpetModeEnabled = false;
} else {
break;
}
return this.robot.carpetModeEnabled;
}
}
}

throw new Error("Carpet turbo state cannot be remembered by Valetudo. " +
"If you don't remember what you set it to, set it again.");
}

/**
* @abstract
* @returns {Promise<void>}
*/
async enable() {
this.robot.carpetModeEnabled = true;
// 0: off, 1: medium, 2: turbo
await this.robot.sendCommand("set_carpetturbo", [2], {});
}

/**
* @abstract
* @returns {Promise<void>}
*/
async disable() {
this.robot.carpetModeEnabled = false;
await this.robot.sendCommand("set_carpetturbo", [0], {});
}
}

module.exports = ViomiCarpetModeControlCapability;
1 change: 1 addition & 0 deletions lib/robots/viomi/capabilities/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ module.exports = {
ViomiPersistentMapControlCapability: require("./ViomiPersistentMapControlCapability"),
ViomiVoicePackManagementCapability: require("./ViomiVoicePackManagementCapability"),
ViomiCombinedVirtualRestrictionsCapability: require("./ViomiCombinedVirtualRestrictionsCapability"),
ViomiCarpetModeControlCapability: require("./ViomiCarpetModeControlCapability"),
ViomiSpeakerTestCapability: require("./ViomiSpeakerTestCapability"),
ViomiSpeakerVolumeControlCapability: require("./ViomiSpeakerVolumeControlCapability"),
};
1 change: 0 additions & 1 deletion lib/webserver/CapabilitiesRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ const CAPABILITY_TYPE_TO_ROUTER_MAPPING = {
[capabilities.BasicControlCapability.TYPE]: capabilityRouters.BasicControlCapabilityRouter,
[capabilities.FanSpeedControlCapability.TYPE]: capabilityRouters.IntensityPresetCapabilityRouter,
[capabilities.WaterUsageControlCapability.TYPE]: capabilityRouters.IntensityPresetCapabilityRouter,
[capabilities.CarpetTurboControlCapability.TYPE]: capabilityRouters.IntensityPresetCapabilityRouter,
[capabilities.LEDControlCapability.TYPE]: capabilityRouters.LEDControlCapabilityRouter,
[capabilities.ConsumableMonitoringCapability.TYPE]: capabilityRouters.ConsumableMonitoringCapabilityRouter,
[capabilities.ZoneCleaningCapability.TYPE]: capabilityRouters.ZoneCleaningCapabilityRouter,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@ class CarpetModeControlCapabilityRouter extends CapabilityRouter {

initRoutes() {
this.router.get("/", async (req, res) => {
res.json({
enabled: await this.capability.isEnabled()
});
try {
res.json({
enabled: await this.capability.isEnabled()
});
} catch (e) {
res.status(500).send(e.message);
}
});

this.router.put("/", async (req, res) => {
Expand Down

0 comments on commit fe31438

Please sign in to comment.