Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support mop autowash interval #677

Open
wants to merge 3 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions deebot_client/capabilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
MajorMapEvent,
MapChangedEvent,
MapTraceEvent,
MopAutoWashFrequency,
MopAutoWashFrequencyEvent,
MoveUpWarningEvent,
MultimapStateEvent,
NetworkInfoEvent,
Expand Down Expand Up @@ -192,6 +194,9 @@ class CapabilitySettings:
border_switch: CapabilitySetEnable[BorderSwitchEvent] | None = None
child_lock: CapabilitySetEnable[ChildLockEvent] | None = None
cut_direction: CapabilitySet[CutDirectionEvent, int] | None = None
mop_auto_wash_frequency: (
CapabilitySetTypes[MopAutoWashFrequencyEvent, MopAutoWashFrequency] | None
) = None
moveup_warning: CapabilitySetEnable[MoveUpWarningEvent] | None = None
cross_map_border_warning: CapabilitySetEnable[CrossMapBorderWarningEvent] | None = (
None
Expand Down
6 changes: 6 additions & 0 deletions deebot_client/commands/json/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
GetMapTrace,
GetMinorMap,
)
from .mop_auto_wash_frequency import GetMopAutoWashFrequency, SetMopAutoWashFrequency
from .moveup_warning import GetMoveUpWarning, SetMoveUpWarning
from .multimap_state import GetMultimapState, SetMultimapState
from .network import GetNetInfo
Expand Down Expand Up @@ -84,6 +85,7 @@
"GetMapSubSet",
"GetMapTrace",
"GetMinorMap",
"GetMopAutoWashFrequency",
"GetMoveUpWarning",
"GetMultimapState",
"GetNetInfo",
Expand Down Expand Up @@ -111,6 +113,7 @@
"SetCutDirection",
"SetEfficiencyMode",
"SetFanSpeed",
"SetMopAutoWashFrequency",
"SetMoveUpWarning",
"SetMultimapState",
"SetOta",
Expand Down Expand Up @@ -187,6 +190,9 @@
GetMapTrace,
GetMinorMap,

GetMopAutoWashFrequency,
SetMopAutoWashFrequency,

GetMoveUpWarning,
SetMoveUpWarning,

Expand Down
48 changes: 48 additions & 0 deletions deebot_client/commands/json/mop_auto_wash_frequency.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
"""Mop Auto-Wash Frequency command module."""

from __future__ import annotations

from types import MappingProxyType
from typing import TYPE_CHECKING, Any

from deebot_client.command import InitParam
from deebot_client.events import MopAutoWashFrequency, MopAutoWashFrequencyEvent
from deebot_client.message import HandlingResult
from deebot_client.util import get_enum

from .common import JsonGetCommand, JsonSetCommand

if TYPE_CHECKING:
from deebot_client.event_bus import EventBus


class GetMopAutoWashFrequency(JsonGetCommand):
"""Get Mop Auto-Wash Frequency command."""

name = "getWashInfo"

@classmethod
def _handle_body_data_dict(
cls, event_bus: EventBus, data: dict[str, Any]
) -> HandlingResult:
"""Handle message->body->data and notify the correct event subscribers.

:return: A message response
"""
event_bus.notify(
MopAutoWashFrequencyEvent(MopAutoWashFrequency(int(data["interval"])))
)
return HandlingResult.success()


class SetMopAutoWashFrequency(JsonSetCommand):
"""Set Mop Auto-Wash Frequency command."""

name = "setWashInfo"
get_command = GetMopAutoWashFrequency
_mqtt_params = MappingProxyType({"interval": InitParam(MopAutoWashFrequency)})

def __init__(self, interval: MopAutoWashFrequency | str) -> None:
if isinstance(interval, str):
interval = get_enum(MopAutoWashFrequency, interval)
super().__init__({"interval": interval.value})
2 changes: 1 addition & 1 deletion deebot_client/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from __future__ import annotations

import asyncio
from collections.abc import Callable, Coroutine
from collections.abc import Callable, Coroutine # pylint: disable=import-error
from contextlib import suppress
from datetime import datetime
import json
Expand Down
3 changes: 3 additions & 0 deletions deebot_client/events/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
PositionsEvent,
PositionType,
)
from .mop_auto_wash_frequency import MopAutoWashFrequency, MopAutoWashFrequencyEvent
from .network import NetworkInfoEvent
from .water_info import SweepType, WaterAmount, WaterInfoEvent
from .work_mode import WorkMode, WorkModeEvent
Expand All @@ -47,6 +48,8 @@
"MapSubsetEvent",
"MapTraceEvent",
"MinorMapEvent",
"MopAutoWashFrequency",
"MopAutoWashFrequencyEvent",
"NetworkInfoEvent",
"Position",
"PositionType",
Expand Down
24 changes: 24 additions & 0 deletions deebot_client/events/mop_auto_wash_frequency.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
"""Mop Auto-Wash Frequency event module."""

