roborock.data.mower.mower_containers

Data containers for Roborock mower devices.

  1"""Data containers for Roborock mower devices."""
  2
  3from dataclasses import dataclass, field, fields
  4from typing import Any, Self
  5
  6from roborock.data.containers import RoborockBase
  7from roborock.roborock_message import RoborockMowerDataProtocol
  8
  9from .mower_code_mappings import (
 10    MowerAfsStatus,
 11    MowerChargeState,
 12    MowerChargeType,
 13    MowerConfMode,
 14    MowerDetailState,
 15    MowerDockState,
 16    MowerEffMode,
 17    MowerErrorCode,
 18    MowerFcState,
 19    MowerMappingState,
 20    MowerMappingType,
 21    MowerMowType,
 22    MowerNetworkChannel,
 23    MowerOffDockNoTaskStatus,
 24    MowerOfflineStatus,
 25    MowerOtaState,
 26    MowerPattern,
 27    MowerPendType,
 28    MowerRemoteState,
 29    MowerStartType,
 30)
 31
 32__all__ = [
 33    "MowerGpsCoordinate",
 34    "MowerStatus",
 35]
 36
 37
 38@dataclass
 39class MowerGpsCoordinate(RoborockBase):
 40    """Mower GPS position."""
 41
 42    latitude: float | None = None
 43    longitude: float | None = None
 44
 45
 46@dataclass
 47class MowerStatus(RoborockBase):
 48    """Core mower status backed by mower DPS updates (data points 120-145)."""
 49
 50    error_code: MowerErrorCode | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.ERROR_CODE})
 51    """None means no error code was supplied; UNKNOWN means an unknown error."""
 52    battery: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.BATTERY})
 53    mow_type: MowerMowType | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_TYPE})
 54    mow_state: MowerDetailState | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_STATE})
 55    mapping_type: MowerMappingType | None = field(
 56        default=None, metadata={"dps": RoborockMowerDataProtocol.MAPPING_TYPE}
 57    )
 58    mapping_state: MowerMappingState | None = field(
 59        default=None, metadata={"dps": RoborockMowerDataProtocol.MAPPING_STATE}
 60    )
 61    ota_state: MowerOtaState | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.OTA_STATE})
 62    charge_state: MowerChargeState | None = field(
 63        default=None, metadata={"dps": RoborockMowerDataProtocol.CHARGE_STATE}
 64    )
 65    dock_state: MowerDockState | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.DOCK_STATE})
 66    charge_type: MowerChargeType | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.CHARGE_TYPE})
 67    pend_type: MowerPendType | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.PEND_TYPE})
 68    remote_state: MowerRemoteState | None = field(
 69        default=None, metadata={"dps": RoborockMowerDataProtocol.REMOTE_STATE}
 70    )
 71    mow_start_type: MowerStartType | None = field(
 72        default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_START_TYPE}
 73    )
 74    mow_eff_mode: MowerEffMode | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_EFF_MODE})
 75    mow_height: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_HEIGHT})
 76    mow_direction_angle: int | None = field(
 77        default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_DIRECTION_ANGLE}
 78    )
 79    mow_pattern: MowerPattern | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_PATTERN})
 80    mow_conf_mode: MowerConfMode | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_CONF_MODE})
 81    offline_status: MowerOfflineStatus | None = field(
 82        default=None, metadata={"dps": RoborockMowerDataProtocol.OFFLINE_STATUS}
 83    )
 84    mow_progress: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_PROGRESS})
 85    blade_lifespan: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.BLADE_LIFESPAN})
 86    fc_state: MowerFcState | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.FC_STATE})
 87    gps_coordinate: MowerGpsCoordinate | None = field(
 88        default=None, metadata={"dps": RoborockMowerDataProtocol.GPS_COORDINATE}
 89    )
 90    off_dock_no_task_status: MowerOffDockNoTaskStatus | None = field(
 91        default=None, metadata={"dps": RoborockMowerDataProtocol.OFF_DOCK_NO_TASK_STATUS}
 92    )
 93    afs_status: MowerAfsStatus | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.AFS_STATUS})
 94    network_channel: MowerNetworkChannel | None = field(
 95        default=None, metadata={"dps": RoborockMowerDataProtocol.NETWORK_CHANNEL}
 96    )
 97
 98    @classmethod
 99    def from_dps(cls, dps: dict[int | str, Any] | None) -> Self:
