feat(core): MopTwistControlCapability

This commit is contained in:
Sören Beye 2025-09-07 18:27:49 +02:00
parent 0ea2a50a4d
commit 92ee9a5f18
11 changed files with 203 additions and 1 deletions

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m12.047 0c-1.2754-0.0036952-2.5518 0.19527-3.7598 0.5918-1.6824 0.5523-3.1043 1.3868-4.4434 2.6094-0.17985 0.16421-0.3695 0.34654-0.42188 0.4043-0.05239 0.05776-0.16861 0.18229-0.25781 0.27734-0.41363 0.4407-0.92837 1.1084-1.2852 1.6699-2.6107 4.1088-2.4853 9.352 0.2832 13.324a4 4 0 0 0-0.16211 1.123 4 4 0 0 0 4 4 4 4 0 0 0 2.1445-0.62695c0.02641 0.00901 0.053762 0.020554 0.080078 0.029297 0.8481 0.28176 1.8265 0.48562 2.6641 0.55664 0.16643 0.0141 0.34012 0.029957 0.38672 0.035157v0.001953c0.0466 0.0053 0.43835 0.006153 0.87109 0.001953 1.092-0.01044 1.7766-0.09595 2.7695-0.34375 0.31755-0.07925 0.62977-0.1763 0.93945-0.28125a4 4 0 0 0 2.1445 0.62695 4 4 0 0 0 4-4 4 4 0 0 0-0.15625-1.1094l0.001953-0.001953c1.1331-1.6163 1.8476-3.4902 2.0957-5.5332 0.07295-0.6001 0.080382-2.0015 0.013672-2.584-0.177-1.5457-0.56593-2.8581-1.2422-4.1934-0.4433-0.8753-0.92044-1.5949-1.5547-2.3477-0.3165-0.3757-1.0386-1.0946-1.4082-1.4023-1.6045-1.3361-3.4095-2.2017-5.4238-2.6016-0.74921-0.14874-1.5141-0.22435-2.2793-0.22656zm-8.1094 0.080078 0.30273 0.42773 0.074219 0.10352a13.75 13.75 0 0 0-3.6992 3.6973l-0.10156-0.072266-0.42578-0.30664 0.24023 1.4648 1.4648-0.24023-0.42578-0.30664-0.11914-0.085937a13 13 0 0 1 3.5156-3.5137l0.082031 0.11719 0.30273 0.42969 0.25195-1.4629-1.4629-0.25195zm8.0762 2.4238c1.0903 9.2e-4 2.0603 0.16155 3.0625 0.50586 1.0702 0.3677 2.0265 0.89384 2.9062 1.5996 0.36059 0.2893 1.0024 0.91723 1.2852 1.2559 0.77865 0.9327 1.3461 1.9339 1.7344 3.0645 0.06581 0.19165 0.12782 0.37745 0.13672 0.41406l0.015625 0.068359h-5.6328l-0.066406-0.21289c-0.16443-0.51159-0.46174-1.0037-0.8457-1.4023-0.5685-0.59024-1.2652-0.95663-2.0625-1.0859-0.31696-0.05145-0.86548-0.045981-1.2012 0.011719-0.9093 0.1563-1.7395 0.6675-2.3047 1.4199-0.19483 0.25938-0.46949 0.79362-0.54883 1.0684l-0.058594 0.20117h-5.5781l0.060547-0.20117c0.09397-0.30899 0.28622-0.81286 0.44336-1.1602 1.1256-2.4876 3.3382-4.399 5.9883-5.1738 0.8802-0.25737 1.7095-0.37385 2.666-0.37305zm0.046875 5.582c0.28527 0.010911 0.57391 0.076656 0.84766 0.20508 0.60745 0.285 1.0423 0.79751 1.2305 1.4512 0.04609 0.16021 0.052734 0.24706 0.052734 0.57617 0 0.4527-0.038337 0.63186-0.2168 0.99414-0.317 0.64352-0.9113 1.0842-1.627 1.209-0.19025 0.03319-0.51389 0.044505-0.66016 0.021485-0.78112-0.1229-1.4043-0.57992-1.7285-1.2676-0.17826-0.37808-0.24246-0.74716-0.20508-1.166 0.0263-0.29474 0.077844-0.47876 0.21484-0.76172 0.39862-0.82345 1.236-1.2945 2.0918-1.2617zm-9.543 3.4805h6.0156l0.068359 0.16211c0.423 1.01 1.3058 1.7974 2.3555 2.1016 0.6486 0.18798 1.3787 0.1875 2.043-0.001953 0.9459-0.2698 1.7733-0.95797 2.2285-1.8516 0.07122-0.1398 0.14336-0.28875 0.1582-0.33203l0.02539-0.078125h6.1035v0.39453c0 2.1884-0.72593 4.2778-2.082 5.9844-0.3237 0.4073-1.0872 1.1706-1.4883 1.4883-1.4162 1.1217-3.0608 1.8042-4.8652 2.0215h-0.001953c-0.18101 0.0218-0.57658 0.042175-0.93164 0.046875-0.66327 0.00881-0.68553 0.007832-1.1973-0.048828-2.7862-0.3086-5.3077-1.8447-6.8496-4.1738-0.13663-0.20638-0.29712-0.4638-0.35742-0.57031-0.64606-1.1413-1.0609-2.4361-1.1914-3.7227-0.04819-0.47534-0.071351-1.0452-0.050781-1.25l0.017578-0.16992zm0.48438 8.3789c0.67644 0.76252 1.4689 1.4615 2.2949 2.0176 0.48768 0.32831 1.0357 0.63276 1.5977 0.89844a3 3 0 0 1-0.89453 0.13867 3 3 0 0 1-3-3 3 3 0 0 1 0.0019531-0.054688zm17.996 0.011719a3 3 0 0 1 0.001953 0.042969 3 3 0 0 1-3 3 3 3 0 0 1-0.87891-0.13477c1.0671-0.50191 2.058-1.1565 2.9238-1.9414 0.33897-0.3073 0.6552-0.63052 0.95312-0.9668z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m12.047 0c-1.2754-0.0036952-2.5518 0.19527-3.7598 0.5918-1.6824 0.5523-3.1043 1.3868-4.4434 2.6094-0.17985 0.16421-0.3695 0.34654-0.42188 0.4043-0.05239 0.05776-0.16861 0.18229-0.25781 0.27734-0.41363 0.4407-0.92829 1.1084-1.2852 1.6699-2.6108 4.1088-2.4854 9.3522 0.2832 13.324a4 4 0 0 0-0.16211 1.123 4 4 0 0 0 4 4 4 4 0 0 0 2.1445-0.62695c0.026407 0.00901 0.053764 0.020554 0.080078 0.029297 0.8481 0.28176 1.8265 0.48562 2.6641 0.55664 0.16643 0.0141 0.34012 0.029957 0.38672 0.035157v0.001953c0.0466 0.0053 0.43835 0.006153 0.87109 0.001953 1.092-0.01044 1.7766-0.09595 2.7695-0.34375 0.78452-0.19579 1.5461-0.47643 2.2734-0.82422a4 4 0 0 0 2.8105 1.1699 4 4 0 0 0 4-4 4 4 0 0 0-1.1621-2.8164c0.56411-1.1839 0.93836-2.4678 1.1035-3.8281 0.07295-0.6001 0.080382-2.0015 0.013672-2.584-0.177-1.5457-0.56591-2.8581-1.2422-4.1934-0.4433-0.8753-0.92042-1.5949-1.5547-2.3477-0.3165-0.3757-1.0386-1.0946-1.4082-1.4023-1.6045-1.3361-3.4095-2.2017-5.4238-2.6016-0.74921-0.14874-1.5141-0.22435-2.2793-0.22656zm-8.1133 0.080078 0.30273 0.42773 0.074219 0.10352a13.75 13.75 0 0 0-3.6992 3.6973l-0.099609-0.072266-0.42773-0.30664 0.24219 1.4648 1.4648-0.24023-0.42773-0.30664-0.11914-0.085937a13 13 0 0 1 3.5156-3.5137l0.082031 0.11719 0.30273 0.42969 0.25195-1.4629-1.4629-0.25195zm8.0801 2.4238c1.0903 9.2e-4 2.0603 0.16155 3.0625 0.50586 1.0702 0.3677 2.0267 0.89386 2.9062 1.5996 0.36059 0.2893 1.0024 0.91715 1.2852 1.2559 0.77865 0.9327 1.3461 1.9339 1.7344 3.0645 0.06581 0.19165 0.12782 0.37941 0.13672 0.41602l0.015625 0.066406h-5.6328l-0.066406-0.21289c-0.16443-0.51159-0.46174-1.0037-0.8457-1.4023-0.5685-0.59024-1.2652-0.95671-2.0625-1.0859-0.31696-0.05145-0.86542-0.045981-1.2012 0.011719-0.9093 0.1563-1.7395 0.66754-2.3047 1.4199-0.19483 0.25938-0.46949 0.79354-0.54883 1.0684l-0.058594 0.20117h-5.5781l0.060547-0.20117c0.09397-0.30899 0.28622-0.81278 0.44336-1.1602 1.1256-2.4876 3.3382-4.399 5.9883-5.1738 0.8802-0.25737 1.7095-0.37385 2.666-0.37305zm0.046875 5.582c0.28527 0.010911 0.57391 0.076652 0.84766 0.20508 0.60745 0.285 1.0423 0.79953 1.2305 1.4531 0.04609 0.16021 0.052734 0.24511 0.052734 0.57422 0 0.4527-0.038331 0.63186-0.2168 0.99414-0.317 0.64352-0.9112 1.0842-1.627 1.209-0.19025 0.03319-0.51389 0.044505-0.66016 0.021485-0.78112-0.1229-1.4043-0.57988-1.7285-1.2676-0.17826-0.37808-0.24246-0.7472-0.20508-1.166 0.0263-0.29474 0.077852-0.47876 0.21484-0.76172 0.39862-0.82345 1.236-1.2945 2.0918-1.2617zm-9.543 3.4805h6.0156l0.068359 0.16211c0.423 1.01 1.3058 1.7974 2.3555 2.1016 0.6486 0.18798 1.3787 0.1875 2.043-0.001953 0.9459-0.2698 1.7733-0.95789 2.2285-1.8516 0.07122-0.1398 0.14336-0.28875 0.1582-0.33203l0.02539-0.078125h6.1035v0.39453c0 2.1884-0.72599 4.2778-2.082 5.9844-0.3237 0.4073-1.0872 1.1706-1.4883 1.4883-1.4162 1.1217-3.0608 1.8061-4.8652 2.0234l-0.001953-0.001953c-0.18101 0.0218-0.57658 0.042175-0.93164 0.046875-0.66327 0.00881-0.68547 0.007832-1.1973-0.048828-2.7862-0.3086-5.3077-1.8447-6.8496-4.1738-0.13663-0.20638-0.29712-0.46185-0.35742-0.56836-0.64606-1.1413-1.0609-2.438-1.1914-3.7246-0.04819-0.47534-0.071351-1.0452-0.050781-1.25l0.017578-0.16992zm19.818 6.5566a3 3 0 0 1 0.66406 1.877 3 3 0 0 1-3 3 3 3 0 0 1-1.8711-0.66992c0.68533-0.40541 1.33-0.87304 1.916-1.4043 0.91602-0.83042 1.681-1.7729 2.291-2.8027zm-19.334 1.8223c0.67647 0.76278 1.4689 1.4615 2.2949 2.0176 0.48768 0.32831 1.0359 0.63276 1.5977 0.89844a3 3 0 0 1-0.89453 0.13867 3 3 0 0 1-3-3 3 3 0 0 1 0.0019531-0.054688z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

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

