From 459ea2012b97ad517391a8f965920749e43d96f0 Mon Sep 17 00:00:00 2001 From: mnestor Date: Sat, 19 Nov 2016 18:25:55 -0500 Subject: [PATCH] Documentation for Google Calendar component (#1403) * Documentation for Google Calendar component * Fixes from @Landrash --- .../binary_sensor.google_calendar.markdown | 115 ++++++++++++++++++ .../supported_brands/google_calendar.png | Bin 0 -> 19639 bytes 2 files changed, 115 insertions(+) create mode 100644 source/_components/binary_sensor.google_calendar.markdown create mode 100644 source/images/supported_brands/google_calendar.png diff --git a/source/_components/binary_sensor.google_calendar.markdown b/source/_components/binary_sensor.google_calendar.markdown new file mode 100644 index 00000000000..e57f182091e --- /dev/null +++ b/source/_components/binary_sensor.google_calendar.markdown @@ -0,0 +1,115 @@ +--- +layout: page +title: "Google Calendar Event" +description: "Instructions how to use Google Calendars in Home Assistant." +date: 2015-05-08 17:15 +sidebar: true +comments: false +sharing: true +footer: true +logo: google_calendar.png +ha_category: Calendar +ha_iot_class: "Cloud Polling" +ha_release: 0.33 +--- + + +This platform allows you to connect to your [Google Calendars](https://calendar.google.com) and generate binary sensors. The sensors created can trigger based on any event on the calendar or only for matching events. When you first setup this component it will generate a new configuration file *google_calendars.yaml* that will contain information about all of the calendars you can see. + +### {% linkable_title Prerequisites %} + +Generate a Client ID and Client Secret on [Google Developers Console](https://console.developers.google.com/start/api?id=calendar). + +1. Follow the wizard using the following information. +1. When it gets to the point of asking _Which API are you using?_ just click cancel. +1. Click on the tab 'OAuth consent screen'. +1. Set 'Product name shown to users' to anything you want. We suggest Home-Assistant. +1. Save this page. You don't have to fill out anything else there. +1. Click 'Create credentials' -> OAuth client ID. +1. Set the Application type to 'Other' and give this credential set a name then click Create. +1. Save the client ID and secret as you will need to put these in your configuration.yaml file. + +### {% linkable_title Basic Setup %} + +To integrate Google Calendar in Home Assistant, add the following section to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +google: + client_id: *Value_created_from_steps_above* + client_secret: *Value_created_from_steps_above* +``` + +Configuration variables: + +- **client_id** (*Required*): Use the value you generated in the Prerequisites stage. +- **client_secret** (*Required*): Use the value you generated in the Prerequisites stage. +- **track_new_calendar** (*Optional*): Will automatically generate a binary sensor when a new calendar is detected. The system scans for new calendars on startup. By default this is set to `True`. + +The next steps will require you to have Home Assistant running. + +After you have it running complete the Google authentication that pops up. It will give you a URL and a code to enter. This will grant your Home Assistant service access to all the Google Calendars that the account you authenticate with can read. This is a Read-Only view of these calendars. + + +### {% linkable_title Calendar Configuration %} +Editing `google_calendars.yaml` + +A basic entry for a single calendar looks like: + +```yaml +- cal_id: "***************************@group.calendar.google.com" + entities: + - device_id: test_everything + name: Give me everything + track: true +- cal_id: "***************************@group.calendar.google.com" + entities: + - device_id: test_important + name: Important Stuff + track: true + search: "#Important" + offset: "!!" + - device_id: test_unimportant + name: UnImportant Stuff + track: true + search: "#UnImportant" +``` + +Variables: + +- **cal_id**: The Google generated unique id for this calendar. **DO NOT CHANGE** + +- **entities**: Yes, you can have multiple sensors for a calendar! + + - **device_id**: (*Required*): The name that all your automations/scripts will use to reference this device. + + - **name**: (*Required*): What is the name of your sensor that you'll see in the frontend. + + - **track**: (*Required*): Should we create a sensor `True` or ignore it `False`? + + - **search**: (*Optional*): If set will only trigger for matched events. + + - **offset**: (*Optional*): A set of characters that precede a number in the event title for designating a pre-trigger state change on the sensor. (Default: `!!`) + +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. You'll also have a sensor `calendar.test_everything` that will not filter events out and always show the next event available. + +But what if you only wanted it to toggle based on all events? Just leave out the *search* parameter. + +**Note**: If you use a `#` sign for search then wrap it up. It's better to be safe! + + +### {% linkable_title Sensor 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 `search` and `offset` values extracted. So in the above example for **offset_reached** the **message** would be set to `Very important meeting` + + - **description**: The event description. + + - **location**: The event Location. + + - **start_time**: Start time of event. + + - **end_time**: End time of event. diff --git a/source/images/supported_brands/google_calendar.png b/source/images/supported_brands/google_calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..82b4e230ad8c9386729cc35a867b5fe2be7ebf74 GIT binary patch literal 19639 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 XasM0e<#+G{9sqzwI@mN?`4avG+{7`Y literal 0 HcmV?d00001