1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
#! /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()
|