View File

@ -26,6 +26,7 @@ module.exports = {
MopDockDryManualTriggerCapability: require("./MopDockDryManualTriggerCapability"),
MopDockMopWashTemperatureControlCapability: require("./MopDockMopWashTemperatureControlCapability"),
MopExtensionControlCapability: require("./MopExtensionControlCapability"),
MopTwistControlCapability: require("./MopTwistControlCapability"),
ObstacleAvoidanceControlCapability: require("./ObstacleAvoidanceControlCapability"),
ObstacleImagesCapability: require("./ObstacleImagesCapability"),
OperationModeControlCapability: require("./OperationModeControlCapability"),

View File

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

View File

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

View File

@ -1082,6 +1082,18 @@ export const sendCameraLightControlState = async (enable: boolean): Promise<void
await sendToggleMutation(Capability.CameraLightControl, enable);
};
export const fetchMopTwistControlState = async (): Promise<SimpleToggleState> => {
return valetudoAPI
.get<SimpleToggleState>(`/robot/capabilities/${Capability.MopTwistControl}`)
.then(({ data }) => {
return data;
});
};
export const sendMopTwistControlState = async (enable: boolean): Promise<void> => {
await sendToggleMutation(Capability.MopTwistControl, enable);
};
export const fetchValetudoCustomizations = async (): Promise<ValetudoCustomizations> => {
return valetudoAPI
.get<ValetudoCustomizations>("/valetudo/config/customizations")

View File

@ -129,6 +129,8 @@ import {
fetchMopDockMopWashTemperature,
sendMopDockMopWashTemperature,
fetchMopDockMopWashTemperatureProperties,
fetchMopTwistControlState,
sendMopTwistControlState,
} from "./client";
import {
PresetSelectionState,
@ -232,6 +234,7 @@ enum QueryKey {
CameraLightControl = "camera_light_control",
MopDockMopWashTemperature = "mop_dock_mop_wash_temperature",
MopDockMopWashTemperatureProperties = "mop_dock_mop_wash_temperature_properties",
MopTwistControl = "mop_twist_control",
}
const useOnCommandError = (capability: Capability | string): ((error: unknown) => void) => {
@ -1603,3 +1606,22 @@ export const useMopDockMopWashTemperaturePropertiesQuery = () => {
staleTime: Infinity,
});
};
export const useMopTwistControlQuery = () => {
return useQuery( {
queryKey: [QueryKey.MopTwistControl],
queryFn: fetchMopTwistControlState,
staleTime: Infinity
});
};
export const useMopTwistControlMutation = () => {
return useValetudoFetchingMutation({
queryKey: [QueryKey.MopTwistControl],
mutationFn: (enable: boolean) => {
return sendMopTwistControlState(enable).then(fetchMopTwistControlState);
},
onError: useOnCommandError(Capability.MopTwistControl)
});
};

View File

@ -28,6 +28,7 @@ export enum Capability {
ObstacleAvoidanceControl = "ObstacleAvoidanceControlCapability",
PetObstacleAvoidanceControl = "PetObstacleAvoidanceControlCapability",
MopExtensionControl = "MopExtensionControlCapability",
MopTwistControl = "MopTwistControlCapability",
MopDockCleanManualTrigger = "MopDockCleanManualTriggerCapability",
MopDockDryManualTrigger = "MopDockDryManualTriggerCapability",
OperationModeControl = "OperationModeControlCapability",

View File

@ -181,3 +181,13 @@ export const MopExtensionControlCapability = createSvgIcon(
<path d="m12.047 0c-1.2754-0.0036952-2.5518 0.19527-3.7598 0.5918-1.6824 0.5523-3.1043 1.3868-4.4434 2.6094-0.17985 0.16421-0.3695 0.34654-0.42188 0.4043-0.05239 0.05776-0.16861 0.18229-0.25781 0.27734-0.41363 0.4407-0.92833 1.1084-1.2852 1.6699-2.6108 4.1088-2.4854 9.352 0.2832 13.324a4 4 0 0 0-0.16211 1.123 4 4 0 0 0 4 4 4 4 0 0 0 2.1445-0.62695c0.026407 0.00901 0.053764 0.020554 0.080078 0.029297 0.8481 0.28176 1.8265 0.48562 2.6641 0.55664 0.16643 0.0141 0.34012 0.029957 0.38672 0.035157v0.001953c0.0466 0.0053 0.43835 0.006153 0.87109 0.001953 1.092-0.01044 1.7766-0.09595 2.7695-0.34375 0.78452-0.19579 1.5461-0.47643 2.2734-0.82422a4 4 0 0 0 2.8105 1.1699 4 4 0 0 0 4-4 4 4 0 0 0-1.1621-2.8164c0.56411-1.1839 0.93834-2.4678 1.1035-3.8281 0.07295-0.6001 0.080382-2.0015 0.013672-2.584-0.177-1.5457-0.56592-2.8581-1.2422-4.1934-0.4433-0.8753-0.92043-1.5949-1.5547-2.3477-0.3165-0.3757-1.0386-1.0946-1.4082-1.4023-1.6045-1.3361-3.4095-2.2017-5.4238-2.6016-0.74921-0.14874-1.5141-0.22435-2.2793-0.22656zm-0.033203 2.5039c1.0903 9.2e-4 2.0603 0.16155 3.0625 0.50586 1.0702 0.3677 2.0266 0.89385 2.9062 1.5996 0.36059 0.2893 1.0024 0.91719 1.2852 1.2559 0.77865 0.9327 1.3461 1.9339 1.7344 3.0645 0.06581 0.19165 0.12782 0.37941 0.13672 0.41602l0.015625 0.066406h-5.6328l-0.066406-0.21289c-0.16443-0.51159-0.46174-1.0037-0.8457-1.4023-0.5685-0.59024-1.2652-0.95667-2.0625-1.0859-0.31696-0.05145-0.86545-0.045981-1.2012 0.011719-0.9093 0.1563-1.7395 0.66752-2.3047 1.4199-0.19483 0.25938-0.46949 0.79358-0.54883 1.0684l-0.058594 0.20117h-5.5781l0.060547-0.20117c0.09397-0.30899 0.28622-0.81282 0.44336-1.1602 1.1256-2.4876 3.3382-4.399 5.9883-5.1738 0.8802-0.25737 1.7095-0.37385 2.666-0.37305zm0.046875 5.582c0.28527 0.010911 0.57391 0.076654 0.84766 0.20508 0.60745 0.285 1.0423 0.7995 1.2305 1.4531 0.04609 0.16021 0.052734 0.24511 0.052734 0.57422 0 0.4527-0.038334 0.63186-0.2168 0.99414-0.317 0.64352-0.91125 1.0842-1.627 1.209-0.19025 0.03319-0.51389 0.044505-0.66016 0.021485-0.78112-0.1229-1.4043-0.5799-1.7285-1.2676-0.17826-0.37808-0.24246-0.74718-0.20508-1.166 0.0263-0.29474 0.077848-0.47876 0.21484-0.76172 0.39862-0.82345 1.236-1.2945 2.0918-1.2617zm-9.543 3.4805h6.0156l0.068359 0.16211c0.423 1.01 1.3058 1.7974 2.3555 2.1016 0.6486 0.18798 1.3787 0.1875 2.043-0.001953 0.9459-0.2698 1.7733-0.95793 2.2285-1.8516 0.07122-0.1398 0.14336-0.28875 0.1582-0.33203l0.02539-0.078125h6.1035v0.39453c0 2.1884-0.72596 4.2778-2.082 5.9844-0.3237 0.4073-1.0872 1.1706-1.4883 1.4883-1.4162 1.1217-3.0608 1.8061-4.8652 2.0234l-0.001953-0.001953c-0.18101 0.0218-0.57658 0.042175-0.93164 0.046875-0.66327 0.00881-0.6855 0.007832-1.1973-0.048828-2.7862-0.3086-5.3077-1.8447-6.8496-4.1738-0.13663-0.20638-0.29712-0.46185-0.35742-0.56836-0.64606-1.1413-1.0609-2.438-1.1914-3.7246-0.04819-0.47534-0.071351-1.0452-0.050781-1.25l0.017578-0.16992zm19.818 6.5566a3 3 0 0 1 0.66406 1.877 3 3 0 0 1-3 3 3 3 0 0 1-1.8711-0.66992c0.68533-0.40541 1.33-0.87304 1.916-1.4043 0.91602-0.83042 1.681-1.7729 2.291-2.8027zm-19.334 1.8223c0.67647 0.76278 1.4689 1.4615 2.2949 2.0176 0.48768 0.32831 1.0359 0.63276 1.5977 0.89844a3 3 0 0 1-0.89453 0.13867 3 3 0 0 1-3-3 3 3 0 0 1 0.0019531-0.054688z"/>,
"mopExtensionControlCapability"
);
export const MopTwistControlCapability = createSvgIcon(
<path d="m12.047 0c-1.2754-0.0036952-2.5518 0.19527-3.7598 0.5918-1.6824 0.5523-3.1043 1.3868-4.4434 2.6094-0.17985 0.16421-0.3695 0.34654-0.42188 0.4043-0.05239 0.05776-0.16861 0.18229-0.25781 0.27734-0.41363 0.4407-0.92837 1.1084-1.2852 1.6699-2.6107 4.1088-2.4853 9.352 0.2832 13.324a4 4 0 0 0-0.16211 1.123 4 4 0 0 0 4 4 4 4 0 0 0 2.1445-0.62695c0.02641 0.00901 0.053762 0.020554 0.080078 0.029297 0.8481 0.28176 1.8265 0.48562 2.6641 0.55664 0.16643 0.0141 0.34012 0.029957 0.38672 0.035157v0.001953c0.0466 0.0053 0.43835 0.006153 0.87109 0.001953 1.092-0.01044 1.7766-0.09595 2.7695-0.34375 0.31755-0.07925 0.62977-0.1763 0.93945-0.28125a4 4 0 0 0 2.1445 0.62695 4 4 0 0 0 4-4 4 4 0 0 0-0.15625-1.1094l0.001953-0.001953c1.1331-1.6163 1.8476-3.4902 2.0957-5.5332 0.07295-0.6001 0.080382-2.0015 0.013672-2.584-0.177-1.5457-0.56593-2.8581-1.2422-4.1934-0.4433-0.8753-0.92044-1.5949-1.5547-2.3477-0.3165-0.3757-1.0386-1.0946-1.4082-1.4023-1.6045-1.3361-3.4095-2.2017-5.4238-2.6016-0.74921-0.14874-1.5141-0.22435-2.2793-0.22656zm-8.1094 0.080078 0.30273 0.42773 0.074219 0.10352a13.75 13.75 0 0 0-3.6992 3.6973l-0.10156-0.072266-0.42578-0.30664 0.24023 1.4648 1.4648-0.24023-0.42578-0.30664-0.11914-0.085937a13 13 0 0 1 3.5156-3.5137l0.082031 0.11719 0.30273 0.42969 0.25195-1.4629-1.4629-0.25195zm8.0762 2.4238c1.0903 9.2e-4 2.0603 0.16155 3.0625 0.50586 1.0702 0.3677 2.0265 0.89384 2.9062 1.5996 0.36059 0.2893 1.0024 0.91723 1.2852 1.2559 0.77865 0.9327 1.3461 1.9339 1.7344 3.0645 0.06581 0.19165 0.12782 0.37745 0.13672 0.41406l0.015625 0.068359h-5.6328l-0.066406-0.21289c-0.16443-0.51159-0.46174-1.0037-0.8457-1.4023-0.5685-0.59024-1.2652-0.95663-2.0625-1.0859-0.31696-0.05145-0.86548-0.045981-1.2012 0.011719-0.9093 0.1563-1.7395 0.6675-2.3047 1.4199-0.19483 0.25938-0.46949 0.79362-0.54883 1.0684l-0.058594 0.20117h-5.5781l0.060547-0.20117c0.09397-0.30899 0.28622-0.81286 0.44336-1.1602 1.1256-2.4876 3.3382-4.399 5.9883-5.1738 0.8802-0.25737 1.7095-0.37385 2.666-0.37305zm0.046875 5.582c0.28527 0.010911 0.57391 0.076656 0.84766 0.20508 0.60745 0.285 1.0423 0.79751 1.2305 1.4512 0.04609 0.16021 0.052734 0.24706 0.052734 0.57617 0 0.4527-0.038337 0.63186-0.2168 0.99414-0.317 0.64352-0.9113 1.0842-1.627 1.209-0.19025 0.03319-0.51389 0.044505-0.66016 0.021485-0.78112-0.1229-1.4043-0.57992-1.7285-1.2676-0.17826-0.37808-0.24246-0.74716-0.20508-1.166 0.0263-0.29474 0.077844-0.47876 0.21484-0.76172 0.39862-0.82345 1.236-1.2945 2.0918-1.2617zm-9.543 3.4805h6.0156l0.068359 0.16211c0.423 1.01 1.3058 1.7974 2.3555 2.1016 0.6486 0.18798 1.3787 0.1875 2.043-0.001953 0.9459-0.2698 1.7733-0.95797 2.2285-1.8516 0.07122-0.1398 0.14336-0.28875 0.1582-0.33203l0.02539-0.078125h6.1035v0.39453c0 2.1884-0.72593 4.2778-2.082 5.9844-0.3237 0.4073-1.0872 1.1706-1.4883 1.4883-1.4162 1.1217-3.0608 1.8042-4.8652 2.0215h-0.001953c-0.18101 0.0218-0.57658 0.042175-0.93164 0.046875-0.66327 0.00881-0.68553 0.007832-1.1973-0.048828-2.7862-0.3086-5.3077-1.8447-6.8496-4.1738-0.13663-0.20638-0.29712-0.4638-0.35742-0.57031-0.64606-1.1413-1.0609-2.4361-1.1914-3.7227-0.04819-0.47534-0.071351-1.0452-0.050781-1.25l0.017578-0.16992zm0.48438 8.3789c0.67644 0.76252 1.4689 1.4615 2.2949 2.0176 0.48768 0.32831 1.0357 0.63276 1.5977 0.89844a3 3 0 0 1-0.89453 0.13867 3 3 0 0 1-3-3 3 3 0 0 1 0.0019531-0.054688zm17.996 0.011719a3 3 0 0 1 0.001953 0.042969 3 3 0 0 1-3 3 3 3 0 0 1-0.87891-0.13477c1.0671-0.50191 2.058-1.1565 2.9238-1.9414 0.33897-0.3073 0.6552-0.63052 0.95312-0.9668z"/>,
"mopTwistControlCapability"
);
export const MopTwistControlCapabilityExtended = createSvgIcon(
<path d="m12.047 0c-1.2754-0.0036952-2.5518 0.19527-3.7598 0.5918-1.6824 0.5523-3.1043 1.3868-4.4434 2.6094-0.17985 0.16421-0.3695 0.34654-0.42188 0.4043-0.05239 0.05776-0.16861 0.18229-0.25781 0.27734-0.41363 0.4407-0.92829 1.1084-1.2852 1.6699-2.6108 4.1088-2.4854 9.3522 0.2832 13.324a4 4 0 0 0-0.16211 1.123 4 4 0 0 0 4 4 4 4 0 0 0 2.1445-0.62695c0.026407 0.00901 0.053764 0.020554 0.080078 0.029297 0.8481 0.28176 1.8265 0.48562 2.6641 0.55664 0.16643 0.0141 0.34012 0.029957 0.38672 0.035157v0.001953c0.0466 0.0053 0.43835 0.006153 0.87109 0.001953 1.092-0.01044 1.7766-0.09595 2.7695-0.34375 0.78452-0.19579 1.5461-0.47643 2.2734-0.82422a4 4 0 0 0 2.8105 1.1699 4 4 0 0 0 4-4 4 4 0 0 0-1.1621-2.8164c0.56411-1.1839 0.93836-2.4678 1.1035-3.8281 0.07295-0.6001 0.080382-2.0015 0.013672-2.584-0.177-1.5457-0.56591-2.8581-1.2422-4.1934-0.4433-0.8753-0.92042-1.5949-1.5547-2.3477-0.3165-0.3757-1.0386-1.0946-1.4082-1.4023-1.6045-1.3361-3.4095-2.2017-5.4238-2.6016-0.74921-0.14874-1.5141-0.22435-2.2793-0.22656zm-8.1133 0.080078 0.30273 0.42773 0.074219 0.10352a13.75 13.75 0 0 0-3.6992 3.6973l-0.099609-0.072266-0.42773-0.30664 0.24219 1.4648 1.4648-0.24023-0.42773-0.30664-0.11914-0.085937a13 13 0 0 1 3.5156-3.5137l0.082031 0.11719 0.30273 0.42969 0.25195-1.4629-1.4629-0.25195zm8.0801 2.4238c1.0903 9.2e-4 2.0603 0.16155 3.0625 0.50586 1.0702 0.3677 2.0267 0.89386 2.9062 1.5996 0.36059 0.2893 1.0024 0.91715 1.2852 1.2559 0.77865 0.9327 1.3461 1.9339 1.7344 3.0645 0.06581 0.19165 0.12782 0.37941 0.13672 0.41602l0.015625 0.066406h-5.6328l-0.066406-0.21289c-0.16443-0.51159-0.46174-1.0037-0.8457-1.4023-0.5685-0.59024-1.2652-0.95671-2.0625-1.0859-0.31696-0.05145-0.86542-0.045981-1.2012 0.011719-0.9093 0.1563-1.7395 0.66754-2.3047 1.4199-0.19483 0.25938-0.46949 0.79354-0.54883 1.0684l-0.058594 0.20117h-5.5781l0.060547-0.20117c0.09397-0.30899 0.28622-0.81278 0.44336-1.1602 1.1256-2.4876 3.3382-4.399 5.9883-5.1738 0.8802-0.25737 1.7095-0.37385 2.666-0.37305zm0.046875 5.582c0.28527 0.010911 0.57391 0.076652 0.84766 0.20508 0.60745 0.285 1.0423 0.79953 1.2305 1.4531 0.04609 0.16021 0.052734 0.24511 0.052734 0.57422 0 0.4527-0.038331 0.63186-0.2168 0.99414-0.317 0.64352-0.9112 1.0842-1.627 1.209-0.19025 0.03319-0.51389 0.044505-0.66016 0.021485-0.78112-0.1229-1.4043-0.57988-1.7285-1.2676-0.17826-0.37808-0.24246-0.7472-0.20508-1.166 0.0263-0.29474 0.077852-0.47876 0.21484-0.76172 0.39862-0.82345 1.236-1.2945 2.0918-1.2617zm-9.543 3.4805h6.0156l0.068359 0.16211c0.423 1.01 1.3058 1.7974 2.3555 2.1016 0.6486 0.18798 1.3787 0.1875 2.043-0.001953 0.9459-0.2698 1.7733-0.95789 2.2285-1.8516 0.07122-0.1398 0.14336-0.28875 0.1582-0.33203l0.02539-0.078125h6.1035v0.39453c0 2.1884-0.72599 4.2778-2.082 5.9844-0.3237 0.4073-1.0872 1.1706-1.4883 1.4883-1.4162 1.1217-3.0608 1.8061-4.8652 2.0234l-0.001953-0.001953c-0.18101 0.0218-0.57658 0.042175-0.93164 0.046875-0.66327 0.00881-0.68547 0.007832-1.1973-0.048828-2.7862-0.3086-5.3077-1.8447-6.8496-4.1738-0.13663-0.20638-0.29712-0.46185-0.35742-0.56836-0.64606-1.1413-1.0609-2.438-1.1914-3.7246-0.04819-0.47534-0.071351-1.0452-0.050781-1.25l0.017578-0.16992zm19.818 6.5566a3 3 0 0 1 0.66406 1.877 3 3 0 0 1-3 3 3 3 0 0 1-1.8711-0.66992c0.68533-0.40541 1.33-0.87304 1.916-1.4043 0.91602-0.83042 1.681-1.7729 2.291-2.8027zm-19.334 1.8223c0.67647 0.76278 1.4689 1.4615 2.2949 2.0176 0.48768 0.32831 1.0359 0.63276 1.5977 0.89844a3 3 0 0 1-0.89453 0.13867 3 3 0 0 1-3-3 3 3 0 0 1 0.0019531-0.054688z"/>,
"mopTwistControlCapabilityExtended"
);

View File

@ -32,6 +32,8 @@ import {
useObstacleImagesQuery,
usePetObstacleAvoidanceControlMutation,
usePetObstacleAvoidanceControlQuery,
useMopTwistControlMutation,
useMopTwistControlQuery,
} from "../api";
import React from "react";
import {ListMenu} from "../components/list_menu/ListMenu";
@ -56,7 +58,11 @@ import {LinkListMenuItem} from "../components/list_menu/LinkListMenuItem";
import PaperContainer from "../components/PaperContainer";
import {ButtonListMenuItem} from "../components/list_menu/ButtonListMenuItem";
import {SelectListMenuItem, SelectListMenuItemOption} from "../components/list_menu/SelectListMenuItem";
import {MopExtensionControlCapability as MopExtensionControlCapabilityIcon} from "../components/CustomIcons";
import {
MopExtensionControlCapability as MopExtensionControlCapabilityIcon,
MopTwistControlCapability as MopTwistControlCapabilityIcon,
MopTwistControlCapabilityExtended as MopTwistControlCapabilityExtendedIcon,
} from "../components/CustomIcons";
const LocateButtonListMenuItem = (): React.ReactElement => {
const {
@ -544,6 +550,48 @@ const MopDockMopWashTemperatureControlCapabilitySelectListMenuItem = () => {
);
};
const MopTwistControlCapabilitySwitchListMenuItem = () => {
const [
mopExtensionControlCapabilitySupported,
] = useCapabilitiesSupported(
Capability.MopExtensionControl
);
const {
data: data,
isFetching: isFetching,
isError: isError,
} = useMopTwistControlQuery();
const {mutate: mutate, isPending: isChanging} = useMopTwistControlMutation();
const loading = isFetching || isChanging;
const disabled = loading || isChanging || isError;
let label;
let icon; // FIXME: these icons are unsuited and way too small
if (mopExtensionControlCapabilitySupported) {
label = "With the mop extended, twist the robot to further reach below furniture and other overhangs.";
icon = <MopTwistControlCapabilityExtendedIcon/>;
} else {
label = "Twist the robot to mop closer to walls and furniture. Will increase the cleanup duration.";
icon = <MopTwistControlCapabilityIcon/>;
}
return (
<ToggleSwitchListMenuItem
value={data?.enabled ?? false}
setValue={(value) => {
mutate(value);
}}
disabled={disabled}
loadError={isError}
primaryLabel={"Mop Twist"}
secondaryLabel={label}
icon={icon}
/>
);
};
const RobotOptions = (): React.ReactElement => {
const [
locateCapabilitySupported,
@ -557,6 +605,7 @@ const RobotOptions = (): React.ReactElement => {
carpetSensorModeControlCapabilitySupported,
mopExtensionControlCapabilitySupported,
mopTwistControlSupported,
autoEmptyDockAutoEmptyIntervalControlCapabilitySupported,
mopDockMopWashTemperatureControlSupported,
@ -581,6 +630,7 @@ const RobotOptions = (): React.ReactElement => {
Capability.CarpetSensorModeControl,
Capability.MopExtensionControl,
Capability.MopTwistControl,
Capability.AutoEmptyDockAutoEmptyIntervalControl,
Capability.MopDockMopWashTemperatureControl,
@ -658,6 +708,12 @@ const RobotOptions = (): React.ReactElement => {
);
}
if (mopTwistControlSupported) {
items.push(
<MopTwistControlCapabilitySwitchListMenuItem key={"mopTwistControl"}/>
);
}
return items;
}, [
@ -669,6 +725,7 @@ const RobotOptions = (): React.ReactElement => {
carpetModeControlCapabilitySupported,
carpetSensorModeControlCapabilitySupported,
mopExtensionControlCapabilitySupported,
mopTwistControlSupported
]);
const dockListItems = React.useMemo(() => {