Skip to content

Commit

Permalink
feat: CollisionAvoidantNavigationControlCapability
Browse files Browse the repository at this point in the history
  • Loading branch information
Hypfer committed Jul 28, 2023
1 parent 5a3ecc6 commit e22e532
Show file tree
Hide file tree
Showing 22 changed files with 307 additions and 7 deletions.
@@ -0,0 +1,15 @@
const SimpleToggleCapability = require("./SimpleToggleCapability");

/**
* @template {import("../ValetudoRobot")} T
* @extends SimpleToggleCapability<T>
*/
class CollisionAvoidantNavigationControlCapability extends SimpleToggleCapability {
getType() {
return CollisionAvoidantNavigationControlCapability.TYPE;
}
}

CollisionAvoidantNavigationControlCapability.TYPE = "CollisionAvoidantNavigationControlCapability";

module.exports = CollisionAvoidantNavigationControlCapability;
3 changes: 2 additions & 1 deletion backend/lib/core/capabilities/index.js
Expand Up @@ -3,6 +3,7 @@ module.exports = {
AutoEmptyDockManualTriggerCapability: require("./AutoEmptyDockManualTriggerCapability"),
BasicControlCapability: require("./BasicControlCapability"),
CarpetModeControlCapability: require("./CarpetModeControlCapability"),
CollisionAvoidantNavigationControlCapability: require("./CollisionAvoidantNavigationControlCapability"),
CombinedVirtualRestrictionsCapability: require("./CombinedVirtualRestrictionsCapability"),
ConsumableMonitoringCapability: require("./ConsumableMonitoringCapability"),
CurrentStatisticsCapability: require("./CurrentStatisticsCapability"),
Expand Down Expand Up @@ -34,5 +35,5 @@ module.exports = {
WaterUsageControlCapability: require("./WaterUsageControlCapability"),
WifiConfigurationCapability: require("./WifiConfigurationCapability"),
WifiScanCapability: require("./WifiScanCapability"),
ZoneCleaningCapability: require("./ZoneCleaningCapability")
ZoneCleaningCapability: require("./ZoneCleaningCapability"),
};
6 changes: 6 additions & 0 deletions backend/lib/robots/dreame/DreameD10SPlusValetudoRobot.js
Expand Up @@ -158,6 +158,12 @@ class DreameD10SPlusValetudoRobot extends DreameGen2LidarValetudoRobot {
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.AI_CAMERA_SETTINGS.PIID
}));

this.registerCapability(new capabilities.DreameCollisionAvoidantNavigationControlCapability({
robot: this,
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.MISC_TUNABLES.PIID
}));

