Skip to content
Merged
25 changes: 13 additions & 12 deletions deebot_client/capabilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from deebot_client.events import (
AdvancedModeEvent,
AvailabilityEvent,
BaseStationEvent,
BatteryEvent,
BorderSwitchEvent,
CachedMapInfoEvent,
Expand Down Expand Up @@ -60,6 +61,7 @@
from _typeshed import DataclassInstance

from deebot_client.command import Command
from deebot_client.commands import BaseStationAction
from deebot_client.commands.json.common import ExecuteCommand
from deebot_client.events.efficiency_mode import EfficiencyMode, EfficiencyModeEvent
from deebot_client.models import CleanAction, CleanMode
Expand Down Expand Up @@ -211,17 +213,16 @@ class CapabilitySettings:


@dataclass(frozen=True, kw_only=True)
class CapabilityStation:
"""Capabilities for station."""

auto_empty: (
CapabilitySetTypes[
auto_empty.AutoEmptyEvent,
[bool | None, auto_empty.Frequency | str | None],
auto_empty.Frequency,
]
| None
) = None
class CapabilityBaseStation:
"""Capabilities for the base station."""

action: Callable[[BaseStationAction], Command]
auto_empty: CapabilitySetTypes[
auto_empty.AutoEmptyEvent,
[bool | None, auto_empty.Frequency | str | None],
auto_empty.Frequency,
]
status: CapabilityEvent[BaseStationEvent]


@dataclass(frozen=True, kw_only=True)
Expand All @@ -231,6 +232,7 @@ class Capabilities(ABC):
device_type: DeviceType = field(kw_only=False)

availability: CapabilityEvent[AvailabilityEvent]
base_station: CapabilityBaseStation | None = None
battery: CapabilityEvent[BatteryEvent]
charge: CapabilityExecute
clean: CapabilityClean
Expand All @@ -245,7 +247,6 @@ class Capabilities(ABC):
play_sound: CapabilityExecute
settings: CapabilitySettings
state: CapabilityEvent[StateEvent]
station: CapabilityStation = field(default_factory=CapabilityStation)
stats: CapabilityStats
water: (
CapabilitySetTypes[WaterInfoEvent, [WaterAmount | str], WaterAmount] | None
Expand Down
8 changes: 8 additions & 0 deletions deebot_client/commands/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from __future__ import annotations

from enum import IntEnum, unique
from typing import TYPE_CHECKING

from deebot_client.const import DataType
Expand All @@ -19,3 +20,10 @@
COMMANDS_WITH_MQTT_P2P_HANDLING: dict[DataType, dict[str, type[CommandMqttP2P]]] = {
DataType.JSON: JSON_COMMANDS_WITH_MQTT_P2P_HANDLING
}


@unique
class BaseStationAction(IntEnum):
"""Enum class for all possible base station actions."""

EMPTY_DUSTBIN = 1
6 changes: 5 additions & 1 deletion deebot_client/commands/json/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from deebot_client.command import Command, CommandMqttP2P

from . import auto_empty
from . import auto_empty, station_action, station_state
from .advanced_mode import GetAdvancedMode, SetAdvancedMode
from .battery import GetBattery
from .border_switch import GetBorderSwitch, SetBorderSwitch
Expand Down Expand Up @@ -211,6 +211,10 @@
GetSafeProtect,
SetSafeProtect,

station_action.StationAction,

station_state.GetStationState,

GetSweepMode,
SetSweepMode,

Expand Down
23 changes: 23 additions & 0 deletions deebot_client/commands/json/station_action.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""Charge commands."""

from __future__ import annotations

from typing import TYPE_CHECKING

from deebot_client.logging_filter import get_logger

from .common import ExecuteCommand

if TYPE_CHECKING:
from deebot_client.commands import BaseStationAction

_LOGGER = get_logger(__name__)


class StationAction(ExecuteCommand):
"""Station Action command."""

NAME = "stationAction"

def __init__(self, action: BaseStationAction) -> None:
super().__init__({"act": 1, "type": action.value})
13 changes: 13 additions & 0 deletions deebot_client/commands/json/station_state.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"""Battery commands."""

from __future__ import annotations

from deebot_client.messages.json.station_state import OnStationState

from .common import JsonCommandWithMessageHandling


class GetStationState(OnStationState, JsonCommandWithMessageHandling):
"""Get station state command."""

NAME = "getStationState"
6 changes: 5 additions & 1 deletion deebot_client/events/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@

from deebot_client.events.base import Event

from . import auto_empty
from . import auto_empty, base_station
from .auto_empty import AutoEmptyEvent
from .base_station import BaseStationEvent
from .efficiency_mode import EfficiencyMode, EfficiencyModeEvent
from .fan_speed import FanSpeedEvent, FanSpeedLevel
from .map import (
Expand All @@ -34,6 +35,7 @@

__all__ = [
"AutoEmptyEvent",
"BaseStationEvent",
"BatteryEvent",
"CachedMapInfoEvent",
"CleanJobStatus",
Expand Down Expand Up @@ -61,6 +63,7 @@
"WorkMode",
"WorkModeEvent",
"auto_empty",
"base_station",
]


Expand Down Expand Up @@ -163,6 +166,7 @@ def from_xml(cls, value: str) -> LifeSpan:
STRAINER = "strainer", "Strainer"
HAND_FILTER = "handFilter", "HandFilter"
DUST_CASE_HEAP = "dustCaseHeap", "DustCaseHeap"
BASE_STATION_FILTER = "spHeap", "SpHeap"


@dataclass(frozen=True)
Expand Down
25 changes: 25 additions & 0 deletions deebot_client/events/base_station.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
"""Base station event module."""

from __future__ import annotations

from dataclasses import dataclass
from enum import IntEnum, unique

from .base import Event as _Event

__all__ = ["BaseStationEvent", "Status"]


@unique
class Status(IntEnum):
"""Enum class for all possible base station statuses."""

IDLE = 0
EMPTYING = 1


@dataclass(frozen=True)
class BaseStationEvent(_Event):
"""Base Station Event representation."""

state: Status
20 changes: 20 additions & 0 deletions deebot_client/hardware/deebot/buom7k.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from deebot_client.capabilities import (
Capabilities,
CapabilityBaseStation,
CapabilityClean,
CapabilityCleanAction,
CapabilityCustomCommand,
Expand All @@ -18,6 +19,7 @@
CapabilityStats,
DeviceType,
)
from deebot_client.commands.json.auto_empty import GetAutoEmpty, SetAutoEmpty
from deebot_client.commands.json.battery import GetBattery
from deebot_client.commands.json.carpet import (
GetCarpetAutoFanBoost,
Expand Down Expand Up @@ -46,12 +48,15 @@
from deebot_client.commands.json.play_sound import PlaySound
from deebot_client.commands.json.pos import GetPos
from deebot_client.commands.json.relocation import SetRelocationState
from deebot_client.commands.json.station_action import StationAction
from deebot_client.commands.json.station_state import GetStationState
from deebot_client.commands.json.stats import GetStats, GetTotalStats
from deebot_client.commands.json.volume import GetVolume, SetVolume
from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo
from deebot_client.const import DataType
from deebot_client.events import (
AvailabilityEvent,
BaseStationEvent,
BatteryEvent,
CachedMapInfoEvent,
CarpetAutoFanBoostEvent,
Expand Down Expand Up @@ -79,7 +84,9 @@
VolumeEvent,
WaterAmount,
WaterInfoEvent,
auto_empty,
)
from deebot_client.events.auto_empty import AutoEmptyEvent
from deebot_client.models import StaticDeviceInfo
from deebot_client.util import short_name

Expand All @@ -92,6 +99,19 @@
availability=CapabilityEvent(
AvailabilityEvent, [GetBattery(is_available_check=True)]
),
base_station=CapabilityBaseStation(
action=StationAction,
auto_empty=CapabilitySetTypes(
event=AutoEmptyEvent,
get=[GetAutoEmpty()],
set=SetAutoEmpty,
types=(
auto_empty.Frequency.AUTO,
auto_empty.Frequency.SMART,
),
),
status=CapabilityEvent(BaseStationEvent, [GetStationState()]),
),
battery=CapabilityEvent(BatteryEvent, [GetBattery()]),
charge=CapabilityExecute(Charge),
clean=CapabilityClean(
Expand Down
33 changes: 19 additions & 14 deletions deebot_client/hardware/deebot/p95mgv.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from deebot_client.capabilities import (
Capabilities,
CapabilityBaseStation,
CapabilityClean,
CapabilityCleanAction,
CapabilityCustomCommand,
Expand All @@ -15,7 +16,6 @@
CapabilitySetEnable,
CapabilitySettings,
CapabilitySetTypes,
CapabilityStation,
CapabilityStats,
DeviceType,
)
Expand Down Expand Up @@ -57,6 +57,8 @@
from deebot_client.commands.json.play_sound import PlaySound
from deebot_client.commands.json.pos import GetPos
from deebot_client.commands.json.relocation import SetRelocationState
from deebot_client.commands.json.station_action import StationAction
from deebot_client.commands.json.station_state import GetStationState
from deebot_client.commands.json.stats import GetStats, GetTotalStats
from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect
from deebot_client.commands.json.voice_assistant_state import (
Expand All @@ -69,6 +71,7 @@
from deebot_client.events import (
AdvancedModeEvent,
AvailabilityEvent,
BaseStationEvent,
BatteryEvent,
CachedMapInfoEvent,
CarpetAutoFanBoostEvent,
Expand Down Expand Up @@ -114,6 +117,21 @@
availability=CapabilityEvent(
AvailabilityEvent, [GetBattery(is_available_check=True)]
),
base_station=CapabilityBaseStation(
action=StationAction,
auto_empty=CapabilitySetTypes(
event=auto_empty.AutoEmptyEvent,
get=[GetAutoEmpty()],
set=SetAutoEmpty,
types=(
auto_empty.Frequency.MIN_10,
auto_empty.Frequency.MIN_15,
auto_empty.Frequency.MIN_25,
auto_empty.Frequency.AUTO,
),
),
status=CapabilityEvent(BaseStationEvent, [GetStationState()]),
),
battery=CapabilityEvent(BatteryEvent, [GetBattery()]),
charge=CapabilityExecute(Charge),
clean=CapabilityClean(
Expand Down Expand Up @@ -209,19 +227,6 @@
volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume),
),
state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]),
station=CapabilityStation(
auto_empty=CapabilitySetTypes(
event=auto_empty.AutoEmptyEvent,
get=[GetAutoEmpty()],
set=SetAutoEmpty,
types=(
auto_empty.Frequency.MIN_10,
auto_empty.Frequency.MIN_15,
auto_empty.Frequency.MIN_25,
auto_empty.Frequency.AUTO,
),
),
),
stats=CapabilityStats(
clean=CapabilityEvent(StatsEvent, [GetStats()]),
report=CapabilityEvent(ReportStatsEvent, []),
Expand Down
Loading
Loading