Capability flags (generated)¶
Generated from custom_components/eufy_vacuum/core/capabilities.py (KNOWN_CAPABILITY_HINTS, detect_capabilities), custom_components/eufy_vacuum/adapters/config_schema.py (ADAPTER_CONFIG_SCHEMA['capabilities']) and custom_components/eufy_vacuum/adapters/registry.py (_validate_adapter).
Three namespaces, one vocabulary¶
| Namespace | Enumerated by | Size | Validated at registration | Consumed by |
|---|---|---|---|---|
capabilities config block |
ADAPTER_CONFIG_SCHEMA['capabilities']['fields'] |
21 | yes - the schema walker checks types and rejects unknown keys | custom_components/eufy_vacuum/adapters/registry.py, custom_components/eufy_vacuum/core/manager.py, custom_components/eufy_vacuum/dispatch/manager.py, custom_components/eufy_vacuum/jobs/active_job.py, custom_components/eufy_vacuum/room_entities.py |
capability_hints config block |
KNOWN_CAPABILITY_HINTS (a different file) |
13 | yes - _validate_adapter rejects any key outside that frozenset |
detect_capabilities() |
detect_capabilities() return |
the return dict literal | 42 keys, 22 of them supports_* |
n/a (output, not input) | the per-vacuum capability payload |
The capabilities block is fully enumerated in the schema and is never read by detect_capabilities(). The capability_hints block is the opposite: the schema declares it as a bare dict with no fields, so the schema walker cannot see inside it; _validate_adapter checks it instead, against a frozenset that lives in custom_components/eufy_vacuum/core/capabilities.py. The two share key names and are different dictionaries with different consumers.
Config-declarable vs detected-only¶
| Flag | capabilities block |
hintable | in detection output | hint rule |
|---|---|---|---|---|
has_attribute_rooms |
no | yes | no | permissive |
honors_clean_order |
yes | no | no | - |
position_lock_reliable |
yes | no | no | - |
rooms_unique_per_job |
yes | no | no | - |
supports_active_cleaning_target |
no | no | yes | - |
supports_active_map |
no | no | yes | - |
supports_cleaning_stats |
no | no | yes | - |
supports_custom_room_config |
no | yes | yes | authoritative |
supports_dock_status |
no | no | yes | - |
supports_edge_mopping |
yes | yes | yes | authoritative |
supports_empty_dust |
yes | yes | yes | permissive |
supports_goto |
yes | yes | yes | authoritative |
supports_mop_dry |
yes | yes | yes | permissive |
supports_mop_features |
yes | yes | yes | permissive |
supports_mop_wash |
yes | yes | yes | permissive |
supports_passes |
no | yes | yes | authoritative |
supports_path_control |
yes | yes | yes | permissive |
supports_robot_position |
yes | no | yes | - |
supports_room_clean |
no | yes | yes | authoritative |
supports_room_profiles |
yes | no | no | - |
supports_rooms |
no | no | yes | - |
supports_segments |
no | no | yes | - |
supports_station_water |
yes | no | yes | - |
supports_task_status |
no | no | yes | - |
supports_water_control |
yes | yes | yes | authoritative |
supports_work_mode |
no | no | yes | - |
supports_zone_clean |
yes | yes | yes | authoritative |
supports_zone_repeat |
yes | no | no | - |
zone_max |
yes | no | no | - |
zone_max_area_m2 |
yes | no | no | - |
zone_max_side_m |
yes | no | no | - |
zone_min_area_m2 |
yes | no | no | - |
zone_min_side_m |
yes | no | no | - |
- Detected-only (8) - emitted by
detect_capabilities(), declarable in neither config namespace:supports_active_cleaning_target,supports_active_map,supports_cleaning_stats,supports_dock_status,supports_rooms,supports_segments,supports_task_status,supports_work_mode. - Config-block-only (10) - declarable in the
capabilitiesblock, never emitted by detection and not a valid hint:honors_clean_order,position_lock_reliable,rooms_unique_per_job,supports_room_profiles,supports_zone_repeat,zone_max,zone_max_area_m2,zone_max_side_m,zone_min_area_m2,zone_min_side_m. - In both config namespaces (9):
supports_edge_mopping,supports_empty_dust,supports_goto,supports_mop_dry,supports_mop_features,supports_mop_wash,supports_path_control,supports_water_control,supports_zone_clean. - Hint-only (4) - a valid
capability_hintskey with nocapabilitiesblock counterpart:has_attribute_rooms,supports_custom_room_config,supports_passes,supports_room_clean.
How each detected flag is derived¶
permissive = hint OR entity presence (True from either source is enough). authoritative = _hint_wins: an explicit hint overrides the derived default, so a brand can declare a categorical False. - = no hint is consulted.
| Flag | Hint rule | Derivation |
|---|---|---|
supports_active_cleaning_target |
- | bool(active_cleaning_target_registered or active_cleaning_target_entity) |
supports_active_map |
- | bool(active_map_registered or active_map_entity) |
supports_cleaning_stats |
- | bool(cleaning_area_registered or cleaning_time_registered or cleaning_area_entity or cleaning_time_entity) |
supports_custom_room_config |
authoritative | hint if declared, else True |
supports_dock_status |
- | bool(dock_status_registered or dock_status_entity) |
supports_edge_mopping |
authoritative | hint if declared, else True |
supports_empty_dust |
permissive | bool(_hints.get('supports_empty_dust')) or _empty_dust_entity_present |
supports_goto |
authoritative | hint if declared, else False |
supports_mop_dry |
permissive | bool(_hints.get('supports_mop_dry')) or _dry_mop_entity_present |
supports_mop_features |
permissive | bool(_hints.get('supports_mop_features')) or bool(water_level_registered or water_level_entity) |
supports_mop_wash |
permissive | bool(_hints.get('supports_mop_wash')) or _wash_mop_entity_present |
supports_passes |
authoritative | hint if declared, else True |
supports_path_control |
permissive | bool(_hints.get('supports_path_control')) or _cleaning_intensity_present |
supports_robot_position |
- | bool(robot_position_x_entity_id and robot_position_y_entity_id) |
supports_room_clean |
authoritative | hint if declared, else True |
supports_rooms |
- | bool(active_map_registered or active_map_entity or _has_attribute_rooms) |
supports_segments |
- | supports_rooms |
supports_station_water |
- | bool(water_level_registered or water_level_entity) |
supports_task_status |
- | bool(task_status_registered or task_status_entity) |
supports_water_control |
authoritative | hint if declared, else supports_mop_features |
supports_work_mode |
- | bool(work_mode_registered or work_mode_entity) |
supports_zone_clean |
authoritative | hint if declared, else True |
10 of the 22 supports_* flags consult no hint at all: supports_active_cleaning_target, supports_active_map, supports_cleaning_stats, supports_dock_status, supports_robot_position, supports_rooms, supports_segments, supports_station_water, supports_task_status, supports_work_mode.
supports_* vs *_available¶
Detect and return a capability map for one vacuum.
When adapter inputs are provided, entity probing uses the supplied candidate lists and model-based hints. When absent (no registered adapter), returns a minimal capability set derived from the vacuum entity alone.
"support" flags indicate the entity exists in the registry or the model supports the feature; "available" flags indicate the entity is currently in the state machine and usable now.
| Flag | Value |
|---|---|
active_cleaning_target_available |
bool(active_cleaning_target_entity) |
active_map_available |
bool(active_map_entity) |
cleaning_stats_available |
bool(cleaning_area_entity or cleaning_time_entity) |
dock_status_available |
bool(dock_status_entity) |
robot_position_available |
robot_position_available |
station_water_available |
bool(water_level_entity) |
task_status_available |
bool(task_status_entity) |
work_mode_available |
bool(work_mode_entity) |
What the two shipped adapters declare¶
| Flag | eufy capabilities |
roborock capabilities |
dreame capabilities |
eufy capability_hints |
roborock capability_hints |
dreame capability_hints |
|---|---|---|---|---|---|---|
has_attribute_rooms |
- | - | - | has_attribute_rooms |
- | - |
honors_clean_order |
- | False |
True |
- | - | - |
position_lock_reliable |
False |
False |
- | - | - | - |
rooms_unique_per_job |
True |
False |
- | - | - | - |
supports_custom_room_config |
- | - | - | - | - | - |
supports_edge_mopping |
caps.get('supports_edge_mopping', True) |
False |
False |
- | - | False |
supports_empty_dust |
caps.get('supports_empty_dust', False) |
False |
caps.get('supports_empty_dust', station_collectable) |
model_family in {'x10', 'x8', 'l60', 'l50'} |
- | station_collectable |
supports_goto |
- | - | caps.get('supports_goto', False) |
- | - | profile.get('has_path_control', False) |
supports_mop_dry |
caps.get('supports_mop_dry', False) |
False |
caps.get('supports_mop_dry', station_dryable) |
model_family in {'x10', 'x8'} |
- | station_dryable |
supports_mop_features |
caps.get('supports_mop_features', False) |
caps.get('supports_mop_features', profile['has_mop']) |
caps.get('supports_mop_features', profile['has_mop']) |
model_family in {'x10', 'x8', 'l60', 'l50'} |
- | profile['has_mop'] |
supports_mop_wash |
caps.get('supports_mop_wash', False) |
False |
caps.get('supports_mop_wash', station_washable) |
model_family in {'x10', 'x8'} |
- | station_washable |
supports_passes |
- | - | - | - | - | - |
supports_path_control |
caps.get('supports_path_control', False) |
profile.get('has_path_control', False) |
profile.get('has_path_control', True) |
model_family in {'x10', 'x8'} |
- | profile.get('has_path_control', False) |
supports_robot_position |
caps.get('supports_robot_position', False) |
caps.get('supports_robot_position', False) |
- | - | - | - |
supports_room_clean |
- | - | - | - | - | - |
supports_room_profiles |
- | mop_settable |
- | - | - | - |
supports_station_water |
caps.get('supports_station_water', False) |
False |
- | - | - | - |
supports_water_control |
caps.get('supports_water_control', False) |
mop_settable |
mop_settable |
- | - | - |
supports_zone_clean |
caps.get('supports_zone_clean', True) |
caps.get('supports_zone_clean', True) |
caps.get('supports_zone_clean', False) |
- | - | profile.get('supports_zone_clean', False) |
supports_zone_repeat |
False |
- | - | - | - | - |
zone_max |
10 |
5 |
10 |
- | - | - |
zone_max_area_m2 |
- | 3.05 |
- | - | - | - |
zone_max_side_m |
10.0 |
- | - | - | - | - |
zone_min_area_m2 |
- | 0.0929 |
- | - | - | - |
zone_min_side_m |
0.5 |
- | - | - | - | - |
The hint contract¶
Every flag capability_hints may carry — the ONLY keys this module reads. A hint is a silent no-op if the key is not in this set: _hints.get(name) simply misses and the derived/default value stands. That makes a typo indistinguishable from an undeclared capability, which is the same silent-wrong-answer shape as the hardcoded True that _hint_wins exists to prevent — a brand declaring supports_zone_cleen: False would be ignored exactly as thoroughly as one declaring nothing. registry._validate_adapter checks adapter capability_hints against this set so the typo is caught at registration instead of at "why is this control showing?". Keep in sync with the _hints reads below; the contract test asserts it matches.
Valid hint keys: has_attribute_rooms, supports_custom_room_config, supports_edge_mopping, supports_empty_dust, supports_goto, supports_mop_dry, supports_mop_features, supports_mop_wash, supports_passes, supports_path_control, supports_room_clean, supports_water_control, supports_zone_clean.