diff options
author | Ebus-at-dockstar <ebus@dockstar> | 2014-07-26 19:57:28 +0200 |
---|---|---|
committer | Ebus-at-dockstar <ebus@dockstar> | 2014-07-26 19:57:28 +0200 |
commit | 773093acabfb84b88c37bb0342d6a8d4a6f8267a (patch) | |
tree | eed343d56e36dfcc87bfc0e81af762cbed5938d7 /heap/ebus-datastore/ebus/web.py | |
parent | d624ed7b00203ec3beb3337a44ec1cf8075df453 (diff) | |
download | ebus-alt-773093acabfb84b88c37bb0342d6a8d4a6f8267a.tar.gz ebus-alt-773093acabfb84b88c37bb0342d6a8d4a6f8267a.zip |
move ebus-datastore to heap
Diffstat (limited to 'heap/ebus-datastore/ebus/web.py')
-rw-r--r-- | heap/ebus-datastore/ebus/web.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/heap/ebus-datastore/ebus/web.py b/heap/ebus-datastore/ebus/web.py new file mode 100644 index 0000000..41ccbed --- /dev/null +++ b/heap/ebus-datastore/ebus/web.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +import os +import json +import traceback +import time +import itertools +import numpy +import bottle +import logging +logging.basicConfig() +from ebus.datastore import Datastore, Interval + +datastore = Datastore("datastore-data") + +app = bottle.Bottle("ebus") + +@app.route('/') +def index_file(): + return static_files("index.html") + +@app.route('/static/:filename#.+#') +def static_files(filename): + return bottle.static_file(filename, root=os.path.join(os.path.dirname(__file__),"web_static")) + + +@app.put('/sensor/:name') +def sensor_data_put(name): + try: + value = bottle.request.POST.value + type = bottle.request.POST.type + timestamp = long(time.time()*1000) + print name,value,type,timestamp + + if type == "int": + datastore.addValueInt(name, timestamp, long(value)) + elif type == "float": + datastore.addValueFloat(name, timestamp, float(value)) + elif type == "string": + datastore.addValueString(name, timestamp, str(value)) + else: + return {'error':'INVALID_TYPE', msg:'Type {0} is invalid'.format(type)} + + msg = "Stored {0} of type {1} with timestamp {2} to {3}".format(value,type,timestamp,name) + return {'error':None,'msg':msg} + except Exception,e: + traceback.print_exc() + msg = "failed to insert into {0}".format(name) + print msg + return {'error':str(e),'msg':msg} + +@app.route('/sensor/:name/:startdate/:enddate') +def sensor_name_start_end(name,startdate,enddate): + startdate, enddate = long(startdate), long(enddate) + assert (enddate - startdate) < Interval.MONTH * 2 + try: + data = sorted(datastore.get_range_n(name, startdate, enddate,800)) + return {'name':name, + 'config':datastore.get_config(name), + 'data':data} + except Exception,e: + traceback.print_exc() + return {"data":None, "error":str(e)} + +@app.route('/avg/:name/:startdate/:enddate') +def sensor_avg_start(name, startdate, enddate): + period = 15 * Interval.MIN + startdate, enddate = long(startdate), long(enddate) + assert (enddate - startdate) < Interval.MONTH * 2 + try: + sel_rows = datastore.get_range_n(name, startdate, enddate, 5000) + data = itertools.groupby(sel_rows, lambda row: row[0]-(row[0]%period)) + data = map(lambda (group_time, grouped_rows): + (long(group_time), numpy.average([row[1] for row in grouped_rows])), + data) + return {'sensor':name, 'error':None,'data':data} + except Exception,e: + return {'sensor':name, 'error':str(e), 'data':None} + +# vim: autoindent tabstop=4 shiftwidth=4 expandtab softtabstop=4 filetype=python |