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