Valetudo/backend/lib/robots/roborock/RoborockS8ValetudoRobot.js

123 lines
4.5 KiB
JavaScript

const capabilities = require("./capabilities");
const entities = require("../../entities");
const fs = require("fs");
const Logger = require("../../Logger");
const MiioValetudoRobot = require("../MiioValetudoRobot");
const QuirksCapability = require("../../core/capabilities/QuirksCapability");
const RoborockConst = require("./RoborockConst");
const RoborockGen4ValetudoRobot = require("./RoborockGen4ValetudoRobot");
const RoborockQuirkFactory = require("./RoborockQuirkFactory");
const RoborockValetudoRobot = require("./RoborockValetudoRobot");
const ValetudoRestrictedZone = require("../../entities/core/ValetudoRestrictedZone");
class RoborockS8ValetudoRobot extends RoborockGen4ValetudoRobot {
/**
*
* @param {object} options
* @param {import("../../Configuration")} options.config
* @param {import("../../ValetudoEventStore")} options.valetudoEventStore
*/
constructor(options) {
super(
Object.assign(
{},
options,
{
waterGrades: WATER_GRADES,
supportedAttachments: SUPPORTED_ATTACHMENTS,
dockType: RoborockConst.DOCK_TYPE.AUTO_EMPTY
}
)
);
this.registerCapability(new capabilities.RoborockCombinedVirtualRestrictionsCapability({
robot: this,
supportedRestrictedZoneTypes: [
ValetudoRestrictedZone.TYPE.REGULAR,
ValetudoRestrictedZone.TYPE.MOP
]
}));
this.registerCapability(new capabilities.RoborockWaterUsageControlCapability({
robot: this,
presets: Object.keys(this.waterGrades).map(k => {
return new entities.core.ValetudoSelectionPreset({name: k, value: this.waterGrades[k]});
})
}));
this.registerCapability(new capabilities.RoborockCarpetSensorModeControlCapability({
robot: this,
liftModeId: 3
}));
[
capabilities.RoborockAutoEmptyDockAutoEmptyControlCapability,
capabilities.RoborockAutoEmptyDockManualTriggerCapability,
capabilities.RoborockKeyLockCapability,
capabilities.RoborockMappingPassCapability,
capabilities.RoborockObstacleAvoidanceControlCapability,
capabilities.RoborockPetObstacleAvoidanceControlCapability,
capabilities.RoborockCollisionAvoidantNavigationControlCapability
].forEach(capability => {
this.registerCapability(new capability({robot: this}));
});
const quirkFactory = new RoborockQuirkFactory({
robot: this
});
this.registerCapability(new QuirksCapability({
robot: this,
quirks: [
quirkFactory.getQuirk(RoborockQuirkFactory.KNOWN_QUIRKS.AUTO_EMPTY_DURATION),
quirkFactory.getQuirk(RoborockQuirkFactory.KNOWN_QUIRKS.BUTTON_LEDS),
quirkFactory.getQuirk(RoborockQuirkFactory.KNOWN_QUIRKS.MOP_PATTERN),
]
}));
}
getModelName() {
return "S8";
}
getFirmwareVersion() {
try {
const rr_info = fs.readFileSync("/etc/rr-info").toString();
const parsedFile = /^Version:(?<version>[\d._]*)$/m.exec(rr_info);
if (parsedFile !== null && parsedFile.groups && parsedFile.groups.version) {
return parsedFile.groups.version;
} else {
Logger.warn("Unable to determine the Firmware Version");
return null;
}
} catch (e) {
Logger.warn("Unable to determine the Firmware Version", e);
return null;
}
}
static IMPLEMENTATION_AUTO_DETECTION_HANDLER() {
const deviceConf = MiioValetudoRobot.READ_DEVICE_CONF(RoborockValetudoRobot.DEVICE_CONF_PATH);
return !!(deviceConf && deviceConf.model === "roborock.vacuum.a51");
}
}
const WATER_GRADES = {
[entities.state.attributes.PresetSelectionStateAttribute.INTENSITY.OFF] : 200,
[entities.state.attributes.PresetSelectionStateAttribute.INTENSITY.LOW]: 201,
[entities.state.attributes.PresetSelectionStateAttribute.INTENSITY.MEDIUM]: 202,
[entities.state.attributes.PresetSelectionStateAttribute.INTENSITY.HIGH]: 203
};
const SUPPORTED_ATTACHMENTS = [
entities.state.attributes.AttachmentStateAttribute.TYPE.WATERTANK,
entities.state.attributes.AttachmentStateAttribute.TYPE.MOP,
];
module.exports = RoborockS8ValetudoRobot;