v1.12.0
Eufy Robovac MQTT — v1.12.0
The biggest release since the live map: Eufy's older, non-MQTT vacuums now work. This adds a full Tuya Cloud path for legacy/scalar robovacs that never spoke Eufy's MQTT protocol, an opt-in direct LAN ("local Tuya") transport that replaces 30-second cloud polling with near-instant push, unified "Eufy" app (v2) login for accounts migrated off the old Eufy Clean app, and first-class support for the RoboVac S1 / S1 Pro.
It all lands in #110, which consolidates the community work from #111 (S1 Pro), #122 (unified-app login) and #126 (local Tuya), closes #131, and addresses the "device not found" reports on migrated accounts in #121 / #124. 🎉
New dependency:
tinytuya>=1.18.0,<2.0.0, installed automatically by HACS/Home Assistant on upgrade.
The live map and live X/Y position are MQTT-only. Eufy delivers them over a separate encrypted P2P channel (eufy_mega) that hasn't been reverse-engineered, so they're unavailable on either Tuya transport. Everything else — start/stop/pause/return, fan speed, battery, errors, lifetime stats — works.
✨ Highlights
☁️ Tuya Cloud support for legacy (non-MQTT) vacuums
Older Eufy robovacs that talk to Tuya's cloud instead of Anker's MQTT broker are now discovered and controllable from Home Assistant — previously they simply never appeared. A new Tuya Cloud client logs in alongside the existing Eufy login, discovers any Tuya-backed vacuums on the account, and drives them over a plain-value DPS command/parse path (no protobuf).
- Transport is decided per device at runtime from the Eufy API's
mqttflag — not by model name. MQTT devices keep their full push experience; Tuya-only devices fall onto the cloud path. - What works on the legacy path: start/auto clean, play/resume, pause, stop, return to base, find robot, fan speed, spot clean, room clean and edge clean — plus battery, error code + message, charging state, fan speed and work-mode reporting.
- 30-second polling with backoff. Cloud devices refresh every 30 s; on repeated failures the interval backs off exponentially (capped at 5 min) and the device is marked unavailable after 5 consecutive failures rather than hanging silently.
- Resilient login. EU-first / US-fallback regions, automatic re-login on session expiry (one retry per command), and a clear aggregate error in the log if every login endpoint fails.
Legacy devices get a deliberately reduced entity set — no dock/station controls, consumables, scenes, zone/area cleaning or numeric controls, because those commands have no legacy equivalent. They keep the vacuum entity, Suction Level, Find Robot and the universal sensors. See Upgrade notes.
⚡ Optional local (LAN) push transport — goodbye 30-second lag
For any Tuya-discovered vacuum, you can opt in to a direct LAN socket to the dock (Tuya local protocol, port 6668) instead of cloud polling:
- Near-instant updates — state changes push to HA within seconds, and the connection keeps working even while the Eufy/Tuya cloud is unreachable.
- No key wrangling. The 16-character local key is supplied automatically from your Tuya Cloud login — you never extract or paste it.
- Per-device, opt-in via Configure → enter the dock's LAN address and (if needed) pick the Tuya protocol version. Host/version fields only appear for devices that actually have a local key.
- Graceful fallback. If the socket can't open (wrong host, firewall, dock offline, IP changed), the coordinator silently drops back to 30-second cloud polling — the dashboard never goes unavailable just because the LAN address shifted.
🔒 Security model: the local transport is AES-encrypted with your device's local key — it is not TLS and performs no certificate validation, so it's intended for a trusted LAN only. The local key grants full local control of the dock; treat it as a secret and never paste integration debug logs (which can contain it) into public issues.
tinytuyais deliberately kept out of the manifestloggersfor exactly this reason.
🔑 Unified "Eufy" app (v2) login — now finds devices on migrated accounts
Accounts migrated to the new "Eufy" app could authenticate but came back with "No devices" — including MQTT models like the X10 Pro Omni and X9 Pro (#121 / #124). The cause: AIOT device discovery needs a user_center token, but those accounts only get one from the v2 login — the v1 login authenticates yet returns no user_center, and the old logic stopped at the first token that merely worked.
- Login now tries each credential set (v2 first, then v1) and prefers one whose token actually yields a
user_center, then fetches MQTT credentials from it. - If none does, it keeps a working session as a fallback so the Tuya cloud/local path can still discover the robot via the Eufy
user_idalone — instead of giving up with an empty list. - A rejected
get_user_inforesponse no longer leaves stale state behind for later callers.
If you were hit by #121 / #124 on a migrated account, please confirm on the issue whether your device is discovered now — those reports drove this fix.
🤖 RoboVac S1 / S1 Pro (T2080 / T2080A) — routed correctly (#131)
The S1 Pro (T2080A) is now modelled ("Robovac S1 Pro") alongside the S1 (T2080), and model resolution no longer truncates codes (T2080A ↛ T2080). Beyond just keeping the device, it now lands on the right transport:
- When the AIOT list is empty, the integration reconstructs a placeholder "MQTT" device — and the real Tuya device (carrying its local key) now supersedes that placeholder instead of being dropped as a duplicate. No more S1 Pro "stuck on the MQTT path it can't answer" (the
1 MQTT + 0 cloudsymptom). - A single robot reported under different Eufy/Tuya ids no longer shows up twice (dedupe + a single-robot safety net so two coordinators aren't created for one vacuum).
- Device classification now reads a Tuya status string (
"Running","Charging") as legacy, not scalar — so the S1 Pro uses the legacy parser/commands rather than the scalar (G50) path.
🏷️ Manual room-name overrides (Clean Room on Tuya transports)
The room list and the Clean Room select normally arrive over the same encrypted P2P channel as the map — so on Tuya transports the dropdown is empty. You can now supply your own mapping in Configure → Local-Tuya address & room names → pick the device → the Room names field, one id: name per line: