Google Calendars

The Google integration allows you to connect to your Google Calendars to Home Assistant. The integration adds calendar entities that are shown on the Calendar dashboard, and can be used for automations based on any event, or limited to specific matching criteria.


You need to configure developer credentials to allow Home Assistant to access your Google Account.

Generate Client ID and Client Secret


To integrate Google Calendar in Home Assistant, add the following section to your configuration.yaml file:

# Example configuration.yaml entry
  client_id: YOUR_CLIENT_ID
  client_secret: YOUR_CLIENT_SECRET

Configuration Variables

client_id string Required

Use the client ID you generated in the Prerequisites stage.

client_secret string Required

Use the client secret you generated in the Prerequisites stage.

track_new_calendar boolean (Optional, default: true)

Will automatically generate a binary sensor when a new calendar is detected. The system scans for new calendars only on startup.

calendar_access string (Optional, default: read_write)

Determines the level of access that Home Assistant will request when connecting to calendars. This can be read_only or read_write.

Then make sure to restart Home Assistant under Server Controls.

After that, you need to add Google Calendars Integration.

Manual configuration steps

The integration setup will next give you instructions on how to authorize Home Assistant to access your account and Calendars.

OAuth and Device Authorization steps


If the setup process fails and you see an error message such as Authentication code expired, please try again you may want to try the flow again. You may also check the logs for additional error messages that may indicate a misconfiguration such as an invalid client id or secret.

Calendar Configuration

The integration will discover new calendars and write them into a configuration file google_calendars.yaml in your configuration directory. The configuration file can let you control which calendars appear, or set up more elaborate event matching criteria.

A basic entry for a single calendar looks like:

- cal_id: "*****"
  - device_id: test_everything
    name: Give me everything
    track: true

From this, we will get a binary sensor calendar.test_everything triggered by any event on the calendar and will show the next 10 events on the ‘Calendar’ dashboard.

A bit more elaborate configuration:

- cal_id: "*****"
  - device_id: test_unimportant
    name: UnImportant Stuff
    track: true
    search: "#UnImportant"
  - device_id: test_important
    name: Important Stuff
    track: true
    search: "#Important"
    offset: "!!"

From this we will end up with the binary sensors calendar.test_unimportant and calendar.test_important which will toggle themselves on/off based on events on the same calendar that match the search value set for each. calendar.test_unimportant will toggle for events whose title contain ‘#UnImportant’ calendar.test_important will toggle for events whose title contain ‘#Important’. By using the offset variable an event title containing “#Important !!-10” will toggle the sensor 10 minutes before the event starts.

If you use a # sign for search then wrap the whole search term in quotes. Otherwise everything following the hash sign would be considered a YAML comment.

Configuration Variables

cal_id string Required

The Google generated unique id for this calendar.



entities list Required

Yes, you can have multiple sensors for a calendar!

device_id string Required

The name that all your automations/scripts will use to reference this device.

name string Required

What is the name of your sensor that you’ll see in the frontend.

track boolean Required, default: true

Should we create a sensor true or ignore it false?

search string (Optional)

If set will only trigger for matched events.

offset string (Optional, default: !!)

A set of characters that precede a number in the event title for designating a pre-trigger state change on the sensor. This should be in the format of HH:MM or MM.

ignore_availability boolean (Optional, default: true)

Should we respect free/busy flags?

Calendar attributes

  • offset_reached: If set in the event title and parsed out will be on/off once the offset in the title in minutes is reached. So the title Very important meeting #Important !!-10 would trigger this attribute to be on 10 minutes before the event starts.
  • all_day: true/false if this is an all day event. Will be false if there is no event found.
  • message: The event title with the offset value extracted. So in the above example for offset_reached the message would be set to Very important meeting #Important
  • description: The event description.
  • location: The event Location.
  • start_time: Start time of event.
  • end_time: End time of event.

Service google.add_event

You can use the service google.add_event to create a new calendar event in a calendar. Calendar id’s can be found in the file google_calendars.yaml. All dates and times are in your local time, the integration gets your time zone from your configuration.yaml file.

This will only be available if you have given Home Assistant read-write access (see calendar_access).

Service data attribute Optional Description Example
calendar_id no The id of the calendar you want. *****
summary no Acts as the title of the event. Bowling
description yes The description of the event. Birthday bowling
start_date_time yes The date and time the event should start. 2019-03-10 20:00:00
end_date_time yes The date and time the event should end. 2019-03-10 23:00:00
start_date yes The date the whole day event should start. 2019-03-10
end_date yes The date the whole day event should end. 2019-03-11
in yes Days or weeks that you want to create the event in. “days”: 2

You either use start_date_time and end_date_time, or start_date and end_date, or in.

Using calendar in automations

A calendar can be used as an external scheduler for special events or reoccurring events instead of hardcoding them in automations. The calendar entry must have a duration greater than 1 minute. Events that are 0 minutes long will not trigger the automation.

Trigger as soon as an event starts:

      platform: state
      entity_id: calendar.calendar_name
      to: "on"

By using specific text in the event title, you can set conditions to initiate particular automation flows on designated events while other events will be ignored.

For example, the actions following this condition will only be executed for events named ‘vacation’:

      - condition: state
        entity_id: calendar.calendar_name
        state: vacation
        attribute: message