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): 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 = []