@Martien_Kop There’s no device in your account.
- Install this app on your Homey.
Add a device.
Login with your Eufy Account. After this I get the message “no new device found”
I’m using the new eufy app. The C28 is only working with the new app. Is that the problem?
@Martien_Kop no that’s not the issue. It just that the API doesn’t report any devices in your account. Are you using your main Eufy account ?
I think so. I’m using the account with which I start my Eufy App from the apple App Store.
@Martien_Kop can you try sharing your Robovac with another account and check if you can login with that one and see the device in Homey?
i made another account. same problem
@Martien_Kop please send a new report
@martijnpoppen
Together with Codex, I fixed scenes for at least my C20 vaccuum cleaners. I can now select the scene names directly in Homey which is much better than the 10 scene guessing work.
I have no idea if this works for the other models aswell but it should work with al MQTT models.
My fork:
A Homey app for Eufy Robovac
Maybe you can use it for the app itself?
In also added local room cleaning support for my Tuya bases L60 model but I doubt you want to add that
@Kyle_Michiels nice! Can you make a PR ? Then I’ll integrate it into the app.
Local support I removed as that’s really limited and new devices don’t support it anymore
Its 2 PRs one for the Eufy SDK:
homey-integration ← misterk99:homey-mqtt-scenes
opened 07:23PM - 12 Apr 26 UTC
## Summary
This PR adds the library-side support needed by the Homey app to con… trol newer Eufy MQTT vacuums using their real saved scene metadata, while preserving the existing slot-based scene behavior for older Homey flows.
It also restores local-key discovery and adds numeric room-clean support for local Tuya-capable mapped vacuums.
## MQTT scene problem and solution
The Homey app previously exposed a static `Scene 1` through `Scene 10` card. That works only if a device interprets those slots the way the old card expects. On newer MQTT devices such as the Omni C20 (`T2280`), saved scenes are exposed by the robot/app as real scene records with large scene IDs and names, for example:
- `1767280292` -> `Deep Clean`
- `1772188900` -> `Deep Clean and Mop`
The old behavior cannot reliably start those saved scenes because it does not know the actual scene IDs. It also used slot-style translation (`slot + 3`) rather than the real MQTT scene ID.
This PR solves that by adding first-class scene metadata support:
- `listScenes()` decodes DPS `180` as `SceneResponse` and returns `{ id, name, mapId }` records.
- `sceneClean(sceneId)` now sends the exact selected scene ID in `START_SCENE_CLEAN`.
- `sceneCleanSlot(slot)` preserves the old slot-based behavior by keeping the `slot + 3` translation for existing `Scene 1..10` flows.
- The shared protobuf encoder now uses `fromObject(...)` before `encodeDelimited(...)`, which is required for enum fields such as `START_SCENE_CLEAN` and `START_SELECT_ROOMS_CLEAN` to encode correctly.
So the new Homey flow can show a live scene autocomplete list for MQTT devices, while old slot-based flows keep working unchanged.
## Local Tuya room cleaning
For local Tuya-capable mapped vacuums, this PR also adds:
- restored local key propagation from discovery
- local connection config for `localKey`, optional `ip`, protocol version, map ID, timeout, and debug flag
- `cleanRooms(roomIds, cleanTimes)` for numeric room cleaning
- protobuf room-clean commands on DPS `152` for novel/mapped local devices
This allows the Homey app to offer a numeric `Clean room` action for local-key devices without requiring room-name discovery.
## Notes
The Homey app PR should depend on this library change so it can call `listScenes()`, `sceneClean(sceneId)`, `sceneCleanSlot(slot)`, and `cleanRooms(roomIds, cleanTimes)`.
And one for the actual homey app:
main ← misterk99:mqtt-scenes-local-room-clean
opened 07:24PM - 12 Apr 26 UTC
## Summary
This PR adds two Homey Flow capabilities for newer and mapped Eufy v… acuums:
- MQTT devices: a new `Start saved scene` action that uses the robot's live saved-scene names instead of static scene slots.
- Local Tuya devices: a new `Clean room` action that accepts a numeric room ID and repeat count.
The existing generic clean/pause/dock behavior is left intact, and the existing `Start Scene` / `Scene 1..10` card is preserved for backwards compatibility.
This PR currently pins `eufy-clean` to the companion fork commit that implements the required library APIs. Companion library PR: https://github.com/martijnpoppen/eufy-clean/pull/10
## How the MQTT scene problem was solved
The existing Homey app already had a scene card, but it is a static slot-based card:
- `Scene 1`
- `Scene 2`
- ...
- `Scene 10`
That is not enough for newer MQTT devices such as the Eufy Omni C20 (`T2280`). These devices expose saved scenes as real scene records in the MQTT/novel API. A saved scene has its own large scene ID and a human-readable name, for example:
- `1767280292` -> `Deep Clean`
- `1772188900` -> `Deep Clean and Mop`
The previous flow could not reliably run these user-created scenes because it did not know the actual scene IDs. It could only send a static slot-style value, and the library implementation translated slot scenes using `slot + 3`.
The solution is split into two layers:
1. Library support in `eufy-clean`
The companion `eufy-clean` PR adds:
- `listScenes()`, which decodes DPS `180` as `SceneResponse` and returns `{ id, name, mapId }`.
- `sceneClean(sceneId)`, which sends `START_SCENE_CLEAN` with the exact scene ID selected by the user.
- `sceneCleanSlot(slot)`, which keeps the old `slot + 3` behavior for the legacy `Scene 1..10` Homey card.
- a protobuf encoding fix that switches message creation to `fromObject(...)` before `encodeDelimited(...)`, so enum commands like `START_SCENE_CLEAN` and `START_SELECT_ROOMS_CLEAN` encode correctly.
2. Homey Flow support in this app
This PR adds a new `Start saved scene` card for MQTT-capable devices. The card uses Homey's autocomplete argument to call `device.getSceneAutocompleteItems(...)`, which fetches the scene list from the device at runtime via `listScenes()`.
When the user selects a scene, the run listener calls `sceneClean(scene.id)`, so the command uses the real scene ID rather than a static slot.
The old `Start Scene` card remains unchanged and still calls `sceneCleanSlot(...)`, so existing flows that use `Scene 1..10` are not broken.
## Local room cleaning
This PR also adds a local-only numeric room-clean action for Tuya/local-key devices.
The pairing/repair logic now keeps the real `localKey` when the library can discover one, and the app stores local settings needed by mapped vacuums:
- map ID, default `1`
- protocol version, default `3.3`
- optional last known LAN IP
- find timeout
The new `Clean room` card is exposed only for local-key devices and calls `cleanRooms([roomId], cleanTimes)` in the library. The card intentionally accepts numeric room IDs so users can use trial and error without requiring Android logcat room-name extraction.
## Capability gating
The new cards are gated by transport:
- MQTT devices get `action_scene_named` / `Start saved scene`.
- Local-key non-MQTT devices get `action_room_clean` / `Clean room`.
- Devices without a real local key do not expose the local room-clean action.
The app also avoids storing public/WAN IPs as local Tuya IPs, so a cloud-reported address does not poison the local connection path.
## Validation
Validated locally with:
```bash
homey app validate -p .
```
Manual smoke testing done during development:
- MQTT C20 devices exposed live saved scenes such as `Deep Clean` and `Deep Clean and Mop`.
- L60-style local Tuya device discovery returned a real local key.
- Local room-clean commands were tested with numeric room IDs in the companion CLI/protocol work before porting the payload into `eufy-clean`.
## Notes for review
This PR intentionally keeps the old `Start Scene` card and adds a separate `Start saved scene` card because Homey static dropdown cards cannot be populated dynamically from the device. Runtime scene names require an autocomplete argument.
1 Like
@Kyle_Michiels thanks will check !
1 Like