Use an away check, a time window and a daily record

To run a Home Assistant vacuum when nobody is home, combine three checks: all selected people are away, the time is suitable, and this automation has not already attempted a start today. Add an obvious permission switch so a visitor or a pet does not get overlooked.

Use this with a robot that already works in Home Assistant. An integration is its connection to Home Assistant; its entity, such as vacuum.downstairs, is the named control your automation uses. Confirm that exact connection can start cleaning, report its state and return to the dock. These are separate capabilities in the vacuum documentation.

Start with the notification rehearsal below. It checks the household rules without moving the robot. Once those rules behave correctly, replace the notification with the supported start action. Leave an unreliable presence setup on manual control; fix a person stuck home or away before relying on it.

Research method: researched from current Home Assistant documentation on October 9, 2026. This is an original configuration walkthrough, not a tested Tara household or robot review. The cover is an AI-generated illustration of a room prepared for cleaning.

1. Check the robot and the people first

  1. Confirm the controls while you are home. With the floor clear and the manufacturer’s safety instructions followed, check Start and Return to base separately. Observe the reported cleaning, returning and docked states. A successful action call alone does not prove the robot moved or docked.
  2. Choose one schedule owner. Disable duplicate cleaning schedules in the vendor app if Home Assistant will own this routine. Otherwise the robot can start independently of the conditions below.
  3. Check every regular resident. Under Settings → People, confirm each person has the intended tracker. Watch real departures and arrivals before enabling unattended cleaning. A named place such as Work also counts as away in this example.
  4. Prepare the floor and household. Clear cords, liquids and pet accidents; follow the robot’s guidance for stairs and restricted areas. Keep cleaning disabled when untracked people or pets make it unsuitable.

Person states come from device trackers, not a physical head count. A phone left at home can block cleaning; a stale “away” state can incorrectly allow it. Rejecting unknown and unavailable helps, but does not detect every stale reading. The Person documentation explains how multiple trackers affect the result.

A robot can also set off an armed motion alarm, as the Roborock integration warns. Keep unattended cleaning disabled until your security arrangement is compatible; do not disable alarm protection just to make this routine run.

Home Assistant scheduling does not remove a vacuum’s cloud requirements. For the connection decision, use the existing robot vacuum local-control comparison.

2. Create three helpers

A helper is a small setting or calculated value stored by Home Assistant. Open Settings → Devices & services → Helpers → Create helper. Use the names below, then confirm the entity IDs in each helper’s settings; adjust the examples if yours differ.

  1. Create a Toggle named Vacuum away cleaning allowed: input_boolean.vacuum_away_cleaning_allowed. Leave it off initially and put it on your dashboard. It is household permission, not a sensor.
  2. Create Date and/or time named Vacuum last auto attempt, selecting date only: input_datetime.vacuum_last_auto_attempt. Set its value to yesterday using its date picker, so the first rehearsal is eligible.
  3. Create Template → Binary sensor named Vacuum house empty: binary_sensor.vacuum_house_empty. Paste the following into its state template, replacing Alex and Sam with your actual person IDs. Leave optional device class and delays unset.
{{ has_value('person.alex')
   and has_value('person.sam')
   and not is_state('person.alex', 'home')
   and not is_state('person.sam', 'home') }}

For another resident, add both a has_value check and a “not home” check, joined with and. For one resident, remove both Sam checks. Do not leave out a regular occupant just because their tracking is inconvenient.

The binary sensor is a yes/no result: on means every listed person has a known state outside home; off means that is not established. The Template helper recalculates from the referenced entities, and state-template functions distinguish missing values from usable ones.

The date helper restores its saved value after a normal restart when no YAML initial value forces a reset. There is no midnight reset automation to miss. This is a household convenience record, not crash-proof transaction storage; after restoring an older backup, check it before re-enabling cleaning.

3. Add the notification rehearsal

Go to Settings → Automations & scenes → Create automation → Create new automation, then use the menu’s Edit in YAML option. Paste this as one automation, without an outer automation: line. It uses ordinary state and time checks; menu wording can vary by release.

