diff options
Diffstat (limited to 'ampel')
-rwxr-xr-x | ampel/google_muell.py (renamed from ampel/google-muell.py) | 82 |
1 files changed, 55 insertions, 27 deletions
diff --git a/ampel/google-muell.py b/ampel/google_muell.py index 2089de6..7cd6e52 100755 --- a/ampel/google-muell.py +++ b/ampel/google_muell.py @@ -1,16 +1,17 @@ -#! /usr/bin/env nix-shell -#! nix-shell -i python3 -p python3 python36Packages.docopt python36Packages.requests2 python36Packages.google_api_python_client python36Packages.dateutil +#! /usr/bin/env python """ 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] + --lol=LOL set log level [Default: debug] 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 @@ -26,17 +27,33 @@ from apiclient import discovery from oauth2client import client from oauth2client import tools from oauth2client.file import Storage +import logging as log SCOPES = 'https://www.googleapis.com/auth/calendar.readonly' APPLICATION_NAME = 'licht-kalender-client' +calendarId = 'o56ig681gla2a5vupm4vgiv7tc@group.calendar.google.com' +# Mapping colorId from calendar to RGB colors 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 + "-1": [ 124, 179, 66 ], # default color (green) + "1": [ 121, 134, 203 ], # lavendel + "2": [ 51, 182, 121 ], # salbei + "3": [ 142, 36, 170 ], # grape + "4": [ 230, 124, 115], # light red + "5": [ 246, 191, 38], # banana + "6": [ 244, 81, 30 ], # mandarin + "7": [3, 155, 229], # pfau + "8": [ 128,128,128 ], # grey + "9": [ 63, 81, 181 ], # heidelbeere + "10": [0x0B,0x80,0x43 ], # basilicum + "11": [ 231,0,0 ], # true red } +def set_lol(lol): + numeric_level = getattr(log,lol.upper(),None) + if not isinstance(numeric_level,int): + raise AttributeError(f'No such log level {lol}') + log.basicConfig(level=numeric_level) + def get_creds(secrets_file,credential_path): ''' provide a cred_dir where the credentials would be stored to @@ -50,9 +67,9 @@ def get_creds(secrets_file,credential_path): 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) + log.info(f'Storing new credentials to {credential_path}') else: - print('Using existing valid credentials ' + credential_path) + log.info(f'Using existing valid credentials {credential_path}') return credentials @@ -60,33 +77,31 @@ 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') + log.debug('Getting the upcoming 10 events') eventsResult = service.events().list( - calendarId='o56ig681gla2a5vupm4vgiv7tc@group.calendar.google.com', timeMin=now, maxResults=10, singleEvents=True, + calendarId=calendarId, timeMin=now, maxResults=10, singleEvents=True, orderBy='startTime').execute() events = eventsResult.get('items', []) for event in events: + rem = event['reminders'] + # 'reminders': {'useDefault': False, 'overrides': [{'method': 'popup', 'minutes': 900}]} start = parse(event['start'].get('dateTime', event['start'].get('date'))) + if rem.get('overrides',[]): + reminder = timedelta(minutes=rem['overrides'][0]['minutes']) + log.info(f"Got a reminder at {reminder}, subtracting time") + start = start - reminder + if 'dateTime' in event['end']: end = parse(event['end']['dateTime']) else: - end = parse(event['end']['date']) + timedelta(days=1) - timedelta(seconds=1) + end = parse(event['end']['date']) - timedelta(seconds=1) # + timedelta(days=1) if start < datetime.now() < end: - print("event is active now") - print(start,end, event) + log.info(f"event {event['summary']} is active now ({start} - {end})") + return event + else: + log.info(f"event between {start} and {end} is not active") pass @@ -97,14 +112,27 @@ def to_payload(arr): def main(): args = docopt(__doc__) + set_lol(args['--lol']) 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)) + try: + log.info("Fetching next Date") + t = next_date(creds) + if t: + color = colormap[str(t.get('colorId',-1))] + log.info(f"setting color to {color} according to colormap") + else: + color = colormap["-1"] + log.info(f"setting default color {color}") + requests.get(f"http://{esp}/color",params=to_payload(color)) + + except Exception as e: + log.error(f"Something went wrong while calculating the next date:{e}") + log.info(f"sleeping for {sleepval} seconds") sleep(sleepval) if __name__ == "__main__": |