How To: Rotating/Rolling Shift Work Roster with Stock Calendar

Introduction

I work in mining and we do not work the typical 5 Day week.
There is a few other industries that use rotating/recurring rosters, i.e factories and medical services.
There is no easy way to place a shift pattern into the calendar and have it repeat.

Configuration

To add the Local calendar integration to your Home Assistant instance, use this My button:

Creating Calendar

  1. Open the Home Assist Calendar from you Side Bar.
  2. Select + Create calendar bottom left of your screen
  3. Select Create an empty calendar
  4. Name the Local Calendar as "8:6 Roster or something familiar.
  5. Click SUBMIT
  6. Click FINISH when the Sucess! dialogue pops up.

Create an 8:6 Roster:

Shift Pattern (8 Days ON, 6 Days OFF, 8 Nights ON, 6 Days OFF)

Starts on a Tuesday

ON OFF ON OFF Start End Duration All Day Event
8 Days - - - 06:00 18:00 12hr -
- 6 Days - 6 Days - - 24hr Yes
- - 8 Nights - 18:00 06:00 12hr -

A. Day Shift Roster Events

  1. Follow Creating a Calendar Link Above
  2. Click on + ADD EVENT bottom right of your screen
  3. Ensure you Select the right calendar in the Calendar “8:6 Roster”
    NOTE This Defaults do a different Calendar in most cases.
  4. Input Start: Date (Tue 1/4/2025) and Start: Time (06:00)
  5. Input End: Date (Tue 8/4/2025) and End: Time (18:00)
  6. Select Repeat Daily
  7. Input Repeat interval 28 Days
    NOTE: Type this statement into your AI to work out the repeat interval
  8. Select End: Never
  9. Click ADD EVENT

B. Day OFF Roster Events

  1. Click on + ADD EVENT bottom right of your screen
  2. Ensure you Select the right calendar in the Calendar “8:6 Roster”
    NOTE This Defaults do a different Calendar in most cases.
  3. Select All day
  4. Input Start: Date (Wed 9/4/2025) and End: Date (Mon 14/4/2025)
  5. Input Repeat interval 14 Days NOTE: See AI note above, Days OFF happen twice as often as Day and Night Shifts so halve the repeat interval
  6. Select End: Never
  7. Click ADD EVENT

C. Night Shift Roster Events

  1. Click on + ADD EVENT bottom right of your screen
  2. Ensure you Select the right calendar in the Calendar “8:6 Roster”
    NOTE This Defaults do a different Calendar in most cases.
  3. Input Start: Date (Tue 15/4/2025) and Start: Time (06:00)
  4. Input End: Date (Tue 22/4/2025) and End: Time (18:00)
  5. Input Repeat interval 28 Days
    NOTE: See AI note above
  6. Select End: Never
  7. Click ADD EVENT

D. Completed 8:6 Roster

Create a 5:2 / 4:3 Roster:

Shift Pattern (5 Days ON, 2 Days OFF, 4 Days ON, 3 Days OFF)
Starts on a Monday Every with Second Friday Off

ON OFF ON OFF Start End Duration All Day Event
5 Days - - - 06:00 16:00 10hr -
- 2 Days - 3 Days - - 24hr Yes
- - 4 Days - 06:00 16:00 10hr -

A. (5 Day) Day Shift Roster Events

  1. Follow Creating a Calendar Link Above
  2. Click on + ADD EVENT bottom right of your screen
  3. Ensure you Select the right calendar in the Calendar “5:2 / 4:3 Roster”
    NOTE This Defaults do a different Calendar in most cases.
  4. Input Start: Date (Tue 7/4/2025) and Start: Time (06:00)
  5. Input End: Date (Tue 11/4/2025) and End: Time (16:00)
  6. Select Repeat Daily
  7. Input Repeat interval 14 Days
    NOTE: Type this statement into your AI to work out the repeat interval
  8. Select End: Never
  9. Click ADD EVENT

B. (4 Day) Day Shift Roster Events

  1. Click on + ADD EVENT bottom right of your screen
  2. Ensure you Select the right calendar in the Calendar “5:2 / 4:3 Roster”
    NOTE This Defaults do a different Calendar in most cases.
  3. Input Start: Date (Tue 14/4/2025) and Start: Time (06:00)
  4. Input End: Date (Tue 17/4/2025) and End: Time (16:00)
  5. Input Repeat interval 28 Days
    NOTE: See AI note above
  6. Select End: Never
  7. Click ADD EVENT

