Releases: kingchddg901/Vacuum_Agent
Release list
v1.10.0 — Map switching, post-switch safety gate & the flight recorder
Added
Switch maps from Vacuum Agent. If your vacuum stores more than one map (upstairs / downstairs), the map picker now lives in the panel header — and in the eufy-clean card — so you can change the loaded map without leaving for the Eufy app.
Post-switch safety gate on the map. After you switch maps the robot keeps reporting its position in the old map's coordinates until it moves and re-localizes, so a zone drawn in that window would have been cleaned in the wrong place. Drawing and map taps are now blocked, with an explanation, until the robot re-localizes — it clears itself as soon as the vacuum moves. If you know better, acknowledge_map_frame overrides it.
Debug flight recorder. A switch and a target select that silently capture DEBUG-level detail for a chosen integration into a ring buffer, then dump it on demand — so a bug that only shows up once can be captured without leaving debug logging on permanently.
Better room guesses on a brand-new map. When a run is picked up that Vacuum Agent didn't start, it has to work out which room was cleaned. On a fresh or re-mapped map nothing has been learned yet, so it now falls back to each room's size as drawn on the map — a 4 m² run matches the 3.9 m² kitchen, not the 9.7 m² bedroom. Learned times still win once they exist.
Fixed
"Configure Rooms" re-opens when the active map has no rooms set up. Switching to (or creating) a map with no configured rooms left setup showing complete while the map was unusable.
Diagnostics no longer claim a device works when it can't import rooms (#44). The self-check reported "maps, rooms and the live map all work" whenever the active_map entity merely existed — even when it reported unavailable and no rooms were visible, so models whose vacuum integration doesn't deliver map data yet (Eufy C20 / C10 / E20) were told everything was fine and then hit a hard failure. It now reads the entity's actual state, says plainly that there's no map to import, and warns with the entity and value.
Full changelog: v1.9.0...v1.10.0
v1.9.0 — Zone steps, zone learning & the live queue
Zones become first-class — sequenced, learnable steps
A saved zone used to be a one-off box you drew and sent. Now it's a real part of a run.
✨ Added
- Zone steps — drop a saved zone into a cleaning run as a step (the + Zone chip), right alongside charge and wait stops. Vacuum the kitchen → clean the stove zone → mop runs as one job. Ad-hoc, or saved into a run profile. Eufy + Roborock.
- Zone learning — the integration learns each saved zone's time as a wall-clock total, so a small mop zone's dock-prep and pad-wash count toward its estimate. Gets more accurate every run; estimates from the zone's size until then.
- The live queue — the running job as one collapsible chip row: every room plus each charge, wait, and zone stop, marked done / current / upcoming as it goes.
- Zone automation recipes — fire a saved zone from an automation (
clean_saved_zone/clean_saved_zones), and put "charge first / off-peak / delayed" where they belong: in your automation's conditions, not inside the job.
🐛 Fixed
- Re-queuing rooms mid-run no longer corrupts the finished run's record — a job records exactly what it cleaned, even while you line up the next one.
- A rooms-then-zone run no longer loses its room learning.
- A saved rooms-plus-zone profile fired from an automation no longer silently drops the zone.
- The "Cleaning zone" banner clears when the zone finishes instead of lingering through mop drying.
- The queue is locked during a run so an accidental toggle can't disturb it.
📖 Docs
- New Zones user-guide page (draw → save → sequence → learn), plus reconciled queue / live-monitoring / learning / automation references and the developer docs.
Full changelog: https://github.com/kingchddg901/Vacuum_Agent/blob/master/CHANGELOG.md
This release includes backend changes — restart Home Assistant and hard-refresh the dashboard (Ctrl+Shift+R) after updating.
v1.8.0 — Room attribution (both brands) + smarter review card
Room attribution comes to both brands, the review card gets smarter about where a run came from, and areas are finally unit-correct.
Added
- Room attribution for app-started and dispatched runs, on both Eufy and Roborock. The integration recovers which rooms a run actually cleaned from the live room signal (Roborock's native current-room, Eufy's decoded-map pose) plus the swept-area counter. An external (app-started) clean opens the review wizard pre-answered instead of blank; a dispatched clean whose vacuum deviated from the planned order gets its per-room identity corrected. Validated live across simultaneous multi-room runs on both robots.
- Review card — Origin filter. Filter run history by External (app-started) vs Dispatched (started by this integration).
- Review card — "Room Mismatch" badge. On a dispatched run where the live room signal disagreed with the assigned room, the run is flagged for review — the assignment is kept, never silently overridden.
- Review card — custom exclude reason. A "Custom…" chip reveals a free-text field alongside the presets.
- Review card — Area Cleaned + External badge. External runs now show the floor area cleaned (single and multi-room) and read as "External".
- Learning-processing toggle. Collect run data always, process on demand — with a "Process pending runs" action and a pending-count display.
- Diagnostics — cleaning_area unit report. Each vacuum shows its detected
cleaning_areaunit and normalized m² value.
Fixed
cleaning_areais normalized to square meters by the sensor's own unit. On an imperial Home Assistant, Eufy's area sensor reports square feet while Roborock's reports square meters; the value was read as m² regardless, inflating Eufy areas ~10.76×. Now converted live by each sensor'sunit_of_measurement.- Roborock
cleaning_time(bare minutes) was stored as seconds — 60× too low; now unit-converted. - Stranded dispatched runs recover. A run interrupted by power loss / a mid-run restart / a firmware hang is finalized as
interruptedinto the review flow instead of vanishing or corrupting a later run's record. - Extreme unexplained-idle runs are held from learning (restorable) so they can't skew baselines.
- Swept-area attribution handles a non-monotonic
cleaning_area— a mid-run sensor reset is re-baselined, not double-counted. - External runs are no longer mislabeled "Sanity Failed" in the review list.
Changed
- Removed the learned room-boundary (vacuum-coordinate) subsystem. Room tracking now runs entirely off the device's native current-room signal and the live map — the drift-prone coordinate-based boundary machinery is gone.
Docs
- 30 documentation files reconciled with the above (mapping-shelve deletions + the new features);
docs/advanced/07-map-bounds-review.mdretired to a stub; testing counts refreshed (2,488 test functions / 150 files / 95.2% coverage). The retired trace→bounds design is preserved verbatim indocs/dev/11-mapping-system.md§3 as a disaster-recovery reference.
🤖 Release notes assembled with Claude Code
v1.7.3 — Scalar-mode room-clean fix
v1.7.3 — Scalar-mode room-clean fix
Fix — room cleaning on Tuya/scalar Eufy devices
Eufy vacuums served over robovac_mqtt's Tuya/scalar transport expose no active_map
sensor, so Vacuum Agent anchors them to a single implicit map id "main". On a room
clean, that id was going out on the wire, where robovac_mqtt does int(map_id) and
rejected it — invalid literal for int() with base 10: 'main', surfaced as
"Failed to start cleaning".
The Eufy room-clean payload now omits a non-numeric map id from the wire, so the
provider falls back to its own single-map default. Room cleaning (per-room, passes,
edge mopping) now works on scalar/attribute-mode devices — e.g. the X10 Pro Omni on
the Tuya path. Numeric-map (MQTT/novel) devices are unaffected.
Thanks to @ptruman for the report and diagnostics.
Backend only; the card bundle is unchanged from 1.7.2 (hard-refresh not required).
v1.7.2 — Theme coverage complete (for now)
A theming-completeness pass: every color the theme system should reach now resolves through a token — enforced by a build guard so it can't drift back.
Theming
- Full token coverage. Swept the last hardcoded color literals out of the panel CSS and the standalone cards — map zone/highlight fills that ignored a re-themed accent, card hovers, text-on-accent, a mobile scrim, and more — routing each through the existing
--evcc-*tokens with the original literal kept as fallback (so appearance is unchanged, and it follows a custom theme). 98.9% of color declarations now resolve through a theme token — 100% of the colors that should be themed. The remaining 1.1% are deliberately theme-independent (legibility whites that must read over any room color, amix-blend-modemarker, aprefers-color-scheme: lightblock) — each explicitly marked with a reason. - Theme-lint guard.
check-styles.mjsnow fails the build — locally and in CI — on any un-tokenized color in the panel CSS or the cards. Deliberate exceptions carry a/* theme-lint-ignore */with a rationale. - Coverage tracked. The generated token CSS-usage trace now stamps the coverage % on every regen, so the number moves with the code instead of going stale.
No new tokens (still 406 across 25 groups) — this raised coverage, not palette size.
Frontend-only — a browser hard-refresh (Ctrl+Shift+R) picks it up; no Home Assistant restart. Builds on the profile card from v1.7.1.
v1.7.1 — Profile card
A point release that gives run profiles the dashboard surface they should've had at launch — no new capability, just a new place to use the existing one.
New
- Profile card (
custom:vacuum-agent-profile-card) — a drop-in Lovelace card for one saved run profile. Shows its name, room metadata, a read-only Runs As step manifest (⏱ waits, cleans with each group's mode, ⚡ charge-to-% stops), and a Run button. Inspect-and-run only — configure it with a visual vacuum → map → profile picker (no YAML). Its step manifest is the same renderer the full panel uses, so the two surfaces can't drift.
Fixes & polish
- Profile card now adopts the
--evcc-*theme tokens (matching the room + dashboard cards' shape and accent) and carries the per-user language globe — it had been styled off raw HA tokens and was missing the globe.
Docs
- User guide + dev references now document the card; the README gains translation hero shots — the room and profile cards rendered across all seven shipped languages.
Frontend-only — a browser hard-refresh (Ctrl+Shift+R) picks it up; no Home Assistant restart needed. Built on the charge/wait step model from v1.7.0.
v1.7.0 — Native charge & wait steps
The headline: a run profile can now carry an ordered sequence with stops, not just a flat room queue.
✨ Charge & wait steps
- Charge to X% — a "dock and charge to a target %" step between room groups. Vacuum the whole floor, top up to 80%, then mop — all as one learned job. (Closes #41.)
- Wait X min — a timed dock-and-hold, e.g. a mop-dry pause between a vacuum and a mop pass.
- Per-group settings — the same room can be vacuumed in one group and mopped in a later one.
- Multiple charges per run, and a live "N% to go" countdown while charging (no fabricated pre-run estimate — charge time depends on how low the battery is when it docks).
- Build it in the run-profile editor (Add a charge step / Add a wait / Add current rooms as a group), or via the
set_run_profile_stepsservice.
🧹 Roborock
- Charge & wait steps work on Roborock too; a stepped run holds strict order so groups clean exactly as laid out.
- Settable mop is now per-model — the S6's mop stays observe-only, but S7/S8-class models expose the cleaning-mode + water controls and can vacuum-then-mop per group. (Unverified on S7/S8 hardware — best-effort; a rejected mop command degrades safely.)
🐛 Fixes
- Profile buttons exposed to Home Assistant now actually start cleaning. (Closes #42.)
- New/unlearned rooms no longer trip a spurious "may be stuck" warning. (Closes #40.)
- Omni E28 (T2352) inherits the x10 dock capabilities.
🌍 Localization
- Everything new is translated across all 7 locales (de/es/fr/it/nl/pt/ru).
Hardened by a multi-agent adversarial review pass before shipping.
v1.6.7
Completes the cleaning-tray reclassification from 1.6.6 — it now shows only under Maintenance.
Fixed
- The cleaning tray now appears only under Maintenance, not Replacements. The 1.6.6 change didn't take effect because the Eufy adapter rebuilds each maintenance component from a fixed set of keys and silently dropped the new
maintenance_onlyflag before the card saw it. The flag now survives the adapter config build, covered by a regression test that exercises the real path. (The 1.6.6 fix for the phantom "Warning" was unaffected and remains in place.)
Install or update via HACS. Full changelog: https://github.com/kingchddg901/Vacuum_Agent/blob/master/CHANGELOG.md
v1.6.6
Fixes a phantom "Warning" on freshly-reset cleaning trays, names the Eufy Omni E28, and adds dock-control detection to diagnostics.
Fixed
- A freshly-reset "Cleaning Tray" no longer shows a permanent "Warning" (#38). Replacement-item status was judged on absolute remaining hours, so a part whose entire service life sat under the warning line — like the 30-hour cleaning tray — could never read "good," even at 100%. Status is now based on percentage of total service life. Thanks @fhteagle for the report and diagnostics.
Changed
- The cleaning tray is now a Maintenance item, not a Replacement item — it's a cleanable, not a service-life wear part.
Added
- Eufy Omni E28 (T2352) is now recognized by name instead of showing its raw model code.
- Diagnostics now report dock-control entities (mop wash / dry / dust empty), resolved independently of capability detection, so it's clear which dock actions a device physically exposes.
Install or update via HACS. Full changelog: https://github.com/kingchddg901/Vacuum_Agent/blob/master/CHANGELOG.md
v1.6.5 — theme editor search focus fix
A focus fix for the theme editor.
Fixed
- Theme editor's per-group token search no longer loses focus or gets stuck. Typing in a group's search box and narrowing it to zero matches used to drop focus (letting stray keys trigger Home Assistant's global shortcuts, e.g. opening Assist) and left the group empty with no way to clear the search short of a reload. The search box now stays put while you type — backspace to bring the tokens back — and a "no match" hint shows too.
Install or update via HACS. Full changelog: https://github.com/kingchddg901/Vacuum_Agent/blob/master/CHANGELOG.md