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)
39@dataclass 40class MowerGpsCoordinate(RoborockBase): 41 """Mower GPS position.""" 42 43 latitude: float | None = None 44 longitude: float | None = None
Mower GPS position.
Inherited Members
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)
off_dock_no_task_status: roborock.data.mower.mower_code_mappings.MowerOffDockNoTaskStatus | 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.