C. Day Off Roster Events

  1. Left Blank in this example, but could be added if you want to.

D. Completed 5:2 / 4:3 Roster

Create an 15:13 Roster:

Shift Pattern 15:13 (15 Days ON, 13 Days OFF, With Fly In and Out Days)**

Starts on a Tuesday

FLY ON FLY OFF Start End Duration All Day Event
IN - - - 06:00 10:00 6.5hr -
- 15 Days - - 05:30 17:30 12hr -
- - OUT - 14:00 16:10 9hr
- - - 13 Days - - 24hr Yes

A. Day Shift Roster Events

  1. Follow Creating a Calendar Link Above
  2. Click on + ADD EVENT bottom right of your screen
  3. Ensure you Select the right calendar in the Calendar “15:13 Roster”
    NOTE This Defaults do a different Calendar in most cases.
  4. Input Start: Date (Tue 7/4/2025) and Start: Time (05:30)
  5. Input End: Date (Tue 11/4/2025) and End: Time (17:30)
  6. Select Repeat Daily
  7. Input Repeat interval 28 Days
    NOTE: Type this statement into your AI to work out the repeat interval
  8. Select End: Never
  9. Click ADD EVENT

B. FLY-IN Day Roster Events

  1. Click on + ADD EVENT bottom right of your screen
  2. Ensure you Select the right calendar in the Calendar “15:13 Roster”
    NOTE This Defaults do a different Calendar in most cases.
  3. Input Start: Date (Tue 22/4/2025) and Start: Time (06:00)
  4. Input End: Date (Tue 22/4/2025) and End: Time (10:00)
  5. Input Repeat interval 28 Days
    NOTE: See AI note above
  6. Select End: Never
  7. Click ADD EVENT

C. FLY-OUT Day Roster Events

  1. Click on + ADD EVENT bottom right of your screen
  2. Ensure you Select the right calendar in the Calendar “15:13 Roster”
    NOTE This Defaults do a different Calendar in most cases.
  3. Input Start: Date (Tue 06/4/2025) and Start: Time (14:00)
  4. Input End: Date (Tue 06/4/2025) and End: Time (16:10)
  5. Input Repeat interval 28 Days
    NOTE: See AI note above
  6. Select End: Never
  7. Click ADD EVENT

D. Day Off Roster Events

  1. Left Blank in this example, but could be added if you want to.

E. Completed 15:13 Roster

Example Usage on Dashboard

Automation Triggers

Week-Planner-Card

Make the calendar visible to all in the household, ideal for planning dates.

CARD FOR 1080p Width

  • Starts On Sunday
  • Past days are faded
  • Current Day Highlighted
  • Navigation to move through the months
  • Is at 1080p width on my vertical 21" Touch Screen
FULL CARD CODE HERE
                   - type: custom:week-planner-card
                    calendars:
                      - entity: calendar.australia_tas
                        color: purple
                        name: Public Holidays
                      - entity: calendar.calendar
                        color: grey
                        name: Maverick
                      - entity: calendar.recycle_pickup_3
                        color: yellow
                        name: Recycling
                      - entity: calendar.rubbish_pickup_3
                        color: green
                        name: Rubbish & FOGO
                      - entity: calendar.birthdays
                        color: crimson
                        name: Birthdays
                      - entity: calendar.hunter
                        color: slateblue
                        name: Hunter
                    weather:
                      entity: weather.devonport
                      showCondition: true
                      showTemperature: true
                    noCardBackground: true
                    eventBackground: var(--ha-card-background)
                    showLegend: true
                    days: 28
                    startingDay: sunday
                    startingDayOffset: 0
                    compact: true
                    showNavigation: true
                    card_mod:
                      style: |
                        .day.past {
                          opacity: .3;
                        }
                        .today .number {
                          color: crimson;
                          border: solid 2px crimson;
                          border-radius: 4px;
                          background-color: white !important;
                          }
                        .event[data-entity="calendar.recycle_pickup_3"] {
                          background-color: rgba(255,215,0,0.2) !important;
                        }
                        .event[data-entity="calendar.rubbish_pickup_3"] {
                          background-color: rgba(34,139,34,0.2) !important;
                        }
                        .event[data-entity="calendar.australia_tas"] {
                          background-color: rgba(148,0,211,0.2) !important;
                        }
                        .event[data-summary="Hunter Home"] {
                          background-color: rgba(106,90,205,0.2) !important;
                        }
                        .event[data-summary="Hunter Fly-Home"] {
                          background-color: rgba(106,90,205,0.5) !important;
                        }
                        .event[data-summary="Hunter Fly-Work"] {
                          background-color: rgba(106,90,205,0.5) !important;
                        }
