feat(vendor.roborock): RoborockHighResolutionManualControlCapability

This commit is contained in:
Sören Beye 2025-05-24 15:39:34 +02:00
parent d500b3f0cb
commit f261bce8a9
12 changed files with 97 additions and 9 deletions

View File

@ -103,7 +103,8 @@ class RoborockGen4ValetudoRobot extends RoborockValetudoRobot {
capabilities.RoborockMultiMapMapResetCapability,
capabilities.RoborockMapSegmentationCapability,
capabilities.RoborockMapSegmentEditCapability,
capabilities.RoborockMapSegmentRenameCapability
capabilities.RoborockMapSegmentRenameCapability,
capabilities.RoborockHighResolutionManualControlCapability
].forEach(capability => {
this.registerCapability(new capability({robot: this}));
});

View File

@ -21,7 +21,8 @@ class RoborockM1SValetudoRobot extends RoborockValetudoRobot {
capabilities.RoborockMapResetCapability,
capabilities.RoborockMapSegmentSimpleCapability,
capabilities.RoborockMapSegmentEditCapability,
capabilities.RoborockMapSegmentRenameCapability
capabilities.RoborockMapSegmentRenameCapability,
capabilities.RoborockHighResolutionManualControlCapability
].forEach(capability => {
this.registerCapability(new capability({robot: this}));
});

View File

@ -22,7 +22,8 @@ class RoborockS4ValetudoRobot extends RoborockValetudoRobot {
capabilities.RoborockMultiMapMapResetCapability,
capabilities.RoborockMapSegmentationCapability,
capabilities.RoborockMapSegmentEditCapability,
capabilities.RoborockMapSegmentRenameCapability
capabilities.RoborockMapSegmentRenameCapability,
capabilities.RoborockHighResolutionManualControlCapability
].forEach(capability => {
this.registerCapability(new capability({robot: this}));
});

View File

@ -49,6 +49,7 @@ class RoborockS5MaxValetudoRobot extends RoborockValetudoRobot {
capabilities.RoborockMapSegmentEditCapability,
capabilities.RoborockMapSegmentRenameCapability,
capabilities.RoborockMappingPassCapability,
capabilities.RoborockHighResolutionManualControlCapability
].forEach(capability => {
this.registerCapability(new capability({robot: this}));
});

View File

@ -23,7 +23,8 @@ class RoborockS5ValetudoRobot extends RoborockValetudoRobot {
capabilities.RoborockMapResetCapability,
capabilities.RoborockMapSegmentationCapability,
capabilities.RoborockMapSegmentEditCapability,
capabilities.RoborockMapSegmentRenameCapability
capabilities.RoborockMapSegmentRenameCapability,
capabilities.RoborockHighResolutionManualControlCapability
].forEach(capability => {
this.registerCapability(new capability({robot: this}));
});

View File

@ -48,7 +48,8 @@ class RoborockS6MaxVValetudoRobot extends RoborockValetudoRobot {
capabilities.RoborockMultiMapMapResetCapability,
capabilities.RoborockMapSegmentationCapability,
capabilities.RoborockMapSegmentEditCapability,
capabilities.RoborockMapSegmentRenameCapability
capabilities.RoborockMapSegmentRenameCapability,
capabilities.RoborockHighResolutionManualControlCapability
].forEach(capability => {
this.registerCapability(new capability({robot: this}));
});

View File

@ -21,7 +21,8 @@ class RoborockS6PureValetudoRobot extends RoborockValetudoRobot {
capabilities.RoborockMultiMapMapResetCapability,
capabilities.RoborockMapSegmentationCapability,
capabilities.RoborockMapSegmentEditCapability,
capabilities.RoborockMapSegmentRenameCapability
capabilities.RoborockMapSegmentRenameCapability,
capabilities.RoborockHighResolutionManualControlCapability
].forEach(capability => {
this.registerCapability(new capability({robot: this}));
});

View File

@ -29,7 +29,8 @@ class RoborockS6ValetudoRobot extends RoborockValetudoRobot {
capabilities.RoborockMultiMapMapResetCapability,
capabilities.RoborockMapSegmentationCapability,
capabilities.RoborockMapSegmentEditCapability,
capabilities.RoborockMapSegmentRenameCapability
capabilities.RoborockMapSegmentRenameCapability,
capabilities.RoborockHighResolutionManualControlCapability
].forEach(capability => {
this.registerCapability(new capability({robot: this}));
});

