---
title: Movie Mode Means the Robot Vacuum Waits
description: "Keeping a robot vacuum quiet during a movie took three layers: block the start, dock it if running, replay the skipped cleans. Every veto needs a re-arm."
image: https://willcurran.com/hubfs/will-curran-brand/movie-mode-vacuum-featured.png
---

[Skip to content](https://willcurran.com/blog/movie-mode-vacuum#main)

[Will Curran](https://willcurran.com/)

[Home](https://willcurran.com/) [Portfolio](https://willcurran.com/portfolio) [Press](https://willcurran.com/media) [Blog](https://willcurran.com/blog) [Favorites](https://willcurran.com/favorites) [Speaking](https://willcurran.com/speaking) [Consulting](https://willcurran.com/consult) 

[Hire Will](https://willcurran.com/hire)

[Writing](https://willcurran.com/blog) Home & house — Movie Mode Means the Robot Vacuum Waits [Subscribe](https://willcurran.com/blog/subscribe)

Home & house

# Movie Mode Means the Robot Vacuum Waits

I wanted the robot vacuum to stay put whenever movie mode is on, and doing it properly meant blocking the start, sending it home if it was already running, and replaying the skipped cleans afterward. The lesson came from live events: a cancelled cue has to be fired again later, ...

![](https://willcurran.com/hs-fs/hubfs/will-curran-brand/will-curran-avatar.jpg?width=44&height=44&name=will-curran-avatar.jpg)

Will Curran Oct 18, 2026 · 6 min read

<https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fwillcurran.com%2Fblog%2Fmovie-mode-vacuum>

On this page

![An abstract dark scene: a glowing screen showing rolling credits, a small round robot vacuum outline sitting in its dock below it, and a pause-and-queue icon beside them, next to the title The vacuum waits for the credits.](https://willcurran.com/hs-fs/hubfs/will-curran-brand/movie-mode-vacuum-featured.png?width=1600&height=900&name=movie-mode-vacuum-featured.png)

The request was one sentence: "when movie mode is enabled, the robot vacuum must not run." I built it and tested it the same day, during a real movie. Doing it properly took three layers, not one: block the start, send the robot home if it is already running, and replay whatever got skipped once the movie ends. On build day the robot also started cleaning mid-movie, and I still can't tell you who started it.

## A cancelled cue has to be fired again later

I came up in live events, and every show runs on cues. If a cue is held because the stage isn't ready, someone has to fire it when the stage is ready. Otherwise the show just loses it.

Home automation has the same trap. A cleaning job runs because something triggered it. If a condition says "not now" at that moment, the trigger has passed, and nothing ever comes back to retry it. Blocking the vacuum is easy. Blocking it without losing the clean is the job, and that means every veto needs a matching re-arm.

![State diagram. From Docked, a job fires and hits a Movie on? check: no leads to Cleaning or Paused, yes leads to Queued. If Movie Mode comes on while the robot is cleaning or paused, it goes to Returning and back to Docked, a path marked designed, not yet seen live, with a dashed 5 minute backstop loop. Once Movie Mode has been off 2 minutes and the robot is docked, the queue can replay one job, oldest first, with a dashed 15 minute backstop loop. If the job's own rules pass, the robot cleans; if not, the job is dropped and logged.](https://willcurran.com/hs-fs/hubfs/will-curran-brand/movie-mode-vacuum-movie-state.png?width=1440&height=1176&name=movie-mode-vacuum-movie-state.png)

## Layer one: block the start, and write it down

The movie check is now the first action in every cleaning job in Home Assistant. If Movie Mode is on, the job writes its own ID to a queue, logs that it was held, and stops.

I put the veto in the actions rather than the conditions on purpose. A failed condition looks the same as a job that was never triggered. An action that queues and stops shows up in the automation's trace, so the skipped clean is recorded, not silently lost.

Asking the voice assistant to start the vacuum during a movie gets a spoken refusal instead. Nothing is queued in that case.

I tested this layer during a real movie by triggering one of the real cleaning jobs by hand. It was vetoed and queued, and the robot stayed docked. A second trigger for the same job didn't create a duplicate entry.

## Layer two: if it is already running, send it home

Blocking the start only covers cleans that Home Assistant itself begins. The robot can also be started from the vendor's app, from the button on the robot, or by resuming after a stuck alert. So the second layer watches the robot, not the jobs. It is designed to fire when Movie Mode turns on, when the robot starts cleaning or pauses, and on a five-minute backstop in case either of those edges is missed.

The judgment call was what to do with a paused robot. A paused robot vacuum is parked mid-floor, a trip hazard in a dark room. So paused counts as running, and I chose dock over pause.

If the clean that is being docked came from a Home Assistant job that fired within five minutes of the clean starting, that job goes back on the queue. A run started outside Home Assistant is docked but not replayed, because there is no job to replay.

To be honest: this layer is switched on but hasn't fired live yet. That is how it is designed to behave, not something I have watched it do.

## Layer three: replay what was skipped

Once Movie Mode has been off for two minutes, the replay can start. It runs one queued job at a time, oldest first, and waits until the robot has been docked for ten minutes before starting the next one. A 15-minute backstop covers a missed edge.

Two details matter:

- **The job comes off the queue before it runs.** Otherwise a failing job would be picked up again by the backstop every 15 minutes, forever.
- **The job runs with its own conditions enforced.** If its normal rules say no at replay time, it is dropped and logged, not forced.

I proved the replay live with a temporary self-test job that went through the queue without the robot actually cleaning, then deleted the test automation afterwards.

## The clean nobody started

On build day the robot started cleaning mid-movie. It was sent home from the app 38 seconds later.

Every schedule in the vendor's app was off. The logbook showed no Home Assistant automation, script or voice event behind it. The vacuum's state is polled, so when it changes from docked to cleaning, nothing records who asked. "No context" in the log doesn't prove Home Assistant didn't start it. It only proves the log can't say.

The remaining suspects include the button on the robot and a manual call through Home Assistant. I never found out. The dock-if-running layer is designed to send it home within seconds next time, whoever starts it, but until it fires for real that is a design, not a result.

## Where I was the bottleneck

The tempting version of "must not run" is a single rule: add a condition and move on. It passes every test you would run during the movie, and it quietly loses every clean the movie covered. The re-arm is what made this a three-part build.

## If you are about to try this

- **Put the veto where you can see it.** A failed condition leaves almost no trace. An action that queues and stops does.
- **For every veto, write the re-arm in the same sitting.** If the block ships before the replay, every clean in between is lost.
- **Dequeue before you run.** A job that fails while still on the queue becomes a loop.
- **A quiet log is not proof.** Check which sources are attributed before deciding what didn't happen.

## Build it yourself

What it does: keeps a robot vacuum from running while a "movie mode" flag is on, sends it home if it starts anyway, and replays the skipped cleans afterward. The parts:

- **Home Assistant** with an integration for your robot vacuum. Mine is a Roborock, but the pattern doesn't depend on the brand.
- **A Movie Mode toggle helper**, set however you already set scenes.
- **A queue**: a small helper holding job IDs.
- **Three automations:** the veto as the first action of each cleaning job, a dock-if-running guard, and a replay.

How the pieces fit: jobs check the flag and queue themselves, the guard docks a running or paused robot, and the replay pops one job at a time once the flag stays off.

Give this to your AIHelp me build a "movie mode" guard for a robot vacuum in Home Assistant. Use a toggle helper for Movie Mode and a helper holding a queue of automation IDs. In every cleaning automation, make the first action a check: if Movie Mode is on, append this automation's ID to the queue (no duplicates), log it, and stop. Put this in the actions, not the conditions, so it shows in the trace. Add a second automation, triggered when Movie Mode turns on, when the vacuum starts cleaning or pauses, and every five minutes: if Movie Mode is on and the vacuum is cleaning or paused, dock it, and re-queue the originating automation if one started the clean. Add a third, triggered when Movie Mode has been off for two minutes plus a periodic backstop: remove the oldest ID first, then trigger that automation with its conditions enforced, and wait for the vacuum to sit docked before the next. Voice requests during a movie should get a spoken no, not a queue entry.

If you have a veto somewhere in your own setup that never gets a second chance, I would like to hear about it.

NoteWritten October 2026, about work from October 2026.

Filed under [Home & house](https://willcurran.com/blog/tag/home-house)

![](https://willcurran.com/hs-fs/hubfs/will-curran-brand/will-curran-avatar.jpg?width=64&height=64&name=will-curran-avatar.jpg)

Will Curran

I spent sixteen years building one company, and I have been in the event industry since 2007. These days I write about the technology I actually use — trucks, radios, home infrastructure, and the tools that survive past the first invoice.

[All posts by Will →](https://willcurran.com/blog/author/will-curran)

Get the next one by email

One email per post. No digest, no sponsors.

[← Previous Trivia Over LoRa: a game show on a slow, lossy radio mesh](https://willcurran.com/blog/trivia-over-lora) [Next → Walk the Room: What Live Events Taught Me About Checks That Lie](https://willcurran.com/blog/walk-the-room)

[Will Curran](https://willcurran.com/)

[LinkedIn — 29,339+ followers](https://www.linkedin.com/in/willcurran) [GitHub](https://github.com/rancur) [YouTube](https://www.youtube.com/channel/UCJgscc27l4fpkWx1SeK05xg/) [Spotify](https://open.spotify.com/user/rancur) [SoundCloud DJ mixes](https://www.soundcloud.com/thewillsee) [Twitch](https://www.twitch.tv/thewillsee) [Last.fm](https://www.last.fm/user/default) [Trakt — movies & TV](https://trakt.tv/users/willcurran) [Goodreads](https://www.goodreads.com/user/show/55302838-will-curran) [Will See Music](https://www.thewillsee.com) [Arizona Meshtastic](https://azmsh.net) [Electric Forest Meshtastic](https://efmesh.com)

© 2026 Will Curran — All rights reserved. [RSS](https://willcurran.com/blog/rss.xml) [Back to top](https://willcurran.com/blog/movie-mode-vacuum#main)

```json
{
  "@context" : "https://schema.org",
  "@type" : "BlogPosting",
  "author" : {
    "@type" : "Person",
    "name" : "Will Curran",
    "url" : "https://willcurran.com/blog/author/will-curran"
  },
  "dateModified" : "2026-10-21T23:14:27.683Z",
  "datePublished" : "2026-10-18T16:00:00.000Z",
  "headline" : "Movie Mode Means the Robot Vacuum Waits",
  "image" : [ "https://willcurran.com/hubfs/will-curran-brand/movie-mode-vacuum-featured.png" ],
  "mainEntityOfPage" : {
    "@id" : "https://willcurran.com/blog/movie-mode-vacuum",
    "@type" : "WebPage"
  },
  "publisher" : {
    "@type" : "Organization",
    "logo" : {
      "@type" : "ImageObject",
      "url" : "https://willcurran.com/hubfs/image-1.png"
    },
    "name" : "Will Curran LLC"
  }
}
```