Ultimate Tapo RV50/RV30/RV20 Max integration — native room cleaning via HA's own vacuum dialog and more

I was using epg-pers’s Tapo RV30 integration — solid, local-only, no cloud — but I wanted more than it had, so I forked it and (built with Claude Code) added:

  • Native room cleaning — Home Assistant 2026.3 added a “map vacuum segments to areas” dialog to the standard vacuum more-info card plus a vacuum.clean_area action. This fork implements that contract directly: map your rooms to HA areas right in the UI, then clean them with the normal action. No YAML, no custom service calls. (The original custom tapo_rv30.clean_rooms service is still there too, for automations.)
  • Mop pad attached binary sensor — useful for an automation that reminds you to wash the pad after a mop clean.
  • Fixed resume-after-pause — in the original, hitting resume after pausing silently did nothing (the device ignores a repeated start command while it’s already mid-clean). Now it actually resumes.
  • Clean progress as a proper % sensor, not just a vacuum attribute with no unit — drop it straight into a Tile card.
  • Diacritic-insensitive room/map name matching for the custom service, and the map image now refreshes every 60s while actively cleaning instead of only every 5 minutes.

Confirmed working on my RV30 Max.

:warning: Requires HA 2026.3+ — that’s what the native area-mapping feature needs, so the whole integration’s minimum version is bumped rather than trying to support older cores too. (That is why I don’t know if I should make a PR to origin)

Repo: GitHub - jan-tdy/TapoVac-ADV: Local Home Assistant integration for Tapo RV30 Max (and maybe more) robot vacuum (TPAP/SPAKE2+ protocol) · GitHub
Install: HACS → Integrations → ⋮ → Custom repositories → add as Integration

All credit to epg-pers for reverse-engineering the TPAP/SPAKE2+ protocol and room-cleaning payload in the first place — this fork just builds on that. Feedback and issues welcome, especially from anyone on an RV20 or a different firmware.

2 Likes

Update (sorry, again…) — v1.8.0 released

Another round of updates to the fork(all confirmed working):

What is new?
  • tapo_rv30.run_schedule — actually launch a saved schedule on demand now, not just view it. There’s still no device call to trigger a schedule by ID directly, so this reads the schedule’s settings via get_schedule_rules and replays them through the same calls room cleaning uses.
  • Cleaning-preset schedules — turns out some schedules aren’t built from a plain room list but reference a saved “cleaning preset” in the Tapo app instead (clean_mode: 5 + custom_rule_id, confirmed against real device data). run_schedule now handles that case correctly instead of silently falling back to a whole-house clean.
  • Multi-floor native room cleaning — the “map vacuum segments to areas” dialog now covers every saved map, not just whichever one happens to be active, so multiple floors show up as separate groups when mapping rooms to HA areas. (If you already set up area mapping before this, you’ll need to redo it once — segment IDs changed format.)
  • Proper integration icon — HA 2026.3 lets custom integrations ship their own local brand icon instead of needing a PR to home-assistant/brands (which stopped accepting those for custom integrations anyway), so it now shows up properly on the Integrations page instead of a generic placeholder.

Update - v1.10.0b2 released
It’s a beta, but it does not break anything that worked!

What is new?

How to install(copied from Google - it’s working like that):

Steps to Install a Beta Version

  • Open HACS in your Home Assistant sidebar.
  • Navigate to the specific integration, plugin, or frontend repository you want to update.
  • Click the three-dot (kabob) menu in the upper right corner of the repository page.
  • Select Redownload.
  • Choose Need a different version?
  • Select Release, then choose the specific beta or pre-release version from the list. [1]

What is new(copied from GitHub):

What’s Changed

  • Fix insecure session cache: drop pickle, move off shared temp dir by @jan-tdy in #19
  • Signal how overdue consumable sensors are past their limit by @jan-tdy in #21
  • Vectorize map rendering: bulk colour lookup + single-pass centroids by @jan-tdy in #22
  • Document that furniture isn’t rendered on the map, with an overlay workaround by @jan-tdy in #24
  • Clarify TP-Link account credentials; document CLI env vars by @jan-tdy in #25
  • Add a Current Room sensor, inferred locally from vac_coor + room geometry by @jan-tdy in #26

Update - v1.11.2 released!

  1. Add experimental Omni dock support (auto-empty, mop wash/dry, hair re… by @jan-tdy in #32
  2. Mark Plus/Omni dock support as confirmed, bump to 1.11.2 by @jan-tdy in #33

Also, I have created an card for it! GitHub - jan-tdy/VacuumCard-ADV: An Home Assistant card for the TapoVac-ADV integration · GitHub

Update - integration v1.13.0 released!
What is new?

  • Fix clean_rooms/run_schedule targeting the wrong vacuum with multiple entries
  • Expose per-room map geometry for click-to-room frontend cards

Please consider starring my repo if it is useful to you, thanks :heart: !

Update - card v2.10 released!
What is new?

  • Fix calibration preview rendering, add 90° corner snap and furniture color
  • Furniture placement on the map + highlighted/numbered room selection
  • Fix furniture/room SVG rendering + keyboard-accessible furniture fields
  • Fix dropdowns for real with ha-form selectors, add furniture opacity control
  • Fix furniture opacity ceiling

BIG UPDATE - V2.0.0

What is new?

New entities (reverse-engineered against a real RV30):

- number.volume — speaker/voice-prompt volume, read/write

- number.refresh_interval — status poll cadence, now adjustable at runtime instead of a fixed 30s

- switch.child_lock — read/write

- select.area_unit — m²/ft², read/write

- sensor.carpet_clean_preference — read-only for now (no confirmed full option set beyond “boost”)

- binary_sensor.do_not_disturb — with start/end time attributes

Also: getMapData’s furniture_list turned out to be readable locally after all (earlier docs said furniture was cloud-only) — the map camera entity now exposes it as room_geometry.furniture, in the same pixel space as room_geometry.rooms. The companion VacuumCard-ADV card’s editor can now click a detected outline to place a furniture item there instead of dragging it into position by hand.

Goodbye bugs :bug: :beetle: :lady_beetle: :cricket:, v2.1.0, v2.1.1, and v2.1.2 destroyed you all (not you, but the bugs)!

Now, it should finally be stable…
And if you find more bugs, report ASAP!

If it does not work all of a sudden, follow the steps on: [Bug]: RV50 Pro Omni cannot connect · Issue #47 · jan-tdy/TapoVac-ADV · GitHub

Don’t know what happened, but today the official TP-Link integration discovered the RV30 Max, and it works (still no map or room cleaning there, though).

Strange things are now going on with Tapo and Home Assistant; something starts working, and other things stop…

EDIT: It was caused by my new custom integration changing the pyhton-kasa liblary to a fork that supports TPAP.