From 6fcfc6a5c1d587fe755b6a68daac38353ec54a9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Beye?= Date: Tue, 30 Sep 2025 20:48:21 +0200 Subject: [PATCH] feat(vendor.dreame): MopDockMopAutoDryingControlCapability --- .../DreameL10SProUltraHeatValetudoRobot.js | 2 +- .../dreame/DreameL10SUltraValetudoRobot.js | 2 +- .../dreame/DreameL10UltraValetudoRobot.js | 2 +- .../dreame/DreameL40UltraValetudoRobot.js | 2 +- .../DreameMovaP10ProUltraValetudoRobot.js | 2 +- .../dreame/DreameMovaS20UltraValetudoRobot.js | 2 +- .../lib/robots/dreame/DreameQuirkFactory.js | 46 ------------- .../dreame/DreameX40MasterValetudoRobot.js | 2 +- .../dreame/DreameX40UltraValetudoRobot.js | 2 +- ...meMopDockMopAutoDryingControlCapability.js | 67 +++++++++++++++++++ .../lib/robots/dreame/capabilities/index.js | 1 + 11 files changed, 76 insertions(+), 54 deletions(-) create mode 100644 backend/lib/robots/dreame/capabilities/DreameMopDockMopAutoDryingControlCapability.js diff --git a/backend/lib/robots/dreame/DreameL10SProUltraHeatValetudoRobot.js b/backend/lib/robots/dreame/DreameL10SProUltraHeatValetudoRobot.js index ed46b6ec..93e898cf 100644 --- a/backend/lib/robots/dreame/DreameL10SProUltraHeatValetudoRobot.js +++ b/backend/lib/robots/dreame/DreameL10SProUltraHeatValetudoRobot.js @@ -177,6 +177,7 @@ class DreameL10SProUltraHeatValetudoRobot extends DreameGen4ValetudoRobot { capabilities.DreameMopDockMopWashTemperatureControlCapabilityV1, capabilities.DreameMopTwistControlCapabilityV2, capabilities.DreameMopExtensionFurnitureLegHandlingControlCapability, + capabilities.DreameMopDockMopAutoDryingControlCapability, ].forEach(capability => { this.registerCapability(new capability({robot: this})); }); @@ -190,7 +191,6 @@ class DreameL10SProUltraHeatValetudoRobot extends DreameGen4ValetudoRobot { quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_DETERGENT), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WET_DRY_SWITCH), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_REPAIR_TRIGGER), - quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_DRYING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.DRAIN_INTERNAL_WATER_TANK), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.CARPET_DETECTION_AUTO_DEEP_CLEANING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WATER_USAGE), diff --git a/backend/lib/robots/dreame/DreameL10SUltraValetudoRobot.js b/backend/lib/robots/dreame/DreameL10SUltraValetudoRobot.js index 984cc185..d8284aa1 100644 --- a/backend/lib/robots/dreame/DreameL10SUltraValetudoRobot.js +++ b/backend/lib/robots/dreame/DreameL10SUltraValetudoRobot.js @@ -182,6 +182,7 @@ class DreameL10SUltraValetudoRobot extends DreameGen2LidarValetudoRobot { capabilities.DreameCollisionAvoidantNavigationControlCapability, capabilities.DreameAutoEmptyDockAutoEmptyIntervalControlCapabilityV1, capabilities.DreameMopTwistControlCapabilityV1, + capabilities.DreameMopDockMopAutoDryingControlCapability, ].forEach(capability => { this.registerCapability(new capability({robot: this})); }); @@ -196,7 +197,6 @@ class DreameL10SUltraValetudoRobot extends DreameGen2LidarValetudoRobot { quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_DETERGENT), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WET_DRY_SWITCH), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_REPAIR_TRIGGER), - quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_DRYING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.DRAIN_INTERNAL_WATER_TANK), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.WATER_HOOKUP_TEST_TRIGGER), ] diff --git a/backend/lib/robots/dreame/DreameL10UltraValetudoRobot.js b/backend/lib/robots/dreame/DreameL10UltraValetudoRobot.js index a49b7ce4..df9c881a 100644 --- a/backend/lib/robots/dreame/DreameL10UltraValetudoRobot.js +++ b/backend/lib/robots/dreame/DreameL10UltraValetudoRobot.js @@ -161,6 +161,7 @@ class DreameL10UltraValetudoRobot extends DreameGen2LidarValetudoRobot { capabilities.DreameCollisionAvoidantNavigationControlCapability, capabilities.DreameAutoEmptyDockAutoEmptyIntervalControlCapabilityV1, capabilities.DreameMopTwistControlCapabilityV1, + capabilities.DreameMopDockMopAutoDryingControlCapability, ].forEach(capability => { this.registerCapability(new capability({robot: this})); }); @@ -174,7 +175,6 @@ class DreameL10UltraValetudoRobot extends DreameGen2LidarValetudoRobot { quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DRYING_TIME), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WET_DRY_SWITCH), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_REPAIR_TRIGGER), - quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_DRYING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.DRAIN_INTERNAL_WATER_TANK), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_CLEANING_PROCESS_TRIGGER), ] diff --git a/backend/lib/robots/dreame/DreameL40UltraValetudoRobot.js b/backend/lib/robots/dreame/DreameL40UltraValetudoRobot.js index 4d6c69f2..fcf09253 100644 --- a/backend/lib/robots/dreame/DreameL40UltraValetudoRobot.js +++ b/backend/lib/robots/dreame/DreameL40UltraValetudoRobot.js @@ -183,6 +183,7 @@ class DreameL40UltraValetudoRobot extends DreameGen4ValetudoRobot { capabilities.DreameMopDockMopWashTemperatureControlCapabilityV2, capabilities.DreameMopTwistControlCapabilityV2, capabilities.DreameMopExtensionFurnitureLegHandlingControlCapability, + capabilities.DreameMopDockMopAutoDryingControlCapability, ].forEach(capability => { this.registerCapability(new capability({robot: this})); }); @@ -196,7 +197,6 @@ class DreameL40UltraValetudoRobot extends DreameGen4ValetudoRobot { quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_DETERGENT), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WET_DRY_SWITCH), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_REPAIR_TRIGGER), - quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_DRYING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.DRAIN_INTERNAL_WATER_TANK), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.CARPET_DETECTION_AUTO_DEEP_CLEANING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WATER_USAGE), diff --git a/backend/lib/robots/dreame/DreameMovaP10ProUltraValetudoRobot.js b/backend/lib/robots/dreame/DreameMovaP10ProUltraValetudoRobot.js index 1ed2c234..710caca4 100644 --- a/backend/lib/robots/dreame/DreameMovaP10ProUltraValetudoRobot.js +++ b/backend/lib/robots/dreame/DreameMovaP10ProUltraValetudoRobot.js @@ -183,6 +183,7 @@ class DreameMovaP10ProUltraValetudoRobot extends DreameGen4ValetudoRobot { capabilities.DreameMopDockMopWashTemperatureControlCapabilityV2, capabilities.DreameMopTwistControlCapabilityV2, capabilities.DreameMopExtensionFurnitureLegHandlingControlCapability, + capabilities.DreameMopDockMopAutoDryingControlCapability, ].forEach(capability => { this.registerCapability(new capability({robot: this})); }); @@ -196,7 +197,6 @@ class DreameMovaP10ProUltraValetudoRobot extends DreameGen4ValetudoRobot { quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_DETERGENT), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WET_DRY_SWITCH), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_REPAIR_TRIGGER), - quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_DRYING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.DRAIN_INTERNAL_WATER_TANK), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.CARPET_DETECTION_AUTO_DEEP_CLEANING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WATER_USAGE), diff --git a/backend/lib/robots/dreame/DreameMovaS20UltraValetudoRobot.js b/backend/lib/robots/dreame/DreameMovaS20UltraValetudoRobot.js index 538d0d8e..1e90fe36 100644 --- a/backend/lib/robots/dreame/DreameMovaS20UltraValetudoRobot.js +++ b/backend/lib/robots/dreame/DreameMovaS20UltraValetudoRobot.js @@ -180,6 +180,7 @@ class DreameMovaS20UltraValetudoRobot extends DreameGen4ValetudoRobot { capabilities.DreameAutoEmptyDockAutoEmptyIntervalControlCapabilityV2, capabilities.DreameCameraLightControlCapability, capabilities.DreameMopTwistControlCapabilityV1, + capabilities.DreameMopDockMopAutoDryingControlCapability, ].forEach(capability => { this.registerCapability(new capability({robot: this})); }); @@ -193,7 +194,6 @@ class DreameMovaS20UltraValetudoRobot extends DreameGen4ValetudoRobot { quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_DETERGENT), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WET_DRY_SWITCH), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_REPAIR_TRIGGER), - quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_DRYING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.DRAIN_INTERNAL_WATER_TANK), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.CARPET_DETECTION_AUTO_DEEP_CLEANING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WATER_USAGE), diff --git a/backend/lib/robots/dreame/DreameQuirkFactory.js b/backend/lib/robots/dreame/DreameQuirkFactory.js index 012e5f35..9a6b31bd 100644 --- a/backend/lib/robots/dreame/DreameQuirkFactory.js +++ b/backend/lib/robots/dreame/DreameQuirkFactory.js @@ -467,51 +467,6 @@ class DreameQuirkFactory { } } }); - case DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_DRYING: - return new Quirk({ - id: id, - title: "Mop Auto drying", - description: "Select if the dock should automatically dry the mop after a cleanup", - options: ["on", "off"], - getter: async () => { - const res = await this.helper.readProperty( - DreameMiotServices["GEN2"].VACUUM_2.SIID, - DreameMiotServices["GEN2"].VACUUM_2.PROPERTIES.MISC_TUNABLES.PIID - ); - - const deserializedResponse = DreameUtils.DESERIALIZE_MISC_TUNABLES(res); - switch (deserializedResponse.AutoDry) { - case 0: - return "off"; - case 1: - return "on"; - default: - throw new Error(`Received invalid value ${deserializedResponse.AutoDry}`); - } - }, - setter: async (value) => { - let val; - - switch (value) { - case "off": - val = 0; - break; - case "on": - val = 1; - break; - default: - throw new Error(`Received invalid value ${value}`); - } - - return this.helper.writeProperty( - DreameMiotServices["GEN2"].VACUUM_2.SIID, - DreameMiotServices["GEN2"].VACUUM_2.PROPERTIES.MISC_TUNABLES.PIID, - DreameUtils.SERIALIZE_MISC_TUNABLES_SINGLE_TUNABLE({ - AutoDry: val - }) - ); - } - }); case DreameQuirkFactory.KNOWN_QUIRKS.DRAIN_INTERNAL_WATER_TANK: return new Quirk({ id: id, @@ -967,7 +922,6 @@ DreameQuirkFactory.KNOWN_QUIRKS = { MOP_DOCK_DETERGENT: "a2a03d42-c710-45e5-b53a-4bc62778589f", MOP_DOCK_WET_DRY_SWITCH: "66adac0f-0a16-4049-b6ac-080ef702bb39", MOP_DOCK_AUTO_REPAIR_TRIGGER: "ae753798-aa4f-4b35-a60c-91e7e5ae76f3", - MOP_DOCK_AUTO_DRYING: "6efc4d62-b5a4-474e-b353-5746a99ee8f9", DRAIN_INTERNAL_WATER_TANK: "3e1b0851-3a5a-4943-bea6-dea3d7284bff", CARPET_DETECTION_AUTO_DEEP_CLEANING: "9450a668-88d7-4ff3-9455-a78b485fb33b", MOP_DOCK_WATER_USAGE: "2d4ce805-ebf7-4dcf-b919-c5fe4d4f2de3", diff --git a/backend/lib/robots/dreame/DreameX40MasterValetudoRobot.js b/backend/lib/robots/dreame/DreameX40MasterValetudoRobot.js index f1a59e73..c493d9d4 100644 --- a/backend/lib/robots/dreame/DreameX40MasterValetudoRobot.js +++ b/backend/lib/robots/dreame/DreameX40MasterValetudoRobot.js @@ -183,6 +183,7 @@ class DreameX40MasterValetudoRobot extends DreameGen4ValetudoRobot { capabilities.DreameMopDockMopWashTemperatureControlCapabilityV2, capabilities.DreameMopTwistControlCapabilityV2, capabilities.DreameMopExtensionFurnitureLegHandlingControlCapability, + capabilities.DreameMopDockMopAutoDryingControlCapability, ].forEach(capability => { this.registerCapability(new capability({robot: this})); }); @@ -196,7 +197,6 @@ class DreameX40MasterValetudoRobot extends DreameGen4ValetudoRobot { quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_DETERGENT), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WET_DRY_SWITCH), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_REPAIR_TRIGGER), - quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_DRYING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.DRAIN_INTERNAL_WATER_TANK), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.CARPET_DETECTION_AUTO_DEEP_CLEANING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WATER_USAGE), diff --git a/backend/lib/robots/dreame/DreameX40UltraValetudoRobot.js b/backend/lib/robots/dreame/DreameX40UltraValetudoRobot.js index 4b5b2183..bd35bf4c 100644 --- a/backend/lib/robots/dreame/DreameX40UltraValetudoRobot.js +++ b/backend/lib/robots/dreame/DreameX40UltraValetudoRobot.js @@ -183,6 +183,7 @@ class DreameX40UltraValetudoRobot extends DreameGen4ValetudoRobot { capabilities.DreameMopDockMopWashTemperatureControlCapabilityV2, capabilities.DreameMopTwistControlCapabilityV2, capabilities.DreameMopExtensionFurnitureLegHandlingControlCapability, + capabilities.DreameMopDockMopAutoDryingControlCapability, ].forEach(capability => { this.registerCapability(new capability({robot: this})); }); @@ -196,7 +197,6 @@ class DreameX40UltraValetudoRobot extends DreameGen4ValetudoRobot { quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_DETERGENT), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WET_DRY_SWITCH), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_REPAIR_TRIGGER), - quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_AUTO_DRYING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.DRAIN_INTERNAL_WATER_TANK), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.CARPET_DETECTION_AUTO_DEEP_CLEANING), quirkFactory.getQuirk(DreameQuirkFactory.KNOWN_QUIRKS.MOP_DOCK_WATER_USAGE), diff --git a/backend/lib/robots/dreame/capabilities/DreameMopDockMopAutoDryingControlCapability.js b/backend/lib/robots/dreame/capabilities/DreameMopDockMopAutoDryingControlCapability.js new file mode 100644 index 00000000..3f189ea4 --- /dev/null +++ b/backend/lib/robots/dreame/capabilities/DreameMopDockMopAutoDryingControlCapability.js @@ -0,0 +1,67 @@ +const DreameMiotHelper = require("../DreameMiotHelper"); +const DreameMiotServices = require("../DreameMiotServices"); +const DreameUtils = require("../DreameUtils"); +const MopDockMopAutoDryingControlCapability = require("../../../core/capabilities/MopDockMopAutoDryingControlCapability"); +const {sleep} = require("../../../utils/misc"); + +/** + * @extends MopDockMopAutoDryingControlCapability + */ +class DreameMopDockMopAutoDryingControlCapability extends MopDockMopAutoDryingControlCapability { + + /** + * @param {object} options + * @param {import("../DreameValetudoRobot")} options.robot + */ + constructor(options) { + super(options); + + this.siid = DreameMiotServices["GEN2"].VACUUM_2.SIID; + this.piid = DreameMiotServices["GEN2"].VACUUM_2.PROPERTIES.MISC_TUNABLES.PIID; + + this.helper = new DreameMiotHelper({robot: this.robot}); + } + + /** + * + * @returns {Promise} + */ + async isEnabled() { + const res = await this.helper.readProperty(this.siid, this.piid); + const deserializedResponse = DreameUtils.DESERIALIZE_MISC_TUNABLES(res); + + return deserializedResponse.AutoDry === 1; + } + + /** + * @returns {Promise} + */ + async enable() { + await this.helper.writeProperty( + this.siid, + this.piid, + DreameUtils.SERIALIZE_MISC_TUNABLES_SINGLE_TUNABLE({ + AutoDry: 1 + }) + ); + + await sleep(100); // Give the robot some time to think + } + + /** + * @returns {Promise} + */ + async disable() { + await this.helper.writeProperty( + this.siid, + this.piid, + DreameUtils.SERIALIZE_MISC_TUNABLES_SINGLE_TUNABLE({ + AutoDry: 0 + }) + ); + + await sleep(100); // Give the robot some time to think + } +} + +module.exports = DreameMopDockMopAutoDryingControlCapability; diff --git a/backend/lib/robots/dreame/capabilities/index.js b/backend/lib/robots/dreame/capabilities/index.js index a36bed1e..ac9e0529 100644 --- a/backend/lib/robots/dreame/capabilities/index.js +++ b/backend/lib/robots/dreame/capabilities/index.js @@ -32,6 +32,7 @@ module.exports = { DreameMappingPassCapability: require("./DreameMappingPassCapability"), DreameMopDockCleanManualTriggerCapability: require("./DreameMopDockCleanManualTriggerCapability"), DreameMopDockDryManualTriggerCapability: require("./DreameMopDockDryManualTriggerCapability"), + DreameMopDockMopAutoDryingControlCapability: require("./DreameMopDockMopAutoDryingControlCapability"), DreameMopDockMopWashTemperatureControlCapabilityV1: require("./DreameMopDockMopWashTemperatureControlCapabilityV1"), DreameMopDockMopWashTemperatureControlCapabilityV2: require("./DreameMopDockMopWashTemperatureControlCapabilityV2"), DreameMopDockWaterUsageControlCapability: require("./DreameMopDockWaterUsageControlCapability"),