Let the clock start the check, and the date decide

To make a Home Assistant Workday sensor skip holidays, configure your working weekdays and region, then select Holidays under Days to exclude. Use the resulting on/off sensor as a condition in your morning automation. A condition is a check that must pass before the routine proceeds.

For personal leave, add dates to Workday itself or use a separate days-off calendar. Choose dates in Workday for a small, rarely changed list. Choose a Local calendar if you want to edit time off from Home Assistant’s Calendar page. The walkthrough below uses that second option and checks three things at 7 a.m.: is the routine enabled, is today a workday, and is there no active day-off entry?

This suits a regular working week with occasional exceptions. A rotating shift roster needs an explicit schedule of shifts; national holidays cannot predict when you work. For separate Home, Away and Sleep behavior, use our household modes guide.

Researched from current Home Assistant documentation and its 2026.9.4 Workday implementation on October 3, 2026. The configuration and worked examples are documentation-based, not a tested Tara installation. Menu labels can differ by installed version. The cover is an AI-generated editorial illustration.

1. Create a Workday sensor for today

  1. Open Settings → Devices & services → Add integration → Workday. An integration adds a feature or connects a service to Home Assistant.
  2. Select your country and subdivision, such as your state or province. Match your actual holiday calendar.
  3. Under Days to include, choose your working weekdays. For an ordinary Monday–Friday week, exclude Saturday, Sunday and Holidays.
  4. Keep Offset at 0 and name the entry “Workday today.” An offset of 1 answers tomorrow’s question instead.
  5. Find its binary sensor in the integration’s entity list and copy its entity ID. An entity is a named item in Home Assistant; the example uses binary_sensor.workday_today. Your generated ID may differ.

The Workday documentation explains regional categories and offline holiday data. Newly declared holidays depend on the bundled holiday library. Check dates that matter to you rather than assuming every workplace follows the public calendar.

Exclusion wins. Selecting Monday as a workday does not override an excluded Monday holiday. Likewise, removing a holiday does not make an excluded Saturday a working day. This follows the Workday date-selection logic.

2. Choose where to keep personal days off

For a short fixed list: open the Workday entry’s configuration options and add dates under Add holidays. The documented format is YYYY-MM-DD, or YYYY-MM-DD,YYYY-MM-DD for a range. Keep Holidays excluded. These dated entries need maintenance when next year’s leave changes.

For the editable-calendar example below:

  1. Add Local calendar under Settings → Devices & services. Name it “Days off.” This is a separate calendar from the calendar Workday may display. The Local calendar integration stores and edits events locally.
  2. Open Calendar in the sidebar and add an all-day event to Days off for each personal leave day or school break that should stop this routine. For a multi-day absence, check that the displayed event covers every intended day.
  3. Copy that calendar’s entity ID; this example uses calendar.days_off. Keep ordinary appointments elsewhere: any active event in this calendar will block the routine.
  4. Create a Toggle under Settings → Devices & services → Helpers → Create helper. Name it “Morning routine enabled,” confirm its ID, and keep it off until the rehearsal is ready. Put it on your dashboard for an immediate pause.

A Local calendar is an automation calendar inside Home Assistant, not automatic synchronization with your phone’s calendar app. If you already manage leave in another calendar, connect that calendar through its supported integration and account for its connection requirements. Our calendar notifications guide covers appointment reminders as a separate use.

Add leave ahead of time. Home Assistant’s calendar documentation notes a 15-minute read interval. Before relying on a last-minute edit, inspect the calendar entity: on means an event is active, and off means none is active. The toggle is the immediate way to pause while an edit settles. For an all-day event, check the first and last intended day in the Calendar view. Use neutral event names if other household members can see the calendar.

3. Check a future date without changing any devices

Open Settings → Tools → Actions (called Developer tools → Actions in older versions). Select Workday: Check date, target your offset-zero sensor and enter a date. In YAML mode, the call looks like this:

action: workday.check_date
target:
  entity_id: binary_sensor.workday_today
data:
  check_date: "2026-11-02"

The action’s response contains your sensor’s ID and workday: true or workday: false. This checks the configured date rules without changing today’s sensor state. The 2026.9.4 implementation applies the sensor’s offset to the supplied date too, which is why this test uses offset 0.

Try a normal working date, an excluded weekend, and a public holiday that you expect your selected region to recognize. Compare against your own work calendar. This action does not check the separate Days off calendar or the pause toggle. That needs the complete rehearsal below.

4. Build a notification-only morning rehearsal

Create a new empty automation under Settings → Automations & scenes, open its menu and choose Edit in YAML. Paste this whole example into that automation editor, replace the three entity IDs with your actual IDs, then save and enable the automation. Do not paste it as a whole into configuration.yaml.

alias: Morning routine - workdays rehearsal
description: Check the date before a harmless in-app message
triggers:
  - trigger: time
    at: "07:00:00"
