1
1
#!/usr/bin/env python
3
6
import simplejson as json
8
import adeitools as adei
9
7
import matplotlib as mpl
10
8
import matplotlib.cm as cm
9
import adeitools as adei
11
from hatpro import parseConfig, device_
13
14
import matplotlib.pyplot as plt
15
c1 = re.compile('^sensor\d+')
16
c2 = re.compile('^server')
18
config = ConfigParser.ConfigParser()
19
config.read("../hatpro.ini")
20
sensors = [dict(config._sections[a]) for a in config.sections() if c1.match(a)]
22
config = ConfigParser.ConfigParser()
23
config.read("../server.ini")
24
servers = [dict(config._sections[a]) for a in config.sections() if c2.match(a)]
26
# initialize adei server
27
adeiservers = {servers[i]['__name__']:
28
adei.adeiserver(servers[i]['db_name'], servers[i]['db_server'], servers[i]['db_host'])
29
for i in range(len(servers)) }
31
adeiservers[s].updateSensor('name', 'column')
34
for sensor in sensors:
35
if sensor['method'] != 'hatpro_contour':
38
print "device name: %s" % sensor['device']
39
print "server name: %s" % sensor['server']
40
print "group name: %s" % sensor['group']
41
print "sensor name: %s" % sensor['sensor']
42
srv = adeiservers[sensor['server']]
44
# sensor group time stamps
45
t0 = adei.secSinceEpoch(srv.groupStamp(sensor['group'])) # last time stamp
46
t00 = adei.secSinceEpoch(srv.groupLastDay(sensor['group'])) # beginning of current day
47
t01 = t00 - 86400 # beginning of the day before
48
t02 = t00 - 86400*2 # beginning of the second day before
51
print "time stamps (new/day): %s/%s" % (newstamp, daystamp)
53
sensorList = srv.sensorFilter(sensor['sensor'])
56
for timekey in ['0d', '1d', '2d']:
57
filename = "../cache/%s.%s.%s.json" % (sensor['device'], sensor['sensor'], timekey)
59
# get stamp from old json file and decide update_level
60
# if update_level is 0, no update
61
# if update_level is 1, update for '0d'
62
# if update_level is 2, update for all ('0d', '1d', '2d')
64
with open(filename, 'r') as f:
65
oldstamp = json.loads(f.read())[0]['stamp']
69
if oldstamp < newstamp: update_level += 1
70
if oldstamp < daystamp: update_level += 1
71
print "outfile (update level): %s (%s)" % (filename,update_level)
77
if timekey == '0d' and update_level >= 1:
78
time = srv.getSensorTime(sensorList[0], t00, dt)
79
data = [ srv.getSensorData(i, t00, dt) for i in sensorList ]
80
if timekey == '1d' and update_level == 2:
81
time = srv.getSensorTime(sensorList[0], t01, dt)
82
data = [ srv.getSensorData(i, t01, dt) for i in sensorList ]
83
if timekey == '2d' and update_level == 2:
84
time = srv.getSensorTime(sensorList[0], t02, dt)
85
data = [ srv.getSensorData(i, t02, dt) for i in sensorList ]
90
cs = plt.contourf(time, ys, data, 50, cmap=colormap)
94
pathList.append({"xmin": time[0], "xmax": time[-1], "ymin": ys[0], "ymax": ys[-1], "stamp": newstamp})
96
for l, p, c in zip(cs.layers, cs.collections, cs.tcolors):
97
color = mpl.colors.rgb2hex(c[0][:3])
98
for path in p.get_paths():
100
for vertex, code in zip(path.vertices, path.codes):
101
if len(pp) != 0 and code == 1:
103
pp.append(vertex.tolist())
105
pp.append(vertex.tolist())
107
pathList.append({"layer": l, "path": pp, "color": color})
110
with open(filename, "w") as f:
111
json.dump(pathList, f)
16
class adeiReader(hatpro.adeiReader):
17
def getData(self, sensorName, groupName, t0, dt):
18
sensorList = self.sensorFilter(sensorName, groupName)
22
time = self.getSensorTime(sensorList[0], groupName, t0, dt)
23
data = [ self.getSensorData(i, groupName, t0, dt)
25
heights = [int(self.groups[groupName]['sensors'][i]['axis2_value'])
27
contours = plt.contourf(time, heights, data, 50, cmap=colormap)
34
color = mpl.colors.rgb2hex(c[0][:3])
35
for path in p.get_paths():
37
for vertex, code in zip(path.vertices, path.codes):
38
if len(pp) != 0 and code == 1:
40
pp.append(vertex.tolist())
42
pp.append(vertex.tolist())
44
Paths.append({"layer": l, "path": pp, "color": color})
59
reqparams = cgi.FieldStorage()
60
sensorName = reqparams["id"].value
61
date_ = reqparams["date"].value
63
#sensorName = 'L2C.AIR.POT.TEM.PRF'
66
serverInfo, groupName = parseConfig(sensorName)
68
adei_.setup(serverInfo['db_name'],
69
serverInfo['db_server'],
70
serverInfo['db_host'])
72
t0, update = adei_.dostuff(groupName, sensorName, date_)
75
filename = "../cache/%s.%s.%s.json" % (
76
device_, sensorName, t0)
77
symbolicname = "../cache/%s.%s.%s.json" % (
78
device_, sensorName, date_)
81
res = adei_.getData(sensorName, groupName, t0, dt)
82
with open(filename, "w") as f:
85
# create symbolic name
86
if os.path.exists(symbolicname):
87
os.remove(symbolicname)
88
os.symlink(filename, symbolicname)
92
if __name__ == "__main__":
94
content_type = 'text/plain; charset="UTF-8"'
95
sys.stdout.write('Content-type: %s\n\n' % content_type)