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 RoborockMowerStateCode 10 11 12@dataclass 13class MowerStatus(RoborockBase): 14 """Core mower status backed by mower DPS updates.""" 15 16 error_code: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.ERROR_CODE}) 17 battery: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.BATTERY}) 18 mow_type: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_TYPE}) 19 mow_state: RoborockMowerStateCode | None = field( 20 default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_STATE} 21 ) 22 mapping_type: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MAPPING_TYPE}) 23 mapping_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MAPPING_STATE}) 24 ota_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.OTA_STATE}) 25 charge_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.CHARGE_STATE}) 26 dock_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.DOCK_STATE}) 27 charge_type: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.CHARGE_TYPE}) 28 pend_type: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.PEND_TYPE}) 29 remote_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.REMOTE_STATE}) 30 mow_start_type: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_START_TYPE}) 31 mow_eff_mode: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_EFF_MODE}) 32 mow_height: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_HEIGHT}) 33 mow_direction_angle: int | None = field( 34 default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_DIRECTION_ANGLE} 35 ) 36 mow_pattern: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_PATTERN}) 37 mow_conf_mode: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_CONF_MODE}) 38 offline_status: Any | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.OFFLINE_STATUS}) 39 mow_progress: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_PROGRESS}) 40 blade_lifespan: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.BLADE_LIFESPAN}) 41 fc_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.FC_STATE}) 42 gps_coordinate: Any | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.GPS_COORDINATE}) 43 off_dock_no_task_status: int | None = field( 44 default=None, metadata={"dps": RoborockMowerDataProtocol.OFF_DOCK_NO_TASK_STATUS} 45 ) 46 afs_status: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.AFS_STATUS}) 47 network_channel: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.NETWORK_CHANNEL}) 48 49 @classmethod 50 def from_dps(cls, dps: dict[int | str, Any] | None) -> Self: 51 """Create mower status from raw DPS data. 52 53 Cloud snapshots use string DPS keys while decoded MQTT messages may use 54 integer keys. Unknown and malformed keys are ignored. 55 """ 56 field_by_dps = { 57 int(field_info.metadata["dps"]): field_info.name 58 for field_info in fields(cls) 59 if "dps" in field_info.metadata 60 } 61 values: dict[str, Any] = {} 62 for key, value in (dps or {}).items(): 63 try: 64 dps_id = int(key) 65 except (TypeError, ValueError): 66 continue 67 if field_name := field_by_dps.get(dps_id): 68 values[field_name] = value 69 return cls.from_dict(values)
13@dataclass 14class MowerStatus(RoborockBase): 15 """Core mower status backed by mower DPS updates.""" 16 17 error_code: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.ERROR_CODE}) 18 battery: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.BATTERY}) 19 mow_type: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_TYPE}) 20 mow_state: RoborockMowerStateCode | None = field( 21 default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_STATE} 22 ) 23 mapping_type: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MAPPING_TYPE}) 24 mapping_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MAPPING_STATE}) 25 ota_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.OTA_STATE}) 26 charge_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.CHARGE_STATE}) 27 dock_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.DOCK_STATE}) 28 charge_type: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.CHARGE_TYPE}) 29 pend_type: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.PEND_TYPE}) 30 remote_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.REMOTE_STATE}) 31 mow_start_type: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_START_TYPE}) 32 mow_eff_mode: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_EFF_MODE}) 33 mow_height: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_HEIGHT}) 34 mow_direction_angle: int | None = field( 35 default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_DIRECTION_ANGLE} 36 ) 37 mow_pattern: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_PATTERN}) 38 mow_conf_mode: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_CONF_MODE}) 39 offline_status: Any | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.OFFLINE_STATUS}) 40 mow_progress: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.MOW_PROGRESS}) 41 blade_lifespan: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.BLADE_LIFESPAN}) 42 fc_state: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.FC_STATE}) 43 gps_coordinate: Any | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.GPS_COORDINATE}) 44 off_dock_no_task_status: int | None = field( 45 default=None, metadata={"dps": RoborockMowerDataProtocol.OFF_DOCK_NO_TASK_STATUS} 46 ) 47 afs_status: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.AFS_STATUS}) 48 network_channel: int | None = field(default=None, metadata={"dps": RoborockMowerDataProtocol.NETWORK_CHANNEL}) 49 50 @classmethod 51 def from_dps(cls, dps: dict[int | str, Any] | None) -> Self: 52 """Create mower status from raw DPS data. 53 54 Cloud snapshots use string DPS keys while decoded MQTT messages may use 55 integer keys. Unknown and malformed keys are ignored. 56 """ 57 field_by_dps = { 58 int(field_info.metadata["dps"]): field_info.name 59 for field_info in fields(cls) 60 if "dps" in field_info.metadata 61 } 62 values: dict[str, Any] = {} 63 for key, value in (dps or {}).items(): 64 try: 65 dps_id = int(key) 66 except (TypeError, ValueError): 67 continue 68 if field_name := field_by_dps.get(dps_id): 69 values[field_name] = value 70 return cls.from_dict(values)
Core mower status backed by mower DPS updates.
MowerStatus( error_code: int | None = None, battery: int | None = None, mow_type: int | None = None, mow_state: roborock.data.mower.mower_code_mappings.RoborockMowerStateCode | None = None, mapping_type: int | None = None, mapping_state: int | None = None, ota_state: int | None = None, charge_state: int | None = None, dock_state: int | None = None, charge_type: int | None = None, pend_type: int | None = None, remote_state: int | None = None, mow_start_type: int | None = None, mow_eff_mode: int | None = None, mow_height: int | None = None, mow_direction_angle: int | None = None, mow_pattern: int | None = None, mow_conf_mode: int | None = None, offline_status: typing.Any | None = None, mow_progress: int | None = None, blade_lifespan: int | None = None, fc_state: int | None = None, gps_coordinate: typing.Any | None = None, off_dock_no_task_status: int | None = None, afs_status: int | None = None, network_channel: int | None = None)
@classmethod
def
from_dps(cls, dps: dict[int | str, typing.Any] | None) -> Self:
50 @classmethod 51 def from_dps(cls, dps: dict[int | str, Any] | None) -> Self: 52 """Create mower status from raw DPS data. 53 54 Cloud snapshots use string DPS keys while decoded MQTT messages may use 55 integer keys. Unknown and malformed keys are ignored. 56 """ 57 field_by_dps = { 58 int(field_info.metadata["dps"]): field_info.name 59 for field_info in fields(cls) 60 if "dps" in field_info.metadata 61 } 62 values: dict[str, Any] = {} 63 for key, value in (dps or {}).items(): 64 try: 65 dps_id = int(key) 66 except (TypeError, ValueError): 67 continue 68 if field_name := field_by_dps.get(dps_id): 69 values[field_name] = value 70 return cls.from_dict(values)
Create mower status from raw DPS data.
Cloud snapshots use string DPS keys while decoded MQTT messages may use integer keys. Unknown and malformed keys are ignored.