summaryrefslogtreecommitdiff
path: root/ebus/webapp/__init__.py
blob: bd780331dfe09747d2c861d861aa28249f601bd4 (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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# -*- coding: utf-8 -*-

import bottle 
import sqlalchemy
from sqlalchemy import create_engine, select
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import text

from sqlalchemy.ext.sqlsoup import SqlSoup
from sqlalchemy import or_, and_, desc

from ebus.sql import model
import os
import json
import datetime
import time
app = bottle.Bottle("ebus")
bottle.debug()

engine = create_engine("postgresql://ebus:ebus@10.2.2.26/ebus", echo=True)
Session = sessionmaker()
Session.configure(bind=engine)

soup = SqlSoup(engine)

@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__),"static"))

@app.route('/sensor/:name')
def sensor_data_single(name):
    #s = Session()
    #sensorid = s.query(model.Sensor).filter(model.Sensor.name == name).first()
    #values = Session().query(model.Value).add_columns("timestamp","value_float","value_string","value_int")
    #values = values.filter(model.Value.sensor == sensorid)
    #return json.dumps(values.first().value_int)
    return sensor_data_fromto(name,None,None)

@app.route('/sensor/:name/:startdate/:enddate')
def sensor_data_fromto(name,startdate,enddate):
    s = Session()
    sensorid = s.query(model.Sensor).filter(model.Sensor.name == name).first()
    values = Session().query(model.Value).add_columns("timestamp","value_float","value_string","value_int")
    values = values.filter(model.Value.sensor == sensorid)
    
    if startdate == None or enddate == None:
        queried_values = []
        queried_values.append(values.first())
    else:
        now = datetime.datetime.now()
        f = datetime.datetime.fromtimestamp(float(startdate))
        t = datetime.datetime.fromtimestamp(float(enddate))
        values = values.filter(model.Value.timestamp.between(f,t))
        queried_values = values.all()
    v = []
    for value in queried_values:
        if value.value_float != None:
            v.append([int((time.mktime(value.timestamp.timetuple())+time.altzone*-1)*1000),value.value_float]) # time.altzone ist negativ
        elif value.value_int != None:
            v.append([int((time.mktime(value.timestamp.timetuple())+time.altzone*-1)*1000),value.value_int])
        elif value.value_string != None:
            v.append([int((time.mktime(value.timestamp.timetuple())+time.altzone*-1)*1000),value.value_string])
    return json.dumps(v)


# rechnet zeit so um wie Javascript
# teil es braucht XXX
def maketime(datetime):
    return (time.mktime(datetime.timetuple())+time.altzone*-1)*1000

@app.route('/sensor_cached/:name/:timestamp_from')
def sensor_data_cached_fromto(name, timestamp_from):
    try:
        timestamp_from = datetime.datetime.fromtimestamp(float(timestamp_from))

        # get sensor_id for name
        sensor_id = soup.sensor.filter(soup.sensor.name == name).one().id

        # select data from cache-view
        conn = soup.connection()
        s = text("""SELECT timestamp, value_real AS "value_real"
                      FROM vi_value_cache 
                     WHERE timestamp >= :timestamp_from
                           AND sensor_id = :sensor_id
                  ORDER BY timestamp""")
        values = conn.execute(s, timestamp_from=timestamp_from, sensor_id=sensor_id).fetchall()
        values = map(lambda row: (maketime(row.timestamp),
                                 row.value_real.__float__()),
                     values)

        return {'data':values, 'error':None}
    except Exception,e:
        return {'data':None, 'error':str(e)}