summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormakefu <github@syntax-fehler.de>2018-02-04 19:48:18 +0100
committermakefu <github@syntax-fehler.de>2018-02-04 19:48:18 +0100
commit1f8c3ae133fea3be572d041beaed9a03b2160eac (patch)
treeae40a6ee8852ade4dc6f8db28982af5b5faf2b12
parent531741bd149ececdad8aebb443d26555167840bd (diff)
make google-muell usable
-rwxr-xr-xampel/google_muell.py (renamed from ampel/google-muell.py)82
-rw-r--r--setup.py5
2 files changed, 59 insertions, 28 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__":
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',