v1.11.2
Eufy Robovac MQTT — v1.11.2
Per-room cleaning — pick rooms (or tap them straight on the live map), give each its own suction, water, mode, intensity, passes and edge-mop, and send them all in one go. The zone-clean card from v1.11.1 grows up into a single unified Eufy Clean card with Rooms | Zones modes. All in #139 by @kingchddg901. 🎉
Requires the live map camera added in v1.11.0 — tap-a-room selection hit-tests against the rendered map, so the map must have been received at least once (run a clean or dock first). Room picking from a list works without a map.
Builds on the zone cleaning shipped in v1.11.1-beta1 —zone-clean-cardstill works as a backward-compatible alias that opens straight into Zones mode.
✨ Highlights
🧹 Per-room cleaning with per-room settings
Clean a chosen set of rooms in one command, and hand each room its own settings rather than one blanket profile for the whole run. The card holds the per-room choices itself — no helper entities to create — and dispatches them through the existing room_clean path via vacuum.send_command:
action: vacuum.send_command
target:
entity_id: vacuum.eufy_omni_c28
data:
command: room_clean
params:
rooms:
- id: 3 # Living room
fan_speed: turbo
water_level: high
clean_mode: vacuum_mop
clean_intensity: deep
clean_times: 2 # passes
edge_mopping: true
- id: 5 # Kitchen — vacuum only, single pass
fan_speed: max
clean_mode: vacuum- Every per-room field is optional; anything you omit falls back to the robot's current defaults.
- Field values are the exact keys the integration's
set_room_custombuilder accepts (vacuum/mop/vacuum_mop,fast/standard/deep, etc.). - The plain
room_ids: [...]form from before still works unchanged for "just clean these rooms." - Rides the existing
send_commandpath — no new dependencies, no proto recompile.
🖱️ Tap a room on the live map (new room_at_point response service)
Selecting rooms by ID is fiddly, so the card now lets you tap a room directly on the rendered map. A tap resolves to a room server-side via a new response service:
action: vacuum.room_at_point
target:
entity_id: vacuum.eufy_omni_c28
data:
x: 0.42 # fraction (0–1) of the map image, from the left edge
y: 0.61 # fraction (0–1) of the map image, from the top edge
response_variable: hit
# -> { room_id: 3, room_name: "Living room" } (room_id 0 = no room there)- Backed by a new
MapData.room_id_at_normalizedhit-test — the exact inverse of the map renderer's room-mask lookup (with the matching Y-flip and outline-origin offset), so taps land on the same room you see drawn. - Guards against a missing map and returns
room_id: 0for empty space outside any room.
🃏 One unified eufy-clean-card (Rooms | Zones)
The bundled card from v1.11.1 is now a single Eufy Clean card with a mode toggle:
- Rooms mode — pick rooms by tapping them on the live map or from a list, set each room's suction / water / mode / intensity / passes / edge-mop inline, then hit Clean. Per-room setting choices are remembered across selections.
- Zones mode — the rubber-band rectangle drawing from v1.11.1, unchanged.
- No camera? Rooms-only. Without a map camera the card drops the map and toggle and works as a list-based room picker; the map overlay stays interactive in both modes when a map exists.
- Backward compatible —
zone-clean-cardremains as an alias that opens in Zones mode, so existing dashboards keep working.
type: custom:eufy-clean-card
vacuum: vacuum.eufy_omni_c28
camera: camera.eufy_omni_c28_map
# mode: rooms # optional initial mode: rooms | zones🛠️ Internal & dev
api/map_stream.py: newMapData.room_id_at_normalized()hit-test.coordinator.py:room_id_at_normalized()→(id, name)with a no-map guard.vacuum.py:room_at_pointresponse service (SupportsResponse.ONLY) +services.yaml.frontend/:zone-clean-card.js(511 lines) replaced by unifiedeufy-clean-card.js(965 lines).- Tests: new
test_room_at_point.py(12 tests);test_init.pyupdated for the card rename. 286 passed.
Full Changelog: v1.11.1...v1.11.2