feat(core): MopDockMopAutoDryingControlCapability

This commit is contained in:
Sören Beye 2025-09-30 20:44:45 +02:00
parent 921dd13b82
commit f150a89f2c
8 changed files with 165 additions and 0 deletions

View File

@ -0,0 +1,15 @@
const SimpleToggleCapability = require("./SimpleToggleCapability");
/**
* @template {import("../ValetudoRobot")} T
* @extends SimpleToggleCapability<T>
*/
class MopDockMopAutoDryingControlCapability extends SimpleToggleCapability {
getType() {
return MopDockMopAutoDryingControlCapability.TYPE;
}
}
MopDockMopAutoDryingControlCapability.TYPE = "MopDockMopAutoDryingControlCapability";
module.exports = MopDockMopAutoDryingControlCapability;

View File

@ -24,6 +24,7 @@ module.exports = {
MappingPassCapability: require("./MappingPassCapability"),
MopDockCleanManualTriggerCapability: require("./MopDockCleanManualTriggerCapability"),
MopDockDryManualTriggerCapability: require("./MopDockDryManualTriggerCapability"),
MopDockMopAutoDryingControlCapability: require("./MopDockMopAutoDryingControlCapability"),
MopDockMopWashTemperatureControlCapability: require("./MopDockMopWashTemperatureControlCapability"),
MopExtensionControlCapability: require("./MopExtensionControlCapability"),
MopExtensionFurnitureLegHandlingControlCapability: require("./MopExtensionFurnitureLegHandlingControlCapability"),

View File

@ -95,6 +95,7 @@ const CAPABILITY_TYPE_TO_ROUTER_MAPPING = {
[capabilities.MopDockMopWashTemperatureControlCapability.TYPE]: capabilityRouters.MopDockMopWashTemperatureControlCapabilityRouter,
[capabilities.MopTwistControlCapability.TYPE]: capabilityRouters.SimpleToggleCapabilityRouter,
[capabilities.MopExtensionFurnitureLegHandlingControlCapability.TYPE]: capabilityRouters.SimpleToggleCapabilityRouter,
[capabilities.MopDockMopAutoDryingControlCapability.TYPE]: capabilityRouters.SimpleToggleCapabilityRouter,
};
module.exports = CapabilitiesRouter;

View File

@ -768,5 +768,82 @@
}
}
}
},
"/api/v2/robot/capabilities/MopDockMopAutoDryingControlCapability": {
"get": {
"tags": [
"MopDockMopAutoDryingControlCapability"
],
"summary": "Get mop auto drying setting",
"responses": {
"200": {
"description": "Ok",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
}
}
}
}
}
}
}
},
"put": {
"tags": [
"MopDockMopAutoDryingControlCapability"
],
"summary": "Set mop auto drying 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/MopDockMopAutoDryingControlCapability/properties": {
"get": {
"tags": [
"MopDockMopAutoDryingControlCapability"
],
"summary": "Get various capability-related properties",
"responses": {
"200": {
"description": "Ok",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
}
}
}
}
}

View File

@ -1228,3 +1228,15 @@ export const fetchMopDockMopWashTemperatureProperties = async (): Promise<MopDoc
return data;
});
};
export const fetchMopDockMopAutoDryingControlState = async (): Promise<SimpleToggleState> => {
return valetudoAPI
.get<SimpleToggleState>(`/robot/capabilities/${Capability.MopDockMopAutoDryingControl}`)
.then(({ data }) => {
return data;
});
};
export const sendMopDockMopAutoDryingControlState = async (enable: boolean): Promise<void> => {
await sendToggleMutation(Capability.MopDockMopAutoDryingControl, enable);
};

View File

@ -133,6 +133,8 @@ import {
sendMopExtensionFurnitureLegHandlingControlState,
fetchMopTwistControlState,
sendMopTwistControlState,
fetchMopDockMopAutoDryingControlState,
sendMopDockMopAutoDryingControlState,
} from "./client";
import {
PresetSelectionState,
@ -238,6 +240,7 @@ enum QueryKey {
MopDockMopWashTemperatureProperties = "mop_dock_mop_wash_temperature_properties",
MopTwistControl = "mop_twist_control",
MopExtensionFurnitureLegHandlingControl = "mop_extension_furniture_leg_handling_control",
MopDockMopAutoDryingControl = "mop_dock_mop_auto_drying_control",
}
const useOnCommandError = (capability: Capability | string): ((error: unknown) => void) => {
@ -1647,3 +1650,22 @@ export const useMopExtensionFurnitureLegHandlingControlMutation = () => {
onError: useOnCommandError(Capability.MopExtensionFurnitureLegHandlingControl)
});
};
export const useMopDockMopAutoDryingControlQuery = () => {
return useQuery( {
queryKey: [QueryKey.MopDockMopAutoDryingControl],
queryFn: fetchMopDockMopAutoDryingControlState,
staleTime: Infinity
});
};
export const useMopDockMopAutoDryingControlMutation = () => {
return useValetudoFetchingMutation({
queryKey: [QueryKey.MopDockMopAutoDryingControl],
mutationFn: (enable: boolean) => {
return sendMopDockMopAutoDryingControlState(enable).then(fetchMopDockMopAutoDryingControlState);
},
onError: useOnCommandError(Capability.MopDockMopAutoDryingControl)
});
};