100        """Create typed status from integer or string DPS keys."""
101        field_by_dps = {
102            int(field_info.metadata["dps"]): field_info.name
103            for field_info in fields(cls)
104            if "dps" in field_info.metadata
105        }
106        values: dict[str, Any] = {}
107        for key, value in (dps or {}).items():
108            try:
109                dps_id = int(key)
110            except (TypeError, ValueError):
111                continue
112            if field_name := field_by_dps.get(dps_id):
113                values[field_name] = value
114        return cls.from_dict(values)
@dataclass
class MowerGpsCoordinate(roborock.data.containers.RoborockBase):
39@dataclass
40class MowerGpsCoordinate(RoborockBase):
41    """Mower GPS position."""
42
43    latitude: float | None = None
44    longitude: float | None = None

Mower GPS position.

MowerGpsCoordinate(latitude: float | None = None, longitude: float | None = None)
latitude: float | None = None
longitude: float | None = None
@dataclass
class MowerStatus(roborock.data.containers.RoborockBase):
 47@dataclass
 48class MowerStatus(RoborockBase):
 49    """Core mower status backed by mower DPS updates (data points 120-145)."""
 50
 51    error_code: MowerErrorCode | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.ERROR_CODE})
 52    """None means no error code was supplied; UNKNOWN means an unknown error."""
 53    battery: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.BATTERY})
 54    mow_type: MowerMowType | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_TYPE})
 55    mow_state: MowerDetailState | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_STATE})
 56    mapping_type: MowerMappingType | None = field(
 57        default=None, metadata={"dps": RoborockMowerDataProtocol.MAPPING_TYPE}
 58    )
 59    mapping_state: MowerMappingState | None = field(
 60        default=None, metadata={"dps": RoborockMowerDataProtocol.MAPPING_STATE}
 61    )
 62    ota_state: MowerOtaState | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.OTA_STATE})
 63    charge_state: MowerChargeState | None = field(
 64        default=None, metadata={"dps": RoborockMowerDataProtocol.CHARGE_STATE}
 65    )
 66    dock_state: MowerDockState | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.DOCK_STATE})
 67    charge_type: MowerChargeType | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.CHARGE_TYPE})
 68    pend_type: MowerPendType | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.PEND_TYPE})
 69    remote_state: MowerRemoteState | None = field(
 70        default=None, metadata={"dps": RoborockMowerDataProtocol.REMOTE_STATE}
 71    )
 72    mow_start_type: MowerStartType | None = field(
 73        default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_START_TYPE}
 74    )
 75    mow_eff_mode: MowerEffMode | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_EFF_MODE})
 76    mow_height: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_HEIGHT})
 77    mow_direction_angle: int | None = field(
 78        default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_DIRECTION_ANGLE}
 79    )
 80    mow_pattern: MowerPattern | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_PATTERN})
 81    mow_conf_mode: MowerConfMode | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_CONF_MODE})
 82    offline_status: MowerOfflineStatus | None = field(
 83        default=None, metadata={"dps": RoborockMowerDataProtocol.OFFLINE_STATUS}
 84    )
 85    mow_progress: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_PROGRESS})
 86    blade_lifespan: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.BLADE_LIFESPAN})
 87    fc_state: MowerFcState | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.FC_STATE})
 88    gps_coordinate: MowerGpsCoordinate | None = field(
 89        default=None, metadata={"dps": RoborockMowerDataProtocol.GPS_COORDINATE}
 90    )
 91    off_dock_no_task_status: MowerOffDockNoTaskStatus | None = field(
 92        default=None, metadata={"dps": RoborockMowerDataProtocol.OFF_DOCK_NO_TASK_STATUS}
 93    )
 94    afs_status: MowerAfsStatus | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.AFS_STATUS})
 95    network_channel: MowerNetworkChannel | None = field(
 96        default=None, metadata={"dps": RoborockMowerDataProtocol.NETWORK_CHANNEL}
 97    )
 98
 99    @classmethod
