Skip to content

Commit 1a188d9

Browse files
committed
feat: Add consumable fields
1 parent ebf3d62 commit 1a188d9

3 files changed

Lines changed: 63 additions & 4 deletions

File tree

roborock/data/v1/v1_containers.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -625,11 +625,27 @@ class CleanSummaryWithDetail(CleanSummary):
625625
last_clean_record: CleanRecord | None = None
626626

627627

628+
class ConsumableField(FieldNameBase):
629+
"""An enum that represents a field in the `Consumable` class.
630+
631+
This is used with `roborock.devices.traits.v1.status.DeviceFeaturesTrait`
632+
to understand if a feature is supported by the device using `is_field_supported`.
633+
634+
The enum values are names of fields in the `Consumable` class. Each field is
635+
annotated with `requires_schema_code` metadata to map the field to a schema
636+
code in the product schema, which may have a different name than the field/attribute name.
637+
"""
638+
639+
MAIN_BRUSH_WORK_TIME = "main_brush_work_time"
640+
SIDE_BRUSH_WORK_TIME = "side_brush_work_time"
641+
FILTER_WORK_TIME = "filter_work_time"
642+
643+
628644
@dataclass
629645
class Consumable(RoborockBase):
630-
main_brush_work_time: int | None = None
631-
side_brush_work_time: int | None = None
632-
filter_work_time: int | None = None
646+
main_brush_work_time: int | None = field(metadata={"requires_schema_code": "main_brush_life"}, default=None)
647+
side_brush_work_time: int | None = field(metadata={"requires_schema_code": "side_brush_life"}, default=None)
648+
filter_work_time: int | None = field(metadata={"requires_schema_code": "filter_life"}, default=None)
633649
filter_element_work_time: int | None = None
634650
sensor_dirty_time: int | None = None
635651
strainer_work_times: int | None = None

tests/devices/traits/v1/__snapshots__/test_device_features.ambr

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,24 @@
3232
'water_box_mode': True,
3333
})
3434
# ---
35+
# name: test_is_consumable_field_supported[home_data_device_s5e.json]
36+
dict({
37+
'filter_work_time': True,
38+
'main_brush_work_time': True,
39+
'side_brush_work_time': True,
40+
})
41+
# ---
42+
# name: test_is_consumable_field_supported[home_data_device_s7_maxv.json]
43+
dict({
44+
'filter_work_time': True,
45+
'main_brush_work_time': True,
46+
'side_brush_work_time': True,
47+
})
48+
# ---
49+
# name: test_is_consumable_field_supported[home_data_device_saros_10r.json]
50+
dict({
51+
'filter_work_time': True,
52+
'main_brush_work_time': True,
53+
'side_brush_work_time': True,
54+
})
55+
# ---

tests/devices/traits/v1/test_device_features.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
from syrupy import SnapshotAssertion
55

66
from roborock.data import HomeDataDevice
7-
from roborock.data.v1.v1_containers import StatusField
7+
from roborock.data.v1.v1_containers import ConsumableField, StatusField
88
from roborock.devices.device import RoborockDevice
9+
from roborock.devices.traits.v1.consumeable import ConsumableTrait
910
from roborock.devices.traits.v1.status import StatusTrait
1011
from tests import mock_data
1112

@@ -33,3 +34,24 @@ async def test_is_attribute_supported(
3334
field.value: device_features_trait.is_field_supported(StatusTrait, field) for field in StatusField
3435
}
3536
assert is_v1_supported == snapshot
37+
38+
39+
@pytest.mark.parametrize(
40+
("device_info"),
41+
V1_DEVICES.values(),
42+
ids=list(V1_DEVICES.keys()),
43+
)
44+
async def test_is_consumable_field_supported(
45+
device_info: HomeDataDevice,
46+
device: RoborockDevice,
47+
snapshot: SnapshotAssertion,
48+
) -> None:
49+
"""Test if a field is supported."""
50+
assert device.v1_properties is not None
51+
assert device.v1_properties.device_features is not None
52+
device_features_trait = device.v1_properties.device_features
53+
54+
is_v1_supported = {
55+
field.value: device_features_trait.is_field_supported(ConsumableTrait, field) for field in ConsumableField
56+
}
57+
assert is_v1_supported == snapshot

0 commit comments

Comments
 (0)