Formerly Eufy Vacuum Manager — renamed when Roborock support landed, because it stopped being a Eufy project. Same thread, same repo.
Current release: v2.2.0 · Repo · Docs · Theme gallery
Vacuum Agent adds a control-and-intelligence layer on top of your robot vacuum: room-by-room cleaning, a live map you can actually drive from, a learning/ETA system, saved zones, battery-health tracking, a themeable dashboard in eighteen languages, and automation events.
It works with Eufy, Roborock and Dreame, through an adapter pattern — so more brands can follow.
Every room painted in the material it actually has — wood, tile and grout, carpet, stone — over your robot’s own map, and themed down to the last control.
It doesn’t replace your vacuum integration, it builds on it. You need your brand’s upstream integration installed and working first:
| Brand | Upstream integration you need |
|---|---|
| Eufy | eufy-clean by jeppesens |
| Roborock | Home Assistant’s built-in Roborock integration |
| Dreame | dreame-vacuum by Tasshack |
Vacuum Agent consumes whatever they already expose and adds what the stock integrations don’t.
The map is the centrepiece
Put your robot’s live map on the dashboard and work from it directly:
- Tap a room to queue it.
- Draw a box to clean one spot — no rooms to set up first — and save those boxes as named zones you reuse later.
- Rotate the map to match how your home actually sits, and mask sensor noise with hide-areas.
- Floor textures — paint every room in its real material (wood, tile + grout, carpet, marble, concrete, granite) as one continuous themeable floor. It reads like a floor plan of your house.
- Furnished render — drop in a to-scale drawing of your home, align it once, and watch the robot drive across your actual furniture.
Per-room control that learns
- Select rooms by name and send targeted jobs instead of cleaning the whole floor.
- Build, inspect and reorder a queue before the job starts.
- Per-room suction, water, passes, mode — settings that actually reach the device.
- Learned ETAs — the system watches how long each room really takes and tells you how long a queue will run, with a confidence rating rather than a guess.
- Room rules — block, warn or require confirmation based on conditions you set.
Maintenance, battery and history
- Consumable tracking with per-component intervals you can edit.
- Battery health trended over time, not just today’s percentage.
- Job history, external-job review (runs started from the vendor app), and automation events for all of it.
Make it yours
- A full theme editor — 411 tokens, live preview, and a public gallery you can submit to.
- Eighteen languages, including the maintenance guidance.
- Mascot companions, if you want them.
Not just translated — Hebrew and Arabic mirror the whole layout.
On a phone
It isn’t a desktop layout surviving a small screen. Held upright it reflows to a bottom tab bar with an overflow sheet, and the whole floor plan still fits.
The same map, the same theme, on a phone — not a desktop layout squeezed down. The toolbar reflows above it, and the tab bar is the phone’s own.
Turned sideways it doesn’t just stretch. Scroll, and the status header and tab bar fold away — in landscape they were spending a quarter of the screen on something you weren’t looking at — and groups that stacked go side by side.
Metrics, both ways up. Portrait stacks Room, Profile and Status one under the other; landscape has the width for three columns and takes it — and with the chrome folded away, that’s most of the screen handed back. The map is the one view that stays a portrait job: sideways you have roughly three hundred pixels of height to draw a floor plan in, and no layout fixes that.
Phone widths are part of the automated layout gate on every view, so a change that pushes something off a 390px screen fails the build rather than the user.
Also on Dreame — the map works differently
Eufy’s rooms are inferred from map screenshots and Roborock’s arrive as vendor rooms. Dreame’s arrive as encoded map data on a camera attribute, which Vacuum Agent decodes itself — so you get true per-room areas, furniture and live robot heading rather than an approximation.
Dreame’s map, decoded rather than screenshotted: true per-room areas, furniture and live robot heading.
Maintenance comes from Dreame’s own manuals: 583 model IDs routed to a care profile built from the manufacturer’s published instructions rather than guessed at, translated into all eighteen languages.
Two things worth knowing before you set up:
Set your map up in the Dreame integration first. A Dreame with no saved map yet is the one case that misbehaves during first setup. Run a mapping pass, let it save, then add the vacuum here.
Go-to and zone clean start switched off on any model whose geometry hasn’t been checked against real hardware — a drawn box has to be inverted into the robot’s coordinate frame, and getting that wrong sends the robot to the wrong place. Today that means the L10s Ultra Gen2 has them; every other Dreame gets rooms, map, maintenance and history without those two controls. Open an issue if you’d like yours verified.
Two renderers, one backdrop. dreame-vacuum bakes labels into the camera image; Vacuum Agent draws its own on top. With both on you see room names twice — nothing is broken, it’s two sets of switches that don’t know about each other. Turn off whichever you prefer: dreame-vacuum → Configure → Options → Hidden Map objects, or Vacuum Agent’s Hide room labels toggle.
Also on Roborock
The Roborock adapter brings the stock integration up to parity: the same rendered per-room map, floor textures, tap-to-queue, draggable room labels and draw-a-zone, plus native per-room live rollover and per-room fan speed.
Wash docks surface their two consumables — Dock Cleaning Brush and Dock Strainer. They live on the dock, which Roborock exposes as a second device, so they were previously invisible. Whether a dock can wash, dry or empty is read from the dock itself rather than assumed, and a bare charger produces no rows and no buttons.
Tested hardware
Each brand’s adapter was built and validated against one reference model. Other models of the same brand reuse that adapter and frequently work, but aren’t individually verified.
| Brand | Model | Status |
|---|---|---|
| Eufy | X10 Pro Omni | Tested — Eufy adapter reference |
| Roborock | S6 | Tested — Roborock adapter reference |
| Roborock | Q5 Pro (a72) | Tested by a contributor — mop-unsettable, dockless |
| Dreame | L10s Ultra Gen2 | Tested — Dreame adapter reference |
| any brand | Other models | Untested — may work, not supported |
Eufy owners, one caveat. Everything here depends on the robot building a room map with per-room segments, delivered over Eufy’s MQTT transport. The basic navigation robots (C-series, G-series) never build a room map, so none of this applies — use eufy-clean directly for start/stop and suction. The mapping robots (X-series, S1, L-series, LR-series, Omni C20, AE C10) should work, but only when eufy-clean talks to them over MQTT; on the legacy Tuya path the map and room list are never sent, and the map features go dark even on a robot that can map. Only the X10 Pro Omni is verified — reports welcome.
Installing
- HACS → search Vacuum Agent → install.
- Restart Home Assistant.
- Settings → Devices & Services → Add Integration → Vacuum Agent.
- Pick your
vacuum.*entity from the Vacuum dropdown — the one your upstream integration provides. - A Vacuum Agent item appears in your sidebar. The panel card registers itself; no dashboard editing needed.
Requirements: Home Assistant 2025.6.0+ (developed on 2026.8+), and a working vacuum.* entity from the upstream integration for your brand.
Optional, unlocks extra capability: a map/camera entity from your provider for the live-map backdrop; numpy/Pillow/scipy for automatic map segmentation (bundled in HA OS — without it you set rooms up manually, which is fully supported and takes a few minutes).
Bug reports and model reports both welcome — open an issue with your model and what worked or didn’t. The tested-hardware table grows from exactly that.






