Skip to content

Commit

Permalink
Add Support for Mop Auto-Wash Frequency
Browse files Browse the repository at this point in the history
Ref DeebotUniverse#555
- Add support for Mop Auto-Wash Frequency
- Add Capability to T20/T30 Omni/X5 Pro Omni via `p1jij8.py`
  • Loading branch information
XxInvictus committed Dec 12, 2024
1 parent 1cbc8ed commit 7fd5daa
Show file tree
Hide file tree
Showing 7 changed files with 134 additions and 0 deletions.
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
45 changes: 45 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,45 @@
"""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 | int) -> None:
if isinstance(interval, int):
interval = get_enum(MopAutoWashFrequency, interval)
super().__init__({"interval": interval.value})
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 @@ -40,6 +41,8 @@
"Event",
"FanSpeedEvent",
"FanSpeedLevel",
"MopAutoWashFrequency",
"MopAutoWashFrequencyEvent",
"MajorMapEvent",
"MapChangedEvent",
"MapSetEvent",
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
FIFTEEN_MINUTES = 15
TWENTY_FIVE_MINUTES = 25


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

interval: MopAutoWashFrequency
13 changes: 13 additions & 0 deletions deebot_client/hardware/deebot/p1jij8.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
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 +76,8 @@
MajorMapEvent,
MapChangedEvent,
MapTraceEvent,
MopAutoWashFrequency,
MopAutoWashFrequencyEvent,
MultimapStateEvent,
NetworkInfoEvent,
PositionsEvent,
Expand Down Expand Up @@ -172,6 +175,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
38 changes: 38 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,38 @@
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, 10])
async def test_SetMopAutoWashFrequency(value: MopAutoWashFrequency | int) -> None:
command = SetMopAutoWashFrequency(value)
args = {"interval": 10}
await assert_set_command(
command, args, MopAutoWashFrequencyEvent(MopAutoWashFrequency.TEN_MINUTES)
)

0 comments on commit 7fd5daa

Please sign in to comment.