100    def from_dps(cls, dps: dict[int | str, Any] | None) -> Self:
101        """Create typed status from integer or string DPS keys."""
102        field_by_dps = {
103            int(field_info.metadata["dps"]): field_info.name
104            for field_info in fields(cls)
105            if "dps" in field_info.metadata
106        }
107        values: dict[str, Any] = {}
108        for key, value in (dps or {}).items():
109            try:
110                dps_id = int(key)
111            except (TypeError, ValueError):
112                continue
113            if field_name := field_by_dps.get(dps_id):
114                values[field_name] = value
115        return cls.from_dict(values)

Core mower status backed by mower DPS updates (data points 120-145).

MowerStatus( error_code: roborock.data.mower.mower_code_mappings.MowerErrorCode | None = None, battery: int | None = None, mow_type: roborock.data.mower.mower_code_mappings.MowerMowType | None = None, mow_state: roborock.data.mower.mower_code_mappings.MowerDetailState | None = None, mapping_type: roborock.data.mower.mower_code_mappings.MowerMappingType | None = None, mapping_state: roborock.data.mower.mower_code_mappings.MowerMappingState | None = None, ota_state: roborock.data.mower.mower_code_mappings.MowerOtaState | None = None, charge_state: roborock.data.mower.mower_code_mappings.MowerChargeState | None = None, dock_state: roborock.data.mower.mower_code_mappings.MowerDockState | None = None, charge_type: roborock.data.mower.mower_code_mappings.MowerChargeType | None = None, pend_type: roborock.data.mower.mower_code_mappings.MowerPendType | None = None, remote_state: roborock.data.mower.mower_code_mappings.MowerRemoteState | None = None, mow_start_type: roborock.data.mower.mower_code_mappings.MowerStartType | None = None, mow_eff_mode: roborock.data.mower.mower_code_mappings.MowerEffMode | None = None, mow_height: int | None = None, mow_direction_angle: int | None = None, mow_pattern: roborock.data.mower.mower_code_mappings.MowerPattern | None = None, mow_conf_mode: roborock.data.mower.mower_code_mappings.MowerConfMode | None = None, offline_status: roborock.data.mower.mower_code_mappings.MowerOfflineStatus | None = None, mow_progress: int | None = None, blade_lifespan: int | None = None, fc_state: roborock.data.mower.mower_code_mappings.MowerFcState | None = None, gps_coordinate: MowerGpsCoordinate | None = None, off_dock_no_task_status: roborock.data.mower.mower_code_mappings.MowerOffDockNoTaskStatus | None = None, afs_status: roborock.data.mower.mower_code_mappings.MowerAfsStatus | None = None, network_channel: roborock.data.mower.mower_code_mappings.MowerNetworkChannel | None = None)

None means no error code was supplied; UNKNOWN means an unknown error.

battery: int | None = None
mow_height: int | None = None
mow_direction_angle: int | None = None
mow_progress: int | None = None
blade_lifespan: int | None = None
gps_coordinate: MowerGpsCoordinate | None = None
@classmethod
def from_dps(cls, dps: dict[int | str, typing.Any] | None) -> Self:
 99    @classmethod
100    def from_dps(cls, dps: dict[int | str, Any] | None) -> Self:
101        """Create typed status from integer or string DPS keys."""
102        field_by_dps = {
103            int(field_info.metadata["dps"]): field_info.name
104            for field_info in fields(cls)
105            if "dps" in field_info.metadata
106        }
107        values: dict[str, Any] = {}
108        for key, value in (dps or {}).items():
109            try:
110                dps_id = int(key)
111            except (TypeError, ValueError):
112                continue
113            if field_name := field_by_dps.get(dps_id):
114                values[field_name] = value
115        return cls.from_dict(values)

Create typed status from integer or string DPS keys.