from __future__ import annotations

from dataclasses import dataclass
from enum import IntEnum, unique

from .base import Event


@unique
class MopAutoWashFrequency(IntEnum):
"""Enum class for all possible mop auto-wash frequencies."""

TEN_MINUTES = 10
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As the values are numbers, can we also set the interval to 1 minute? And would the bot respect this set one minute?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It doesn't seem like it, there may be some other magic values but these are the available presets for the X5 Pro Omni.

Copy link

@Padparadscha Padparadscha Dec 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the App from T30 I can only chose between 10, 15 and 25 minutes for time based mop auto wash.
The other option is mop after room
WhatsApp Bild 2024-12-24 um 14 49 23_2b0281c4

FIFTEEN_MINUTES = 15
TWENTY_FIVE_MINUTES = 25


@dataclass(frozen=True)
class MopAutoWashFrequencyEvent(Event):
"""Mop Auto-Wash Frequency event representation."""

interval: MopAutoWashFrequency
16 changes: 16 additions & 0 deletions deebot_client/hardware/deebot/p1jij8.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@
from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed
from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan
from deebot_client.commands.json.map import GetCachedMapInfo, GetMajorMap, GetMapTrace
from deebot_client.commands.json.mop_auto_wash_frequency import (
GetMopAutoWashFrequency,
SetMopAutoWashFrequency,
)
from deebot_client.commands.json.multimap_state import (
GetMultimapState,
SetMultimapState,
Expand Down Expand Up @@ -75,6 +79,8 @@
MajorMapEvent,
MapChangedEvent,
MapTraceEvent,
MopAutoWashFrequency,
MopAutoWashFrequencyEvent,
MultimapStateEvent,
NetworkInfoEvent,
PositionsEvent,
Expand Down Expand Up @@ -172,6 +178,16 @@
[GetCarpetAutoFanBoost()],
SetCarpetAutoFanBoost,
),
mop_auto_wash_frequency=CapabilitySetTypes(
event=MopAutoWashFrequencyEvent,
get=[GetMopAutoWashFrequency()],
set=SetMopAutoWashFrequency,
types=(
MopAutoWashFrequency.TEN_MINUTES,
MopAutoWashFrequency.FIFTEEN_MINUTES,
MopAutoWashFrequency.TWENTY_FIVE_MINUTES,
),
),
true_detect=CapabilitySetEnable(
TrueDetectEvent, [GetTrueDetect()], SetTrueDetect
),
Expand Down
44 changes: 44 additions & 0 deletions tests/commands/json/test_mop_auto_wash_frequency.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from __future__ import annotations

from typing import Any

import pytest

from deebot_client.commands.json import GetMopAutoWashFrequency, SetMopAutoWashFrequency
from deebot_client.events import MopAutoWashFrequency, MopAutoWashFrequencyEvent
from tests.helpers import (
get_request_json,
get_success_body,
)

from . import assert_command, assert_set_command


@pytest.mark.parametrize(
("json", "expected"),
[
({"interval": 10}, MopAutoWashFrequencyEvent(MopAutoWashFrequency.TEN_MINUTES)),
(
{"interval": 15},
MopAutoWashFrequencyEvent(MopAutoWashFrequency.FIFTEEN_MINUTES),
),
(
{"interval": 25},
MopAutoWashFrequencyEvent(MopAutoWashFrequency.TWENTY_FIVE_MINUTES),
),
],
)
async def test_GetMopAutoWashFrequency(
json: dict[str, Any], expected: MopAutoWashFrequencyEvent
) -> None:
json = get_request_json(get_success_body(json))
await assert_command(GetMopAutoWashFrequency(), json, expected)


@pytest.mark.parametrize(("value"), [MopAutoWashFrequency.TEN_MINUTES, "ten_minutes"])
async def test_SetMopAutoWashFrequency(value: MopAutoWashFrequency | str) -> None:
command = SetMopAutoWashFrequency(value)
args = {"interval": 10}
await assert_set_command(
command, args, MopAutoWashFrequencyEvent(MopAutoWashFrequency.TEN_MINUTES)
)
Loading