Dreame Scheduler — clean when you're out, room-by-room, and actually know what happened

Dreame Scheduler — clean when you’re out, room-by-room, and actually know what happened

Issues I was having is the vacuum ran while everyone was home, it skipped rooms with no explanation, and when it got stuck the whole run was left half done.

It doesn’t talk to the robot directly - it drives the entities the excellent Tasshack dreame_vacuum integration already exposes. So it works with any Dreame model and needs no rooting.

What it does:

  • Cleans when you’re out - gates on your presence entities with a grace delay, and if someone comes home mid clean it docks and resumes once the house is empty again.
  • Per-room weekly schedule - each room on its own weekdays, with its own mode / suction / mop wetness.
  • Weekly whole-house guarantee - finishes whatever’s still pending on your catch-up day.
  • Weekly report - What got done and what didn’t, with the robot’s own coverage renders and obstacle flags.
    Self-healing - if it gets stuck on the same spot, it walls off the area, backs out and continues
  • Optional add-on GUI — set it all up without YAML, plus a beta Floor Plan Studio (no-go/virtual walls, 3D view, export). this is a work in progress!

Install: HACS > custom repositories > add the repo > Download > add the integration.
(It’s submitted to the default HACS store too - search will work once that PR merges.)

Screenshots

(floor plan details are blurred - yours won’t be)

Overview - robot status, next run, this week’s progress, suggestions and coverage.

Report - per room status this week, why rooms were missed, and the robot’s own coverage renders.

Floor Plan Studio (beta) - no-go / no-mop zones, virtual walls, auto-fit, 3D view, export.

Install

Requirements: Home Assistant 2025.12+ and the dreame_vacuum integration already set up with your vacuum.

1. Integration (via HACS):

  • HACS > ⋮ > Custom repositories > add https://github.com/botts7/dreame-scheduler, category Integration > Download.

  • Restart Home Assistant, then Settings > Devices & Services > Add Integration > Dreame Scheduler and pick your vacuum.

It’s already submitted to the default HACS store (PR in review). Once that merges you’ll be able to skip the custom-repository step and just search Dreame Scheduler in HACS — I’ll update this post when it lands.

2. Add-on (optional GUI): Settings > Add-ons > Add-on Store > Repositories > add https://github.com/botts7/dreame-scheduler-addon, then install Dreame Scheduler.

Links

A note

It’s early in development (v0.1.x) - core scheduling/presence/reporting are working and verified live, and I’m hardening the run to completion edge cases.
If you give it a go and have issues let me know or create a github issue.

2 Likes

Trying it out now. Is it possible to have another schedule for mopping? My own made system that I have been using, I had it do a queue that had two sliders, one for sweeping and one for mopping. The mopping one was based on the sweeping setting. So if I had 1 on sweeping and 2 on mopping it would sweep once a day but do a mop after sweep each second day.

Is it possible to do something like this with your system?

Dreame Scheduler v0.2.0 is out :tada:


@DatRandomBoi — yes, and you inspired the feature

…sweep once a day but do a mop after sweep each second day. Is it possible to do something like this?

It is now. v0.2.0 adds a per-room “Mop every N sweeps” setting:

  • Set a room to a mopping mode and N = 2 → it sweeps every scheduled day and does a mop-after-sweep every 2nd day — exactly your two-slider setup.
  • N = 1 = mop every clean (off), N = 3 = every third day, etc.
  • It counts once per calendar day, so a resume or a manual “clean now” on the same day won’t double-mop or throw the cadence off.

Set it under Settings → Devices & Services → Dreame Scheduler → Configure → (pick a room) → “Mop every N sweeps.” You’re credited in the release notes — thanks for the idea!


Big feature + reliability release

What else is new in 0.2.0

:adhesive_bandage: Self-healing recovery — when the robot gets into trouble mid-clean it now tries to fix itself instead of stranding:

  • reverses out of a wedge and carries on, re-routing around the spot;
  • detects a genuine beaching (wheels off the floor) and asks for a hand instead of grinding through pointless retries;
  • treats an obstruction as a moment, not a wall — it just resumes and re-plans;
  • puts the robot’s own photo of the obstacle in the alert;
  • silent-stuck / stranded watchdogs catch a robot that quietly stopped or never made it back to the dock.

:brain: Recurring-trap learner — learns where it repeatedly gets stuck across separate runs, tells fixed hazards apart from path blocks, and suggests a permanent no-go zone for one-tap approval (never walls off floor on its own).

:spiral_calendar: Smarter scheduling

  • Rooms scheduled on several weekdays now clean on each of them (a fix — they were silently collapsing to once a week).
  • Mop every N sweeps (above).
  • Door-retry (opt-in): a room skipped for a shut door is retried the same day once its door’s been open long enough to be sure the room’s free — away-only, or while-home if you trust the timer.

