summaryrefslogtreecommitdiff
path: root/ebus-datastore/ebus/web.py
blob: 41ccbed06bbf28a316c529c984ccfeda9e0a7042 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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