View File

@ -1,3 +1,4 @@
const capabilities = require("./capabilities");
const entities = require("../../entities");
const MiioValetudoRobot = require("../MiioValetudoRobot");
const RoborockValetudoRobot = require("./RoborockValetudoRobot");
@ -13,6 +14,11 @@ class RoborockV1ValetudoRobot extends RoborockValetudoRobot {
*/
constructor(options) {
super(Object.assign({}, options, {fanSpeeds: FAN_SPEEDS}));
this.registerCapability(new capabilities.RoborockHighResolutionManualControlCapability({
robot: this,
velocityLimit: 0.29
}));
}
getModelName() {

View File

@ -68,7 +68,6 @@ class RoborockValetudoRobot extends MiioValetudoRobot {
capabilities.RoborockSpeakerVolumeControlCapability,
capabilities.RoborockSpeakerTestCapability,
capabilities.RoborockVoicePackManagementCapability,
capabilities.RoborockManualControlCapability,
capabilities.RoborockTotalStatisticsCapability,
capabilities.RoborockCurrentStatisticsCapability,
].forEach(capability => {

View File

@ -0,0 +1,74 @@
const HighResolutionManualControlCapability = require("../../../core/capabilities/HighResolutionManualControlCapability");
/**
* @extends HighResolutionManualControlCapability<import("../RoborockValetudoRobot")>
*/
class RoborockHighResolutionManualControlCapability extends HighResolutionManualControlCapability {
/**
*
* @param {object} options
* @param {number} [options.velocityLimit]
* @param {import("../RoborockValetudoRobot")} options.robot
* @class
*/
constructor(options) {
super(options);
this.sequenceId = 0;
this.active = false;
/**
* According to user reports, the Roborock V1 doesn't like velocities >= (-)0.3
* They work fine with the S5 and newer(?) but get ignored by the V1 firmware
* causing it to not move at all.
*/
this.velocityLimitPos = options.velocityLimit ?? 1;
this.velocityLimitNeg = this.velocityLimitPos * -1;
}
/**
* @returns {Promise<void>}
*/
async enableManualControl() {
this.sequenceId = 0;
this.active = true;
return this.robot.sendCommand("app_rc_start", [], {});
}
/**
* @returns {Promise<void>}
*/
async disableManualControl() {
this.sequenceId = 0;
this.active = false;
return this.robot.sendCommand("app_rc_end", [], {});
}
/**
* @returns {Promise<boolean>}
*/
async manualControlActive() {
return this.active;
}
/**
* @param {import("../../../entities/core/ValetudoManualMovementVector")} vector
* @returns {Promise<void>}
*/
async manualControl(vector) {
const omega = (vector.angle * (Math.PI / 180) * -1);
let velocity = vector.velocity / 2.5; // -0.4 to 0.4
velocity = Math.max(this.velocityLimitNeg, velocity);
velocity = Math.min(this.velocityLimitPos, velocity);
return this.robot.sendCommand("app_rc_move", [{
omega: omega,
velocity: velocity,
seqnum: ++this.sequenceId
}], {});
}
}
module.exports = RoborockHighResolutionManualControlCapability;

View File

@ -11,6 +11,7 @@ module.exports = {
RoborockDoNotDisturbCapability: require("./RoborockDoNotDisturbCapability"),
RoborockFanSpeedControlCapability: require("./RoborockFanSpeedControlCapability"),
RoborockGoToLocationCapability: require("./RoborockGoToLocationCapability"),
RoborockHighResolutionManualControlCapability: require("./RoborockHighResolutionManualControlCapability"),
RoborockKeyLockCapability: require("./RoborockKeyLockCapability"),
RoborockLocateCapability: require("./RoborockLocateCapability"),
RoborockManualControlCapability: require("./RoborockManualControlCapability"),
@ -34,5 +35,5 @@ module.exports = {
RoborockVoicePackManagementCapability: require("./RoborockVoicePackManagementCapability"),
RoborockWaterUsageControlCapability: require("./RoborockWaterUsageControlCapability"),
RoborockWifiConfigurationCapability: require("./RoborockWifiConfigurationCapability"),
RoborockZoneCleaningCapability: require("./RoborockZoneCleaningCapability")
RoborockZoneCleaningCapability: require("./RoborockZoneCleaningCapability"),
};