Skip to content

Commit

Permalink
feat(vendor.viomi): Support outline cleaning mode (#1844)
Browse files Browse the repository at this point in the history
  • Loading branch information
depau committed Jul 29, 2023
1 parent a4261b6 commit f68b995
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 6 deletions.
48 changes: 47 additions & 1 deletion backend/lib/robots/viomi/ViomiQuirkFactory.js
Expand Up @@ -94,6 +94,51 @@ class ViomiQuirkFactory {
return this.robot.sendCommand("set_moproute", [val], {});
}
});
case ViomiQuirkFactory.KNOWN_QUIRKS.OUTLINE_MODE:
return new Quirk({
id: id,
title: "Vacuum only around the edges",
description: "When enabled, vacuum only around the edges of the room. This only works in \"Vacuum\" mode. It will be disabled after the next cleaning operation.",
options: ["on", "off"],
getter: async () => {
const res = await this.robot.sendCommand("get_prop", ["mode"], {});

if (!(Array.isArray(res) && res.length === 1)) {
throw new Error(`Received invalid response: ${res}`);
} else {
switch (res[0]) {
case 2: // Edge cleaning mode
this.robot.ephemeralState.outlineModeEnabled = true;
return "on";
case 0: // Regular cleaning mode
case 5: // Manual control mode
this.robot.ephemeralState.outlineModeEnabled = false;
return "off";
default:
throw new Error(`Received invalid value ${res}`);
}
}

},
setter: async (value) => {
let val;

switch (value) {
case "on":
val = 2;
this.robot.ephemeralState.outlineModeEnabled = true;
break;
case "off":
val = 0;
this.robot.ephemeralState.outlineModeEnabled = false;
break;
default:
throw new Error(`Received invalid value ${value}`);
}

return this.robot.sendCommand("set_mode", [val], {});
}
});
default:
throw new Error(`There's no quirk with id ${id}`);
}
Expand All @@ -102,7 +147,8 @@ class ViomiQuirkFactory {

ViomiQuirkFactory.KNOWN_QUIRKS = {
BUTTON_LEDS: "977c5972-1f12-4ef1-9622-ce71fd085193",
MOP_PATTERN: "0ae06cb4-8cc7-429f-95fb-f3d0bbfc06de"
MOP_PATTERN: "0ae06cb4-8cc7-429f-95fb-f3d0bbfc06de",
OUTLINE_MODE: "061b826c-417c-46a0-b6ad-807260cd4f70",
};

module.exports = ViomiQuirkFactory;
3 changes: 2 additions & 1 deletion backend/lib/robots/viomi/ViomiV6ValetudoRobot.js
Expand Up @@ -27,7 +27,8 @@ class ViomiV6ValetudoRobot extends ViomiValetudoRobot {
robot: this,
quirks: [
quirkFactory.getQuirk(ViomiQuirkFactory.KNOWN_QUIRKS.BUTTON_LEDS),
quirkFactory.getQuirk(ViomiQuirkFactory.KNOWN_QUIRKS.MOP_PATTERN)
quirkFactory.getQuirk(ViomiQuirkFactory.KNOWN_QUIRKS.MOP_PATTERN),
quirkFactory.getQuirk(ViomiQuirkFactory.KNOWN_QUIRKS.OUTLINE_MODE),
]
}));
}
Expand Down
3 changes: 2 additions & 1 deletion backend/lib/robots/viomi/ViomiV7ValetudoRobot.js
Expand Up @@ -22,7 +22,8 @@ class ViomiV7ValetudoRobot extends ViomiValetudoRobot {
robot: this,
quirks: [
quirkFactory.getQuirk(ViomiQuirkFactory.KNOWN_QUIRKS.BUTTON_LEDS),
quirkFactory.getQuirk(ViomiQuirkFactory.KNOWN_QUIRKS.MOP_PATTERN)
quirkFactory.getQuirk(ViomiQuirkFactory.KNOWN_QUIRKS.MOP_PATTERN),
quirkFactory.getQuirk(ViomiQuirkFactory.KNOWN_QUIRKS.OUTLINE_MODE),
]
}));
}
Expand Down
3 changes: 2 additions & 1 deletion backend/lib/robots/viomi/ViomiV8ValetudoRobot.js
Expand Up @@ -26,7 +26,8 @@ class ViomiV8ValetudoRobot extends ViomiValetudoRobot {
this.registerCapability(new QuirksCapability({
robot: this,
quirks: [
quirkFactory.getQuirk(ViomiQuirkFactory.KNOWN_QUIRKS.BUTTON_LEDS)
quirkFactory.getQuirk(ViomiQuirkFactory.KNOWN_QUIRKS.BUTTON_LEDS),
quirkFactory.getQuirk(ViomiQuirkFactory.KNOWN_QUIRKS.OUTLINE_MODE),
]
}));
}
Expand Down
3 changes: 3 additions & 0 deletions backend/lib/robots/viomi/ViomiValetudoRobot.js
Expand Up @@ -44,6 +44,7 @@ class ViomiValetudoRobot extends MiioValetudoRobot {
carpetModeEnabled: undefined,
lastOperationType: null,
lastOperationAdditionalParams: [],
outlineModeEnabled: false,
vendorMapId: 0
};

Expand Down Expand Up @@ -276,6 +277,8 @@ class ViomiValetudoRobot extends MiioValetudoRobot {
}
}

// Need to remember this since we have to send it back when starting a cleaning operation
this.ephemeralState.outlineModeEnabled = data["mode"] === 2;

if (error !== undefined) {
if (error.value === stateAttrs.StatusStateAttribute.VALUE.ERROR) {
Expand Down
Expand Up @@ -37,7 +37,11 @@ class ViomiBasicControlCapability extends BasicControlCapability {
case stateAttrs.PresetSelectionStateAttribute.MODE.MOP:
return attributes.ViomiMovementMode.MOP;
case stateAttrs.PresetSelectionStateAttribute.MODE.VACUUM:
return attributes.ViomiMovementMode.VACUUM;
if (outline) {
return attributes.ViomiMovementMode.OUTLINE;
} else {
return attributes.ViomiMovementMode.VACUUM;
}
default:
return attributes.ViomiMovementMode.VACUUM;
}
Expand All @@ -52,7 +56,7 @@ class ViomiBasicControlCapability extends BasicControlCapability {
* @returns {Promise<void>}
*/
async setModeWithSegments(operation, segmentIds) {
const movementMode = this.getVacuumMovementMode();
const movementMode = this.getVacuumMovementMode(this.robot.ephemeralState.outlineModeEnabled);

if (segmentIds === undefined || segmentIds === null) {
segmentIds = [];
Expand Down

0 comments on commit f68b995

Please sign in to comment.