Skip to content

v1.11.2-beta1

Pre-release
Pre-release

Choose a tag to compare

@jeppesens jeppesens released this 23 Jun 12:47
8cde21d

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-card still 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_custom builder 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_command path — 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_normalized hit-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: 0 for 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 compatiblezone-clean-card remains 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: new MapData.room_id_at_normalized() hit-test.
  • coordinator.py: room_id_at_normalized()(id, name) with a no-map guard.
  • vacuum.py: room_at_point response service (SupportsResponse.ONLY) + services.yaml.
  • frontend/: zone-clean-card.js (511 lines) replaced by unified eufy-clean-card.js (965 lines).
  • Tests: new test_room_at_point.py (12 tests); test_init.py updated for the card rename. 286 passed.

Full Changelog: v1.11.1...v1.11.2-beta1