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)
@dataclass
class MowerStatus(roborock.data.containers.RoborockBase):
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)
error_code: int | None = None
battery: int | None = None
mow_type: int | 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.