Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 152 additions & 0 deletions device_info.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -877,6 +877,158 @@ roborock.vacuum.a27:
code: offline_status
mode: ro
type: RAW
roborock.vacuum.a294:
protocol_version: '1.0'
product_nickname: Unknown
new_feature_info: 2247397454282751
new_feature_info_str: 0000009021D0B410C0C47EFDA82934C952BA8F507EDEFFFE
feature_info:
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
product:
id: aZagb9tLAoAq2UbmGnFx0
name: Roborock Qrevo 2 Pro Series
model: roborock.vacuum.a294
category: robot.vacuum.cleaner
capability: 0
schema:
- id: 101
name: rpc_request
code: rpc_request
mode: rw
type: RAW
- id: 102
name: rpc_response
code: rpc_response
mode: rw
type: RAW
- id: 120
name: "\u9519\u8BEF\u4EE3\u7801"
code: error_code
mode: ro
type: ENUM
property: '{"range": [""]}'
- id: 121
name: "\u8BBE\u5907\u72B6\u6001"
code: state
mode: ro
type: ENUM
property: '{"range": [""]}'
- id: 122
name: "\u8BBE\u5907\u7535\u91CF"
code: battery
mode: ro
type: ENUM
property: '{"range": [""]}'
- id: 123
name: "\u6E05\u626B\u6A21\u5F0F"
code: fan_power
mode: rw
type: ENUM
property: '{"range": [""]}'
- id: 124
name: "\u62D6\u5730\u6A21\u5F0F"
code: water_box_mode
mode: rw
type: ENUM
property: '{"range": [""]}'
- id: 125
name: "\u4E3B\u5237\u5BFF\u547D"
code: main_brush_life
mode: rw
type: VALUE
property: '{"max": 100, "min": 0, "step": 1, "unit": "null", "scale": 1}'
- id: 126
name: "\u8FB9\u5237\u5BFF\u547D"
code: side_brush_life
mode: rw
type: VALUE
property: '{"max": 100, "min": 0, "step": 1, "unit": "null", "scale": 1}'
- id: 127
name: "\u6EE4\u7F51\u5BFF\u547D"
code: filter_life
mode: rw
type: VALUE
property: '{"max": 100, "min": 0, "step": 1, "unit": "null", "scale": 1}'
- id: 128
name: "\u989D\u5916\u72B6\u6001"
code: additional_props
mode: ro
type: RAW
- id: 130
name: "\u5B8C\u6210\u4E8B\u4EF6"
code: task_complete
mode: ro
type: RAW
- id: 131
name: "\u7535\u91CF\u4E0D\u8DB3\u4EFB\u52A1\u53D6\u6D88"
code: task_cancel_low_power
mode: ro
type: RAW
- id: 132
name: "\u8FD0\u52A8\u4E2D\u4EFB\u52A1\u53D6\u6D88"
code: task_cancel_in_motion
mode: ro
type: RAW
- id: 133
name: "\u5145\u7535\u72B6\u6001"
code: charge_status
mode: ro
type: RAW
- id: 134
name: "\u70D8\u5E72\u72B6\u6001"
code: drying_status
mode: ro
type: RAW
- id: 135
name: "\u79BB\u7EBF\u539F\u56E0\u7EC6\u5206"
code: offline_status
mode: ro
type: RAW
- id: 138
name: "\u5DE5\u4F5C\u4EFB\u52A1\u7C7B\u578B"
code: clean_task_type
mode: ro
type: ENUM
property: "{\"range\": [\"0 \u7A7A\u95F2\", \"1 \u5168\u5C4B\u6E05\u6D01\",\
\ \"2 \u9009\u533A\u6E05\u6D01\", \"3 \u5212\u533A\u6E05\u6D01\", \"4 \u5EFA\
\u56FE\", \"5 \u5C40\u90E8\u6E05\u6D01\", \"6 \u9065\u63A7\u6A21\u5F0F\",\
\ \"7 \u5DE1\u822A\", \"8 \u5BFB\u5BA0\", \"9 \u6574\u7406\"]}"
- id: 139
name: "\u56DE\u57FA\u7AD9\u76EE\u7684"
code: back_type
mode: ro
type: RAW
- id: 141
name: "\u6E05\u6D01\u8FDB\u5EA6"
code: cleaning_progress
mode: ro
type: VALUE
property: "{\"max\": 100, \"min\": 0, \"step\": 1, \"unit\": \"\u767E\u5206\u6BD4\
\", \"scale\": 1}"
- id: 142
name: publish_dsp
code: publish_dsp
mode: ro
type: RAW
- id: 143
name: "\u5730\u56FE\u53D8\u5316\u6570\u636E"
code: map_diff
mode: ro
type: RAW
roborock.vacuum.a75:
protocol_version: '1.0'
product_nickname: PEARL
Expand Down
8 changes: 8 additions & 0 deletions roborock/devices/traits/v1/device_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
from roborock.devices.traits.v1 import common
from roborock.roborock_typing import RoborockCommand

