/MMM-GoogleCalendar

Google Calendar for MagicMirror²

Primary LanguageJavaScriptMIT LicenseMIT

Module: MMM-GoogleCalendar

This module is a customization from MagicMirror's default calendar module to display your Google calendars (including the Google Family calendar) without needing to make calendars public or using iCals. Inspired by the GoogleTask module.

Dependencies

  1. The Google Node.js client library: This dependency is required for authenticating to Google and using the Google Calendar API (v3). See Installation for instructions.

Installation

To install the module, use your terminal to:

  1. Navigate to your MagicMirror's modules folder. If you are using the default installation directory, use the command:
    cd ~/MagicMirror/modules
  2. Clone the module:
    git clone https://github.com/randomBrainstormer/MMM-GoogleCalendar.git
  3. Install Google API:
    npm install googleapis

Authentication Setup

Before you can add your calendar you need to setup the Google Calendar API and OAuth2 client from the Google Cloud Platform:

  1. Go here, and follow the instructions found in the prerequisites section to create the Google Cloud project (you could also use an existing project if you wish).
  2. Once you have enabled setup the project and created your OAuth ID client, download the client ID as json (look for the download option) and rename it credentials.json. NOTE: When creating the OAuth ID client you should see a list of diffrent credential types, check this section to know which types are supported.
  3. Move credentials.json to your MMM-GoogleCalendar directory (MagicMirror/modules/MMM-GoogleCalendar/)
  4. Enable Google Calendar API. Select the same project as in step 1.
  5. If you're using the TV & Limited Input devices as the OAuth credential type, run this command from the MMM-GoogleCalendar directory: node authorize.js and follow the instructions that will display in the console, otherwise you can safely skip this step as is not needed for other credential types. NOTE: After completing the authorize.js script it should print your calendar ID and most recent entries, you can use this to copy the ID of the calendar you want to config. (If you can't find yoru ID, check the troubleshooting section for help).

Supported OAuth Credentials Type

As mentioned in the second step above, when creating your OAuth client ID you'll have to choose between a different set of options. This module only supports the Web Application and TV & Limited Input devices credential types. The main difference between between these is the authentication flow. With TV & Limited Input devices you can authenticate from the command line (useful for when using MagicMirror as server-only), while Web Application requires to use the same browser on which MagicMirror is being displayed.

When setting up a Web Application ID you'll be prompted for an origin URL and a redirecting URL, you can use http://localhost:8080 for both values.

Using the module

MagicMirror² Configuration

To use this module, add the following configuration block to the modules array in the config/config.js file, don't forget to replace the "MyGoogleCalendarIDHere" with your actual calendar ID:

{
    module: 'MMM-GoogleCalendar',
    header: "My Google Private Cal",
    position: "top_left",
    config: {
        calendars: [
            {
              symbol: "calendar-week",
              calendarID: "MyGoogleCalendarIDHere"
            },
            // add another calendar HERE if needed
        ],
    }
},

Configuration Options

Although this module works with Google calendars only, most of the options from the original calendar module are supported, please check the MagicMirror² documentation. PRs with latest changes are always welcome.

FAQ

Can this module display .ICS calendars or any other format?
No, this module will only work with google calendar directly, the reason is that information in google calendars is stored in different format, thus no support for other calendar types. You could, however, use the default calendar module to view ICS.

Can't seem to get this working, what should I do?
Check out the troubleshooting guide below, if you don't find a solution for your problem feel free to open an issue here.

What's the difference between the TV & Limited Input devices and Web Application credential types? Check out the dedicated section to OAuth credential types.

Troubleshooting

Error Solution
I ran the authentication steps but I didn't get the calendar ID printed If your calendar ID was not printed, you can find it on your Google calendar settings page. Basically, just visit https://calendar.google.com and look for the settings (should be on the upper right section, an icon similar to a gear). Once you're in the settings page, look on the left for your calendar settings and click on the calendar you want to display in MMM-GoogleCalendar, you're calendar ID will be somewhere in the integrate your calendar section. You do not need to change settings, just copy the ID and use it in MMM-GoogleCalendar
While installing the module I get Error: Cannot find module... You're probably trying to execute the command in the wrong directory. Use the ls command to list the items in your current directory and navigate to where you've installed this module, by default the path is usually /home/pi/MagicMirror/modules/MMM-GoogleCalendar
When installing the module I get TypeError: Cannot destructure property 'client_secret'.. The credentials file from Google Cloud is of the wrong type, make sure to create a credential for TV & Limited Input devices or Web Application
I restarted my raspberry, my calendars suddenly don't show anymore Most likely the token expired and you have to reauthenticate with Google again. Just run node authorize.js as done in step 5. If this doesn't work, navigate to the MMM-GoogleCalendar directory and delete the file token.json and try running node authorize.js again. Note: If you're connecting through SSH you can delete the token by using the command rm -rf token.json. If the problem persist, try creating a new credential and repeating the authorize process. (You can delete the old one unless you use it for other stuff).
Error: invalid_grant Make sure the email used during the node authorize.js step is the same OR has access to the credentials in Google Cloud. If the problem persist, completely delete the current token by navigating to the MMM-GoogleCalendar directory and deleting token.json, if you connect to the raspberry through SSH try running rm -rf token.json to delete the token, once deleted run node authorize.js again. If this process doesn't work try creating a new credential and repeating the authorize process. (You can delete the old one unless you use it for other stuff).
Error in the MMM-GoogleCalendar module. check logs for more details Check the log for more details, try running pm2 logs mm to see the latest logs and if there's any actual error from this module, is probably easier to find the error if you restart magic mirror so the log is blank: pm2 restart mm then check once it starts pm2 logs mm. Another way to see logs is right click on the mirror and select "inspect", then select "console" in the small window that opens up, there should also be some more info on whats is causing the error.