:clipboard: Clean-by-hand list — rooms the robot genuinely can’t reach become a Home Assistant to-do list, and clear themselves when next cleaned.

Plus a batch of reliability fixes and add-on GUI updates — full details in the changelog.


Get it / upgrade

Thanks

Shaped by community suggestions — @DatRandomBoi for the mop cadence, and dreacon34 (Reddit) for the sensor-driven room-availability + retry-instead-of-skip ideas that led to door-retry and the adaptive-scheduling roadmap.

Feedback and bug reports very welcome!

v0.2.1 is out :broom: - mostly about staying out of the robot’s way and being clearer when it genuinely needs you.

  • Honors your native per-room settings now (default on). A room you’ve set to sweep only in the Dreame app stays sweep-only - no more force-mopping the whole house. (Fixes a real one I hit: wet pads dragged onto a sweep-only carpet, stalling the wheel motor.) Can be turned off if you liked the old behaviour.
  • Clearer stuck alerts - wheel/hardware faults say “check the wheels” instead of uselessly reversing; “beached” only when the drop sensor really fired; and a “:white_check_mark: all clear” if it frees itself and docks.
  • New “can’t get home” watchdog - catches a robot that’s moving but getting nowhere (circling, repositioning, blocked while returning) by tracking real progress, so a slow-but-genuine clean isn’t mistaken for a stall. Works for manual runs too.

Update through HACS as usual. Cheers

A few releases on - v0.3.0 is out :broom:

Since the last update the focus has been knowing what your robot’s actually doing - and staying out of its way.

  • Maintenance alerts (new in 0.3.0). It now watches the wear-part life the robot already tracks -filter, brushes, mop pad, sensors, detergent, silver-ion - and pings you once when any drops below a threshold (default 10%). The alert has a Reset counter button (tap it after you’ve swapped the part and it resets the robot’s own counter) and Dismiss. No more finding out the filter was shot three cleans ago.
  • Real error codes in alerts. When something goes wrong you now get the robot’s actual error (e.g. right_wheel_speed), not a vague “something went wrong” - and the alert names the room. This literally caught a real one for me: a week of mystery wheel errors turned out to be blind cords winding into the wheel.
  • Reliability fixes (0.2.1→0.3.0): honors your per-room settings from the Dreame app, a “can’t get home” watchdog for a robot that’s moving but going nowhere, tangle-aware recovery (one gentle reverse then “please free me” instead of dragging a cable around), and a fix for a return-to-dock loop during mop-pad washing.

Can I set “mop every N cleans” to never? Two of my rooms have rugs that occupy all of the space the vacuum can get to and I don’t really want it to waste time and drag a mop over them at all… Also, would it be possible to set a room to be cleaned more than once a day via this scheduler? I can set the additional cleanings up via a different method, but I really like the kitchen floor to get a couple of quick vacuum passes a day without mopping.

thanks!

I’m really loving this integration and it solved my major problem of wanting the vacuum to recharge while paused and then be able to resume from where it was before the pause. Thank you!

I’m also trying to install the add on, but I can’t do it. The instructions seem to be outdated. I went to apps, and there is no place for me to add a repository. I went to HACS, and HACS refuses to add the repository with the error message that either

<Template botts7/dreame-scheduler-addon> Repository structure for v0.3.4 is not compliant

or

The repository does not seem to be a integration, but an add-on repository. HACS does not manage add-ons.

Is there a work around for this? Or should I just create my own dashboard? Either way, thank you again!

Hi @Touch-of-Ink, glad the pause and resume side is already helping.

That error is expected: the add-on is not installed through HACS. HACS only handles the integration (the scheduling engine). Add-ons install through the Add-on Store instead. So it is two installs:

  1. Integration via HACS:
  • In HACS, search for Dreame Scheduler and install it. It is in the default HACS store now, so no custom repository is needed.
  • Restart Home Assistant, then Settings, Devices and Services, Add Integration, Dreame Scheduler, and pick your vacuum.
  1. Add-on via the Add-on Store:

Both pieces work together: the integration is the engine that runs the schedule, and the add-on is the panel where you set it up (rooms, days, times, presence) and see the report. Install the integration first, then the add-on, and do your setup from the add-on’s sidebar panel. I have tidied the README so this is clearer, since it still mentioned the old custom-repository step.

Hi @tomofdarkness, both of these are in now.

  1. Never mop a room: each room has a mop cadence setting (“mop every N sweeps”), and one of the options is “Never (sweep only)”, meant for all-rug rooms. Set that on your two rug rooms and the robot will only ever vacuum them, no mop dragged over the rugs.

  2. Clean a room more than once a day: each room has an “Extra times” list. Add a time, and tick “vacuum only” on it for a sweep-only pass. So you can give the kitchen a couple of extra vacuum-only passes a day on top of its normal clean.

Both landed in the 0.5 releases, so if you installed a while back, update in HACS to pick them up. You can set both from the add-on’s Rooms tab, or from the integration’s per-room Configure step if you are not running the add-on.

