+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
+
+ # Constructor
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
+
+ if not self.running() or len(self.queue) == 0:
+ return
+
+ 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 = []