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
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, time
sys.path.insert(0,"lib")
from itty import itty
from werkzeug.contrib.cache import SimpleCache
from simplejson import dumps as dump_json
"""
def data(name):
if name in (
"solarDaten.tempKollektor",
"solarDaten.tempWarmwasserSolar",
"betriebsdatenRegler1.boilerTemperatur",
"betriebsdatenRegler1.kesselTemperatur",
"betriebsdatenRegler1.aussenTemperatur",
"betriebsdatenFeuerungsautomat.brauchwasserSollwert",
"betriebsdatenFeuerungsautomat.kesselSollwertTemperatur"):
m = Code('''
function () {
emit(parseInt(this.time/900)*900000, {sum: this.values[field], count:1});
}''')
r = Code('''
function (key, values) {
var n = { sum:0, count:0 };
for (var i = 0; i<values.length; i++) {
n.sum += values[i].sum;
n.count += values[i].count;
};
return n;
}''')
f = Code('''
function (who,r) {
r.avg = r.sum/r.count;
return r;
}''')
q={
"name":name.split(".")[0],
"time":{"$gt": ( time.time() - (72*3600))},
}
fs=["name", "values.%s"%name.split(".")[1]]
s={
"field":name.split(".")[1],
}
print "query q=%s fs=%s s=%s" % (q,fs,s)
collection.ensure_index([('time',pymongo.ASCENDING),('name',pymongo.ASCENDING)])
data = collection.map_reduce(m,r,query=q,finalize=f,fields=fs,scope=s).find().sort('time',pymongo.ASCENDING)
return map(lambda it: [it['_id'], it['value']['avg']], data)
elif name in (
"betriebsdatenFeuerungsautomat.betriebszustand.reduced",
"solarDaten.solarPumpe.reduced"):
pName = name.split(".")[0]
pField = name.split(".")[1]
q={
"name":pName,
"time":{"$gt":(time.time()-(72*3600))}
}
fs=["values.%s"%pField, "time"]
collection.ensure_index([('time',pymongo.ASCENDING),('name',pymongo.ASCENDING)])
data=collection.find(q,fields=fs).sort('time', pymongo.ASCENDING)
#TODO.map(Code('''function(it) { return [it.time, it.values.betriebszustand]; }'''))
data=map(lambda it: [it['time']*1000, it['values'][pField]], data)
#Fast die ände auf einen Eintrag pro Änderung zusammen
def reduce(data):
prev = None
for item in data:
if item[1] != prev:
prev = item[1]
yield item
return list(reduce(data))
else:
return []
"""
@itty.get("/")
def index(req):
filename=os.path.join(os.path.dirname(__file__), "static", "index.html")
return open(filename,"r").read()
json_cache = SimpleCache(default_timeout=20)
@itty.get('/json/<name>')
def json(req,name):
value = json_cache.get(name)
if value is None:
value = deny.Response(dump_json(dict(map(lambda r: (r, {"label":r, "data":data(r)}), name.split(",")))), mimetype='application/json')
json_cache.set(name, value)
return value
@itty.get("/static/(?P<filename>.+)")
def static(request,filename):
file = itty.static_file(filename, root=os.path.join(os.path.dirname(__file__), 'static'))
return itty.Response(file, content_type=itty.content_type(file))
if __name__ == '__main__':
sys.exit(itty.run_itty(host="0.0.0.0",port=5000))
|