Summary
Dock type 21 — the dock shipped with the Roborock QV 35A (roborock.vacuum.a168) — is missing from RoborockDockTypeCode. Because it's unknown, RoborockDockTypeCode(21) falls back to unknown, is_wash_n_fill_dock() returns False, and the wash_towel_mode trait is skipped at setup. Downstream (Home Assistant) this makes the dock clean-water-tank, dirty-water-tank, and strainer entities permanently unavailable, even though the device reports all of the underlying data.
Environment
python-roborock 5.22.0 (as bundled with Home Assistant 2026.7.1). Confirmed the gap is still present on main / v5.26.0.
- Device: Roborock QV 35A, model
roborock.vacuum.a168, firmware 02.36.38.
- Dock: wash + fill + dry (auto-empty, mop wash, air-dry, clean-water refill).
Root cause (traced end to end)
GET_STATUS reports dock_type: 21 (raw, from the local channel). The tank/strainer data is all present: dss: 169 (encodes clean/dirty water box status) and strainer_work_times arrives in GET_CONSUMABLE.
RoborockDockTypeCode in roborock/data/v1/v1_code_mappings.py has no member for 21 (it jumps saros_10_dock = 18 → qrevo_s5v_dock = 22 → saros_20_dock = 27), so RoborockDockTypeCode(21) resolves to unknown via RoborockEnum._missing_.
WashTowelModeTrait.requires_dock_type = is_wash_n_fill_dock; is_wash_n_fill_dock(unknown) is False, so trait setup logs Trait 'wash_towel_mode' not supported, skipping and leaves PropertiesApi.wash_towel_mode = None.
- In Home Assistant, the
clean_box_empty, dirty_box_full, and strainer_time_left entity descriptions are all gated on support_fn=lambda api: api.wash_towel_mode is not None, so they are filtered out and never created — surfacing as unavailable in HA.
Debug-log excerpt (setup):
Trait 'wash_towel_mode' not supported, skipping
Raw status (trimmed):
{'state': 23, 'dock_type': 21, 'dss': 169, 'wash_phase': 12, 'wash_ready': 1,
'wash_status': 514, 'dry_status': 0, ...}
Proposed fix
Add dock type 21 as a wash-n-fill dock — the same two-line change as #829 (which added the Qrevo S5V, 22):
roborock/data/v1/v1_code_mappings.py: add qv_35a_dock = 21 to RoborockDockTypeCode.
roborock/device_features.py: add RoborockDockTypeCode.qv_35a_dock to WASH_N_FILL_DOCK_TYPES.
(Clean-fluid delivery is not supported on this dock — is_clean_fluid_delivery_supported = False — so the clean_fluid_empty entity correctly stays absent; only the clean/dirty water box and strainer entities are restored.)
Happy to open a PR mirroring #829, including the parametrized-test additions.
Summary
Dock type
21— the dock shipped with the Roborock QV 35A (roborock.vacuum.a168) — is missing fromRoborockDockTypeCode. Because it's unknown,RoborockDockTypeCode(21)falls back tounknown,is_wash_n_fill_dock()returnsFalse, and thewash_towel_modetrait is skipped at setup. Downstream (Home Assistant) this makes the dock clean-water-tank, dirty-water-tank, and strainer entities permanentlyunavailable, even though the device reports all of the underlying data.Environment
python-roborock5.22.0 (as bundled with Home Assistant 2026.7.1). Confirmed the gap is still present onmain/ v5.26.0.roborock.vacuum.a168, firmware02.36.38.Root cause (traced end to end)
GET_STATUSreportsdock_type: 21(raw, from the local channel). The tank/strainer data is all present:dss: 169(encodes clean/dirty water box status) andstrainer_work_timesarrives inGET_CONSUMABLE.RoborockDockTypeCodeinroborock/data/v1/v1_code_mappings.pyhas no member for21(it jumpssaros_10_dock = 18→qrevo_s5v_dock = 22→saros_20_dock = 27), soRoborockDockTypeCode(21)resolves tounknownviaRoborockEnum._missing_.WashTowelModeTrait.requires_dock_type = is_wash_n_fill_dock;is_wash_n_fill_dock(unknown)isFalse, so trait setup logsTrait 'wash_towel_mode' not supported, skippingand leavesPropertiesApi.wash_towel_mode = None.clean_box_empty,dirty_box_full, andstrainer_time_leftentity descriptions are all gated onsupport_fn=lambda api: api.wash_towel_mode is not None, so they are filtered out and never created — surfacing asunavailablein HA.Debug-log excerpt (setup):
Raw status (trimmed):
Proposed fix
Add dock type
21as a wash-n-fill dock — the same two-line change as #829 (which added the Qrevo S5V,22):roborock/data/v1/v1_code_mappings.py: addqv_35a_dock = 21toRoborockDockTypeCode.roborock/device_features.py: addRoborockDockTypeCode.qv_35a_docktoWASH_N_FILL_DOCK_TYPES.(Clean-fluid delivery is not supported on this dock —
is_clean_fluid_delivery_supported = False— so theclean_fluid_emptyentity correctly stays absent; only the clean/dirty water box and strainer entities are restored.)Happy to open a PR mirroring #829, including the parametrized-test additions.