# Qrevo 2 Pro uses single-line laser obstacle sensing without an RGB camera.
_MODELS_WITHOUT_OBSTACLE_PHOTOS = frozenset({"roborock.vacuum.a294"})

# Cache of metadata for each trait class
_metadata_cache: dict[type[RoborockBase], dict[str, dict[str, Any]]] = {}

Expand Down Expand Up @@ -69,6 +72,11 @@ def __init__(self, product: HomeDataProduct, device_cache: DeviceCache) -> None:
for field in fields(self):
setattr(self, field.name, False)

@property
def is_obstacle_photo_download_supported(self) -> bool:
"""Return whether obstacle-photo downloads are supported for trait discovery."""
return self.is_ai_recognition_obstacle_supported and self._product.model not in _MODELS_WITHOUT_OBSTACLE_PHOTOS

def is_field_supported(self, cls: type[RoborockBase], field_name: FieldNameBase) -> bool:
"""Determines if the specified field is supported by this device.

Expand Down
2 changes: 1 addition & 1 deletion roborock/devices/traits/v1/obstacle_photos.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ class ObstaclePhotoTrait(RoborockBase, common.V1TraitMixin):
command = RoborockCommand.GET_PHOTO
converter = ObstaclePhotoConverter()
blob_rpc_channel = True
requires_feature = "is_ai_recognition_obstacle_supported"
requires_feature = "is_obstacle_photo_download_supported"

def __init__(self, standard_rpc_channel: V1RpcChannel) -> None:
"""Initialize the obstacle photo trait."""
Expand Down
179 changes: 179 additions & 0 deletions tests/__snapshots__/test_supported_features.ambr
Original file line number Diff line number Diff line change
Expand Up @@ -1073,6 +1073,185 @@
'is_workday_holiday_supported': False,
})
# ---
# name: test_device_features_from_home_data[home_data_device_qrevo_2_pro.json]
dict({
'is_activate_video_charging_and_standby_supported': False,
'is_ai_recognition_obstacle_supported': True,
'is_ai_recognition_setting_supported': True,
'is_analysis_supported': False,
'is_any_state_transit_goto_supported': True,
'is_auto_collection_2_supported': True,
'is_auto_delivery_field_in_global_status_supported': False,
'is_auto_tear_down_mop_supported': True,
'is_avoid_collision_mode_supported': True,
'is_avoid_collision_supported': True,
'is_back_charge_auto_wash_supported': True,
'is_back_wash_new_smart_supported': True,
'is_careful_slow_mop_supported': True,
'is_carpet_custom_clean_supported': True,
'is_carpet_deep_clean_supported': True,
'is_carpet_long_haired_ex_supported': False,
'is_carpet_long_haired_supported': False,
'is_carpet_pressure_use_origin_paras_supported': False,
'is_carpet_shape_type_supported': True,
'is_carpet_show_on_map': True,
'is_carpet_supported': True,
'is_ces_2022_supported': False,
'is_clean_count_setting_supported': True,
'is_clean_direct_status_supported': True,
'is_clean_efficiency_supported': True,
'is_clean_fluid_delivery_supported': False,
'is_clean_history_time_line_supported': True,
'is_clean_route_deep_slow_plus_supported': False,
'is_clean_route_fast_mode_supported': True,
'is_clean_route_setting_supported': True,
'is_clean_then_mop_mode_supported': True,
'is_clean_time_line_supported': True,
'is_collect_dust_count_show_supported': True,
'is_collect_dust_mode_supported': True,
'is_corner_clean_mode_supported': False,
'is_corner_mop_stretch_supported': True,
'is_ctm_with_repeat_supported': True,
'is_current_map_restore_enabled': True,
'is_custom_clean_mode_count_supported': True,
'is_custom_mode_supported': True,
'is_custom_water_box_distance_supported': True,
'is_customized_clean_supported': True,
'is_detect_wire_carpet_supported': True,
'is_dirty_object_detect_supported': False,
'is_dirty_replenish_clean_supported': False,
'is_dry_interval_timer_supported': True,
'is_dss_believable': True,
'is_dual_band_wi_fi_supported': True,
'is_dust_collection_setting_supported': True,
'is_dynamically_add_clean_zones_supported': True,
'is_dynamically_skip_clean_zone_supported': True,
'is_egg_dance_mode_supported': False,
'is_egg_mode_supported_from_new_features': False,
'is_exact_custom_mode_supported': True,
'is_exhibition_function_supported': False,
'is_floor_dir_clean_any_time_supported': True,
'is_flow_led_setting_supported': False,
'is_follow_low_obs_supported': False,
'is_full_duples_switch_supported': False,
'is_fw_filter_obstacle_supported': True,
'is_gap_deep_clean_supported': False,
'is_goto_pure_clean_path_supported': True,
'is_hot_wash_towel_supported': True,
'is_identify_room_supported': False,
'is_ignore_unknown_map_object_supported': True,
'is_lds_lifting_supported': False,
'is_led_status_switch_supported': False,
'is_left_water_drain_supported': True,
'is_low_area_access_supported': False,
'is_main_brush_up_down_supported_from_str': True,
'is_map_beautify_internal_debug_supported': True,
'is_map_carpet_add_support': True,
'is_map_eraser_supported': True,
'is_matter_supported': True,
'is_max_plus_mode_supported': True,
'is_max_zone_opened_supported': True,
'is_mechanical_arm_mode_supported': False,
'is_midway_back_to_dock_supported': True,
'is_min_battery_15_to_clean_task_supported': True,
'is_mop_forbidden_supported': False,
'is_mop_path_supported': True,
'is_mop_shake_module_supported': False,
'is_mop_shake_water_max_supported': False,
'is_multi_floor_supported': False,
'is_multi_map_segment_timer_supported': True,
'is_new_ai_recognition_supported': True,
'is_new_data_for_clean_history': True,
'is_new_data_for_clean_history_detail': True,
'is_new_endpoint_supported': True,
'is_new_remote_view_supported': True,
'is_no_need_carpet_press_set_supported': True,
'is_none_pure_clean_mop_with_max_plus': False,
'is_object_detect_check_supported': True,
'is_offline_map_supported': True,
'is_optimize_battery_supported': False,
'is_order_clean_supported': False,
'is_over_sea_ctm_supported': True,
'is_pet_snapshot_supported': False,
'is_pet_supplies_deep_clean_supported': True,
'is_program_mode_supported': False,
'is_pumping_water_supported': False,
'is_pure_clean_mop_supported': True,
'is_re_segment_supported': True,
'is_record_allowed': True,
'is_remote_supported': False,
'is_right_brush_stretch_supported': False,
'is_roller_mop_supported': False,
'is_room_name_supported': True,
'is_rpc_retry_supported': True,
'is_rubber_brush_carpet_supported': False,
'is_set_child_supported': True,
'is_setting_carpet_first_supported': True,
'is_shake_mop_set_supported': True,
'is_should_show_arm_over_load_supported': True,
'is_show_clean_finish_reason_supported': True,
'is_show_general_obstacle_supported': False,
'is_show_obstacle_photo_supported': False,
'is_side_brush_lift_carpet_supported': False,
'is_small_side_mop_supported': False,
'is_smart_clean_mode_set_supported': True,
'is_soak_and_wash_supported': True,
'is_soft_clean_mode_supported': False,
'is_sr_map_supported': False,
'is_super_deep_wash_supported': True,
'is_support_api_app_stop_grasp_supported': True,
'is_support_backup_map': True,
'is_support_clean_estimate': True,
'is_support_cliff_zone': True,
'is_support_custom_carpet': False,
'is_support_custom_dnd': True,
'is_support_custom_door_sill': True,
'is_support_custom_mode_in_cleaning': True,
'is_support_fetch_timer_summary': False,
'is_support_floor_direction': True,
'is_support_floor_edit': True,
'is_support_furniture': True,
'is_support_get_particular_status_supported': True,
'is_support_incremental_map': True,
'is_support_main_brush_up_down_supported': False,
'is_support_mop_back_pwm_set': False,
'is_support_quick_map_builder': True,
'is_support_remote_control_in_call': False,
'is_support_room_tag': True,
'is_support_set_switch_map_mode': True,
'is_support_set_volume_in_call': False,
'is_support_side_brush_up_down_supported': False,
'is_support_smart_door_sill': True,
'is_support_smart_global_clean_with_custom_mode': True,
'is_support_smart_scene': True,
'is_support_stuck_zone': True,
'is_support_voice_control_debug': False,
'is_support_water_mode': True,
'is_supported_download_test_voice': True,
'is_supported_drying': True,
'is_supported_valley_electricity': True,
'is_sync_server_name_supported': True,
'is_three_d_mapping_inner_test_supported': False,
'is_tidyup_zones_supported': False,
'is_two_gears_no_collision_supported': True,
'is_two_key_real_time_video_supported': False,
'is_two_key_rtv_in_charging_supported': False,
'is_type_identify_supported': False,
'is_unsave_map_reason_supported': True,
'is_uvc_sterilize_supported': False,
'is_video_monitor_supported': True,
'is_video_patrol_supported': False,
'is_video_setting_supported': True,
'is_voice_control_led_supported': False,
'is_voice_control_supported': False,
'is_wash_then_charge_cmd_supported': True,
'is_water_leak_check_supported': True,
'is_water_slide_mode_supported': True,
'is_water_up_down_drain_supported': True,
'is_wifi_manage_supported': True,
'is_workday_holiday_supported': False,
})
# ---
# name: test_device_features_from_home_data[home_data_device_s5e.json]
dict({
'is_activate_video_charging_and_standby_supported': False,
Expand Down
Loading
Loading