```

CARD FOR Smaller Area (Google Nest Hub)

  • Starts Today
  • Current Day Highlighted
  • Navigation to move through the months
  • Cast to a Google Nest Hub
FULL CARD CODE HERE
                  type: custom:week-planner-card
                  title: null
                  calendars:
                    - entity: calendar.australia_tas
                      color: purple
                      name: Public Holidays
                    - entity: calendar.calendar
                      color: grey
                      name: Maverick
                    - entity: calendar.recycle_pickup_3
                      color: gold
                      name: Recycling
                    - entity: calendar.rubbish_pickup_3
                      color: green
                      name: Rubbish & FOGO
                    - entity: calendar.birthdays
                      color: crimson
                      name: Birthdays
                    - entity: calendar.hunter
                      color: slateblue
                      name: Hunter
                  days: 9
                  compact: true
                  weather:
                    entity: weather.devonport
                    showCondition: true
                    showTemperature: true
                  noCardBackground: true
                  eventBackground: rgba(100, 100, 100, 0.15)
                  showLegend: false
                  showNavigation: true
                  columns:
                    extraSmall: 3
                  card_mod:
                    style: |
                      .day.past {
                        opacity: .3;
                      }
                      .today .number {
                        color: crimson;
                        border: solid 2px crimson;
                        border-radius: 4px;
                        background-color: white !important;
                        }
                      .event[data-entity="calendar.recycle_pickup_3"] {
                        background-color: rgba(255,215,0,0.2) !important;
                      }
                      .event[data-entity="calendar.rubbish_pickup_3"] {
                        background-color: rgba(34,139,34,0.2) !important;
                      }
                      .event[data-entity="calendar.australia_tas"] {
                        background-color: rgba(148,0,211,0.2) !important;
                      }
                      .event[data-summary="Hunter Home"] {
                        background-color: rgba(106,90,205,0.2) !important;
                      }
                      .event[data-summary="Hunter Fly-Home"] {
                        background-color: rgba(106,90,205,0.5) !important;
                      }
                      .event[data-summary="Hunter Fly-Work"] {
                        background-color: rgba(106,90,205,0.5) !important;
                      }

1 Like

That’s a neat way of getting it into your calendar.

With my old DDNNxxxx pattern, I just had the initial 4 shifts with an 8 day repeat forever.
Now I work DDDDxxxxDDAAxxxxAAAAxxxx it’s the first run of each of the 12 shifts on a 24 day repeat.

That way I also still get the individual calendar events with shift times included.

Are you using the HA calendar as the single source of truth, shared to phones etc? Currently using Google Apps calendar/s on my own domain, which then gets shared to iPhones/HA etc.

I’m also yet to find a simple way of dropping a nursing ‘throw shifts at the calendar and see what happens’ roster into a calendar nicely - at the moment I just use all-day events for shifts (thankfully only D or N now, but previously a mix of E/D/L/N) but being able to convert them to timed events automatically is the dream.

1 Like

I am using the HA Calendar as the single source of truth, the calendars are displayed on multiple screens in the house and available on mobile devices.

HA does need to improve how this type of scheduling can be entered I currently use Shift Work Calendar Planner on my phone that does have a handy and good looking widget that can be placed on my home screen.

An entry method into HA would be ideal, being able to set custom shift times for each shift.



1 Like

Yes it does not seem like you can delete a single day out of the event when setup this way, you have to delete the single event occurrence (i.e. two weeks) and then make a new schedule for that two week period.

At least the rest of the year stays in tact.

FYI Created a Feature Request. Calendar Support to Entering Rotating/Rolling Rosters

Ah ok, my primary calendar is in Google so can delete a single occurrence.

1 Like

It does however give you correct shift timings for the shift event on each day. Just tried to delete a single day entry again. Certainly does wipe out that single roster event, over that I.e. 7 day period.

Having to modify the days that fall that 7 day period is still less work than an entire calendar. Lol

Is that a Draeger mask you are wearing @KablammoNick?

Yeah. Very old pic, they’ve since been withdrawn.

1 Like