From 1f8c3ae133fea3be572d041beaed9a03b2160eac Mon Sep 17 00:00:00 2001 From: makefu Date: Sun, 4 Feb 2018 19:48:18 +0100 Subject: make google-muell usable --- ampel/google-muell.py | 111 ---------------------------------------- ampel/google_muell.py | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 5 +- 3 files changed, 143 insertions(+), 112 deletions(-) delete mode 100755 ampel/google-muell.py create mode 100755 ampel/google_muell.py diff --git a/ampel/google-muell.py b/ampel/google-muell.py deleted file mode 100755 index 2089de6..0000000 --- a/ampel/google-muell.py +++ /dev/null @@ -1,111 +0,0 @@ -#! /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() diff --git a/ampel/google_muell.py b/ampel/google_muell.py new file mode 100755 index 0000000..7cd6e52 --- /dev/null +++ b/ampel/google_muell.py @@ -0,0 +1,139 @@ +#! /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 +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 +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 = { + "-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 + ''' + 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) + log.info(f'Storing new credentials to {credential_path}') + else: + log.info(f'Using existing valid credentials {credential_path}') + + return credentials + +def next_date(credentials): + http = credentials.authorize(httplib2.Http()) + service = discovery.build('calendar', 'v3', http=http) + + now = datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time + log.debug('Getting the upcoming 10 events') + eventsResult = service.events().list( + 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(seconds=1) # + timedelta(days=1) + + if start < datetime.now() < end: + 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 + + +def to_payload(arr): + return {"r":arr[0],"g":arr[1],"b":arr[2]} + +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: + 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__": + main() diff --git a/setup.py b/setup.py index 30b6dc0..7d948a6 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,10 @@ setup( 'ampel/vvs_efa', ], entry_points={ - 'console_scripts' : [ 'ampel = ampel.ampel:main' ], + 'console_scripts' : [ + 'ampel = ampel.ampel:main', + 'google-muell = ampel.google_muell:main' + ], }, install_requires= [ 'requests','docopt','influxdb', 'paho-mqtt','pytz', -- cgit v1.2.3