The automation checks every five minutes. It allows a start from 10:00 until before 16:00, using Home Assistant’s configured local time, after the empty-house helper has stayed on for ten minutes. The robot must report docked. The window restricts starting; it does not end an ongoing clean at 16:00. These are example household settings, not recommended cleaning times for every home.

Notification-only automation
alias: Vacuum - one daytime away attempt
mode: single
triggers:
  - trigger: time_pattern
    minutes: "/5"
conditions:
  - condition: state
    entity_id: input_boolean.vacuum_away_cleaning_allowed
    state: "on"
  - condition: state
    entity_id: binary_sensor.vacuum_house_empty
    state: "on"
    for: "00:10:00"
  - condition: time
    after: "10:00:00"
    before: "16:00:00"
  - condition: state
    entity_id: vacuum.downstairs
    state: "docked"
  - condition: template
    value_template: >-
      {{ has_value('input_datetime.vacuum_last_auto_attempt')
         and states('input_datetime.vacuum_last_auto_attempt')
             != now().strftime('%Y-%m-%d') }}
actions:
  - action: input_datetime.set_datetime
    target:
      entity_id: input_datetime.vacuum_last_auto_attempt
    data:
      date: "{{ now().strftime('%Y-%m-%d') }}"
  - action: persistent_notification.create
    data:
      title: "Vacuum rehearsal"
      message: "The away-cleaning checks passed. No robot was started."
      notification_id: vacuum_away_rehearsal

The date is written before the final action. This deliberately allows at most one automatic attempt per day, including a failed command. It does not measure cleaning completion. If the date helper is missing or unavailable, the example refuses to start.

A periodic check also handles someone leaving before 10:00, or Home Assistant being off at the start of the window. After restart, allow a fresh ten-minute empty-house check; the automation does not reconstruct unseen departures. It waits for an eligible check instead of replaying a missed start event. See the official state-duration condition and time-pattern trigger.

A worked morning: Alex leaves first, Sam leaves last

This is an illustrative timeline, not a measured robot test. Assume the helper states update at the times shown, permission is on, the date is yesterday and the robot is docked.

On a small screen, swipe the table sideways.

Time and eventDecisionReason
09:10: Alex leaves; Sam is homeNo startNot everyone is away.
09:52: Sam leavesWaitThe ten-minute empty period begins.
10:00: scheduled checkNo startOnly eight minutes empty.
10:05: next checkRecord today; show rehearsal noticeAll conditions pass. No robot moves in this version.
12:00: both return, then leave againNo second startToday’s attempt is already recorded.
Next day, a guest stays behindPermission must be offThe two phone trackers cannot detect that guest.

Verify the conditions without moving anything

  1. Keep the notification version installed. With permission off, wait for a five-minute check: there should be no rehearsal notice and no date change.
  2. Turn permission on while a tracked resident is home. The empty-house condition should still block it.
  3. During a real suitable departure, wait for ten minutes away and the next five-minute check inside the window. Open Home Assistant: expect a Vacuum rehearsal notification and today’s saved date. The vacuum should remain docked.
  4. Wait for another check. Expect no new attempt. Open the automation’s Traces to see which condition stopped it; the date check should now fail.

This uses a persistent notification inside Home Assistant, not a phone push notification. Do not use Run actions to verify the guards: it skips triggers and conditions. Once a physical action is installed, that button can start the robot while someone is home.

4. Enable cleaning after the rehearsal passes

Turn permission off while editing. Replace the whole actions: section with the following. Keep every trigger and condition above it. The date is still recorded before the robot command.

actions:
  - action: input_datetime.set_datetime
    target:
      entity_id: input_datetime.vacuum_last_auto_attempt
    data:
      date: "{{ now().strftime('%Y-%m-%d') }}"
  - action: vacuum.start
    target:
      entity_id: vacuum.downstairs

Start cleaning can start or resume a job; it does not guarantee a new mapped whole-home run on every model. Confirm your robot’s behavior before using it unattended. Room selection, mop modes and special saved routines need their own supported actions.

The rehearsal already used today’s attempt. The simplest next step is to leave the date alone and enable permission for the next suitable day. For an intentional same-day retry, inspect the robot first, turn permission off, set the date to yesterday, then re-enable permission only when the floor and household are ready.