View File

@ -32,6 +32,7 @@ export enum Capability {
MopExtensionFurnitureLegHandlingControl = "MopExtensionFurnitureLegHandlingControlCapability",
MopDockCleanManualTrigger = "MopDockCleanManualTriggerCapability",
MopDockDryManualTrigger = "MopDockDryManualTriggerCapability",
MopDockMopAutoDryingControl = "MopDockMopAutoDryingControlCapability",
OperationModeControl = "OperationModeControlCapability",
PersistentMapControl = "PersistentMapControlCapability",
SpeakerTest = "SpeakerTestCapability",

View File

@ -36,6 +36,8 @@ import {
useMopExtensionFurnitureLegHandlingControlQuery,
useMopTwistControlMutation,
useMopTwistControlQuery,
useMopDockMopAutoDryingControlMutation,
useMopDockMopAutoDryingControlQuery,
} from "../api";
import React from "react";
import {ListMenu} from "../components/list_menu/ListMenu";
@ -53,6 +55,7 @@ import {
Sensors as CarpetModeIcon,
Star as QuirksIcon,
Waves as CarpetSensorModeIcon,
Air as MopDockMopAutoDryingControlIcon,
DeviceThermostat as MopDockMopWashTemperatureControlIcon,
TableBar as MopExtensionFurnitureLegHandlingControlIcon
} from "@mui/icons-material";
@ -621,6 +624,32 @@ const MopExtensionFurnitureLegHandlingControlCapabilitySwitchListMenuItem = () =
);
};
const MopDockMopAutoDryingControlCapabilitySwitchListMenuItem = () => {
const {
data: data,
isFetching: isFetching,
isError: isError,
} = useMopDockMopAutoDryingControlQuery();
const {mutate: mutate, isPending: isChanging} = useMopDockMopAutoDryingControlMutation();
const loading = isFetching || isChanging;
const disabled = loading || isChanging || isError;
return (
<ToggleSwitchListMenuItem
value={data?.enabled ?? false}
setValue={(value) => {
mutate(value);
}}
disabled={disabled}
loadError={isError}
primaryLabel={"Mop Auto-Drying"}
secondaryLabel={"Automatically dry the mop pads after a cleanup."}
icon={<MopDockMopAutoDryingControlIcon/>}
/>
);
};
const RobotOptions = (): React.ReactElement => {
const [
locateCapabilitySupported,
@ -638,6 +667,7 @@ const RobotOptions = (): React.ReactElement => {
mopExtensionFurnitureLegHandlingControlSupported,
autoEmptyDockAutoEmptyIntervalControlCapabilitySupported,
mopDockMopAutoDryingControlSupported,
mopDockMopWashTemperatureControlSupported,
keyLockControlCapabilitySupported,
@ -664,6 +694,7 @@ const RobotOptions = (): React.ReactElement => {
Capability.MopExtensionFurnitureLegHandlingControl,
Capability.AutoEmptyDockAutoEmptyIntervalControl,
Capability.MopDockMopAutoDryingControl,
Capability.MopDockMopWashTemperatureControl,
Capability.KeyLock,
@ -775,6 +806,10 @@ const RobotOptions = (): React.ReactElement => {
);
}
if (mopDockMopAutoDryingControlSupported) {
items.push(<MopDockMopAutoDryingControlCapabilitySwitchListMenuItem key="mopDockAutoDrying"/>);
}
if (mopDockMopWashTemperatureControlSupported) {
items.push(
<MopDockMopWashTemperatureControlCapabilitySelectListMenuItem key={"mopDockMopWashTemperatureControl"}/>
@ -784,6 +819,7 @@ const RobotOptions = (): React.ReactElement => {
return items;
}, [
autoEmptyDockAutoEmptyIntervalControlCapabilitySupported,
mopDockMopAutoDryingControlSupported,
mopDockMopWashTemperatureControlSupported,
]);