python-kasa/kasa/smart/modules/vacuum.py

138 lines
3.6 KiB
Python
Raw Normal View History

2024-11-30 15:06:00 +00:00
"""Implementation of vacuum."""
from __future__ import annotations
import logging
from enum import IntEnum
from typing import TYPE_CHECKING
from ...feature import Feature
from ..smartmodule import SmartModule
if TYPE_CHECKING:
from ..smartdevice import SmartDevice
_LOGGER = logging.getLogger(__name__)
class Status(IntEnum):
"""Status of vacuum."""
Idle = 0
Cleaning = 1
GoingHome = 4
Charging = 5
Charged = 6
Paused = 7
Error = 100
Unknown = 101
class Vacuum(SmartModule):
2024-11-30 15:06:00 +00:00
"""Implementation of vacuum support."""
REQUIRED_COMPONENT = "clean"
2024-11-30 15:06:00 +00:00
def __init__(self, device: SmartDevice, module: str) -> None:
super().__init__(device, module)
self._add_feature(
Feature(
device,
"return_home",
"Return home",
container=self,
attribute_setter="return_home",
category=Feature.Category.Primary,
type=Feature.Action,
)
)
self._add_feature(
Feature(
device,
"start_cleaning",
"Start cleaning",
container=self,
attribute_setter="start",
category=Feature.Category.Primary,
type=Feature.Action,
)
)
self._add_feature(
Feature(
device,
"pause",
"Pause",
container=self,
attribute_setter="pause",
category=Feature.Category.Primary,
type=Feature.Action,
)
)
self._add_feature(
Feature(
device,
"status",
"Vacuum state",
container=self,
attribute_getter="status",
category=Feature.Category.Primary,
type=Feature.Type.Sensor,
)
)
def query(self) -> dict:
"""Query to execute during the update cycle."""
return {"getVacStatus": None}
2024-11-30 15:06:00 +00:00
async def start(self) -> dict:
"""Start cleaning."""
# If we are paused, do not restart cleaning
if self.status == Status.Paused:
return await self.resume()
# TODO: we need to create settings for clean_modes
2024-06-02 16:52:30 +00:00
return await self.call(
"setSwitchClean",
{
"clean_mode": 0,
"clean_on": True,
"clean_order": True,
"force_clean": False,
},
)
2024-11-30 15:06:00 +00:00
async def pause(self) -> dict:
"""Pause cleaning."""
return await self.set_pause(True)
2024-11-30 15:06:00 +00:00
async def resume(self) -> dict:
"""Resume cleaning."""
return await self.set_pause(False)
2024-11-30 15:06:00 +00:00
async def set_pause(self, enabled: bool) -> dict:
"""Pause or resume cleaning."""
2024-06-02 16:52:30 +00:00
return await self.call("setRobotPause", {"pause": enabled})
2024-11-30 15:06:00 +00:00
async def return_home(self) -> dict:
"""Return home."""
return await self.set_return_home(True)
2024-11-30 15:06:00 +00:00
async def set_return_home(self, enabled: bool) -> dict:
"""Return home / pause returning."""
2024-06-02 16:52:30 +00:00
return await self.call("setSwitchCharge", {"switch_charge": enabled})
@property
def status(self) -> Status:
"""Return current status."""
if self.data.get("err_status"):
return Status.Error
2024-11-30 15:06:00 +00:00
status_code = self.data["status"]
try:
return Status(status_code)
2024-11-30 15:06:00 +00:00
except ValueError:
_LOGGER.warning("Got unknown status code: %s (%s)", status_code, self.data)
return Status.Unknown