summaryrefslogtreecommitdiffstats
path: root/ampel/google-muell.py
blob: 2089de63fda87a7b59881958cec37a0453f8fb59 (plain)
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()