Turn permission off for holidays if you do not want a daily attempt in an empty home. In the start automation alone, switching permission off prevents future starts; it does not stop a clean already underway.

5. Choose what should happen when someone comes home

If cleaning must be away-only, add the rule below. It requests a return to base when the robot reports cleaning and either the empty-house check or permission is no longer on. It also checks once a minute, which can recover a missed change after a restart. Actual response still depends on presence updates, integration updates and the robot.

This rule applies to any cleaning job on this entity, including a manual or vendor-app start. It has no way to prove which controller started that job. If you want manual cleaning while people are home, leave this rule disabled and use Return to base yourself, or build a separately tracked session policy. Disabling only the start automation does not disable this rule.

Optional away-only return rule
alias: Vacuum - enforce away-only cleaning
mode: single
triggers:
  - trigger: state
    entity_id: binary_sensor.vacuum_house_empty
    to: "off"
  - trigger: state
    entity_id: input_boolean.vacuum_away_cleaning_allowed
    to: "off"
  - trigger: state
    entity_id: vacuum.downstairs
    to: "cleaning"
  - trigger: time_pattern
    minutes: "/1"
conditions:
  - condition: state
    entity_id: vacuum.downstairs
    state: "cleaning"
  - condition: template
    value_template: >-
      {{ not is_state('binary_sensor.vacuum_house_empty', 'on')
         or not is_state('input_boolean.vacuum_away_cleaning_allowed', 'on') }}
actions:
  - action: vacuum.return_to_base
    target:
      entity_id: vacuum.downstairs

For a harmless first check, temporarily replace its vacuum.return_to_base action with a persistent notification. During a supervised, safe clean with someone home, expect a notice when the next check sees the policy violation. Restore the dock action only after confirming the behavior you want. With the real return rule enabled, permission off requests docking while the robot is cleaning.

Return to base requests travel to the dock; it is not an immediate stop or proof of arrival. The example does not act on a robot reporting paused, error or unavailable. Use its normal physical controls if immediate intervention is needed. This is a comfort routine, not a person- or pet-safety system.

If the behavior is wrong, check the first failed condition

What happensCheckNext step
Everyone leaves but nothing happensTrace, person states, permission, date and docked stateA Work zone is allowed; an unknown person blocks the example. Do not bypass the whole condition list.
It only works with Run actionsA trigger or condition is failingRead the real timed trace. Manual action execution does not validate the household rules.
Today’s date changed but no clean happenedFinal action, robot status and integration errorThe attempt is consumed. Inspect the failure before deliberately allowing a retry.
It cleans while a guest is homePermission switch and independent vendor schedulesPause the routine for untracked occupants; phone absence is not proof of an empty house.
Manual cleaning immediately heads homeThe optional away-only ruleThat is its stated policy. Disable that rule for supervised home cleaning.
It remains out after a return requestReported state, path to dock and connectivityA command is not a completed dock. Check the robot; do not repeatedly reset or re-pair it.

For recurring missing contact, add an unavailable-device notification separately. If the family prefers approving each clean, use a Yes/No phone confirmation instead of assuming away always means ready.

Tara’s practical recommendation is to begin with a visible permission switch and the daily attempt record. Add room selection or more elaborate schedules only after the basic behavior is predictable. The home automation kit’s coordinated routines apply the same idea across devices: clear ownership and an understandable household pause.

Frequently asked questions

Can I just use zone.home equal to zero?

That count is useful for tracked people. It does not establish that guests, children without trackers or pets are out. The example checks each selected resident for a usable state and adds a household permission switch.

Will this work without internet?

The automation runs on Home Assistant, but phone location updates and vacuum commands retain their existing network requirements. A cloud integration does not become local because Home Assistant starts it.

Does one start per day mean the floor was cleaned?

No. The saved date records an attempted start, including the notification rehearsal. A failed command, stuck robot or interrupted run still uses that day’s attempt. Check the robot before allowing another attempt.

Can the vacuum clean just one room?

Only when the exact vacuum and integration expose that ability. Check area mapping and the supported cleaning action before replacing the whole-clean start action. A Home Assistant room name alone does not configure the robot’s map.