this.registerCapability(new QuirksCapability({
robot: this,
quirks: [
Expand Down
6 changes: 6 additions & 0 deletions backend/lib/robots/dreame/DreameD10SProValetudoRobot.js
Expand Up @@ -146,6 +146,12 @@ class DreameD10SProValetudoRobot extends DreameGen2LidarValetudoRobot {
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.AI_CAMERA_SETTINGS.PIID
}));

this.registerCapability(new capabilities.DreameCollisionAvoidantNavigationControlCapability({
robot: this,
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.MISC_TUNABLES.PIID
}));

this.registerCapability(new QuirksCapability({
robot: this,
quirks: [
Expand Down
6 changes: 6 additions & 0 deletions backend/lib/robots/dreame/DreameL10SProValetudoRobot.js
Expand Up @@ -143,6 +143,12 @@ class DreameL10SProValetudoRobot extends DreameGen2LidarValetudoRobot {
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.OBSTACLE_AVOIDANCE.PIID
}));

this.registerCapability(new capabilities.DreameCollisionAvoidantNavigationControlCapability({
robot: this,
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.MISC_TUNABLES.PIID
}));

this.registerCapability(new QuirksCapability({
robot: this,
quirks: [
Expand Down
6 changes: 6 additions & 0 deletions backend/lib/robots/dreame/DreameL10SUltraValetudoRobot.js
Expand Up @@ -203,6 +203,12 @@ class DreameL10SUltraValetudoRobot extends DreameGen2LidarValetudoRobot {
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.AI_CAMERA_SETTINGS.PIID
}));

this.registerCapability(new capabilities.DreameCollisionAvoidantNavigationControlCapability({
robot: this,
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.MISC_TUNABLES.PIID
}));

this.registerCapability(new QuirksCapability({
robot: this,
quirks: [
Expand Down
6 changes: 6 additions & 0 deletions backend/lib/robots/dreame/DreameL10UltraValetudoRobot.js
Expand Up @@ -183,6 +183,12 @@ class DreameL10UltraValetudoRobot extends DreameGen2LidarValetudoRobot {
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.MOP_DOCK_SETTINGS.PIID
}));

this.registerCapability(new capabilities.DreameCollisionAvoidantNavigationControlCapability({
robot: this,
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.MISC_TUNABLES.PIID
}));

this.registerCapability(new QuirksCapability({
robot: this,
quirks: [
Expand Down
6 changes: 6 additions & 0 deletions backend/lib/robots/dreame/DreameX10PlusValetudoRobot.js
Expand Up @@ -176,6 +176,12 @@ class DreameX10PlusValetudoRobot extends DreameGen2LidarValetudoRobot {
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.AI_CAMERA_SETTINGS.PIID
}));

this.registerCapability(new capabilities.DreameCollisionAvoidantNavigationControlCapability({
robot: this,
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.MISC_TUNABLES.PIID
}));

this.registerCapability(new QuirksCapability({
robot: this,
quirks: [
Expand Down
@@ -1,4 +1,4 @@
const AutoEmptyDockAutoEmptyControlCapability = require("../../../core/capabilities/AutoEmptyDockAutoEmptyControlCapability.js");
const AutoEmptyDockAutoEmptyControlCapability = require("../../../core/capabilities/AutoEmptyDockAutoEmptyControlCapability");
const DreameMiotHelper = require("../DreameMiotHelper");

/**
Expand Down
@@ -0,0 +1,64 @@
const CollisionAvoidantNavigationControlCapability = require("../../../core/capabilities/CollisionAvoidantNavigationControlCapability");
const DreameMiotHelper = require("../DreameMiotHelper");
const DreameUtils = require("../DreameUtils");

/**
* @extends CollisionAvoidantNavigationControlCapability<import("../DreameValetudoRobot")>
*/
class DreameCollisionAvoidantNavigationControlCapability extends CollisionAvoidantNavigationControlCapability {

/**
* @param {object} options
* @param {import("../DreameValetudoRobot")} options.robot
*
* @param {number} options.siid MIOT Service ID
* @param {number} options.piid MIOT Property ID
*/
constructor(options) {
super(options);

this.siid = options.siid;
this.piid = options.piid;

this.helper = new DreameMiotHelper({robot: this.robot});
}

/**
*
* @returns {Promise<boolean>}
*/
async isEnabled() {
const res = await this.helper.readProperty(this.siid, this.piid);
const deserializedResponse = DreameUtils.DESERIALIZE_MISC_TUNABLES(res);

return deserializedResponse.LessColl === 1;
}

/**
* @returns {Promise<void>}
*/
async enable() {
await this.helper.writeProperty(
this.siid,
this.piid,
DreameUtils.SERIALIZE_MISC_TUNABLES_SINGLE_TUNABLE({
LessColl: 1
})
);
}

/**
* @returns {Promise<void>}
*/
async disable() {
await this.helper.writeProperty(
this.siid,
this.piid,
DreameUtils.SERIALIZE_MISC_TUNABLES_SINGLE_TUNABLE({
LessColl: 0
})
);
}
}

module.exports = DreameCollisionAvoidantNavigationControlCapability;
@@ -1,5 +1,5 @@
const DreameMiotHelper = require("../DreameMiotHelper");
const ObstacleAvoidanceControlCapability = require("../../../core/capabilities/ObstacleAvoidanceControlCapability.js");
const ObstacleAvoidanceControlCapability = require("../../../core/capabilities/ObstacleAvoidanceControlCapability");

/**
* @extends ObstacleAvoidanceControlCapability<import("../DreameValetudoRobot")>
Expand Down
@@ -1,5 +1,5 @@
const DreameMiotHelper = require("../DreameMiotHelper");
const PetObstacleAvoidanceControlCapability = require("../../../core/capabilities/PetObstacleAvoidanceControlCapability.js");
const PetObstacleAvoidanceControlCapability = require("../../../core/capabilities/PetObstacleAvoidanceControlCapability");

/**
* @extends PetObstacleAvoidanceControlCapability<import("../DreameValetudoRobot")>
Expand Down
1 change: 1 addition & 0 deletions backend/lib/robots/dreame/capabilities/index.js
Expand Up @@ -9,6 +9,7 @@ module.exports = {
DreameAutoEmptyDockManualTriggerCapability: require("./DreameAutoEmptyDockManualTriggerCapability"),
DreameBasicControlCapability: require("./DreameBasicControlCapability"),
DreameCarpetModeControlCapability: require("./DreameCarpetModeControlCapability"),
DreameCollisionAvoidantNavigationControlCapability: require("./DreameCollisionAvoidantNavigationControlCapability"),
DreameCombinedVirtualRestrictionsCapability: require("./DreameCombinedVirtualRestrictionsCapability"),
DreameConsumableMonitoringCapability: require("./DreameConsumableMonitoringCapability"),
DreameCurrentStatisticsCapability: require("./DreameCurrentStatisticsCapability"),
Expand Down
3 changes: 2 additions & 1 deletion backend/lib/robots/roborock/RoborockS8ValetudoRobot.js
Expand Up @@ -51,7 +51,8 @@ class RoborockS8ValetudoRobot extends RoborockGen4ValetudoRobot {
capabilities.RoborockKeyLockCapability,
capabilities.RoborockMappingPassCapability,
capabilities.RoborockObstacleAvoidanceControlCapability,
capabilities.RoborockPetObstacleAvoidanceControlCapability
capabilities.RoborockPetObstacleAvoidanceControlCapability,
capabilities.RoborockCollisionAvoidantNavigationControlCapability
].forEach(capability => {
this.registerCapability(new capability({robot: this}));
});
Expand Down
@@ -0,0 +1,32 @@
const CollisionAvoidantNavigationControlCapability = require("../../../core/capabilities/CollisionAvoidantNavigationControlCapability");

/**
* @extends CollisionAvoidantNavigationControlCapability<import("../RoborockValetudoRobot")>
*/
class RoborockCollisionAvoidantNavigationControlCapability extends CollisionAvoidantNavigationControlCapability {

/**
* @returns {Promise<boolean>}
*/
async isEnabled() {
const res = await this.robot.sendCommand("get_collision_avoid_status", [], {});

return res["status"] === 1;
}

/**
* @returns {Promise<void>}
*/
async enable() {
await this.robot.sendCommand("set_collision_avoid_status", {"status": 1}, {});
}

/**
* @returns {Promise<void>}
*/
async disable() {
await this.robot.sendCommand("set_collision_avoid_status", {"status": 0}, {});
}
}

module.exports = RoborockCollisionAvoidantNavigationControlCapability;
1 change: 1 addition & 0 deletions backend/lib/robots/roborock/capabilities/index.js
Expand Up @@ -3,6 +3,7 @@ module.exports = {
RoborockAutoEmptyDockManualTriggerCapability: require("./RoborockAutoEmptyDockManualTriggerCapability"),
RoborockBasicControlCapability: require("./RoborockBasicControlCapability"),
RoborockCarpetModeControlCapability: require("./RoborockCarpetModeControlCapability"),
RoborockCollisionAvoidantNavigationControlCapability: require("./RoborockCollisionAvoidantNavigationControlCapability"),
RoborockCombinedVirtualRestrictionsCapability: require("./RoborockCombinedVirtualRestrictionsCapability"),
RoborockConsumableMonitoringCapability: require("./RoborockConsumableMonitoringCapability"),
RoborockCurrentStatisticsCapability: require("./RoborockCurrentStatisticsCapability"),
Expand Down
1 change: 1 addition & 0 deletions backend/lib/webserver/CapabilitiesRouter.js
Expand Up @@ -86,6 +86,7 @@ const CAPABILITY_TYPE_TO_ROUTER_MAPPING = {
[capabilities.WifiScanCapability.TYPE]: capabilityRouters.WifiScanCapabilityRouter,
[capabilities.MopDockCleanManualTriggerCapability.TYPE]: capabilityRouters.MopDockCleanManualTriggerCapabilityRouter,
[capabilities.MopDockDryManualTriggerCapability.TYPE]: capabilityRouters.MopDockDryManualTriggerCapabilityRouter,
[capabilities.CollisionAvoidantNavigationControlCapability.TYPE]: capabilityRouters.SimpleToggleCapabilityRouter,
};

module.exports = CapabilitiesRouter;
Expand Up @@ -460,5 +460,82 @@
}
}
}
},
"/api/v2/robot/capabilities/CollisionAvoidantNavigationControlCapability": {
"get": {
"tags": [
"CollisionAvoidantNavigationControlCapability"
],
"summary": "Get collision avoidant navigation setting",
"responses": {
"200": {
"description": "Ok",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
}
}
}
}
}
}
}
},
"put": {
"tags": [
"CollisionAvoidantNavigationControlCapability"
],
"summary": "Set collision avoidant navigation setting",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"enable",
"disable"
]
}
}
}
}
}
},
"responses": {
"200": {
"$ref": "#/components/responses/200"
},
"400": {
"$ref": "#/components/responses/400"
}
}
}
},
"/api/v2/robot/capabilities/CollisionAvoidantNavigationControlCapability/properties": {
"get": {
"tags": [
"CollisionAvoidantNavigationControlCapability"
],
"summary": "Get various capability-related properties",
"responses": {
"200": {
"description": "Ok",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
}
}
}
}
}
13 changes: 13 additions & 0 deletions frontend/src/api/client.ts
Expand Up @@ -789,6 +789,19 @@ export const sendAutoEmptyDockAutoEmptyControlEnable = async (enable: boolean):
await sendToggleMutation(Capability.AutoEmptyDockAutoEmptyControl, enable);
};

export const fetchCollisionAvoidantNavigationControlState = async (): Promise<SimpleToggleState> => {
return valetudoAPI
.get<SimpleToggleState>(`/robot/capabilities/${Capability.CollisionAvoidantNavigation}`)
.then(({ data }) => {
return data;
});
};

export const sendCollisionAvoidantNavigationControlState = async (enable: boolean): Promise<void> => {
await sendToggleMutation(Capability.CollisionAvoidantNavigation, enable);
};


export const fetchDoNotDisturbConfiguration = async (): Promise<DoNotDisturbConfiguration> => {
return valetudoAPI
.get<DoNotDisturbConfiguration>(`/robot/capabilities/${Capability.DoNotDisturb}`)
Expand Down

0 comments on commit e22e532

Please sign in to comment.