]> Pileus Git - ~andy/csm213a-hw/blob - vis/logger.py
Split Xively streams and debug upload
[~andy/csm213a-hw] / vis / logger.py
1 from datetime import datetime
2
3 from xively import XivelyAPIClient
4 from xively import Datastream
5 from xively import Datapoint
6
7
8 class Logger:
9         api   = None
10         feed  = None
11         queue = []
12         last  = 0
13
14         # Constructor
15         def __init__(self, config):
16                 self.config = config
17
18         # Methods
19         def connect(self):
20                 self.api   = XivelyAPIClient(self.config.apikey)
21                 self.feed  = self.api.feeds.get(self.config.feedid)
22                 self.last  = datetime.utcnow()
23                 self.queue = []
24
25         def disconnect(self):
26                 self.api   = None
27                 self.feed  = None
28
29         def running(self):
30                 if not self.api or not self.feed:
31                         return False
32                 return True
33
34         def append(self, state):
35                 if not self.feed:
36                         return
37                 self.queue.append(state)
38                 delta = datetime.utcnow() - self.last
39                 if delta.total_seconds() > self.config.maxrate:
40                         return self.flush()
41
42         # Private methods
43         def flush(self):
44                 def split(items, limit):
45                         split   = {}
46                         count   = 0
47                         sensors = {'acc': ['x','y','z'],
48                                    'mag': ['x','y','z'],
49                                    'tch': ['p','d'],
50                                    'lgt': [''],
51                                    'a2d': ['0','1','2','3','4','5']}
52                         for state in items:
53                                 for sns in sensors:
54                                         data = getattr(state, sns)
55                                         for i in range(len(data)):
56                                                 if data[i] == None:
57                                                         continue
58                                                 if count >= limit:
59                                                         print('upload: cropping upload')
60                                                         return split
61                                                 chan  = sns + sensors[sns][i]
62                                                 if not split.has_key(chan):
63                                                         split[chan] = []
64                                                 point = Datapoint(state.time, data[i])
65                                                 split[chan].append(point)
66                                                 count += 1
67                         return split
68
69
70                 if not self.running() or len(self.queue) == 0:
71                         return
72
73                 # Split data and limit to 500 points per upload
74                 upload = split(self.queue, 500)
75
76                 # Create datastreams
77                 self.feed.datastreams = \
78                         [ Datastream(id=chan, datapoints=upload[chan])
79                           for chan in upload.keys() ]
80
81                 # Clear queue
82                 self.last  = datetime.utcnow()
83                 self.queue = []
84
85                 # Upload it
86                 try:
87                         self.feed.update()
88                 except Exception as ex:
89                         return str(ex)