conditions:
  - condition: state
    entity_id: input_boolean.morning_routine_enabled
    state: "on"
  - condition: state
    entity_id: binary_sensor.workday_today
    state: "on"
  - condition: state
    entity_id: calendar.days_off
    state: "off"
actions:
  - action: persistent_notification.create
    data:
      title: "Morning routine rehearsal"
      message: "The workday, days-off and enable checks passed."
      notification_id: morning_routine_rehearsal
mode: single

The clock is the trigger. The three conditions must all pass. An unknown or unavailable value does not match the required on/off value, so the routine skips. The persistent notification appears inside Home Assistant; it is not a phone push alert. A repeat successful run updates the same notification ID.

If you chose Workday’s Add holidays list instead of a Local calendar, remove the entire three-line condition for calendar.days_off. Keep the Workday and enable checks. Do not leave a reference to a calendar you never created.

Worked example: one household, four mornings

Consider a household whose Workday sensor includes Monday–Friday, excludes its regional holidays, and has offset 0. A parent adds a personal day to Days off. These are expected outcomes of the configuration, not observations from a Tara home.

On a phone, swipe sideways inside a table to read all three columns.

MorningInputs at 7 a.m.Expected result
Ordinary workdayEnabled on; Workday on; Days off offThe rehearsal message appears.
Recognized public holidayEnabled on; Workday off; Days off offNo message. The Workday check stops it.
Personal leave on a weekdayEnabled on; Workday on; Days off onNo message. The personal calendar stops it, even though Workday says on.
Last-minute lie-in or missing dataEnabled off, or one required entity unknown/unavailableNo message. The routine waits for the next scheduled trigger; it does not run merely because the data recovers.

5. Verify the full rule, then connect the routine

  1. Check the home time zone under Settings → System → Home information → Region (General in older versions). The home information guide shows the setting.
  2. On an eligible day, test the allowed path. Confirm Workday is on and Days off is off. Turn the enable toggle on. Change at to a local time two minutes ahead, save, and wait. Expected: the rehearsal message appears and the automation trace reaches its action.
  3. Test a pause. Dismiss the old rehearsal message, turn the enable toggle off, and save another future trigger time. Expected: no new message; the trace stops at that condition.
  4. Test personal leave. Keep the message as the only action. On an eligible day, create a temporary Days off event covering the test time, allow the calendar to update, and confirm it is on. Turn the enable toggle on and set another future trigger time. Expected: no message; the trace stops at the calendar condition. Remove only the temporary test event afterward.
  5. Restore the intended time and your real Workday entity. Once the allowed and blocked paths behave correctly, return to the visual editor. Replace the notification action with Light: Turn on, choose one non-critical bedside lamp as the target, and save. For an existing morning script, choose that script instead. Keep an ordinary way to switch the lamp off; this start rule does not include a shutoff.

Testing on a weekend? You can wait for an eligible day. Or create a separate, temporary Workday entry with no country, all seven weekdays included, no exclusions and offset 0. Use its ID only in this notification rehearsal. Restore the real Workday ID before connecting a device; otherwise weekends will keep passing.

Do not use Run actions to validate the exclusions: it skips the trigger and top-level conditions. Use the future time and inspect the trace, as described in Home Assistant’s testing guide.

For a gradual lamp ramp, follow the existing wake-up light walkthrough and add the relevant Workday/calendar checks to that automation, retaining its enable check. These start conditions do not cancel a ramp already running. Avoid keeping two morning automations that both control the same lamp. Keep your independent alarm: a missed trigger during downtime is not replayed by this recipe.

If the wrong morning runs—or nothing runs

What you seeCheck firstNext step
It runs on a public holidayWas Holidays excluded? Does Check date return false on the offset-zero sensor?Correct the region/category or add the missing date. Then test the real automation’s condition, not Run actions.
It runs during personal leaveIs the selected Days off entity on at the scheduled time?Check the actual calendar, all-day dates and time zone. Pause with the toggle while waiting for an edit to appear.
It skips an ordinary weekdayRead each actual state in the trace: enabled on, Workday on, Days off off.Fix the first failed check. A mistyped ID or unavailable calendar is a reason to skip, not proof the holiday list is wrong.
No trace at allWas the automation enabled, saved before the time, and Home Assistant running?Set another future test time. Changing a condition afterward does not restart a missed run.

Questions before you reuse the rule

Does Workday need the internet or a subscription?

Its holiday lookup runs locally from bundled data, without an online lookup. The complete routine’s other parts can still depend on external services. This example uses a Local calendar and an in-app notification; check the integration path of any device or service you add.

Will it know my school breaks or rotating shifts?

Do not assume so. Add the relevant school days off yourself, and maintain a separate calendar or schedule for rotating shifts. If two household members work different patterns, give their routines separate Workday entries and days-off calendars.

Can it tell me whether tomorrow is a workday?

Yes: create another Workday entry with offset 1 for an evening check about tomorrow. Keep the morning routine on the offset-zero entry. Maintain matching region and custom-holiday settings separately; the second entry does not automatically inherit edits from the first.