11import datetime
22import logging
3- from dataclasses import dataclass
3+ from dataclasses import dataclass , field
4+ from enum import Enum
45from typing import Any
56
67from roborock .const import (
9192_LOGGER = logging .getLogger (__name__ )
9293
9394
95+ class FieldNameBase (str , Enum ):
96+ """A base enum class that represents a field name in a RoborockBase dataclass."""
97+
98+
99+ class StatusField (FieldNameBase ):
100+ """An enum that represents a field in the `Status` class.
101+
102+ This is used with `roborock.devices.traits.v1.status.DeviceFeaturesTrait`
103+ to understand if a feature is supported by the device using `is_field_supported`.
104+
105+ The enum values are names of fields in the `Status` class. Each field is
106+ annotated with `requires_schema_code` metadata to map the field to a schema
107+ code in the product schema, which may have a different name than the field/attribute name.
108+ """
109+
110+ STATE = "state"
111+ BATTERY = "battery"
112+ FAN_POWER = "fan_power"
113+ WATER_BOX_MODE = "water_box_mode"
114+ CHARGE_STATUS = "charge_status"
115+ DRY_STATUS = "dry_status"
116+
117+
94118@dataclass
95119class Status (RoborockBase ):
96120 msg_ver : int | None = None
97121 msg_seq : int | None = None
98- state : RoborockStateCode | None = None
99- battery : int | None = None
122+ state : RoborockStateCode | None = field ( metadata = { "requires_schema_code" : "state" }, default = None )
123+ battery : int | None = field ( metadata = { "requires_schema_code" : "battery" }, default = None )
100124 clean_time : int | None = None
101125 clean_area : int | None = None
102126 error_code : RoborockErrorCode | None = None
@@ -109,12 +133,14 @@ class Status(RoborockBase):
109133 back_type : int | None = None
110134 wash_phase : int | None = None
111135 wash_ready : int | None = None
112- fan_power : RoborockFanPowerCode | None = None
136+ fan_power : RoborockFanPowerCode | None = field ( metadata = { "requires_schema_code" : "fan_power" }, default = None )
113137 dnd_enabled : int | None = None
114138 map_status : int | None = None
115139 is_locating : int | None = None
116140 lock_status : int | None = None
117- water_box_mode : RoborockMopIntensityCode | None = None
141+ water_box_mode : RoborockMopIntensityCode | None = field (
142+ metadata = {"requires_schema_code" : "water_box_mode" }, default = None
143+ )
118144 water_box_carriage_status : int | None = None
119145 mop_forbidden_enable : int | None = None
120146 camera_status : int | None = None
@@ -132,13 +158,13 @@ class Status(RoborockBase):
132158 collision_avoid_status : int | None = None
133159 switch_map_mode : int | None = None
134160 dock_error_status : RoborockDockErrorCode | None = None
135- charge_status : int | None = None
161+ charge_status : int | None = field ( metadata = { "requires_schema_code" : "charge_status" }, default = None )
136162 unsave_map_reason : int | None = None
137163 unsave_map_flag : int | None = None
138164 wash_status : int | None = None
139165 distance_off : int | None = None
140166 in_warmup : int | None = None
141- dry_status : int | None = None
167+ dry_status : int | None = field ( metadata = { "requires_schema_code" : "drying_status" }, default = None )
142168 rdt : int | None = None
143169 clean_percent : int | None = None
144170 rss : int | None = None
0 commit comments