#! /usr/bin/env nix-shell #! nix-shell -i python3 -p python3 python36Packages.docopt python36Packages.requests2 python36Packages.google_api_python_client python36Packages.dateutil """ usage: google-muell [options] --esp=HOST esp8266 ip [Default: 192.168.1.23] --client-secrets=FILE Path to client secrets file (from application) [Default: licht-kalender-secrets.json] --credential-path=PATH Path to newly generated (or existing) credentials [Default: licht-creds.json] --sleepval=SEC seconds to sleep [Default: 900] you can create the client-secrets by creating a new google application, create oauth2 token and download it ( url here) """ from docopt import docopt from ampel.fade import calc_chain import time from time import sleep import json import sys from datetime import datetime, timedelta import requests import httplib2 from dateutil.parser import parse from apiclient import discovery from oauth2client import client from oauth2client import tools from oauth2client.file import Storage SCOPES = 'https://www.googleapis.com/auth/calendar.readonly' APPLICATION_NAME = 'licht-kalender-client' colormap = { "8": [ 128,128,128 ], # grey "9": [ 0,0,0 ], # blue "11": [ 0,0,0 ],# true red "4": [ 0,0,0 ], # light red "3": [ 0,0,0 ], # purple } def get_creds(secrets_file,credential_path): ''' provide a cred_dir where the credentials would be stored to ''' import argparse flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args() store = Storage(credential_path) credentials = store.get() if not credentials or credentials.invalid: flow = client.flow_from_clientsecrets(secrets_file, SCOPES) flow.user_agent = APPLICATION_NAME credentials = tools.run_flow(flow, store, flags) print('Storing new credentials to ' + credential_path) else: print('Using existing valid credentials ' + credential_path) return credentials def next_date(credentials): http = credentials.authorize(httplib2.Http()) service = discovery.build('calendar', 'v3', http=http) #page_token = None #while True: # calendar_list = service.calendarList().list( # pageToken=page_token).execute() # for calendar_list_entry in calendar_list['items']: # print("{} - {}".format(calendar_list_entry['id'],calendar_list_entry['summary'])) # page_token = calendar_list.get('nextPageToken') # if not page_token: # break now = datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time print('Getting the upcoming 10 events') eventsResult = service.events().list( calendarId='o56ig681gla2a5vupm4vgiv7tc@group.calendar.google.com', timeMin=now, maxResults=10, singleEvents=True, orderBy='startTime').execute() events = eventsResult.get('items', []) for event in events: start = parse(event['start'].get('dateTime', event['start'].get('date'))) if 'dateTime' in event['end']: end = parse(event['end']['dateTime']) else: end = parse(event['end']['date']) + timedelta(days=1) - timedelta(seconds=1) if start < datetime.now() < end: print("event is active now") print(start,end, event) pass def to_payload(arr): return {"r":arr[0],"g":arr[1],"b":arr[2]} def main(): args = docopt(__doc__) client_secrets = args['--client-secrets'] sleepval = float(args["--sleepval"]) esp = args["--esp"] cred_path = args["--credential-path"] creds = get_creds(client_secrets,cred_path) while True: t = next_date(creds) requests.get("http://{}/color".format(esp),params=to_payload(t)) sleep(sleepval) if __name__ == "__main__": main()