From a7179d218ba699caf9c7d6a03fc3b5030b694f9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Beye?= Date: Thu, 7 Sep 2023 07:25:44 +0200 Subject: [PATCH] feat(MockRobot): Mock more capabilities --- backend/lib/robots/mock/MockRobot.js | 10 + .../MockCarpetSensorModeControlCapability.js | 37 ++++ ...sionAvoidantNavigationControlCapability.js | 36 ++++ ...MockMopDockCleanManualTriggerCapability.js | 27 +++ .../MockMopDockDryManualTriggerCapability.js | 27 +++ .../MockOperationModeControlCapability.js | 50 +++++ ...ckPetObstacleAvoidanceControlCapability.js | 36 ++++ backend/lib/robots/mock/capabilities/index.js | 6 + docs/_pages/installation/dreame.md | 2 +- docs/_pages/integrations/mqtt.md | 45 +++++ docs/_pages/usage/capabilities-overview.md | 93 ++++++++- docs/_pages/usage/implementation-overview.md | 182 ++++++++++++------ 12 files changed, 489 insertions(+), 62 deletions(-) create mode 100644 backend/lib/robots/mock/capabilities/MockCarpetSensorModeControlCapability.js create mode 100644 backend/lib/robots/mock/capabilities/MockCollisionAvoidantNavigationControlCapability.js create mode 100644 backend/lib/robots/mock/capabilities/MockMopDockCleanManualTriggerCapability.js create mode 100644 backend/lib/robots/mock/capabilities/MockMopDockDryManualTriggerCapability.js create mode 100644 backend/lib/robots/mock/capabilities/MockOperationModeControlCapability.js create mode 100644 backend/lib/robots/mock/capabilities/MockPetObstacleAvoidanceControlCapability.js diff --git a/backend/lib/robots/mock/MockRobot.js b/backend/lib/robots/mock/MockRobot.js index 81978dc1475..580c25b3c82 100644 --- a/backend/lib/robots/mock/MockRobot.js +++ b/backend/lib/robots/mock/MockRobot.js @@ -46,6 +46,12 @@ class MockRobot extends ValetudoRobot { this.registerCapability(new capabilities.MockManualControlCapability({robot: this})); this.registerCapability(new capabilities.MockCurrentStatisticsCapability({robot: this})); this.registerCapability(new capabilities.MockTotalStatisticsCapability({robot: this})); + this.registerCapability(new capabilities.MockOperationModeControlCapability({robot: this})); + this.registerCapability(new capabilities.MockPetObstacleAvoidanceControlCapability({robot: this})); + this.registerCapability(new capabilities.MockCollisionAvoidantNavigationControlCapability({robot: this})); + this.registerCapability(new capabilities.MockCarpetSensorModeControlCapability({robot: this})); + this.registerCapability(new capabilities.MockMopDockCleanManualTriggerCapability({robot: this})); + this.registerCapability(new capabilities.MockMopDockDryManualTriggerCapability({robot: this})); // Raise events to make them visible in the UI options.valetudoEventStore.raise(new DustBinFullValetudoEvent({})); @@ -54,6 +60,10 @@ class MockRobot extends ValetudoRobot { options.valetudoEventStore.raise(new ErrorStateValetudoEvent({ message: "This is an error message" })); + + this.state.upsertFirstMatchingAttribute(new entities.state.attributes.DockStatusStateAttribute({ + value: entities.state.attributes.DockStatusStateAttribute.VALUE.IDLE + })); } getManufacturer() { diff --git a/backend/lib/robots/mock/capabilities/MockCarpetSensorModeControlCapability.js b/backend/lib/robots/mock/capabilities/MockCarpetSensorModeControlCapability.js new file mode 100644 index 00000000000..38334299817 --- /dev/null +++ b/backend/lib/robots/mock/capabilities/MockCarpetSensorModeControlCapability.js @@ -0,0 +1,37 @@ +const CarpetSensorModeControlCapability = require("../../../core/capabilities/CarpetSensorModeControlCapability"); + +/** + * @extends CarpetSensorModeControlCapability + */ +class MockCarpetSensorModeControlCapability extends CarpetSensorModeControlCapability { + + /** + * @param {object} options + * @param {import("../MockRobot")} options.robot + */ + constructor(options) { + super(options); + + this.mode = CarpetSensorModeControlCapability.MODE.LIFT; + } + + async getMode() { + return this.mode; + } + + async setMode(newMode) { + this.mode = newMode; + } + + getProperties() { + return { + supportedModes: [ + CarpetSensorModeControlCapability.MODE.LIFT, + CarpetSensorModeControlCapability.MODE.AVOID, + CarpetSensorModeControlCapability.MODE.OFF, + ] + }; + } +} + +module.exports = MockCarpetSensorModeControlCapability; diff --git a/backend/lib/robots/mock/capabilities/MockCollisionAvoidantNavigationControlCapability.js b/backend/lib/robots/mock/capabilities/MockCollisionAvoidantNavigationControlCapability.js new file mode 100644 index 00000000000..4bc1a052181 --- /dev/null +++ b/backend/lib/robots/mock/capabilities/MockCollisionAvoidantNavigationControlCapability.js @@ -0,0 +1,36 @@ +const CollisionAvoidantNavigationControlCapability = require("../../../core/capabilities/CollisionAvoidantNavigationControlCapability"); + +/** + * @extends CollisionAvoidantNavigationControlCapability + */ +class MockCollisionAvoidantNavigationControlCapability extends CollisionAvoidantNavigationControlCapability { + /** + * @param {object} options + * @param {import("../MockRobot")} options.robot + */ + constructor(options) { + super(options); + + this.enabled = true; + } + + async isEnabled() { + return this.enabled; + } + + /** + * @returns {Promise} + */ + async enable() { + this.enabled = true; + } + + /** + * @returns {Promise} + */ + async disable() { + this.enabled = false; + } +} + +module.exports = MockCollisionAvoidantNavigationControlCapability; diff --git a/backend/lib/robots/mock/capabilities/MockMopDockCleanManualTriggerCapability.js b/backend/lib/robots/mock/capabilities/MockMopDockCleanManualTriggerCapability.js new file mode 100644 index 00000000000..2bf18f8ae06 --- /dev/null +++ b/backend/lib/robots/mock/capabilities/MockMopDockCleanManualTriggerCapability.js @@ -0,0 +1,27 @@ +const entities = require("../../../entities"); +const MopDockCleanManualTriggerCapability = require("../../../core/capabilities/MopDockCleanManualTriggerCapability"); + +/** + * @extends MopDockCleanManualTriggerCapability + */ +class MockMopDockCleanManualTriggerCapability extends MopDockCleanManualTriggerCapability { + /** + * @returns {Promise} + */ + async startCleaning() { + this.robot.state.upsertFirstMatchingAttribute(new entities.state.attributes.DockStatusStateAttribute({ + value: entities.state.attributes.DockStatusStateAttribute.VALUE.CLEANING + })); + } + + /** + * @returns {Promise} + */ + async stopCleaning() { + this.robot.state.upsertFirstMatchingAttribute(new entities.state.attributes.DockStatusStateAttribute({ + value: entities.state.attributes.DockStatusStateAttribute.VALUE.IDLE + })); + } +} + +module.exports = MockMopDockCleanManualTriggerCapability; diff --git a/backend/lib/robots/mock/capabilities/MockMopDockDryManualTriggerCapability.js b/backend/lib/robots/mock/capabilities/MockMopDockDryManualTriggerCapability.js new file mode 100644 index 00000000000..e87b7ed56c8 --- /dev/null +++ b/backend/lib/robots/mock/capabilities/MockMopDockDryManualTriggerCapability.js @@ -0,0 +1,27 @@ +const entities = require("../../../entities"); +const MopDockDryManualTriggerCapability = require("../../../core/capabilities/MopDockDryManualTriggerCapability"); + +/** + * @extends MopDockDryManualTriggerCapability + */ +class MockMopDockDryManualTriggerCapability extends MopDockDryManualTriggerCapability { + /** + * @returns {Promise} + */ + async startDrying() { + this.robot.state.upsertFirstMatchingAttribute(new entities.state.attributes.DockStatusStateAttribute({ + value: entities.state.attributes.DockStatusStateAttribute.VALUE.DRYING + })); + } + + /** + * @returns {Promise} + */ + async stopDrying() { + this.robot.state.upsertFirstMatchingAttribute(new entities.state.attributes.DockStatusStateAttribute({ + value: entities.state.attributes.DockStatusStateAttribute.VALUE.IDLE + })); + } +} + +module.exports = MockMopDockDryManualTriggerCapability; diff --git a/backend/lib/robots/mock/capabilities/MockOperationModeControlCapability.js b/backend/lib/robots/mock/capabilities/MockOperationModeControlCapability.js new file mode 100644 index 00000000000..20c515dfe43 --- /dev/null +++ b/backend/lib/robots/mock/capabilities/MockOperationModeControlCapability.js @@ -0,0 +1,50 @@ +const entities = require("../../../entities"); +const OperationModeControlCapability = require("../../../core/capabilities/OperationModeControlCapability"); +const ValetudoSelectionPreset = require("../../../entities/core/ValetudoSelectionPreset"); +const stateAttrs = entities.state.attributes; + +/** + * @extends OperationModeControlCapability + */ +class MockOperationModeControlCapability extends OperationModeControlCapability { + /** + * @param {object} options + * @param {import("../MockRobot")} options.robot + */ + constructor(options) { + let presets = [ + new ValetudoSelectionPreset({name: entities.state.attributes.PresetSelectionStateAttribute.MODE.MOP, value: 0}), + new ValetudoSelectionPreset({name: entities.state.attributes.PresetSelectionStateAttribute.MODE.VACUUM, value: 1}), + new ValetudoSelectionPreset({name: entities.state.attributes.PresetSelectionStateAttribute.MODE.VACUUM_AND_MOP, value: 2}) + ]; + super({ + robot: options.robot, + presets: presets + }); + + this.StateAttr = new stateAttrs.PresetSelectionStateAttribute({ + type: stateAttrs.PresetSelectionStateAttribute.TYPE.OPERATION_MODE, + value: stateAttrs.PresetSelectionStateAttribute.MODE.VACUUM + }); + + this.robot.state.upsertFirstMatchingAttribute(this.StateAttr); + } + + /** + * @param {string} preset + * @returns {Promise} + */ + async selectPreset(preset) { + const matchedPreset = this.presets.find(p => { + return p.name === preset; + }); + + if (matchedPreset) { + this.StateAttr.value = matchedPreset.name; + } else { + throw new Error("Invalid Preset"); + } + } +} + +module.exports = MockOperationModeControlCapability; diff --git a/backend/lib/robots/mock/capabilities/MockPetObstacleAvoidanceControlCapability.js b/backend/lib/robots/mock/capabilities/MockPetObstacleAvoidanceControlCapability.js new file mode 100644 index 00000000000..ae40f4ce66e --- /dev/null +++ b/backend/lib/robots/mock/capabilities/MockPetObstacleAvoidanceControlCapability.js @@ -0,0 +1,36 @@ +const PetObstacleAvoidanceControlCapability = require("../../../core/capabilities/PetObstacleAvoidanceControlCapability"); + +/** + * @extends PetObstacleAvoidanceControlCapability + */ +class MockPetObstacleAvoidanceControlCapability extends PetObstacleAvoidanceControlCapability { + /** + * @param {object} options + * @param {import("../MockRobot")} options.robot + */ + constructor(options) { + super(options); + + this.enabled = true; + } + + async isEnabled() { + return this.enabled; + } + + /** + * @returns {Promise} + */ + async enable() { + this.enabled = true; + } + + /** + * @returns {Promise} + */ + async disable() { + this.enabled = false; + } +} + +module.exports = MockPetObstacleAvoidanceControlCapability; diff --git a/backend/lib/robots/mock/capabilities/index.js b/backend/lib/robots/mock/capabilities/index.js index 9f080ca11ab..c4eb9524fab 100644 --- a/backend/lib/robots/mock/capabilities/index.js +++ b/backend/lib/robots/mock/capabilities/index.js @@ -3,6 +3,8 @@ module.exports = { MockAutoEmptyDockManualTriggerCapability: require("./MockAutoEmptyDockManualTriggerCapability"), MockBasicControlCapability: require("./MockBasicControlCapability"), MockCarpetModeControlCapability: require("./MockCarpetModeControlCapability"), + MockCarpetSensorModeControlCapability: require("./MockCarpetSensorModeControlCapability"), + MockCollisionAvoidantNavigationControlCapability: require("./MockCollisionAvoidantNavigationControlCapability"), MockConsumableMonitoringCapability: require("./MockConsumableMonitoringCapability"), MockCurrentStatisticsCapability: require("./MockCurrentStatisticsCapability"), MockDoNotDisturbCapability: require("./MockDoNotDisturbCapability"), @@ -14,9 +16,13 @@ module.exports = { MockMapResetCapability: require("./MockMapResetCapability"), MockMapSegmentationCapability: require("./MockMapSegmentationCapability"), MockMappingPassCapability: require("./MockMappingPassCapability"), + MockMopDockCleanManualTriggerCapability: require("./MockMopDockCleanManualTriggerCapability"), + MockMopDockDryManualTriggerCapability: require("./MockMopDockDryManualTriggerCapability"), MockObstacleAvoidanceControlCapability: require("./MockObstacleAvoidanceControlCapability"), + MockOperationModeControlCapability: require("./MockOperationModeControlCapability"), MockPendingMapChangeHandlingCapability: require("./MockPendingMapChangeHandlingCapability"), MockPersistentMapControlCapability: require("./MockPersistentMapControlCapability"), + MockPetObstacleAvoidanceControlCapability: require("./MockPetObstacleAvoidanceControlCapability"), MockSpeakerTestCapability: require("./MockSpeakerTestCapability"), MockSpeakerVolumeControlCapability: require("./MockSpeakerVolumeControlCapability"), MockTotalStatisticsCapability: require("./MockTotalStatisticsCapability"), diff --git a/docs/_pages/installation/dreame.md b/docs/_pages/installation/dreame.md index 2d0cd42038e..dcd25d5a7c3 100644 --- a/docs/_pages/installation/dreame.md +++ b/docs/_pages/installation/dreame.md @@ -316,7 +316,7 @@ which at this point should be connected to the robots Wi-Fi AP. To do that, use the ssh shell to create a tar file of all the required files like so: ``` -tar cvf /tmp/backup.tar /mnt/private/ /mnt/misc/ /etc/OTA_Key_pub.pem /etc/publickey.pem +tar cvf /tmp/backup.tar /mnt/private/ /mnt/misc/ ``` Then, look at the output of the `valetudo-helper-httpbridge` instance you've started previously. diff --git a/docs/_pages/integrations/mqtt.md b/docs/_pages/integrations/mqtt.md index 62956fe4a73..6d8ea87ff1b 100644 --- a/docs/_pages/integrations/mqtt.md +++ b/docs/_pages/integrations/mqtt.md @@ -74,6 +74,8 @@ Homie autodiscovery info is best viewed with something like [MQTT Explorer](http - [Go to location (`go`)](#gotolocationgo) - [Locate (`LocateCapability`)](#locatelocatecapability) - [Locate (`locate`)](#locatelocate) + - [Mode control (`OperationModeControlCapability`)](#modecontroloperationmodecontrolcapability) + - [Mode (`preset`)](#modepreset) - [Segment cleaning (`MapSegmentationCapability`)](#segmentcleaningmapsegmentationcapability) - [Clean segments (`clean`)](#cleansegmentsclean) - [Speaker volume control (`SpeakerVolumeControlCapability`)](#speakervolumecontrolspeakervolumecontrolcapability) @@ -132,6 +134,7 @@ Homie autodiscovery info is best viewed with something like [MQTT Explorer](http - [Fan (`select.mqtt`)](#fanpreset) - [Map data (`camera.mqtt`)](#rawmapdataforhomeassistantmap-data-hass) - [Map segments (`sensor.mqtt`)](#mapsegmentssegments) +- [Mode (`select.mqtt`)](#modepreset) - [Mop attachment (`binary_sensor.mqtt`)](#mopmop) - [Play locate sound (`button.mqtt`)](#locatelocate) - [Reset Consumable (`button.mqtt`)](#resettheconsumableconsumable-minutesreset) @@ -476,6 +479,48 @@ Sample payload: +#### Mode control (`OperationModeControlCapability`) + +*Node, capability: [OperationModeControlCapability](/pages/usage/capabilities-overview.html#operationmodecontrolcapability)* + +Status attributes managed by this node: + +- PresetSelectionStateAttribute + +##### Mode (`preset`) + +*Property, readable, settable, retained* + +This handle allows setting the mode. It accepts the preset payloads specified in `$format` or in the HAss json attributes. + +- Read topic: `//OperationModeControlCapability/preset` +- Set topic: `//OperationModeControlCapability/preset/set` +- Data type: [enum](https://homieiot.github.io/specification/#enum) (allowed payloads: `mop`, `vacuum`, `vacuum_and_mop`) + +{% include alert.html type="warning" content="Some information contained in this document may not be exactly what is sent or expected by actual robots, since different vendors have different implementations. Refer to the table below. + +|------+--------| +| What | Reason | +|------|--------| +| Enum payloads | Different robot models have different mode presets. Always check `$format`/`json_attributes` during startup. | +|------+--------| + +" %} + +Sample value: + +``` +vacuum +``` + +Home Assistant components controlled by this property: + +- Mode ([`select.mqtt`](https://www.home-assistant.io/integrations/select.mqtt/)) + + + + + #### Speaker volume control (`SpeakerVolumeControlCapability`) *Node, capability: [SpeakerVolumeControlCapability](/pages/usage/capabilities-overview.html#speakervolumecontrolcapability)* diff --git a/docs/_pages/usage/capabilities-overview.md b/docs/_pages/usage/capabilities-overview.md index 09792e2b2d2..b539a8fee8e 100644 --- a/docs/_pages/usage/capabilities-overview.md +++ b/docs/_pages/usage/capabilities-overview.md @@ -11,6 +11,14 @@ To support a growing list of robots with different sub- as well as supersets of Although the names should be fairly self-explanatory, this page documents what each of them does. Your robot will probably have multiple but not all of these. +## AutoEmptyDockAutoEmptyControlCapability + +This capability enables you to control if the robot should automatically auto-empty its dustbin into the auto-empty-dock +after a finished cleanup. + +## AutoEmptyDockManualTriggerCapability + +This capability is used to manually trigger the auto-emptying of the robot's dustbin into the auto-empty-dock. ## BasicControlCapability @@ -31,6 +39,22 @@ If that's not the case, stop will perform a pause. This capability enables you to enable or disable the automatic suction power increase when the robot detects that it has driven onto a carpet. +## CarpetSensorModeControlCapability + +Some robots - usually those with advanced mopping capabilities - come with a dedicated sensor - usually ultrasonic - used +to detect carpets. This capability allows you to select how the robot should deal with carpets detected during navigation. + +Depending on your robot, possible options can include +- Ignore and just drive over it +- Avoid +- Lift the mop + +## CollisionAvoidantNavigationControlCapability + +Some robots and firmwares allow the user to tweak the robots navigation a little. +As the name suggests, this capability provides a toggle that allows to select between less bumps into things or less risk of +missed areas during cleaning. + ## CombinedVirtualRestrictionsCapability This capability enables you to configure Virtual Walls + Restricted Zones. @@ -39,6 +63,10 @@ This capability enables you to configure Virtual Walls + Restricted Zones. This capability enables you to view and reset the status of the consumables of your robot. +## CurrentStatisticsCapability + +This capability provides statistics such as covered area or runtime of the current or most recent cleanup job. + ## DoNotDisturbCapability This capability enables you to set a DND timespan. @@ -68,13 +96,9 @@ This capability enables you to let the robot play some kind of sound often at fu Useful if you've completely lost track of where that thing went. It's usually below the couch. -## MappingPassCapability +## ManualControlCapability -Some robots may allow for or even require a mapping pass instead of building the map as they go. -This capability is used to start the mapping process. - -Don't be confused if your robot doesn't have this capability. -Usually, they will build the map during cleanup without requiring a separate mapping pass. +This capability allows manually driving around the robot like an RC car with tank controls. ## MapResetCapability @@ -103,9 +127,34 @@ I just didn't like the term room, because they don't necessarily have to actuall This capability enables you to list all existing map snapshots as well as restore one of them. -Snapshots are made automatically by the robots firmware. They're basically backups. +Snapshots are made automatically by the robots' firmware. They're basically backups. Use this if your robot has lost track of where it is and somehow corrupted the map. +## MappingPassCapability + +Some robots may allow for or even require a mapping pass instead of building the map as they go. +This capability is used to start the mapping process. + +Don't be confused if your robot doesn't have this capability. +Usually, they will build the map during cleanup without requiring a separate mapping pass. + +## MopDockCleanManualTriggerCapability + +This capability allows you to start and stop cleaning of the mops in the mop dock. + +## MopDockDryManualTriggerCapability + +This capability allows you to start and stop drying of the mops in the mop dock. + +## ObstacleAvoidanceControlCapability + +Some robots featuring obstacle detection and avoidance using technology such as fully local AI object detection or lasers +give you the option to completely disable that. This can be useful if it wrongly detects and avoids obstacles where there are none. + +## OperationModeControlCapability + +This capability allows you to select if the robot should only vacuum, only mop or both. + ## PendingMapChangeHandlingCapability Some robots may occasionally discover a new map and ask for user confirmation to actually use it. @@ -116,6 +165,31 @@ This capability enables you to either accept or reject the new map. This capability enables you to control whether the robot persists its map across cleanups. When persisted maps are disabled, a new map is generated on each new full cleanup. +## PetObstacleAvoidanceControlCapability + +Robots featuring fully local AI camera object detection for obstacle avoidance may feature a special AI model specifically +tuned to detect pet feces that would otherwise lead to catastrophic and fatal results. + +Because of that, these models are a bit trigger-happy and therefore may cause detection of objects where there are none +which is why the firmware allows robot owners without pets to disable that and get less ghost obstacles in return. + +## QuirksCapability + +Valetudo aims to be a generic abstraction. That means that it tries to unify vendor-specific commands and concepts +into generic ones so that you don't have to worry about which brand of robot you buy as Valetudo will work +the same on all of them. + +Sometimes however there might be things that only one Vendor or even only one model of robot does. +Adding that to the core infrastructure of Valetudo wouldn't make sense as the generic interface would soon become an +interface specific to one particular robot which would go against the core goal of being vendor-agnostic. + +Still, limiting features to the least common denominator may at times also not be ideal. +This is where quirks come in. + +A quirk is a vendor, robot or firmware-specific tunable that doesn't fit into Valetudo (yet?). + +Think of quirks as some kind of convenience playground testing section. +Usually, they will be tunables that you change once and then likely never touch again. ## SpeakerTestCapability @@ -126,6 +200,11 @@ It is used to try out the newly set audio volume. This capability enables you to control the volume of the integrated speaker of the robot. +## TotalStatisticsCapability + +This capability provides all-time statistics such as covered area, cleanup count or total runtime. +Depending on your robot, these might not survive a factory reset. + ## VoicePackManagementCapability This capability enables you to change and upload new voice packs to the robot. diff --git a/docs/_pages/usage/implementation-overview.md b/docs/_pages/usage/implementation-overview.md index 41ba7f8a950..8c21860346d 100644 --- a/docs/_pages/usage/implementation-overview.md +++ b/docs/_pages/usage/implementation-overview.md @@ -35,22 +35,24 @@ Don't take this as "Everything listed here will be 100% available and work all t 10. [MOVA Z500](#dreame_movaz500) 11. [P2148](#dreame_p2148) 12. [P2150](#dreame_p2150) - 13. [W10](#dreame_w10) - 14. [X10+](#dreame_x10) - 15. [Z10 Pro](#dreame_z10pro) + 13. [W10 Pro](#dreame_w10pro) + 14. [W10](#dreame_w10) + 15. [X10+](#dreame_x10) + 16. [Z10 Pro](#dreame_z10pro) 3. [Roborock](#roborock) - 1. [Q7 Max](#roborock_q7max) - 2. [S4 Max](#roborock_s4max) - 3. [S4](#roborock_s4) - 4. [S5 Max](#roborock_s5max) - 5. [S5](#roborock_s5) - 6. [S6 Pure](#roborock_s6pure) - 7. [S6](#roborock_s6) - 8. [S7 Pro Ultra](#roborock_s7proultra) - 9. [S7](#roborock_s7) - 10. [S8 Pro Ultra](#roborock_s8proultra) - 11. [S8](#roborock_s8) - 12. [V1](#roborock_v1) + 1. [G10S](#roborock_g10s) + 2. [Q7 Max](#roborock_q7max) + 3. [S4 Max](#roborock_s4max) + 4. [S4](#roborock_s4) + 5. [S5 Max](#roborock_s5max) + 6. [S5](#roborock_s5) + 7. [S6 Pure](#roborock_s6pure) + 8. [S6](#roborock_s6) + 9. [S7 Pro Ultra](#roborock_s7proultra) + 10. [S7](#roborock_s7) + 11. [S8 Pro Ultra](#roborock_s8proultra) + 12. [S8](#roborock_s8) + 13. [V1](#roborock_v1) 4. [Viomi](#viomi) 1. [V6](#viomi_v6) 2. [V7](#viomi_v7) @@ -60,44 +62,44 @@ Don't take this as "Everything listed here will be 100% available and work all t ## Overview -Capability | 1C | 1T | D10S Plus | D10S Pro | D9 Pro | D9 | F9 | L10 Pro | L10S Ultra | MOVA Z500 | P2148 | P2150 | W10 | X10+ | Z10 Pro | Q7 Max | S4 Max | S4 | S5 Max | S5 | S6 Pure | S6 | S7 Pro Ultra | S7 | S8 Pro Ultra | S8 | V1 | V6 | V7 | V8 ----- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- -[AutoEmptyDockAutoEmptyControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#AutoEmptyDockAutoEmptyControlCapability) | No | No | Yes | No | No | No | No | No | Yes | No | No | Yes | No | Yes | Yes | Yes | No | No | No | No | No | No | Yes | Yes | Yes | Yes | No | No | No | No -[AutoEmptyDockManualTriggerCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#AutoEmptyDockManualTriggerCapability) | No | No | Yes | No | No | No | No | No | Yes | No | No | Yes | No | Yes | Yes | Yes | No | No | No | No | No | No | Yes | Yes | Yes | Yes | No | No | No | No -[BasicControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#BasicControlCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes -[CarpetModeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CarpetModeControlCapability) | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes -[CarpetSensorModeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CarpetSensorModeControlCapability) | No | No | No | No | No | No | No | No | Yes | No | No | No | Yes | Yes | No | No | No | No | No | No | No | No | Yes | Yes | Yes | Yes | No | No | No | No -[CollisionAvoidantNavigationControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CollisionAvoidantNavigationControlCapability) | No | No | Yes | Yes | No | No | No | No | Yes | No | No | No | No | Yes | No | No | No | No | No | No | No | No | No | No | Yes | Yes | No | No | No | No -[CombinedVirtualRestrictionsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CombinedVirtualRestrictionsCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes -[ConsumableMonitoringCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ConsumableMonitoringCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes -[CurrentStatisticsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CurrentStatisticsCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes -[DoNotDisturbCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#DoNotDisturbCapability) | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes -[FanSpeedControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#FanSpeedControlCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes -[GoToLocationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#GoToLocationCapability) | No | No | Yes | Yes | No | No | No | No | Yes | No | No | No | No | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | No | No -[KeyLockCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#KeyLockCapability) | No | No | Yes | Yes | No | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No | No | Yes | Yes | Yes | Yes | No | No | No | No -[LocateCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#LocateCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes -[ManualControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ManualControlCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes -[MapResetCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapResetCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes -[MapSegmentEditCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentEditCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes -[MapSegmentRenameCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentRenameCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes -[MapSegmentationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentationCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes -[MapSnapshotCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSnapshotCapability) | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | Yes | No | Yes | No | No | No | No | No | No | No | No -[MappingPassCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MappingPassCapability) | No | No | Yes | Yes | Yes | Yes | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | No | No | Yes | No | No | No | Yes | Yes | Yes | Yes | No | No | No | No -[MopDockCleanManualTriggerCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MopDockCleanManualTriggerCapability) | No | No | No | No | No | No | No | No | Yes | No | No | No | Yes | Yes | No | No | No | No | No | No | No | No | Yes | No | No | No | No | No | No | No -[MopDockDryManualTriggerCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MopDockDryManualTriggerCapability) | No | No | No | No | No | No | No | No | Yes | No | No | No | Yes | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No -[ObstacleAvoidanceControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ObstacleAvoidanceControlCapability) | No | No | Yes | Yes | No | No | No | Yes | Yes | No | No | No | No | Yes | Yes | No | No | No | No | No | No | No | No | No | Yes | Yes | No | No | No | No -[OperationModeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#OperationModeControlCapability) | No | No | No | No | No | No | No | Yes | Yes | No | No | Yes | No | Yes | Yes | No | No | No | No | No | No | No | No | No | No | No | No | Yes | Yes | Yes -[PendingMapChangeHandlingCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#PendingMapChangeHandlingCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No -[PersistentMapControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#PersistentMapControlCapability) | Yes | Yes | No | No | No | No | Yes | No | No | Yes | Yes | No | No | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes -[PetObstacleAvoidanceControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#PetObstacleAvoidanceControlCapability) | No | No | Yes | Yes | No | No | No | No | Yes | No | No | No | No | Yes | No | No | No | No | No | No | No | No | No | No | Yes | Yes | No | No | No | No -[QuirksCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#QuirksCapability) | No | No | Yes | Yes | No | Yes | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes -[SpeakerTestCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#SpeakerTestCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes -[SpeakerVolumeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#SpeakerVolumeControlCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes -[TotalStatisticsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#TotalStatisticsCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | No | No -[VoicePackManagementCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#VoicePackManagementCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes -[WaterUsageControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#WaterUsageControlCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | No | Yes | No | No | No | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes -[WifiConfigurationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#WifiConfigurationCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes -[ZoneCleaningCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ZoneCleaningCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +Capability | 1C | 1T | D10S Plus | D10S Pro | D9 Pro | D9 | F9 | L10 Pro | L10S Ultra | MOVA Z500 | P2148 | P2150 | W10 Pro | W10 | X10+ | Z10 Pro | G10S | Q7 Max | S4 Max | S4 | S5 Max | S5 | S6 Pure | S6 | S7 Pro Ultra | S7 | S8 Pro Ultra | S8 | V1 | V6 | V7 | V8 +---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- +[AutoEmptyDockAutoEmptyControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#AutoEmptyDockAutoEmptyControlCapability) | No | No | Yes | No | No | No | No | No | Yes | No | No | Yes | No | No | Yes | Yes | Yes | Yes | No | No | No | No | No | No | Yes | Yes | Yes | Yes | No | No | No | No +[AutoEmptyDockManualTriggerCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#AutoEmptyDockManualTriggerCapability) | No | No | Yes | No | No | No | No | No | Yes | No | No | Yes | No | No | Yes | Yes | Yes | Yes | No | No | No | No | No | No | Yes | Yes | Yes | Yes | No | No | No | No +[BasicControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#BasicControlCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +[CarpetModeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CarpetModeControlCapability) | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +[CarpetSensorModeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CarpetSensorModeControlCapability) | No | No | No | No | No | No | No | No | Yes | No | No | No | Yes | Yes | Yes | No | Yes | No | No | No | No | No | No | No | Yes | Yes | Yes | Yes | No | No | No | No +[CollisionAvoidantNavigationControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CollisionAvoidantNavigationControlCapability) | No | No | Yes | Yes | No | No | No | No | Yes | No | No | No | No | No | Yes | No | Yes | No | No | No | No | No | No | No | No | No | Yes | Yes | No | No | No | No +[CombinedVirtualRestrictionsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CombinedVirtualRestrictionsCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes +[ConsumableMonitoringCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ConsumableMonitoringCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +[CurrentStatisticsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CurrentStatisticsCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +[DoNotDisturbCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#DoNotDisturbCapability) | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +[FanSpeedControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#FanSpeedControlCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +[GoToLocationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#GoToLocationCapability) | No | No | Yes | Yes | No | No | No | No | Yes | No | No | No | Yes | No | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | No | No +[KeyLockCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#KeyLockCapability) | No | No | Yes | Yes | No | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No | No | Yes | Yes | Yes | Yes | No | No | No | No +[LocateCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#LocateCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +[ManualControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ManualControlCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +[MapResetCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapResetCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes +[MapSegmentEditCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentEditCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes +[MapSegmentRenameCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentRenameCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes +[MapSegmentationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentationCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes +[MapSnapshotCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSnapshotCapability) | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | Yes | No | Yes | No | No | No | No | No | No | No | No +[MappingPassCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MappingPassCapability) | No | No | Yes | Yes | Yes | Yes | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | No | Yes | No | No | No | Yes | Yes | Yes | Yes | No | No | No | No +[MopDockCleanManualTriggerCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MopDockCleanManualTriggerCapability) | No | No | No | No | No | No | No | No | Yes | No | No | No | Yes | Yes | Yes | No | Yes | No | No | No | No | No | No | No | Yes | No | No | No | No | No | No | No +[MopDockDryManualTriggerCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MopDockDryManualTriggerCapability) | No | No | No | No | No | No | No | No | Yes | No | No | No | Yes | Yes | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No +[ObstacleAvoidanceControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ObstacleAvoidanceControlCapability) | No | No | Yes | Yes | No | No | No | Yes | Yes | No | No | No | No | No | Yes | Yes | Yes | No | No | No | No | No | No | No | No | No | Yes | Yes | No | No | No | No +[OperationModeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#OperationModeControlCapability) | No | No | No | No | No | No | No | Yes | Yes | No | No | Yes | Yes | No | Yes | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | Yes | Yes | Yes +[PendingMapChangeHandlingCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#PendingMapChangeHandlingCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No +[PersistentMapControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#PersistentMapControlCapability) | Yes | Yes | No | No | No | No | Yes | No | No | Yes | Yes | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes +[PetObstacleAvoidanceControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#PetObstacleAvoidanceControlCapability) | No | No | Yes | Yes | No | No | No | No | Yes | No | No | No | Yes | No | Yes | No | Yes | No | No | No | No | No | No | No | No | No | Yes | Yes | No | No | No | No +[QuirksCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#QuirksCapability) | No | No | Yes | Yes | No | Yes | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes +[SpeakerTestCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#SpeakerTestCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +[SpeakerVolumeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#SpeakerVolumeControlCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +[TotalStatisticsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#TotalStatisticsCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | No | No +[VoicePackManagementCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#VoicePackManagementCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes +[WaterUsageControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#WaterUsageControlCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | No | Yes | No | No | No | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes +[WifiConfigurationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#WifiConfigurationCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes +[ZoneCleaningCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ZoneCleaningCapability) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes
@@ -462,6 +464,41 @@ Capability | 1C | 1T | + +#### This model supports the following capabilities: + - [BasicControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#BasicControlCapability) + - [CarpetModeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CarpetModeControlCapability) + - [CarpetSensorModeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CarpetSensorModeControlCapability) + - [CombinedVirtualRestrictionsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CombinedVirtualRestrictionsCapability) + - [ConsumableMonitoringCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ConsumableMonitoringCapability) + - [CurrentStatisticsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CurrentStatisticsCapability) + - [DoNotDisturbCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#DoNotDisturbCapability) + - [FanSpeedControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#FanSpeedControlCapability) + - [GoToLocationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#GoToLocationCapability) + - [KeyLockCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#KeyLockCapability) + - [LocateCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#LocateCapability) + - [ManualControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ManualControlCapability) + - [MapResetCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapResetCapability) + - [MapSegmentEditCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentEditCapability) + - [MapSegmentRenameCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentRenameCapability) + - [MapSegmentationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentationCapability) + - [MappingPassCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MappingPassCapability) + - [MopDockCleanManualTriggerCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MopDockCleanManualTriggerCapability) + - [MopDockDryManualTriggerCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MopDockDryManualTriggerCapability) + - [OperationModeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#OperationModeControlCapability) + - [PendingMapChangeHandlingCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#PendingMapChangeHandlingCapability) + - [PetObstacleAvoidanceControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#PetObstacleAvoidanceControlCapability) + - [QuirksCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#QuirksCapability) + - [SpeakerTestCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#SpeakerTestCapability) + - [SpeakerVolumeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#SpeakerVolumeControlCapability) + - [TotalStatisticsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#TotalStatisticsCapability) + - [VoicePackManagementCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#VoicePackManagementCapability) + - [WaterUsageControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#WaterUsageControlCapability) + - [WifiConfigurationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#WifiConfigurationCapability) + - [ZoneCleaningCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ZoneCleaningCapability) + + ### W10 #### This model supports the following capabilities: @@ -568,6 +605,43 @@ Capability | 1C | 1T | +### G10S + +#### This model supports the following capabilities: + - [AutoEmptyDockAutoEmptyControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#AutoEmptyDockAutoEmptyControlCapability) + - [AutoEmptyDockManualTriggerCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#AutoEmptyDockManualTriggerCapability) + - [BasicControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#BasicControlCapability) + - [CarpetModeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CarpetModeControlCapability) + - [CarpetSensorModeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CarpetSensorModeControlCapability) + - [CollisionAvoidantNavigationControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CollisionAvoidantNavigationControlCapability) + - [CombinedVirtualRestrictionsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CombinedVirtualRestrictionsCapability) + - [ConsumableMonitoringCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ConsumableMonitoringCapability) + - [CurrentStatisticsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#CurrentStatisticsCapability) + - [DoNotDisturbCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#DoNotDisturbCapability) + - [FanSpeedControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#FanSpeedControlCapability) + - [GoToLocationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#GoToLocationCapability) + - [KeyLockCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#KeyLockCapability) + - [LocateCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#LocateCapability) + - [ManualControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ManualControlCapability) + - [MapResetCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapResetCapability) + - [MapSegmentEditCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentEditCapability) + - [MapSegmentRenameCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentRenameCapability) + - [MapSegmentationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MapSegmentationCapability) + - [MappingPassCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MappingPassCapability) + - [MopDockCleanManualTriggerCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#MopDockCleanManualTriggerCapability) + - [ObstacleAvoidanceControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ObstacleAvoidanceControlCapability) + - [PersistentMapControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#PersistentMapControlCapability) + - [PetObstacleAvoidanceControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#PetObstacleAvoidanceControlCapability) + - [QuirksCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#QuirksCapability) + - [SpeakerTestCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#SpeakerTestCapability) + - [SpeakerVolumeControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#SpeakerVolumeControlCapability) + - [TotalStatisticsCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#TotalStatisticsCapability) + - [VoicePackManagementCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#VoicePackManagementCapability) + - [WaterUsageControlCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#WaterUsageControlCapability) + - [WifiConfigurationCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#WifiConfigurationCapability) + - [ZoneCleaningCapability](https://valetudo.cloud/pages/usage/capabilities-overview.html#ZoneCleaningCapability) + + ### Q7 Max #### This model supports the following capabilities: @@ -1009,4 +1083,4 @@ Capability | 1C | 1T |



This page has been autogenerated.
-Autogeneration timestamp: 2023-08-13T13:37:24.150Z +Autogeneration timestamp: 2023-09-06T18:21:46.902Z