Thanks for the suggestion on these.

Any issues let me know?

1 Like

Is it just me, or does it not handle multifloor plans very well? I have a schedule set for my first floor, but when I changed to the second floor it seemed to get confused about what rooms were vacuumed f. ex.

Thanks for the report, and it is a real one, not just you.

The fix is to make the scheduler map-aware: track cleaned state, history and per-room settings separately per map, and read the active map from the selected map entity so each floor keeps its own schedule.

A few things I found while digging that shape how it should behave, so I want to check your setup:

  • Switching the selected map ends any active clean, and it only works if the multi_floor_map switch is on. Do you have that enabled?
  • Is the robot set to auto-detect the floor (intelligent recognition), or do you switch maps manually?
  • How many floors/maps, roughly how many rooms each, and is it one robot carried between floors?
  • When it got confused, was the robot physically on floor 2 with map 2 selected, and the scheduler still thought those rooms were done?

For now the reliable workaround is to keep the scheduler pointed at one floor and run the other manually, since the state is shared across maps today. The map-aware fix is going on the list.

Once I know the above, I’ll try get this working and then I will let you know when I have something to test.

Ah, I’m using 2026.9.3 and the Add on Store doesn’t exist anymore.

Addon Store now called the Apps - Same process, different name

I have 2 different dreame vacuums in a 2 story house. I want to run 1 on the ground floor and one on the 2de floor. Is this supported?

I tried apps first, since I knew that’s what it had changed to, but I didn’t have three dots, which is why I then tried HACS. Tried again just now, and discovered you have to click on the “install app” in the lower right hand corner, which takes you to a new page, which has the three dots :slight_smile:

  1. Install the Dreame Scheduler integration (HACS) and add your vacuum.
  2. In Home Assistant: Settings → Apps → Install app button → ⋮ → Repositories, add https://github.com/botts7/dreame-scheduler-addon.
  3. Install Dreame Scheduler, start it, and open it from the sidebar.

Works great! Thank you again, so much!

1 Like

I have 0.5.3 and I don’t actually see either of these settings still…

Hello, and thanks for the reply (and the development, of course).

To try to answer your questions:

Is this a setting in Dreame scheduler? If so, I can not find it, but if you let me know how to enable the setting, I can try again.

If you mean in the Dreame Vacuum app, then yes, it is enabled. (I’m using an X40 Ultra btw.)

I switch maps manually. Usually through the select.x40_ultra_selected_map entity in Home assistant, exposed through the Dreame Vacuum integration.

I then carry the robot to the second floor, and start it. It then identifies where it is, and starts the cleaning routine.

Floors/maps: 2
Rooms, Lower/main floor: 8 real, one “skipped”/ignored (area added due to mirror causing confusion)
Rooms, Upper floor: 6

One robot.

If I remember correctly, it was on floor 2 and still marked rooms on floor 1 as done. However it was some time ago, so if needed for debugging purposes I can probably perform another test.

Good to know, thanks.

Great, I’ll happily help in testing (at least until I reflash the bot with Valetudo..).

While I’m at it - would it be possible to add some sort of granularity to the “Notification if the robot gets stuck”? My problem is that when the robot has finished cleaning the upper floor, it will return to it’s starting position (i.e. not the dock, as that is on the lower floor), and after a short while I will get a notification that the robot is away from it’s docking station.. However in this case of course it is as expected and not something out of the ordinary, so I would prefer to not get a notification, and only be notified if the robot gets stuck during cleaning. Not sure how that option could work then though, but thought I’d bring it up anyways.

I’ve just pushed it up to date (0.6.1).

Update the Dreame Scheduler add-on (Settings, Add-ons, it should show an update), then open the Rooms tab and click the gear on a room’s row to expand it. That’s where “Mop cadence” lives (set it to the “Never” option for an all-rug room) and “Extra times” (add a time and tick “vacuum only” to give a room an extra sweep-only pass through the day).

If you don’t run the add-on, the same two settings are in the integration’s own Configure, inside the per-room steps.

When you switch to floor 2 the scheduler was carrying floor 1’s completed state across, because the underlying dreame_vacuum integration shares one set of room entities across maps and reuses room ids per floor.

I’ve reworked it to track each map separately and follow the robot’s selected map, so each floor keeps its own schedule and its own cleaned and pending state. It’s out now in 0.6.1, marked beta since I’ve only been able to trial it on a single-map box here. If you update and give it a go let me know how it holds up switching between your two floors.

On the away from dock notification: good catch, and you’re right that it’s related. The watchdog assumes a run ends back on the dock. I’ve logged it and will make it hold that alert once a run has finished and the robot is simply parked, rather than actively failing to get home mid-clean.

1 Like


Do I need to uninstall and reinstall to get that? I see that the description text at the top mentions it, but the options still aren’t there when expanded…

thanks!