summaryrefslogtreecommitdiff
path: root/ebus-datastore/ebus/web.py
diff options
context:
space:
mode:
authorEbus-at-dockstar <ebus@dockstar>2014-07-25 22:13:55 +0200
committerEbus-at-dockstar <ebus@dockstar>2014-07-25 22:13:55 +0200
commitf6675ccdd7a5997def3c4656f0e2c5dbbbed1fc8 (patch)
tree893a37289de684b95a6184c528e5c9c8547e7197 /ebus-datastore/ebus/web.py
parentcfb0c10631bbbd31b525e7992b59de06d3c2e550 (diff)
downloadebus-alt-f6675ccdd7a5997def3c4656f0e2c5dbbbed1fc8.tar.gz
ebus-alt-f6675ccdd7a5997def3c4656f0e2c5dbbbed1fc8.zip
embed xexpr-path
Diffstat (limited to 'ebus-datastore/ebus/web.py')
-rw-r--r--ebus-datastore/ebus/web.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/ebus-datastore/ebus/web.py b/ebus-datastore/ebus/web.py
new file mode 100644
index 0000000..41ccbed
--- /dev/null
+++ b/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