]> Pileus Git - ~andy/csm213a-hw/blobdiff - vis/logger.py
Add Xively upload
[~andy/csm213a-hw] / vis / logger.py
index ffd79038781a5dfb9f89e328152aa0d9c06c76bd..81e34919d13ea502d75ad483012306cb589c85af 100644 (file)
@@ -1,6 +1,64 @@
+from datetime import datetime
+
+from xively import XivelyAPIClient
+from xively import Datastream
+from xively import Datapoint
+
+
 class Logger:
+       api   = None
+       feed  = None
+       queue = []
+       last  = 0
+
+       # Methods
        def __init__(self, config):
                self.config = config
 
+       # Methods
        def connect(self):
-               pass
+               self.api   = XivelyAPIClient(self.config.apikey)
+               self.feed  = self.api.feeds.get(self.config.feedid)
+               self.last  = datetime.utcnow()
+               self.queue = []
+
+       def disconnect(self):
+               self.api   = None
+               self.feed  = None
+
+       def running(self):
+               if not self.api or not self.feed:
+                       return False
+               return True
+
+       def append(self, state):
+               if not self.feed:
+                       return
+               self.queue.append(state)
+               delta = datetime.utcnow() - self.last
+               if delta.total_seconds() > self.config.maxrate:
+                       self.flush()
+
+       # Private methods
+       def flush(self):
+               def isset(state, key):
+                       value = getattr(state, key)
+                       return any([x!=None for x in value])
+               def get(items, key):
+                       points = [ Datapoint(s.time, getattr(s,key)) \
+                               for s in items if isset(s,key) ]
+                       stream = Datastream(id=key)
+                       stream.datapoints = points
+                       return stream
+
+               self.feed.datastreams = [
+                       get(self.queue, 'acc'),
+                       get(self.queue, 'mag'),
+                       get(self.queue, 'touch'),
+                       get(self.queue, 'light'),
+                       get(self.queue, 'a2d'),
+               ]
+               self.feed.update()
+
+               self.last  = datetime.utcnow()
+               self.queue = []